aboutsummaryrefslogtreecommitdiff
path: root/test/gleeunit.mjs
diff options
context:
space:
mode:
authorinoas <mail@inoas.com>2023-01-23 17:13:24 +0100
committerLouis Pilfold <louis@lpil.uk>2023-01-23 22:11:27 +0000
commit28ece48674fad5e4ad94ff2a545a142738955722 (patch)
treec66921b05b85c10f315ef21606c82e1dbf05b4ab /test/gleeunit.mjs
parent53dd405630f615cde99b716eab6a6ffc1b3be093 (diff)
downloadgleam_stdlib-28ece48674fad5e4ad94ff2a545a142738955722.tar.gz
gleam_stdlib-28ece48674fad5e4ad94ff2a545a142738955722.zip
rename modules
Diffstat (limited to 'test/gleeunit.mjs')
-rwxr-xr-xtest/gleeunit.mjs103
1 files changed, 103 insertions, 0 deletions
diff --git a/test/gleeunit.mjs b/test/gleeunit.mjs
new file mode 100755
index 0000000..e497629
--- /dev/null
+++ b/test/gleeunit.mjs
@@ -0,0 +1,103 @@
+// This file is a verbatim copy of gleeunit 0.10.0's <https://github.com/lpil/gleeunit/blob/main/src/gleeunit_ffi.mjs>
+
+async function* gleamFiles(directory) {
+ for (let entry of await read_dir(directory)) {
+ let path = join_path(directory, entry);
+ if (path.endsWith(".gleam")) {
+ yield path;
+ } else {
+ try {
+ yield* gleamFiles(path);
+ } catch (error) {
+ // Could not read directory, assume it's a file
+ }
+ }
+ }
+}
+
+async function readRootPackageName() {
+ let toml = await read_file("gleam.toml", "utf-8");
+ for (let line of toml.split("\n")) {
+ let matches = line.match(/\s*name\s*=\s*"([a-z][a-z0-9_]*)"/); // Match regexp in compiler-cli/src/new.rs in validate_name()
+ if (matches) return matches[1];
+ }
+ throw new Error("Could not determine package name from gleam.toml");
+}
+
+export async function main() {
+ let passes = 0;
+ let failures = 0;
+
+ let packageName = await readRootPackageName();
+ let dist = `../${packageName}/`;
+
+ for await (let path of await gleamFiles("test")) {
+ let js_path = path.slice("test/".length).replace(".gleam", ".mjs");
+ let module = await import(join_path(dist, js_path));
+ for (let fnName of Object.keys(module)) {
+ if (!fnName.endsWith("_test")) continue;
+ try {
+ await module[fnName]();
+ write(`\u001b[32m.\u001b[0m`);
+ passes++;
+ } catch (error) {
+ let moduleName = "\n" + js_path.slice(0, -4);
+ let line = error.line ? `:${error.line}` : "";
+ write(`\n❌ ${moduleName}.${fnName}${line}: ${error}\n`);
+ failures++;
+ }
+ }
+ }
+
+ console.log(`
+${passes + failures} tests, ${failures} failures`);
+ exit(failures ? 1 : 0);
+}
+
+export function crash(message) {
+ throw new Error(message);
+}
+
+function write(message) {
+ if (globalThis.Deno) {
+ Deno.stdout.writeSync(new TextEncoder().encode(message));
+ } else {
+ process.stdout.write(message);
+ }
+}
+
+function exit(code) {
+ if (globalThis.Deno) {
+ Deno.exit(code);
+ } else {
+ process.exit(code);
+ }
+}
+
+async function read_dir(path) {
+ if (globalThis.Deno) {
+ let items = [];
+ for await (let item of Deno.readDir(path, { withFileTypes: true })) {
+ items.push(item.name);
+ }
+ return items;
+ } else {
+ let { readdir } = await import("fs/promises");
+ return readdir(path);
+ }
+}
+
+function join_path(a, b) {
+ if (a.endsWith("/")) return a + b;
+ return a + "/" + b;
+}
+
+async function read_file(path) {
+ if (globalThis.Deno) {
+ return Deno.readTextFile(path);
+ } else {
+ let { readFile } = await import("fs/promises");
+ let contents = await readFile(path);
+ return contents.toString();
+ }
+}