{ "format": 1, "function": "compute_split", "cases": [ { "name": "§9.1 row 1: 1001, payer a, 5000/5000: payer gets the extra öre", "input": { "amount_ore": 1001, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000 } } }, "expected": { "ok": { "a": 501, "b": 500 } } }, { "name": "§9.1 row 2: 1, payer a, 5000/5000: the single öre goes to the payer", "input": { "amount_ore": 1, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000 } } }, "expected": { "ok": { "a": 1, "b": 0 } } }, { "name": "§9.1 row 3: 100, payer b, 4000/6000", "input": { "amount_ore": 100, "payer_user_id": "b", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 6000, "b": 4000 } } }, "expected": { "ok": { "a": 60, "b": 40 } } }, { "name": "§9.1 row 4: 999, payer a, 3333/6667", "input": { "amount_ore": 999, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 3333, "b": 6667 } } }, "expected": { "ok": { "a": 333, "b": 666 } } }, { "name": "§9.1 row 5: 999, payer b, 6667/3333", "input": { "amount_ore": 999, "payer_user_id": "b", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 3333, "b": 6667 } } }, "expected": { "ok": { "a": 332, "b": 667 } } }, { "name": "§9.1 row 6: 50000, payer a, 0/10000", "input": { "amount_ore": 50000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 0, "b": 10000 } } }, "expected": { "ok": { "a": 0, "b": 50000 } } }, { "name": "§9.1 row 7: 50000, payer a, 10000/0", "input": { "amount_ore": 50000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 10000, "b": 0 } } }, "expected": { "ok": { "a": 50000, "b": 0 } } }, { "name": "user_ids order does not matter: payer b listed second, remainder still to payer", "input": { "amount_ore": 1001, "payer_user_id": "b", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000 } } }, "expected": { "ok": { "a": 500, "b": 501 } } }, { "name": "user_ids given in reverse order", "input": { "amount_ore": 999, "payer_user_id": "a", "user_ids": ["b", "a"], "spec": { "mode": "ratio", "bp": { "a": 3333, "b": 6667 } } }, "expected": { "ok": { "a": 333, "b": 666 } } }, { "name": "non-payer exact share 0.9 öre: rounded down to 0, payer bears the whole amount", "input": { "amount_ore": 9, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 9000, "b": 1000 } } }, "expected": { "ok": { "a": 9, "b": 0 } } }, { "name": "full on the payer", "input": { "amount_ore": 1001, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "full", "bearer_user_id": "a" } }, "expected": { "ok": { "a": 1001, "b": 0 } } }, { "name": "full on the non-payer", "input": { "amount_ore": 1001, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "full", "bearer_user_id": "b" } }, "expected": { "ok": { "a": 0, "b": 1001 } } }, { "name": "exact valid: shares sum exactly to the amount", "input": { "amount_ore": 1001, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "exact", "ore": { "a": 300, "b": 701 } } }, "expected": { "ok": { "a": 300, "b": 701 } } }, { "name": "exact valid with a zero share", "input": { "amount_ore": 41200, "payer_user_id": "b", "user_ids": ["a", "b"], "spec": { "mode": "exact", "ore": { "a": 41200, "b": 0 } } }, "expected": { "ok": { "a": 41200, "b": 0 } } }, { "name": "exact sum mismatch: one öre short", "input": { "amount_ore": 1001, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "exact", "ore": { "a": 300, "b": 700 } } }, "expected": { "error": "exact_sum_mismatch" } }, { "name": "exact sum mismatch: one öre over", "input": { "amount_ore": 1001, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "exact", "ore": { "a": 300, "b": 702 } } }, "expected": { "error": "exact_sum_mismatch" } }, { "name": "exact negative share (sum would match)", "input": { "amount_ore": 1001, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "exact", "ore": { "a": -100, "b": 1101 } } }, "expected": { "error": "exact_negative" } }, { "name": "amount 0", "input": { "amount_ore": 0, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000 } } }, "expected": { "error": "amount_out_of_range" } }, { "name": "amount negative", "input": { "amount_ore": -1, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000 } } }, "expected": { "error": "amount_out_of_range" } }, { "name": "amount 1 000 000 001", "input": { "amount_ore": 1000000001, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000 } } }, "expected": { "error": "amount_out_of_range" } }, { "name": "amount 1 000 000 000 with 3333 bp: 64-bit intermediate, no overflow", "input": { "amount_ore": 1000000000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 6667, "b": 3333 } } }, "expected": { "ok": { "a": 666700000, "b": 333300000 } } }, { "name": "amount 999 999 999 with 3333 bp on the non-payer: remainder to payer at the top of the range", "input": { "amount_ore": 999999999, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 6667, "b": 3333 } } }, "expected": { "ok": { "a": 666700000, "b": 333299999 } } }, { "name": "amount 1 000 000 000 exactly, full on the non-payer", "input": { "amount_ore": 1000000000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "full", "bearer_user_id": "b" } }, "expected": { "ok": { "a": 0, "b": 1000000000 } } }, { "name": "bp 10001", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 10001, "b": 0 } } }, "expected": { "error": "bp_out_of_range" } }, { "name": "ratio does not sum to 10000", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 4000 } } }, "expected": { "error": "bp_sum_not_10000" } }, { "name": "ratio sums to 10001", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5001, "b": 5000 } } }, "expected": { "error": "bp_sum_not_10000" } }, { "name": "three user ids", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b", "c"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000 } } }, "expected": { "error": "users_invalid" } }, { "name": "one user id", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a"], "spec": { "mode": "ratio", "bp": { "a": 10000 } } }, "expected": { "error": "users_invalid" } }, { "name": "two user ids that are not distinct", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "a"], "spec": { "mode": "ratio", "bp": { "a": 10000 } } }, "expected": { "error": "users_invalid" } }, { "name": "payer not in users", "input": { "amount_ore": 1000, "payer_user_id": "x", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000 } } }, "expected": { "error": "payer_unknown" } }, { "name": "bearer not in users", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "full", "bearer_user_id": "x" } }, "expected": { "error": "bearer_unknown" } }, { "name": "ratio map keys do not match users", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "x": 5000 } } }, "expected": { "error": "share_users_mismatch" } }, { "name": "ratio map has an extra zero entry", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000, "x": 0 } } }, "expected": { "error": "share_users_mismatch" } }, { "name": "ratio map misses one user", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 10000 } } }, "expected": { "error": "share_users_mismatch" } }, { "name": "exact map keys do not match users", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "exact", "ore": { "a": 500, "x": 500 } } }, "expected": { "error": "share_users_mismatch" } }, { "name": "error order: amount checked before users", "input": { "amount_ore": 0, "payer_user_id": "x", "user_ids": ["a", "b", "c"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 4000 } } }, "expected": { "error": "amount_out_of_range" } }, { "name": "error order: users checked before payer", "input": { "amount_ore": 1000, "payer_user_id": "x", "user_ids": ["a", "b", "c"], "spec": { "mode": "ratio", "bp": { "a": 5000, "b": 5000 } } }, "expected": { "error": "users_invalid" } }, { "name": "error order: payer checked before bp range", "input": { "amount_ore": 1000, "payer_user_id": "x", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 10001, "b": 0 } } }, "expected": { "error": "payer_unknown" } }, { "name": "error order: bp range checked before bp sum", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 10001, "b": 5000 } } }, "expected": { "error": "bp_out_of_range" } }, { "name": "error order: bp sum checked before share users", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "ratio", "bp": { "a": 5000, "x": 4000 } } }, "expected": { "error": "bp_sum_not_10000" } }, { "name": "error order: exact negative checked before exact sum", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "exact", "ore": { "a": -1, "b": 500 } } }, "expected": { "error": "exact_negative" } }, { "name": "error order: exact sum checked before share users", "input": { "amount_ore": 1000, "payer_user_id": "a", "user_ids": ["a", "b"], "spec": { "mode": "exact", "ore": { "a": 500, "x": 400 } } }, "expected": { "error": "exact_sum_mismatch" } } ] }