1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation 2425bb815Sopenharmony_ci * 3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License. 5425bb815Sopenharmony_ci * You may obtain a copy of the License at 6425bb815Sopenharmony_ci * 7425bb815Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8425bb815Sopenharmony_ci * 9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS 11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and 13425bb815Sopenharmony_ci * limitations under the License. 14425bb815Sopenharmony_ci */ 15425bb815Sopenharmony_ci 16425bb815Sopenharmony_ci#include <string.h> 17425bb815Sopenharmony_ci 18425bb815Sopenharmony_ci#include "jerryscript.h" 19425bb815Sopenharmony_ci#include "test-common.h" 20425bb815Sopenharmony_ci#include "jerryscript-ext/module.h" 21425bb815Sopenharmony_ci 22425bb815Sopenharmony_ci#define ACTUAL_NAME "alice" 23425bb815Sopenharmony_ci#define ALIAS_NAME "bob" 24425bb815Sopenharmony_ci 25425bb815Sopenharmony_cistatic jerry_value_t 26425bb815Sopenharmony_ciget_canonical_name (const jerry_value_t name) 27425bb815Sopenharmony_ci{ 28425bb815Sopenharmony_ci jerry_size_t name_size = jerry_get_string_size (name); 29425bb815Sopenharmony_ci JERRY_VLA (jerry_char_t, name_string, name_size + 1); 30425bb815Sopenharmony_ci jerry_string_to_char_buffer (name, name_string, name_size); 31425bb815Sopenharmony_ci name_string[name_size] = 0; 32425bb815Sopenharmony_ci 33425bb815Sopenharmony_ci if (!strcmp ((char *) name_string, ACTUAL_NAME)) 34425bb815Sopenharmony_ci { 35425bb815Sopenharmony_ci return jerry_acquire_value (name); 36425bb815Sopenharmony_ci } 37425bb815Sopenharmony_ci else if (!strcmp ((char *) name_string, ALIAS_NAME)) 38425bb815Sopenharmony_ci { 39425bb815Sopenharmony_ci return jerry_create_string ((jerry_char_t *) ACTUAL_NAME); 40425bb815Sopenharmony_ci } 41425bb815Sopenharmony_ci else 42425bb815Sopenharmony_ci { 43425bb815Sopenharmony_ci return jerry_create_undefined (); 44425bb815Sopenharmony_ci } 45425bb815Sopenharmony_ci} /* get_canonical_name */ 46425bb815Sopenharmony_ci 47425bb815Sopenharmony_cistatic bool 48425bb815Sopenharmony_ciresolve (const jerry_value_t canonical_name, jerry_value_t *result) 49425bb815Sopenharmony_ci{ 50425bb815Sopenharmony_ci jerry_size_t name_size = jerry_get_string_size (canonical_name); 51425bb815Sopenharmony_ci JERRY_VLA (jerry_char_t, name_string, name_size + 1); 52425bb815Sopenharmony_ci jerry_string_to_char_buffer (canonical_name, name_string, name_size); 53425bb815Sopenharmony_ci name_string[name_size] = 0; 54425bb815Sopenharmony_ci 55425bb815Sopenharmony_ci if (!strcmp ((char *) name_string, ACTUAL_NAME)) 56425bb815Sopenharmony_ci { 57425bb815Sopenharmony_ci *result = jerry_create_object (); 58425bb815Sopenharmony_ci return true; 59425bb815Sopenharmony_ci } 60425bb815Sopenharmony_ci return false; 61425bb815Sopenharmony_ci} /* resolve */ 62425bb815Sopenharmony_ci 63425bb815Sopenharmony_cistatic const jerryx_module_resolver_t canonical_test = 64425bb815Sopenharmony_ci{ 65425bb815Sopenharmony_ci .get_canonical_name_p = get_canonical_name, 66425bb815Sopenharmony_ci .resolve_p = resolve 67425bb815Sopenharmony_ci}; 68425bb815Sopenharmony_ci 69425bb815Sopenharmony_ci#define TEST_VALUE 95.0 70425bb815Sopenharmony_ci 71425bb815Sopenharmony_ciint 72425bb815Sopenharmony_cimain (int argc, char **argv) 73425bb815Sopenharmony_ci{ 74425bb815Sopenharmony_ci (void) argc; 75425bb815Sopenharmony_ci (void) argv; 76425bb815Sopenharmony_ci 77425bb815Sopenharmony_ci const jerryx_module_resolver_t *resolver = &canonical_test; 78425bb815Sopenharmony_ci 79425bb815Sopenharmony_ci jerry_init (JERRY_INIT_EMPTY); 80425bb815Sopenharmony_ci 81425bb815Sopenharmony_ci jerry_value_t actual_name = jerry_create_string ((jerry_char_t *) ACTUAL_NAME); 82425bb815Sopenharmony_ci jerry_value_t alias_name = jerry_create_string ((jerry_char_t *) ALIAS_NAME); 83425bb815Sopenharmony_ci 84425bb815Sopenharmony_ci /* It's important that we resolve by the non-canonical name first. */ 85425bb815Sopenharmony_ci jerry_value_t result2 = jerryx_module_resolve (alias_name, &resolver, 1); 86425bb815Sopenharmony_ci jerry_value_t result1 = jerryx_module_resolve (actual_name, &resolver, 1); 87425bb815Sopenharmony_ci jerry_release_value (actual_name); 88425bb815Sopenharmony_ci jerry_release_value (alias_name); 89425bb815Sopenharmony_ci 90425bb815Sopenharmony_ci /* An elaborate way of doing strict equal - set a property on one object and it "magically" appears on the other. */ 91425bb815Sopenharmony_ci jerry_value_t prop_name = jerry_create_string ((jerry_char_t *) "something"); 92425bb815Sopenharmony_ci jerry_value_t prop_value = jerry_create_number (TEST_VALUE); 93425bb815Sopenharmony_ci jerry_release_value (jerry_set_property (result1, prop_name, prop_value)); 94425bb815Sopenharmony_ci jerry_release_value (prop_value); 95425bb815Sopenharmony_ci 96425bb815Sopenharmony_ci prop_value = jerry_get_property (result2, prop_name); 97425bb815Sopenharmony_ci TEST_ASSERT (jerry_get_number_value (prop_value) == TEST_VALUE); 98425bb815Sopenharmony_ci jerry_release_value (prop_value); 99425bb815Sopenharmony_ci 100425bb815Sopenharmony_ci jerry_release_value (prop_name); 101425bb815Sopenharmony_ci jerry_release_value (result1); 102425bb815Sopenharmony_ci jerry_release_value (result2); 103425bb815Sopenharmony_ci 104425bb815Sopenharmony_ci jerry_cleanup (); 105425bb815Sopenharmony_ci 106425bb815Sopenharmony_ci return 0; 107425bb815Sopenharmony_ci} /* main */ 108