@informalsystems/quint
Version:
Core tool for the Quint specification language
119 lines • 4.76 kB
JavaScript
;
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