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;
}
}
if (summedPurchases > 0) {
if (summedPurchases > 0 && Decimal.lt(calculateCost(formula, affordable, true, 0), 1e308)) {
affordable = affordable.sub(summedPurchases).clampMin(0);
let summedCost = calculateCost(formula, affordable, true, 0);
while (true) {
const nextCost = formula.evaluate(
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);
summedCost = Decimal.add(summedCost, nextCost);
} else {

View file

@ -1174,6 +1174,24 @@ describe("Buy Max", () => {
// Since we're summing all the purchases this should be equivalent
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", () => {
resource.value = "1ee308";
const purchases = ref(0);