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