/* * Copyright (c) 2012 Denis Solonenko. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html */ package ru.orangesoftware.financisto2.test.model.rates; import ru.orangesoftware.financisto2.test.db.AbstractDbTest; import ru.orangesoftware.financisto2.model.Currency; import ru.orangesoftware.financisto2.rates.ExchangeRate; import ru.orangesoftware.financisto2.rates.ExchangeRateProvider; import ru.orangesoftware.financisto2.test.builders.CurrencyBuilder; import ru.orangesoftware.financisto2.test.builders.DateTime; import ru.orangesoftware.financisto2.test.builders.RateBuilder; import java.util.Arrays; import java.util.List; /** * Created by IntelliJ IDEA. * User: denis.solonenko * Date: 1/17/12 11:08 PM */ public class ExchangeRateTest extends AbstractDbTest { Currency c1; Currency c2; Currency c3; @Override public void setUp() throws Exception { super.setUp(); c1 = CurrencyBuilder.withDb(db).name("USD").title("Dollar").symbol("$").create(); c2 = CurrencyBuilder.withDb(db).name("EUR").title("Euro").symbol("€").create(); c3 = CurrencyBuilder.withDb(db).name("RUB").title("Ruble").symbol("p.").create(); } public void test_should_calculate_opposite_rate() { ExchangeRate rate = RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 17)).rate(0.78592f).create(); ExchangeRate flip = rate.flip(); assertEquals(c2.id, flip.fromCurrencyId); assertEquals(c1.id, flip.toCurrencyId); assertEquals(rate.date, flip.date); assertEquals(1.27239f, flip.rate, 0.00001f); ExchangeRate rate1 = flip.flip(); assertEquals(rate.fromCurrencyId, rate1.fromCurrencyId); assertEquals(rate.toCurrencyId, rate1.toCurrencyId); assertEquals(rate.date, rate1.date); assertEquals(rate.rate, rate1.rate, 0.00001f); } public void test_should_reset_time_to_midnight() { RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 17).at(12, 23, 45, 456)).rate(0.78592f).create(); assertEquals(DateTime.date(2012, 1, 17).atMidnight().asLong(), db.findRate(c1, c2, DateTime.date(2012, 1, 17).asLong()).date); } public void test_should_insert_currency_rate_for_both_sides() { RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 17)).rate(0.78592f).create(); assertEquals(0.78592f, db.findRate(c1, c2, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); assertEquals(1.27239f, db.findRate(c2, c1, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); } public void test_should_update_existing_rate() { RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 17)).rate(0.78592f).create(); assertEquals(0.78592f, db.findRate(c1, c2, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); assertEquals(1.27239f, db.findRate(c2, c1, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); //replace rate c1->c2 RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 17)).rate(0.92785f).create(); assertEquals(1, db.findRates(c1).size()); assertEquals(0.92785f, db.findRate(c1, c2, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); assertEquals(1.07776f, db.findRate(c2, c1, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); //replace rate c2->c1 RateBuilder.withDb(db).from(c2).to(c1).at(DateTime.date(2012, 1, 17)).rate(1.5f).create(); assertEquals(1, db.findRates(c2).size()); assertEquals(0.66667f, db.findRate(c1, c2, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); assertEquals(1.5f, db.findRate(c2, c1, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); } public void test_should_save_multiple_rates() { RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 17)).rate(0.78592f).create(); RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 18)).rate(0.78635f).create(); List<ExchangeRate> rates = db.findRates(c1); assertEquals(2, rates.size()); assertEquals(0.78635f, rates.get(0).rate, 0.00001f); assertEquals(0.78592f, rates.get(1).rate, 0.00001f); rates = db.findRates(c2, c1); assertEquals(2, rates.size()); assertEquals(1.0f/0.78635f, rates.get(0).rate, 0.00001f); assertEquals(1.0f/0.78592f, rates.get(1).rate, 0.00001f); } public void test_should_delete_rate() { ExchangeRate r = RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 17)).rate(0.78592f).create(); RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 18)).rate(0.78635f).create(); assertEquals(2, db.findRates(c1).size()); assertEquals(2, db.findRates(c2).size()); db.deleteRate(r); assertEquals(1, db.findRates(c1).size()); assertEquals(1, db.findRates(c2).size()); ExchangeRateProvider rates = db.getLatestRates(); assertEquals(0.78635f, rates.getRate(c1, c2, DateTime.date(2012, 1, 20).asLong()).rate, 0.00001f); } public void test_should_replace_rate() { RateBuilder.withDb(db).from(c1).to(c2).at(DateTime.date(2012, 1, 17)).rate(0.78592f).create(); assertEquals(1, db.findRates(c1).size()); assertEquals(1, db.findRates(c2).size()); assertEquals(0.78592f, db.findRate(c1, c2, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); assertEquals(1f/0.78592f, db.findRate(c2, c1, DateTime.date(2012, 1, 17).asLong()).rate, 0.00001f); ExchangeRate rate = RateBuilder.inMemory().from(c1).to(c2).at(DateTime.date(2012, 1, 18)).rate(0.888f).create(); db.replaceRate(rate, DateTime.date(2012, 1, 17).asLong()); assertEquals(1, db.findRates(c1).size()); assertEquals(1, db.findRates(c2).size()); assertEquals(0.888f, db.findRate(c1, c2, DateTime.date(2012, 1, 18).asLong()).rate, 0.00001f); assertEquals(1f/0.888f, db.findRate(c2, c1, DateTime.date(2012, 1, 18).asLong()).rate, 0.00001f); } public void test_should_save_downloaded_rates() { //given List<ExchangeRate> downloadedRates = Arrays.asList( RateBuilder.inMemory().from(c1).to(c2).at(DateTime.date(2012, 1, 18)).rate(0.1f).create(), RateBuilder.inMemory().from(c1).to(c3).at(DateTime.date(2012, 1, 18)).rate(0.2f).create(), RateBuilder.inMemory().from(c2).to(c3).at(DateTime.date(2012, 1, 18)).rate(0.3f).create(), RateBuilder.inMemory().from(c2).to(c3).at(DateTime.date(2012, 1, 19)).rate(0.3f).notOK().create() ); //when db.saveDownloadedRates(downloadedRates); //then assertEquals(2, db.findRates(c1).size()); assertEquals(2, db.findRates(c2).size()); assertEquals(2, db.findRates(c3).size()); } }