Functional Weave
Code in Rust

insurance.no-claims-discount@1.0.1

vectors.json

20,338 bytes · view raw

[
 {
  "name": "a first claim-free year earns 30%",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   0,
   0,
   null
  ],
  "expect": {
   "years": 1,
   "discountBasisPoints": 3000,
   "protectionApplied": false
  }
 },
 {
  "name": "four years claim-free becomes five: 65%",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   4,
   0,
   null
  ],
  "expect": {
   "years": 5,
   "discountBasisPoints": 6500,
   "protectionApplied": false
  }
 },
 {
  "name": "six years sits on the 5-year level until 9 years",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   5,
   0,
   null
  ],
  "expect": {
   "years": 6,
   "discountBasisPoints": 6500,
   "protectionApplied": false
  }
 },
 {
  "name": "reaching 9 years: the top of the scale",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   8,
   0,
   null
  ],
  "expect": {
   "years": 9,
   "discountBasisPoints": 7000,
   "protectionApplied": false
  }
 },
 {
  "name": "years keep counting past the top; the discount stays at the top",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   12,
   0,
   null
  ],
  "expect": {
   "years": 13,
   "discountBasisPoints": 7000,
   "protectionApplied": false
  }
 },
 {
  "name": "one claim at 5 years steps back to 3 years: 50%",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   5,
   1,
   null
  ],
  "expect": {
   "years": 3,
   "discountBasisPoints": 5000,
   "protectionApplied": false
  }
 },
 {
  "name": "two claims at 5 years step back to 1 year",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   5,
   2,
   null
  ],
  "expect": {
   "years": 1,
   "discountBasisPoints": 3000,
   "protectionApplied": false
  }
 },
 {
  "name": "three claims at 5 years lose it all",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   5,
   3,
   null
  ],
  "expect": {
   "years": 0,
   "discountBasisPoints": 0,
   "protectionApplied": false
  }
 },
 {
  "name": "more claims than the scale lists use its last step",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   5,
   4,
   null
  ],
  "expect": {
   "years": 0,
   "discountBasisPoints": 0,
   "protectionApplied": false
  }
 },
 {
  "name": "above the top level the top level's step-back applies: 12 years, one claim, 7 years at 65%",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   12,
   1,
   null
  ],
  "expect": {
   "years": 7,
   "discountBasisPoints": 6500,
   "protectionApplied": false
  }
 },
 {
  "name": "between levels the level below applies: 7 years, one claim, the 5-year step to 3",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   7,
   1,
   null
  ],
  "expect": {
   "years": 3,
   "discountBasisPoints": 5000,
   "protectionApplied": false
  }
 },
 {
  "name": "one claim at 1 year loses it",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   1,
   1,
   null
  ],
  "expect": {
   "years": 0,
   "discountBasisPoints": 0,
   "protectionApplied": false
  }
 },
 {
  "name": "a claim with no NCD stays at 0",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   0,
   1,
   null
  ],
  "expect": {
   "years": 0,
   "discountBasisPoints": 0,
   "protectionApplied": false
  }
 },
 {
  "name": "protected NCD, one claim of two allowed: years kept, none earned",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   9,
   1,
   {
    "claimLimit": 2,
    "claimsInWindow": 1
   }
  ],
  "expect": {
   "years": 9,
   "discountBasisPoints": 7000,
   "protectionApplied": true
  }
 },
 {
  "name": "protected NCD, the second allowed claim in the window is still covered",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   9,
   1,
   {
    "claimLimit": 2,
    "claimsInWindow": 2
   }
  ],
  "expect": {
   "years": 9,
   "discountBasisPoints": 7000,
   "protectionApplied": true
  }
 },
 {
  "name": "protected NCD exceeded: the third claim in the window steps back as usual",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   9,
   1,
   {
    "claimLimit": 2,
    "claimsInWindow": 3
   }
  ],
  "expect": {
   "years": 7,
   "discountBasisPoints": 6500,
   "protectionApplied": false
  }
 },
 {
  "name": "protection with no claims earns a year as normal",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   9,
   0,
   {
    "claimLimit": 2,
    "claimsInWindow": 0
   }
  ],
  "expect": {
   "years": 10,
   "discountBasisPoints": 7000,
   "protectionApplied": false
  }
 },
 {
  "name": "an empty scale is refused",
  "args": [
   [],
   3,
   0,
   null
  ],
  "expectError": "the NCD scale must not be empty"
 },
 {
  "name": "a scale must start at 0 years",
  "args": [
   [
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    }
   ],
   3,
   0,
   null
  ],
  "expectError": "the NCD scale must start at 0 years"
 },
 {
  "name": "a scale out of order is refused",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    }
   ],
   3,
   0,
   null
  ],
  "expectError": "ascending order of years"
 },
 {
  "name": "a step-back above the level is refused",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      3
     ]
    }
   ],
   2,
   1,
   null
  ],
  "expectError": "must not rise above the level"
 },
 {
  "name": "a discount above 100% is refused",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 10001,
     "stepBack": [
      0
     ]
    }
   ],
   1,
   0,
   null
  ],
  "expectError": "discountBasisPoints must be from 0 to 10000"
 },
 {
  "name": "negative claims are refused",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   3,
   -1,
   null
  ],
  "expectError": "claims must be a whole number of 0 or more"
 },
 {
  "name": "fractional years are refused",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   2.5,
   0,
   null
  ],
  "expectError": "currentYears must be a whole number of 0 or more"
 },
 {
  "name": "a protection window without this year's claims is refused",
  "args": [
   [
    {
     "years": 0,
     "discountBasisPoints": 0,
     "stepBack": []
    },
    {
     "years": 1,
     "discountBasisPoints": 3000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 2,
     "discountBasisPoints": 4000,
     "stepBack": [
      0
     ]
    },
    {
     "years": 3,
     "discountBasisPoints": 5000,
     "stepBack": [
      1,
      0
     ]
    },
    {
     "years": 4,
     "discountBasisPoints": 6000,
     "stepBack": [
      2,
      0
     ]
    },
    {
     "years": 5,
     "discountBasisPoints": 6500,
     "stepBack": [
      3,
      1,
      0
     ]
    },
    {
     "years": 9,
     "discountBasisPoints": 7000,
     "stepBack": [
      7,
      4,
      0
     ]
    }
   ],
   5,
   2,
   {
    "claimLimit": 2,
    "claimsInWindow": 1
   }
  ],
  "expectError": "claimsInWindow must include this year's claims"
 }
]