| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- /** global Scenario */
- /**
- * @param {Array<string>} flags
- * @param {Function} scenarios
- **/
- module.exports.FFlagMatrix = function (flags, scenarios) {
- // create a matrix of all possible flag combinations
- let length = flags.length ** 2;
- if (length === 1) length = 2;
- const flagMatrix = [];
- for (let i = 0; i < length; i++) {
- flagMatrix.push({
- ...flags.reduce((acc, flag) => ({ ...acc, [flag]: false }), {}),
- });
- }
- // update each flag combination with all possible states
- // e.g. [ { flag1: false, flag2: false }, { flag1: true, flag2: false }, ... ]
- flags.forEach((flag, index) => {
- flagMatrix.forEach((currentFlags, flagIndex) => {
- const state = Boolean((flagIndex >> index) & 1);
- flagMatrix[flagIndex][flag] = state;
- });
- });
- flagMatrix.forEach((currentFlags) => {
- this.flags = currentFlags;
- scenarios.bind(this)(currentFlags);
- });
- };
- /**
- * @param {string} scenarioName
- * @param {Function} scenario
- **/
- module.exports.FFlagScenario = function (scenarioName, scenario) {
- if (!this.flags) throw new Error("FFlagMatrix must wrap calls to FFlagScenario");
- const variant = ` :: ${Object.entries(this.flags)
- .map(([flag, state]) => `${flag}=${state}`)
- .join(",")}`;
- return Scenario(scenarioName + variant, scenario);
- };
|