mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-02-24 19:07:24 -08:00
* 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>
112 lines
4.4 KiB
TypeScript
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");
|
|
})
|
|
});
|