CoverageModel.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. const cartesianProduct = (obj) => {
  2. // Get array of keys
  3. let keys = Object.keys(obj);
  4. // Generate the Cartesian Product
  5. return keys.reduce((acc, key) => {
  6. let appendArrays = Array.isArray(obj[key]) ? obj[key] : [obj[key]];
  7. let newAcc = [];
  8. acc.forEach(arr => {
  9. appendArrays.forEach(item => {
  10. newAcc.push([...arr, item]);
  11. });
  12. });
  13. return newAcc;
  14. }, [[]]); // start with the "empty product"
  15. }
  16. let obj = {
  17. a: [1, 2],
  18. b: ["a", "b"]
  19. };
  20. console.log(cartesianProduct(obj));
  21. module.exports = class CoverageModel {
  22. constructor (spec) {
  23. const flat = {};
  24. const flatten = (object, prefix) => {
  25. for ( const k in object ) {
  26. let targetKey = k;
  27. if ( prefix ) {
  28. targetKey = prefix + '.' + k;
  29. }
  30. let type = typeof object[k];
  31. if ( Array.isArray(object[k]) ) type = 'array';
  32. if ( type === 'object' ) {
  33. flatten(object[k], targetKey);
  34. continue;
  35. }
  36. if ( object[k].length == 0 ) {
  37. object[k] = [false, true];
  38. }
  39. flat[targetKey] = object[k];
  40. }
  41. };
  42. flatten(spec);
  43. this.flat = flat;
  44. const states = cartesianProduct(flat).map(
  45. values => {
  46. const o = {};
  47. const keys = Object.keys(flat);
  48. for ( let i=0 ; i < keys.length ; i++ ) {
  49. o[keys[i]] = values[i];
  50. }
  51. return o;
  52. }
  53. );
  54. this.states = states;
  55. this.covered = Array(this.states.length).fill(false);
  56. }
  57. }