1 /*
2  * Copyright (c) 2024 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/dtoa_helper.h"
17 #include "ecmascript/tests/test_helper.h"
18 
19 using namespace panda::ecmascript;
20 using namespace panda::ecmascript::base;
21 
22 #define TEST_DTOA(d, str, buffer, n, k, e1, e2)         \
23         DtoaHelper::Dtoa(d, buffer, &(n), &(k));        \
24         EXPECT_STREQ(str, buffer);                      \
25         EXPECT_EQ(n, e1);                               \
26         EXPECT_EQ(k, e2)
27 
28 namespace panda::test {
29 class DtoaHelperTest : public BaseTestWithScope<false> {
30 protected:
31     template <class To, class From>
32     inline To MemoryCast(const From &src) noexcept
33     {
34         static_assert(sizeof(To) == sizeof(From), "size of the types must be equal");
35         To dst;
36         if (memcpy_s(&dst, sizeof(To), &src, sizeof(From)) != EOK) {
37             LOG_FULL(FATAL) << "memcpy_s failed";
38             UNREACHABLE();
39         }
40         return dst;
41     }
42 };
43 
HWTEST_F_L0(DtoaHelperTest, DoubleToAscii)44 HWTEST_F_L0(DtoaHelperTest, DoubleToAscii)
45 {
46     char buffer1[128] = {};
47     int n1; //decimal_point
48     int k1; //length
49     TEST_DTOA(1.2345, "12345", buffer1, n1, k1, 1, 5);
50 
51     char buffer2[128] = {};
52     int n2;
53     int k2;
54     TEST_DTOA(1.2345678, "12345678", buffer2, n2, k2, 1, 8);
55 
56     char buffer3[128] = {};
57     int n3;
58     int k3;
59     TEST_DTOA(1e30, "1", buffer3, n3, k3, 31, 1);
60 
61     char buffer4[128] = {};
62     int n4;
63     int k4;
64     TEST_DTOA(79.39773355813419, "7939773355813419", buffer4, n4, k4, 2, 16);
65 
66     char buffer5[128] = {};
67     int n5;
68     int k5;
69     TEST_DTOA(0.0000001, "1", buffer5, n5, k5, -6, 1);
70 
71     char buffer6[128] = {};
72     int n6;
73     int k6;
74     TEST_DTOA(1.234567890123456e30, "1234567890123456", buffer6, n6, k6, 31, 16);
75 
76     char buffer7[128] = {};
77     int n7;
78     int k7;
79     TEST_DTOA(2.225073858507201e-308, "2225073858507201", buffer7, n7, k7, -307, 16); // Max subnormal positive double
80 
81     char buffer8[128] = {};
82     int n8;
83     int k8;
84     TEST_DTOA(2.2250738585072014e-308, "22250738585072014", buffer8, n8, k8, -307, 17); // Min normal positive double
85 
86     char buffer9[128] = {};
87     int n9;
88     int k9;
89     TEST_DTOA(1.7976931348623157e308, "17976931348623157", buffer9, n9, k9, 309, 17); // Max double
90 
91     char buffera[128] = {};
92     int na;
93     int ka;
94     TEST_DTOA(5e-301, "5", buffera, na, ka, -300, 1);
95 }
96 }  // namespace panda::test
97