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 <string.h> 17 18#include "jerryscript.h" 19#include "test-common.h" 20#include "jerryscript-ext/module.h" 21 22#define ACTUAL_NAME "alice" 23#define ALIAS_NAME "bob" 24 25static jerry_value_t 26get_canonical_name (const jerry_value_t name) 27{ 28 jerry_size_t name_size = jerry_get_string_size (name); 29 JERRY_VLA (jerry_char_t, name_string, name_size + 1); 30 jerry_string_to_char_buffer (name, name_string, name_size); 31 name_string[name_size] = 0; 32 33 if (!strcmp ((char *) name_string, ACTUAL_NAME)) 34 { 35 return jerry_acquire_value (name); 36 } 37 else if (!strcmp ((char *) name_string, ALIAS_NAME)) 38 { 39 return jerry_create_string ((jerry_char_t *) ACTUAL_NAME); 40 } 41 else 42 { 43 return jerry_create_undefined (); 44 } 45} /* get_canonical_name */ 46 47static bool 48resolve (const jerry_value_t canonical_name, jerry_value_t *result) 49{ 50 jerry_size_t name_size = jerry_get_string_size (canonical_name); 51 JERRY_VLA (jerry_char_t, name_string, name_size + 1); 52 jerry_string_to_char_buffer (canonical_name, name_string, name_size); 53 name_string[name_size] = 0; 54 55 if (!strcmp ((char *) name_string, ACTUAL_NAME)) 56 { 57 *result = jerry_create_object (); 58 return true; 59 } 60 return false; 61} /* resolve */ 62 63static const jerryx_module_resolver_t canonical_test = 64{ 65 .get_canonical_name_p = get_canonical_name, 66 .resolve_p = resolve 67}; 68 69#define TEST_VALUE 95.0 70 71int 72main (int argc, char **argv) 73{ 74 (void) argc; 75 (void) argv; 76 77 const jerryx_module_resolver_t *resolver = &canonical_test; 78 79 jerry_init (JERRY_INIT_EMPTY); 80 81 jerry_value_t actual_name = jerry_create_string ((jerry_char_t *) ACTUAL_NAME); 82 jerry_value_t alias_name = jerry_create_string ((jerry_char_t *) ALIAS_NAME); 83 84 /* It's important that we resolve by the non-canonical name first. */ 85 jerry_value_t result2 = jerryx_module_resolve (alias_name, &resolver, 1); 86 jerry_value_t result1 = jerryx_module_resolve (actual_name, &resolver, 1); 87 jerry_release_value (actual_name); 88 jerry_release_value (alias_name); 89 90 /* An elaborate way of doing strict equal - set a property on one object and it "magically" appears on the other. */ 91 jerry_value_t prop_name = jerry_create_string ((jerry_char_t *) "something"); 92 jerry_value_t prop_value = jerry_create_number (TEST_VALUE); 93 jerry_release_value (jerry_set_property (result1, prop_name, prop_value)); 94 jerry_release_value (prop_value); 95 96 prop_value = jerry_get_property (result2, prop_name); 97 TEST_ASSERT (jerry_get_number_value (prop_value) == TEST_VALUE); 98 jerry_release_value (prop_value); 99 100 jerry_release_value (prop_name); 101 jerry_release_value (result1); 102 jerry_release_value (result2); 103 104 jerry_cleanup (); 105 106 return 0; 107} /* main */ 108