[ {"name": "4 to 6 portions: grams, millilitres, eggs, a pinch-sized amount and spoons", "args": [[{"name": "flour", "quantity": "500", "unit": "g"}, {"name": "milk", "quantity": "300", "unit": "mL"}, {"name": "eggs", "quantity": "3", "unit": "each"}, {"name": "salt", "quantity": "5", "unit": "g"}, {"name": "oil", "quantity": "2", "unit": "tbsp"}], 4, 6], "expect": [{"name": "flour", "quantity": "750", "unit": "g"}, {"name": "milk", "quantity": "450", "unit": "mL"}, {"name": "eggs", "quantity": "5", "unit": "each"}, {"name": "salt", "quantity": "7.5", "unit": "g"}, {"name": "oil", "quantity": "3", "unit": "tbsp"}]}, {"name": "4 to 10: grams over 1000 become kilograms, millilitres become litres", "args": [[{"name": "flour", "quantity": "500", "unit": "g"}, {"name": "butter", "quantity": "250", "unit": "g"}, {"name": "stock", "quantity": "750", "unit": "mL"}], 4, 10], "expect": [{"name": "flour", "quantity": "1.25", "unit": "kg"}, {"name": "butter", "quantity": "625", "unit": "g"}, {"name": "stock", "quantity": "1.875", "unit": "L"}]}, {"name": "4 to 2: kilograms under 1 become grams, litres become millilitres", "args": [[{"name": "potatoes", "quantity": "1.2", "unit": "kg"}, {"name": "cream", "quantity": "1.5", "unit": "L"}], 4, 2], "expect": [{"name": "potatoes", "quantity": "600", "unit": "g"}, {"name": "cream", "quantity": "750", "unit": "mL"}]}, {"name": "999.6 g rounds to a whole 1000 g and is written as 1 kg", "args": [[{"name": "rice", "quantity": "666.4", "unit": "g"}], 2, 3], "expect": [{"name": "rice", "quantity": "1", "unit": "kg"}]}, {"name": "under a gram keeps two decimal places", "args": [[{"name": "saffron", "quantity": "0.1", "unit": "g"}], 4, 6], "expect": [{"name": "saffron", "quantity": "0.15", "unit": "g"}]}, {"name": "a third: whole grams from 10, one place from 1 to 10, two places for other units", "args": [[{"name": "sugar", "quantity": "100", "unit": "g"}, {"name": "yeast", "quantity": "10", "unit": "g"}, {"name": "water", "quantity": "1", "unit": "cup_us"}], 3, 1], "expect": [{"name": "sugar", "quantity": "33", "unit": "g"}, {"name": "yeast", "quantity": "3.3", "unit": "g"}, {"name": "water", "quantity": "0.33", "unit": "cup_us"}]}, {"name": "a half rounds up, not to even: 2.25 g is 2.3 g", "args": [[{"name": "baking powder", "quantity": "1", "unit": "g"}], 4, 9], "expect": [{"name": "baking powder", "quantity": "2.3", "unit": "g"}]}, {"name": "milligrams are tidied into grams", "args": [[{"name": "vitamin c", "quantity": "500", "unit": "mg"}], 1, 4], "expect": [{"name": "vitamin c", "quantity": "2", "unit": "g"}]}, {"name": "a small kilogram amount is written in grams", "args": [[{"name": "pepper", "quantity": "0.005", "unit": "kg"}], 1, 1], "expect": [{"name": "pepper", "quantity": "5", "unit": "g"}]}, {"name": "eggs that divide exactly stay exact", "args": [[{"name": "eggs", "quantity": "2", "unit": "each"}], 4, 6], "expect": [{"name": "eggs", "quantity": "3", "unit": "each"}]}, {"name": "eggs always round up: 3 for 4 is 3.75 for 5, so 4", "args": [[{"name": "eggs", "quantity": "3", "unit": "each"}], 4, 5], "expect": [{"name": "eggs", "quantity": "4", "unit": "each"}]}, {"name": "nothing scales to nothing", "args": [[{"name": "garnish", "quantity": "0", "unit": "g"}], 4, 6], "expect": [{"name": "garnish", "quantity": "0", "unit": "g"}]}, {"name": "imperial units keep their unit, to two places", "args": [[{"name": "butter", "quantity": "8", "unit": "oz"}, {"name": "sugar", "quantity": "0.5", "unit": "lb"}], 3, 4], "expect": [{"name": "butter", "quantity": "10.67", "unit": "oz"}, {"name": "sugar", "quantity": "0.67", "unit": "lb"}]}, {"name": "an unrecognised unit is scaled as written", "args": [[{"name": "thyme", "quantity": "1", "unit": "sprig"}], 4, 6], "expect": [{"name": "thyme", "quantity": "1.5", "unit": "sprig"}]}, {"name": "the same portions still tidies the unit", "args": [[{"name": "potatoes", "quantity": "1200", "unit": "g"}], 4, 4], "expect": [{"name": "potatoes", "quantity": "1.2", "unit": "kg"}]}, {"name": "a banquet: 5 kg for one hundred times the portions", "args": [[{"name": "flour", "quantity": "5", "unit": "kg"}], 1, 100], "expect": [{"name": "flour", "quantity": "500", "unit": "kg"}]}, {"name": "a few millilitres keep one place", "args": [[{"name": "vanilla", "quantity": "2.5", "unit": "mL"}], 2, 3], "expect": [{"name": "vanilla", "quantity": "3.8", "unit": "mL"}]}, {"name": "trailing zeros are fine", "args": [[{"name": "honey", "quantity": "1.500000000000000000", "unit": "tbsp"}], 1, 2], "expect": [{"name": "honey", "quantity": "3", "unit": "tbsp"}]}, {"name": "an empty recipe scales to an empty recipe", "args": [[], 2, 4], "expect": []}, {"name": "zero portions is an error", "args": [[{"name": "flour", "quantity": "500", "unit": "g"}], 0, 4], "expectError": "fromPortions must be a whole number from 1 to 10000"}, {"name": "too many portions is an error", "args": [[{"name": "flour", "quantity": "500", "unit": "g"}], 4, 10001], "expectError": "toPortions must be a whole number from 1 to 10000"}, {"name": "a fraction as text is an error", "args": [[{"name": "flour", "quantity": "1/2", "unit": "cup_us"}], 4, 6], "expectError": "quantity must be a non-negative decimal"}, {"name": "a negative quantity is an error", "args": [[{"name": "flour", "quantity": "-1", "unit": "g"}], 4, 6], "expectError": "quantity must be a non-negative decimal"}, {"name": "an empty unit is an error", "args": [[{"name": "flour", "quantity": "1", "unit": ""}], 4, 6], "expectError": "unit must not be empty for \"flour\""}, {"name": "sixteen significant digits is an error", "args": [[{"name": "flour", "quantity": "1234567890123456", "unit": "g"}], 4, 6], "expectError": "has too many digits"} ]