package com.mygeopay.core.util;
/*
* Copyright 2014 Andreas Schildbach
* Copyright 2015 John L. Jegutanis
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import com.mygeopay.core.coins.BitcoinMain;
import com.mygeopay.core.coins.CoinType;
import com.mygeopay.core.coins.FiatType;
import com.mygeopay.core.coins.FiatValue;
import com.mygeopay.core.coins.LitecoinMain;
import com.mygeopay.core.coins.NuBitsMain;
import com.mygeopay.core.coins.Value;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class ExchangeRateTest {
final CoinType BTC = BitcoinMain.get();
final CoinType LTC = LitecoinMain.get();
final CoinType NBT = NuBitsMain.get();
final Value oneBtc = BTC.oneCoin();
final Value oneNbt = NBT.oneCoin();
@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 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 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 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 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());
}
@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 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(expected = IllegalArgumentException.class)
public void zeroExchangeRate() throws Exception {
new ExchangeRateBase(oneBtc, LTC.value(0));
}
@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 coinToFiatTooLarge() throws Exception {
ExchangeRateBase rate = new ExchangeRateBase(oneBtc, FiatValue.parse("XXX", "1000000000"));
rate.convert(Value.parse(BTC, "1000000"));
}
@Test(expected = ArithmeticException.class)
public void coinToFiatTooSmall() throws Exception {
ExchangeRateBase rate = new ExchangeRateBase(oneBtc, FiatValue.parse("XXX", "1000000000"));
rate.convert(Value.parse(BTC, "-1000000"));
}
}