[
{
"name": "100.00 GBP at 1.1734 is 117.34 EUR",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 11734,
"denominator": 10000
}
},
"half-up"
],
"expect": {
"minor": 11734,
"currency": "EUR"
}
},
{
"name": "12.34 GBP at 1.1734 is 14.479756 EUR, rounded half-up",
"args": [
{
"minor": 1234,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 11734,
"denominator": 10000
}
},
"half-up"
],
"expect": {
"minor": 1448,
"currency": "EUR"
}
},
{
"name": "the same rounded down",
"args": [
{
"minor": 1234,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 11734,
"denominator": 10000
}
},
"down"
],
"expect": {
"minor": 1447,
"currency": "EUR"
}
},
{
"name": "a refund converts symmetrically",
"args": [
{
"minor": -1234,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 11734,
"denominator": 10000
}
},
"half-up"
],
"expect": {
"minor": -1448,
"currency": "EUR"
}
},
{
"name": "pounds to yen: 10.00 at 190.12 is 1,901 yen, not 190,120",
"args": [
{
"minor": 1000,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "JPY",
"rate": {
"numerator": 19012,
"denominator": 100
}
},
"half-up"
],
"expect": {
"minor": 1901,
"currency": "JPY"
}
},
{
"name": "yen back to pounds at the exact reciprocal",
"args": [
{
"minor": 1901,
"currency": "JPY"
},
{
"base": "JPY",
"quote": "GBP",
"rate": {
"numerator": 100,
"denominator": 19012
}
},
"half-up"
],
"expect": {
"minor": 1000,
"currency": "GBP"
}
},
{
"name": "pounds to Kuwaiti dinar, three decimal places",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "KWD",
"rate": {
"numerator": 3812,
"denominator": 10000
}
},
"half-up"
],
"expect": {
"minor": 38120,
"currency": "KWD"
}
},
{
"name": "1.005 exactly rounds up where a float gives 100.49999999999999",
"args": [
{
"minor": 100,
"currency": "EUR"
},
{
"base": "EUR",
"quote": "USD",
"rate": {
"numerator": 1005,
"denominator": 1000
}
},
"half-up"
],
"expect": {
"minor": 101,
"currency": "USD"
}
},
{
"name": "half a cent rounds up under half-up",
"args": [
{
"minor": 5,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 1,
"denominator": 2
}
},
"half-up"
],
"expect": {
"minor": 3,
"currency": "EUR"
}
},
{
"name": "half a cent rounds to even under half-even",
"args": [
{
"minor": 5,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 1,
"denominator": 2
}
},
"half-even"
],
"expect": {
"minor": 2,
"currency": "EUR"
}
},
{
"name": "an unreduced rate is read as its value",
"args": [
{
"minor": 10000,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 23468,
"denominator": 20000
}
},
"half-up"
],
"expect": {
"minor": 11734,
"currency": "EUR"
}
},
{
"name": "zero converts to zero",
"args": [
{
"minor": 0,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 11734,
"denominator": 10000
}
},
"half-up"
],
"expect": {
"minor": 0,
"currency": "EUR"
}
},
{
"name": "a same-currency rate of one is the identity",
"args": [
{
"minor": 4321,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "GBP",
"rate": {
"numerator": 1,
"denominator": 1
}
},
"half-up"
],
"expect": {
"minor": 4321,
"currency": "GBP"
}
},
{
"name": "a GBP to EUR rate on a USD amount is an error",
"args": [
{
"minor": 1000,
"currency": "USD"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 11734,
"denominator": 10000
}
},
"half-up"
],
"expectError": "exchange rate converts GBP to EUR, not USD"
},
{
"name": "a zero rate is an error",
"args": [
{
"minor": 1000,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 0,
"denominator": 1
}
},
"half-up"
],
"expectError": "exchange rate must be positive"
},
{
"name": "a negative rate is an error",
"args": [
{
"minor": 1000,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": -11734,
"denominator": 10000
}
},
"half-up"
],
"expectError": "exchange rate must be positive"
},
{
"name": "a zero denominator is an error",
"args": [
{
"minor": 1000,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 1,
"denominator": 0
}
},
"half-up"
],
"expectError": "denominator must not be zero"
},
{
"name": "gold has no minor unit to convert into",
"args": [
{
"minor": 1000,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "XAU",
"rate": {
"numerator": 1,
"denominator": 3000
}
},
"half-up"
],
"expectError": "no ISO 4217 minor unit"
},
{
"name": "a product too large to hold exactly is refused",
"args": [
{
"minor": 9007199254740991,
"currency": "GBP"
},
{
"base": "GBP",
"quote": "EUR",
"rate": {
"numerator": 3,
"denominator": 2
}
},
"half-up"
],
"expectError": "rational overflow"
}
]