Functional Weave
Code in Python

dates.add-months@1.0.0

vectors.json

2,613 bytes · view raw

[
  { "name": "an ordinary mid-month date keeps its day", "args": ["2026-01-15", 1], "expect": "2026-02-15" },
  { "name": "31 January plus one month clamps to 28 February, not 3 March", "args": ["2026-01-31", 1], "expect": "2026-02-28" },
  { "name": "31 January plus one month in a leap year is 29 February", "args": ["2024-01-31", 1], "expect": "2024-02-29" },
  { "name": "31 January plus two months is 31 March: the clamp is not carried forward", "args": ["2026-01-31", 2], "expect": "2026-03-31" },
  { "name": "29 February plus twelve months is 28 February", "args": ["2024-02-29", 12], "expect": "2025-02-28" },
  { "name": "29 February plus forty-eight months lands on a leap day again", "args": ["2024-02-29", 48], "expect": "2028-02-29" },
  { "name": "31 March minus one month clamps to 28 February", "args": ["2026-03-31", -1], "expect": "2026-02-28" },
  { "name": "31 May plus one month clamps to 30 June", "args": ["2026-05-31", 1], "expect": "2026-06-30" },
  { "name": "30 April plus one month is 30 May, not the month end", "args": ["2026-04-30", 1], "expect": "2026-05-30" },
  { "name": "30 November plus three months crosses the year and clamps", "args": ["2026-11-30", 3], "expect": "2027-02-28" },
  { "name": "December plus one month rolls into January of the next year", "args": ["2026-12-15", 1], "expect": "2027-01-15" },
  { "name": "January minus one month rolls back into December", "args": ["2026-01-15", -1], "expect": "2025-12-15" },
  { "name": "minus thirteen months crosses two year boundaries", "args": ["2026-01-31", -13], "expect": "2024-12-31" },
  { "name": "zero months is the same date", "args": ["2026-09-22", 0], "expect": "2026-09-22" },
  { "name": "1900 was not a leap year, so 31 January 1900 plus one is 28 February", "args": ["1900-01-31", 1], "expect": "1900-02-28" },
  { "name": "2000 was a leap year", "args": ["2000-01-31", 1], "expect": "2000-02-29" },
  { "name": "a long mortgage term: 25 years of months", "args": ["2026-08-31", 300], "expect": "2051-08-31" },
  { "name": "the last supported month", "args": ["9999-11-30", 1], "expect": "9999-12-30" },
  { "name": "past 9999 is an error", "args": ["9999-12-01", 1], "expectError": "outside the supported range" },
  { "name": "before year 1 is an error", "args": ["0001-01-15", -1], "expectError": "outside the supported range" },
  { "name": "a fractional month count is an error", "args": ["2026-01-31", 1.5], "expectError": "months must be an integer" },
  { "name": "an impossible date is an error, not rolled forward", "args": ["2026-02-30", 1], "expectError": "is not a real calendar date" }
]