/** * Copyright 2012 multibit.org * * Licensed under the MIT license (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://opensource.org/licenses/mit-license.php * * 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. */ package org.multibit.exchange; import java.io.IOException; import java.math.BigDecimal; import java.util.Locale; import java.util.Map; import junit.framework.TestCase; import org.joda.money.CurrencyUnit; import org.joda.money.Money; import org.junit.Test; import org.multibit.CreateControllers; import org.multibit.Localiser; import org.multibit.controller.core.CoreController; import org.multibit.controller.bitcoin.BitcoinController; import org.multibit.model.bitcoin.BitcoinModel; import org.multibit.model.exchange.ExchangeModel; public class CurrencyConverterTest extends TestCase { @Test public void testBasic() throws IOException { // Create MultiBit controller. final CreateControllers.Controllers controllers = CreateControllers.createControllers(); final BitcoinController controller = controllers.bitcoinController; // set the default currency to USD controller.getModel().setUserPreference(ExchangeModel.TICKER_FIRST_ROW_CURRENCY, "USD"); CurrencyConverter converter = CurrencyConverter.INSTANCE; assertNotNull(converter); // Initialise - will pick up currency of interest. converter.initialise(controller); // Default currency should be USD assertEquals("Wrong default currency.1", CurrencyUnit.of("USD"), converter.getCurrencyUnit()); // Initialise to CAD. controller.getModel().setUserPreference(ExchangeModel.TICKER_FIRST_ROW_CURRENCY, "CAD"); converter.initialise(controller); // Default currency should be CAD assertEquals("Wrong default currency.2", CurrencyUnit.of("CAD"), converter.getCurrencyUnit()); // Set and get the exchange rate assertNull("Exchange rate was not initially null", converter.getRate()); converter.setRate(BigDecimal.valueOf(5.0)); assertEquals("Rate not set", BigDecimal.valueOf(5.0), converter.getRate()); } @Test public void testConvert() throws Exception { // Create MultiBit controller. final CreateControllers.Controllers controllers = CreateControllers.createControllers(); final BitcoinController controller = controllers.bitcoinController; CurrencyConverter converter = CurrencyConverter.INSTANCE; // Initialise - will pick up currency of interest. converter.initialise(controller); converter.setCurrencyUnit(CurrencyUnit.of("USD")); converter.setRate(BigDecimal.valueOf(5.0)); Money converted = converter.convertFromBTCToFiat(CurrencyConverter.NUMBER_OF_SATOSHI_IN_ONE_BITCOIN); // 1 bitcoin assertNotNull(converted); assertEquals("Wrong currency", "USD", converted.getCurrencyUnit().getCurrencyCode()); assertEquals("Wrong amount", "5.00", converted.getAmount().toString()); String result = converter.getFiatAsLocalisedString(converted); assertEquals("Wrong result after formatting", "$5.00", result); } @Test public void testFormatter() throws Exception { // Create MultiBit controller. final CreateControllers.Controllers controllers = CreateControllers.createControllers(); final BitcoinController controller = controllers.bitcoinController; CurrencyConverter converter = CurrencyConverter.INSTANCE; converter.initialise(controller, "GBP"); String result = converter.getFiatAsLocalisedString(Money.parse("GBP 1.23")); assertEquals("Wrong GBP formatting", "\u00A31.23", result); converter.initialise(controller, "EUR"); result = converter.getFiatAsLocalisedString(Money.parse("EUR 1.23")); assertEquals("Wrong EURO formatting", "\u20AC1.23", result); } @Test public void testGetBTCAsLocalisedStringEnglish() throws Exception { // Create MultiBit controller. final CreateControllers.Controllers controllers = CreateControllers.createControllers(new Localiser(Locale.ENGLISH)); final BitcoinController controller = controllers.bitcoinController; CurrencyConverter converter = CurrencyConverter.INSTANCE; converter.initialise(controller, "GBP"); BigDecimal testBTCAmount = BigDecimal.valueOf(123456789L); String result = converter.getBTCAsLocalisedString(Money.of(CurrencyConverter.INSTANCE.BITCOIN_CURRENCY_UNIT, testBTCAmount)); assertEquals("Wrong BTC localised value.1", "1.23456789", result); CurrencyConverterResult converterResult = CurrencyConverter.INSTANCE.parseToBTC(result); assertNotNull(converterResult); assertEquals(testBTCAmount, converterResult.getBtcMoney().getAmount()); testBTCAmount = BigDecimal.valueOf(1234567890123L); result = converter.getBTCAsLocalisedString(Money.of(CurrencyConverter.INSTANCE.BITCOIN_CURRENCY_UNIT, testBTCAmount)); assertEquals("Wrong BTC localised value.2", "12,345.67890123", result); converterResult = CurrencyConverter.INSTANCE.parseToBTC(result); assertNotNull(converterResult); assertEquals(testBTCAmount, converterResult.getBtcMoney().getAmount()); } @Test public void testGetBTCAsLocalisedStringGerman() throws Exception { // Create MultiBit controller. final CreateControllers.Controllers controllers = CreateControllers.createControllers(new Localiser(Locale.GERMAN)); final BitcoinController controller = controllers.bitcoinController; CurrencyConverter converter = CurrencyConverter.INSTANCE; converter.initialise(controller, "EUR"); BigDecimal testBTCAmount = BigDecimal.valueOf(123456789L); String result = converter.getBTCAsLocalisedString(Money.of(CurrencyConverter.INSTANCE.BITCOIN_CURRENCY_UNIT, testBTCAmount)); assertEquals("Wrong BTC localised value.1", "1,23456789", result); CurrencyConverterResult converterResult = CurrencyConverter.INSTANCE.parseToBTC(result); assertNotNull(converterResult); assertEquals(testBTCAmount, converterResult.getBtcMoney().getAmount()); testBTCAmount = BigDecimal.valueOf(1234567890123L); result = converter.getBTCAsLocalisedString(Money.of(CurrencyConverter.INSTANCE.BITCOIN_CURRENCY_UNIT, testBTCAmount)); assertEquals("Wrong BTC localised value.2", "12.345,67890123", result); converterResult = CurrencyConverter.INSTANCE.parseToBTC(result); assertNotNull(converterResult); assertEquals(testBTCAmount, converterResult.getBtcMoney().getAmount()); } @Test public void testGetBTCAsLocalisedStringFrench() throws Exception { // Create MultiBit controller. final CreateControllers.Controllers controllers = CreateControllers.createControllers(new Localiser(Locale.FRENCH)); final BitcoinController controller = controllers.bitcoinController; CurrencyConverter converter = CurrencyConverter.INSTANCE; converter.initialise(controller, "EUR"); BigDecimal testBTCAmount = BigDecimal.valueOf(123456789L); String result = converter.getBTCAsLocalisedString(Money.of(CurrencyConverter.INSTANCE.BITCOIN_CURRENCY_UNIT, testBTCAmount)); assertEquals("Wrong BTC localised value.1", "1,23456789", result); CurrencyConverterResult converterResult = CurrencyConverter.INSTANCE.parseToBTC(result); assertNotNull(converterResult); assertEquals(testBTCAmount, converterResult.getBtcMoney().getAmount()); testBTCAmount = BigDecimal.valueOf(1234567890123L); result = converter.getBTCAsLocalisedString(Money.of(CurrencyConverter.INSTANCE.BITCOIN_CURRENCY_UNIT, testBTCAmount)); assertEquals("Wrong BTC localised value.2", "12\u00A0345,67890123", result); converterResult = CurrencyConverter.INSTANCE.parseToBTC(result); assertNotNull(converterResult); assertEquals(testBTCAmount, converterResult.getBtcMoney().getAmount()); converterResult = CurrencyConverter.INSTANCE.parseToBTC(result); assertNotNull(converterResult); assertEquals(testBTCAmount, converterResult.getBtcMoney().getAmount()); } @Test public void testAllCurrencies() throws Exception { // Create MultiBit controller. final CreateControllers.Controllers controllers = CreateControllers.createControllers(new Localiser(Locale.FRENCH)); final BitcoinController controller = controllers.bitcoinController; CurrencyConverter converter = CurrencyConverter.INSTANCE; BigDecimal testBTCAmount = BigDecimal.valueOf(123456789L); // Cycle through all the currencies, making sure they all initialise Map<String, String> currencyCodeToDescriptionMap = converter.getCurrencyCodeToDescriptionMap(); for (String currencyCode : currencyCodeToDescriptionMap.keySet()) { converter.initialise(controller, currencyCode); String result = converter.getBTCAsLocalisedString(Money.of(CurrencyConverter.INSTANCE.BITCOIN_CURRENCY_UNIT, testBTCAmount)); CurrencyConverterResult currencyConverterResult = converter.convertFromFiatToBTC("1.0"); } } }