[ { "name": "£12,000 rent on a £200,000 flat with £3,000 costs: 6% gross, 4.5% net", "args": [ { "minor": 1200000, "currency": "GBP" }, { "minor": 300000, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 600, "netBasisPoints": 450, "netIncome": { "minor": 900000, "currency": "GBP" } } }, { "name": "no costs: net equals gross", "args": [ { "minor": 1200000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 600, "netBasisPoints": 600, "netIncome": { "minor": 1200000, "currency": "GBP" } } }, { "name": "a third rounds down: £10,000 on £300,000 is 333.33 bp", "args": [ { "minor": 1000000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 333, "netBasisPoints": 333, "netIncome": { "minor": 1000000, "currency": "GBP" } } }, { "name": "two thirds rounds up: £20,000 on £300,000 is 666.67 bp", "args": [ { "minor": 2000000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 667, "netBasisPoints": 667, "netIncome": { "minor": 2000000, "currency": "GBP" } } }, { "name": "exactly half a basis point rounds up", "args": [ { "minor": 1, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 20000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 1, "netBasisPoints": 1, "netIncome": { "minor": 1, "currency": "GBP" } } }, { "name": "costs above rent: negative net yield", "args": [ { "minor": 1200000, "currency": "GBP" }, { "minor": 1500000, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 600, "netBasisPoints": -150, "netIncome": { "minor": -300000, "currency": "GBP" } } }, { "name": "a negative half basis point rounds away from zero", "args": [ { "minor": 0, "currency": "GBP" }, { "minor": 1, "currency": "GBP" }, { "minor": 20000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 0, "netBasisPoints": -1, "netIncome": { "minor": -1, "currency": "GBP" } } }, { "name": "zero rent", "args": [ { "minor": 0, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 0, "netBasisPoints": 0, "netIncome": { "minor": 0, "currency": "GBP" } } }, { "name": "rent equal to the value is 100%", "args": [ { "minor": 5000000, "currency": "GBP" }, { "minor": 5000000, "currency": "GBP" }, { "minor": 5000000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 10000, "netBasisPoints": 0, "netIncome": { "minor": 0, "currency": "GBP" } } }, { "name": "high-yield HMO: £38,400 rent, £9,600 costs, £320,000 value", "args": [ { "minor": 3840000, "currency": "GBP" }, { "minor": 960000, "currency": "GBP" }, { "minor": 32000000, "currency": "GBP" } ], "expect": { "grossBasisPoints": 1200, "netBasisPoints": 900, "netIncome": { "minor": 2880000, "currency": "GBP" } } }, { "name": "mixed currencies are refused", "args": [ { "minor": 1200000, "currency": "EUR" }, { "minor": 0, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" } ], "expectError": "currency mismatch" }, { "name": "a zero value is refused", "args": [ { "minor": 1200000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 0, "currency": "GBP" } ], "expectError": "propertyValue must be greater than zero" }, { "name": "a negative rent is refused", "args": [ { "minor": -1, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" } ], "expectError": "annualRent must not be negative" }, { "name": "negative costs are refused", "args": [ { "minor": 100, "currency": "GBP" }, { "minor": -1, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" } ], "expectError": "annualCosts must not be negative" } ]