Skip to content

Commit 80f6f30

Browse files
committed
Added several tests for API default method logic.
1 parent 7a7fb74 commit 80f6f30

11 files changed

+766
-29
lines changed

src/main/java/javax/money/spi/MonetaryConversionsSingletonSpi.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ default boolean isConversionAvailable(CurrencyUnit termCurrency, String... provi
140140
*
141141
* @param providers the provider names of hte providers to be accessed
142142
* @return the list of providers, in the same order as requested.
143+
* @throws MonetaryException if a provider could not be resolved.
143144
*/
144145
default List<ExchangeRateProvider> getExchangeRateProviders(String... providers){
145146
List<ExchangeRateProvider> provInstances = new ArrayList<>();
@@ -149,7 +150,7 @@ default List<ExchangeRateProvider> getExchangeRateProviders(String... providers)
149150
}
150151
for(String provName : providerNames){
151152
provInstances.add(Optional.ofNullable(getExchangeRateProvider(provName)).orElseThrow(
152-
() -> new IllegalArgumentException("Unsupported conversion/rate provider: " + provName)));
153+
() -> new MonetaryException("Unsupported conversion/rate provider: " + provName)));
153154
}
154155
return provInstances;
155156
}
@@ -182,8 +183,9 @@ default ExchangeRateProvider getExchangeRateProvider(String... providers){
182183
* @see #isConversionAvailable(javax.money.convert.ConversionQuery)
183184
*/
184185
default CurrencyConversion getConversion(ConversionQuery conversionQuery){
185-
Objects.requireNonNull(conversionQuery.getCurrency(), "Terminating Currency is required.");
186-
return getExchangeRateProvider(conversionQuery).getCurrencyConversion(conversionQuery.getCurrency());
186+
return getExchangeRateProvider(conversionQuery).getCurrencyConversion(
187+
Objects.requireNonNull(conversionQuery.getCurrency(), "Terminating Currency is required.")
188+
);
187189
}
188190

189191
/**

src/main/java/javax/money/spi/MonetaryRoundingsSingletonSpi.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,12 @@ public interface MonetaryRoundingsSingletonSpi{
9191
* @param providers the optional provider list and ordering to be used
9292
* @return a new instance {@link javax.money.MonetaryOperator} implementing the
9393
* rounding, never {@code null}.
94+
* @throws MonetaryException if no such rounding could be provided.
9495
*/
9596
default MonetaryRounding getRounding(CurrencyUnit currencyUnit, String... providers){
9697
MonetaryRounding op =
9798
getRounding(RoundingQueryBuilder.of().setProviders(providers).setCurrency(currencyUnit).build());
98-
return Optional.ofNullable(op).orElseThrow(() -> new IllegalStateException(
99+
return Optional.ofNullable(op).orElseThrow(() -> new MonetaryException(
99100
"No rounding provided for CurrencyUnit: " + currencyUnit.getCurrencyCode()));
100101
}
101102

@@ -170,7 +171,7 @@ default boolean isRoundingAvailable(String roundingId, String... providers){
170171
* @throws IllegalArgumentException if no such rounding is registered using a
171172
* {@link RoundingProviderSpi} instance.
172173
*/
173-
default boolean isRoundingAvailable(CurrencyUnit currencyUnit, String[] providers){
174+
default boolean isRoundingAvailable(CurrencyUnit currencyUnit, String... providers) {
174175
return isRoundingAvailable(RoundingQueryBuilder.of().setProviders(providers).setCurrency(currencyUnit).build());
175176
}
176177
}

src/test/java/javax/money/spi/BootstrapTest.java

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,29 @@
88
import java.util.Arrays;
99
import java.util.Collection;
1010
import java.util.List;
11+
import java.util.Locale;
1112

1213
import org.testng.annotations.Test;
1314

15+
import javax.money.MonetaryException;
16+
1417
/**
1518
* Created by Anatole on 04.03.14.
1619
*/
1720
@SuppressWarnings("unchecked")
1821
@Test
19-
public class BootstrapTest{
22+
public class BootstrapTest {
2023

2124

22-
@Test(expectedExceptions=IllegalStateException.class)
23-
public void testInit_InitTwice() throws Exception{
25+
@Test(expectedExceptions = IllegalStateException.class)
26+
public void testInit_InitTwice() throws Exception {
2427
Bootstrap.init(new TestServiceProvider());
2528
Bootstrap.init(new TestServiceProvider());
2629
}
2730

28-
29-
@Test
30-
public void testInit() throws Exception{
31+
32+
@Test
33+
public void testInit() throws Exception {
3134
Collection<Object> services = Collection.class.cast(Bootstrap.getServices(String.class));
3235
assertNotNull(services);
3336
assertFalse(services.isEmpty());
@@ -39,13 +42,13 @@ public void testInit() throws Exception{
3942
}
4043

4144
@Test
42-
public void testGetServiceProvider() throws Exception{
45+
public void testGetServiceProvider() throws Exception {
4346
assertNotNull(Bootstrap.getServiceProvider());
4447
assertEquals(Bootstrap.getServiceProvider().getClass(), TestServiceProvider.class);
4548
}
4649

4750
@Test
48-
public void testGetServices() throws Exception{
51+
public void testGetServices() throws Exception {
4952
Collection<Object> services = Collection.class.cast(Bootstrap.getServices(String.class));
5053
assertNotNull(services);
5154
assertFalse(services.isEmpty());
@@ -57,7 +60,7 @@ public void testGetServices() throws Exception{
5760
}
5861

5962
@Test
60-
public void testGetServicesWithDefault() throws Exception{
63+
public void testGetServicesWithDefault() throws Exception {
6164
Collection<Object> services = Collection.class
6265
.cast(Bootstrap.getServices(Boolean.class, Arrays.asList(Boolean.FALSE, Boolean.TRUE)));
6366
assertNotNull(services);
@@ -73,45 +76,46 @@ public void testGetServicesWithDefault() throws Exception{
7376
}
7477

7578
@Test
76-
public void testGetService() throws Exception{
79+
public void testGetService() throws Exception {
7780
Integer num = Bootstrap.getService(Integer.class);
7881
assertNotNull(num);
7982
assertTrue(num.equals(5));
8083
}
8184

85+
@Test(expectedExceptions = {MonetaryException.class})
86+
public void testGetService_BadCase() throws Exception {
87+
Bootstrap.getService(Locale.class);
88+
}
89+
8290
@Test
83-
public void testGetService1() throws Exception{
91+
public void testGetService1() throws Exception {
8492
Long num = Bootstrap.getService(Long.class, 111L);
8593
assertNotNull(num);
8694
assertTrue(num.equals(111L));
8795
}
8896

8997
public final static class TestServiceProvider extends DefaultServiceProvider
90-
implements ServiceProvider{
98+
implements ServiceProvider {
9199

92100
@Override
93-
public <T> List<T> getServices(Class<T> serviceType){
94-
if(String.class.equals(serviceType)){
101+
public <T> List<T> getServices(Class<T> serviceType) {
102+
if (String.class.equals(serviceType)) {
95103
return List.class.cast(Arrays.asList("service1", "service2"));
96-
}
97-
else if(Integer.class.equals(serviceType)){
104+
} else if (Integer.class.equals(serviceType)) {
98105
return List.class.cast(Arrays.asList(5));
99-
}
100-
else if(Long.class.equals(serviceType)){
106+
} else if (Long.class.equals(serviceType)) {
101107
return List.class.cast(Arrays.asList((long) 111));
102108
}
103109
return super.getServices(serviceType);
104110
}
105111

106112
@Override
107-
public <T> List<T> getServices(Class<T> serviceType, List<T> defaultList){
108-
if(String.class.equals(serviceType)){
113+
public <T> List<T> getServices(Class<T> serviceType, List<T> defaultList) {
114+
if (String.class.equals(serviceType)) {
109115
return List.class.cast(Arrays.asList("service1", "service2"));
110-
}
111-
else if(Integer.class.equals(serviceType)){
116+
} else if (Integer.class.equals(serviceType)) {
112117
return List.class.cast(Arrays.asList(5));
113-
}
114-
else if(Long.class.equals(serviceType)){
118+
} else if (Long.class.equals(serviceType)) {
115119
return List.class.cast(Arrays.asList((long) 111));
116120
}
117121
return super.getServices(serviceType, defaultList);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* CREDIT SUISSE IS WILLING TO LICENSE THIS SPECIFICATION TO YOU ONLY UPON THE
3+
* CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS AGREEMENT.
4+
* PLEASE READ THE TERMS AND CONDITIONS OF THIS AGREEMENT CAREFULLY. BY
5+
* DOWNLOADING THIS SPECIFICATION, YOU ACCEPT THE TERMS AND CONDITIONS OF THE
6+
* AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY IT, SELECT THE "DECLINE"
7+
* BUTTON AT THE BOTTOM OF THIS PAGE.
8+
*
9+
* Specification: JSR-354 Money and Currency API ("Specification")
10+
*
11+
* Copyright (c) 2012-2014, Credit Suisse All rights reserved.
12+
*/
13+
package javax.money.spi;
14+
15+
import org.testng.annotations.Test;
16+
17+
import javax.money.*;
18+
import java.util.HashSet;
19+
import java.util.Set;
20+
21+
import static org.testng.Assert.*;
22+
23+
/**
24+
* Test class to test the default methods of CurrencyProviderSpi.
25+
*/
26+
public class CurrencyProviderSpiTest {
27+
28+
private static CurrencyProviderSpi testProvider = new CurrencyProviderSpi() {
29+
@Override
30+
public Set<CurrencyUnit> getCurrencies(CurrencyQuery query) {
31+
Set<CurrencyUnit> result = new HashSet<>();
32+
if (query.getCurrencyCodes().contains("CHF")) {
33+
result.add(TestCurrency.of("CHF"));
34+
}
35+
return result;
36+
}
37+
};
38+
39+
@Test
40+
public void testGetProviderName() throws Exception {
41+
assertEquals(testProvider.getProviderName(), testProvider.getClass().getSimpleName());
42+
43+
}
44+
45+
@Test
46+
public void testIsCurrencyAvailable() throws Exception {
47+
assertTrue(testProvider.isCurrencyAvailable(CurrencyQueryBuilder.of().setCurrencyCodes("CHF").build()));
48+
assertFalse(testProvider.isCurrencyAvailable(CurrencyQueryBuilder.of().setCurrencyCodes("foofoo").build()));
49+
}
50+
51+
}

src/test/java/javax/money/spi/MonetaryAmountFactoryProviderSpiTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
/*
2+
* CREDIT SUISSE IS WILLING TO LICENSE THIS SPECIFICATION TO YOU ONLY UPON THE CONDITION THAT YOU
3+
* ACCEPT ALL OF THE TERMS CONTAINED IN THIS AGREEMENT. PLEASE READ THE TERMS AND CONDITIONS OF THIS
4+
* AGREEMENT CAREFULLY. BY DOWNLOADING THIS SPECIFICATION, YOU ACCEPT THE TERMS AND CONDITIONS OF
5+
* THE AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY IT, SELECT THE "DECLINE" BUTTON AT THE
6+
* BOTTOM OF THIS PAGE. Specification: JSR-354 Money and Currency API ("Specification") Copyright
7+
* (c) 2012-2013, Credit Suisse All rights reserved.
8+
*/
19
package javax.money.spi;
210

311
import static javax.money.spi.MonetaryAmountFactoryProviderSpi.QueryInclusionPolicy;
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* CREDIT SUISSE IS WILLING TO LICENSE THIS SPECIFICATION TO YOU ONLY UPON THE CONDITION THAT YOU
3+
* ACCEPT ALL OF THE TERMS CONTAINED IN THIS AGREEMENT. PLEASE READ THE TERMS AND CONDITIONS OF THIS
4+
* AGREEMENT CAREFULLY. BY DOWNLOADING THIS SPECIFICATION, YOU ACCEPT THE TERMS AND CONDITIONS OF
5+
* THE AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY IT, SELECT THE "DECLINE" BUTTON AT THE
6+
* BOTTOM OF THIS PAGE. Specification: JSR-354 Money and Currency API ("Specification") Copyright
7+
* (c) 2012-2013, Credit Suisse All rights reserved.
8+
*/
9+
package javax.money.spi;
10+
11+
import javax.money.*;
12+
import java.util.ArrayList;
13+
import java.util.Collection;
14+
import java.util.List;
15+
16+
import static org.testng.AssertJUnit.*;
17+
18+
/**
19+
* Tests the default methods on MonetaryAmountsSingletonQuerySpi.
20+
*/
21+
public class MonetaryAmountsSingletonQuerySpiTest {
22+
23+
MonetaryAmountsSingletonQuerySpi testSpi = new MonetaryAmountsSingletonQuerySpi() {
24+
@Override
25+
public Collection<MonetaryAmountFactory<? extends MonetaryAmount>> getAmountFactories(MonetaryAmountFactoryQuery query) {
26+
List<MonetaryAmountFactory<? extends MonetaryAmount>> factories = new ArrayList<>();
27+
if (query.getBoolean("select")) {
28+
factories.add(new DummyAmountBuilder());
29+
}
30+
return factories;
31+
}
32+
33+
};
34+
35+
public void testIsAvailable() {
36+
assertTrue(testSpi.isAvailable(MonetaryAmountFactoryQueryBuilder.of().set("select", true).build()));
37+
assertFalse(testSpi.isAvailable(MonetaryAmountFactoryQueryBuilder.of().set("select", false).build()));
38+
}
39+
40+
public void testGetAmountType() {
41+
assertEquals(DummyAmount.class, testSpi.getAmountType(MonetaryAmountFactoryQueryBuilder.of().set("select", true).build()));
42+
assertEquals(null, testSpi.getAmountType(MonetaryAmountFactoryQueryBuilder.of().set("select", false).build()));
43+
}
44+
45+
public void testGetAmountTypes() {
46+
assertFalse(testSpi.getAmountTypes(MonetaryAmountFactoryQueryBuilder.of().set("select", true).build()).isEmpty());
47+
assertTrue(testSpi.getAmountTypes(MonetaryAmountFactoryQueryBuilder.of().set("select", false).build()).isEmpty());
48+
}
49+
50+
public void testGetAmountFactory() {
51+
assertNotNull(testSpi.getAmountFactory(MonetaryAmountFactoryQueryBuilder.of().set("select", true).build()));
52+
assertNull(testSpi.getAmountFactory(MonetaryAmountFactoryQueryBuilder.of().set("select", false).build()));
53+
}
54+
55+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* CREDIT SUISSE IS WILLING TO LICENSE THIS SPECIFICATION TO YOU ONLY UPON THE CONDITION THAT YOU
3+
* ACCEPT ALL OF THE TERMS CONTAINED IN THIS AGREEMENT. PLEASE READ THE TERMS AND CONDITIONS OF THIS
4+
* AGREEMENT CAREFULLY. BY DOWNLOADING THIS SPECIFICATION, YOU ACCEPT THE TERMS AND CONDITIONS OF
5+
* THE AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY IT, SELECT THE "DECLINE" BUTTON AT THE
6+
* BOTTOM OF THIS PAGE. Specification: JSR-354 Money and Currency API ("Specification") Copyright
7+
* (c) 2012-2013, Credit Suisse All rights reserved.
8+
*/
9+
package javax.money.spi;
10+
11+
import org.testng.annotations.Test;
12+
13+
import javax.money.DummyAmount;
14+
import javax.money.DummyAmountBuilder;
15+
import javax.money.MonetaryAmount;
16+
import javax.money.MonetaryAmountFactory;
17+
import java.util.Collection;
18+
import java.util.HashSet;
19+
import java.util.Set;
20+
21+
import static org.testng.AssertJUnit.assertEquals;
22+
import static org.testng.AssertJUnit.assertFalse;
23+
import static org.testng.AssertJUnit.assertNotNull;
24+
25+
/**
26+
* Tests the default methods on MonetaryAmountsSingletonSpi.
27+
*/
28+
public class MonetaryAmountsSingletonSpiTest {
29+
30+
private MonetaryAmountsSingletonSpi testSpi = new MonetaryAmountsSingletonSpi() {
31+
@Override
32+
public <T extends MonetaryAmount> MonetaryAmountFactory<T> getAmountFactory(Class<T> amountType) {
33+
if (amountType.equals(DummyAmount.class)) {
34+
return (MonetaryAmountFactory<T>) new DummyAmountBuilder();
35+
}
36+
return null;
37+
}
38+
39+
@Override
40+
public Class<? extends MonetaryAmount> getDefaultAmountType() {
41+
return DummyAmount.class;
42+
}
43+
44+
@Override
45+
public Collection<Class<? extends MonetaryAmount>> getAmountTypes() {
46+
Set<Class<? extends MonetaryAmount>> result = new HashSet<>();
47+
result.add(DummyAmount.class);
48+
return result;
49+
}
50+
};
51+
52+
@Test
53+
public void testGetDefaultAmountFactory() {
54+
assertNotNull(testSpi.getDefaultAmountFactory());
55+
assertEquals(DummyAmountBuilder.class, testSpi.getDefaultAmountFactory().getClass());
56+
}
57+
58+
@Test
59+
public void testGetAmountFactories() {
60+
Collection<MonetaryAmountFactory<?>> factories = testSpi.getAmountFactories();
61+
assertNotNull(factories);
62+
assertFalse(factories.isEmpty());
63+
assertEquals(1, factories.size());
64+
assertEquals(DummyAmountBuilder.class, factories.iterator().next().getClass());
65+
}
66+
67+
}

0 commit comments

Comments
 (0)