UNPKG

@informalsystems/quint

Version:

Core tool for the Quint specification language

217 lines 11.6 kB
"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