Functional Weave
Code in Python

hospitality.bill-split@1.0.0

vectors.json

12,670 bytes · view raw

[
  {"name": "even three ways with 12.5% service", "args": [[{"description": "fish", "amount": {"minor": 2000, "currency": "GBP"}, "diners": []}, {"description": "pasta", "amount": {"minor": 1500, "currency": "GBP"}, "diners": []}, {"description": "steak", "amount": {"minor": 2500, "currency": "GBP"}, "diners": []}], {"minor": 750, "currency": "GBP"}, 3, "even", []], "expect": [{"diner": 0, "items": {"minor": 2000, "currency": "GBP"}, "serviceCharge": {"minor": 250, "currency": "GBP"}, "total": {"minor": 2250, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 2000, "currency": "GBP"}, "serviceCharge": {"minor": 250, "currency": "GBP"}, "total": {"minor": 2250, "currency": "GBP"}}, {"diner": 2, "items": {"minor": 2000, "currency": "GBP"}, "serviceCharge": {"minor": 250, "currency": "GBP"}, "total": {"minor": 2250, "currency": "GBP"}}]},
  {"name": "even: 100.00 three ways, the odd penny to the first diner", "args": [[{"description": "set menu", "amount": {"minor": 10000, "currency": "GBP"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 3, "even", []], "expect": [{"diner": 0, "items": {"minor": 3334, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 3334, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 3333, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 3333, "currency": "GBP"}}, {"diner": 2, "items": {"minor": 3333, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 3333, "currency": "GBP"}}]},
  {"name": "even: totals differ by a penny at most, service shared by what each pays", "args": [[{"description": "mains", "amount": {"minor": 5000, "currency": "GBP"}, "diners": []}], {"minor": 625, "currency": "GBP"}, 2, "even", []], "expect": [{"diner": 0, "items": {"minor": 2500, "currency": "GBP"}, "serviceCharge": {"minor": 313, "currency": "GBP"}, "total": {"minor": 2813, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 2500, "currency": "GBP"}, "serviceCharge": {"minor": 312, "currency": "GBP"}, "total": {"minor": 2812, "currency": "GBP"}}]},
  {"name": "even: splitting items and service separately would make totals 2p apart", "args": [[{"description": "a", "amount": {"minor": 1001, "currency": "GBP"}, "diners": []}], {"minor": 11, "currency": "GBP"}, 2, "even", []], "expect": [{"diner": 0, "items": {"minor": 500, "currency": "GBP"}, "serviceCharge": {"minor": 6, "currency": "GBP"}, "total": {"minor": 506, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 501, "currency": "GBP"}, "serviceCharge": {"minor": 5, "currency": "GBP"}, "total": {"minor": 506, "currency": "GBP"}}]},
  {"name": "by item: each pays for what they had, shared items split, service in proportion", "args": [[{"description": "steak", "amount": {"minor": 2400, "currency": "GBP"}, "diners": [0]}, {"description": "pasta", "amount": {"minor": 1600, "currency": "GBP"}, "diners": [1]}, {"description": "salad", "amount": {"minor": 900, "currency": "GBP"}, "diners": [2]}, {"description": "wine", "amount": {"minor": 3000, "currency": "GBP"}, "diners": []}, {"description": "dessert", "amount": {"minor": 1000, "currency": "GBP"}, "diners": [0, 1]}], {"minor": 1113, "currency": "GBP"}, 3, "by-item", []], "expect": [{"diner": 0, "items": {"minor": 3900, "currency": "GBP"}, "serviceCharge": {"minor": 488, "currency": "GBP"}, "total": {"minor": 4388, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 3100, "currency": "GBP"}, "serviceCharge": {"minor": 388, "currency": "GBP"}, "total": {"minor": 3488, "currency": "GBP"}}, {"diner": 2, "items": {"minor": 1900, "currency": "GBP"}, "serviceCharge": {"minor": 237, "currency": "GBP"}, "total": {"minor": 2137, "currency": "GBP"}}]},
  {"name": "by item: a shared item's odd penny goes to the first diner listed on it, not diner 0", "args": [[{"description": "sharing platter", "amount": {"minor": 1001, "currency": "GBP"}, "diners": [2, 0, 1]}], {"minor": 0, "currency": "GBP"}, 3, "by-item", []], "expect": [{"diner": 0, "items": {"minor": 334, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 334, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 333, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 333, "currency": "GBP"}}, {"diner": 2, "items": {"minor": 334, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 334, "currency": "GBP"}}]},
  {"name": "by item: a diner who ordered nothing pays nothing", "args": [[{"description": "coffee", "amount": {"minor": 300, "currency": "GBP"}, "diners": [0]}], {"minor": 38, "currency": "GBP"}, 2, "by-item", []], "expect": [{"diner": 0, "items": {"minor": 300, "currency": "GBP"}, "serviceCharge": {"minor": 38, "currency": "GBP"}, "total": {"minor": 338, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 0, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 0, "currency": "GBP"}}]},
  {"name": "by share: one pays for two", "args": [[{"description": "dinner", "amount": {"minor": 8000, "currency": "GBP"}, "diners": []}], {"minor": 1000, "currency": "GBP"}, 3, "by-share", [2, 1, 1]], "expect": [{"diner": 0, "items": {"minor": 4000, "currency": "GBP"}, "serviceCharge": {"minor": 500, "currency": "GBP"}, "total": {"minor": 4500, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 2000, "currency": "GBP"}, "serviceCharge": {"minor": 250, "currency": "GBP"}, "total": {"minor": 2250, "currency": "GBP"}}, {"diner": 2, "items": {"minor": 2000, "currency": "GBP"}, "serviceCharge": {"minor": 250, "currency": "GBP"}, "total": {"minor": 2250, "currency": "GBP"}}]},
  {"name": "by share: a guest with share 0 pays nothing", "args": [[{"description": "dinner", "amount": {"minor": 1001, "currency": "GBP"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 3, "by-share", [1, 0, 1]], "expect": [{"diner": 0, "items": {"minor": 501, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 501, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 0, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 0, "currency": "GBP"}}, {"diner": 2, "items": {"minor": 500, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 500, "currency": "GBP"}}]},
  {"name": "one diner pays everything", "args": [[{"description": "fish", "amount": {"minor": 2000, "currency": "GBP"}, "diners": []}, {"description": "pasta", "amount": {"minor": 1500, "currency": "GBP"}, "diners": []}, {"description": "steak", "amount": {"minor": 2500, "currency": "GBP"}, "diners": []}], {"minor": 750, "currency": "GBP"}, 1, "even", []], "expect": [{"diner": 0, "items": {"minor": 6000, "currency": "GBP"}, "serviceCharge": {"minor": 750, "currency": "GBP"}, "total": {"minor": 6750, "currency": "GBP"}}]},
  {"name": "an empty bill splits to nothing", "args": [[], {"minor": 0, "currency": "GBP"}, 2, "even", []], "expect": [{"diner": 0, "items": {"minor": 0, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 0, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 0, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 0, "currency": "GBP"}}]},
  {"name": "an empty bill by item splits to nothing", "args": [[], {"minor": 0, "currency": "GBP"}, 2, "by-item", []], "expect": [{"diner": 0, "items": {"minor": 0, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 0, "currency": "GBP"}}, {"diner": 1, "items": {"minor": 0, "currency": "GBP"}, "serviceCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 0, "currency": "GBP"}}]},
  {"name": "euros", "args": [[{"description": "menu", "amount": {"minor": 9000, "currency": "EUR"}, "diners": []}], {"minor": 900, "currency": "EUR"}, 4, "even", []], "expect": [{"diner": 0, "items": {"minor": 2250, "currency": "EUR"}, "serviceCharge": {"minor": 225, "currency": "EUR"}, "total": {"minor": 2475, "currency": "EUR"}}, {"diner": 1, "items": {"minor": 2250, "currency": "EUR"}, "serviceCharge": {"minor": 225, "currency": "EUR"}, "total": {"minor": 2475, "currency": "EUR"}}, {"diner": 2, "items": {"minor": 2250, "currency": "EUR"}, "serviceCharge": {"minor": 225, "currency": "EUR"}, "total": {"minor": 2475, "currency": "EUR"}}, {"diner": 3, "items": {"minor": 2250, "currency": "EUR"}, "serviceCharge": {"minor": 225, "currency": "EUR"}, "total": {"minor": 2475, "currency": "EUR"}}]},
  {"name": "no diners is an error", "args": [[{"description": "fish", "amount": {"minor": 2000, "currency": "GBP"}, "diners": []}, {"description": "pasta", "amount": {"minor": 1500, "currency": "GBP"}, "diners": []}, {"description": "steak", "amount": {"minor": 2500, "currency": "GBP"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 0, "even", []], "expectError": "diners must be at least 1"},
  {"name": "an unknown method is an error", "args": [[{"description": "fish", "amount": {"minor": 2000, "currency": "GBP"}, "diners": []}, {"description": "pasta", "amount": {"minor": 1500, "currency": "GBP"}, "diners": []}, {"description": "steak", "amount": {"minor": 2500, "currency": "GBP"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 2, "by-weight", []], "expectError": "unknown split method \"by-weight\""},
  {"name": "a diner who is not at the table is an error", "args": [[{"description": "wine", "amount": {"minor": 3000, "currency": "GBP"}, "diners": [0, 3]}], {"minor": 0, "currency": "GBP"}, 3, "by-item", []], "expectError": "diner 3 is not at the table"},
  {"name": "a diner listed twice on an item is an error", "args": [[{"description": "wine", "amount": {"minor": 3000, "currency": "GBP"}, "diners": [1, 1]}], {"minor": 0, "currency": "GBP"}, 3, "by-item", []], "expectError": "item \"wine\" lists diner 1 twice"},
  {"name": "shares with the even method are an error", "args": [[{"description": "fish", "amount": {"minor": 2000, "currency": "GBP"}, "diners": []}, {"description": "pasta", "amount": {"minor": 1500, "currency": "GBP"}, "diners": []}, {"description": "steak", "amount": {"minor": 2500, "currency": "GBP"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 2, "even", [1, 1]], "expectError": "shares are only used by the by-share method"},
  {"name": "the wrong number of shares is an error", "args": [[{"description": "fish", "amount": {"minor": 2000, "currency": "GBP"}, "diners": []}, {"description": "pasta", "amount": {"minor": 1500, "currency": "GBP"}, "diners": []}, {"description": "steak", "amount": {"minor": 2500, "currency": "GBP"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 3, "by-share", [1, 1]], "expectError": "shares must have one entry per diner"},
  {"name": "all-zero shares are an error", "args": [[{"description": "fish", "amount": {"minor": 2000, "currency": "GBP"}, "diners": []}, {"description": "pasta", "amount": {"minor": 1500, "currency": "GBP"}, "diners": []}, {"description": "steak", "amount": {"minor": 2500, "currency": "GBP"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 2, "by-share", [0, 0]], "expectError": "shares must not all be zero"},
  {"name": "a negative share is an error", "args": [[{"description": "fish", "amount": {"minor": 2000, "currency": "GBP"}, "diners": []}, {"description": "pasta", "amount": {"minor": 1500, "currency": "GBP"}, "diners": []}, {"description": "steak", "amount": {"minor": 2500, "currency": "GBP"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 2, "by-share", [2, -1]], "expectError": "shares must not be negative"},
  {"name": "a negative item is an error", "args": [[{"description": "voucher", "amount": {"minor": -500, "currency": "GBP"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 2, "even", []], "expectError": "item amounts must not be negative"},
  {"name": "a negative service charge is an error", "args": [[{"description": "fish", "amount": {"minor": 2000, "currency": "GBP"}, "diners": []}, {"description": "pasta", "amount": {"minor": 1500, "currency": "GBP"}, "diners": []}, {"description": "steak", "amount": {"minor": 2500, "currency": "GBP"}, "diners": []}], {"minor": -1, "currency": "GBP"}, 2, "even", []], "expectError": "serviceCharge must not be negative"},
  {"name": "mixed currencies are an error", "args": [[{"description": "a", "amount": {"minor": 100, "currency": "EUR"}, "diners": []}], {"minor": 0, "currency": "GBP"}, 2, "even", []], "expectError": "currency mismatch"},
  {"name": "service on a bill with no items is an error", "args": [[], {"minor": 100, "currency": "GBP"}, 2, "by-item", []], "expectError": "a service charge cannot be shared on a bill with no items"}
]