@informalsystems/quint
Version:
Core tool for the Quint specification language
217 lines • 11.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const mocha_1 = require("mocha");
const chai_1 = require("chai");
const ir_1 = require("../builders/ir");
const IRprinting_1 = require("../../src/ir/IRprinting");
const base_1 = require("../../src/types/base");
const src_1 = require("../../src");
(0, mocha_1.describe)('moduleToString', () => {
const quintModule = (0, ir_1.buildModuleWithDecls)(['var S: Set[int]', 'val f = S.filter(x => x + 1)']);
(0, mocha_1.it)('pretty prints the module', () => {
const expectedModule = `module wrapper {
var S: Set[int]
val f = filter(S, ((x) => iadd(x, 1)))
}`;
chai_1.assert.deepEqual((0, IRprinting_1.moduleToString)(quintModule), expectedModule);
});
});
(0, mocha_1.describe)('declarationToString', () => {
(0, mocha_1.it)('pretty prints import declarations', () => {
const decl = (0, ir_1.buildDecl)('import M.*');
const expectedDecl = 'import M.*';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints import declarations with qualifier', () => {
const decl = (0, ir_1.buildDecl)('import M as M1');
const expectedDecl = 'import M as M1';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints import declarations with the module name as qualifier', () => {
const decl = (0, ir_1.buildDecl)('import M');
const expectedDecl = 'import M';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints import declarations with from statement', () => {
const decl = (0, ir_1.buildDecl)('import M.* from "./file"');
const expectedDecl = 'import M.* from "./file"';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints instance declarations', () => {
const decl = (0, ir_1.buildDecl)('import M(x = N + 1, y = 3).*');
const expectedDecl = 'import M(x = iadd(N, 1), y = 3).*';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints instance declarations with qualifier', () => {
const decl = (0, ir_1.buildDecl)('import M(x = N + 1, y = 3) as A');
const expectedDecl = 'import M(x = iadd(N, 1), y = 3) as A';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints instance declarations with from statement', () => {
const decl = (0, ir_1.buildDecl)('import M(x = N + 1, y = 3) as A from "./file"');
const expectedDecl = 'import M(x = iadd(N, 1), y = 3) as A from "./file"';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints export declarations', () => {
const decl = (0, ir_1.buildDecl)('export M.*');
const expectedDecl = 'export M.*';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints export declarations with qualifier', () => {
const decl = (0, ir_1.buildDecl)('export M as M1');
const expectedDecl = 'export M as M1';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints export declarations with the module name as qualifier', () => {
const decl = (0, ir_1.buildDecl)('export M');
const expectedDecl = 'export M';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
(0, mocha_1.it)('pretty prints op definitions', () => {
const decl = (0, ir_1.buildDecl)('val f = S.filter(x => x + 1)');
const expectedDecl = 'val f = filter(S, ((x) => iadd(x, 1)))';
chai_1.assert.deepEqual((0, IRprinting_1.declarationToString)(decl), expectedDecl);
});
});
(0, mocha_1.describe)('definitionToString', () => {
(0, mocha_1.it)('pretty prints op definitions', () => {
const def = (0, ir_1.buildDef)('val f = S.filter(x => x + 1)');
const expectedDef = 'val f = filter(S, ((x) => iadd(x, 1)))';
chai_1.assert.deepEqual((0, IRprinting_1.definitionToString)(def), expectedDef);
});
(0, mocha_1.it)('pretty prints typed op definitions', () => {
const def = (0, ir_1.buildDef)('val f: Set[int] = S.filter(x => x + 1)');
const expectedDef = 'val f: Set[int] = filter(S, ((x) => iadd(x, 1)))';
chai_1.assert.deepEqual((0, IRprinting_1.definitionToString)(def), expectedDef);
});
(0, mocha_1.it)('pretty prints var definitions', () => {
const def = (0, ir_1.buildDef)('var x: int');
const expectedDef = 'var x: int';
chai_1.assert.deepEqual((0, IRprinting_1.definitionToString)(def), expectedDef);
});
(0, mocha_1.it)('pretty prints const definitions', () => {
const def = (0, ir_1.buildDef)('const A: int');
const expectedDef = 'const A: int';
chai_1.assert.deepEqual((0, IRprinting_1.definitionToString)(def), expectedDef);
});
(0, mocha_1.it)('pretty prints assume definitions', () => {
const def = (0, ir_1.buildDef)('assume _ = N > 1');
const expectedDef = 'assume _ = igt(N, 1)';
chai_1.assert.deepEqual((0, IRprinting_1.definitionToString)(def), expectedDef);
});
(0, mocha_1.it)('pretty prints typedef definitions', () => {
const def = (0, ir_1.buildDef)('type T = int');
const expectedDef = 'type T = int';
chai_1.assert.deepEqual((0, IRprinting_1.definitionToString)(def), expectedDef);
});
(0, mocha_1.it)('pretty prints uninterpreted type definitions', () => {
const def = (0, ir_1.buildDef)('type T');
const expectedDef = 'type T';
chai_1.assert.deepEqual((0, IRprinting_1.definitionToString)(def), expectedDef);
});
(0, mocha_1.it)('pretty prints definitions with given type', () => {
const def = (0, ir_1.buildDef)('val f = 1');
const expectedDef = 'val f: int = 1';
chai_1.assert.deepEqual((0, IRprinting_1.definitionToString)(def, true, (0, base_1.toScheme)({ kind: 'int' })), expectedDef);
});
});
(0, mocha_1.describe)('expressionToString', () => {
(0, mocha_1.it)('pretty prints name expressions', () => {
const expr = (0, ir_1.buildExpression)('myName');
const expectedExpr = 'myName';
chai_1.assert.deepEqual((0, IRprinting_1.expressionToString)(expr), expectedExpr);
});
(0, mocha_1.it)('pretty prints bool expressions', () => {
const expr = (0, ir_1.buildExpression)('true');
const expectedExpr = 'true';
chai_1.assert.deepEqual((0, IRprinting_1.expressionToString)(expr), expectedExpr);
});
(0, mocha_1.it)('pretty prints integer expressions', () => {
const expr = (0, ir_1.buildExpression)('123');
const expectedExpr = '123';
chai_1.assert.deepEqual((0, IRprinting_1.expressionToString)(expr), expectedExpr);
});
(0, mocha_1.it)('pretty prints string expressions', () => {
const expr = (0, ir_1.buildExpression)('"My String!"');
const expectedExpr = '"My String!"';
chai_1.assert.deepEqual((0, IRprinting_1.expressionToString)(expr), expectedExpr);
});
(0, mocha_1.it)('pretty prints application expressions', () => {
const expr = (0, ir_1.buildExpression)('S.filter(f(x + 1))');
const expectedExpr = 'filter(S, f(iadd(x, 1)))';
chai_1.assert.deepEqual((0, IRprinting_1.expressionToString)(expr), expectedExpr);
});
(0, mocha_1.it)('pretty prints lambda expressions', () => {
const expr = (0, ir_1.buildExpression)('S.map(x => f(x))');
const expectedExpr = 'map(S, ((x) => f(x)))';
chai_1.assert.deepEqual((0, IRprinting_1.expressionToString)(expr), expectedExpr);
});
(0, mocha_1.it)('multi argument lambdas retain correct semantics', () => {
const expr = (0, ir_1.buildExpression)('foo((f, b) => f(b), 1, 2)');
const expectedExpr = 'foo(((f, b) => f(b)), 1, 2)';
chai_1.assert.deepEqual((0, IRprinting_1.expressionToString)(expr), expectedExpr);
});
(0, mocha_1.it)('pretty prints let expressions', () => {
const expr = (0, ir_1.buildExpression)('val x = 1 val y = 2 { x + y }');
const expectedExpr = 'val x = 1 { val y = 2 { iadd(x, y) } }';
chai_1.assert.deepEqual((0, IRprinting_1.expressionToString)(expr), expectedExpr);
});
});
(0, mocha_1.describe)('typeToString', () => {
(0, mocha_1.it)('pretty prints simple types', () => {
const type = (0, ir_1.buildType)('(bool, int, str, CONST_TYPE, var_type)');
const expectedType = '(bool, int, str, CONST_TYPE, var_type)';
chai_1.assert.deepEqual((0, IRprinting_1.typeToString)(type), expectedType);
});
(0, mocha_1.it)('pretty prints set types', () => {
const type = (0, ir_1.buildType)('Set[int]');
const expectedType = 'Set[int]';
chai_1.assert.deepEqual((0, IRprinting_1.typeToString)(type), expectedType);
});
(0, mocha_1.it)('pretty prints list types', () => {
const type = (0, ir_1.buildType)('List[int]');
const expectedType = 'List[int]';
chai_1.assert.deepEqual((0, IRprinting_1.typeToString)(type), expectedType);
});
(0, mocha_1.it)('pretty prints function types', () => {
const type = (0, ir_1.buildType)('int -> (bool -> bool) -> str');
const expectedType = '(int -> ((bool -> bool) -> str))';
chai_1.assert.deepEqual((0, IRprinting_1.typeToString)(type), expectedType);
});
(0, mocha_1.it)('pretty prints operator types', () => {
const type = (0, ir_1.buildType)('(int, bool) => str');
const expectedType = '(int, bool) => str';
chai_1.assert.deepEqual((0, IRprinting_1.typeToString)(type), expectedType);
});
(0, mocha_1.it)('pretty prints tuple types', () => {
const type = (0, ir_1.buildType)('(int, bool)');
const expectedType = '(int, bool)';
chai_1.assert.deepEqual((0, IRprinting_1.typeToString)(type), expectedType);
});
(0, mocha_1.it)('pretty prints record types', () => {
const type = (0, ir_1.buildType)('{ name: str, fun: int -> bool, rec: { flag: bool } }');
const expectedType = '{ name: str, fun: (int -> bool), rec: { flag: bool } }';
chai_1.assert.deepEqual((0, IRprinting_1.typeToString)(type), expectedType);
});
(0, mocha_1.it)('pretty prints sum types', () => {
const type = {
kind: 'sum',
fields: {
kind: 'row',
fields: [
{ fieldName: 'A', fieldType: { kind: 'int', id: 0n } },
{ fieldName: 'B', fieldType: (0, src_1.unitType)(0n) },
],
other: { kind: 'empty' },
},
};
const expectedType = '(A(int) | B)';
chai_1.assert.deepEqual((0, IRprinting_1.typeToString)(type), expectedType);
});
(0, mocha_1.it)('pretty prints type applications', () => {
const input = 'Result[ok, err]';
const type = (0, ir_1.buildType)(input);
chai_1.assert.deepEqual((0, IRprinting_1.typeToString)(type), input);
});
});
//# sourceMappingURL=IRprinting.test.js.map