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