UNPKG

@informalsystems/quint

Version:

Core tool for the Quint specification language

119 lines 4.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const mocha_1 = require("mocha"); const chai_1 = require("chai"); const util_1 = require("./util"); const util_2 = require("../src/util"); const ir_1 = require("./builders/ir"); const itf_1 = require("../src/itf"); (0, mocha_1.describe)('toItf', () => { (0, mocha_1.it)('converts two states', () => { const trace = ['{ x: 2, y: true }', '{ x: 3, y: false }'].map(ir_1.buildExpression); const itfTrace = (0, itf_1.toItf)(['x', 'y'], trace); const expected = { vars: ['x', 'y'], states: [ { '#meta': { index: 0 }, x: { '#bigint': '2' }, y: true, }, { '#meta': { index: 1 }, x: { '#bigint': '3' }, y: false, }, ], }; (0, chai_1.assert)(itfTrace.isRight(), `invalid ITF trace: ${JSON.stringify(itfTrace.unwrap)}`); chai_1.assert.deepEqual(itfTrace.unwrap(), expected); const roundTripTrace = (0, itf_1.ofItf)(itfTrace.unwrap()); (0, chai_1.assert)((0, util_2.zip)(roundTripTrace, trace).every(([a, b]) => (0, util_1.quintExAreEqual)(a, b)), `round trip conversion of trace failed`); }); (0, mocha_1.it)('converts all kinds', () => { const text = `{ a: 2, b: "hello", c: 1000000000000000000, d: Set(5, 6), e: { foo: 3, bar: true }, f: (7, "myStr"), g: Map(1 -> "a", 2 -> "b", 3 -> "c"), h: Map(), i: Map(1 -> "a"), j: variant("A", 2) } `; const trace = [(0, ir_1.buildExpression)(text)]; const vars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']; const itfTrace = (0, itf_1.toItf)(vars, trace); const expected = { vars: vars, states: [ { '#meta': { index: 0, }, a: { '#bigint': '2' }, b: 'hello', c: { '#bigint': '1000000000000000000' }, d: { '#set': [{ '#bigint': '5' }, { '#bigint': '6' }] }, e: { foo: { '#bigint': '3' }, bar: true }, f: { '#tup': [{ '#bigint': '7' }, 'myStr'] }, g: { '#map': [ [{ '#bigint': '1' }, 'a'], [{ '#bigint': '2' }, 'b'], [{ '#bigint': '3' }, 'c'], ], }, h: { '#map': [] }, i: { '#map': [[{ '#bigint': '1' }, 'a']] }, j: { tag: 'A', value: { '#bigint': '2' } }, }, ], }; (0, chai_1.assert)(itfTrace.isRight(), `invalid ITF trace: ${JSON.stringify(itfTrace.unwrap)}`); chai_1.assert.deepEqual(itfTrace.unwrap(), expected); const roundTripTrace = (0, itf_1.ofItf)(itfTrace.unwrap()); (0, chai_1.assert)((0, util_2.zip)(roundTripTrace, trace).every(([a, b]) => (0, util_1.quintExAreEqual)(a, b)), `round trip conversion of trace failed`); }); (0, mocha_1.it)('converts unit type from Apalache', () => { const text = '{ a: () }'; const trace = [(0, ir_1.buildExpression)(text)]; const vars = ['a']; const itfTrace = { vars: vars, states: [ { '#meta': { index: 0, }, a: { tag: 'UNIT' }, }, ], }; const roundTripTrace = (0, itf_1.ofItf)(itfTrace); (0, chai_1.assert)((0, util_2.zip)(roundTripTrace, trace).every(([a, b]) => (0, util_1.quintExAreEqual)(a, b)), `round trip conversion of trace failed`); }); }); (0, mocha_1.describe)('ofItfNormalized', () => { (0, mocha_1.it)('returns normalized quint expressions', () => { const unnormalized = `{ a: Set(3, 2, 1), b: { c: 3, b: 2, a: 1 }, c: Map("c" -> 3, "b" -> 2, "a" -> 1) }`; const normalized = `{ a: Set(1, 2, 3), b: { a: 1, b: 2, c: 3 }, c: Map("a" -> 1, "b" -> 2, "c" -> 3) }`; const unnormalizedTrace = [(0, ir_1.buildExpression)(unnormalized)]; const normalizedTrace = [(0, ir_1.buildExpression)(normalized)]; const unnormalizedItf = (0, itf_1.toItf)(['a', 'b', 'c'], unnormalizedTrace).unwrap(); const normalizedExp = (0, itf_1.ofItfNormalized)(unnormalizedItf); (0, chai_1.assert)((0, util_2.zip)(normalizedExp, normalizedTrace).every(([a, b]) => (0, util_1.quintExAreEqual)(a, b))); }); }); //# sourceMappingURL=itf.test.js.map