expexp
Version:
The express model io and express model and data representation.
183 lines (153 loc) • 4.7 kB
JavaScript
import ist from 'ist'
import {ModelDeserializer} from '../dist/index.cjs'
// import {traverseContent} from '../src/tree.js'
import fs from 'fs'
import {
loadScenarioCases, genScenarioCase,
loadScenario, loadXpl, stringify
} from './helper.js'
function applyScenario(ci, json) {
const isScmIdToScm = {}
for (let i=0; i<json.xpls.length; i++) {
const inputStr = loadXpl(json.xpls[i])
// console.log(inputStr)
const psr = ModelDeserializer()
const isScmJson = psr.syntaxJsonFromString(inputStr)
isScmIdToScm[isScmJson.id] = isScmJson
// console.log(isScmJson)
// const outputStr = JSON.stringify(isScmJson, undefined, 2)
// const outputStr = JSON.stringify(scnJson, undefined, 2)
// fs.writeFileSync('../whole.json', outputStr)
// return // TODO
}
// TODO here start the test impls.
for (const shdScm of json.jsons) {
const isScm = isScmIdToScm[shdScm.id]
const isScmStr = stringify(isScm)
const shdScmStr = stringify(shdScm)
ist(isScmStr, shdScmStr)
}
}
function applyScenarioOld(name, inputStr, scnJson) {
const jsonStr = fs.readFileSync(fullFileName, 'utf8')
inputStr = resolveXplIncludes(inputStr)
const psr = ModelDeserializer()
const isScmJson = psr.syntaxJsonFromString(inputStr)
// console.log(isScmJson)
resolveScenarioJsonIncludes(scnJson)
// TODO handle scn last to first in list.
const outputStr = JSON.stringify(isScmJson, undefined, 2)
// const outputStr = JSON.stringify(scnJson, undefined, 2)
fs.writeFileSync('../whole.json', outputStr)
return // TODO
// console.log('raw', name, isScmJson)
const id2Ctt = {}
for (const elt of isScmJson.scts) {
id2Ctt[elt.id] = elt
}
for (const elt of isScmJson.consts) {
id2Ctt[elt.id.id] = elt // .id.id !
}
// TODO how to test validation errors
if (scnJson.constants) { // TODO remove as soon as all test data conforms
for (let shd of scnJson.constants) {
const has = !!id2Ctt[shd.id.id] // .id.id !
ist(has)
if (has) {
const is = id2Ctt[shd.id.id] // .id.id !
const isStr = stringify(is)
const shouldStr = stringify(shd)
ist(isStr, shouldStr)
id2Ctt[shd.id.id] = false // .id.id !
}
}
}
for (let shd of scnJson.types) {
const has = !!id2Ctt[shd.id]
ist(has)
if (has) {
const is = id2Ctt[shd.id]
const isStr = stringify(is)
const shouldStr = stringify(shd)
ist(isStr, shouldStr)
id2Ctt[shd.id] = false
}
}
for (let shd of scnJson.entities) {
const has = !!id2Ctt[shd.id]
ist(has)
if (has) {
const is = id2Ctt[shd.id]
const isStr = stringify(is)
const shouldStr = stringify(shd)
ist(isStr, shouldStr)
id2Ctt[shd.id] = false
}
}
for (let shd of scnJson.subtypeConstraints) {
const has = !!id2Ctt[shd.id]
ist(has)
if (has) {
const is = id2Ctt[shd.id]
const isStr = stringify(is)
const shouldStr = stringify(shd)
ist(isStr, shouldStr)
id2Ctt[shd.id] = false
}
}
for (let shd of scnJson.functions) {
const has = !!id2Ctt[shd.id]
ist(has)
if (has) {
const is = id2Ctt[shd.id]
const isStr = stringify(is)
const shouldStr = stringify(shd)
ist(isStr, shouldStr)
id2Ctt[shd.id] = false
}
}
// TODO procs
for (const is of Object.values(id2Ctt)) {
if (is) {
const id = (is.id.id?is.id.id:is.id)
ist('', `The ${is.t} ${id} is not present in the json.`)
}
}
}
function applyScenarioCase(ci) {
const json = loadScenario(ci)
it(`The ${ci.name} scenario is parsed correctly.`, () => {
applyScenario(ci, json)
})
}
function testScenarioCases() {
const cis = loadScenarioCases()
for (let i = 0; i<cis.length; i++) {
const ci = cis[i]
applyScenarioCase(ci)
}
}
function testScenario(dirName, caseName) {
const ci = genScenarioCase(dirName, caseName)
applyScenarioCase(ci)
}
describe("ModelDeserializer Szenarios", () => {
context("The items are parsed correctly. (Parsing info is ignored.)", () => {
// testScenario('scenarios', 'geometry')
// testScenario('scenarios', 'usersAndRelated')
// testScenario('scenarios', 'nameClash')
// testScenario('scenarios', 'coursesAsConstraint')
// testScenario('scenarios', 'coursesAsEntity')
// testScenario('scenarios', 'complexDependencies')
// testScenario('scenarios', 'binary')
})
context("The scenarios are tested correctly. (Parsing info is ignored.)", () => {
testScenarioCases()
})
// More future todos:
// TODO functions / procedure / rules - locals
// TODO negatively test that the remarks example does not contain the
// types or entities mentioned in the remark only.
// TODO do WHERE tests of TpIntegerGreaterThanZero and TpHhMmSsMx
// TODO Test precision_spec for REAL as soon as this is implemented. (Add to NttWithSimpleAttrs.)
})