UNPKG

@informalsystems/quint

Version:

Core tool for the Quint specification language

69 lines 4.51 kB
"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