[
{
"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"
}
]