001/*
002 * Copyright (c) 2012, 2013, Werner Keil, Credit Suisse (Anatole Tresch). Licensed under the Apache
003 * License, Version 2.0 (the "License"); you may not use this file except in compliance with the
004 * License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
005 * Unless required by applicable law or agreed to in writing, software distributed under the License
006 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
007 * or implied. See the License for the specific language governing permissions and limitations under
008 * the License. Contributors: Anatole Tresch - initial version.
009 */
010package org.javamoney.tck.tests.conversion;
011
012import org.jboss.test.audit.annotations.SpecAssertion;
013import org.jboss.test.audit.annotations.SpecVersion;
014import org.testng.AssertJUnit;
015import org.testng.annotations.Test;
016
017import javax.money.convert.*;
018
019import java.time.LocalDate;
020import java.time.Month;
021import java.util.Collection;
022
023/**
024 * Tests for conversion provider chains.
025 * Created by Anatole on 10.03.14.
026 */
027@SpecVersion(spec = "JSR 354", version = "1.0.0")
028public class ProviderChainsTest{
029
030    // ********************** A. Test Basic MonetaryConversions Accessors *********************************
031
032    /**
033     * Test correct rate evaluation for different provider chains, providers defined by the TCK.<p>
034     * Hint do not use non TCK provider for this test, it will make results undeterministic.
035     */
036    @Test(description = "4.3.4 Test correct rate evaluation for different conversion provider chains.")
037    @SpecAssertion(id = "434-A1", section = "4.3.4")
038    public void testCorrectRateEvaluationInChain_diffProviders(){
039        ExchangeRateProvider prov1 = MonetaryConversions
040                .getExchangeRateProvider("TestRateProvider1", "TestRateProvider2", "TestRateProvider3");
041        ExchangeRate rate = prov1.getExchangeRate("CHF", "EUR");
042        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
043        prov1 = MonetaryConversions.getExchangeRateProvider("TestRateProvider1", "TestRateProvider2");
044        rate = prov1.getExchangeRate("EUR", "USD");
045        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
046        prov1 = MonetaryConversions.getExchangeRateProvider("TestRateProvider3");
047        rate = prov1.getExchangeRate("USD", "INR");
048        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 3);
049        prov1 = MonetaryConversions
050                .getExchangeRateProvider("TestRateProvider1", "TestRateProvider3", "TestRateProvider2");
051        rate = prov1.getExchangeRate("CHF", "EUR");
052        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
053        rate = prov1.getExchangeRate("EUR", "USD");
054        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
055        rate = prov1.getExchangeRate("USD", "INR");
056        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 3);
057
058        prov1 = MonetaryConversions
059                .getExchangeRateProvider("TestRateProvider3", "TestRateProvider2", "TestRateProvider1");
060        rate = prov1.getExchangeRate("CHF", "EUR");
061        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
062        prov1 = MonetaryConversions
063                .getExchangeRateProvider("TestRateProvider2", "TestRateProvider1", "TestRateProvider3");
064        rate = prov1.getExchangeRate("EUR", "USD");
065        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
066        rate = prov1.getExchangeRate("USD", "INR");
067        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 3);
068
069        prov1 = MonetaryConversions
070                .getExchangeRateProvider("TestRateProvider3", "TestRateProvider2", "TestRateProvider1",
071                                         "TestRateProvider02");
072        rate = prov1.getExchangeRate("CHF", "EUR");
073        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
074        rate = prov1.getExchangeRate("EUR", "USD");
075        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
076        rate = prov1.getExchangeRate("USD", "INR");
077        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 3);
078        rate = prov1.getExchangeRate("INR", "GBP");
079        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().doubleValue(), 0.2);
080    }
081
082    /**
083     * Test correct rate evaluation for different provider chains, providers defined by the TCK.<p>
084     * Hint do not use non TCK provider for this test, it will make results undeterministic.
085     */
086    @Test(description = "4.3.4 Test correct rate evaluation for different conversion provider chains, " +
087            "with duplicate provider entries.")
088    @SpecAssertion(id = "434-A1", section = "4.3.4")
089    public void testCorrectRateEvaluationInChain_sameProviders(){
090        ExchangeRateProvider prov1 = MonetaryConversions
091                .getExchangeRateProvider("TestRateProvider1", "TestRateProvider1", "TestRateProvider1");
092        ExchangeRate rate = prov1.getExchangeRate("CHF", "EUR");
093        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
094        prov1 = MonetaryConversions.getExchangeRateProvider("TestRateProvider1", "TestRateProvider1");
095        rate = prov1.getExchangeRate("CHF", "EUR");
096        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
097        prov1 = MonetaryConversions.getExchangeRateProvider("TestRateProvider1");
098        rate = prov1.getExchangeRate("CHF", "EUR");
099        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
100    }
101
102
103    /**
104     * Test correct rate evaluation for different provider chains, providers defined by the TCK,
105     * with historic rates.<p>
106     * Hint do not use non TCK provider for this test, it will make results undeterministic.
107     */
108    @Test(description = "4.3.4 Test correct rate evaluation for different conversion provider chains, " +
109            "with historic rates.")
110    @SpecAssertion(id = "434-A2", section = "4.3.4")
111    public void testCorrectRateEvaluationInChainHistoric(){
112        ExchangeRateProvider prov1 = MonetaryConversions
113                .getExchangeRateProvider("TestRateProvider1", "TestRateProvider2", "TestRateProvider3");
114        ExchangeRate rate = prov1.getExchangeRate("CHF", "EUR");
115        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
116        rate = prov1.getExchangeRate("EUR", "USD");
117        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
118        rate = prov1.getExchangeRate(
119                ConversionQueryBuilder.of()
120                        .set(LocalDate.of(1970, Month.JANUARY, 1))
121                        .setBaseCurrency("EUR")
122                        .setTermCurrency("USD")
123                        .build());
124        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", 200, rate.getFactor().intValueExact());
125    }
126
127    /**
128     * Test availability of providers defined by the TCK.<p>
129     * Hint do not use non TCK provider for this test, it will make results undeterministic.
130     */
131    @Test(description = "4.3.4 Test availability of TCK provided providers.")
132    @SpecAssertion(id = "434-A3", section = "4.3.4")
133    public void testTCKRateChainAvailability(){
134        Collection<String> provNames = MonetaryConversions.getProviderNames();
135        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered: TestRateProvider",
136                               provNames.contains("TestRateProvider"));
137        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered:TestRateProvider1",
138                               provNames.contains("TestRateProvider1"));
139        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered: TestRateProvider2",
140                               provNames.contains("TestRateProvider2"));
141        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered: TestRateProvider3",
142                               provNames.contains("TestRateProvider3"));
143        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered: TestRateProvider02",
144                               provNames.contains("TestRateProvider02"));
145    }
146
147}