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