• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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