[ { "name": "400.00 x 1.10 x 1.35 x 1.20 is 712.80", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "driverAge", "rows": [ { "key": "17-24", "basisPoints": 18000 }, { "key": "25-39", "basisPoints": 11000 }, { "key": "40-69", "basisPoints": 10000 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "vehicleGroup", "rows": [ { "key": "1-10", "basisPoints": 9500 }, { "key": "11-20", "basisPoints": 12000 } ] } ], { "driverAge": "25-39", "area": "C", "vehicleGroup": "11-20" }, [], null, null, "half-up" ], "expect": { "factors": [ { "name": "driverAge", "basisPoints": 11000 }, { "name": "area", "basisPoints": 13500 }, { "name": "vehicleGroup", "basisPoints": 12000 } ], "calculated": { "minor": 71280, "currency": "GBP" }, "premium": { "minor": 71280, "currency": "GBP" }, "cap": "none" } }, { "name": "a 10% multi-car discount multiplies by 0.90", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "driverAge", "rows": [ { "key": "17-24", "basisPoints": 18000 }, { "key": "25-39", "basisPoints": 11000 }, { "key": "40-69", "basisPoints": 10000 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "vehicleGroup", "rows": [ { "key": "1-10", "basisPoints": 9500 }, { "key": "11-20", "basisPoints": 12000 } ] } ], { "driverAge": "25-39", "area": "C", "vehicleGroup": "11-20" }, [ { "name": "multiCar", "basisPoints": -1000 } ], null, null, "half-up" ], "expect": { "factors": [ { "name": "driverAge", "basisPoints": 11000 }, { "name": "area", "basisPoints": 13500 }, { "name": "vehicleGroup", "basisPoints": 12000 }, { "name": "multiCar", "basisPoints": 9000 } ], "calculated": { "minor": 64152, "currency": "GBP" }, "premium": { "minor": 64152, "currency": "GBP" }, "cap": "none" } }, { "name": "a 25% conviction loading and a 10% discount: 712.80 x 1.25 x 0.90", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "driverAge", "rows": [ { "key": "17-24", "basisPoints": 18000 }, { "key": "25-39", "basisPoints": 11000 }, { "key": "40-69", "basisPoints": 10000 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "vehicleGroup", "rows": [ { "key": "1-10", "basisPoints": 9500 }, { "key": "11-20", "basisPoints": 12000 } ] } ], { "driverAge": "25-39", "area": "C", "vehicleGroup": "11-20" }, [ { "name": "conviction", "basisPoints": 2500 }, { "name": "multiCar", "basisPoints": -1000 } ], null, null, "half-up" ], "expect": { "factors": [ { "name": "driverAge", "basisPoints": 11000 }, { "name": "area", "basisPoints": 13500 }, { "name": "vehicleGroup", "basisPoints": 12000 }, { "name": "conviction", "basisPoints": 12500 }, { "name": "multiCar", "basisPoints": 9000 } ], "calculated": { "minor": 80190, "currency": "GBP" }, "premium": { "minor": 80190, "currency": "GBP" }, "cap": "none" } }, { "name": "333.33 x 1.80 x 1.35 x 0.95 is 769.492305, rounded once", "args": [ { "minor": 33333, "currency": "GBP" }, [ { "name": "driverAge", "rows": [ { "key": "17-24", "basisPoints": 18000 }, { "key": "25-39", "basisPoints": 11000 }, { "key": "40-69", "basisPoints": 10000 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "vehicleGroup", "rows": [ { "key": "1-10", "basisPoints": 9500 }, { "key": "11-20", "basisPoints": 12000 } ] } ], { "driverAge": "17-24", "area": "C", "vehicleGroup": "1-10" }, [], null, null, "half-up" ], "expect": { "factors": [ { "name": "driverAge", "basisPoints": 18000 }, { "name": "area", "basisPoints": 13500 }, { "name": "vehicleGroup", "basisPoints": 9500 } ], "calculated": { "minor": 76949, "currency": "GBP" }, "premium": { "minor": 76949, "currency": "GBP" }, "cap": "none" } }, { "name": "the same rounded up", "args": [ { "minor": 33333, "currency": "GBP" }, [ { "name": "driverAge", "rows": [ { "key": "17-24", "basisPoints": 18000 }, { "key": "25-39", "basisPoints": 11000 }, { "key": "40-69", "basisPoints": 10000 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "vehicleGroup", "rows": [ { "key": "1-10", "basisPoints": 9500 }, { "key": "11-20", "basisPoints": 12000 } ] } ], { "driverAge": "17-24", "area": "C", "vehicleGroup": "1-10" }, [], null, null, "up" ], "expect": { "factors": [ { "name": "driverAge", "basisPoints": 18000 }, { "name": "area", "basisPoints": 13500 }, { "name": "vehicleGroup", "basisPoints": 9500 } ], "calculated": { "minor": 76950, "currency": "GBP" }, "premium": { "minor": 76950, "currency": "GBP" }, "cap": "none" } }, { "name": "one rounding, not three: 1.01 x 1.005^3 is 1.0252..., so 1.03, where rounding each step gives 1.04", "args": [ { "minor": 101, "currency": "GBP" }, [ { "name": "a", "rows": [ { "key": "x", "basisPoints": 10050 } ] }, { "name": "b", "rows": [ { "key": "x", "basisPoints": 10050 } ] }, { "name": "c", "rows": [ { "key": "x", "basisPoints": 10050 } ] } ], { "a": "x", "b": "x", "c": "x" }, [], null, null, "half-up" ], "expect": { "factors": [ { "name": "a", "basisPoints": 10050 }, { "name": "b", "basisPoints": 10050 }, { "name": "c", "basisPoints": 10050 } ], "calculated": { "minor": 103, "currency": "GBP" }, "premium": { "minor": 103, "currency": "GBP" }, "cap": "none" } }, { "name": "a minimum premium lifts a low result", "args": [ { "minor": 10000, "currency": "GBP" }, [ { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] } ], { "area": "A" }, [], { "minor": 15000, "currency": "GBP" }, null, "half-up" ], "expect": { "factors": [ { "name": "area", "basisPoints": 9000 } ], "calculated": { "minor": 9000, "currency": "GBP" }, "premium": { "minor": 15000, "currency": "GBP" }, "cap": "minimum" } }, { "name": "a maximum premium caps a high one", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "driverAge", "rows": [ { "key": "17-24", "basisPoints": 18000 }, { "key": "25-39", "basisPoints": 11000 }, { "key": "40-69", "basisPoints": 10000 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "vehicleGroup", "rows": [ { "key": "1-10", "basisPoints": 9500 }, { "key": "11-20", "basisPoints": 12000 } ] } ], { "driverAge": "25-39", "area": "C", "vehicleGroup": "11-20" }, [], null, { "minor": 50000, "currency": "GBP" }, "half-up" ], "expect": { "factors": [ { "name": "driverAge", "basisPoints": 11000 }, { "name": "area", "basisPoints": 13500 }, { "name": "vehicleGroup", "basisPoints": 12000 } ], "calculated": { "minor": 71280, "currency": "GBP" }, "premium": { "minor": 50000, "currency": "GBP" }, "cap": "maximum" } }, { "name": "inside both caps nothing changes", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "driverAge", "rows": [ { "key": "17-24", "basisPoints": 18000 }, { "key": "25-39", "basisPoints": 11000 }, { "key": "40-69", "basisPoints": 10000 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "vehicleGroup", "rows": [ { "key": "1-10", "basisPoints": 9500 }, { "key": "11-20", "basisPoints": 12000 } ] } ], { "driverAge": "25-39", "area": "C", "vehicleGroup": "11-20" }, [], { "minor": 15000, "currency": "GBP" }, { "minor": 100000, "currency": "GBP" }, "half-up" ], "expect": { "factors": [ { "name": "driverAge", "basisPoints": 11000 }, { "name": "area", "basisPoints": 13500 }, { "name": "vehicleGroup", "basisPoints": 12000 } ], "calculated": { "minor": 71280, "currency": "GBP" }, "premium": { "minor": 71280, "currency": "GBP" }, "cap": "none" } }, { "name": "a result exactly the minimum is not capped", "args": [ { "minor": 15000, "currency": "GBP" }, [], {}, [], { "minor": 15000, "currency": "GBP" }, null, "half-up" ], "expect": { "factors": [], "calculated": { "minor": 15000, "currency": "GBP" }, "premium": { "minor": 15000, "currency": "GBP" }, "cap": "none" } }, { "name": "no tables and no adjustments leave the base", "args": [ { "minor": 25000, "currency": "GBP" }, [], {}, [], null, null, "half-up" ], "expect": { "factors": [], "calculated": { "minor": 25000, "currency": "GBP" }, "premium": { "minor": 25000, "currency": "GBP" }, "cap": "none" } }, { "name": "a 100% discount gives zero, then the minimum", "args": [ { "minor": 25000, "currency": "GBP" }, [], {}, [ { "name": "free", "basisPoints": -10000 } ], { "minor": 5000, "currency": "GBP" }, null, "half-up" ], "expect": { "factors": [ { "name": "free", "basisPoints": 0 } ], "calculated": { "minor": 0, "currency": "GBP" }, "premium": { "minor": 5000, "currency": "GBP" }, "cap": "minimum" } }, { "name": "half a penny rounds to even", "args": [ { "minor": 1, "currency": "GBP" }, [], {}, [ { "name": "half", "basisPoints": -5000 } ], null, null, "half-even" ], "expect": { "factors": [ { "name": "half", "basisPoints": 5000 } ], "calculated": { "minor": 0, "currency": "GBP" }, "premium": { "minor": 0, "currency": "GBP" }, "cap": "none" } }, { "name": "half a penny rounds up half-up", "args": [ { "minor": 1, "currency": "GBP" }, [], {}, [ { "name": "half", "basisPoints": -5000 } ], null, null, "half-up" ], "expect": { "factors": [ { "name": "half", "basisPoints": 5000 } ], "calculated": { "minor": 1, "currency": "GBP" }, "premium": { "minor": 1, "currency": "GBP" }, "cap": "none" } }, { "name": "a table without a value for the risk is refused", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "driverAge", "rows": [ { "key": "17-24", "basisPoints": 18000 }, { "key": "25-39", "basisPoints": 11000 }, { "key": "40-69", "basisPoints": 10000 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "vehicleGroup", "rows": [ { "key": "1-10", "basisPoints": 9500 }, { "key": "11-20", "basisPoints": 12000 } ] } ], { "driverAge": "25-39", "area": "C" }, [], null, null, "half-up" ], "expectError": "no value for rating factor \"vehicleGroup\"" }, { "name": "a value the table has no row for is refused", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "driverAge", "rows": [ { "key": "17-24", "basisPoints": 18000 }, { "key": "25-39", "basisPoints": 11000 }, { "key": "40-69", "basisPoints": 10000 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "vehicleGroup", "rows": [ { "key": "1-10", "basisPoints": 9500 }, { "key": "11-20", "basisPoints": 12000 } ] } ], { "driverAge": "25-39", "area": "Z", "vehicleGroup": "1-10" }, [], null, null, "half-up" ], "expectError": "rating factor \"area\" has no row for \"Z\"" }, { "name": "a risk value no table rates is refused", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] } ], { "area": "A", "colour": "red" }, [], null, null, "half-up" ], "expectError": "risk has a value for \"colour\", which no table rates" }, { "name": "a table named twice is refused", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] }, { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000 }, { "key": "B", "basisPoints": 10000 }, { "key": "C", "basisPoints": 13500 } ] } ], { "area": "A" }, [], null, null, "half-up" ], "expectError": "rating factor \"area\" appears twice" }, { "name": "a discount beyond 100% is refused", "args": [ { "minor": 40000, "currency": "GBP" }, [], {}, [ { "name": "silly", "basisPoints": -10001 } ], null, null, "half-up" ], "expectError": "adjustment basisPoints must be a whole number of -10000 or more" }, { "name": "a negative factor is refused", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "area", "rows": [ { "key": "A", "basisPoints": -1 } ] } ], { "area": "A" }, [], null, null, "half-up" ], "expectError": "factor basisPoints must be a whole number of 0 or more" }, { "name": "a fractional factor is refused", "args": [ { "minor": 40000, "currency": "GBP" }, [ { "name": "area", "rows": [ { "key": "A", "basisPoints": 9000.5 } ] } ], { "area": "A" }, [], null, null, "half-up" ], "expectError": "factor basisPoints must be a whole number of 0 or more" }, { "name": "a minimum above the maximum is refused", "args": [ { "minor": 40000, "currency": "GBP" }, [], {}, [], { "minor": 20000, "currency": "GBP" }, { "minor": 10000, "currency": "GBP" }, "half-up" ], "expectError": "minimumPremium must not be more than maximumPremium" }, { "name": "a negative base is refused", "args": [ { "minor": -1, "currency": "GBP" }, [], {}, [], null, null, "half-up" ], "expectError": "basePremium must not be negative" }, { "name": "a minimum in another currency is refused", "args": [ { "minor": 40000, "currency": "GBP" }, [], {}, [], { "minor": 100, "currency": "EUR" }, null, "half-up" ], "expectError": "currency mismatch" } ]