1.1 --- a/task3/solution11/test/org/apidesign/apifest08/test/Task3Test.java Tue Oct 07 11:19:36 2008 +0200
1.2 +++ b/task3/solution11/test/org/apidesign/apifest08/test/Task3Test.java Fri Oct 10 21:58:12 2008 +0200
1.3 @@ -2,6 +2,12 @@
1.4
1.5 import junit.framework.TestCase;
1.6 import org.apidesign.apifest08.currency.Convertor;
1.7 +import org.apidesign.apifest08.currency.CurrencyValue;
1.8 +import org.apidesign.apifest08.currency.ExchangeRateDataSource;
1.9 +import org.apidesign.apifest08.currency.ExchangeRateProvider;
1.10 +import org.apidesign.apifest08.currency.ExchangeRateProvider.ExchangeRateRequest;
1.11 +import org.apidesign.apifest08.currency.ExchangeRateProvider.ExchangeRateResponse;
1.12 +import org.apidesign.apifest08.currency.ExchangeRateValue;
1.13
1.14 /** The exchange rates are not always the same. They are changing. Day by day,
1.15 * hour by hour, minute by minute. For every bank it is important to always
1.16 @@ -16,6 +22,7 @@
1.17 * to be used.
1.18 */
1.19 public class Task3Test extends TestCase {
1.20 +
1.21 public Task3Test(String testName) {
1.22 super(testName);
1.23 }
1.24 @@ -31,8 +38,6 @@
1.25 // Backward compatibly enhance your existing API to support following
1.26 // usecases:
1.27 //
1.28 -
1.29 -
1.30 /** Without knowing anything about the surrounding system, write an
1.31 * implementation of convertor that will return different rates everytime
1.32 * it is queried. Convert USD to CZK and vice versa. Start with the rate of
1.33 @@ -42,7 +47,7 @@
1.34 *
1.35 * @return new instance of "online" USD and CZK convertor starting with rate 1USD = 16CZK
1.36 */
1.37 - public static Convertor createOnlineCZKUSDConvertor() {
1.38 + public static Convertor<Double, String> createOnlineCZKUSDConvertor() {
1.39 // initial rate: 1USD = 16CZK
1.40 // 2nd query 1USD = 15.99CZK
1.41 // 3rd query 1USD = 15.98CZK
1.42 @@ -51,53 +56,80 @@
1.43 // then 1USD = 15.02CZK
1.44 // and so on and on up to 1USD = 16CZK
1.45 // and then another round to 15, etc.
1.46 - return null;
1.47 + return Convertor.getConvertorDataSourceDoubleString(
1.48 + ExchangeRateDataSource.getExchangeRateDataSource(
1.49 + "USD", "CZK", new ExchangeRateProvider<Double, String>() {
1.50 +
1.51 + double currentRate = 16d;
1.52 + double step;
1.53 +
1.54 + public void getExchangeRate(ExchangeRateRequest<Double, String> request,
1.55 + ExchangeRateResponse<Double, String> response) {
1.56 + if ((request.getCurrencyAIdentifier().equals("CZK") && request.getCurrencyBIdentifier().equals("USD")) ||
1.57 + (request.getCurrencyAIdentifier().equals("USD") && request.getCurrencyBIdentifier().equals("CZK"))) {
1.58 + response.setExchangeRate(ExchangeRateValue.getExchangeRate(
1.59 + CurrencyValue.getCurrencyValue(1d, "USD"),
1.60 + CurrencyValue.getCurrencyValue(currentRate, "CZK")));
1.61 +
1.62 + if (currentRate == 16d) {
1.63 + step = -0.01;
1.64 + }
1.65 + if (currentRate == 15d) {
1.66 + step = 0.01;
1.67 + }
1.68 + currentRate += step;
1.69 + } else {
1.70 + throw new IllegalArgumentException("No exchange rate for requested currencies!");
1.71 + }
1.72 + }
1.73 + }));
1.74 }
1.75
1.76 public void testFewQueriesForOnlineConvertor() {
1.77 - if (Boolean.getBoolean("ignore.failing")) {
1.78 - // implement me!
1.79 - return;
1.80 - }
1.81 -
1.82 - Convertor c = createOnlineCZKUSDConvertor();
1.83 + Convertor<Double, String> c = createOnlineCZKUSDConvertor();
1.84 doFewQueriesForOnlineConvertor(c);
1.85 }
1.86
1.87 - static void doFewQueriesForOnlineConvertor(Convertor c) {
1.88 + static void doFewQueriesForOnlineConvertor(Convertor<Double, String> c) {
1.89 + CurrencyValue<Double, String> result;
1.90 // convert $5 to CZK using c:
1.91 //assertEquals("Result is 80 CZK");
1.92 + result = c.convert("CZK", CurrencyValue.getCurrencyValue(5d, "USD"));
1.93 + assertEquals(CurrencyValue.getCurrencyValue(80d, "CZK"), result);
1.94
1.95 // convert $8 to CZK using c:
1.96 //assertEquals("Result is 127.92 CZK");
1.97 + result = c.convert("CZK", CurrencyValue.getCurrencyValue(8d, "USD"));
1.98 + assertEquals(CurrencyValue.getCurrencyValue(127.92d, "CZK"), result);
1.99
1.100 // convert $1 to CZK using c:
1.101 //assertEquals("Result is 15.98 CZK");
1.102 + result = c.convert("CZK", CurrencyValue.getCurrencyValue(1d, "USD"));
1.103 + assertEquals(CurrencyValue.getCurrencyValue(15.98d, "CZK"), result);
1.104
1.105 // convert 15.97CZK to USD using c:
1.106 //assertEquals("Result is 1$");
1.107 -
1.108 - fail("Implement me!");
1.109 + result = c.convert("USD", CurrencyValue.getCurrencyValue(15.97d, "CZK"));
1.110 + assertEquals(CurrencyValue.getCurrencyValue(1d, "USD"), result);
1.111 }
1.112
1.113 /** Join the convertors and show they behave sane.
1.114 */
1.115 public void testOnlineConvertorComposition() throws Exception {
1.116 - if (Boolean.getBoolean("ignore.failing")) {
1.117 - // implement me!
1.118 - return;
1.119 - }
1.120 -
1.121 - Convertor c = Task2Test.merge(
1.122 - createOnlineCZKUSDConvertor(),
1.123 - Task1Test.createSKKtoCZK()
1.124 - );
1.125 + Convertor<Double, String> c = Task2Test.merge(
1.126 + createOnlineCZKUSDConvertor(),
1.127 + Task1Test.createSKKtoCZK());
1.128
1.129 + CurrencyValue<Double, String> result;
1.130 // convert 16CZK to SKK using c:
1.131 // assertEquals("Result is 20 SKK");
1.132 + result = c.convert("SKK", CurrencyValue.getCurrencyValue(16d, "CZK"));
1.133 + assertEquals(CurrencyValue.getCurrencyValue(20d, "SKK"), result);
1.134
1.135 // convert 500SKK to CZK using c:
1.136 // assertEquals("Result is 400 CZK");
1.137 + result = c.convert("CZK", CurrencyValue.getCurrencyValue(500d, "SKK"));
1.138 + assertEquals(CurrencyValue.getCurrencyValue(400d, "CZK"), result);
1.139
1.140 doFewQueriesForOnlineConvertor(c);
1.141 }