1 /*
2 * Copyright JS Foundation and other contributors, http://js.foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 extern "C"
17 {
18 #include "ecma-init-finalize.h"
19 #include "jmem.h"
20 #include "ecma-helpers.h"
21 #include "ecma-conversion.h"
22 #include "ecma-exceptions.h"
23 #include "jcontext.h"
24 }
25
26 #include "jerryscript-port.h"
27 #include "jerryscript-port-default.h"
28 #include "ecma-globals.h"
29 #include "jerryscript.h"
30 #include <gtest/gtest.h>
31 #include "test-common.h"
32
33 /**
34 * Unit test's main function.
35 */
36 class ToIntegerTest : public testing::Test{
37 public:
SetUpTestCase()38 static void SetUpTestCase()
39 {
40 GTEST_LOG_(INFO) << "ToIntegerTest SetUpTestCase";
41 }
42
TearDownTestCase()43 static void TearDownTestCase()
44 {
45 GTEST_LOG_(INFO) << "ToIntegerTest TearDownTestCase";
46 }
47
SetUp()48 void SetUp() override {}
TearDown()49 void TearDown() override {}
50
51 };
52
53 static constexpr size_t JERRY_SCRIPT_MEM_SIZE = 50 * 1024 * 1024;
context_alloc_fn(size_t size,void * cb_data)54 static void* context_alloc_fn(size_t size, void* cb_data)
55 {
56 (void)cb_data;
57 size_t newSize = size > JERRY_SCRIPT_MEM_SIZE ? JERRY_SCRIPT_MEM_SIZE : size;
58 return malloc(newSize);
59 }
60
61 HWTEST_F(ToIntegerTest, Test001, testing::ext::TestSize.Level1)
62 {
63 TEST_INIT ();
64 jerry_context_t *ctx_p = jerry_create_context (1024, context_alloc_fn, NULL);
65 jerry_port_default_set_current_context (ctx_p);
66 jmem_init ();
67 ecma_init ();
68
69 ecma_number_t num;
70
71 ecma_value_t int_num = ecma_make_int32_value (123);
72
73 ecma_number_t result = ecma_op_to_integer (int_num, &num);
74
75 ecma_free_value (int_num);
76
77 TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
78 TEST_ASSERT (num == 123);
79
80 /* 2 */
81 ecma_value_t error = ecma_raise_type_error (ECMA_ERR_MSG ("I am a neat little error message"));
82
83 result = ecma_op_to_integer (error, &num);
84
85 jcontext_release_exception ();
86
87 TEST_ASSERT (ECMA_IS_VALUE_ERROR (result));
88
89 /* 3 */
90 ecma_value_t nan = ecma_make_nan_value ();
91
92 result = ecma_op_to_integer (nan, &num);
93
94 ecma_free_value (nan);
95
96 TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
97 TEST_ASSERT (num == 0);
98
99 /* 4 */
100 /* -0 */
101 ecma_value_t negative_zero = ecma_make_number_value (-0.0f);
102
103 result = ecma_op_to_integer (negative_zero, &num);
104
105 ecma_free_value (negative_zero);
106
107 TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
108 TEST_ASSERT (1.0f / num == ecma_number_make_infinity (true));
109
110 /* +0 */
111 ecma_value_t positive_zero = ecma_make_number_value (+0.0f);
112
113 result = ecma_op_to_integer (positive_zero, &num);
114
115 ecma_free_value (positive_zero);
116
117 TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
118 TEST_ASSERT (1.0f / num == ecma_number_make_infinity (false));
119
120 /* -infinity */
121 ecma_value_t negative_infinity = ecma_make_number_value (ecma_number_make_infinity (true));
122
123 result = ecma_op_to_integer (negative_infinity, &num);
124
125 ecma_free_value (negative_infinity);
126
127 TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
128 TEST_ASSERT (num == ecma_number_make_infinity (true));
129
130 /* +infinity */
131 ecma_value_t positive_infinity = ecma_make_number_value (ecma_number_make_infinity (false));
132
133 result = ecma_op_to_integer (positive_infinity, &num);
134
135 ecma_free_value (positive_infinity);
136
137 TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
138 TEST_ASSERT (num == ecma_number_make_infinity (false));
139
140 /* 5 */
141 ecma_value_t floor = ecma_make_number_value (3.001f);
142
143 result = ecma_op_to_integer (floor, &num);
144
145 ecma_free_value (floor);
146
147 TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
148 TEST_ASSERT (num == 3);
149
150 ecma_value_t floor2 = ecma_make_number_value (-26.5973);
151
152 result = ecma_op_to_integer (floor2, &num);
153
154 ecma_free_value (floor2);
155
156 TEST_ASSERT (!ECMA_IS_VALUE_ERROR (result));
157 TEST_ASSERT (num == -26);
158
159 ecma_finalize ();
160 jmem_finalize ();
161 free(ctx_p);
162 return;
163 }
164