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}