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 "builtin_test_util.h"
17#include "ecmascript/builtins/builtins_arraybuffer.h"
18
19#include "ecmascript/ecma_runtime_call_info.h"
20#include "ecmascript/ecma_vm.h"
21#include "ecmascript/global_env.h"
22
23#include "ecmascript/js_arraybuffer.h"
24#include "ecmascript/js_handle.h"
25#include "ecmascript/js_tagged_value.h"
26
27using namespace panda::ecmascript;
28using namespace panda::ecmascript::builtins;
29
30namespace panda::test {
31class BuiltinsArrayBufferTest : public BaseTestWithScope<false> {
32};
33
34// new ArrayBuffer(8)
35HWTEST_F_L0(BuiltinsArrayBufferTest, Constructor1)
36{
37    JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
38    JSHandle<JSFunction> arrayBuffer(thread, env->GetArrayBufferFunction().GetTaggedValue());
39    JSHandle<JSObject> globalObject(thread, env->GetGlobalObject());
40    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, arrayBuffer.GetTaggedValue(), 6);
41    ecmaRuntimeCallInfo->SetFunction(arrayBuffer.GetTaggedValue());
42    ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue());
43    ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(8)));
44
45    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
46    JSTaggedValue result = BuiltinsArrayBuffer::ArrayBufferConstructor(ecmaRuntimeCallInfo);
47    ASSERT_TRUE(result.IsECMAObject());
48    TestHelper::TearDownFrame(thread, prev);
49}
50
51// (new ArrayBuffer(5)).byteLength
52HWTEST_F_L0(BuiltinsArrayBufferTest, byteLength1)
53{
54    JSTaggedValue tagged = BuiltTestUtil::CreateBuiltinsArrayBuffer(thread, 5);
55    JSHandle<JSArrayBuffer> arrBuf(thread, JSArrayBuffer::Cast(reinterpret_cast<TaggedObject *>(tagged.GetRawData())));
56    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
57    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
58    ecmaRuntimeCallInfo->SetThis(arrBuf.GetTaggedValue());
59
60    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
61    JSTaggedValue result = BuiltinsArrayBuffer::GetByteLength(ecmaRuntimeCallInfo);
62    ASSERT_EQ(result.GetRawData(), JSTaggedValue(5).GetRawData());
63    TestHelper::TearDownFrame(thread, prev);
64}
65
66// (new ArrayBuffer(10)).slice(1, 5).bytelength
67HWTEST_F_L0(BuiltinsArrayBufferTest, slice1)
68{
69    JSTaggedValue tagged = BuiltTestUtil::CreateBuiltinsArrayBuffer(thread, 10);
70    JSHandle<JSArrayBuffer> arrBuf(thread, JSArrayBuffer::Cast(reinterpret_cast<TaggedObject *>(tagged.GetRawData())));
71    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
72    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
73    ecmaRuntimeCallInfo->SetThis(arrBuf.GetTaggedValue());
74    ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(1)));
75    ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(5)));
76
77    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
78    JSTaggedValue result1 = BuiltinsArrayBuffer::Slice(ecmaRuntimeCallInfo);
79    TestHelper::TearDownFrame(thread, prev);
80    JSHandle<JSArrayBuffer> arrBuf1(thread,
81                                     JSArrayBuffer::Cast(reinterpret_cast<TaggedObject *>(result1.GetRawData())));
82    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
83    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
84    ecmaRuntimeCallInfo1->SetThis(arrBuf1.GetTaggedValue());
85    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
86    JSTaggedValue result2 = BuiltinsArrayBuffer::GetByteLength(ecmaRuntimeCallInfo1);
87
88    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(4).GetRawData());
89    TestHelper::TearDownFrame(thread, prev);
90}
91}  // namespace panda::test
92