Compiler test infrastructure

This commit is contained in:
Tony Garnock-Jones 2024-03-09 22:52:09 +01:00
parent 4843c76784
commit 644891ce76
14 changed files with 84 additions and 37 deletions

View File

@ -0,0 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
export default {
preset: 'ts-jest',
testEnvironment: 'node',
};

View File

@ -18,7 +18,9 @@
"rollup": "../../node_modules/.bin/rollup -c",
"rollup:watch": "../../node_modules/.bin/rollup -c -w",
"clean": "rm -rf lib dist",
"veryclean": "yarn run clean && rm -rf node_modules"
"veryclean": "yarn run clean && rm -rf node_modules",
"test": "../../node_modules/.bin/jest",
"test:watch": "yarn test --watch"
},
"main": "dist/syndicate-compiler.js",
"module": "lib/index.js",

View File

@ -7,7 +7,7 @@ import {
Items, Pattern, Templates, Substitution, TokenType,
SourceMap, CodeWriter, TemplateFunction, Token, SpanIndex, match, TokenBase, getRange, Pos,
} from '../syntax/index.js';
} from '../syntax/index';
import {
SyndicateParser, SyndicateTypedParser,
Identifier,
@ -17,7 +17,7 @@ import {
compilePattern,
SpawnStatement,
} from './grammar.js';
} from './grammar';
export function stripShebang(items: Items): Items {
if ((items.length > 0) &&

View File

@ -9,8 +9,8 @@ import {
scope, bind, seq, alt, upTo, atom, atomString, group,
repeat, option, withoutSpace, map, mapm, rest, discard,
value, succeed, fail, separatedOrTerminatedBy, not,
} from '../syntax/index.js';
import * as Matcher from '../syntax/matcher.js';
} from '../syntax/index';
import * as Matcher from '../syntax/matcher';
//---------------------------------------------------------------------------
// AST types

View File

@ -1,6 +1,6 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
export * as Grammar from './grammar.js';
export * as Codegen from './codegen.js';
export { compile, CompileOptions } from './codegen.js';
export * as Grammar from './grammar';
export * as Codegen from './codegen';
export { compile, CompileOptions } from './codegen';

View File

@ -1,5 +1,5 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
export * as Syntax from './syntax/index.js';
export * from './compiler/index.js';
export * as Syntax from './syntax/index';
export * from './compiler/index';

View File

@ -1,10 +1,10 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Token, TokenType, Item, Items, isGroup } from './tokens.js';
import { Pos, startPos, advancePos } from './position.js';
import { vlqEncode } from './vlq.js';
import { SpanInfo } from './span.js';
import { Token, TokenType, Item, Items, isGroup } from './tokens';
import { Pos, startPos, advancePos } from './position';
import { vlqEncode } from './vlq';
import { SpanInfo } from './span';
export interface SourceMap {
version: 3;

View File

@ -1,13 +1,13 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
export * from './codewriter.js';
export * from './list.js';
export * from './matcher.js';
export * from './position.js';
export * from './reader.js';
export * from './scanner.js';
export * from './span.js';
export * from './template.js';
export * from './tokens.js';
export * from './vlq.js';
export * from './codewriter';
export * from './list';
export * from './matcher';
export * from './position';
export * from './reader';
export * from './scanner';
export * from './span';
export * from './template';
export * from './tokens';
export * from './vlq';

View File

@ -4,9 +4,9 @@
import {
Token, TokenType, Items, Item,
isGroup, isToken, isSpace, isTokenType,
} from './tokens.js';
import { Pos, startPos } from './position.js';
import { List, ArrayList, atEnd, notAtEnd } from './list.js';
} from './tokens';
import { Pos, startPos } from './position';
import { List, ArrayList, atEnd, notAtEnd } from './list';
//---------------------------------------------------------------------------
// Patterns over Item

View File

@ -1,9 +1,9 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { TokenType, Token, Group, GroupInProgress, Item, Items, finishGroup } from './tokens.js';
import { Pos, startPos } from './position.js';
import { Scanner, StringScanner } from './scanner.js';
import { TokenType, Token, Group, GroupInProgress, Item, Items, finishGroup } from './tokens';
import { Pos, startPos } from './position';
import { Scanner, StringScanner } from './scanner';
function matchingParen(c: string): string | null {
switch (c) {

View File

@ -1,8 +1,8 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { TokenType, Token, Item, GroupInProgress } from './tokens.js';
import { Pos, advancePos } from './position.js';
import { TokenType, Token, Item, GroupInProgress } from './tokens';
import { Pos, advancePos } from './position';
export abstract class Scanner implements IterableIterator<Token> {
readonly pos: Pos;

View File

@ -1,10 +1,10 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Items } from './tokens.js';
import { Pos, startPos } from './position.js';
import { laxRead, LaxReadOptions } from './reader.js';
import * as M from './matcher.js';
import { Items } from './tokens';
import { Pos, startPos } from './position';
import { laxRead, LaxReadOptions } from './reader';
import * as M from './matcher';
const substPat = M.scope((o: { pos: Pos }) =>
M.seq(M.atom('$'),

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Pos } from './position.js';
import { Pos } from './position';
export enum TokenType {
SPACE,

View File

@ -0,0 +1,38 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { is, preserves } from '@preserves/core';
declare global {
namespace jest {
interface Matchers<R> {
is(expected: any): R;
toThrowFilter(f: (e: Error) => boolean): R;
}
}
}
expect.extend({
is(actual, expected) {
return is(actual, expected)
? { message: () => preserves`expected ${actual} not to be Preserves.is to ${expected}`,
pass: true }
: { message: () => preserves`expected ${actual} to be Preserves.is to ${expected}`,
pass: false };
},
toThrowFilter(thunk, f) {
try {
thunk();
return { message: () => preserves`expected an exception`, pass: false };
} catch (e) {
if (f(e)) {
return { message: () => preserves`expected an exception not matching the filter`,
pass: true };
} else {
return { message: () => preserves`expected an exception matching the filter: ${(e as any)?.constructor?.name}`,
pass: false };
}
}
}
});