Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
import * as path from "path";
import ASTNode from "../ast/ASTNode";
import { ModuleInstantiationStmt } from "../ast/statements";
import ASTAssembler from "../ASTAssembler";
import CodeFile from "../CodeFile";
import ParsingHelper from "../ParsingHelper";
import Token from "../Token";
import ASTScopePopulator from "./ASTScopePopulator";
import { LcForExprWithScope } from "./nodesWithScopes";
import Scope from "./Scope";
describe("ASTScopePopulator", () => {
it("does not crash when populating code containing range expressions", () => {
const [ast, ec] = ParsingHelper.parseFile(
new CodeFile("<test>", "x = [10:20];")
);
ec.throwIfAny();
const pop = new ASTScopePopulator(new Scope());
ast!.accept(pop);
});
it("populates the scope with prelude functions", async () => {
const [ast, ec] = ParsingHelper.parseFile(
await CodeFile.load(path.join(__dirname, "../prelude/prelude.scad"))
);
ec.throwIfAny();
const scope = new Scope();
const pop = new ASTScopePopulator(scope);
ast!.accept(pop);
});
function checkIfExistsInTree<T>(
source: string,
Ctor: { new (...args: any[]): T },
chkFunc?: (elem: T) => void
) {
const [ast, ec] = ParsingHelper.parseFile(new CodeFile("<test>", source));
ec.throwIfAny();
const pop = new ASTScopePopulator(new Scope());
const populated = ast!.accept(pop);
const ok = jest.fn();
class Tmp extends ASTAssembler<void> {
protected processAssembledNode(
t: (Token | (() => void))[],
self: ASTNode
): void {
if (self instanceof Ctor) {
if (chkFunc) {
chkFunc(self);
}
ok();
}
for (const a of t) {
if (typeof a === "function") {
a();
}
}
}
}
populated.accept(new Tmp());
expect(ok).toHaveBeenCalled();
}
it("creates LcForExprWithScope nodes", () => {
checkIfExistsInTree(`x = [for(xD = [2,5]) xD];`, LcForExprWithScope);
});
it("creates LcForExprWithScope nodes for LcFor's without variable names", () => {
checkIfExistsInTree(`x = [for([2,5]) 1];`, LcForExprWithScope);
});
it("preserves tags in module instantations", () => {
checkIfExistsInTree(`% * theMod();`, ModuleInstantiationStmt, (mod) => {
expect(mod.tagBackground).toBeTruthy();
expect(mod.tagDisabled).toBeTruthy();
expect(mod.tagRoot).toBeFalsy();
expect(mod.tagHighlight).toBeFalsy();
});
});
});
2d56448eaThis file is pinned to the selected release. Download the original to open it in your design tool.