Files
puter/tools/api-tester/lib/CoverageModel.js
2025-01-09 15:51:50 -05:00

71 lines
1.7 KiB
JavaScript

const cartesianProduct = (obj) => {
// Get array of keys
let keys = Object.keys(obj);
// Generate the Cartesian Product
return keys.reduce((acc, key) => {
let appendArrays = Array.isArray(obj[key]) ? obj[key] : [obj[key]];
let newAcc = [];
acc.forEach(arr => {
appendArrays.forEach(item => {
newAcc.push([...arr, item]);
});
});
return newAcc;
}, [[]]); // start with the "empty product"
}
let obj = {
a: [1, 2],
b: ["a", "b"]
};
console.log(cartesianProduct(obj));
module.exports = class CoverageModel {
constructor (spec) {
const flat = {};
const flatten = (object, prefix) => {
for ( const k in object ) {
let targetKey = k;
if ( prefix ) {
targetKey = prefix + '.' + k;
}
let type = typeof object[k];
if ( Array.isArray(object[k]) ) type = 'array';
if ( type === 'object' ) {
flatten(object[k], targetKey);
continue;
}
if ( object[k].length == 0 ) {
object[k] = [false, true];
}
flat[targetKey] = object[k];
}
};
flatten(spec);
this.flat = flat;
const states = cartesianProduct(flat).map(
values => {
const o = {};
const keys = Object.keys(flat);
for ( let i=0 ; i < keys.length ; i++ ) {
o[keys[i]] = values[i];
}
return o;
}
);
this.states = states;
this.covered = Array(this.states.length).fill(false);
}
}