summaryrefslogtreecommitdiffhomepage
path: root/tests/custom/03_stdlib/36_render
diff options
context:
space:
mode:
Diffstat (limited to 'tests/custom/03_stdlib/36_render')
-rw-r--r--tests/custom/03_stdlib/36_render167
1 files changed, 167 insertions, 0 deletions
diff --git a/tests/custom/03_stdlib/36_render b/tests/custom/03_stdlib/36_render
new file mode 100644
index 0000000..64ef08a
--- /dev/null
+++ b/tests/custom/03_stdlib/36_render
@@ -0,0 +1,167 @@
+The `render()` function executes the specified path as ucode script,
+optionally setting a different execution scope for the invoked file,
+and captures the produced output in a string.
+
+If the specified path is relative, it is treated as being relative to the
+source file currently being executed or the current working directory in
+case the interpreter executes code from stdin or a command line argument.
+
+Throws an exception if the given path value is not a string.
+
+Throws an exception if a scope argument is specified and not a valid object.
+
+Throws an exception if the given path could not be found or opened.
+
+Throws an exception if the given file could not be compiled.
+
+Returns a string containing the captured output of the executed file.
+
+-- Testcase --
+{%
+ let real_printf = printf;
+
+ printf("%.J\n", [
+ // include by relative path
+ render("files/include.uc"),
+
+ // include by absolute path
+ render(TESTFILES_PATH + "/include.uc"),
+
+ // include with overridden scope
+ render("files/include.uc", {
+ printf: function(...args) {
+ real_printf("This is the wrapped printf() getting called!\n");
+
+ return real_printf(...args);
+ }
+ }),
+
+ // include with isolated scope
+ render("files/include.uc", proto({
+ printf: function(...args) {
+ real_printf("This is the wrapped printf() getting called!\n");
+
+ return real_printf(...args);
+ }
+ }, {}))
+ ]);
+%}
+-- End --
+
+-- File include.uc --
+{%
+ printf("This is the include file running! Can I access the global env? %s\n",
+ REQUIRE_SEARCH_PATH ? "Yes!" : "No.");
+%}
+-- End --
+
+-- Expect stdout --
+[
+ "This is the include file running! Can I access the global env? Yes!\n",
+ "This is the include file running! Can I access the global env? Yes!\n",
+ "This is the wrapped printf() getting called!\nThis is the include file running! Can I access the global env? Yes!\n",
+ "This is the wrapped printf() getting called!\nThis is the include file running! Can I access the global env? No.\n"
+]
+-- End --
+
+
+An invalid path value triggers an exception.
+
+-- Testcase --
+{%
+ include(true);
+%}
+-- End --
+
+-- Expect stderr --
+Type error: Passed filename is not a string
+In line 2, byte 14:
+
+ ` include(true);`
+ Near here ------^
+
+
+-- End --
+
+
+An invalid scope value triggers an exception.
+
+-- Testcase --
+{%
+ include("test", true);
+%}
+-- End --
+
+-- Expect stderr --
+Type error: Passed scope value is not an object
+In line 2, byte 22:
+
+ ` include("test", true);`
+ Near here --------------^
+
+
+-- End --
+
+
+A not found file triggers an exception.
+
+-- Testcase --
+{%
+ include("files/doesnotexist.uc");
+%}
+-- End --
+
+-- Expect stderr --
+Runtime error: Include file not found
+In line 2, byte 33:
+
+ ` include("files/doesnotexist.uc");`
+ Near here -------------------------^
+
+
+-- End --
+
+
+A compilation error in the file triggers an exception.
+
+-- Testcase --
+{%
+ try {
+ include("files/broken.uc");
+ }
+ catch (e) {
+ // Catch and rethrow exception with modified message to
+ // ensure stable test output.
+ e.message = replace(e.message,
+ /(compile module '.+broken\.uc')/,
+ "compile module '.../broken.uc'");
+
+ die(e);
+ }
+%}
+-- End --
+
+-- File broken.uc --
+{%
+ // Unclosed object to force syntax error
+ return {
+%}
+-- End --
+
+-- Expect stderr --
+Unable to compile module '.../broken.uc':
+Syntax error: Expecting label
+In line 3, byte 11:
+
+ ` return {`
+ Near here --^
+
+
+
+In line 12, byte 8:
+
+ ` die(e);`
+ Near here ---^
+
+
+-- End --