[ { "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" } ]