[
{ "name": "a grade weighted 3 to 1", "args": [[90, 80], [3, 1], 1, "half-up"], "expect": 87.5 },
{ "name": "weights change the answer: one item at 10 and three at 20 average 17.5, not 15", "args": [[10, 20], [1, 3], 2, "half-up"], "expect": 17.5 },
{ "name": "prices in pence weighted by quantity", "args": [[199, 249], [3, 2], 0, "half-up"], "expect": 219 },
{ "name": "87.5 to whole numbers rounds half up to 88", "args": [[90, 80], [3, 1], 0, "half-up"], "expect": 88 },
{ "name": "2.5 half-up is 3", "args": [[2, 3], [1, 1], 0, "half-up"], "expect": 3 },
{ "name": "2.5 half-even is 2", "args": [[2, 3], [1, 1], 0, "half-even"], "expect": 2 },
{ "name": "1.5 half-even is 2", "args": [[1, 2], [1, 1], 0, "half-even"], "expect": 2 },
{ "name": "a third to four places", "args": [[1, 0, 0], [1, 1, 1], 4, "half-up"], "expect": 0.3333 },
{ "name": "a third rounded up", "args": [[1, 0, 0], [1, 1, 1], 4, "up"], "expect": 0.3334 },
{ "name": "down truncates toward zero for negatives", "args": [[-2, -1, -1], [1, 1, 1], 2, "down"], "expect": -1.33 },
{ "name": "up rounds away from zero for negatives", "args": [[-2, -1, -1], [1, 1, 1], 2, "up"], "expect": -1.34 },
{ "name": "a zero weight contributes nothing", "args": [[100, 5000], [1, 0], 0, "half-up"], "expect": 100 },
{ "name": "nine decimals of an exact answer", "args": [[1], [3], 9, "half-up"], "expect": 1 },
{ "name": "a zero average is 0", "args": [[-5, 5], [2, 2], 3, "half-up"], "expect": 0 },
{ "name": "mismatched lengths are an error", "args": [[1, 2], [1], 0, "half-up"], "expectError": "values and weights must be the same length" },
{ "name": "an empty list is an error", "args": [[], [], 0, "half-up"], "expectError": "values must not be empty" },
{ "name": "a negative weight is an error", "args": [[1, 2], [1, -1], 0, "half-up"], "expectError": "weights must not be negative" },
{ "name": "all-zero weights are an error", "args": [[1, 2], [0, 0], 0, "half-up"], "expectError": "weights must not all be zero" },
{ "name": "decimals above 9 is an error", "args": [[1], [1], 10, "half-up"], "expectError": "decimals must be a whole number from 0 to 9" },
{ "name": "a fractional value is an error", "args": [[1.5], [1], 0, "half-up"], "expectError": "values must be integers" },
{ "name": "a weighted sum past 2^53 - 1 once scaled is an error", "args": [[9007199254740991], [1], 1, "half-up"], "expectError": "weighted sum is too large to average exactly" }
]