jaroslav@60: package org.apidesign.apifest08.test; jaroslav@60: jaroslav@60: import java.util.Date; jaroslav@60: import junit.framework.TestCase; jaroslav@60: import org.apidesign.apifest08.currency.Convertor; jaroslav@60: jaroslav@60: /** The exchange rates are not always the same. They are changing. However jaroslav@60: * as in order to predict the future, one needs to understand own past. That is jaroslav@60: * why it is important to know the exchange rate as it was at any time during jaroslav@60: * the past. jaroslav@60: *

jaroslav@60: * Today's quest is to enhance the convertor API to deal with dates. jaroslav@60: * One shall be able to convert a currency at any date. Each currencies rate shall jaroslav@60: * be associated with a range between two Date objects. In order jaroslav@60: * to keep compatibility with old API that knew nothing about dates, the jaroslav@60: * rates associated then are applicable "for eternity". Any use of existing jaroslav@60: * convert methods that do not accept a Date argument, uses the current jaroslav@60: * System.currentTimeMillis() as default date. jaroslav@60: */ jaroslav@60: public class Task4Test extends TestCase { jaroslav@60: public Task4Test(String testName) { jaroslav@60: super(testName); jaroslav@60: } jaroslav@60: jaroslav@60: @Override jaroslav@60: protected void setUp() throws Exception { jaroslav@60: } jaroslav@60: jaroslav@60: @Override jaroslav@60: protected void tearDown() throws Exception { jaroslav@60: } jaroslav@60: jaroslav@60: // Backward compatibly enhance your existing API to support following jaroslav@60: // usecases: jaroslav@60: // jaroslav@60: jaroslav@60: /** Takes a convertor with any rates associated and creates new convertor jaroslav@60: * that returns the same values as the old one for time between from to till. jaroslav@60: * Otherwise it returns no results. This is just a helper method that jaroslav@60: * shall call some real one in the API. jaroslav@60: * jaroslav@60: * @param old existing convertor jaroslav@60: * @param from initial date (inclusive) jaroslav@60: * @param till final date (exclusive) jaroslav@60: * @return new convertor jaroslav@60: */ jaroslav@60: public static Convertor limitTo(Convertor old, Date from, Date till) { jaroslav@60: return null; jaroslav@60: } jaroslav@60: jaroslav@60: jaroslav@60: public void testCompositionOfLimitedConvertors() throws Exception { jaroslav@60: if (Boolean.getBoolean("ignore.failing")) { jaroslav@60: // implement me! then delete this if statement jaroslav@60: return; jaroslav@60: } jaroslav@60: jaroslav@60: Date d1 = null; // 2008-10-01 0:00 GMT jaroslav@60: Date d2 = null; // 2008-10-02 0:00 GMT jaroslav@60: Date d3 = null; // 2008-10-03 0:00 GMT jaroslav@60: jaroslav@60: Convertor c = Task2Test.merge( jaroslav@60: limitTo(Task1Test.createCZKtoUSD(), d1, d2), jaroslav@60: limitTo(Task1Test.createSKKtoCZK(), d2, d3) jaroslav@60: ); jaroslav@60: jaroslav@60: // convert $5 to CZK using c: jaroslav@60: // cannot convert as no rate is applicable to current date jaroslav@60: jaroslav@60: // convert $8 to CZK using c: jaroslav@60: // cannot convert as no rate is applicable to current date jaroslav@60: jaroslav@60: // convert 1003CZK to USD using c: jaroslav@60: // cannot convert as no rate is applicable to current date jaroslav@60: jaroslav@60: // convert 16CZK using c: jaroslav@60: // cannot convert as no rate is applicable to current date jaroslav@60: jaroslav@60: // convert 500SKK to CZK using c: jaroslav@60: // cannot convert as no rate is applicable to current date jaroslav@60: jaroslav@60: // convert $5 to CZK using c at 2008-10-01 6:00 GMT: jaroslav@60: // assertEquals("Result is 85 CZK"); jaroslav@60: jaroslav@60: // convert $8 to CZK using c at 2008-10-01 6:00 GMT: jaroslav@60: // assertEquals("Result is 136 CZK"); jaroslav@60: jaroslav@60: // convert 1003CZK to USD using c at 2008-10-01 6:00 GMT: jaroslav@60: // assertEquals("Result is 59 USD"); jaroslav@60: jaroslav@60: // convert 16CZK using c at 2008-10-02 9:00 GMT: jaroslav@60: // assertEquals("Result is 20 SKK"); jaroslav@60: jaroslav@60: // convert 500SKK to CZK using c at 2008-10-02 9:00 GMT: jaroslav@60: // assertEquals("Result is 400 CZK"); jaroslav@60: jaroslav@60: // convert 500SKK to CZK using c at 2008-10-01 6:00 GMT: jaroslav@60: // cannot convert as no rate is applicable to current date jaroslav@60: } jaroslav@60: jaroslav@60: /** Create convertor that understands two currencies, CZK and jaroslav@60: * SKK. Make 100 SKK == 90 CZK. jaroslav@60: * jaroslav@60: * @return prepared convertor ready for converting SKK to CZK and CZK to SKK jaroslav@60: */ jaroslav@60: public static Convertor createSKKtoCZK2() { jaroslav@60: return null; jaroslav@60: } jaroslav@60: jaroslav@60: public void testDateConvetorWithTwoDifferentRates() throws Exception { jaroslav@60: if (Boolean.getBoolean("ignore.failing")) { jaroslav@60: // implement me! then delete this if statement jaroslav@60: return; jaroslav@60: } jaroslav@60: jaroslav@60: Date d1 = null; // 2008-10-01 0:00 GMT jaroslav@60: Date d2 = null; // 2008-10-02 0:00 GMT jaroslav@60: Date d3 = null; // 2008-10-03 0:00 GMT jaroslav@60: jaroslav@60: Convertor c = Task2Test.merge( jaroslav@60: limitTo(createSKKtoCZK2(), d1, d2), jaroslav@60: limitTo(Task1Test.createSKKtoCZK(), d2, d3) jaroslav@60: ); jaroslav@60: jaroslav@60: // convert 500SKK to CZK using c at 2008-10-02 9:00 GMT: jaroslav@60: // assertEquals("Result is 400 CZK"); jaroslav@60: jaroslav@60: // convert 500SKK to CZK using c at 2008-10-01 6:00 GMT: jaroslav@60: // assertEquals("Result is 450 CZK"); jaroslav@60: } jaroslav@60: jaroslav@60: }