Functional Weave
Code in Rust

insurance.ipt@1.0.0

vectors.json

8,677 bytes · view raw

[
 {
  "name": "standard rate today: 12% on a 100.00 net premium",
  "args": [
   {
    "minor": 10000,
    "currency": "GBP"
   },
   false,
   "standard",
   "2026-09-23",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 10000,
    "currency": "GBP"
   },
   "tax": {
    "minor": 1200,
    "currency": "GBP"
   },
   "gross": {
    "minor": 11200,
    "currency": "GBP"
   },
   "basisPoints": 1200,
   "band": "standard",
   "validFrom": "2017-06-01"
  }
 },
 {
  "name": "taking 12% out of 112.00 gives 12.00 of tax, not 13.44",
  "args": [
   {
    "minor": 11200,
    "currency": "GBP"
   },
   true,
   "standard",
   "2026-09-23",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 10000,
    "currency": "GBP"
   },
   "tax": {
    "minor": 1200,
    "currency": "GBP"
   },
   "gross": {
    "minor": 11200,
    "currency": "GBP"
   },
   "basisPoints": 1200,
   "band": "standard",
   "validFrom": "2017-06-01"
  }
 },
 {
  "name": "higher rate today: 20% on a 50.00 travel premium",
  "args": [
   {
    "minor": 5000,
    "currency": "GBP"
   },
   false,
   "higher",
   "2026-09-23",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 5000,
    "currency": "GBP"
   },
   "tax": {
    "minor": 1000,
    "currency": "GBP"
   },
   "gross": {
    "minor": 6000,
    "currency": "GBP"
   },
   "basisPoints": 2000,
   "band": "higher",
   "validFrom": "2011-01-04"
  }
 },
 {
  "name": "first day of 12%: net of 250.00 gross is 223.21 (22321.43 rounds down)",
  "args": [
   {
    "minor": 25000,
    "currency": "GBP"
   },
   true,
   "standard",
   "2017-06-01",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 22321,
    "currency": "GBP"
   },
   "tax": {
    "minor": 2679,
    "currency": "GBP"
   },
   "gross": {
    "minor": 25000,
    "currency": "GBP"
   },
   "basisPoints": 1200,
   "band": "standard",
   "validFrom": "2017-06-01"
  }
 },
 {
  "name": "last day of 10%: net of 250.00 gross is 227.27",
  "args": [
   {
    "minor": 25000,
    "currency": "GBP"
   },
   true,
   "standard",
   "2017-05-31",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 22727,
    "currency": "GBP"
   },
   "tax": {
    "minor": 2273,
    "currency": "GBP"
   },
   "gross": {
    "minor": 25000,
    "currency": "GBP"
   },
   "basisPoints": 1000,
   "band": "standard",
   "validFrom": "2016-10-01"
  }
 },
 {
  "name": "9.5% on 199.99: 18.99905 rounds half-up to 19.00",
  "args": [
   {
    "minor": 19999,
    "currency": "GBP"
   },
   false,
   "standard",
   "2016-01-01",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 19999,
    "currency": "GBP"
   },
   "tax": {
    "minor": 1900,
    "currency": "GBP"
   },
   "gross": {
    "minor": 21899,
    "currency": "GBP"
   },
   "basisPoints": 950,
   "band": "standard",
   "validFrom": "2015-11-01"
  }
 },
 {
  "name": "9.5% on 199.99 rounded down is 18.99",
  "args": [
   {
    "minor": 19999,
    "currency": "GBP"
   },
   false,
   "standard",
   "2016-01-01",
   "down"
  ],
  "expect": {
   "net": {
    "minor": 19999,
    "currency": "GBP"
   },
   "tax": {
    "minor": 1899,
    "currency": "GBP"
   },
   "gross": {
    "minor": 21898,
    "currency": "GBP"
   },
   "basisPoints": 950,
   "band": "standard",
   "validFrom": "2015-11-01"
  }
 },
 {
  "name": "higher rate on its last day at 17.5%",
  "args": [
   {
    "minor": 8000,
    "currency": "GBP"
   },
   false,
   "higher",
   "2011-01-03",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 8000,
    "currency": "GBP"
   },
   "tax": {
    "minor": 1400,
    "currency": "GBP"
   },
   "gross": {
    "minor": 9400,
    "currency": "GBP"
   },
   "basisPoints": 1750,
   "band": "higher",
   "validFrom": "1997-04-01"
  }
 },
 {
  "name": "higher rate on the first day of 20%",
  "args": [
   {
    "minor": 8000,
    "currency": "GBP"
   },
   false,
   "higher",
   "2011-01-04",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 8000,
    "currency": "GBP"
   },
   "tax": {
    "minor": 1600,
    "currency": "GBP"
   },
   "gross": {
    "minor": 9600,
    "currency": "GBP"
   },
   "basisPoints": 2000,
   "band": "higher",
   "validFrom": "2011-01-04"
  }
 },
 {
  "name": "standard 6% from 4 January 2011: 33.33 gives 2.00 (1.9998)",
  "args": [
   {
    "minor": 3333,
    "currency": "GBP"
   },
   false,
   "standard",
   "2011-01-04",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 3333,
    "currency": "GBP"
   },
   "tax": {
    "minor": 200,
    "currency": "GBP"
   },
   "gross": {
    "minor": 3533,
    "currency": "GBP"
   },
   "basisPoints": 600,
   "band": "standard",
   "validFrom": "2011-01-04"
  }
 },
 {
  "name": "standard 5% on the day before 6%",
  "args": [
   {
    "minor": 10500,
    "currency": "GBP"
   },
   true,
   "standard",
   "2011-01-03",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 10000,
    "currency": "GBP"
   },
   "tax": {
    "minor": 500,
    "currency": "GBP"
   },
   "gross": {
    "minor": 10500,
    "currency": "GBP"
   },
   "basisPoints": 500,
   "band": "standard",
   "validFrom": "1999-07-01"
  }
 },
 {
  "name": "introductory 2.5% in 1995",
  "args": [
   {
    "minor": 10000,
    "currency": "GBP"
   },
   false,
   "standard",
   "1995-06-01",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 10000,
    "currency": "GBP"
   },
   "tax": {
    "minor": 250,
    "currency": "GBP"
   },
   "gross": {
    "minor": 10250,
    "currency": "GBP"
   },
   "basisPoints": 250,
   "band": "standard",
   "validFrom": "1994-10-01"
  }
 },
 {
  "name": "4% in 1998",
  "args": [
   {
    "minor": 10000,
    "currency": "GBP"
   },
   false,
   "standard",
   "1998-01-01",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 10000,
    "currency": "GBP"
   },
   "tax": {
    "minor": 400,
    "currency": "GBP"
   },
   "gross": {
    "minor": 10400,
    "currency": "GBP"
   },
   "basisPoints": 400,
   "band": "standard",
   "validFrom": "1997-04-01"
  }
 },
 {
  "name": "the first day IPT existed",
  "args": [
   {
    "minor": 4000,
    "currency": "GBP"
   },
   false,
   "standard",
   "1994-10-01",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 4000,
    "currency": "GBP"
   },
   "tax": {
    "minor": 100,
    "currency": "GBP"
   },
   "gross": {
    "minor": 4100,
    "currency": "GBP"
   },
   "basisPoints": 250,
   "band": "standard",
   "validFrom": "1994-10-01"
  }
 },
 {
  "name": "a return premium carries its IPT back: -33.33 at 12% is -4.00 of tax",
  "args": [
   {
    "minor": -3333,
    "currency": "GBP"
   },
   false,
   "standard",
   "2026-09-23",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": -3333,
    "currency": "GBP"
   },
   "tax": {
    "minor": -400,
    "currency": "GBP"
   },
   "gross": {
    "minor": -3733,
    "currency": "GBP"
   },
   "basisPoints": 1200,
   "band": "standard",
   "validFrom": "2017-06-01"
  }
 },
 {
  "name": "gross 1.00 at 12%: net 0.89, tax 0.11",
  "args": [
   {
    "minor": 100,
    "currency": "GBP"
   },
   true,
   "standard",
   "2026-09-23",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 89,
    "currency": "GBP"
   },
   "tax": {
    "minor": 11,
    "currency": "GBP"
   },
   "gross": {
    "minor": 100,
    "currency": "GBP"
   },
   "basisPoints": 1200,
   "band": "standard",
   "validFrom": "2017-06-01"
  }
 },
 {
  "name": "a zero premium has no tax",
  "args": [
   {
    "minor": 0,
    "currency": "GBP"
   },
   false,
   "higher",
   "2026-09-23",
   "half-up"
  ],
  "expect": {
   "net": {
    "minor": 0,
    "currency": "GBP"
   },
   "tax": {
    "minor": 0,
    "currency": "GBP"
   },
   "gross": {
    "minor": 0,
    "currency": "GBP"
   },
   "basisPoints": 2000,
   "band": "higher",
   "validFrom": "2011-01-04"
  }
 },
 {
  "name": "no higher rate before 1 April 1997",
  "args": [
   {
    "minor": 10000,
    "currency": "GBP"
   },
   false,
   "higher",
   "1996-01-01",
   "half-up"
  ],
  "expectError": "no IPT rule for higher on 1996-01-01"
 },
 {
  "name": "no IPT before 1 October 1994",
  "args": [
   {
    "minor": 10000,
    "currency": "GBP"
   },
   false,
   "standard",
   "1994-09-30",
   "half-up"
  ],
  "expectError": "no IPT rule for standard on 1994-09-30"
 },
 {
  "name": "a malformed date is refused",
  "args": [
   {
    "minor": 10000,
    "currency": "GBP"
   },
   false,
   "standard",
   "23/09/2026",
   "half-up"
  ],
  "expectError": "onDate must be an ISO date"
 },
 {
  "name": "an unknown band is refused",
  "args": [
   {
    "minor": 10000,
    "currency": "GBP"
   },
   false,
   "reduced",
   "2026-09-23",
   "half-up"
  ],
  "expectError": "unknown IPT band"
 }
]