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/builtins/builtins_date.h"
17
18#include "ecmascript/base/string_helper.h"
19#include "ecmascript/ecma_vm.h"
20#include "ecmascript/global_env.h"
21#include "ecmascript/js_function.h"
22#include "ecmascript/js_thread.h"
23#include "ecmascript/platform/time.h"
24#include "ecmascript/tests/test_helper.h"
25
26using namespace panda::ecmascript;
27using namespace panda::ecmascript::builtins;
28namespace panda::test {
29const char NEG = '-';
30const char PLUS = '+';
31const int STR_LENGTH_OTHERS = 2;
32const int MINUTE_PER_HOUR = 60;
33class BuiltinsDateTest : public BaseTestWithScope<false> {
34};
35
36JSHandle<JSDate> JSDateCreateTest(JSThread *thread)
37{
38    EcmaVM *ecmaVM = thread->GetEcmaVM();
39    ObjectFactory *factory = ecmaVM->GetFactory();
40    JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
41    JSHandle<JSTaggedValue> dateFunction = globalEnv->GetDateFunction();
42    JSHandle<JSDate> dateObject =
43        JSHandle<JSDate>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(dateFunction), dateFunction));
44    return dateObject;
45}
46
47enum class AlgorithmType {
48    ALGORITHM_TO_STRING,
49    ALGORITHM_TO_TIME_STRING,
50    ALGORITHM_TO_ISO_STRING,
51};
52
53static JSTaggedValue DateAlgorithm(JSThread *thread, const JSTaggedValue& thisTag, std::vector<JSTaggedValue>& vals,
54    uint32_t argLen = 8, AlgorithmType type = AlgorithmType::ALGORITHM_TO_STRING)
55{
56    auto ecmaRuntimeCallInfos = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), argLen);
57    ecmaRuntimeCallInfos->SetFunction(JSTaggedValue::Undefined());
58    ecmaRuntimeCallInfos->SetThis(thisTag);
59    for (size_t i = 0; i < vals.size(); i++) {
60        ecmaRuntimeCallInfos->SetCallArg(i, JSTaggedValue(vals[i]));
61    }
62    auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfos);
63    JSTaggedValue result;
64    switch (type) {
65        case AlgorithmType::ALGORITHM_TO_STRING:
66            result = BuiltinsDate::ToString(ecmaRuntimeCallInfos);
67            break;
68        case AlgorithmType::ALGORITHM_TO_TIME_STRING:
69            result = BuiltinsDate::ToTimeString(ecmaRuntimeCallInfos);
70            break;
71        case AlgorithmType::ALGORITHM_TO_ISO_STRING:
72            result = BuiltinsDate::ToISOString(ecmaRuntimeCallInfos);
73            break;
74        default:
75            break;
76    }
77    TestHelper::TearDownFrame(thread, prev);
78    return result;
79}
80
81
82HWTEST_F_L0(BuiltinsDateTest, SetGetDate)
83{
84    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
85
86    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(2))};
87    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 6, jsDate.GetTaggedValue());
88
89    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
90    [[maybe_unused]] JSTaggedValue result1 = BuiltinsDate::SetDate(ecmaRuntimeCallInfo);
91    JSTaggedValue result2 = BuiltinsDate::GetDate(ecmaRuntimeCallInfo);
92    TestHelper::TearDownFrame(thread, prev);
93    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(2)).GetRawData());
94}
95
96HWTEST_F_L0(BuiltinsDateTest, SetGetUTCDate)
97{
98    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
99
100    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(2))};
101    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 6, jsDate.GetTaggedValue());
102
103    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
104    [[maybe_unused]] JSTaggedValue result3 = BuiltinsDate::SetUTCDate(ecmaRuntimeCallInfo);
105    JSTaggedValue result4 = BuiltinsDate::GetUTCDate(ecmaRuntimeCallInfo);
106    TestHelper::TearDownFrame(thread, prev);
107    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(2)).GetRawData());
108}
109
110HWTEST_F_L0(BuiltinsDateTest, SetGetMinusUTCDate)
111{
112    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
113
114    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(-2))};
115    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 6, jsDate.GetTaggedValue());
116
117    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
118    [[maybe_unused]] JSTaggedValue result3 = BuiltinsDate::SetUTCDate(ecmaRuntimeCallInfo);
119    JSTaggedValue result4 = BuiltinsDate::GetUTCDate(ecmaRuntimeCallInfo);
120    TestHelper::TearDownFrame(thread, prev);
121    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(29)).GetRawData());
122}
123
124HWTEST_F_L0(BuiltinsDateTest, SetGetFullYear)
125{
126    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
127
128    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(2018)), JSTaggedValue(static_cast<double>(10)),
129                                    JSTaggedValue(static_cast<double>(6))};
130    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 10, jsDate.GetTaggedValue());
131
132    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
133    BuiltinsDate::SetFullYear(ecmaRuntimeCallInfo);
134    JSTaggedValue result1 = BuiltinsDate::GetFullYear(ecmaRuntimeCallInfo);
135    // 2018 : test case
136    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(2018)).GetRawData());
137
138    JSTaggedValue result2 = BuiltinsDate::GetMonth(ecmaRuntimeCallInfo);
139    // 10 : test case
140    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(10)).GetRawData());
141
142    JSTaggedValue result3 = BuiltinsDate::GetDate(ecmaRuntimeCallInfo);
143    // 6 : test case
144    ASSERT_EQ(result3.GetRawData(), JSTaggedValue(static_cast<double>(6)).GetRawData());
145    TestHelper::TearDownFrame(thread, prev);
146}
147
148HWTEST_F_L0(BuiltinsDateTest, SetGetUTCFullYear)
149{
150    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
151
152    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(2018)), JSTaggedValue(static_cast<double>(10)),
153                                    JSTaggedValue(static_cast<double>(6))};
154    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 10, jsDate.GetTaggedValue());
155
156    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
157    BuiltinsDate::SetUTCFullYear(ecmaRuntimeCallInfo);
158    JSTaggedValue result4 = BuiltinsDate::GetUTCFullYear(ecmaRuntimeCallInfo);
159    // 2018 : test case
160    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(2018)).GetRawData());
161
162    JSTaggedValue result5 = BuiltinsDate::GetUTCMonth(ecmaRuntimeCallInfo);
163    // 10 : test case
164    ASSERT_EQ(result5.GetRawData(), JSTaggedValue(static_cast<double>(10)).GetRawData());
165
166    JSTaggedValue result6 = BuiltinsDate::GetUTCDate(ecmaRuntimeCallInfo);
167    // 6 : test case
168    ASSERT_EQ(result6.GetRawData(), JSTaggedValue(static_cast<double>(6)).GetRawData());
169    TestHelper::TearDownFrame(thread, prev);
170}
171
172HWTEST_F_L0(BuiltinsDateTest, SetGetMinusFullYear)
173{
174    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
175    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(-2018)), JSTaggedValue(static_cast<double>(-10)),
176                                    JSTaggedValue(static_cast<double>(-6))};
177    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 10, jsDate.GetTaggedValue());
178
179    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
180    BuiltinsDate::SetFullYear(ecmaRuntimeCallInfo);
181    JSTaggedValue result1 = BuiltinsDate::GetFullYear(ecmaRuntimeCallInfo);
182    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(-2019)).GetRawData());
183
184    JSTaggedValue result2 = BuiltinsDate::GetMonth(ecmaRuntimeCallInfo);
185    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(1)).GetRawData());
186
187    JSTaggedValue result3 = BuiltinsDate::GetDate(ecmaRuntimeCallInfo);
188    ASSERT_EQ(result3.GetRawData(), JSTaggedValue(static_cast<double>(22)).GetRawData());
189    TestHelper::TearDownFrame(thread, prev);
190}
191
192HWTEST_F_L0(BuiltinsDateTest, SetGetMinusUTCFullYear)
193{
194    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
195
196    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(-2018)), JSTaggedValue(static_cast<double>(-10)),
197                                    JSTaggedValue(static_cast<double>(-6))};
198    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 10, jsDate.GetTaggedValue());
199
200    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
201    BuiltinsDate::SetUTCFullYear(ecmaRuntimeCallInfo);
202    JSTaggedValue result4 = BuiltinsDate::GetUTCFullYear(ecmaRuntimeCallInfo);
203    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(-2019)).GetRawData());
204
205    JSTaggedValue result5 = BuiltinsDate::GetUTCMonth(ecmaRuntimeCallInfo);
206    ASSERT_EQ(result5.GetRawData(), JSTaggedValue(static_cast<double>(1)).GetRawData());
207
208    JSTaggedValue result6 = BuiltinsDate::GetUTCDate(ecmaRuntimeCallInfo);
209    ASSERT_EQ(result6.GetRawData(), JSTaggedValue(static_cast<double>(22)).GetRawData());
210}
211
212HWTEST_F_L0(BuiltinsDateTest, SetGetHours)
213{
214    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
215
216    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(18)), JSTaggedValue(static_cast<double>(10)),
217                                    JSTaggedValue(static_cast<double>(6)), JSTaggedValue(static_cast<double>(111))};
218    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 12, jsDate.GetTaggedValue());
219
220    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
221    BuiltinsDate::SetHours(ecmaRuntimeCallInfo);
222    JSTaggedValue result1 = BuiltinsDate::GetHours(ecmaRuntimeCallInfo);
223    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(18)).GetRawData());
224
225    JSTaggedValue result2 = BuiltinsDate::GetMinutes(ecmaRuntimeCallInfo);
226    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(10)).GetRawData());
227
228    JSTaggedValue result3 = BuiltinsDate::GetSeconds(ecmaRuntimeCallInfo);
229    ASSERT_EQ(result3.GetRawData(), JSTaggedValue(static_cast<double>(6)).GetRawData());
230
231    JSTaggedValue result4 = BuiltinsDate::GetMilliseconds(ecmaRuntimeCallInfo);
232    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(111)).GetRawData());
233}
234
235HWTEST_F_L0(BuiltinsDateTest, SetGetUTCHours)
236{
237    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
238
239    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(18)), JSTaggedValue(static_cast<double>(10)),
240                                    JSTaggedValue(static_cast<double>(6)), JSTaggedValue(static_cast<double>(111))};
241    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 12, jsDate.GetTaggedValue());
242
243    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
244    BuiltinsDate::SetUTCHours(ecmaRuntimeCallInfo);
245    JSTaggedValue result5 = BuiltinsDate::GetUTCHours(ecmaRuntimeCallInfo);
246    ASSERT_EQ(result5.GetRawData(), JSTaggedValue(static_cast<double>(18)).GetRawData());
247
248    JSTaggedValue result6 = BuiltinsDate::GetUTCMinutes(ecmaRuntimeCallInfo);
249    ASSERT_EQ(result6.GetRawData(), JSTaggedValue(static_cast<double>(10)).GetRawData());
250
251    JSTaggedValue result7 = BuiltinsDate::GetUTCSeconds(ecmaRuntimeCallInfo);
252    ASSERT_EQ(result7.GetRawData(), JSTaggedValue(static_cast<double>(6)).GetRawData());
253
254    JSTaggedValue result8 = BuiltinsDate::GetUTCMilliseconds(ecmaRuntimeCallInfo);
255    ASSERT_EQ(result8.GetRawData(), JSTaggedValue(static_cast<double>(111)).GetRawData());
256}
257
258HWTEST_F_L0(BuiltinsDateTest, SetGetMinusHours)
259{
260    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
261
262    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(-18)), JSTaggedValue(static_cast<double>(-10)),
263                                    JSTaggedValue(static_cast<double>(-6)), JSTaggedValue(static_cast<double>(-111))};
264    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 12, jsDate.GetTaggedValue());
265
266    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
267    BuiltinsDate::SetHours(ecmaRuntimeCallInfo);
268    JSTaggedValue result1 = BuiltinsDate::GetHours(ecmaRuntimeCallInfo);
269    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(5)).GetRawData());
270
271    JSTaggedValue result2 = BuiltinsDate::GetMinutes(ecmaRuntimeCallInfo);
272    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(49)).GetRawData());
273
274    JSTaggedValue result3 = BuiltinsDate::GetSeconds(ecmaRuntimeCallInfo);
275    ASSERT_EQ(result3.GetRawData(), JSTaggedValue(static_cast<double>(53)).GetRawData());
276
277    JSTaggedValue result4 = BuiltinsDate::GetMilliseconds(ecmaRuntimeCallInfo);
278    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(889)).GetRawData());
279}
280
281HWTEST_F_L0(BuiltinsDateTest, SetGetMinusUTCHours)
282{
283    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
284
285    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(-18)), JSTaggedValue(static_cast<double>(-10)),
286                                    JSTaggedValue(static_cast<double>(-6)), JSTaggedValue(static_cast<double>(-111))};
287    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 12, jsDate.GetTaggedValue());
288    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
289    BuiltinsDate::SetUTCHours(ecmaRuntimeCallInfo);
290    JSTaggedValue result5 = BuiltinsDate::GetUTCHours(ecmaRuntimeCallInfo);
291    ASSERT_EQ(result5.GetRawData(), JSTaggedValue(static_cast<double>(5)).GetRawData());
292
293    JSTaggedValue result6 = BuiltinsDate::GetUTCMinutes(ecmaRuntimeCallInfo);
294    ASSERT_EQ(result6.GetRawData(), JSTaggedValue(static_cast<double>(49)).GetRawData());
295
296    JSTaggedValue result7 = BuiltinsDate::GetUTCSeconds(ecmaRuntimeCallInfo);
297    ASSERT_EQ(result7.GetRawData(), JSTaggedValue(static_cast<double>(53)).GetRawData());
298
299    JSTaggedValue result8 = BuiltinsDate::GetUTCMilliseconds(ecmaRuntimeCallInfo);
300    ASSERT_EQ(result8.GetRawData(), JSTaggedValue(static_cast<double>(889)).GetRawData());
301}
302
303HWTEST_F_L0(BuiltinsDateTest, SetGetMilliseconds)
304{
305    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
306
307    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(100))};
308    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 6, jsDate.GetTaggedValue());
309
310    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
311    JSTaggedValue result1 = BuiltinsDate::SetMilliseconds(ecmaRuntimeCallInfo);
312    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(100)).GetRawData());
313
314    JSTaggedValue result2 = BuiltinsDate::GetMilliseconds(ecmaRuntimeCallInfo);
315    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(100)).GetRawData());
316}
317
318HWTEST_F_L0(BuiltinsDateTest, SetGetUTCMilliseconds)
319{
320    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
321
322    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(100))};
323    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 6, jsDate.GetTaggedValue());
324
325    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
326    JSTaggedValue result3 = BuiltinsDate::SetUTCMilliseconds(ecmaRuntimeCallInfo);
327    ASSERT_EQ(result3.GetRawData(), JSTaggedValue(static_cast<double>(100)).GetRawData());
328
329    JSTaggedValue result4 = BuiltinsDate::GetUTCMilliseconds(ecmaRuntimeCallInfo);
330    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(100)).GetRawData());
331}
332
333HWTEST_F_L0(BuiltinsDateTest, SetGetMinutes)
334{
335    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
336
337    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(10)), JSTaggedValue(static_cast<double>(6)),
338                                                  JSTaggedValue(static_cast<double>(111))};
339    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 10, jsDate.GetTaggedValue());
340
341    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
342    BuiltinsDate::SetMinutes(ecmaRuntimeCallInfo);
343    JSTaggedValue result1 = BuiltinsDate::GetMinutes(ecmaRuntimeCallInfo);
344    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(10)).GetRawData());
345
346    JSTaggedValue result2 = BuiltinsDate::GetSeconds(ecmaRuntimeCallInfo);
347    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(6)).GetRawData());
348
349    JSTaggedValue result3 = BuiltinsDate::GetMilliseconds(ecmaRuntimeCallInfo);
350    ASSERT_EQ(result3.GetRawData(), JSTaggedValue(static_cast<double>(111)).GetRawData());
351}
352
353HWTEST_F_L0(BuiltinsDateTest, SetGetUTCMinutes)
354{
355    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
356
357    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(10)), JSTaggedValue(static_cast<double>(6)),
358                                                  JSTaggedValue(static_cast<double>(111))};
359    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 10, jsDate.GetTaggedValue());
360
361    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
362    BuiltinsDate::SetUTCMinutes(ecmaRuntimeCallInfo);
363    JSTaggedValue result4 = BuiltinsDate::GetUTCMinutes(ecmaRuntimeCallInfo);
364    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(10)).GetRawData());
365
366    JSTaggedValue result5 = BuiltinsDate::GetUTCSeconds(ecmaRuntimeCallInfo);
367    ASSERT_EQ(result5.GetRawData(), JSTaggedValue(static_cast<double>(6)).GetRawData());
368
369    JSTaggedValue result6 = BuiltinsDate::GetUTCMilliseconds(ecmaRuntimeCallInfo);
370    ASSERT_EQ(result6.GetRawData(), JSTaggedValue(static_cast<double>(111)).GetRawData());
371}
372
373HWTEST_F_L0(BuiltinsDateTest, SetGetMonth)
374{
375    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
376
377    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(8)), JSTaggedValue(static_cast<double>(3))};
378    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 8, jsDate.GetTaggedValue());
379
380    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
381    BuiltinsDate::SetMonth(ecmaRuntimeCallInfo);
382    JSTaggedValue result1 = BuiltinsDate::GetMonth(ecmaRuntimeCallInfo);
383    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(8)).GetRawData());
384
385    JSTaggedValue result2 = BuiltinsDate::GetDate(ecmaRuntimeCallInfo);
386    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(3)).GetRawData());
387}
388
389HWTEST_F_L0(BuiltinsDateTest, SetGetUTCMonth)
390{
391    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
392    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(8)), JSTaggedValue(static_cast<double>(3))};
393    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 8, jsDate.GetTaggedValue());
394
395    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
396    BuiltinsDate::SetUTCMonth(ecmaRuntimeCallInfo);
397    JSTaggedValue result3 = BuiltinsDate::GetUTCMonth(ecmaRuntimeCallInfo);
398    ASSERT_EQ(result3.GetRawData(), JSTaggedValue(static_cast<double>(8)).GetRawData());
399
400    JSTaggedValue result4 = BuiltinsDate::GetUTCDate(ecmaRuntimeCallInfo);
401    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(3)).GetRawData());
402}
403
404HWTEST_F_L0(BuiltinsDateTest, SetGetSeconds)
405{
406    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
407    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(59)), JSTaggedValue(static_cast<double>(123))};
408    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 8, jsDate.GetTaggedValue());
409
410    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
411    BuiltinsDate::SetSeconds(ecmaRuntimeCallInfo);
412    JSTaggedValue result1 = BuiltinsDate::GetSeconds(ecmaRuntimeCallInfo);
413    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(59)).GetRawData());
414
415    JSTaggedValue result2 = BuiltinsDate::GetMilliseconds(ecmaRuntimeCallInfo);
416    ASSERT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(123)).GetRawData());
417}
418
419HWTEST_F_L0(BuiltinsDateTest, SetGetUTCSeconds)
420{
421    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
422
423    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(59)), JSTaggedValue(static_cast<double>(123))};
424    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 8, jsDate.GetTaggedValue());
425
426    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
427    BuiltinsDate::SetUTCSeconds(ecmaRuntimeCallInfo);
428    JSTaggedValue result3 = BuiltinsDate::GetUTCSeconds(ecmaRuntimeCallInfo);
429    ASSERT_EQ(result3.GetRawData(), JSTaggedValue(static_cast<double>(59)).GetRawData());
430
431    JSTaggedValue result4 = BuiltinsDate::GetUTCMilliseconds(ecmaRuntimeCallInfo);
432    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(123)).GetRawData());
433}
434
435HWTEST_F_L0(BuiltinsDateTest, SetGetTime)
436{
437    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
438
439    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(2))};
440    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 6, jsDate.GetTaggedValue());
441
442    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
443    JSTaggedValue result = BuiltinsDate::SetTime(ecmaRuntimeCallInfo);
444    TestHelper::TearDownFrame(thread, prev);
445    ASSERT_EQ(result.GetRawData(), JSTaggedValue(static_cast<double>(2)).GetRawData());
446
447    result = BuiltinsDate::GetTime(ecmaRuntimeCallInfo);
448    ASSERT_EQ(result.GetRawData(), JSTaggedValue(static_cast<double>(2)).GetRawData());
449
450    // msg != IsDate
451    auto info1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 6);
452    prev = TestHelper::SetupFrame(thread, info1);
453    result = BuiltinsDate::SetTime(info1);
454    TestHelper::TearDownFrame(thread, prev);
455    EXPECT_TRUE(thread->HasPendingException());
456    EXPECT_EQ(result, JSTaggedValue::Exception());
457    thread->ClearException();
458
459    auto info2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 6);
460    result = BuiltinsDate::GetTime(info2);
461    TestHelper::TearDownFrame(thread, prev);
462    EXPECT_TRUE(thread->HasPendingException());
463    EXPECT_EQ(result, JSTaggedValue::Exception());
464    thread->ClearException();
465}
466
467HWTEST_F_L0(BuiltinsDateTest, UTC)
468{
469    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
470    std::vector<JSTaggedValue> vals{JSTaggedValue(2020.982), JSTaggedValue(10.23), JSTaggedValue(4.32),
471                                    JSTaggedValue(11.32)};
472    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 12, jsDate.GetTaggedValue());
473
474    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
475    JSTaggedValue result1 = BuiltinsDate::UTC(ecmaRuntimeCallInfo);
476    TestHelper::TearDownFrame(thread, prev);
477    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(1604487600000)).GetRawData());
478
479    vals.push_back(JSTaggedValue(45.1));
480    vals.push_back(JSTaggedValue(34.321));
481    vals.push_back(JSTaggedValue(static_cast<int32_t>(231)));
482    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 18, jsDate.GetTaggedValue());
483
484    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
485    result1 = BuiltinsDate::UTC(ecmaRuntimeCallInfo1);
486    TestHelper::TearDownFrame(thread, prev);
487    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(1604490334231)).GetRawData());
488
489    std::vector<JSTaggedValue> vals2{JSTaggedValue(10.23), JSTaggedValue(4.32), JSTaggedValue(11.32)};
490    auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals2, 10, jsDate.GetTaggedValue());
491    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
492    result1 = BuiltinsDate::UTC(ecmaRuntimeCallInfo2);
493    TestHelper::TearDownFrame(thread, prev);
494    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(-1882224000000)).GetRawData());
495
496    std::vector<JSTaggedValue> vals3{JSTaggedValue(1994.982)};
497    auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals3, 6, jsDate.GetTaggedValue());
498    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
499    result1 = BuiltinsDate::UTC(ecmaRuntimeCallInfo3);
500    TestHelper::TearDownFrame(thread, prev);
501    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(757382400000)).GetRawData());
502
503    std::vector<JSTaggedValue> vals4{JSTaggedValue(19999944.982)};
504    auto ecmaRuntimeCallInfo4 = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals4, 6, jsDate.GetTaggedValue());
505
506    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
507    result1 = BuiltinsDate::UTC(ecmaRuntimeCallInfo4);
508    TestHelper::TearDownFrame(thread, prev);
509    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(base::NAN_VALUE)).GetRawData());
510}
511
512void SetAllYearAndHours(JSThread *thread, const JSHandle<JSDate> &jsDate)
513{
514    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(2018)), JSTaggedValue(static_cast<double>(10)),
515                                     JSTaggedValue(static_cast<double>(6))};
516    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 10, jsDate.GetTaggedValue());
517
518    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
519    BuiltinsDate::SetFullYear(ecmaRuntimeCallInfo);
520    TestHelper::TearDownFrame(thread, prev);
521
522    std::vector<JSTaggedValue> vals1{JSTaggedValue(static_cast<double>(18)), JSTaggedValue(static_cast<double>(10)),
523                                    JSTaggedValue(static_cast<double>(6)), JSTaggedValue(static_cast<double>(111))};
524    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals1, 12, jsDate.GetTaggedValue());
525
526    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
527    BuiltinsDate::SetHours(ecmaRuntimeCallInfo1);
528    TestHelper::TearDownFrame(thread, prev);
529}
530
531void SetAll1(JSThread *thread, const JSHandle<JSDate> &jsDate)
532{
533    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(1900)), JSTaggedValue(static_cast<double>(11)),
534                                    JSTaggedValue(static_cast<double>(31))};
535    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 10, jsDate.GetTaggedValue());
536
537    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
538    BuiltinsDate::SetFullYear(ecmaRuntimeCallInfo);
539    TestHelper::TearDownFrame(thread, prev);
540
541    std::vector<JSTaggedValue> vals1{JSTaggedValue(static_cast<double>(23)), JSTaggedValue(static_cast<double>(54)),
542                                     JSTaggedValue(static_cast<double>(16)), JSTaggedValue(static_cast<double>(888))};
543    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals1, 12, jsDate.GetTaggedValue());
544
545    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
546    BuiltinsDate::SetHours(ecmaRuntimeCallInfo1);
547    TestHelper::TearDownFrame(thread, prev);
548}
549
550void SetAll2(JSThread *thread, const JSHandle<JSDate> &jsDate)
551{
552    std::vector<JSTaggedValue> vals{JSTaggedValue(static_cast<double>(1901)), JSTaggedValue(static_cast<double>(0)),
553                                     JSTaggedValue(static_cast<double>(1))};
554    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals, 10, jsDate.GetTaggedValue());
555
556    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
557    BuiltinsDate::SetFullYear(ecmaRuntimeCallInfo);
558    TestHelper::TearDownFrame(thread, prev);
559
560    std::vector<JSTaggedValue> vals1{JSTaggedValue(static_cast<double>(0)), JSTaggedValue(static_cast<double>(3)),
561                                     JSTaggedValue(static_cast<double>(21)), JSTaggedValue(static_cast<double>(129))};
562    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, vals1, 12, jsDate.GetTaggedValue());
563    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
564    BuiltinsDate::SetHours(ecmaRuntimeCallInfo1);
565    TestHelper::TearDownFrame(thread, prev);
566}
567
568HWTEST_F_L0(BuiltinsDateTest, parse)
569{
570    JSHandle<EcmaString> str =
571        thread->GetEcmaVM()->GetFactory()->NewFromASCII("2020-11-19T12:18:18.132Z");
572    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
573    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
574    ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
575    ecmaRuntimeCallInfo->SetCallArg(0, str.GetTaggedValue());
576
577    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
578    JSTaggedValue result1 = BuiltinsDate::Parse(ecmaRuntimeCallInfo);
579    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(1605788298132)).GetRawData());
580
581    JSHandle<EcmaString> str1 = thread->GetEcmaVM()->GetFactory()->NewFromASCII("2020-11-19Z");
582    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
583    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
584    ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
585    ecmaRuntimeCallInfo1->SetCallArg(0, str1.GetTaggedValue());
586
587    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
588    result1 = BuiltinsDate::Parse(ecmaRuntimeCallInfo1);
589    TestHelper::TearDownFrame(thread, prev);
590    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(1605744000000)).GetRawData());
591
592    JSHandle<EcmaString> str2 =
593        thread->GetEcmaVM()->GetFactory()->NewFromASCII("2020-11T12:18:17.231+08:00");
594    auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
595    ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
596    ecmaRuntimeCallInfo2->SetThis(JSTaggedValue::Undefined());
597    ecmaRuntimeCallInfo2->SetCallArg(0, str2.GetTaggedValue());
598
599    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
600    result1 = BuiltinsDate::Parse(ecmaRuntimeCallInfo2);
601    TestHelper::TearDownFrame(thread, prev);
602    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(1604204297231)).GetRawData());
603
604    JSHandle<EcmaString> str3 =
605        thread->GetEcmaVM()->GetFactory()->NewFromASCII("Thu Nov 19 2020 20:18:18 GMT+0800");
606    auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
607    ecmaRuntimeCallInfo3->SetFunction(JSTaggedValue::Undefined());
608    ecmaRuntimeCallInfo3->SetThis(JSTaggedValue::Undefined());
609    ecmaRuntimeCallInfo3->SetCallArg(0, str3.GetTaggedValue());
610
611    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
612    result1 = BuiltinsDate::Parse(ecmaRuntimeCallInfo3);
613    TestHelper::TearDownFrame(thread, prev);
614    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(1605788298000)).GetRawData());
615
616    JSHandle<EcmaString> str4 =
617        thread->GetEcmaVM()->GetFactory()->NewFromASCII("Thu 03 Jun 2093 04:18 GMT");
618    auto ecmaRuntimeCallInfo4 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
619    ecmaRuntimeCallInfo4->SetFunction(JSTaggedValue::Undefined());
620    ecmaRuntimeCallInfo4->SetThis(JSTaggedValue::Undefined());
621    ecmaRuntimeCallInfo4->SetCallArg(0, str4.GetTaggedValue());
622
623    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
624    result1 = BuiltinsDate::Parse(ecmaRuntimeCallInfo4);
625    TestHelper::TearDownFrame(thread, prev);
626    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(3894841080000)).GetRawData());
627
628    auto ecmaRuntimeCallInfo5 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
629    ecmaRuntimeCallInfo5->SetFunction(JSTaggedValue::Undefined());
630    ecmaRuntimeCallInfo5->SetThis(JSTaggedValue::Undefined());
631    ecmaRuntimeCallInfo5->SetCallArg(0, JSTaggedValue::Null());
632
633    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo5);
634    result1 = BuiltinsDate::Parse(ecmaRuntimeCallInfo5);
635    TestHelper::TearDownFrame(thread, prev);
636    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(base::NAN_VALUE)).GetRawData());
637}
638
639HWTEST_F_L0(BuiltinsDateTest, ToDateString)
640{
641    JSHandle<EcmaString> expect_value =
642        thread->GetEcmaVM()->GetFactory()->NewFromASCII("Tue Nov 06 2018");
643    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
644    SetAllYearAndHours(thread, jsDate);
645
646    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
647    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
648    ecmaRuntimeCallInfo->SetThis(jsDate.GetTaggedValue());
649
650    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
651    JSTaggedValue result = BuiltinsDate::ToDateString(ecmaRuntimeCallInfo);
652    TestHelper::TearDownFrame(thread, prev);
653
654    ASSERT_TRUE(result.IsString());
655    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(
656        reinterpret_cast<EcmaString *>(result.GetRawData()), *expect_value));
657}
658
659HWTEST_F_L0(BuiltinsDateTest, ToISOString)
660{
661    JSHandle<EcmaString> expect_value =
662        thread->GetEcmaVM()->GetFactory()->NewFromASCII("2020-11-19T12:18:18.132Z");
663    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
664    JSDate::Cast(jsDate.GetTaggedValue().GetTaggedObject())->SetTimeValue(thread, JSTaggedValue(1605788298132.0));
665    std::vector<JSTaggedValue> args{};
666    auto result1 = DateAlgorithm(thread, jsDate.GetTaggedValue(), args, 4, AlgorithmType::ALGORITHM_TO_ISO_STRING);
667    ASSERT_TRUE(result1.IsString());
668    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(
669        reinterpret_cast<EcmaString *>(result1.GetRawData()), *expect_value));
670}
671
672HWTEST_F_L0(BuiltinsDateTest, ToISOStringMinus)
673{
674    JSHandle<EcmaString> expect_value =
675        thread->GetEcmaVM()->GetFactory()->NewFromASCII("1831-12-02T21:47:18.382Z");
676    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
677    JSDate::Cast(jsDate.GetTaggedValue().GetTaggedObject())->SetTimeValue(thread, JSTaggedValue(-4357419161618.0));
678
679    std::vector<JSTaggedValue> args{};
680    auto result1 = DateAlgorithm(thread, jsDate.GetTaggedValue(), args, 4, AlgorithmType::ALGORITHM_TO_ISO_STRING);
681    ASSERT_TRUE(result1.IsString());
682    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(
683        reinterpret_cast<EcmaString *>(result1.GetRawData()), *expect_value));
684}
685
686// test toJSON and toPrimitive
687HWTEST_F_L0(BuiltinsDateTest, ToJSON)
688{
689    JSHandle<EcmaString> expect_value =
690        thread->GetEcmaVM()->GetFactory()->NewFromASCII("2020-11-19T12:18:18.132Z");
691    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
692    // number double finite
693    jsDate->SetTimeValue(thread, JSTaggedValue(1605788298132.0));
694    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
695    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
696    ecmaRuntimeCallInfo->SetThis(jsDate.GetTaggedValue());
697
698    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
699    JSTaggedValue result1 = BuiltinsDate::ToJSON(ecmaRuntimeCallInfo);
700    TestHelper::TearDownFrame(thread, prev);
701    ASSERT_TRUE(result1.IsString());
702    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(
703        reinterpret_cast<EcmaString *>(result1.GetRawData()), *expect_value));
704
705    // number double infinite
706    jsDate->SetTimeValue(thread, JSTaggedValue(base::POSITIVE_INFINITY));
707    ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
708    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
709    ecmaRuntimeCallInfo->SetThis(jsDate.GetTaggedValue());
710
711    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
712    result1 = BuiltinsDate::ToJSON(ecmaRuntimeCallInfo);
713    TestHelper::TearDownFrame(thread, prev);
714    ASSERT_EQ(result1, JSTaggedValue::Null());
715}
716
717HWTEST_F_L0(BuiltinsDateTest, ToJSONMinus)
718{
719    JSHandle<EcmaString> expect_value =
720        thread->GetEcmaVM()->GetFactory()->NewFromASCII("1831-12-02T21:47:18.382Z");
721    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
722    jsDate->SetTimeValue(thread, JSTaggedValue(-4357419161618.0));
723    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
724    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
725    ecmaRuntimeCallInfo->SetThis(jsDate.GetTaggedValue());
726
727    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
728    JSTaggedValue result1 = BuiltinsDate::ToJSON(ecmaRuntimeCallInfo);
729    ASSERT_TRUE(result1.IsString());
730    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(
731        reinterpret_cast<EcmaString *>(result1.GetRawData()), *expect_value));
732}
733
734CString GetLocalTime(JSHandle<JSDate>& jsDate)
735{
736    CString localTime;
737    int localMin = 0;
738    localMin = GetLocalOffsetFromOS(static_cast<int64_t>((*jsDate)->GetTimeValue().GetDouble()), true);
739    if (localMin >= 0) {
740        localTime += PLUS;
741    } else if (localMin < 0) {
742        localTime += NEG;
743        localMin = -localMin;
744    }
745    localTime = localTime + JSDate::StrToTargetLength(ToCString(localMin / MINUTE_PER_HOUR), STR_LENGTH_OTHERS);
746    localTime = localTime + JSDate::StrToTargetLength(ToCString(localMin % MINUTE_PER_HOUR), STR_LENGTH_OTHERS);
747    return localTime;
748}
749
750void ToStringCommon(JSThread* thread, CString& str1, CString& str2, CString& str3, AlgorithmType type)
751{
752    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
753    std::vector<JSTaggedValue> argTags{};
754    SetAllYearAndHours(thread, jsDate);
755    JSTaggedValue result1 = DateAlgorithm(thread, jsDate.GetTaggedValue(), argTags, 4, type);
756
757    ASSERT_TRUE(result1.IsString());
758    JSHandle<EcmaString> result1_val(thread, reinterpret_cast<EcmaString *>(result1.GetRawData()));
759    CString str = str1 + GetLocalTime(jsDate);
760    JSHandle<EcmaString> str_handle = thread->GetEcmaVM()->GetFactory()->NewFromASCII(str);
761    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*result1_val, *str_handle));
762
763    JSHandle<JSDate> js_date1 = JSDateCreateTest(thread);
764    SetAll1(thread, js_date1);
765
766    JSTaggedValue result2 = DateAlgorithm(thread, js_date1.GetTaggedValue(), argTags, 4, type);
767    ASSERT_TRUE(result2.IsString());
768    JSHandle<EcmaString> result2_val(thread, reinterpret_cast<EcmaString *>(result2.GetRawData()));
769    str = str2 + GetLocalTime(js_date1);
770    str_handle = thread->GetEcmaVM()->GetFactory()->NewFromASCII(str);
771    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*result2_val, *str_handle));
772
773    JSHandle<JSDate> js_date2 = JSDateCreateTest(thread);
774    SetAll2(thread, js_date2);
775    JSTaggedValue result3 = DateAlgorithm(thread, js_date2.GetTaggedValue(), argTags, 4, type);
776    ASSERT_TRUE(result3.IsString());
777    JSHandle<EcmaString> result3_val(thread, reinterpret_cast<EcmaString *>(result3.GetRawData()));
778    str = str3 + GetLocalTime(js_date2);
779    str_handle = thread->GetEcmaVM()->GetFactory()->NewFromASCII(str);
780    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*result3_val, *str_handle));
781}
782
783HWTEST_F_L0(BuiltinsDateTest, ToString)
784{
785    CString str1 = "Tue Nov 06 2018 18:10:06 GMT";
786    CString str2 = "Mon Dec 31 1900 23:54:16 GMT";
787    CString str3 = "Tue Jan 01 1901 00:03:21 GMT";
788    ToStringCommon(thread, str1, str2, str3, AlgorithmType::ALGORITHM_TO_STRING);
789}
790
791HWTEST_F_L0(BuiltinsDateTest, ToTimeString)
792{
793    CString str1 = "18:10:06 GMT";
794    CString str2 = "23:54:16 GMT";
795    CString str3 = "00:03:21 GMT";
796    ToStringCommon(thread, str1, str2, str3, AlgorithmType::ALGORITHM_TO_TIME_STRING);
797}
798
799HWTEST_F_L0(BuiltinsDateTest, ToUTCString)
800{
801    JSHandle<EcmaString> expect_value =
802        thread->GetEcmaVM()->GetFactory()->NewFromASCII("Thu, 19 Nov 2020 12:18:18 GMT");
803    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
804    JSDate::Cast(jsDate.GetTaggedValue().GetTaggedObject())->SetTimeValue(thread, JSTaggedValue(1605788298132.0));
805    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
806    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
807    ecmaRuntimeCallInfo->SetThis(jsDate.GetTaggedValue());
808
809    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
810    JSTaggedValue result1 = BuiltinsDate::ToUTCString(ecmaRuntimeCallInfo);
811    ASSERT_TRUE(result1.IsString());
812    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(
813        reinterpret_cast<EcmaString *>(result1.GetRawData()), *expect_value));
814}
815
816HWTEST_F_L0(BuiltinsDateTest, ToUTCStringMinus)
817{
818    JSHandle<EcmaString> expect_value =
819        thread->GetEcmaVM()->GetFactory()->NewFromASCII("Fri, 02 Dec 1831 21:47:18 GMT");
820    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
821    JSDate::Cast(jsDate.GetTaggedValue().GetTaggedObject())->SetTimeValue(thread, JSTaggedValue(-4357419161618.0));
822    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
823    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
824    ecmaRuntimeCallInfo->SetThis(jsDate.GetTaggedValue());
825
826    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
827    JSTaggedValue result1 = BuiltinsDate::ToUTCString(ecmaRuntimeCallInfo);
828    ASSERT_TRUE(result1.IsString());
829    ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(
830        reinterpret_cast<EcmaString *>(result1.GetRawData()), *expect_value));
831}
832
833HWTEST_F_L0(BuiltinsDateTest, ValueOf)
834{
835    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
836    JSDate::Cast(jsDate.GetTaggedValue().GetTaggedObject())->SetTimeValue(thread, JSTaggedValue(1605788298132.0));
837    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
838    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
839    ecmaRuntimeCallInfo->SetThis(jsDate.GetTaggedValue());
840
841    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
842    JSTaggedValue result1 = BuiltinsDate::ValueOf(ecmaRuntimeCallInfo);
843    TestHelper::TearDownFrame(thread, prev);
844    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(1605788298132)).GetRawData());
845
846    // case :msg is not Date
847    auto info1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
848    info1->SetFunction(JSTaggedValue::Undefined());
849    info1->SetThis(JSTaggedValue::Undefined());
850
851    prev = TestHelper::SetupFrame(thread, info1);
852    result1 = BuiltinsDate::ValueOf(info1);
853    TestHelper::TearDownFrame(thread, prev);
854    EXPECT_TRUE(thread->HasPendingException());
855    EXPECT_EQ(result1, JSTaggedValue::Exception());
856    thread->ClearException();
857}
858
859HWTEST_F_L0(BuiltinsDateTest, ValueOfMinus)
860{
861    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
862    JSDate::Cast(jsDate.GetTaggedValue().GetTaggedObject())->SetTimeValue(thread, JSTaggedValue(-4357419161618.0));
863    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
864    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
865    ecmaRuntimeCallInfo->SetThis(jsDate.GetTaggedValue());
866
867    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
868    JSTaggedValue result1 = BuiltinsDate::ValueOf(ecmaRuntimeCallInfo);
869    ASSERT_EQ(result1.GetRawData(), JSTaggedValue(static_cast<double>(-4357419161618)).GetRawData());
870}
871
872HWTEST_F_L0(BuiltinsDateTest, DateConstructor)
873{
874    // case1: test new target is undefined.
875    JSHandle<JSDate> jsDate = JSDateCreateTest(thread);
876    JSHandle<GlobalEnv> globalEnv = thread->GetEcmaVM()->GetGlobalEnv();
877    JSHandle<JSFunction> date_func(globalEnv->GetDateFunction());
878    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
879    ecmaRuntimeCallInfo1->SetFunction(date_func.GetTaggedValue());
880    ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
881
882    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
883    JSTaggedValue result1 = BuiltinsDate::DateConstructor(ecmaRuntimeCallInfo1);
884    TestHelper::TearDownFrame(thread, prev);
885    ASSERT_TRUE(result1.IsString());
886
887    // case2: length == 0
888    auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 4);
889    ecmaRuntimeCallInfo2->SetFunction(date_func.GetTaggedValue());
890    ecmaRuntimeCallInfo2->SetThis(jsDate.GetTaggedValue());
891
892    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
893    JSTaggedValue result2 = BuiltinsDate::DateConstructor(ecmaRuntimeCallInfo2);
894    TestHelper::TearDownFrame(thread, prev);
895    ASSERT_TRUE(result2.IsObject());
896
897    // case3: length == 1
898    auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 6);
899    ecmaRuntimeCallInfo3->SetFunction(date_func.GetTaggedValue());
900    ecmaRuntimeCallInfo3->SetThis(jsDate.GetTaggedValue());
901    ecmaRuntimeCallInfo3->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
902
903    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
904    JSTaggedValue result3 = BuiltinsDate::DateConstructor(ecmaRuntimeCallInfo3);
905    TestHelper::TearDownFrame(thread, prev);
906    ASSERT_TRUE(result3.IsObject());
907
908    auto ecmaRuntimeCallInfo4 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 6);
909    ecmaRuntimeCallInfo4->SetFunction(date_func.GetTaggedValue());
910    ecmaRuntimeCallInfo4->SetThis(jsDate.GetTaggedValue());
911    ecmaRuntimeCallInfo4->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
912    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
913    BuiltinsDate::SetFullYear(ecmaRuntimeCallInfo4);
914    TestHelper::TearDownFrame(thread, prev);
915
916    auto ecmaRuntimeCallInfo5 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 6);
917    ecmaRuntimeCallInfo5->SetFunction(date_func.GetTaggedValue());
918    ecmaRuntimeCallInfo5->SetThis(jsDate.GetTaggedValue());
919    ecmaRuntimeCallInfo5->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
920    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo5);
921    JSTaggedValue result4 = BuiltinsDate::GetFullYear(ecmaRuntimeCallInfo5);
922    TestHelper::TearDownFrame(thread, prev);
923    ASSERT_EQ(result4.GetRawData(), JSTaggedValue(static_cast<double>(2018)).GetRawData());
924
925    // case4: length > 1
926    auto ecmaRuntimeCallInfo6 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
927    ecmaRuntimeCallInfo6->SetFunction(date_func.GetTaggedValue());
928    ecmaRuntimeCallInfo6->SetThis(jsDate.GetTaggedValue());
929    ecmaRuntimeCallInfo6->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
930    ecmaRuntimeCallInfo6->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
931
932    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo6);
933    JSTaggedValue result5 = BuiltinsDate::DateConstructor(ecmaRuntimeCallInfo6);
934    TestHelper::TearDownFrame(thread, prev);
935    ASSERT_TRUE(result5.IsObject());
936
937    SetAllYearAndHours(thread, jsDate);
938
939    auto ecmaRuntimeCallInfo7 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
940    ecmaRuntimeCallInfo7->SetFunction(date_func.GetTaggedValue());
941    ecmaRuntimeCallInfo7->SetThis(jsDate.GetTaggedValue());
942    ecmaRuntimeCallInfo7->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
943    ecmaRuntimeCallInfo7->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
944    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo7);
945    BuiltinsDate::SetFullYear(ecmaRuntimeCallInfo7);
946    TestHelper::TearDownFrame(thread, prev);
947
948    auto ecmaRuntimeCallInfo8 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
949    ecmaRuntimeCallInfo8->SetFunction(date_func.GetTaggedValue());
950    ecmaRuntimeCallInfo8->SetThis(jsDate.GetTaggedValue());
951    ecmaRuntimeCallInfo8->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
952    ecmaRuntimeCallInfo8->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
953    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo8);
954    JSTaggedValue result6 = BuiltinsDate::GetFullYear(ecmaRuntimeCallInfo8);
955    TestHelper::TearDownFrame(thread, prev);
956    ASSERT_EQ(result6.GetRawData(), JSTaggedValue(static_cast<double>(2018)).GetRawData());
957
958    auto ecmaRuntimeCallInfo9 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
959    ecmaRuntimeCallInfo9->SetFunction(date_func.GetTaggedValue());
960    ecmaRuntimeCallInfo9->SetThis(jsDate.GetTaggedValue());
961    ecmaRuntimeCallInfo9->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
962    ecmaRuntimeCallInfo9->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
963    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo9);
964    JSTaggedValue result7 = BuiltinsDate::GetMonth(ecmaRuntimeCallInfo9);
965    TestHelper::TearDownFrame(thread, prev);
966    ASSERT_EQ(result7.GetRawData(), JSTaggedValue(static_cast<double>(10)).GetRawData());
967
968    // case5: length > 7
969    auto ecmaRuntimeCallInfo10 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 20);
970    ecmaRuntimeCallInfo10->SetFunction(date_func.GetTaggedValue());
971    ecmaRuntimeCallInfo10->SetThis(jsDate.GetTaggedValue());
972    ecmaRuntimeCallInfo10->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
973    ecmaRuntimeCallInfo10->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
974    ecmaRuntimeCallInfo10->SetCallArg(2, JSTaggedValue(static_cast<double>(10)));
975    ecmaRuntimeCallInfo10->SetCallArg(3, JSTaggedValue(static_cast<double>(10)));
976    ecmaRuntimeCallInfo10->SetCallArg(4, JSTaggedValue(static_cast<double>(10)));
977    ecmaRuntimeCallInfo10->SetCallArg(5, JSTaggedValue(static_cast<double>(10)));
978    ecmaRuntimeCallInfo10->SetCallArg(6, JSTaggedValue(static_cast<double>(10)));
979    ecmaRuntimeCallInfo10->SetCallArg(7, JSTaggedValue(static_cast<double>(10)));
980
981    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo10);
982    JSTaggedValue result8 = BuiltinsDate::DateConstructor(ecmaRuntimeCallInfo10);
983    TestHelper::TearDownFrame(thread, prev);
984    ASSERT_TRUE(result8.IsObject());
985
986    // case6: length > 1, NAN number
987    auto ecmaRuntimeCallInfo11 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
988    ecmaRuntimeCallInfo11->SetFunction(date_func.GetTaggedValue());
989    ecmaRuntimeCallInfo11->SetThis(jsDate.GetTaggedValue());
990    ecmaRuntimeCallInfo11->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
991    ecmaRuntimeCallInfo11->SetCallArg(1, JSTaggedValue(static_cast<double>(base::NAN_VALUE)));
992
993    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo11);
994    JSTaggedValue result9 = BuiltinsDate::DateConstructor(ecmaRuntimeCallInfo11);
995    TestHelper::TearDownFrame(thread, prev);
996    ASSERT_TRUE(result9.IsObject());
997    JSHandle<JSTaggedValue> result10(thread, result9);
998    JSHandle<JSDate> dateResult1 = JSHandle<JSDate>::Cast(result10);
999    ASSERT_EQ(dateResult1->GetTimeValue(), JSTaggedValue(static_cast<double>(base::NAN_VALUE)));
1000
1001    // case7: length > 1, infinite number
1002    auto ecmaRuntimeCallInfo12 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
1003    ecmaRuntimeCallInfo12->SetFunction(date_func.GetTaggedValue());
1004    ecmaRuntimeCallInfo12->SetThis(jsDate.GetTaggedValue());
1005    ecmaRuntimeCallInfo12->SetCallArg(0, JSTaggedValue(static_cast<double>(2018)));
1006    ecmaRuntimeCallInfo12->SetCallArg(1, JSTaggedValue(static_cast<double>(base::POSITIVE_INFINITY)));
1007
1008    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo12);
1009    JSTaggedValue result11 = BuiltinsDate::DateConstructor(ecmaRuntimeCallInfo12);
1010    TestHelper::TearDownFrame(thread, prev);
1011    ASSERT_TRUE(result11.IsObject());
1012    JSHandle<JSTaggedValue> result12(thread, result11);
1013    JSHandle<JSDate> dateResult2 = JSHandle<JSDate>::Cast(result12);
1014    ASSERT_EQ(dateResult2->GetTimeValue(), JSTaggedValue(static_cast<double>(base::NAN_VALUE)));
1015
1016    // case8: length > 1
1017    auto ecmaRuntimeCallInfo13 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
1018    ecmaRuntimeCallInfo13->SetFunction(date_func.GetTaggedValue());
1019    ecmaRuntimeCallInfo13->SetThis(jsDate.GetTaggedValue());
1020    ecmaRuntimeCallInfo13->SetCallArg(0, JSTaggedValue(static_cast<double>(10)));
1021    ecmaRuntimeCallInfo13->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
1022
1023    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo13);
1024    JSTaggedValue result13 = BuiltinsDate::DateConstructor(ecmaRuntimeCallInfo13);
1025    TestHelper::TearDownFrame(thread, prev);
1026    ASSERT_TRUE(result13.IsObject());
1027
1028    SetAllYearAndHours(thread, jsDate);
1029
1030    auto ecmaRuntimeCallInfo14 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
1031    ecmaRuntimeCallInfo14->SetFunction(date_func.GetTaggedValue());
1032    ecmaRuntimeCallInfo14->SetThis(jsDate.GetTaggedValue());
1033    ecmaRuntimeCallInfo14->SetCallArg(0, JSTaggedValue(static_cast<double>(10)));
1034    ecmaRuntimeCallInfo14->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
1035    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo14);
1036    BuiltinsDate::SetFullYear(ecmaRuntimeCallInfo14);
1037    TestHelper::TearDownFrame(thread, prev);
1038
1039    auto ecmaRuntimeCallInfo15 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
1040    ecmaRuntimeCallInfo15->SetFunction(date_func.GetTaggedValue());
1041    ecmaRuntimeCallInfo15->SetThis(jsDate.GetTaggedValue());
1042    ecmaRuntimeCallInfo15->SetCallArg(0, JSTaggedValue(static_cast<double>(10)));
1043    ecmaRuntimeCallInfo15->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
1044    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo15);
1045    JSTaggedValue result14 = BuiltinsDate::GetFullYear(ecmaRuntimeCallInfo15);
1046    TestHelper::TearDownFrame(thread, prev);
1047    ASSERT_EQ(result14.GetRawData(), JSTaggedValue(static_cast<double>(10)).GetRawData());
1048
1049    auto ecmaRuntimeCallInfo16 = TestHelper::CreateEcmaRuntimeCallInfo(thread, jsDate.GetTaggedValue(), 8);
1050    ecmaRuntimeCallInfo16->SetFunction(date_func.GetTaggedValue());
1051    ecmaRuntimeCallInfo16->SetThis(jsDate.GetTaggedValue());
1052    ecmaRuntimeCallInfo16->SetCallArg(0, JSTaggedValue(static_cast<double>(10)));
1053    ecmaRuntimeCallInfo16->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
1054    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo16);
1055    JSTaggedValue result15 = BuiltinsDate::GetMonth(ecmaRuntimeCallInfo16);
1056    TestHelper::TearDownFrame(thread, prev);
1057    ASSERT_EQ(result15.GetRawData(), JSTaggedValue(static_cast<double>(10)).GetRawData());
1058}
1059}  // namespace panda::test
1060