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}