Functional Weave
Code in Rust

insurance.rating-factors@1.0.0

vectors.json

19,194 bytes · view raw

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