Fix calculate max affordable edge case

This commit is contained in:
thepaperpilot 2023-04-21 23:47:33 -05:00
parent 4160986a4d
commit b6317a47e8
2 changed files with 20 additions and 2 deletions

View file

@ -1426,14 +1426,14 @@ export function calculateMaxAffordable(
summedPurchases = 0; summedPurchases = 0;
} }
} }
if (summedPurchases > 0) { if (summedPurchases > 0 && Decimal.lt(calculateCost(formula, affordable, true, 0), 1e308)) {
affordable = affordable.sub(summedPurchases).clampMin(0); affordable = affordable.sub(summedPurchases).clampMin(0);
let summedCost = calculateCost(formula, affordable, true, 0); let summedCost = calculateCost(formula, affordable, true, 0);
while (true) { while (true) {
const nextCost = formula.evaluate( const nextCost = formula.evaluate(
affordable.add(unref(formula.innermostVariable) ?? 0) affordable.add(unref(formula.innermostVariable) ?? 0)
); );
if (Decimal.add(summedCost, nextCost).lt(resource.value)) { if (Decimal.add(summedCost, nextCost).lte(resource.value)) {
affordable = affordable.add(1); affordable = affordable.add(1);
summedCost = Decimal.add(summedCost, nextCost); summedCost = Decimal.add(summedCost, nextCost);
} else { } else {

View file

@ -1174,6 +1174,24 @@ describe("Buy Max", () => {
// Since we're summing all the purchases this should be equivalent // Since we're summing all the purchases this should be equivalent
expect(calculatedCost).compare_tolerance(actualCost); expect(calculatedCost).compare_tolerance(actualCost);
}); });
test("Handles summing purchases when making very few purchases", () => {
const purchases = ref(0);
const variable = Formula.variable(purchases);
const formula = variable.add(1);
const resource = createResource(ref(3));
const maxAffordable = calculateMaxAffordable(formula, resource, true);
expect(maxAffordable.value).compare_tolerance(2);
const actualCost = new Array(2)
.fill(null)
.reduce(
(acc, _, i) => acc.add(formula.evaluate(i + purchases.value)),
new Decimal(0)
);
const calculatedCost = calculateCost(formula, maxAffordable.value, true);
// Since we're summing all the purchases this should be equivalent
expect(calculatedCost).compare_tolerance(actualCost);
});
test("Handles summing purchases when over e308 purchases", () => { test("Handles summing purchases when over e308 purchases", () => {
resource.value = "1ee308"; resource.value = "1ee308";
const purchases = ref(0); const purchases = ref(0);