Functional Weave
Code in Rust

property.rent-proration@1.0.1

vectors.json

5,186 bytes · view raw

[
 {
  "name": "£1,000 a month, 1-15 January, annual-daily: 15 × £1,000 × 12 ÷ 365 = £493.15",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2025-01-01",
   "2025-01-15",
   "annual-daily"
  ],
  "expect": {
   "minor": 49315,
   "currency": "GBP"
  }
 },
 {
  "name": "the same days by calendar month: 15/31 of £1,000 = £483.87",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2025-01-01",
   "2025-01-15",
   "calendar-month"
  ],
  "expect": {
   "minor": 48387,
   "currency": "GBP"
  }
 },
 {
  "name": "one day, annual-daily: £32.88",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2025-03-10",
   "2025-03-10",
   "annual-daily"
  ],
  "expect": {
   "minor": 3288,
   "currency": "GBP"
  }
 },
 {
  "name": "14 days of a leap February by calendar month: 14/29",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2024-02-01",
   "2024-02-14",
   "calendar-month"
  ],
  "expect": {
   "minor": 48276,
   "currency": "GBP"
  }
 },
 {
  "name": "14 days of a common February by calendar month: exactly half",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2023-02-01",
   "2023-02-14",
   "calendar-month"
  ],
  "expect": {
   "minor": 50000,
   "currency": "GBP"
  }
 },
 {
  "name": "a whole calendar month is exactly the monthly rent",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2023-02-01",
   "2023-02-28",
   "calendar-month"
  ],
  "expect": {
   "minor": 100000,
   "currency": "GBP"
  }
 },
 {
  "name": "a whole February annual-daily is 28/365 of a year, not a month",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2023-02-01",
   "2023-02-28",
   "annual-daily"
  ],
  "expect": {
   "minor": 92055,
   "currency": "GBP"
  }
 },
 {
  "name": "20 January to 10 February by calendar month: 12/31 + 10/28, rounded once",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2023-01-20",
   "2023-02-10",
   "calendar-month"
  ],
  "expect": {
   "minor": 74424,
   "currency": "GBP"
  }
 },
 {
  "name": "20 January to 10 February annual-daily: 22 days",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2023-01-20",
   "2023-02-10",
   "annual-daily"
  ],
  "expect": {
   "minor": 72329,
   "currency": "GBP"
  }
 },
 {
  "name": "across a year end by calendar month: 1/31 + 1/31",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2024-12-31",
   "2025-01-01",
   "calendar-month"
  ],
  "expect": {
   "minor": 6452,
   "currency": "GBP"
  }
 },
 {
  "name": "an exact half penny rounds up: £1,000.01 for 15 of April's 30 days",
  "args": [
   {
    "minor": 100001,
    "currency": "GBP"
   },
   "2025-04-01",
   "2025-04-15",
   "calendar-month"
  ],
  "expect": {
   "minor": 50001,
   "currency": "GBP"
  }
 },
 {
  "name": "a credit rounds symmetrically",
  "args": [
   {
    "minor": -100000,
    "currency": "GBP"
   },
   "2025-01-01",
   "2025-01-15",
   "calendar-month"
  ],
  "expect": {
   "minor": -48387,
   "currency": "GBP"
  }
 },
 {
  "name": "a whole leap year by calendar month is twelve months' rent",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2024-01-01",
   "2024-12-31",
   "calendar-month"
  ],
  "expect": {
   "minor": 1200000,
   "currency": "GBP"
  }
 },
 {
  "name": "a whole leap year annual-daily is 366/365 of a year",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2024-01-01",
   "2024-12-31",
   "annual-daily"
  ],
  "expect": {
   "minor": 1203288,
   "currency": "GBP"
  }
 },
 {
  "name": "zero rent",
  "args": [
   {
    "minor": 0,
    "currency": "GBP"
   },
   "2025-01-01",
   "2025-01-15",
   "annual-daily"
  ],
  "expect": {
   "minor": 0,
   "currency": "GBP"
  }
 },
 {
  "name": "the currency is kept",
  "args": [
   {
    "minor": 100000,
    "currency": "EUR"
   },
   "2025-01-01",
   "2025-01-15",
   "calendar-month"
  ],
  "expect": {
   "minor": 48387,
   "currency": "EUR"
  }
 },
 {
  "name": "an end before the start is refused",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2025-01-15",
   "2025-01-14",
   "annual-daily"
  ],
  "expectError": "toDate 2025-01-14 is before fromDate 2025-01-15"
 },
 {
  "name": "more than 366 days is refused",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2024-01-01",
   "2025-01-01",
   "calendar-month"
  ],
  "expectError": "the period must be at most 366 days"
 },
 {
  "name": "an unknown method is refused",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2025-01-01",
   "2025-01-15",
   "30-360"
  ],
  "expectError": "unknown method"
 },
 {
  "name": "a date that does not exist is refused",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "2023-02-01",
   "2023-02-30",
   "calendar-month"
  ],
  "expectError": "is not a real calendar date"
 },
 {
  "name": "a rent beyond the exact range is refused",
  "args": [
   {
    "minor": 1000000001,
    "currency": "GBP"
   },
   "2025-01-01",
   "2025-01-15",
   "annual-daily"
  ],
  "expectError": "monthlyRent must be at most"
 }
]