mealie/frontend/composables/recipe-page/use-extract-recipe-yield.test.ts
Michael Genson e24e28ae03
feat: Improved recipeYield Parsing For Fractions and Decimals (#2507)
* improved recipeYield parsing for fracs/decimals

* added fix for edgecase with weird fractions

* made typescript happy

* lint

* extracted yield calculation into composable

* fixed some gross edgecases

* added tests

* made bare return clearer

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2023-08-21 06:54:02 -08:00

112 lines
4.4 KiB
TypeScript

import { describe, expect, test } from "vitest";
import { useExtractRecipeYield } from "./use-extract-recipe-yield";
describe("test use extract recipe yield", () => {
test("when text empty return empty", () => {
const result = useExtractRecipeYield(null, 1);
expect(result).toStrictEqual("");
});
test("when text matches nothing return text", () => {
const val = "this won't match anything";
const result = useExtractRecipeYield(val, 1);
expect(result).toStrictEqual(val);
const resultScaled = useExtractRecipeYield(val, 5);
expect(resultScaled).toStrictEqual(val);
});
test("when text matches a mixed fraction, return a scaled fraction", () => {
const val = "10 1/2 units";
const result = useExtractRecipeYield(val, 1);
expect(result).toStrictEqual(val);
const resultScaled = useExtractRecipeYield(val, 3);
expect(resultScaled).toStrictEqual("31 1/2 units");
const resultScaledPartial = useExtractRecipeYield(val, 2.5);
expect(resultScaledPartial).toStrictEqual("26 1/4 units");
const resultScaledInt = useExtractRecipeYield(val, 4);
expect(resultScaledInt).toStrictEqual("42 units");
});
test("when text matches a fraction, return a scaled fraction", () => {
const val = "1/3 plates";
const result = useExtractRecipeYield(val, 1);
expect(result).toStrictEqual(val);
const resultScaled = useExtractRecipeYield(val, 2);
expect(resultScaled).toStrictEqual("2/3 plates");
const resultScaledInt = useExtractRecipeYield(val, 3);
expect(resultScaledInt).toStrictEqual("1 plates");
const resultScaledPartial = useExtractRecipeYield(val, 2.5);
expect(resultScaledPartial).toStrictEqual("5/6 plates");
const resultScaledMixed = useExtractRecipeYield(val, 4);
expect(resultScaledMixed).toStrictEqual("1 1/3 plates");
});
test("when text matches a decimal, return a scaled, rounded decimal", () => {
const val = "1.25 parts";
const result = useExtractRecipeYield(val, 1);
expect(result).toStrictEqual(val);
const resultScaled = useExtractRecipeYield(val, 2);
expect(resultScaled).toStrictEqual("2.5 parts");
const resultScaledInt = useExtractRecipeYield(val, 4);
expect(resultScaledInt).toStrictEqual("5 parts");
const resultScaledPartial = useExtractRecipeYield(val, 2.5);
expect(resultScaledPartial).toStrictEqual("3.125 parts");
const roundedVal = "1.33333333333333333333 parts";
const resultScaledRounded = useExtractRecipeYield(roundedVal, 2);
expect(resultScaledRounded).toStrictEqual("2.667 parts");
});
test("when text matches an int, return a scaled int", () => {
const val = "5 bowls";
const result = useExtractRecipeYield(val, 1);
expect(result).toStrictEqual(val);
const resultScaled = useExtractRecipeYield(val, 2);
expect(resultScaled).toStrictEqual("10 bowls");
const resultScaledPartial = useExtractRecipeYield(val, 2.5);
expect(resultScaledPartial).toStrictEqual("12.5 bowls");
const resultScaledLarge = useExtractRecipeYield(val, 10);
expect(resultScaledLarge).toStrictEqual("50 bowls");
});
test("when text contains an invalid fraction, return the original string", () => {
const valDivZero = "3/0 servings";
const resultDivZero = useExtractRecipeYield(valDivZero, 3);
expect(resultDivZero).toStrictEqual(valDivZero);
const valDivZeroMixed = "2 4/0 servings";
const resultDivZeroMixed = useExtractRecipeYield(valDivZeroMixed, 6);
expect(resultDivZeroMixed).toStrictEqual(valDivZeroMixed);
});
test("when text contains a weird or small fraction, return the original string", () => {
const valWeird = "2323231239087/134527431962272135 servings";
const resultWeird = useExtractRecipeYield(valWeird, 5);
expect(resultWeird).toStrictEqual(valWeird);
const valSmall = "1/20230225 lovable servings";
const resultSmall = useExtractRecipeYield(valSmall, 12);
expect(resultSmall).toStrictEqual(valSmall);
});
test("when text contains multiple numbers, the first is parsed as the servings amount", () => {
const val = "100 sets of 55 bowls";
const result = useExtractRecipeYield(val, 3);
expect(result).toStrictEqual("300 sets of 55 bowls");
})
});