/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.basics.currency; import static com.opengamma.strata.collect.TestHelper.assertJodaConvert; import static com.opengamma.strata.collect.TestHelper.assertSerialization; import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * Test {@link CurrencyAmount}. */ @Test public class CurrencyAmountTest { private static final Currency CCY1 = Currency.AUD; private static final Currency CCY2 = Currency.CAD; private static final double AMT1 = 100; private static final double AMT2 = 200; private static final CurrencyAmount CCY_AMOUNT = CurrencyAmount.of(CCY1, AMT1); private static final CurrencyAmount CCY_AMOUNT_NEGATIVE = CurrencyAmount.of(CCY1, -AMT1); public void test_fixture() { assertEquals(CCY_AMOUNT.getCurrency(), CCY1); assertEquals(CCY_AMOUNT.getAmount(), AMT1, 0); } //------------------------------------------------------------------------- public void test_zero_Currency() { CurrencyAmount test = CurrencyAmount.zero(Currency.USD); assertEquals(test.getCurrency(), Currency.USD); assertEquals(test.getAmount(), 0d, 0); } public void test_zero_Currency_nullCurrency() { assertThrowsIllegalArg(() -> CurrencyAmount.zero(null)); } //------------------------------------------------------------------------- public void test_of_Currency() { CurrencyAmount test = CurrencyAmount.of(Currency.USD, AMT1); assertEquals(test.getCurrency(), Currency.USD); assertEquals(test.getAmount(), AMT1, 0); } public void test_of_Currency_nullCurrency() { assertThrowsIllegalArg(() -> CurrencyAmount.of((Currency) null, AMT1)); } //------------------------------------------------------------------------- public void test_of_String() { CurrencyAmount test = CurrencyAmount.of("USD", AMT1); assertEquals(test.getCurrency(), Currency.USD); assertEquals(test.getAmount(), AMT1, 0); } public void test_of_String_nullCurrency() { assertThrowsIllegalArg(() -> CurrencyAmount.of((String) null, AMT1)); } //------------------------------------------------------------------------- @Test public void test_parse_String_roundTrip() { assertEquals(CurrencyAmount.parse(CCY_AMOUNT.toString()), CCY_AMOUNT); } @DataProvider(name = "parseGood") Object[][] data_parseGood() { return new Object[][] { {"AUD 100.001", Currency.AUD, 100.001d}, {"AUD 321.123", Currency.AUD, 321.123d}, {"AUD 123", Currency.AUD, 123d}, {"GBP 0", Currency.GBP, 0d}, {"USD -0", Currency.USD, -0d}, {"EUR -0.01", Currency.EUR, -0.01d}, }; } @Test(dataProvider = "parseGood") public void test_parse_String_good(String input, Currency currency, double amount) { assertEquals(CurrencyAmount.parse(input), CurrencyAmount.of(currency, amount)); } @DataProvider(name = "parseBad") Object[][] data_parseBad() { return new Object[][] { {"AUD"}, {"AUD aa"}, {"AUD -.+-"}, {"123"}, {null}, }; } @Test(dataProvider = "parseBad") public void test_parse_String_bad(String input) { assertThrowsIllegalArg(() -> CurrencyAmount.parse(input)); } //------------------------------------------------------------------------- public void test_plus_CurrencyAmount() { CurrencyAmount ccyAmount = CurrencyAmount.of(CCY1, AMT2); CurrencyAmount test = CCY_AMOUNT.plus(ccyAmount); assertEquals(test, CurrencyAmount.of(CCY1, AMT1 + AMT2)); } public void test_plus_CurrencyAmount_null() { assertThrowsIllegalArg(() -> CCY_AMOUNT.plus(null)); } public void test_plus_CurrencyAmount_wrongCurrency() { assertThrowsIllegalArg(() -> CCY_AMOUNT.plus(CurrencyAmount.of(CCY2, AMT2))); } public void test_plus_double() { CurrencyAmount test = CCY_AMOUNT.plus(AMT2); assertEquals(test, CurrencyAmount.of(CCY1, AMT1 + AMT2)); } //------------------------------------------------------------------------- public void test_minus_CurrencyAmount() { CurrencyAmount ccyAmount = CurrencyAmount.of(CCY1, AMT2); CurrencyAmount test = CCY_AMOUNT.minus(ccyAmount); assertEquals(test, CurrencyAmount.of(CCY1, AMT1 - AMT2)); } public void test_minus_CurrencyAmount_null() { assertThrowsIllegalArg(() -> CCY_AMOUNT.minus(null)); } public void test_minus_CurrencyAmount_wrongCurrency() { assertThrowsIllegalArg(() -> CCY_AMOUNT.minus(CurrencyAmount.of(CCY2, AMT2))); } public void test_minus_double() { CurrencyAmount test = CCY_AMOUNT.minus(AMT2); assertEquals(test, CurrencyAmount.of(CCY1, AMT1 - AMT2)); } //------------------------------------------------------------------------- public void test_multipliedBy() { CurrencyAmount test = CCY_AMOUNT.multipliedBy(3.5); assertEquals(test, CurrencyAmount.of(CCY1, AMT1 * 3.5)); } public void test_mapAmount() { CurrencyAmount test = CCY_AMOUNT.mapAmount(v -> v * 2 + 1); assertEquals(test, CurrencyAmount.of(CCY1, AMT1 * 2 + 1)); } //------------------------------------------------------------------------- public void test_negated() { assertEquals(CCY_AMOUNT.negated(), CCY_AMOUNT_NEGATIVE); assertEquals(CCY_AMOUNT_NEGATIVE.negated(), CCY_AMOUNT); assertEquals(CurrencyAmount.zero(Currency.USD), CurrencyAmount.zero(Currency.USD).negated()); assertEquals(CurrencyAmount.of(Currency.USD, -0d).negated(), CurrencyAmount.zero(Currency.USD)); } public void test_negative() { assertEquals(CCY_AMOUNT.negative(), CCY_AMOUNT_NEGATIVE); assertEquals(CCY_AMOUNT_NEGATIVE.negative(), CCY_AMOUNT_NEGATIVE); } public void test_positive() { assertEquals(CCY_AMOUNT.positive(), CCY_AMOUNT); assertEquals(CCY_AMOUNT_NEGATIVE.positive(), CCY_AMOUNT); } //------------------------------------------------------------------------- public void test_convertedTo_explicitRate() { assertEquals(CCY_AMOUNT.convertedTo(CCY2, 2.5d), CurrencyAmount.of(CCY2, AMT1 * 2.5d)); assertEquals(CCY_AMOUNT.convertedTo(CCY1, 1d), CCY_AMOUNT); assertThrowsIllegalArg(() -> CCY_AMOUNT.convertedTo(CCY1, 1.5d)); } public void test_convertedTo_rateProvider() { FxRateProvider provider = (ccy1, ccy2) -> 2.5d; assertEquals(CCY_AMOUNT.convertedTo(CCY2, provider), CurrencyAmount.of(CCY2, AMT1 * 2.5d)); assertEquals(CCY_AMOUNT.convertedTo(CCY1, provider), CCY_AMOUNT); } //------------------------------------------------------------------------- public void test_equals_hashCode() { CurrencyAmount other = CurrencyAmount.of(CCY1, AMT1); assertTrue(CCY_AMOUNT.equals(CCY_AMOUNT)); assertTrue(CCY_AMOUNT.equals(other)); assertTrue(other.equals(CCY_AMOUNT)); assertEquals(CCY_AMOUNT.hashCode(), other.hashCode()); other = CurrencyAmount.of(CCY1, AMT1); assertEquals(CCY_AMOUNT, other); assertEquals(CCY_AMOUNT.hashCode(), other.hashCode()); other = CurrencyAmount.of(CCY2, AMT1); assertFalse(CCY_AMOUNT.equals(other)); other = CurrencyAmount.of(CCY1, AMT2); assertFalse(CCY_AMOUNT.equals(other)); } public void test_equals_bad() { assertFalse(CCY_AMOUNT.equals("")); assertFalse(CCY_AMOUNT.equals(null)); } //------------------------------------------------------------------------- public void test_toString() { assertEquals(CurrencyAmount.of(Currency.AUD, 100d).toString(), "AUD 100"); assertEquals(CurrencyAmount.of(Currency.AUD, 100.123d).toString(), "AUD 100.123"); } //----------------------------------------------------------------------- public void test_serialization() { assertSerialization(CCY_AMOUNT); } public void test_jodaConvert() { assertJodaConvert(CurrencyAmount.class, CCY_AMOUNT); } }