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.ConversionQueryBuilder;
018import javax.money.convert.ExchangeRate;
019import javax.money.convert.ExchangeRateProvider;
020import javax.money.convert.MonetaryConversions;
021import java.util.Calendar;
022import java.util.Collection;
023import java.util.GregorianCalendar;
024
025/**
026 * Tests for conversion provider chains.
027 * Created by Anatole on 10.03.14.
028 */
029@SpecVersion(spec = "JSR 354", version = "1.0.0")
030public class ProviderChainsTest {
031
032    // ********************** A. Test Basic MonetaryConversions Accessors *********************************
033
034    /**
035     * Test correct rate evaluation for different provider chains, providers defined by the TCK.<p>
036     * Hint do not use non TCK provider for this test, it will make results undeterministic.
037     */
038    @Test(description = "4.3.4 Test correct rate evaluation for different conversion provider chains.")
039    @SpecAssertion(id = "434-A1", section = "4.3.4")
040    public void testCorrectRateEvaluationInChain_diffProviders() {
041        ExchangeRateProvider prov1 = MonetaryConversions
042                .getExchangeRateProvider("TestRateProvider1", "TestRateProvider2", "TestRateProvider3");
043        ExchangeRate rate = prov1.getExchangeRate("CHF", "EUR");
044        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
045        prov1 = MonetaryConversions.getExchangeRateProvider("TestRateProvider1", "TestRateProvider2");
046        rate = prov1.getExchangeRate("EUR", "USD");
047        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
048        prov1 = MonetaryConversions.getExchangeRateProvider("TestRateProvider3");
049        rate = prov1.getExchangeRate("USD", "INR");
050        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 3);
051        prov1 = MonetaryConversions
052                .getExchangeRateProvider("TestRateProvider1", "TestRateProvider3", "TestRateProvider2");
053        rate = prov1.getExchangeRate("CHF", "EUR");
054        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
055        rate = prov1.getExchangeRate("EUR", "USD");
056        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
057        rate = prov1.getExchangeRate("USD", "INR");
058        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 3);
059
060        prov1 = MonetaryConversions
061                .getExchangeRateProvider("TestRateProvider3", "TestRateProvider2", "TestRateProvider1");
062        rate = prov1.getExchangeRate("CHF", "EUR");
063        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
064        prov1 = MonetaryConversions
065                .getExchangeRateProvider("TestRateProvider2", "TestRateProvider1", "TestRateProvider3");
066        rate = prov1.getExchangeRate("EUR", "USD");
067        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
068        rate = prov1.getExchangeRate("USD", "INR");
069        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 3);
070
071        prov1 = MonetaryConversions
072                .getExchangeRateProvider("TestRateProvider3", "TestRateProvider2", "TestRateProvider1",
073                        "TestRateProvider02");
074        rate = prov1.getExchangeRate("CHF", "EUR");
075        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
076        rate = prov1.getExchangeRate("EUR", "USD");
077        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
078        rate = prov1.getExchangeRate("USD", "INR");
079        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 3);
080        rate = prov1.getExchangeRate("INR", "GBP");
081        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().doubleValue(), 0.2);
082    }
083
084    /**
085     * Test correct rate evaluation for different provider chains, providers defined by the TCK.<p>
086     * Hint do not use non TCK provider for this test, it will make results undeterministic.
087     */
088    @Test(description = "4.3.4 Test correct rate evaluation for different conversion provider chains, " +
089            "with duplicate provider entries.")
090    @SpecAssertion(id = "434-A1", section = "4.3.4")
091    public void testCorrectRateEvaluationInChain_sameProviders() {
092        ExchangeRateProvider prov1 = MonetaryConversions
093                .getExchangeRateProvider("TestRateProvider1", "TestRateProvider1", "TestRateProvider1");
094        ExchangeRate rate = prov1.getExchangeRate("CHF", "EUR");
095        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
096        prov1 = MonetaryConversions.getExchangeRateProvider("TestRateProvider1", "TestRateProvider1");
097        rate = prov1.getExchangeRate("CHF", "EUR");
098        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
099        prov1 = MonetaryConversions.getExchangeRateProvider("TestRateProvider1");
100        rate = prov1.getExchangeRate("CHF", "EUR");
101        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
102    }
103
104
105    /**
106     * Test correct rate evaluation for different provider chains, providers defined by the TCK,
107     * with historic rates.<p>
108     * Hint do not use non TCK provider for this test, it will make results undeterministic.
109     */
110    @Test(description = "4.3.4 Test correct rate evaluation for different conversion provider chains, " +
111            "with historic rates.")
112    @SpecAssertion(id = "434-A2", section = "4.3.4")
113    public void testCorrectRateEvaluationInChainHistoric() {
114        ExchangeRateProvider prov1 = MonetaryConversions
115                .getExchangeRateProvider("TestRateProvider1", "TestRateProvider2", "TestRateProvider3");
116        ExchangeRate rate = prov1.getExchangeRate("CHF", "EUR");
117        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 1);
118        rate = prov1.getExchangeRate("EUR", "USD");
119        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", rate.getFactor().intValueExact(), 2);
120        Calendar cal = GregorianCalendar.getInstance();
121        cal.setTimeInMillis(0L);
122        rate = prov1.getExchangeRate(
123                ConversionQueryBuilder.of()
124                        .set(cal)
125                        .setBaseCurrency("EUR")
126                        .setTermCurrency("USD")
127                        .build());
128        AssertJUnit.assertEquals("Invalid ExchangeRateProvider selected.", 2, rate.getFactor().intValueExact());
129    }
130
131    /**
132     * Test availability of providers defined by the TCK.<p>
133     * Hint do not use non TCK provider for this test, it will make results undeterministic.
134     */
135    @Test(description = "4.3.4 Test availability of TCK provided providers.")
136    @SpecAssertion(id = "434-A3", section = "4.3.4")
137    public void testTCKRateChainAvailability() {
138        Collection<String> provNames = MonetaryConversions.getConversionProviderNames();
139        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered: TestRateProvider",
140                provNames.contains("TestRateProvider"));
141        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered:TestRateProvider1",
142                provNames.contains("TestRateProvider1"));
143        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered: TestRateProvider2",
144                provNames.contains("TestRateProvider2"));
145        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered: TestRateProvider3",
146                provNames.contains("TestRateProvider3"));
147        AssertJUnit.assertTrue("TCK ExchangeRateProvider is not registered: TestRateProvider02",
148                provNames.contains("TestRateProvider02"));
149    }
150
151}