diff options
author | inoas <mail@inoas.com> | 2023-01-22 17:16:11 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2023-01-23 22:11:27 +0000 |
commit | 1f7528d71cfcea41a124557e48670253d647e67f (patch) | |
tree | bb4db126f6700a348616d0d5df3efc0c7e0644b8 /test/gleam_stdlib_test_ffi.mjs | |
parent | e8eb4bdd031ea077be23f768b984c49fe21ed331 (diff) | |
download | gleam_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-x | test/gleam_stdlib_test_ffi.mjs | 99 |
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; } |