aboutsummaryrefslogtreecommitdiff
path: root/test/gleam_stdlib_test_ffi.mjs
diff options
context:
space:
mode:
authorinoas <mail@inoas.com>2023-01-22 17:16:11 +0100
committerLouis Pilfold <louis@lpil.uk>2023-01-23 22:11:27 +0000
commit1f7528d71cfcea41a124557e48670253d647e67f (patch)
treebb4db126f6700a348616d0d5df3efc0c7e0644b8 /test/gleam_stdlib_test_ffi.mjs
parente8eb4bdd031ea077be23f768b984c49fe21ed331 (diff)
downloadgleam_stdlib-1f7528d71cfcea41a124557e48670253d647e67f.tar.gz
gleam_stdlib-1f7528d71cfcea41a124557e48670253d647e67f.zip
copy over https://github.com/lpil/gleeunit/blob/main/src/gleeunit_ffi.mjs as ./test/gleam_stdlib_test_ffi.mjs; move functions that are not part of the verbatim copy into a separate helper
Diffstat (limited to 'test/gleam_stdlib_test_ffi.mjs')
-rwxr-xr-xtest/gleam_stdlib_test_ffi.mjs99
1 files changed, 78 insertions, 21 deletions
diff --git a/test/gleam_stdlib_test_ffi.mjs b/test/gleam_stdlib_test_ffi.mjs
index cbf0382..339a843 100755
--- a/test/gleam_stdlib_test_ffi.mjs
+++ b/test/gleam_stdlib_test_ffi.mjs
@@ -1,44 +1,101 @@
-import { opendir } from "fs/promises";
+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
+ }
+ }
+ }
+}
-const dir = "build/dev/javascript/gleam_stdlib/gleam/";
+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() {
- console.log("Running tests...");
-
let passes = 0;
let failures = 0;
- for await (let entry of await opendir(dir)) {
- if (!entry.name.endsWith("_test.mjs")) continue;
- let module = await import("./gleam/" + entry.name);
+ 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 {
- module[fnName]();
- process.stdout.write(`\u001b[32m.\u001b[0m`);
+ await module[fnName]();
+ write(`\u001b[32m.\u001b[0m`);
passes++;
} catch (error) {
- let moduleName = "\ngleam/" + entry.name.slice(0, -3);
- process.stdout.write(`\n❌ ${moduleName}${fnName}: ${error}\n`);
+ 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);
+ }
+}
-${passes + failures} tests
-${passes} passes
-${failures} failures`);
- process.exit(failures ? 1 : 0);
+function join_path(a, b) {
+ if (a.endsWith("/")) return a + b;
+ return a + "/" + b;
}
-export function uint8array(list) {
- let ints = list.toArray();
- let array = new Uint8Array(ints.length);
- for (let i = 0; i < ints.length; i++) {
- array[i] = ints[i];
+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();
}
- return array;
}