@informalsystems/quint
Version:
Core tool for the Quint specification language
69 lines • 4.51 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const mocha_1 = require("mocha");
const IRprinting_1 = require("../../src/ir/IRprinting");
const idGenerator_1 = require("../../src/idGenerator");
const quintParserFrontend_1 = require("../../src/parsing/quintParserFrontend");
const instanceFlattener_1 = require("../../src/flattening/instanceFlattener");
const quintAnalyzer_1 = require("../../src/quintAnalyzer");
(0, mocha_1.describe)('flattenInstances', () => {
function getFlattenedInstances(baseDecls, decls, thirdModuleDecls) {
const idGenerator = (0, idGenerator_1.newIdGenerator)();
const fake_path = { normalizedPath: 'fake_path', toSourceName: () => 'fake_path' };
const quintModules = `module A { ${baseDecls.join('\n')} } module B { ${decls.join('\n')} } module C { ${thirdModuleDecls.join('\n')} }`;
const { modules, table, sourceMap, errors } = (0, quintParserFrontend_1.parse)(idGenerator, 'fake_location', fake_path, quintModules);
chai_1.assert.isEmpty(errors, 'Failed to parse mocked up module');
const [analysisErrors, analysisOutput] = (0, quintAnalyzer_1.analyzeModules)(table, modules);
chai_1.assert.isEmpty(analysisErrors);
const modulesByName = new Map(modules.map(m => [m.name, m]));
return (0, instanceFlattener_1.flattenInstances)(modulesByName.get('B'), modulesByName, table, idGenerator, sourceMap, analysisOutput);
}
(0, mocha_1.it)('flattens simple instance', () => {
const baseDecls = ['const N: int', 'def f(x) = x + N'];
const decls = ['import A(N=1).*', 'def g(x) = f(x)'];
const expectedModuleForInstance = `module B::A {
pure val B::A::N: int = 1
def B::A::f = ((B::A::x) => iadd(B::A::x, B::A::N))
}`;
const expectedDeclsInMain = ['import B::A.*', 'def g = ((x) => B::A::f(x))'];
const [moduleForInstance, module] = getFlattenedInstances(baseDecls, decls, []);
chai_1.assert.deepEqual((0, IRprinting_1.moduleToString)(moduleForInstance), expectedModuleForInstance);
chai_1.assert.sameDeepMembers(module.declarations.map(d => (0, IRprinting_1.declarationToString)(d)), expectedDeclsInMain);
});
(0, mocha_1.it)('copies dependent definitions from expressions in parameters', () => {
const baseDecls = ['const N: int', 'def f(x) = x + N'];
const decls = ['pure val myVal = 1', 'import A(N=myVal).*', 'def g(x) = f(x)'];
const expectedModuleForInstance = `module B::A {
pure val myVal = 1
pure val B::A::N: int = myVal
def B::A::f = ((B::A::x) => iadd(B::A::x, B::A::N))
}`;
const expectedDeclsInMain = ['pure val myVal = 1', 'import B::A.*', 'def g = ((x) => B::A::f(x))'];
const [moduleForInstance, module] = getFlattenedInstances(baseDecls, decls, []);
chai_1.assert.deepEqual((0, IRprinting_1.moduleToString)(moduleForInstance), expectedModuleForInstance);
chai_1.assert.sameDeepMembers(module.declarations.map(d => (0, IRprinting_1.declarationToString)(d)), expectedDeclsInMain);
});
(0, mocha_1.it)('flattens simple instance with N=N', () => {
const baseDecls = ['const N: int', 'val a = N + 1'];
const decls = ['pure val N = 1', 'import A(N=N) as A1', 'def g(x) = x + A1::a'];
const expectedModuleForInstance = `module B::A1 {
pure val N = 1
pure val B::A1::N: int = N
val B::A1::a = iadd(B::A1::N, 1)
}`;
const expectedDeclsInMain = ['pure val N = 1', 'import B::A1.*', 'def g = ((x) => iadd(x, B::A1::a))'];
const [moduleForInstance, module] = getFlattenedInstances(baseDecls, decls, []);
chai_1.assert.deepEqual((0, IRprinting_1.moduleToString)(moduleForInstance), expectedModuleForInstance);
chai_1.assert.sameDeepMembers(module.declarations.map(d => (0, IRprinting_1.declarationToString)(d)), expectedDeclsInMain);
});
(0, mocha_1.it)('generate different ids for different instances', () => {
const baseDecls = ['const N: int', 'val a = N + 1'];
const decls = ['import A(N=1) as A1', 'import A(N=2) as A2', 'val b = A1::a + A2::a'];
const [moduleForA1, moduleForA2, _module] = getFlattenedInstances(baseDecls, decls, []);
const a1 = moduleForA1.declarations.find(d => d.name === 'B::A1::a');
const a2 = moduleForA2.declarations.find(d => d.name === 'B::A2::a');
chai_1.assert.notEqual(a1.id, a2.id);
});
});
//# sourceMappingURL=instanceFlattener.test.js.map