expexp
Version:
The express model io and express model and data representation.
155 lines (139 loc) • 4 kB
JavaScript
import fs from 'fs'
import jssStringify from 'json-stable-stringify'
import {HUMAN_READ_ORDER_FCT} from '../src/tree.js'
const TEST_BASE_PATH = './test/'
function jssSort(aObj, bObj) {
return HUMAN_READ_ORDER_FCT(aObj.key, bObj.key)
}
export function stringify(json) {
return jssStringify(json, jssSort)
}
export function genScenarioCase(dirName, name) {
return {
name: name,
dirName: dirName,
fileName: name + '.json',
fullName: TEST_BASE_PATH + dirName + '/' + name + '.json'
}
}
export function loadScenarioCases(dirName = 'scenarios') {
const fullPath = TEST_BASE_PATH+dirName
const files = fs.readdirSync(fullPath)
return files.filter(f => f.endsWith('.json'))
.map(f => ({
name: f.substring(0, f.length-5),
dirName: dirName,
fileName: f,
fullName: fullPath + '/' + f
}))
}
export function loadScenario(caseInfo,
doNotResolveJsons = false, doNotResolveSchemaElements = false
) {
const jsonStr = fs.readFileSync(caseInfo.fullName, 'utf8')
const scenario = JSON.parse(jsonStr)
// Set the scnenarios name to the file name.
scenario.name = caseInfo.name
if (doNotResolveJsons == false) {
scenario.jsons = resolveArrayJsonIncludes(scenario.jsons)
}
if (doNotResolveSchemaElements == false) {
for (const scm of scenario.jsons) {
if (typeof scm == 'string') continue // Was not resolved.
// No including for constants or interfaces.
if (scm.scts) {
scm.scts.s = resolveArrayJsonIncludes(scm.scts.s)
}
}
}
return scenario
}
export function loadCases(dirName, requireTlog=false) {
const fullPath = TEST_BASE_PATH+dirName
const files = fs.readdirSync(fullPath)
let resHash = {}
files.forEach(fileName => {
const dotIdx = fileName.lastIndexOf('.')
const prefix = fileName.substr(0, dotIdx)
const ext = fileName.substr(dotIdx+1)
if (!(prefix in resHash)) {
resHash[prefix] = {'name': prefix}
}
resHash[prefix][ext] = fullPath + '/' + fileName
})
const res = []
for (let prefix in resHash) {
const fi = resHash[prefix]
if (
'xpl' in fi && 'json' in fi &&
(requireTlog == false || 'tlog' in fi)
) {
res.push(fi)
}
}
return res
}
export function genCaseInfo(dirName, caseName) {
const fullPath = TEST_BASE_PATH+dirName+'/'
const ci = {
name: caseName,
xpl: fullPath+caseName+'.xpl',
json: fullPath+caseName+'.json',
tlog: fullPath+caseName+'.tlog'
}
return ci
}
function resolveXplIncludes(str) {
const lines = str.split('\n')
const res = []
for (const l of lines) {
if (l.startsWith('%% ') == false) {
res.push(l)
} else { // Its an include.
const dcArr = l.substr(3).split('/')
const dirName = dcArr[0]
const caseName = dcArr[1]
const fullPath = TEST_BASE_PATH+dirName+'/'
const xplFilePath = fullPath+caseName+'.xpl'
const caseXplStr = fs.readFileSync(xplFilePath, 'utf8')
res.push(caseXplStr) // may be multi line
}
}
return res.join('\n')
}
export function loadXpl(dirNameOrDirSlashName, name) {
if (!name) {
const prts = dirNameOrDirSlashName.split('/')
dirNameOrDirSlashName = prts[0]
name = prts[1]
}
const dirName = dirNameOrDirSlashName
const fullPath = TEST_BASE_PATH + dirName + '/' + name + '.xpl'
let inputStr = fs.readFileSync(fullPath, 'utf8')
inputStr = resolveXplIncludes(inputStr)
return inputStr
}
export function resolveArrayJsonIncludes(arr) {
if (Array.isArray(arr) == false) return arr // null or undefined mainly
const res = []
for (let tp of arr) {
if (typeof tp == 'string') {
// The tp is 'dirName/caseName' string.
const dcArr = tp.split('/')
const dirName = dcArr[0]
const caseName = dcArr[1]
const fullPath = TEST_BASE_PATH+dirName+'/'
const jsonFilePath = fullPath+caseName+'.json'
const caseJsonStr = fs.readFileSync(jsonFilePath, 'utf8')
const caseJson = JSON.parse(caseJsonStr)
if (Array.isArray(caseJson) == false) {
res.push(caseJson)
} else {
res.push.apply(res, caseJson)
}
} else { // consider it to be json
res.push(tp)
}
}
return res
}