mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-11-03 18:53:17 -05:00 
			
		
		
		
	
		
			
	
	
		
			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");
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								});
							 |