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