1 /* Copyright JS Foundation and other contributors, http://js.foundation
2 *
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 "jerryscript.h"
17 #include "jerryscript-port.h"
18 #include "jerryscript-port-default.h"
19 #include "test-common.h"
20 #include <gtest/gtest.h>
21
22 #define T(op, lhs, rhs, res) \
23 { op, lhs, rhs, res }
24
25 typedef struct
26 {
27 jerry_binary_operation_t op;
28 jerry_value_t lhs;
29 jerry_value_t rhs;
30 bool expected;
31 } test_entry_t;
32
33 class ApiBinaryOperationsComparisonsTest : public testing::Test{
34 public:
SetUpTestCase()35 static void SetUpTestCase()
36 {
37 GTEST_LOG_(INFO) << "ApiBinaryOperationsComparisonsTest SetUpTestCase";
38 }
39
TearDownTestCase()40 static void TearDownTestCase()
41 {
42 GTEST_LOG_(INFO) << "ApiBinaryOperationsComparisonsTest TearDownTestCase";
43 }
44
SetUp()45 void SetUp() override {}
TearDown()46 void TearDown() override {}
47
48 };
49
50 static constexpr size_t JERRY_SCRIPT_MEM_SIZE = 50 * 1024 * 1024;
context_alloc_fn(size_t size,void * cb_data)51 static void* context_alloc_fn(size_t size, void* cb_data)
52 {
53 (void)cb_data;
54 size_t newSize = size > JERRY_SCRIPT_MEM_SIZE ? JERRY_SCRIPT_MEM_SIZE : size;
55 return malloc(newSize);
56 }
57 HWTEST_F(ApiBinaryOperationsComparisonsTest, Test001, testing::ext::TestSize.Level1)
58 {
59 jerry_context_t *ctx_p = jerry_create_context (1024, context_alloc_fn, NULL);
60 jerry_port_default_set_current_context (ctx_p);
61 TEST_INIT ();
62
63 jerry_init (JERRY_INIT_EMPTY);
64
65 jerry_value_t obj1 = jerry_eval ((const jerry_char_t *) "o={x:1};o", 9, JERRY_PARSE_NO_OPTS);
66 jerry_value_t obj2 = jerry_eval ((const jerry_char_t *) "o={x:1};o", 9, JERRY_PARSE_NO_OPTS);
67 jerry_value_t err1 = jerry_create_error (JERRY_ERROR_SYNTAX, (const jerry_char_t *) "error");
68
69 test_entry_t tests[] =
70 {
71 /* Testing strict equal comparison */
72 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_number (5.0), jerry_create_number (5.0), true),
73 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_number (3.1), jerry_create_number (10), false),
74 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_number (3.1), jerry_create_undefined (), false),
75 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_number (3.1), jerry_create_boolean (true), false),
76 T (JERRY_BIN_OP_STRICT_EQUAL,
77 jerry_create_string ((const jerry_char_t *) "example string"),
78 jerry_create_string ((const jerry_char_t *) "example string"),
79 true),
80 T (JERRY_BIN_OP_STRICT_EQUAL,
81 jerry_create_string ((const jerry_char_t *) "example string"),
82 jerry_create_undefined (),
83 false),
84 T (JERRY_BIN_OP_STRICT_EQUAL,
85 jerry_create_string ((const jerry_char_t *) "example string"),
86 jerry_create_null (),
87 false),
88 T (JERRY_BIN_OP_STRICT_EQUAL,
89 jerry_create_string ((const jerry_char_t *) "example string"),
90 jerry_create_number (5.0),
91 false),
92 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_undefined (), jerry_create_undefined (), true),
93 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_undefined (), jerry_create_null (), false),
94 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_null (), jerry_create_null (), true),
95 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_boolean (true), jerry_create_boolean (true), true),
96 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_boolean (true), jerry_create_boolean (false), false),
97 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_boolean (false), jerry_create_boolean (true), false),
98 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_boolean (false), jerry_create_boolean (false), true),
99 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (obj1), jerry_acquire_value (obj1), true),
100 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (obj1), jerry_acquire_value (obj2), false),
101 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (obj2), jerry_acquire_value (obj1), false),
102 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (obj1), jerry_create_null (), false),
103 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (obj1), jerry_create_undefined (), false),
104 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (obj1), jerry_create_boolean (true), false),
105 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (obj1), jerry_create_boolean (false), false),
106 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (obj1), jerry_create_number (5.0), false),
107 T (JERRY_BIN_OP_STRICT_EQUAL,
108 jerry_acquire_value (obj1),
109 jerry_create_string ((const jerry_char_t *) "example string"),
110 false),
111
112 /* Testing equal comparison */
113 T (JERRY_BIN_OP_EQUAL, jerry_create_number (5.0), jerry_create_number (5.0), true),
114 T (JERRY_BIN_OP_EQUAL, jerry_create_number (3.1), jerry_create_number (10), false),
115 T (JERRY_BIN_OP_EQUAL, jerry_create_number (3.1), jerry_create_undefined (), false),
116 T (JERRY_BIN_OP_EQUAL, jerry_create_number (3.1), jerry_create_boolean (true), false),
117 T (JERRY_BIN_OP_EQUAL,
118 jerry_create_string ((const jerry_char_t *) "example string"),
119 jerry_create_string ((const jerry_char_t *) "example string"),
120 true),
121 T (JERRY_BIN_OP_EQUAL,
122 jerry_create_string ((const jerry_char_t *) "example string"),
123 jerry_create_undefined (),
124 false),
125 T (JERRY_BIN_OP_EQUAL,
126 jerry_create_string ((const jerry_char_t *) "example string"),
127 jerry_create_null (),
128 false),
129 T (JERRY_BIN_OP_EQUAL,
130 jerry_create_string ((const jerry_char_t *) "example string"),
131 jerry_create_number (5.0),
132 false),
133 T (JERRY_BIN_OP_EQUAL, jerry_create_undefined (), jerry_create_undefined (), true),
134 T (JERRY_BIN_OP_EQUAL, jerry_create_undefined (), jerry_create_null (), true),
135 T (JERRY_BIN_OP_EQUAL, jerry_create_null (), jerry_create_null (), true),
136 T (JERRY_BIN_OP_EQUAL, jerry_create_boolean (true), jerry_create_boolean (true), true),
137 T (JERRY_BIN_OP_EQUAL, jerry_create_boolean (true), jerry_create_boolean (false), false),
138 T (JERRY_BIN_OP_EQUAL, jerry_create_boolean (false), jerry_create_boolean (true), false),
139 T (JERRY_BIN_OP_EQUAL, jerry_create_boolean (false), jerry_create_boolean (false), true),
140 T (JERRY_BIN_OP_EQUAL, jerry_acquire_value (obj1), jerry_acquire_value (obj1), true),
141 T (JERRY_BIN_OP_EQUAL, jerry_acquire_value (obj1), jerry_acquire_value (obj2), false),
142 T (JERRY_BIN_OP_EQUAL, jerry_acquire_value (obj2), jerry_acquire_value (obj1), false),
143 T (JERRY_BIN_OP_EQUAL, jerry_acquire_value (obj1), jerry_create_null (), false),
144 T (JERRY_BIN_OP_EQUAL, jerry_acquire_value (obj1), jerry_create_undefined (), false),
145 T (JERRY_BIN_OP_EQUAL, jerry_acquire_value (obj1), jerry_create_boolean (true), false),
146 T (JERRY_BIN_OP_EQUAL, jerry_acquire_value (obj1), jerry_create_boolean (false), false),
147 T (JERRY_BIN_OP_EQUAL, jerry_acquire_value (obj1), jerry_create_number (5.0), false),
148 T (JERRY_BIN_OP_EQUAL,
149 jerry_acquire_value (obj1),
150 jerry_create_string ((const jerry_char_t *) "example string"),
151 false),
152
153 /* Testing less comparison */
154 T (JERRY_BIN_OP_LESS, jerry_create_number (5.0), jerry_create_number (5.0), false),
155 T (JERRY_BIN_OP_LESS, jerry_create_number (3.1), jerry_create_number (10), true),
156 T (JERRY_BIN_OP_LESS, jerry_create_number (3.1), jerry_create_undefined (), false),
157 T (JERRY_BIN_OP_LESS, jerry_create_number (3.1), jerry_create_boolean (true), false),
158 T (JERRY_BIN_OP_LESS,
159 jerry_create_string ((const jerry_char_t *) "1"),
160 jerry_create_string ((const jerry_char_t *) "2"),
161 true),
162 T (JERRY_BIN_OP_LESS,
163 jerry_create_string ((const jerry_char_t *) "1"),
164 jerry_create_undefined (),
165 false),
166 T (JERRY_BIN_OP_LESS,
167 jerry_create_string ((const jerry_char_t *) "1"),
168 jerry_create_null (),
169 false),
170 T (JERRY_BIN_OP_LESS,
171 jerry_create_string ((const jerry_char_t *) "1"),
172 jerry_create_number (5.0),
173 true),
174 T (JERRY_BIN_OP_LESS, jerry_create_undefined (), jerry_create_undefined (), false),
175 T (JERRY_BIN_OP_LESS, jerry_create_undefined (), jerry_create_null (), false),
176 T (JERRY_BIN_OP_LESS, jerry_create_null (), jerry_create_null (), false),
177 T (JERRY_BIN_OP_LESS, jerry_create_boolean (true), jerry_create_boolean (true), false),
178 T (JERRY_BIN_OP_LESS, jerry_create_boolean (true), jerry_create_boolean (false), false),
179 T (JERRY_BIN_OP_LESS, jerry_create_boolean (false), jerry_create_boolean (true), true),
180 T (JERRY_BIN_OP_LESS, jerry_create_boolean (false), jerry_create_boolean (false), false),
181
182 /* Testing less or equal comparison */
183 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_number (5.0), jerry_create_number (5.0), true),
184 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_number (5.1), jerry_create_number (5.0), false),
185 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_number (3.1), jerry_create_number (10), true),
186 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_number (3.1), jerry_create_undefined (), false),
187 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_number (3.1), jerry_create_boolean (true), false),
188 T (JERRY_BIN_OP_LESS_EQUAL,
189 jerry_create_string ((const jerry_char_t *) "1"),
190 jerry_create_string ((const jerry_char_t *) "2"),
191 true),
192 T (JERRY_BIN_OP_LESS_EQUAL,
193 jerry_create_string ((const jerry_char_t *) "1"),
194 jerry_create_string ((const jerry_char_t *) "1"),
195 true),
196 T (JERRY_BIN_OP_LESS_EQUAL,
197 jerry_create_string ((const jerry_char_t *) "1"),
198 jerry_create_undefined (),
199 false),
200 T (JERRY_BIN_OP_LESS_EQUAL,
201 jerry_create_string ((const jerry_char_t *) "1"),
202 jerry_create_null (),
203 false),
204 T (JERRY_BIN_OP_LESS_EQUAL,
205 jerry_create_string ((const jerry_char_t *) "1"),
206 jerry_create_number (5.0),
207 true),
208 T (JERRY_BIN_OP_LESS_EQUAL,
209 jerry_create_string ((const jerry_char_t *) "5.0"),
210 jerry_create_number (5.0),
211 true),
212 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_undefined (), jerry_create_undefined (), false),
213 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_undefined (), jerry_create_null (), false),
214 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_null (), jerry_create_null (), true),
215 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_boolean (true), jerry_create_boolean (true), true),
216 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_boolean (true), jerry_create_boolean (false), false),
217 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_boolean (false), jerry_create_boolean (true), true),
218 T (JERRY_BIN_OP_LESS_EQUAL, jerry_create_boolean (false), jerry_create_boolean (false), true),
219
220 /* Testing greater comparison */
221 T (JERRY_BIN_OP_GREATER, jerry_create_number (5.0), jerry_create_number (5.0), false),
222 T (JERRY_BIN_OP_GREATER, jerry_create_number (10), jerry_create_number (3.1), true),
223 T (JERRY_BIN_OP_GREATER, jerry_create_number (3.1), jerry_create_undefined (), false),
224 T (JERRY_BIN_OP_GREATER, jerry_create_number (3.1), jerry_create_boolean (true), true),
225 T (JERRY_BIN_OP_GREATER,
226 jerry_create_string ((const jerry_char_t *) "2"),
227 jerry_create_string ((const jerry_char_t *) "1"),
228 true),
229 T (JERRY_BIN_OP_GREATER,
230 jerry_create_string ((const jerry_char_t *) "1"),
231 jerry_create_string ((const jerry_char_t *) "2"),
232 false),
233 T (JERRY_BIN_OP_GREATER,
234 jerry_create_string ((const jerry_char_t *) "1"),
235 jerry_create_undefined (),
236 false),
237 T (JERRY_BIN_OP_GREATER,
238 jerry_create_string ((const jerry_char_t *) "1"),
239 jerry_create_null (),
240 true),
241 T (JERRY_BIN_OP_GREATER,
242 jerry_create_number (5.0),
243 jerry_create_string ((const jerry_char_t *) "1"),
244 true),
245 T (JERRY_BIN_OP_GREATER, jerry_create_undefined (), jerry_create_undefined (), false),
246 T (JERRY_BIN_OP_GREATER, jerry_create_undefined (), jerry_create_null (), false),
247 T (JERRY_BIN_OP_GREATER, jerry_create_null (), jerry_create_null (), false),
248 T (JERRY_BIN_OP_GREATER, jerry_create_boolean (true), jerry_create_boolean (true), false),
249 T (JERRY_BIN_OP_GREATER, jerry_create_boolean (true), jerry_create_boolean (false), true),
250 T (JERRY_BIN_OP_GREATER, jerry_create_boolean (false), jerry_create_boolean (true), false),
251 T (JERRY_BIN_OP_GREATER, jerry_create_boolean (false), jerry_create_boolean (false), false),
252
253 /* Testing greater or equal comparison */
254 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_number (5.0), jerry_create_number (5.0), true),
255 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_number (5.0), jerry_create_number (5.1), false),
256 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_number (10), jerry_create_number (3.1), true),
257 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_number (3.1), jerry_create_undefined (), false),
258 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_number (3.1), jerry_create_boolean (true), true),
259 T (JERRY_BIN_OP_GREATER_EQUAL,
260 jerry_create_string ((const jerry_char_t *) "2"),
261 jerry_create_string ((const jerry_char_t *) "1"),
262 true),
263 T (JERRY_BIN_OP_GREATER_EQUAL,
264 jerry_create_string ((const jerry_char_t *) "1"),
265 jerry_create_string ((const jerry_char_t *) "1"),
266 true),
267 T (JERRY_BIN_OP_GREATER_EQUAL,
268 jerry_create_string ((const jerry_char_t *) "1"),
269 jerry_create_undefined (),
270 false),
271 T (JERRY_BIN_OP_GREATER_EQUAL,
272 jerry_create_string ((const jerry_char_t *) "1"),
273 jerry_create_null (),
274 true),
275 T (JERRY_BIN_OP_GREATER_EQUAL,
276 jerry_create_number (5.0),
277 jerry_create_string ((const jerry_char_t *) "1"),
278 true),
279 T (JERRY_BIN_OP_GREATER_EQUAL,
280 jerry_create_string ((const jerry_char_t *) "5.0"),
281 jerry_create_number (5.0),
282 true),
283 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_undefined (), jerry_create_undefined (), false),
284 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_undefined (), jerry_create_null (), false),
285 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_null (), jerry_create_null (), true),
286 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_boolean (true), jerry_create_boolean (true), true),
287 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_boolean (true), jerry_create_boolean (false), true),
288 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_boolean (false), jerry_create_boolean (true), false),
289 T (JERRY_BIN_OP_GREATER_EQUAL, jerry_create_boolean (false), jerry_create_boolean (false), true),
290 };
291
292 for (uint32_t idx = 0; idx < sizeof (tests) / sizeof (test_entry_t); idx++)
293 {
294 jerry_value_t result = jerry_binary_operation (tests[idx].op, tests[idx].lhs, tests[idx].rhs);
295 TEST_ASSERT (!jerry_value_is_error (result));
296 TEST_ASSERT (jerry_get_boolean_value (result) == tests[idx].expected);
297 jerry_release_value (tests[idx].lhs);
298 jerry_release_value (tests[idx].rhs);
299 jerry_release_value (result);
300 }
301
302 test_entry_t error_tests[] =
303 {
304 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (err1), jerry_acquire_value (err1), true),
305 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_acquire_value (err1), jerry_create_undefined (), true),
306 T (JERRY_BIN_OP_STRICT_EQUAL, jerry_create_undefined (), jerry_acquire_value (err1), true),
307 };
308
309 for (uint32_t idx = 0; idx < sizeof (error_tests) / sizeof (test_entry_t); idx++)
310 {
311 jerry_value_t result = jerry_binary_operation (tests[idx].op, error_tests[idx].lhs, error_tests[idx].rhs);
312 TEST_ASSERT (jerry_value_is_error (result) == error_tests[idx].expected);
313 jerry_release_value (error_tests[idx].lhs);
314 jerry_release_value (error_tests[idx].rhs);
315 jerry_release_value (result);
316 }
317
318 jerry_release_value (obj1);
319 jerry_release_value (obj2);
320 jerry_release_value (err1);
321
322 jerry_cleanup ();
323 free (ctx_p);
324 }
325