forked from github/quartz
feat(bases): migrate from vault to upstream
Signed-off-by: Aaron Pham <contact@aarnphm.xyz>
This commit is contained in:
73
quartz/util/base/compiler/interpreter.test.ts
Normal file
73
quartz/util/base/compiler/interpreter.test.ts
Normal file
@@ -0,0 +1,73 @@
|
||||
import assert from "node:assert"
|
||||
import test from "node:test"
|
||||
import { FilePath, FullSlug, SimpleSlug } from "../../path"
|
||||
|
||||
type ContentLayout = "default" | "article" | "page"
|
||||
import { evaluateExpression, valueToUnknown, EvalContext } from "./interpreter"
|
||||
import { compileExpression } from "./ir"
|
||||
import { parseExpressionSource } from "./parser"
|
||||
|
||||
const parseExpr = (source: string) => {
|
||||
const result = parseExpressionSource(source, "test")
|
||||
if (!result.program.body) {
|
||||
throw new Error(`expected expression for ${source}`)
|
||||
}
|
||||
return compileExpression(result.program.body)
|
||||
}
|
||||
|
||||
const makeCtx = (): EvalContext => {
|
||||
const fileA = {
|
||||
slug: "a" as FullSlug,
|
||||
filePath: "a.md" as FilePath,
|
||||
frontmatter: { title: "A", pageLayout: "default" as ContentLayout },
|
||||
links: [] as SimpleSlug[],
|
||||
}
|
||||
const fileB = {
|
||||
slug: "b" as FullSlug,
|
||||
filePath: "b.md" as FilePath,
|
||||
frontmatter: { title: "B", pageLayout: "default" as ContentLayout },
|
||||
links: ["a"] as SimpleSlug[],
|
||||
}
|
||||
return { file: fileA, allFiles: [fileA, fileB] }
|
||||
}
|
||||
|
||||
test("link equality resolves to file targets", () => {
|
||||
const expr = parseExpr('link("a") == file("a")')
|
||||
const value = valueToUnknown(evaluateExpression(expr, makeCtx()))
|
||||
assert.strictEqual(value, true)
|
||||
})
|
||||
|
||||
test("link equality matches raw string targets", () => {
|
||||
const expr = parseExpr('link("a") == "a"')
|
||||
const value = valueToUnknown(evaluateExpression(expr, makeCtx()))
|
||||
assert.strictEqual(value, true)
|
||||
})
|
||||
|
||||
test("date arithmetic handles month additions", () => {
|
||||
const expr = parseExpr('date("2025-01-01") + "1M"')
|
||||
const value = valueToUnknown(evaluateExpression(expr, makeCtx()))
|
||||
assert.ok(value instanceof Date)
|
||||
assert.strictEqual(value.toISOString().split("T")[0], "2025-02-01")
|
||||
})
|
||||
|
||||
test("date subtraction returns duration in ms", () => {
|
||||
const expr = parseExpr('date("2025-01-02") - date("2025-01-01")')
|
||||
const value = valueToUnknown(evaluateExpression(expr, makeCtx()))
|
||||
assert.strictEqual(value, 86400000)
|
||||
})
|
||||
|
||||
test("list summary helpers compute statistics", () => {
|
||||
const meanExpr = parseExpr("([1, 2, 3]).mean()")
|
||||
const medianExpr = parseExpr("([1, 2, 3]).median()")
|
||||
const stddevExpr = parseExpr("([1, 2, 3]).stddev()")
|
||||
const sumExpr = parseExpr("([1, 2, 3]).sum()")
|
||||
const ctx = makeCtx()
|
||||
assert.strictEqual(valueToUnknown(evaluateExpression(meanExpr, ctx)), 2)
|
||||
assert.strictEqual(valueToUnknown(evaluateExpression(medianExpr, ctx)), 2)
|
||||
assert.strictEqual(valueToUnknown(evaluateExpression(sumExpr, ctx)), 6)
|
||||
const stddev = valueToUnknown(evaluateExpression(stddevExpr, ctx))
|
||||
assert.strictEqual(typeof stddev, "number")
|
||||
if (typeof stddev === "number") {
|
||||
assert.ok(Math.abs(stddev - Math.sqrt(2 / 3)) < 1e-6)
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user