[ { "name": "\u00a3225,000 on a \u00a3300,000 house is exactly 75%", "args": [ { "minor": 22500000, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expect": { "basisPoints": 7500, "band": "75% LTV" } }, { "name": "a penny over 75% is the 85% band", "args": [ { "minor": 22500001, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expect": { "basisPoints": 7501, "band": "85% LTV" } }, { "name": "\u00a3180,000 on \u00a3300,000 is exactly 60%", "args": [ { "minor": 18000000, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expect": { "basisPoints": 6000, "band": "60% LTV" } }, { "name": "a small loan is in the lowest band", "args": [ { "minor": 5000000, "currency": "GBP" }, { "minor": 40000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expect": { "basisPoints": 1250, "band": "60% LTV" } }, { "name": "a ratio with a fraction of a basis point rounds up", "args": [ { "minor": 10000000, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expect": { "basisPoints": 3334, "band": "60% LTV" } }, { "name": "95% exactly", "args": [ { "minor": 28500000, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expect": { "basisPoints": 9500, "band": "95% LTV" } }, { "name": "above the top band has no band", "args": [ { "minor": 29000000, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expect": { "basisPoints": 9667, "band": null } }, { "name": "negative equity: more than 100%", "args": [ { "minor": 33000000, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expect": { "basisPoints": 11000, "band": null } }, { "name": "a zero loan is 0%", "args": [ { "minor": 0, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expect": { "basisPoints": 0, "band": "60% LTV" } }, { "name": "one band table", "args": [ { "minor": 9000000, "currency": "GBP" }, { "minor": 10000000, "currency": "GBP" }, [ { "maxBasisPoints": 10000, "label": "all" } ] ], "expect": { "basisPoints": 9000, "band": "all" } }, { "name": "a zero value is refused", "args": [ { "minor": 100, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expectError": "propertyValue must be greater than zero" }, { "name": "a negative loan is refused", "args": [ { "minor": -1, "currency": "GBP" }, { "minor": 100, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expectError": "loan must not be negative" }, { "name": "an empty band table is refused", "args": [ { "minor": 100, "currency": "GBP" }, { "minor": 1000, "currency": "GBP" }, [] ], "expectError": "bands must not be empty" }, { "name": "bands out of order are refused", "args": [ { "minor": 100, "currency": "GBP" }, { "minor": 1000, "currency": "GBP" }, [ { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 6000, "label": "60% LTV" } ] ], "expectError": "strictly ascending" }, { "name": "a zero ceiling is refused", "args": [ { "minor": 100, "currency": "GBP" }, { "minor": 1000, "currency": "GBP" }, [ { "maxBasisPoints": 0, "label": "x" } ] ], "expectError": "band ceilings must be whole basis points" }, { "name": "mixed currencies are refused", "args": [ { "minor": 100, "currency": "GBP" }, { "minor": 1000, "currency": "EUR" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expectError": "currency mismatch" }, { "name": "a loan beyond exact arithmetic is refused", "args": [ { "minor": 900719925475, "currency": "GBP" }, { "minor": 1000000000000, "currency": "GBP" }, [ { "maxBasisPoints": 6000, "label": "60% LTV" }, { "maxBasisPoints": 7500, "label": "75% LTV" }, { "maxBasisPoints": 8500, "label": "85% LTV" }, { "maxBasisPoints": 9000, "label": "90% LTV" }, { "maxBasisPoints": 9500, "label": "95% LTV" } ] ], "expectError": "loan must be at most" } ]