[
{
"name": "doubling over ten years is 7.18% a year (7.1773...%)",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
10,
1
],
"expect": 718
},
{
"name": "121 from 100 over two years is exactly 10%",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 12100,
"currency": "GBP"
},
2,
1
],
"expect": 1000
},
{
"name": "one year is the simple return",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 10725,
"currency": "GBP"
},
1,
1
],
"expect": 725
},
{
"name": "18 months as 3/2 years: 1.21^(2/3) - 1 = 13.55%",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 12100,
"currency": "GBP"
},
3,
2
],
"expect": 1355
},
{
"name": "six months of 5% annualises to 10.25%, not 10%",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 10500,
"currency": "GBP"
},
1,
2
],
"expect": 1025
},
{
"name": "one month of 1% compounds to 12.68% a year",
"args": [
{
"minor": 100,
"currency": "GBP"
},
{
"minor": 101,
"currency": "GBP"
},
1,
12
],
"expect": 1268
},
{
"name": "30 days as 30/365 years",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 10100,
"currency": "GBP"
},
30,
365
],
"expect": 1287
},
{
"name": "halving over five years is -12.94% a year",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 5000,
"currency": "GBP"
},
5,
1
],
"expect": -1294
},
{
"name": "a total loss is -100% whatever the period",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
7,
1
],
"expect": -10000
},
{
"name": "no change is zero",
"args": [
{
"minor": 55555,
"currency": "GBP"
},
{
"minor": 55555,
"currency": "GBP"
},
3,
1
],
"expect": 0
},
{
"name": "exactly +0.5 bp rounds away from zero to 1",
"args": [
{
"minor": 1000000,
"currency": "GBP"
},
{
"minor": 1000050,
"currency": "GBP"
},
1,
1
],
"expect": 1
},
{
"name": "exactly -0.5 bp rounds away from zero to -1",
"args": [
{
"minor": 1000000,
"currency": "GBP"
},
{
"minor": 999950,
"currency": "GBP"
},
1,
1
],
"expect": -1
},
{
"name": "a third up in a year: 33.33% (repeating ratio)",
"args": [
{
"minor": 300,
"currency": "GBP"
},
{
"minor": 400,
"currency": "GBP"
},
1,
1
],
"expect": 3333
},
{
"name": "seven-year growth from awkward amounts",
"args": [
{
"minor": 12345678,
"currency": "GBP"
},
{
"minor": 98765432,
"currency": "GBP"
},
7,
1
],
"expect": 3459
},
{
"name": "works in any currency, yen included",
"args": [
{
"minor": 1000000,
"currency": "JPY"
},
{
"minor": 2000000,
"currency": "JPY"
},
10,
1
],
"expect": 718
},
{
"name": "a start of zero is an error",
"args": [
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 100,
"currency": "GBP"
},
1,
1
],
"expectError": "startValue must be greater than zero"
},
{
"name": "a negative end value is an error",
"args": [
{
"minor": 100,
"currency": "GBP"
},
{
"minor": -1,
"currency": "GBP"
},
1,
1
],
"expectError": "endValue must not be negative"
},
{
"name": "mixed currencies are an error",
"args": [
{
"minor": 100,
"currency": "GBP"
},
{
"minor": 200,
"currency": "EUR"
},
1,
1
],
"expectError": "currency mismatch"
},
{
"name": "zero years is an error",
"args": [
{
"minor": 100,
"currency": "GBP"
},
{
"minor": 200,
"currency": "GBP"
},
0,
1
],
"expectError": "yearsNumerator must be a whole number from 1 to 100000"
},
{
"name": "a zero denominator is an error",
"args": [
{
"minor": 100,
"currency": "GBP"
},
{
"minor": 200,
"currency": "GBP"
},
1,
0
],
"expectError": "yearsDenominator must be a whole number from 1 to 100000"
},
{
"name": "a fractional number of years must be written as a fraction",
"args": [
{
"minor": 100,
"currency": "GBP"
},
{
"minor": 200,
"currency": "GBP"
},
1.5,
1
],
"expectError": "yearsNumerator must be a whole number from 1 to 100000"
},
{
"name": "fractional minor units are refused",
"args": [
{
"minor": 100.5,
"currency": "GBP"
},
{
"minor": 200,
"currency": "GBP"
},
1,
1
],
"expectError": "amounts must be whole minor units"
}
]