Files
plainleaf/client/space_lua/lua.test.ts
T
13c61ebab7 [LIQ] Extend with group by and having with aggregators (#1843)
* [LIQ] Extend with `group by` and `having` support

Also update documentation with extensive examples and add some parser
tests.

Note: `make generate` JS files included.

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Merge `liq-add-support-for-aggregators` branch

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Fix link, remove `_` example

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Wrap example LIQ queries inside `query [[ .. ]]` and replace `sql` code block type to `lua`

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Example self-consistency fix

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Fixed some queries

* Add experimental tags to LIQ aggregation/grouping

---------

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
Co-authored-by: Zef Hemel <zef@zef.me>
2026-02-25 10:35:31 +01:00

148 lines
3.8 KiB
TypeScript

import { parse } from "./parse.ts";
import { luaBuildStandardEnv } from "./stdlib.ts";
import { LuaEnv, LuaRuntimeError, LuaStackFrame } from "./runtime.ts";
import { evalStatement } from "./eval.ts";
import { assert } from "@std/assert/assert";
import { fileURLToPath } from "node:url";
Deno.test("[Lua] Core language", async () => {
await runLuaTest("./language_core_test.lua");
});
Deno.test("[Lua] Core language (labels and goto)", async () => {
await runLuaTest("./goto_test.lua");
});
Deno.test("[Lua] Core language (length)", async () => {
await runLuaTest("./len_test.lua");
});
Deno.test("[Lua] Core language (truthiness)", async () => {
await runLuaTest("./truthiness_test.lua");
});
Deno.test("[Lua] Core language (arithmetic)", async () => {
await runLuaTest("./arithmetic_test.lua");
});
Deno.test("[Lua] Core language (metamethods)", async () => {
await runLuaTest("./metamethods_test.lua");
});
Deno.test("[Lua] Load tests", async () => {
await runLuaTest("./stdlib/load_test.lua");
});
Deno.test("[Lua] Core language (length)", async () => {
await runLuaTest("./len_test.lua");
});
Deno.test("[Lua] Format tests", async () => {
await runLuaTest("./stdlib/format_test.lua");
});
Deno.test("[Lua] String to number tests", async () => {
await runLuaTest("./tonumber_test.lua");
});
Deno.test("[Lua] Pattern tests", async () => {
await runLuaTest("./stdlib/pattern_test.lua");
});
Deno.test("[Lua] String tests", async () => {
await runLuaTest("./stdlib/string_test.lua");
});
Deno.test("[Lua] String pack/unpack/packsize tests", async () => {
await runLuaTest("./stdlib/string_pack_test.lua");
});
Deno.test("[Lua] Space Lua tests", async () => {
await runLuaTest("./stdlib/space_lua_test.lua");
});
Deno.test("[Lua] OS tests", async () => {
await runLuaTest("./stdlib/os_test.lua");
});
Deno.test("[Lua] Math tests", async () => {
await runLuaTest("./stdlib/math_test.lua");
});
Deno.test("[Lua] JS tests", async () => {
await runLuaTest("./stdlib/js_test.lua");
});
Deno.test("[Lua] Global functions tests", async () => {
await runLuaTest("./stdlib/global_test.lua");
});
Deno.test("[Lua] Encoding functions tests", async () => {
await runLuaTest("./stdlib/encoding_test.lua");
});
Deno.test("[Lua] Crypto functions tests", async () => {
await runLuaTest("./stdlib/crypto_test.lua");
});
Deno.test("[Lua] Lume functions tests", async () => {
await runLuaTest("./lume_test.lua");
});
Deno.test("[Lua] Lua Integrated Query tests", async () => {
await runLuaTest("./query_test.lua");
});
async function runLuaTest(luaPath: string) {
if (
typeof globalThis.client !== "undefined" &&
globalThis.client &&
typeof globalThis.client === "object"
) {
if (
!globalThis.client.config ||
typeof globalThis.client.config.get !== "function"
) {
try {
Object.defineProperty(globalThis.client, "config", {
value: {
get(_key: string, fallback: unknown) {
return fallback ?? {};
},
},
configurable: true,
writable: true,
});
} catch {
// ignore
}
}
} else {
(globalThis as any).client = {
config: {
get(_key: string, fallback: unknown) {
return fallback ?? {};
},
},
};
}
const luaFile = await Deno.readTextFile(
fileURLToPath(new URL(luaPath, import.meta.url)),
);
const chunk = parse(luaFile, {});
const env = new LuaEnv(luaBuildStandardEnv());
const sf = LuaStackFrame.createWithGlobalEnv(env, chunk.ctx);
try {
await evalStatement(chunk, env, sf);
} catch (e: any) {
if (e instanceof LuaRuntimeError) {
console.error(`Error evaluating script:`, e.toPrettyString(luaFile));
} else {
console.error(`Error evaluating script:`, e);
}
assert(false);
}
}