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