[ { "name": "5% on 100,000.00 before practical completion: all 5,000.00 held", "args": [ { "minor": 10000000, "currency": "GBP" }, 500, "interim" ], "expect": { "full": { "minor": 500000, "currency": "GBP" }, "held": { "minor": 500000, "currency": "GBP" }, "released": { "minor": 0, "currency": "GBP" } } }, { "name": "at practical completion half is released", "args": [ { "minor": 10000000, "currency": "GBP" }, 500, "practical-completion" ], "expect": { "full": { "minor": 500000, "currency": "GBP" }, "held": { "minor": 250000, "currency": "GBP" }, "released": { "minor": 250000, "currency": "GBP" } } }, { "name": "after the defects are made good the rest is released", "args": [ { "minor": 10000000, "currency": "GBP" }, 500, "final" ], "expect": { "full": { "minor": 500000, "currency": "GBP" }, "held": { "minor": 0, "currency": "GBP" }, "released": { "minor": 500000, "currency": "GBP" } } }, { "name": "3% on 12,345.67 is 370.37... so 370.37 held", "args": [ { "minor": 1234567, "currency": "GBP" }, 300, "interim" ], "expect": { "full": { "minor": 37037, "currency": "GBP" }, "held": { "minor": 37037, "currency": "GBP" }, "released": { "minor": 0, "currency": "GBP" } } }, { "name": "3% on 12,345.67 at practical completion: 1.5% is 185.185... so 185.19 held", "args": [ { "minor": 1234567, "currency": "GBP" }, 300, "practical-completion" ], "expect": { "full": { "minor": 37037, "currency": "GBP" }, "held": { "minor": 18519, "currency": "GBP" }, "released": { "minor": 18518, "currency": "GBP" } } }, { "name": "half the percentage, not half the rounded retention: 5% of 10,000.10 is 500.005 (500.01), 2.5% is 250.0025 (250.00)", "args": [ { "minor": 1000010, "currency": "GBP" }, 500, "practical-completion" ], "expect": { "full": { "minor": 50001, "currency": "GBP" }, "held": { "minor": 25000, "currency": "GBP" }, "released": { "minor": 25001, "currency": "GBP" } } }, { "name": "the full retention on the same value rounds half up", "args": [ { "minor": 1000010, "currency": "GBP" }, 500, "interim" ], "expect": { "full": { "minor": 50001, "currency": "GBP" }, "held": { "minor": 50001, "currency": "GBP" }, "released": { "minor": 0, "currency": "GBP" } } }, { "name": "no retention agreed", "args": [ { "minor": 10000000, "currency": "GBP" }, 0, "interim" ], "expect": { "full": { "minor": 0, "currency": "GBP" }, "held": { "minor": 0, "currency": "GBP" }, "released": { "minor": 0, "currency": "GBP" } } }, { "name": "nothing certified yet", "args": [ { "minor": 0, "currency": "GBP" }, 500, "interim" ], "expect": { "full": { "minor": 0, "currency": "GBP" }, "held": { "minor": 0, "currency": "GBP" }, "released": { "minor": 0, "currency": "GBP" } } }, { "name": "100% retention holds the whole value", "args": [ { "minor": 12345, "currency": "GBP" }, 10000, "interim" ], "expect": { "full": { "minor": 12345, "currency": "GBP" }, "held": { "minor": 12345, "currency": "GBP" }, "released": { "minor": 0, "currency": "GBP" } } }, { "name": "the currency is carried through", "args": [ { "minor": 777700, "currency": "EUR" }, 300, "practical-completion" ], "expect": { "full": { "minor": 23331, "currency": "EUR" }, "held": { "minor": 11666, "currency": "EUR" }, "released": { "minor": 11665, "currency": "EUR" } } }, { "name": "a negative value", "args": [ { "minor": -1, "currency": "GBP" }, 500, "interim" ], "expectError": "cumulativeValue must not be negative" }, { "name": "a percentage above 100", "args": [ { "minor": 100, "currency": "GBP" }, 10001, "interim" ], "expectError": "basisPoints must be a whole number from 0 to 10000" }, { "name": "a negative percentage", "args": [ { "minor": 100, "currency": "GBP" }, -1, "interim" ], "expectError": "basisPoints must be a whole number from 0 to 10000" }, { "name": "a fractional percentage", "args": [ { "minor": 100, "currency": "GBP" }, 2.5, "interim" ], "expectError": "basisPoints must be a whole number from 0 to 10000" }, { "name": "an unknown stage", "args": [ { "minor": 100, "currency": "GBP" }, 500, "retained" ], "expectError": "unknown retention stage \"retained\"" }, { "name": "a value too large to multiply exactly", "args": [ { "minor": 1000000000000, "currency": "GBP" }, 10000, "interim" ], "expectError": "exceeds 2^53 - 1" } ]