summaryrefslogtreecommitdiffhomepage
path: root/tests/custom/03_stdlib/29_require
diff options
context:
space:
mode:
Diffstat (limited to 'tests/custom/03_stdlib/29_require')
-rw-r--r--tests/custom/03_stdlib/29_require164
1 files changed, 164 insertions, 0 deletions
diff --git a/tests/custom/03_stdlib/29_require b/tests/custom/03_stdlib/29_require
new file mode 100644
index 0000000..681f3f7
--- /dev/null
+++ b/tests/custom/03_stdlib/29_require
@@ -0,0 +1,164 @@
+The `require()` function loads the specified module, executes it and returns
+the returned value to the caller.
+
+The global array `REQUIRE_SEARCH_PATH` specifies the list of locations to
+check for a matching module file.
+
+The return value of a successfully loaded module is cached in a global
+registry, subsequent require calls with the same name will return the
+cached value.
+
+Throws an exception if the global `REQUIRE_SEARCH_PATH` variable is unset or
+not pointing to an array.
+
+Throws an exception if the requested module name cannot be found.
+
+Throws an exception if a module file could be found but not opened.
+
+Throws an exception if a module file could not be compiled.
+
+Returns the value returned by the invoked module code (typically an object).
+
+-- Testcase --
+{%
+ push(REQUIRE_SEARCH_PATH, TESTFILES_PATH + '/*.uc');
+
+ let mod1 = require("require.test.module");
+ printf("require() #1 returned %.J\n\n", mod1);
+
+ let mod2 = require("require.test.module");
+ printf("require() #2 returned %.J\n\n", mod2);
+
+ printf("Instances are identical: %s\n\n", mod1 === mod2);
+
+ // deleting the entry from the global module registry forces reload
+ delete global.modules["require.test.module"];
+
+ let mod3 = require("require.test.module");
+ printf("require() #3 returned %.J\n\n", mod3);
+
+ printf("Instances are identical: %s\n\n", mod1 === mod3);
+%}
+-- End --
+
+-- File require/test/module.uc --
+{%
+ print("This is require.test.module running!\n\n");
+
+ return {
+ greeting: function(name) {
+ printf("Hello, %s!\n", name);
+ }
+ };
+%}
+-- End --
+
+-- Expect stdout --
+This is require.test.module running!
+
+require() #1 returned {
+ "greeting": "function(name) { ... }"
+}
+
+require() #2 returned {
+ "greeting": "function(name) { ... }"
+}
+
+Instances are identical: true
+
+This is require.test.module running!
+
+require() #3 returned {
+ "greeting": "function(name) { ... }"
+}
+
+Instances are identical: false
+
+-- End --
+
+
+A clobbered `REQUIRE_SEARCH_PATH` triggers an exception.
+
+-- Testcase --
+{%
+ REQUIRE_SEARCH_PATH = null;
+
+ require("test");
+%}
+-- End --
+
+-- Expect stderr --
+Runtime error: Global require search path not set
+In line 4, byte 16:
+
+ ` require("test");`
+ Near here --------^
+
+
+-- End --
+
+
+A not found module triggers an exception.
+
+-- Testcase --
+{%
+ require("test");
+%}
+-- End --
+
+-- Expect stderr --
+Runtime error: No module named 'test' could be found
+In line 2, byte 16:
+
+ ` require("test");`
+ Near here --------^
+
+
+-- End --
+
+
+A compilation error in the module triggers an exception.
+
+-- Testcase --
+{%
+ try {
+ push(REQUIRE_SEARCH_PATH, TESTFILES_PATH + '/*.uc');
+
+ require("require.test.broken");
+ }
+ catch (e) {
+ // Catch and rethrow exception with modified message to
+ // ensure stable test output.
+ e.message = replace(e.message,
+ /(compile module '.+require\/test\/broken\.uc')/,
+ "compile module '.../require/test/broken.uc'");
+
+ die(e);
+ }
+%}
+-- End --
+
+-- File require/test/broken.uc --
+{%
+ // Unclosed object to force syntax error
+ return {
+%}
+-- End --
+
+-- Expect stderr --
+Unable to compile module '.../require/test/broken.uc':
+Syntax error: Expecting label
+In line 3, byte 11:
+
+ ` return {`
+ Near here --^
+
+
+
+In line 14, byte 8:
+
+ ` die(e);`
+ Near here ---^
+
+
+-- End --