Functional Weave
Code in Rust

retail.price-per-unit@1.0.1

vectors.json

4,450 bytes · view raw

[
  {"name": "500 g for 1.50 is 3.00 per kg", "args": [{"minor": 150, "currency": "GBP"}, "500", "g", "kg"], "expect": {"minor": 300, "currency": "GBP"}},
  {"name": "500 g for 1.50 is 30p per 100 g", "args": [{"minor": 150, "currency": "GBP"}, "500", "g", "100g"], "expect": {"minor": 30, "currency": "GBP"}},
  {"name": "1.5 L for 2.00 is 1.33 per litre", "args": [{"minor": 200, "currency": "GBP"}, "1.5", "L", "L"], "expect": {"minor": 133, "currency": "GBP"}},
  {"name": "1.5 L for 2.00 is 13p per 100 ml", "args": [{"minor": 200, "currency": "GBP"}, "1.5", "L", "100mL"], "expect": {"minor": 13, "currency": "GBP"}},
  {"name": "a 330 ml can for 85p is 2.58 per litre", "args": [{"minor": 85, "currency": "GBP"}, "330", "mL", "L"], "expect": {"minor": 258, "currency": "GBP"}},
  {"name": "454 g for 3.49 is 7.69 per kg", "args": [{"minor": 349, "currency": "GBP"}, "454", "g", "kg"], "expect": {"minor": 769, "currency": "GBP"}},
  {"name": "one pound for 4.00 is 8.82 per kg, exactly, where a float division can drift", "args": [{"minor": 400, "currency": "GBP"}, "1", "lb", "kg"], "expect": {"minor": 882, "currency": "GBP"}},
  {"name": "8 oz for 2.50 is 1.10 per 100 g (8 oz = 226.796185 g exactly)", "args": [{"minor": 250, "currency": "GBP"}, "8", "oz", "100g"], "expect": {"minor": 110, "currency": "GBP"}},
  {"name": "a 38 g jar of spice for 1.20 is 32p per 10 g", "args": [{"minor": 120, "currency": "GBP"}, "38", "g", "10g"], "expect": {"minor": 32, "currency": "GBP"}},
  {"name": "a 750 ml bottle of wine for 9.00 is 9.00 per 75 cl", "args": [{"minor": 900, "currency": "GBP"}, "750", "mL", "75cL"], "expect": {"minor": 900, "currency": "GBP"}},
  {"name": "a magnum for 6.00 is 3.00 per 75 cl", "args": [{"minor": 600, "currency": "GBP"}, "1.5", "L", "75cL"], "expect": {"minor": 300, "currency": "GBP"}},
  {"name": "a dozen eggs for 3.00 is 25p each", "args": [{"minor": 300, "currency": "GBP"}, "12", "item", "item"], "expect": {"minor": 25, "currency": "GBP"}},
  {"name": "6 rolls for 1.00 is 16.67p, shown as 17p", "args": [{"minor": 100, "currency": "GBP"}, "6", "item", "item"], "expect": {"minor": 17, "currency": "GBP"}},
  {"name": "an exact half penny rounds up, not to even", "args": [{"minor": 25, "currency": "GBP"}, "2", "item", "item"], "expect": {"minor": 13, "currency": "GBP"}},
  {"name": "10 m of cable for 7.99 is 80p per metre", "args": [{"minor": 799, "currency": "GBP"}, "10", "m", "m"], "expect": {"minor": 80, "currency": "GBP"}},
  {"name": "1.2 square metres of flooring for 30.00 is 25.00 per m2", "args": [{"minor": 3000, "currency": "GBP"}, "1.2", "m2", "m2"], "expect": {"minor": 2500, "currency": "GBP"}},
  {"name": "a quantity with a trailing zero", "args": [{"minor": 150, "currency": "GBP"}, "0.50", "kg", "kg"], "expect": {"minor": 300, "currency": "GBP"}},
  {"name": "a free item has a unit price of 0", "args": [{"minor": 0, "currency": "GBP"}, "400", "g", "kg"], "expect": {"minor": 0, "currency": "GBP"}},
  {"name": "euro cents work the same", "args": [{"minor": 199, "currency": "EUR"}, "250", "g", "kg"], "expect": {"minor": 796, "currency": "EUR"}},
  {"name": "a zero quantity is an error", "args": [{"minor": 150, "currency": "GBP"}, "0", "g", "kg"], "expectError": "quantity must be more than 0"},
  {"name": "a negative quantity is an error", "args": [{"minor": 150, "currency": "GBP"}, "-1", "kg", "kg"], "expectError": "quantity must be more than 0"},
  {"name": "mass cannot be priced per litre", "args": [{"minor": 150, "currency": "GBP"}, "500", "g", "L"], "expectError": "cannot convert g (mass) to L (volume)"},
  {"name": "items cannot be priced per kilogram", "args": [{"minor": 300, "currency": "GBP"}, "12", "item", "kg"], "expectError": "a quantity in items can only be priced per \"item\""},
  {"name": "grams cannot be priced per item", "args": [{"minor": 300, "currency": "GBP"}, "500", "g", "item"], "expectError": "per \"item\" needs the quantity in \"item\""},
  {"name": "a malformed quantity is an error", "args": [{"minor": 150, "currency": "GBP"}, "1,5", "kg", "kg"], "expectError": "value must be a plain decimal"},
  {"name": "a negative price is an error", "args": [{"minor": -150, "currency": "GBP"}, "500", "g", "kg"], "expectError": "price must not be negative"},
  {"name": "a trailing newline is not part of an item quantity", "args": [{"minor": 300, "currency": "GBP"}, "12\n", "item", "item"], "expectError": "quantity must be more than 0"}
]