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(lhs, rhs, res) \
23  { lhs, rhs, res }
24
25typedef struct
26{
27  jerry_value_t lhs;
28  jerry_value_t rhs;
29  bool expected;
30} test_entry_t;
31
32static jerry_value_t
33my_constructor (const jerry_value_t func_val, /**< function */
34                const jerry_value_t this_val, /**< this */
35                const jerry_value_t argv[], /**< arguments */
36                const jerry_length_t argc) /**< number of arguments */
37{
38  (void) func_val;
39  (void) this_val;
40  (void) argv;
41  (void) argc;
42  return jerry_create_undefined ();
43} /* my_constructor */
44
45class ApiBinaryOperationsInstanceofTest : public testing::Test{
46public:
47    static void SetUpTestCase()
48    {
49        GTEST_LOG_(INFO) << "ApiBinaryOperationsInstanceofTest SetUpTestCase";
50    }
51
52    static void TearDownTestCase()
53    {
54        GTEST_LOG_(INFO) << "ApiBinaryOperationsInstanceofTest TearDownTestCase";
55    }
56
57    void SetUp() override {}
58    void TearDown() override {}
59
60};
61
62static constexpr size_t JERRY_SCRIPT_MEM_SIZE = 50 * 1024 * 1024;
63static void* context_alloc_fn(size_t size, void* cb_data)
64{
65    (void)cb_data;
66    size_t newSize = size > JERRY_SCRIPT_MEM_SIZE ? JERRY_SCRIPT_MEM_SIZE : size;
67    return malloc(newSize);
68}
69HWTEST_F(ApiBinaryOperationsInstanceofTest, Test001, testing::ext::TestSize.Level1)
70{
71  jerry_context_t *ctx_p = jerry_create_context (1024, context_alloc_fn, NULL);
72  jerry_port_default_set_current_context (ctx_p);
73  TEST_INIT ();
74
75  jerry_init (JERRY_INIT_EMPTY);
76
77  jerry_value_t base_obj = jerry_create_object ();
78  jerry_value_t constructor = jerry_create_external_function (my_constructor);
79
80  jerry_value_t no_proto_instance_val = jerry_construct_object (constructor, NULL, 0);
81
82  jerry_value_t prototype_str = jerry_create_string ((const jerry_char_t *) "prototype");
83  jerry_value_t res = jerry_set_property (constructor, prototype_str, base_obj);
84  jerry_release_value (prototype_str);
85  TEST_ASSERT (!jerry_value_is_error (res));
86  jerry_release_value (res);
87
88  jerry_value_t instance_val = jerry_construct_object (constructor, NULL, 0);
89
90  jerry_value_t error = jerry_create_error_from_value (base_obj, false);
91
92  test_entry_t bool_tests[] =
93  {
94    T (jerry_acquire_value (instance_val), jerry_acquire_value (constructor), true),
95    T (jerry_acquire_value (no_proto_instance_val), jerry_acquire_value (constructor), false),
96    T (jerry_acquire_value (base_obj), jerry_acquire_value (constructor), false)
97  };
98
99  for (uint32_t idx = 0; idx < sizeof (bool_tests) / sizeof (test_entry_t); idx++)
100  {
101    jerry_value_t result = jerry_binary_operation (JERRY_BIN_OP_INSTANCEOF,
102                                                   bool_tests[idx].lhs,
103                                                   bool_tests[idx].rhs);
104    TEST_ASSERT (!jerry_value_is_error (result));
105    TEST_ASSERT (jerry_get_boolean_value (result) == bool_tests[idx].expected);
106    jerry_release_value (bool_tests[idx].lhs);
107    jerry_release_value (bool_tests[idx].rhs);
108    jerry_release_value (result);
109  }
110
111  test_entry_t error_tests[] =
112  {
113    T (jerry_acquire_value (constructor), jerry_acquire_value (instance_val), true),
114    T (jerry_create_undefined (), jerry_acquire_value (constructor), true),
115    T (jerry_acquire_value (instance_val), jerry_create_undefined (), true),
116    T (jerry_acquire_value (instance_val), jerry_acquire_value (base_obj), true),
117    T (jerry_acquire_value (error), jerry_acquire_value (constructor), true),
118    T (jerry_acquire_value (instance_val), jerry_acquire_value (error), true),
119    T (jerry_create_string ((const jerry_char_t *) ""), jerry_create_string ((const jerry_char_t *) ""), true),
120    T (jerry_create_string ((const jerry_char_t *) ""), jerry_create_number (5.0), true),
121    T (jerry_create_number (5.0), jerry_create_string ((const jerry_char_t *) ""), true),
122    T (jerry_create_array (1), jerry_create_array (1), true),
123    T (jerry_create_array (1), jerry_create_object (), true),
124    T (jerry_create_object (), jerry_create_array (1), true),
125    T (jerry_create_null (), jerry_create_object (), true),
126    T (jerry_create_object (), jerry_create_string ((const jerry_char_t *) ""), true)
127  };
128
129  for (uint32_t idx = 0; idx < sizeof (error_tests) / sizeof (test_entry_t); idx++)
130  {
131    jerry_value_t result = jerry_binary_operation (JERRY_BIN_OP_INSTANCEOF,
132                                                   error_tests[idx].lhs,
133                                                   error_tests[idx].rhs);
134    TEST_ASSERT (jerry_value_is_error (result) == error_tests[idx].expected);
135    jerry_release_value (error_tests[idx].lhs);
136    jerry_release_value (error_tests[idx].rhs);
137    jerry_release_value (result);
138  }
139
140  jerry_release_value (base_obj);
141  jerry_release_value (constructor);
142  jerry_release_value (error);
143  jerry_release_value (instance_val);
144  jerry_release_value (no_proto_instance_val);
145
146  jerry_cleanup ();
147  free (ctx_p);
148}
149