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/base/builtins_base.h"
17 #include "ecmascript/ecma_runtime_call_info.h"
18 #include "ecmascript/global_env.h"
19 #include "ecmascript/tests/test_helper.h"
20
21 using namespace panda::ecmascript;
22 using namespace panda::ecmascript::base;
23
24 namespace panda::test {
25 using ArgsPosition = BuiltinsBase::ArgsPosition;
26 class BuiltinsBaseTest : public BaseTestWithScope<false> {
27 };
28
29 /**
30 * @tc.name: GetArgsArray
31 * @tc.desc: Create msgs through "CreateEcmaRuntimeCallInfo" function,Set ArgsNumber and CallArg ,then call
32 * the "GetArgsArray" function to get an array value is within expectations.
33 * @tc.type: FUNC
34 * @tc.require:
35 */
HWTEST_F_L0(BuiltinsBaseTest, GetArgsArray)36 HWTEST_F_L0(BuiltinsBaseTest, GetArgsArray)
37 {
38 uint32_t argvLength = 10;
39 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), argvLength);
40 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(1));
41 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(2));
42 ecmaRuntimeCallInfo->SetCallArg(2, JSTaggedValue(3));
43
44 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
45 JSHandle<TaggedArray> resultArray = BuiltinsBase::GetArgsArray(ecmaRuntimeCallInfo);
46 TestHelper::TearDownFrame(thread, prev);
47
48 EXPECT_EQ(resultArray->GetLength(), 3U);
49 EXPECT_EQ(resultArray->Get(0).GetInt(), 1);
50 EXPECT_EQ(resultArray->Get(1).GetInt(), 2);
51 EXPECT_EQ(resultArray->Get(2).GetInt(), 3);
52 }
53
54 /**
55 * @tc.name: BuiltinsBase_info_Get
56 * @tc.desc: Create msgs through "CreateEcmaRuntimeCallInfo" function,then through "SetFunction","SetThis","SetCallArg"
57 * function set msgs,check result returned through "GetConstructor","GetFunction","GetThis","GetCallArg"
58 * function from BuiltinsBase is within expectations.
59 * @tc.type: FUNC
60 * @tc.require:
61 */
HWTEST_F_L0(BuiltinsBaseTest, BuiltinsBase_info_Get)62 HWTEST_F_L0(BuiltinsBaseTest, BuiltinsBase_info_Get)
63 {
64 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
65 JSHandle<JSFunction> handleFunction(env->GetProxyFunction());
66 JSHandle<JSObject> handleNewTarget(thread, env->GetGlobalObject());
67
68 auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
69 ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
70 ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
71 ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(ArgsPosition::FIRST));
72 ecmaRuntimeCallInfo1->SetCallArg(1, JSTaggedValue(ArgsPosition::SECOND));
73 ecmaRuntimeCallInfo1->SetCallArg(2, JSTaggedValue(ArgsPosition::FOURTH));
74 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
75
76 EXPECT_TRUE(BuiltinsBase::GetConstructor(ecmaRuntimeCallInfo1)->IsUndefined());
77 EXPECT_TRUE(BuiltinsBase::GetNewTarget(ecmaRuntimeCallInfo1)->IsUndefined());
78 EXPECT_EQ(BuiltinsBase::GetCallArg(ecmaRuntimeCallInfo1, 0)->GetInt(), 0);
79 EXPECT_EQ(BuiltinsBase::GetCallArg(ecmaRuntimeCallInfo1, 1)->GetInt(), 1);
80 EXPECT_EQ(BuiltinsBase::GetCallArg(ecmaRuntimeCallInfo1, 2)->GetInt(), 3);
81 TestHelper::TearDownFrame(thread, prev1);
82
83 auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*handleNewTarget), 6);
84 ecmaRuntimeCallInfo2->SetFunction(handleFunction.GetTaggedValue());
85 ecmaRuntimeCallInfo2->SetThis(handleNewTarget.GetTaggedValue());
86 ecmaRuntimeCallInfo2->SetCallArg(0, JSTaggedValue::Undefined());
87 [[maybe_unused]] auto prev2 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
88
89 EXPECT_TRUE(BuiltinsBase::GetConstructor(ecmaRuntimeCallInfo2)->IsJSFunction());
90 EXPECT_TRUE(BuiltinsBase::GetNewTarget(ecmaRuntimeCallInfo2)->IsJSGlobalObject());
91 EXPECT_TRUE(BuiltinsBase::GetCallArg(ecmaRuntimeCallInfo2, 0)->IsUndefined());
92 TestHelper::TearDownFrame(thread, prev2);
93 }
94
95 /**
96 * @tc.name: GetTaggedString
97 * @tc.desc: Check whether the result returned through "GetTaggedString" function is within expectations.
98 * @tc.type: FUNC
99 * @tc.require:
100 */
HWTEST_F_L0(BuiltinsBaseTest, GetTaggedString)101 HWTEST_F_L0(BuiltinsBaseTest, GetTaggedString)
102 {
103 char BuiltinsBaseStr1[] = "BuiltinsBase";
104 JSTaggedValue resultStr1 = BuiltinsBase::GetTaggedString(thread, BuiltinsBaseStr1);
105 EXPECT_TRUE(resultStr1.IsString());
106 JSHandle<EcmaString> handleEcmaStr1(thread, resultStr1);
107 EXPECT_STREQ(EcmaStringAccessor(handleEcmaStr1).ToCString().c_str(), "BuiltinsBase");
108
109 char BuiltinsBaseStr2[] = ""; // Empty String
110 JSTaggedValue resultStr2 = BuiltinsBase::GetTaggedString(thread, BuiltinsBaseStr2);
111 EXPECT_TRUE(resultStr2.IsString());
112 JSHandle<EcmaString> handleEcmaStr2(thread, resultStr2);
113 EXPECT_STREQ(EcmaStringAccessor(handleEcmaStr2).ToCString().c_str(), "");
114 }
115
116 /**
117 * @tc.name: GetTaggedInt
118 * @tc.desc: Check whether the result returned through "GetTaggedInt" function is within expectations.
119 * @tc.type: FUNC
120 * @tc.require:
121 */
HWTEST_F_L0(BuiltinsBaseTest, GetTaggedInt)122 HWTEST_F_L0(BuiltinsBaseTest, GetTaggedInt)
123 {
124 EXPECT_EQ(BuiltinsBase::GetTaggedInt(1).GetInt(), 1);
125 EXPECT_EQ(BuiltinsBase::GetTaggedInt(9).GetInt(), 9);
126 }
127
128 /**
129 * @tc.name: GetTaggedDouble
130 * @tc.desc: Check whether the result returned through "GetTaggedDouble" function is within expectations.
131 * @tc.type: FUNC
132 * @tc.require:
133 */
HWTEST_F_L0(BuiltinsBaseTest, GetTaggedDouble)134 HWTEST_F_L0(BuiltinsBaseTest, GetTaggedDouble)
135 {
136 EXPECT_EQ(BuiltinsBase::GetTaggedDouble(1.1100).GetNumber(), 1.1100);
137 EXPECT_EQ(BuiltinsBase::GetTaggedDouble(9.1200).GetNumber(), 9.1200);
138 }
139
140 /**
141 * @tc.name: GetTaggedBoolean
142 * @tc.desc: Check whether the result returned through "GetTaggedBoolean" function is within expectations.
143 * @tc.type: FUNC
144 * @tc.require:
145 */
HWTEST_F_L0(BuiltinsBaseTest, GetTaggedBoolean)146 HWTEST_F_L0(BuiltinsBaseTest, GetTaggedBoolean)
147 {
148 EXPECT_EQ(BuiltinsBase::GetTaggedBoolean(false).GetRawData(), JSTaggedValue::False().GetRawData());
149 EXPECT_EQ(BuiltinsBase::GetTaggedBoolean(true).GetRawData(), JSTaggedValue::True().GetRawData());
150 }
151 } // namespace panda::test