public static ExchangeRate getExchangeRate(@Nonnull final Cursor cursor) { final String codeId = getCurrencyCodeId(cursor); final CoinType type = CoinID.typeFromSymbol(cursor.getString(cursor.getColumnIndexOrThrow(ExchangeRatesProvider.KEY_RATE_COIN_CODE))); final Value rateCoin = Value.valueOf(type, cursor.getLong(cursor.getColumnIndexOrThrow(ExchangeRatesProvider.KEY_RATE_COIN))); final String fiatCode = cursor.getString(cursor.getColumnIndexOrThrow(ExchangeRatesProvider.KEY_RATE_FIAT_CODE)); final Value rateFiat = FiatValue.valueOf(fiatCode, cursor.getLong(cursor.getColumnIndexOrThrow(ExchangeRatesProvider.KEY_RATE_FIAT))); final String source = cursor.getString(cursor.getColumnIndexOrThrow(ExchangeRatesProvider.KEY_SOURCE)); ExchangeRateBase rate = new ExchangeRateBase(rateCoin, rateFiat); return new ExchangeRate(rate, codeId, source); }
final Value rateLocal = FiatValue.parse(localSymbol, rateStr); ExchangeRateBase rate = new ExchangeRateBase(rateCoin, rateLocal); rates.put(toSymbol, new ExchangeRate(rate, toSymbol, OPENWALLET_SOURCE)); } catch (final Exception x) {
@Test(expected = IllegalArgumentException.class) public void zeroExchangeRate() throws Exception { new ExchangeRateBase(oneBtc, LTC.value(0)); }
@Test(expected = ArithmeticException.class) public void coinToFiatTooLarge() throws Exception { ExchangeRateBase rate = new ExchangeRateBase(oneBtc, FiatValue.parse("XXX", "1000000000")); rate.convert(Value.parse(BTC, "1000000")); }
@Test(expected = IllegalArgumentException.class) public void currencyCodeMismatch() throws Exception { ExchangeRateBase rate = new ExchangeRateBase(oneBtc, FiatValue.parse("EUR", "500")); rate.convert(FiatValue.parse("USD", "1")); }
@Test(expected = ArithmeticException.class) public void coinToFiatTooSmall() throws Exception { ExchangeRateBase rate = new ExchangeRateBase(oneBtc, FiatValue.parse("XXX", "1000000000")); rate.convert(Value.parse(BTC, "-1000000")); } }
@Test public void getOtherType() throws Exception { ExchangeRateBase rate = new ExchangeRateBase(oneBtc, LTC.oneCoin().multiply(100)); assertEquals(BTC, rate.getOtherType(LTC)); assertEquals(LTC, rate.getOtherType(BTC)); }
@Test public void bigRate() throws Exception { ExchangeRateBase rate = new ExchangeRateBase(Value.parse(BTC, "0.0001"), FiatValue.parse("BYR", "5320387.3")); assertEquals("53203873000", rate.convert(oneBtc).toPlainString()); assertEquals("0", rate.convert(FiatValue.parse("BYR", "1")).toPlainString()); // Tiny value! }
@Test public void canConvert() throws Exception { ExchangeRateBase rate = new ExchangeRateBase(oneBtc, oneNbt); assertTrue(rate.canConvert(BTC, NBT)); assertTrue(rate.canConvert(NBT, BTC)); assertFalse(rate.canConvert(LTC, BTC)); assertFalse(rate.canConvert(LTC, FiatType.get("USD"))); }
@Test public void smallRate() throws Exception { ExchangeRateBase rate = new ExchangeRateBase(Value.parse(BTC, "10000"), FiatValue.parse("XXX", "0.00001")); assertEquals("0", rate.convert(oneBtc).toPlainString()); // Tiny value! assertEquals("1000000000", rate.convert(FiatValue.parse("XXX", "1")).toPlainString()); }
@Test public void zeroValues() { ExchangeRateBase rate = new ExchangeRateBase(BTC.value("1"), FiatValue.parse("XXX", "100")); assertEquals(BTC.value("0"), rate.convert(FiatValue.parse("XXX", "0"))); assertEquals(FiatValue.parse("XXX", "0"), rate.convert(BTC.value("0"))); }
@Test public void cryptoToCryptoRate() throws Exception { // 1BTC = 100LTC ExchangeRateBase rate = new ExchangeRateBase(oneBtc, LTC.oneCoin().multiply(100)); assertEquals(LTC, rate.convert(oneBtc).type); assertEquals(BTC, rate.convert(LTC.oneCoin()).type); assertEquals("1", rate.convert(oneBtc.divide(100)).toPlainString()); assertEquals("0.01", rate.convert(LTC.oneCoin()).toPlainString()); // 250NBT = 1BTC rate = new ExchangeRateBase(oneNbt.multiply(250), oneBtc); assertEquals("0.004", rate.convert(oneNbt).toPlainString()); assertEquals("2500", rate.convert(oneBtc.multiply(10)).toPlainString()); }
@Test public void cryptoToCryptoRateParseConstructor() throws Exception { // 1BTC = 100LTC ExchangeRateBase rate = new ExchangeRateBase(BTC, LTC, "100"); assertEquals(LTC, rate.convert(oneBtc).type); assertEquals(BTC, rate.convert(LTC.oneCoin()).type); assertEquals("1", rate.convert(oneBtc.divide(100)).toPlainString()); assertEquals("0.01", rate.convert(LTC.oneCoin()).toPlainString()); }
@Test public void cryptoToFiatRate() throws Exception { ExchangeRateBase rate = new ExchangeRateBase(oneBtc, FiatValue.parse("EUR", "500")); assertEquals(FiatType.get("EUR"), rate.convert(oneBtc).type); assertEquals(BTC, rate.convert(FiatValue.parse("EUR", "1")).type); assertEquals("0.5", rate.convert(oneBtc.divide(1000)).toPlainString()); assertEquals("0.002", rate.convert(FiatValue.parse("EUR", "1")).toPlainString()); }
@Test public void scalingAndRounding() throws Exception { // 1BTC = 100.1234567890NBT // This rate causes the BTC & NBT to overflow so it sets the correct scale and rounding ExchangeRateBase rate = new ExchangeRateBase(BTC, NBT, "100.1234567890"); // Check the rate's internal state assertEquals("100000", rate.value1.toPlainString()); assertEquals("10012345.6789", rate.value2.toPlainString()); // Make some conversions assertEquals("0.00998767", rate.convert(oneNbt).toPlainString()); assertEquals("0.000001", rate.convert(Value.parse(NBT, "0.0001")).toPlainString()); assertEquals("0.0001", rate.convert(Value.parse(BTC, "0.00000099")).toPlainString()); assertEquals("0.0099", rate.convert(Value.parse(BTC, "0.000099")).toPlainString()); assertEquals("10012345.6789", rate.convert(oneBtc.multiply(100000)).toPlainString()); assertEquals("1001.2346", rate.convert(oneBtc.multiply(10)).toPlainString()); assertEquals("998766.95438852", rate.convert(oneNbt.multiply(100000000)).toPlainString()); // Check too precise rates rate = new ExchangeRateBase(BTC, NBT, "100.12345678901999"); assertEquals("100000", rate.value1.toPlainString()); assertEquals("10012345.6789", rate.value2.toPlainString()); }