• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/ecma_vm.h"
17 #include "ecmascript/global_env.h"
18 #include "ecmascript/js_date.h"
19 #include "ecmascript/js_function.h"
20 #include "ecmascript/js_handle.h"
21 #include "ecmascript/tests/test_helper.h"
22 
23 using namespace panda::ecmascript;
24 
25 namespace panda::test {
26 class JSDateTest : public testing::Test {
27 public:
SetUpTestCase()28     static void SetUpTestCase()
29     {
30         GTEST_LOG_(INFO) << "SetUpTestCase";
31     }
32 
TearDownTestCase()33     static void TearDownTestCase()
34     {
35         GTEST_LOG_(INFO) << "TearDownCase";
36     }
37 
SetUp()38     void SetUp() override
39     {
40         TestHelper::CreateEcmaVMWithScope(instance, thread, scope);
41     }
42 
TearDown()43     void TearDown() override
44     {
45         TestHelper::DestroyEcmaVMWithScope(instance, scope);
46     }
47 
48     PandaVM *instance {nullptr};
49     ecmascript::EcmaHandleScope *scope {nullptr};
50     JSThread *thread {nullptr};
51 };
52 
JSDateCreate(JSThread * thread)53 JSDate *JSDateCreate(JSThread *thread)
54 {
55     ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
56     EcmaVM *ecmaVM = thread->GetEcmaVM();
57     auto globalEnv = ecmaVM->GetGlobalEnv();
58     JSHandle<JSTaggedValue> dateFunction = globalEnv->GetDateFunction();
59     JSHandle<JSDate> dateObject =
60         JSHandle<JSDate>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(dateFunction), dateFunction));
61     return *dateObject;
62 }
63 
HWTEST_F_L0(JSDateTest,Create)64 HWTEST_F_L0(JSDateTest, Create)
65 {
66     double tm = 0.0;
67     JSHandle<JSDate> jsDate(thread, JSDateCreate(thread));
68     EXPECT_EQ(jsDate->GetTimeValue(), JSTaggedValue(tm));
69     EXPECT_EQ(jsDate->GetLocalOffset(), JSTaggedValue(JSDate::MAX_DOUBLE));
70     tm = 28 * 60 * 60 * 1000;
71     jsDate->SetTimeValue(thread, JSTaggedValue(tm));
72 
73     [[maybe_unused]] double temp = jsDate->GetTimeValue().GetDouble();
74     EXPECT_EQ(jsDate->GetTimeValue(), JSTaggedValue(tm));
75 }
76 
HWTEST_F_L0(JSDateTest,MakeTime)77 HWTEST_F_L0(JSDateTest, MakeTime)
78 {
79     double const day1 = ecmascript::JSDate::MakeDay(0, 11, 31);
80     double const time1 = ecmascript::JSDate::MakeTime(0, 0, 0, 0);
81     double ms1 = ecmascript::JSDate::TimeClip(ecmascript::JSDate::MakeDate(day1, time1));
82     EXPECT_EQ(ms1, -62135683200000.0);
83 
84     double const day = ecmascript::JSDate::MakeDay(-1, 11, 31);
85     double const time = ecmascript::JSDate::MakeTime(0, 0, 0, 0);
86     double ms = ecmascript::JSDate::TimeClip(ecmascript::JSDate::MakeDate(day, time));
87     EXPECT_EQ(ms, -62167305600000.0);
88 }
89 
HWTEST_F_L0(JSDateTest,IsoParseStringToMs)90 HWTEST_F_L0(JSDateTest, IsoParseStringToMs)
91 {
92     CString str = "2020-11-19T12:18:18.132Z";
93     JSTaggedValue ms = ecmascript::JSDate::IsoParseStringToMs(str);
94     EXPECT_EQ(ms.GetDouble(), 1605788298132.0);
95 
96     str = "2020-11-19Z";
97     ms = ecmascript::JSDate::IsoParseStringToMs(str);
98     EXPECT_EQ(ms.GetDouble(), 1605744000000.0);
99 
100     str = "2020-11";
101     ms = ecmascript::JSDate::IsoParseStringToMs(str);
102     EXPECT_EQ(ms.GetDouble(), 1604188800000.0);
103 
104     str = "+275760-09-13T00:00:00.000Z";
105     ms = ecmascript::JSDate::IsoParseStringToMs(str);
106     EXPECT_EQ(ms.GetDouble(), 8640000000000000.0);
107 
108     str = "-271821-04-20T00:00:00.000Z";
109     ms = ecmascript::JSDate::IsoParseStringToMs(str);
110     EXPECT_EQ(ms.GetDouble(), -8640000000000000.0);
111 
112     str = "2020T12:18Z";
113     ms = ecmascript::JSDate::IsoParseStringToMs(str);
114     EXPECT_EQ(ms.GetDouble(), 1577881080000.0);
115 
116     str = "2020T12:18:17.231Z";
117     ms = ecmascript::JSDate::IsoParseStringToMs(str);
118     EXPECT_EQ(ms.GetDouble(), 1577881097231.0);
119 
120     str = "2020-11T12:18:17.231Z";
121     ms = ecmascript::JSDate::IsoParseStringToMs(str);
122     EXPECT_EQ(ms.GetDouble(), 1604233097231.0);
123 
124     str = "1645-11T12:18:17.231+08:00";
125     ms = ecmascript::JSDate::IsoParseStringToMs(str);
126     EXPECT_EQ(ms.GetDouble(), -10229658102769.0);
127 
128     str = "2020-11-19T12:18-08:12";
129     ms = ecmascript::JSDate::IsoParseStringToMs(str);
130     EXPECT_EQ(ms.GetDouble(), 1605817800000.0);
131 }
132 
HWTEST_F_L0(JSDateTest,LocalParseStringToMs)133 HWTEST_F_L0(JSDateTest, LocalParseStringToMs)
134 {
135     CString str = "Thu Nov 19 2020 20:18:18 GMT+0800";
136     JSTaggedValue ms = ecmascript::JSDate::LocalParseStringToMs(str);
137     EXPECT_EQ(ms.GetDouble(), 1605788298000.0);
138 
139     str = "Thu Nov 19 2020 20:18 GMT-0800";
140     ms = ecmascript::JSDate::LocalParseStringToMs(str);
141     EXPECT_EQ(ms.GetDouble(), 1605845880000.0);
142 
143     str = "Thu Nov 03 2093 04:18 GMT";
144     ms = ecmascript::JSDate::LocalParseStringToMs(str);
145     EXPECT_EQ(ms.GetDouble(), 3908060280000.0);
146 
147     str = "Thu Nov 19 1820 GMT+1232";
148     ms = ecmascript::JSDate::LocalParseStringToMs(str);
149     EXPECT_EQ(ms.GetDouble(), -4705734720000.0);
150 }
151 
HWTEST_F_L0(JSDateTest,UtcParseStringToMs)152 HWTEST_F_L0(JSDateTest, UtcParseStringToMs)
153 {
154     CString str = "Thu, 19 Nov 2020 20:18:18 GMT+0800";
155     JSTaggedValue ms = ecmascript::JSDate::UtcParseStringToMs(str);
156     EXPECT_EQ(ms.GetDouble(), 1605788298000.0);
157 
158     str = "Thu, 19 Nov 2020 20:18 GMT-0800";
159     ms = ecmascript::JSDate::UtcParseStringToMs(str);
160     EXPECT_EQ(ms.GetDouble(), 1605845880000.0);
161 
162     str = "Thu 03 Jun 2093 04:18 GMT";
163     ms = ecmascript::JSDate::UtcParseStringToMs(str);
164     EXPECT_EQ(ms.GetDouble(), 3894841080000.0);
165 
166     str = "Thu 19 Nov 1820 GMT+1232";
167     ms = ecmascript::JSDate::UtcParseStringToMs(str);
168     EXPECT_EQ(ms.GetDouble(), -4705734720000.0);
169 }
170 }  // namespace panda::test
171