Functional Weave
Code in TypeScript

charity.restricted-funds@1.0.0

vectors.json

10,887 bytes · view raw

[
  {"name": "an earmarked spend is charged to its restricted fund", "args": [[{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 500000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}], [{"id": "s1", "purpose": "water", "amount": {"minor": 200000, "currency": "GBP"}}]], "expect": {"draws": [{"spendId": "s1", "fundId": "well-grant", "amount": {"minor": 200000, "currency": "GBP"}}], "funds": [{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 500000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 100000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}]}},
  {"name": "the restricted fund is used up first, the rest falls on unrestricted funds", "args": [[{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 500000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}], [{"id": "s1", "purpose": "water", "amount": {"minor": 350000, "currency": "GBP"}}]], "expect": {"draws": [{"spendId": "s1", "fundId": "well-grant", "amount": {"minor": 300000, "currency": "GBP"}}, {"spendId": "s1", "fundId": "general", "amount": {"minor": 50000, "currency": "GBP"}}], "funds": [{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 450000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 0, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}]}},
  {"name": "general spending never touches a restricted fund", "args": [[{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 500000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}], [{"id": "rent", "purpose": null, "amount": {"minor": 400000, "currency": "GBP"}}]], "expect": {"draws": [{"spendId": "rent", "fundId": "general", "amount": {"minor": 400000, "currency": "GBP"}}], "funds": [{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 100000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}]}},
  {"name": "general spending beyond the unrestricted funds is refused even though restricted money sits unused", "args": [[{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 500000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}], [{"id": "rent", "purpose": null, "amount": {"minor": 500001, "currency": "GBP"}}]], "expectError": "insufficient funds for spend \"rent\": short by 1"},
  {"name": "spends are charged in order: the second earmarked spend finds the fund partly used", "args": [[{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 500000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}], [{"id": "a", "purpose": "education", "amount": {"minor": 60000, "currency": "GBP"}}, {"id": "b", "purpose": "education", "amount": {"minor": 60000, "currency": "GBP"}}]], "expect": {"draws": [{"spendId": "a", "fundId": "school-appeal", "amount": {"minor": 60000, "currency": "GBP"}}, {"spendId": "b", "fundId": "school-appeal", "amount": {"minor": 40000, "currency": "GBP"}}, {"spendId": "b", "fundId": "general", "amount": {"minor": 20000, "currency": "GBP"}}], "funds": [{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 480000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 0, "currency": "GBP"}}]}},
  {"name": "a purpose with no restricted fund is paid from unrestricted funds", "args": [[{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 500000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}], [{"id": "x", "purpose": "health", "amount": {"minor": 1000, "currency": "GBP"}}]], "expect": {"draws": [{"spendId": "x", "fundId": "general", "amount": {"minor": 1000, "currency": "GBP"}}], "funds": [{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 499000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}]}},
  {"name": "two restricted funds for one purpose are used in the order given, then two unrestricted funds", "args": [[{"id": "reserve", "restricted": false, "purpose": null, "balance": {"minor": 1000, "currency": "GBP"}}, {"id": "grant-a", "restricted": true, "purpose": "food", "balance": {"minor": 500, "currency": "GBP"}}, {"id": "unrestricted-2", "restricted": false, "purpose": null, "balance": {"minor": 1000, "currency": "GBP"}}, {"id": "grant-b", "restricted": true, "purpose": "food", "balance": {"minor": 500, "currency": "GBP"}}], [{"id": "meals", "purpose": "food", "amount": {"minor": 2500, "currency": "GBP"}}]], "expect": {"draws": [{"spendId": "meals", "fundId": "grant-a", "amount": {"minor": 500, "currency": "GBP"}}, {"spendId": "meals", "fundId": "grant-b", "amount": {"minor": 500, "currency": "GBP"}}, {"spendId": "meals", "fundId": "reserve", "amount": {"minor": 1000, "currency": "GBP"}}, {"spendId": "meals", "fundId": "unrestricted-2", "amount": {"minor": 500, "currency": "GBP"}}], "funds": [{"id": "reserve", "restricted": false, "purpose": null, "balance": {"minor": 0, "currency": "GBP"}}, {"id": "grant-a", "restricted": true, "purpose": "food", "balance": {"minor": 0, "currency": "GBP"}}, {"id": "unrestricted-2", "restricted": false, "purpose": null, "balance": {"minor": 500, "currency": "GBP"}}, {"id": "grant-b", "restricted": true, "purpose": "food", "balance": {"minor": 0, "currency": "GBP"}}]}},
  {"name": "a spend using every penny exactly is allowed", "args": [[{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 100, "currency": "GBP"}}, {"id": "r", "restricted": true, "purpose": "p", "balance": {"minor": 50, "currency": "GBP"}}], [{"id": "s", "purpose": "p", "amount": {"minor": 150, "currency": "GBP"}}]], "expect": {"draws": [{"spendId": "s", "fundId": "r", "amount": {"minor": 50, "currency": "GBP"}}, {"spendId": "s", "fundId": "general", "amount": {"minor": 100, "currency": "GBP"}}], "funds": [{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 0, "currency": "GBP"}}, {"id": "r", "restricted": true, "purpose": "p", "balance": {"minor": 0, "currency": "GBP"}}]}},
  {"name": "a zero spend draws nothing", "args": [[{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 500000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}], [{"id": "z", "purpose": null, "amount": {"minor": 0, "currency": "GBP"}}]], "expect": {"draws": [], "funds": [{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 500000, "currency": "GBP"}}, {"id": "well-grant", "restricted": true, "purpose": "water", "balance": {"minor": 300000, "currency": "GBP"}}, {"id": "school-appeal", "restricted": true, "purpose": "education", "balance": {"minor": 100000, "currency": "GBP"}}]}},
  {"name": "nothing to allocate", "args": [[], []], "expect": {"draws": [], "funds": []}},
  {"name": "an earmarked overspend that unrestricted funds cannot cover is refused", "args": [[{"id": "general", "restricted": false, "purpose": null, "balance": {"minor": 100, "currency": "GBP"}}, {"id": "r", "restricted": true, "purpose": "p", "balance": {"minor": 50, "currency": "GBP"}}], [{"id": "s", "purpose": "p", "amount": {"minor": 151, "currency": "GBP"}}]], "expectError": "insufficient funds for spend \"s\": short by 1"},
  {"name": "a restricted fund without a purpose is an error", "args": [[{"id": "r", "restricted": true, "purpose": null, "balance": {"minor": 50, "currency": "GBP"}}], []], "expectError": "restricted fund \"r\" needs a purpose"},
  {"name": "an unrestricted fund with a purpose is an error", "args": [[{"id": "g", "restricted": false, "purpose": "p", "balance": {"minor": 50, "currency": "GBP"}}], []], "expectError": "unrestricted fund \"g\" must not have a purpose"},
  {"name": "duplicate fund ids are an error", "args": [[{"id": "g", "restricted": false, "purpose": null, "balance": {"minor": 50, "currency": "GBP"}}, {"id": "g", "restricted": false, "purpose": null, "balance": {"minor": 50, "currency": "GBP"}}], []], "expectError": "duplicate fund id \"g\""},
  {"name": "a negative fund balance is an error", "args": [[{"id": "g", "restricted": false, "purpose": null, "balance": {"minor": -1, "currency": "GBP"}}], []], "expectError": "fund \"g\" balance must not be negative"},
  {"name": "a negative spend is an error", "args": [[{"id": "g", "restricted": false, "purpose": null, "balance": {"minor": 1, "currency": "GBP"}}], [{"id": "s", "purpose": null, "amount": {"minor": -1, "currency": "GBP"}}]], "expectError": "spend \"s\" amount must not be negative"},
  {"name": "mixed currencies are an error", "args": [[{"id": "g", "restricted": false, "purpose": null, "balance": {"minor": 100, "currency": "GBP"}}], [{"id": "s", "purpose": null, "amount": {"minor": 1, "currency": "EUR"}}]], "expectError": "currency mismatch: EUR and GBP"}
]