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