Add regression test for modifier.getFormula respecting enabled #58

Merged
thepaperpilot merged 5 commits from thepaperpilot/Profectus:feat/getformula-regression-test into main 2024-02-21 01:25:53 +00:00
2 changed files with 27 additions and 5 deletions
Showing only changes of commit 1b30560c40 - Show all commits

View file

@ -276,8 +276,12 @@ export function createExponentialModifier<T extends ExponentialModifierOptions>(
export function createSequentialModifier<
T extends Modifier[],
S = T extends WithRequired<Modifier, "invert">[]
? WithRequired<Modifier, "description" | "invert">
: Omit<WithRequired<Modifier, "description">, "invert">
? T extends WithRequired<Modifier, "getFormula">[]
? WithRequired<Modifier, "description" | "invert" | "getFormula">
: Omit<WithRequired<Modifier, "description" | "getFormula">, "invert">
: T extends WithRequired<Modifier, "invert">[]
? WithRequired<Modifier, "getFormula" | "invert">
: Omit<WithRequired<Modifier, "getFormula">, "invert">
>(modifiersFunc: () => T): S {
return createLazyProxy(() => {
const modifiers = modifiersFunc();
@ -296,10 +300,14 @@ export function createSequentialModifier<
: undefined,
getFormula: modifiers.every(m => m.getFormula != null)
? (gain: FormulaSource) =>
modifiers
modifiers.reduce((acc, curr) => {
if (curr.enabled == null || curr.enabled === true) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return curr.getFormula!(acc);
}
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
.reduce((acc, curr) => Formula.if(acc, curr.enabled ?? true,
acc => curr.getFormula!(acc), acc => acc), gain)
return Formula.if(acc, curr.enabled, acc => curr.getFormula!(acc));
}, gain)
: undefined,
enabled: modifiers.some(m => m.enabled != null)
? computed(() => modifiers.filter(m => unref(m.enabled) !== false).length > 0)

View file

@ -199,6 +199,20 @@ describe("Sequential Modifiers", () => {
// So long as one is true or undefined, enable should be true
expect(unref(modifier.enabled)).toBe(true);
});
test("respects enabled", () => {
const value = ref(10);
const enabled = ref(false);
const modifier = createSequentialModifier(() => [
createMultiplicativeModifier(() => ({ multiplier: 5, enabled }))
]);
expect(modifier.getFormula(Formula.variable(value)).evaluate()).compare_tolerance(
value.value
);
enabled.value = true;
expect(modifier.getFormula(Formula.variable(value)).evaluate()).not.compare_tolerance(
thepaperpilot marked this conversation as resolved
Review

For this test, we should be making the formula once, then re-using it when the conditions change.
Should be more like

const formula = modifier.getFormula()
expect formula.evaluate() == value
enabled = true
expect formula.evaluate() != value
For this test, we should be making the formula once, then re-using it when the conditions change. Should be more like ``` const formula = modifier.getFormula() expect formula.evaluate() == value enabled = true expect formula.evaluate() != value ```
value.value
);
});
});
describe("applies smallerIsBetter correctly", () => {