[ { "name": "60.00 at a 40 percent margin is 100.00, as finance.margin says", "args": [ { "minor": 6000, "currency": "GBP" }, 4000, "margin", "half-up" ], "expect": { "minor": 10000, "currency": "GBP" } }, { "name": "100.00 at a 50 percent markup is 150.00", "args": [ { "minor": 10000, "currency": "GBP" }, 5000, "markup", "half-up" ], "expect": { "minor": 15000, "currency": "GBP" } }, { "name": "100.00 at a 50 percent margin is 200.00, not 150.00", "args": [ { "minor": 10000, "currency": "GBP" }, 5000, "margin", "half-up" ], "expect": { "minor": 20000, "currency": "GBP" } }, { "name": "6.99 at a 30.03 percent margin is 9.99, finance.margin backwards", "args": [ { "minor": 699, "currency": "GBP" }, 3003, "margin", "half-up" ], "expect": { "minor": 999, "currency": "GBP" } }, { "name": "6.99 at a 42.92 percent markup is 9.99, finance.margin backwards", "args": [ { "minor": 699, "currency": "GBP" }, 4292, "markup", "half-up" ], "expect": { "minor": 999, "currency": "GBP" } }, { "name": "10.00 at a 30 percent margin rounds half-up to 14.29", "args": [ { "minor": 1000, "currency": "GBP" }, 3000, "margin", "half-up" ], "expect": { "minor": 1429, "currency": "GBP" } }, { "name": "rounding down misses a 30 percent margin: 14.28 is 29.97 percent", "args": [ { "minor": 1000, "currency": "GBP" }, 3000, "margin", "down" ], "expect": { "minor": 1428, "currency": "GBP" } }, { "name": "rounding up never falls short of the target", "args": [ { "minor": 1000, "currency": "GBP" }, 3000, "margin", "up" ], "expect": { "minor": 1429, "currency": "GBP" } }, { "name": "an exact half penny rounds to even: 1.5 becomes 2", "args": [ { "minor": 1, "currency": "GBP" }, 5000, "markup", "half-even" ], "expect": { "minor": 2, "currency": "GBP" } }, { "name": "zero margin is the cost", "args": [ { "minor": 4321, "currency": "GBP" }, 0, "margin", "half-up" ], "expect": { "minor": 4321, "currency": "GBP" } }, { "name": "zero markup is the cost", "args": [ { "minor": 4321, "currency": "GBP" }, 0, "markup", "half-up" ], "expect": { "minor": 4321, "currency": "GBP" } }, { "name": "zero cost is a zero price", "args": [ { "minor": 0, "currency": "GBP" }, 4000, "margin", "half-up" ], "expect": { "minor": 0, "currency": "GBP" } }, { "name": "a negative markup is a discount below cost", "args": [ { "minor": 10000, "currency": "GBP" }, -2000, "markup", "half-up" ], "expect": { "minor": 8000, "currency": "GBP" } }, { "name": "a markup of -100 percent is a giveaway", "args": [ { "minor": 500, "currency": "GBP" }, -10000, "markup", "half-up" ], "expect": { "minor": 0, "currency": "GBP" } }, { "name": "a negative margin prices below cost, as finance.margin reports it", "args": [ { "minor": 12000, "currency": "GBP" }, -2000, "margin", "half-up" ], "expect": { "minor": 10000, "currency": "GBP" } }, { "name": "yen at a 20 percent margin", "args": [ { "minor": 800, "currency": "JPY" }, 2000, "margin", "half-up" ], "expect": { "minor": 1000, "currency": "JPY" } }, { "name": "a 100 percent margin has no finite price", "args": [ { "minor": 1000, "currency": "GBP" }, 10000, "margin", "half-up" ], "expectError": "has no finite price" }, { "name": "a markup below -100 percent would be a negative price", "args": [ { "minor": 1000, "currency": "GBP" }, -10001, "markup", "half-up" ], "expectError": "gives a negative price" }, { "name": "a negative cost is an error", "args": [ { "minor": -1000, "currency": "GBP" }, 2000, "markup", "half-up" ], "expectError": "cost must not be negative" }, { "name": "the basis has no default and must be named", "args": [ { "minor": 1000, "currency": "GBP" }, 2000, "profit", "half-up" ], "expectError": "unknown pricing basis" }, { "name": "a calculation beyond 2^53 - 1 is refused", "args": [ { "minor": 900719925474100, "currency": "GBP" }, 0, "margin", "half-up" ], "expectError": "exceeds 2^53 - 1" } ]