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 class InternalPropertyTest : public testing::Test{
23 public:
SetUpTestCase()24 static void SetUpTestCase()
25 {
26 GTEST_LOG_(INFO) << "InternalPropertyTest SetUpTestCase";
27 }
28
TearDownTestCase()29 static void TearDownTestCase()
30 {
31 GTEST_LOG_(INFO) << "InternalPropertyTest TearDownTestCase";
32 }
33
SetUp()34 void SetUp() override {}
TearDown()35 void TearDown() override {}
36
37 };
38
39 static constexpr size_t JERRY_SCRIPT_MEM_SIZE = 50 * 1024 * 1024;
context_alloc_fn(size_t size,void * cb_data)40 static void* context_alloc_fn(size_t size, void* cb_data)
41 {
42 (void)cb_data;
43 size_t newSize = size > JERRY_SCRIPT_MEM_SIZE ? JERRY_SCRIPT_MEM_SIZE : size;
44 return malloc(newSize);
45 }
46
47 HWTEST_F(InternalPropertyTest, Test001, testing::ext::TestSize.Level1)
48 {
49 jerry_context_t *ctx_p = jerry_create_context (1024, context_alloc_fn, NULL);
50 jerry_port_default_set_current_context (ctx_p);
51
52 jerry_init (JERRY_INIT_EMPTY);
53
54 jerry_value_t object = jerry_create_object ();
55
56 jerry_value_t prop_name_1 = jerry_create_string ((const jerry_char_t *) "foo");
57 jerry_value_t prop_name_2 = jerry_create_string ((const jerry_char_t *) "non_hidden_prop");
58 jerry_value_t prop_name_3;
59
60 if (jerry_is_feature_enabled (JERRY_FEATURE_SYMBOL))
61 {
62 jerry_value_t prop_name_3_desc = jerry_create_string ((const jerry_char_t *) "bar");
63 prop_name_3 = jerry_create_symbol (prop_name_3_desc);
64 jerry_release_value (prop_name_3_desc);
65 }
66 else
67 {
68 prop_name_3 = jerry_create_string ((const jerry_char_t *) "non_hidden_string_prop");
69 }
70
71 jerry_value_t internal_prop_name_1 = jerry_create_string ((const jerry_char_t *) "hidden_foo");
72 jerry_value_t internal_prop_name_2 = jerry_create_string ((const jerry_char_t *) "hidden_prop");
73 jerry_value_t internal_prop_name_3;
74
75 if (jerry_is_feature_enabled (JERRY_FEATURE_SYMBOL))
76 {
77 jerry_value_t internal_prop_name_3_desc = jerry_create_string ((const jerry_char_t *) "bar");
78 internal_prop_name_3 = jerry_create_symbol (internal_prop_name_3_desc);
79 jerry_release_value (internal_prop_name_3_desc);
80 }
81 else
82 {
83 internal_prop_name_3 = jerry_create_string ((const jerry_char_t *) "hidden_string_prop");
84 }
85
86 jerry_value_t prop_value_1 = jerry_create_number (5.5);
87 jerry_value_t prop_value_2 = jerry_create_number (6.5);
88 jerry_value_t prop_value_3 = jerry_create_number (7.5);
89
90 jerry_value_t internal_prop_value_1 = jerry_create_number (8.5);
91 jerry_value_t internal_prop_value_2 = jerry_create_number (9.5);
92 jerry_value_t internal_prop_value_3 = jerry_create_number (10.5);
93
94 /* Test the normal [[Set]] method */
95 bool set_result_1 = jerry_set_property (object, prop_name_1, prop_value_1);
96 bool set_result_2 = jerry_set_property (object, prop_name_2, prop_value_2);
97 bool set_result_3 = jerry_set_property (object, prop_name_3, prop_value_3);
98
99 TEST_ASSERT (set_result_1);
100 TEST_ASSERT (set_result_2);
101 TEST_ASSERT (set_result_3);
102
103 /* Test the internal [[Set]] method */
104 bool set_internal_result_1 = jerry_set_internal_property (object, internal_prop_name_1, internal_prop_value_1);
105 bool set_internal_result_2 = jerry_set_internal_property (object, internal_prop_name_2, internal_prop_value_2);
106 bool set_internal_result_3 = jerry_set_internal_property (object, internal_prop_name_3, internal_prop_value_3);
107
108 TEST_ASSERT (set_internal_result_1);
109 TEST_ASSERT (set_internal_result_2);
110 TEST_ASSERT (set_internal_result_3);
111
112 /* Test the normal [[Has]] method. */
113 jerry_value_t has_result_1 = jerry_has_property (object, prop_name_1);
114 jerry_value_t has_result_2 = jerry_has_property (object, prop_name_2);
115 jerry_value_t has_result_3 = jerry_has_property (object, prop_name_3);
116 jerry_value_t has_result_4 = jerry_has_property (object, internal_prop_name_1);
117 jerry_value_t has_result_5 = jerry_has_property (object, internal_prop_name_2);
118 jerry_value_t has_result_6 = jerry_has_property (object, internal_prop_name_3);
119
120 TEST_ASSERT (jerry_value_is_boolean (has_result_1) && jerry_get_boolean_value (has_result_1));
121 TEST_ASSERT (jerry_value_is_boolean (has_result_2) && jerry_get_boolean_value (has_result_2));
122 TEST_ASSERT (jerry_value_is_boolean (has_result_3) && jerry_get_boolean_value (has_result_3));
123 TEST_ASSERT (jerry_value_is_boolean (has_result_4) && !jerry_get_boolean_value (has_result_4));
124 TEST_ASSERT (jerry_value_is_boolean (has_result_5) && !jerry_get_boolean_value (has_result_5));
125 TEST_ASSERT (jerry_value_is_boolean (has_result_6) && !jerry_get_boolean_value (has_result_6));
126
127 jerry_release_value (has_result_1);
128 jerry_release_value (has_result_2);
129 jerry_release_value (has_result_3);
130 jerry_release_value (has_result_4);
131 jerry_release_value (has_result_5);
132 jerry_release_value (has_result_6);
133
134 /* Test the internal [[Has]] method. */
135 bool has_internal_result_1 = jerry_has_internal_property (object, prop_name_1);
136 bool has_internal_result_2 = jerry_has_internal_property (object, prop_name_2);
137 bool has_internal_result_3 = jerry_has_internal_property (object, prop_name_3);
138 bool has_internal_result_4 = jerry_has_internal_property (object, internal_prop_name_1);
139 bool has_internal_result_5 = jerry_has_internal_property (object, internal_prop_name_2);
140 bool has_internal_result_6 = jerry_has_internal_property (object, internal_prop_name_3);
141
142 TEST_ASSERT (!has_internal_result_1);
143 TEST_ASSERT (!has_internal_result_2);
144 TEST_ASSERT (!has_internal_result_3);
145 TEST_ASSERT (has_internal_result_4);
146 TEST_ASSERT (has_internal_result_5);
147 TEST_ASSERT (has_internal_result_6);
148
149 /* Test the normal [[Get]] method. */
150 jerry_value_t get_result_1 = jerry_get_property (object, prop_name_1);
151 jerry_value_t get_result_2 = jerry_get_property (object, prop_name_2);
152 jerry_value_t get_result_3 = jerry_get_property (object, prop_name_3);
153 jerry_value_t get_result_4 = jerry_get_property (object, internal_prop_name_1);
154 jerry_value_t get_result_5 = jerry_get_property (object, internal_prop_name_2);
155 jerry_value_t get_result_6 = jerry_get_property (object, internal_prop_name_3);
156
157 TEST_ASSERT (jerry_value_is_number (get_result_1) && jerry_get_number_value (get_result_1) == 5.5);
158 TEST_ASSERT (jerry_value_is_number (get_result_2) && jerry_get_number_value (get_result_2) == 6.5);
159 TEST_ASSERT (jerry_value_is_number (get_result_3) && jerry_get_number_value (get_result_3) == 7.5);
160 TEST_ASSERT (jerry_value_is_undefined (get_result_4));
161 TEST_ASSERT (jerry_value_is_undefined (get_result_5));
162 TEST_ASSERT (jerry_value_is_undefined (get_result_6));
163
164 jerry_release_value (get_result_1);
165 jerry_release_value (get_result_2);
166 jerry_release_value (get_result_3);
167 jerry_release_value (get_result_4);
168 jerry_release_value (get_result_5);
169 jerry_release_value (get_result_6);
170
171 /* Test the internal [[Get]] method. */
172 jerry_value_t get_internal_result_1 = jerry_get_internal_property (object, prop_name_1);
173 jerry_value_t get_internal_result_2 = jerry_get_internal_property (object, prop_name_2);
174 jerry_value_t get_internal_result_3 = jerry_get_internal_property (object, prop_name_3);
175 jerry_value_t get_internal_result_4 = jerry_get_internal_property (object, internal_prop_name_1);
176 jerry_value_t get_internal_result_5 = jerry_get_internal_property (object, internal_prop_name_2);
177 jerry_value_t get_internal_result_6 = jerry_get_internal_property (object, internal_prop_name_3);
178
179 TEST_ASSERT (jerry_value_is_undefined (get_internal_result_1));
180 TEST_ASSERT (jerry_value_is_undefined (get_internal_result_2));
181 TEST_ASSERT (jerry_value_is_undefined (get_internal_result_3));
182 TEST_ASSERT (jerry_value_is_number (get_internal_result_4) && jerry_get_number_value (get_internal_result_4) == 8.5);
183 TEST_ASSERT (jerry_value_is_number (get_internal_result_5) && jerry_get_number_value (get_internal_result_5) == 9.5);
184 TEST_ASSERT (jerry_value_is_number (get_internal_result_6) && jerry_get_number_value (get_internal_result_6) == 10.5);
185
186 jerry_release_value (get_internal_result_1);
187 jerry_release_value (get_internal_result_2);
188 jerry_release_value (get_internal_result_3);
189 jerry_release_value (get_internal_result_4);
190 jerry_release_value (get_internal_result_5);
191 jerry_release_value (get_internal_result_6);
192
193 /* Test the normal [[Delete]] method. */
194 bool delete_result_1 = jerry_delete_property (object, prop_name_1);
195 bool delete_result_2 = jerry_delete_property (object, prop_name_2);
196 bool delete_result_3 = jerry_delete_property (object, prop_name_3);
197 bool delete_result_4 = jerry_delete_property (object, internal_prop_name_1);
198 bool delete_result_5 = jerry_delete_property (object, internal_prop_name_2);
199 bool delete_result_6 = jerry_delete_property (object, internal_prop_name_3);
200
201 TEST_ASSERT (delete_result_1);
202 TEST_ASSERT (delete_result_2);
203 TEST_ASSERT (delete_result_3);
204 TEST_ASSERT (delete_result_4);
205 TEST_ASSERT (delete_result_5);
206 TEST_ASSERT (delete_result_6);
207
208 jerry_value_t has_after_delete_result_1 = jerry_has_property (object, prop_name_1);
209 jerry_value_t has_after_delete_result_2 = jerry_has_property (object, prop_name_2);
210 jerry_value_t has_after_delete_result_3 = jerry_has_property (object, prop_name_3);
211 bool has_after_delete_result_4 = jerry_has_internal_property (object, internal_prop_name_1);
212 bool has_after_delete_result_5 = jerry_has_internal_property (object, internal_prop_name_2);
213 bool has_after_delete_result_6 = jerry_has_internal_property (object, internal_prop_name_3);
214
215 TEST_ASSERT (jerry_value_is_boolean (has_after_delete_result_1)
216 && !jerry_get_boolean_value (has_after_delete_result_1));
217 TEST_ASSERT (jerry_value_is_boolean (has_after_delete_result_2)
218 && !jerry_get_boolean_value (has_after_delete_result_2));
219 TEST_ASSERT (jerry_value_is_boolean (has_after_delete_result_3)
220 && !jerry_get_boolean_value (has_after_delete_result_3));
221 TEST_ASSERT (has_after_delete_result_4);
222 TEST_ASSERT (has_after_delete_result_5);
223 TEST_ASSERT (has_after_delete_result_6);
224
225 jerry_release_value (has_after_delete_result_1);
226 jerry_release_value (has_after_delete_result_2);
227 jerry_release_value (has_after_delete_result_3);
228
229 /* Test the internal [[Delete]] method. */
230 bool delete_internal_result_4 = jerry_delete_internal_property (object, internal_prop_name_1);
231 bool delete_internal_result_5 = jerry_delete_internal_property (object, internal_prop_name_2);
232 bool delete_internal_result_6 = jerry_delete_internal_property (object, internal_prop_name_3);
233
234 TEST_ASSERT (delete_internal_result_4);
235 TEST_ASSERT (delete_internal_result_5);
236 TEST_ASSERT (delete_internal_result_6);
237
238 bool has_after_internal_delete_result_1 = jerry_has_internal_property (object, internal_prop_name_1);
239 bool has_after_internal_delete_result_2 = jerry_has_internal_property (object, internal_prop_name_2);
240 bool has_after_internal_delete_result_3 = jerry_has_internal_property (object, internal_prop_name_3);
241
242 TEST_ASSERT (!has_after_internal_delete_result_1);
243 TEST_ASSERT (!has_after_internal_delete_result_2);
244 TEST_ASSERT (!has_after_internal_delete_result_3);
245
246 /* Cleanup */
247 jerry_release_value (prop_value_3);
248 jerry_release_value (prop_value_2);
249 jerry_release_value (prop_value_1);
250
251 jerry_release_value (prop_name_3);
252 jerry_release_value (prop_name_2);
253 jerry_release_value (prop_name_1);
254
255 jerry_release_value (internal_prop_value_3);
256 jerry_release_value (internal_prop_value_2);
257 jerry_release_value (internal_prop_value_1);
258
259 jerry_release_value (internal_prop_name_3);
260 jerry_release_value (internal_prop_name_2);
261 jerry_release_value (internal_prop_name_1);
262
263 jerry_release_value (object);
264
265 jerry_cleanup ();
266
267 free (ctx_p);
268 }
269