UNPKG

expexp

Version:

The express model io and express model and data representation.

155 lines (139 loc) 4 kB
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 }