Functional Weave
Code in Python

energy.water-bill@1.0.0

vectors.json

8,328 bytes · view raw

[
  {"name": "six months, 123 m\u00b3: sewerage on 95% is exactly 29212.5p and rounds up", "args": [{"date": "2026-04-01", "value": 1000}, {"date": "2026-09-30", "value": 1123}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "GBP", "half-up"], "expect": {"cubicMetres": 123, "days": 182, "waterVolumeCharge": {"minor": 25505, "currency": "GBP"}, "sewerageVolumeCharge": {"minor": 29213, "currency": "GBP"}, "waterStandingCharge": {"minor": 1496, "currency": "GBP"}, "sewerageStandingCharge": {"minor": 1995, "currency": "GBP"}, "surfaceWaterCharge": {"minor": 2742, "currency": "GBP"}, "total": {"minor": 60951, "currency": "GBP"}}},
  {"name": "surface water that does not reach the sewer is not charged", "args": [{"date": "2026-04-01", "value": 1000}, {"date": "2026-09-30", "value": 1123}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, false, "GBP", "half-up"], "expect": {"cubicMetres": 123, "days": 182, "waterVolumeCharge": {"minor": 25505, "currency": "GBP"}, "sewerageVolumeCharge": {"minor": 29213, "currency": "GBP"}, "waterStandingCharge": {"minor": 1496, "currency": "GBP"}, "sewerageStandingCharge": {"minor": 1995, "currency": "GBP"}, "surfaceWaterCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 58209, "currency": "GBP"}}},
  {"name": "rounding down every line", "args": [{"date": "2026-04-01", "value": 1000}, {"date": "2026-09-30", "value": 1123}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "GBP", "down"], "expect": {"cubicMetres": 123, "days": 182, "waterVolumeCharge": {"minor": 25505, "currency": "GBP"}, "sewerageVolumeCharge": {"minor": 29212, "currency": "GBP"}, "waterStandingCharge": {"minor": 1495, "currency": "GBP"}, "sewerageStandingCharge": {"minor": 1994, "currency": "GBP"}, "surfaceWaterCharge": {"minor": 2742, "currency": "GBP"}, "total": {"minor": 60948, "currency": "GBP"}}},
  {"name": "a meter rolling over past 99999", "args": [{"date": "2026-01-01", "value": 99990}, {"date": "2026-01-31", "value": 10}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "GBP", "half-up"], "expect": {"cubicMetres": 20, "days": 30, "waterVolumeCharge": {"minor": 4147, "currency": "GBP"}, "sewerageVolumeCharge": {"minor": 4750, "currency": "GBP"}, "waterStandingCharge": {"minor": 247, "currency": "GBP"}, "sewerageStandingCharge": {"minor": 329, "currency": "GBP"}, "surfaceWaterCharge": {"minor": 452, "currency": "GBP"}, "total": {"minor": 9925, "currency": "GBP"}}},
  {"name": "a leap year of standing charge is 366/365 of the annual charge", "args": [{"date": "2024-01-01", "value": 500}, {"date": "2025-01-01", "value": 500}, 5, {"waterVolumeRate": 0, "sewerageVolumeRate": 0, "waterStandingCharge": 3000, "sewerageStandingCharge": 0, "surfaceWaterCharge": 0, "returnToSewer": 9500}, true, "GBP", "half-up"], "expect": {"cubicMetres": 0, "days": 366, "waterVolumeCharge": {"minor": 0, "currency": "GBP"}, "sewerageVolumeCharge": {"minor": 0, "currency": "GBP"}, "waterStandingCharge": {"minor": 3008, "currency": "GBP"}, "sewerageStandingCharge": {"minor": 0, "currency": "GBP"}, "surfaceWaterCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 3008, "currency": "GBP"}}},
  {"name": "an ordinary year of standing charges is exactly the annual charges", "args": [{"date": "2025-04-01", "value": 500}, {"date": "2026-04-01", "value": 500}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "GBP", "half-up"], "expect": {"cubicMetres": 0, "days": 365, "waterVolumeCharge": {"minor": 0, "currency": "GBP"}, "sewerageVolumeCharge": {"minor": 0, "currency": "GBP"}, "waterStandingCharge": {"minor": 3000, "currency": "GBP"}, "sewerageStandingCharge": {"minor": 4000, "currency": "GBP"}, "surfaceWaterCharge": {"minor": 5500, "currency": "GBP"}, "total": {"minor": 12500, "currency": "GBP"}}},
  {"name": "a business with no water returned to the sewer pays no sewerage volume", "args": [{"date": "2026-04-01", "value": 1000}, {"date": "2026-09-30", "value": 1123}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 0}, true, "GBP", "half-up"], "expect": {"cubicMetres": 123, "days": 182, "waterVolumeCharge": {"minor": 25505, "currency": "GBP"}, "sewerageVolumeCharge": {"minor": 0, "currency": "GBP"}, "waterStandingCharge": {"minor": 1496, "currency": "GBP"}, "sewerageStandingCharge": {"minor": 1995, "currency": "GBP"}, "surfaceWaterCharge": {"minor": 2742, "currency": "GBP"}, "total": {"minor": 31738, "currency": "GBP"}}},
  {"name": "reads on the same day with no use cost nothing", "args": [{"date": "2026-04-01", "value": 42}, {"date": "2026-04-01", "value": 42}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "GBP", "half-up"], "expect": {"cubicMetres": 0, "days": 0, "waterVolumeCharge": {"minor": 0, "currency": "GBP"}, "sewerageVolumeCharge": {"minor": 0, "currency": "GBP"}, "waterStandingCharge": {"minor": 0, "currency": "GBP"}, "sewerageStandingCharge": {"minor": 0, "currency": "GBP"}, "surfaceWaterCharge": {"minor": 0, "currency": "GBP"}, "total": {"minor": 0, "currency": "GBP"}}},
  {"name": "a closing read dated before the opening read is refused", "args": [{"date": "2026-09-30", "value": 1123}, {"date": "2026-04-01", "value": 1000}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "GBP", "half-up"], "expectError": "the closing read must not be dated before the opening read"},
  {"name": "a return to sewer over 100% is refused", "args": [{"date": "2026-04-01", "value": 1000}, {"date": "2026-09-30", "value": 1123}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 10001}, true, "GBP", "half-up"], "expectError": "returnToSewer must be basis points from 0 to 10000"},
  {"name": "a negative rate is refused", "args": [{"date": "2026-04-01", "value": 1000}, {"date": "2026-09-30", "value": 1123}, 5, {"waterVolumeRate": -1, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "GBP", "half-up"], "expectError": "waterVolumeRate must be a whole number of 0 or more"},
  {"name": "a fractional standing charge is refused", "args": [{"date": "2026-04-01", "value": 1000}, {"date": "2026-09-30", "value": 1123}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000.5, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "GBP", "half-up"], "expectError": "waterStandingCharge must be a whole number of 0 or more"},
  {"name": "a read that does not fit the register is refused", "args": [{"date": "2026-04-01", "value": 1000}, {"date": "2026-09-30", "value": 100000}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "GBP", "half-up"], "expectError": "reads must be whole numbers from 0 to 99999"},
  {"name": "a lowercase currency is refused", "args": [{"date": "2026-04-01", "value": 1000}, {"date": "2026-09-30", "value": 1123}, 5, {"waterVolumeRate": 207360, "sewerageVolumeRate": 250000, "waterStandingCharge": 3000, "sewerageStandingCharge": 4000, "surfaceWaterCharge": 5500, "returnToSewer": 9500}, true, "gbp", "half-up"], "expectError": "is not an uppercase ISO 4217 currency code"}
]