@informalsystems/quint
Version:
Core tool for the Quint specification language
69 lines • 3.48 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const idGenerator_1 = require("../../src/idGenerator");
const quintParserFrontend_1 = require("../../src/parsing/quintParserFrontend");
const textUtils_1 = require("../textUtils");
const aliasInliner_1 = require("../../src/types/aliasInliner");
const IRprinting_1 = require("../../src/ir/IRprinting");
const quintAnalyzer_1 = require("../../src/quintAnalyzer");
function inlineModule(text) {
const idGen = (0, idGenerator_1.newIdGenerator)();
const fake_path = { normalizedPath: 'fake_path', toSourceName: () => 'fake_path' };
const { modules, table, errors } = (0, quintParserFrontend_1.parse)(idGen, 'fake_location', fake_path, text);
chai_1.assert.isEmpty(errors);
const [analysisErrors, analysisOutput] = (0, quintAnalyzer_1.analyzeModules)(table, modules);
chai_1.assert.isEmpty(analysisErrors);
return (0, aliasInliner_1.inlineTypeAliases)(modules, table, analysisOutput);
}
describe('inlineAliases', () => {
it('inlines aliases in a simple module', () => {
const quintModule = `module A {
type MY_ALIAS = int
var x: MY_ALIAS
val a = x
}`;
const { modules, table, analysisOutput } = inlineModule(quintModule);
const expectedModule = (0, textUtils_1.dedent)(`module A {
| type MY_ALIAS = int
| var x: int
| val a = x
|}`);
chai_1.assert.deepEqual((0, IRprinting_1.moduleToString)(modules[0]), expectedModule);
chai_1.assert.deepEqual(table.get(5n)?.typeAnnotation?.kind, 'int');
chai_1.assert.deepEqual(analysisOutput.types.get(4n)?.type.kind, 'int');
});
it('handles nested aliases', () => {
const quintModule = `module A {
type MY_ALIAS = int
type MY_OTHER_ALIAS = MY_ALIAS
var x: MY_OTHER_ALIAS
}`;
const { modules } = inlineModule(quintModule);
const expectedModule = (0, textUtils_1.dedent)(`module A {
| type MY_ALIAS = int
| type MY_OTHER_ALIAS = int
| var x: int
|}`);
chai_1.assert.deepEqual((0, IRprinting_1.moduleToString)(modules[0]), expectedModule);
});
it('handles nested sum types constructors', () => {
const quintModule = `module A {
type T1 = B | C
type T2 = Some(T1) | None
var x: T2
}`;
const { modules } = inlineModule(quintModule);
const expectedModule = (0, textUtils_1.dedent)(`module A {
| type T1 = (B | C)
| val C: (B | C) = variant("C", Tup())
| type T2 = (Some((B | C)) | None)
| val B: (B | C) = variant("B", Tup())
| def Some: ((B | C)) => (Some((B | C)) | None) = ((__SomeParam) => variant("Some", __SomeParam))
| val None: (Some((B | C)) | None) = variant("None", Tup())
| var x: (Some((B | C)) | None)
|}`);
chai_1.assert.deepEqual((0, IRprinting_1.moduleToString)(modules[0]), expectedModule);
});
});
//# sourceMappingURL=aliasInliner.test.js.map