Functional Weave
Code in Python

property.rental-yield@1.0.1

vectors.json

4,832 bytes · view raw

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