aboutsummaryrefslogtreecommitdiff
path: root/tests/unit-ext/test-ext-module-canonical.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit-ext/test-ext-module-canonical.c')
-rw-r--r--tests/unit-ext/test-ext-module-canonical.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/tests/unit-ext/test-ext-module-canonical.c b/tests/unit-ext/test-ext-module-canonical.c
new file mode 100644
index 00000000..9cdbd32d
--- /dev/null
+++ b/tests/unit-ext/test-ext-module-canonical.c
@@ -0,0 +1,107 @@
+/* Copyright JS Foundation and other contributors, http://js.foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string.h>
+
+#include "jerryscript.h"
+#include "test-common.h"
+#include "jerryscript-ext/module.h"
+
+#define ACTUAL_NAME "alice"
+#define ALIAS_NAME "bob"
+
+static jerry_value_t
+get_canonical_name (const jerry_value_t name)
+{
+ jerry_size_t name_size = jerry_get_string_size (name);
+ jerry_char_t name_string[name_size + 1];
+ jerry_string_to_char_buffer (name, name_string, name_size);
+ name_string[name_size] = 0;
+
+ if (!strcmp ((char *) name_string, ACTUAL_NAME))
+ {
+ return jerry_acquire_value (name);
+ }
+ else if (!strcmp ((char *) name_string, ALIAS_NAME))
+ {
+ return jerry_create_string ((jerry_char_t *) ACTUAL_NAME);
+ }
+ else
+ {
+ return jerry_create_undefined ();
+ }
+} /* get_canonical_name */
+
+static bool
+resolve (const jerry_value_t canonical_name, jerry_value_t *result)
+{
+ jerry_size_t name_size = jerry_get_string_size (canonical_name);
+ jerry_char_t name_string[name_size + 1];
+ jerry_string_to_char_buffer (canonical_name, name_string, name_size);
+ name_string[name_size] = 0;
+
+ if (!strcmp ((char *) name_string, ACTUAL_NAME))
+ {
+ *result = jerry_create_object ();
+ return true;
+ }
+ return false;
+} /* resolve */
+
+static const jerryx_module_resolver_t canonical_test =
+{
+ .get_canonical_name_p = get_canonical_name,
+ .resolve_p = resolve
+};
+
+#define TEST_VALUE 95.0
+
+int
+main (int argc, char **argv)
+{
+ (void) argc;
+ (void) argv;
+
+ const jerryx_module_resolver_t *resolver = &canonical_test;
+
+ jerry_init (JERRY_INIT_EMPTY);
+
+ jerry_value_t actual_name = jerry_create_string ((jerry_char_t *) ACTUAL_NAME);
+ jerry_value_t alias_name = jerry_create_string ((jerry_char_t *) ALIAS_NAME);
+
+ /* It's important that we resolve by the non-canonical name first. */
+ jerry_value_t result2 = jerryx_module_resolve (alias_name, &resolver, 1);
+ jerry_value_t result1 = jerryx_module_resolve (actual_name, &resolver, 1);
+ jerry_release_value (actual_name);
+ jerry_release_value (alias_name);
+
+ /* An elaborate way of doing strict equal - set a property on one object and it "magically" appears on the other. */
+ jerry_value_t prop_name = jerry_create_string ((jerry_char_t *) "something");
+ jerry_value_t prop_value = jerry_create_number (TEST_VALUE);
+ jerry_release_value (jerry_set_property (result1, prop_name, prop_value));
+ jerry_release_value (prop_value);
+
+ prop_value = jerry_get_property (result2, prop_name);
+ TEST_ASSERT (jerry_get_number_value (prop_value) == TEST_VALUE);
+ jerry_release_value (prop_value);
+
+ jerry_release_value (prop_name);
+ jerry_release_value (result1);
+ jerry_release_value (result2);
+
+ jerry_cleanup ();
+
+ return 0;
+} /* main */