• 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 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