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