• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ecmascript/global_env.h"
17 #include "ecmascript/js_arraybuffer.h"
18 #include "ecmascript/js_dataview.h"
19 #include "ecmascript/object_factory.h"
20 #include "ecmascript/tests/test_helper.h"
21 
22 using namespace panda::ecmascript;
23 
24 namespace panda::test {
25 class JSDataViewTest :  public BaseTestWithScope<false> {
26 };
27 
28 /*
29  * Feature: JSDataView
30  * Function: GetElementSize
31  * SubFunction: N/A
32  * FunctionPoints: Get ElementSize
33  * CaseDescription: Check whether the returned value through "GetElementSize" function is within expectations.
34  */
HWTEST_F_L0(JSDataViewTest,GetElementSize)35 HWTEST_F_L0(JSDataViewTest, GetElementSize)
36 {
37     EXPECT_EQ(JSDataView::GetElementSize(DataViewType::INT8), 1U);
38     EXPECT_EQ(JSDataView::GetElementSize(DataViewType::UINT8), 1U);
39     EXPECT_EQ(JSDataView::GetElementSize(DataViewType::UINT8_CLAMPED), 1U);
40     EXPECT_EQ(JSDataView::GetElementSize(DataViewType::INT16), 2U);
41     EXPECT_EQ(JSDataView::GetElementSize(DataViewType::UINT16), 2U);
42     EXPECT_EQ(JSDataView::GetElementSize(DataViewType::INT32), 4U);
43     EXPECT_EQ(JSDataView::GetElementSize(DataViewType::UINT32), 4U);
44     EXPECT_EQ(JSDataView::GetElementSize(DataViewType::FLOAT32), 4U);
45     EXPECT_EQ(JSDataView::GetElementSize(DataViewType::FLOAT64), 8U);
46 }
47 
48 /*
49  * Feature: JSDataView
50  * Function: NewJSDataView
51  * CaseDescription: Test the illegal NewJSDataView.
52  */
HWTEST_F_L0(JSDataViewTest,NewJSDataView)53 HWTEST_F_L0(JSDataViewTest, NewJSDataView)
54 {
55     EcmaVM *ecmaVMPtr = thread->GetEcmaVM();
56     ObjectFactory *factory = ecmaVMPtr->GetFactory();
57     JSHandle<GlobalEnv> handleGlobalEnv = ecmaVMPtr->GetGlobalEnv();
58 
59     uint32_t lengthDataArrayBuf = 8;
60     uint32_t offsetDataView = 10;
61     uint32_t lengthDataView = 10;
62     JSHandle<JSFunction> handleFuncArrayBuf(handleGlobalEnv->GetArrayBufferFunction());
63     JSHandle<JSTaggedValue> handleTagValFuncArrayBuf(handleFuncArrayBuf);
64     JSHandle<JSArrayBuffer> handleArrayBuf(
65         factory->NewJSObjectByConstructor(handleFuncArrayBuf, handleTagValFuncArrayBuf));
66     handleArrayBuf->SetArrayBufferByteLength(lengthDataArrayBuf);
67 
68     // Call "SetDataView" function through "NewJSDataView" function of "object_factory.cpp"
69     JSHandle<JSDataView> handleDataView = factory->NewJSDataView(handleArrayBuf, offsetDataView, lengthDataView);
70     EXPECT_TRUE(thread->HasPendingException());
71     EXPECT_EQ(handleDataView.GetTaggedValue(), JSTaggedValue::Undefined());
72 }
73 
74 /*
75  * Feature: JSDataView
76  * Function: SetDataView
77  * SubFunction: GetDataView
78  * FunctionPoints: Set DataView
79  * CaseDescription: Check whether the returned value through "GetDataView" function is within expectations after
80  *                  calling "SetDataView" function.
81  */
HWTEST_F_L0(JSDataViewTest,SetDataView)82 HWTEST_F_L0(JSDataViewTest, SetDataView)
83 {
84     EcmaVM *ecmaVMPtr = thread->GetEcmaVM();
85     ObjectFactory *factory = ecmaVMPtr->GetFactory();
86     JSHandle<GlobalEnv> handleGlobalEnv = ecmaVMPtr->GetGlobalEnv();
87 
88     uint32_t lengthDataArrayBuf = 8;
89     uint32_t offsetDataView = 4;
90     uint32_t lengthDataView = 4;
91     JSHandle<JSFunction> handleFuncArrayBuf(handleGlobalEnv->GetArrayBufferFunction());
92     JSHandle<JSTaggedValue> handleTagValFuncArrayBuf(handleFuncArrayBuf);
93     JSHandle<JSArrayBuffer> handleArrayBuf(
94         factory->NewJSObjectByConstructor(handleFuncArrayBuf, handleTagValFuncArrayBuf));
95     handleArrayBuf->SetArrayBufferByteLength(lengthDataArrayBuf);
96 
97     // Call "SetDataView" function through "NewJSDataView" function of "object_factory.cpp"
98     JSHandle<JSDataView> handleDataView = factory->NewJSDataView(handleArrayBuf, offsetDataView,
99         lengthDataView);
100     EXPECT_TRUE(handleDataView->GetDataView().IsTrue());
101 
102     // Call "SetDataView" function in this HWTEST_F_L0.
103     handleDataView->SetDataView(thread, JSTaggedValue::False());
104     EXPECT_TRUE(handleDataView->GetDataView().IsFalse());
105     handleDataView->SetDataView(thread, JSTaggedValue::True());
106     EXPECT_TRUE(handleDataView->GetDataView().IsTrue());
107 }
108 
109 /*
110  * Feature: JSDataView
111  * Function: SetViewedArrayBuffer
112  * SubFunction: GetViewedArrayBuffer
113  * FunctionPoints: Set ViewedArrayBuffer
114  * CaseDescription: Check whether the returned value through "GetViewedArrayBuffer" function is within expectations
115  *                  after calling "SetViewedArrayBuffer" function.
116  */
HWTEST_F_L0(JSDataViewTest,SetViewedArrayBuffer)117 HWTEST_F_L0(JSDataViewTest, SetViewedArrayBuffer)
118 {
119     EcmaVM *ecmaVMPtr = thread->GetEcmaVM();
120     ObjectFactory *factory = ecmaVMPtr->GetFactory();
121     JSHandle<JSFunction> handleFuncArrayBuf(ecmaVMPtr->GetGlobalEnv()->GetArrayBufferFunction());
122     JSHandle<JSTaggedValue> handleTagValFuncArrayBuf(handleFuncArrayBuf);
123 
124     uint32_t lengthDataArrayBuf1 = 8;
125     uint32_t lengthDataArrayBuf2 = 16;
126     uint32_t offsetDataView = 4;
127     uint32_t lengthDataView = 4;
128     JSHandle<JSArrayBuffer> handleArrayBuf1(
129         factory->NewJSObjectByConstructor(handleFuncArrayBuf, handleTagValFuncArrayBuf));
130     JSHandle<JSArrayBuffer> handleArrayBuf2(
131         factory->NewJSObjectByConstructor(handleFuncArrayBuf, handleTagValFuncArrayBuf));
132     handleArrayBuf1->SetArrayBufferByteLength(lengthDataArrayBuf1);
133     handleArrayBuf2->SetArrayBufferByteLength(lengthDataArrayBuf2);
134 
135     // Call "SetViewedArrayBuffer" function through "NewJSDataView" function of "object_factory.cpp"
136     JSHandle<JSDataView> handleDataView = factory->NewJSDataView(handleArrayBuf1, offsetDataView,
137         lengthDataView);
138     JSHandle<JSTaggedValue> handleTagValDataViewFrom1(thread, handleArrayBuf1.GetTaggedValue());
139     JSHandle<JSTaggedValue> handleTagValDataViewTo1(thread, handleDataView->GetViewedArrayBuffer());
140     EXPECT_TRUE(JSTaggedValue::Equal(thread, handleTagValDataViewFrom1, handleTagValDataViewTo1));
141 
142     // Call "SetViewedArrayBuffer" function in this HWTEST_F_L0.
143     handleDataView->SetViewedArrayBuffer(thread, handleArrayBuf2.GetTaggedValue());
144     JSHandle<JSTaggedValue> handleTagValDataViewFrom2(thread, handleArrayBuf2.GetTaggedValue());
145     JSHandle<JSTaggedValue> handleTagValDataViewTo2(thread, handleDataView->GetViewedArrayBuffer());
146     EXPECT_TRUE(JSTaggedValue::Equal(thread, handleTagValDataViewFrom2, handleTagValDataViewTo2));
147     EXPECT_FALSE(JSTaggedValue::Equal(thread, handleTagValDataViewFrom1, handleTagValDataViewFrom2));
148 }
149 
150 /*
151  * Feature: JSDataView
152  * Function: SetByteLength
153  * SubFunction: GetByteLength
154  * FunctionPoints: Set ByteLength
155  * CaseDescription: Check whether the returned value through "GetByteLength" function is within expectations after
156  *                  calling "SetByteLength" function.
157  */
HWTEST_F_L0(JSDataViewTest,SetByteLength)158 HWTEST_F_L0(JSDataViewTest, SetByteLength)
159 {
160     EcmaVM *ecmaVMPtr = thread->GetEcmaVM();
161     ObjectFactory *factory = ecmaVMPtr->GetFactory();
162     JSHandle<JSFunction> handleFuncArrayBuf(ecmaVMPtr->GetGlobalEnv()->GetArrayBufferFunction());
163     JSHandle<JSTaggedValue> handleTagValFuncArrayBuf(handleFuncArrayBuf);
164 
165     uint32_t lengthDataArrayBuf = 8;
166     uint32_t offsetDataView = 4;
167     uint32_t lengthDataView1 = 4;
168     uint32_t lengthDataView2 = 2;
169     JSHandle<JSArrayBuffer> handleArrayBuf(
170         factory->NewJSObjectByConstructor(handleFuncArrayBuf, handleTagValFuncArrayBuf));
171     handleArrayBuf->SetArrayBufferByteLength(lengthDataArrayBuf);
172 
173     // Call "SetByteLength" function through "NewJSDataView" function of "object_factory.cpp"
174     JSHandle<JSDataView> handleDataView = factory->NewJSDataView(handleArrayBuf, offsetDataView,
175         lengthDataView1);
176     EXPECT_EQ(handleDataView->GetByteLength(), lengthDataView1);
177 
178     // Call "SetByteLength" function in this HWTEST_F_L0.
179     handleDataView->SetByteLength(lengthDataView2);
180     EXPECT_EQ(handleDataView->GetByteLength(), lengthDataView2);
181 }
182 
183 /*
184  * Feature: JSDataView
185  * Function: SetByteOffset
186  * SubFunction: GetByteOffset
187  * FunctionPoints: Set ByteOffset
188  * CaseDescription: Check whether the returned value through "GetByteOffset" function is within expectations after
189  *                  calling "SetByteOffset" function.
190  */
HWTEST_F_L0(JSDataViewTest,SetByteOffset)191 HWTEST_F_L0(JSDataViewTest, SetByteOffset)
192 {
193     EcmaVM *ecmaVMPtr = thread->GetEcmaVM();
194     ObjectFactory *factory = ecmaVMPtr->GetFactory();
195     JSHandle<JSFunction> handleFuncArrayBuf1(ecmaVMPtr->GetGlobalEnv()->GetArrayBufferFunction());
196     JSHandle<JSTaggedValue> handleTagValFuncArrayBuf1(handleFuncArrayBuf1);
197 
198     uint32_t lengthDataArrayBuf = 8;
199     uint32_t offsetDataView1 = 4;
200     uint32_t offsetDataView2 = 6;
201     uint32_t lengthDataView = 2;
202     JSHandle<JSArrayBuffer> handleArrayBuf(
203         factory->NewJSObjectByConstructor(handleFuncArrayBuf1, handleTagValFuncArrayBuf1));
204     handleArrayBuf->SetArrayBufferByteLength(lengthDataArrayBuf);
205 
206     // Call "SetByteOffset" function through "NewJSDataView" function of "object_factory.cpp"
207     JSHandle<JSDataView> handleDataView = factory->NewJSDataView(handleArrayBuf, offsetDataView1,
208         lengthDataView);
209     EXPECT_EQ(handleDataView->GetByteOffset(), offsetDataView1);
210 
211     // Call "SetByteOffset" function in this HWTEST_F_L0.
212     handleDataView->SetByteOffset(offsetDataView2);
213     EXPECT_EQ(handleDataView->GetByteOffset(), offsetDataView2);
214 }
215 }  // namespace panda::test
216