package uk.ac.cam.cstibhotel.otcanalyser.dataanalysis;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import uk.ac.cam.cstibhotel.otcanalyser.communicationlayer.SearchResult;
import uk.ac.cam.cstibhotel.otcanalyser.communicationlayer.Search;
import uk.ac.cam.cstibhotel.otcanalyser.dataanalysis.DBAnalysis;
import uk.ac.cam.cstibhotel.otcanalyser.database.Database;
import uk.ac.cam.cstibhotel.otcanalyser.trade.AssetClass;
import uk.ac.cam.cstibhotel.otcanalyser.trade.Trade;
import uk.ac.cam.cstibhotel.otcanalyser.trade.TradeType;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class DBAnalysisTest {
private Database db;
private Connection connection;
//fill database with fake trades
public void fakeDB() {
if (db == null) {
db = Database.getDB();
connection = db.getConnection();
ArrayList<Trade> trades = new ArrayList<>();
Calendar c = Calendar.getInstance();
c.set(2323, 1, 1, 11, 13);
for (int i = 0; i < 10; i ++) {
Trade t = new Trade();
t.setDisseminationID(i);
t.setNotionalCurrency1("USD");
t.setSettlementCurrency("USD");
t.setRoundedNotionalAmount1(i);
c.set(Calendar.DATE, i + 1);
t.setEffectiveDate(c.getTime());
t.setEndDate(c.getTime());
t.setExecutionTimestamp(c.getTime());
t.setTradeType(TradeType.OPTION);
t.setAssetClass(AssetClass.COMMODITY);
trades.add(t);
}
for (int i = 10; i < 20; i ++) {
Trade t = new Trade();
t.setDisseminationID(i);
t.setNotionalCurrency1("GBP");
t.setSettlementCurrency("GBP");
t.setRoundedNotionalAmount1(i);
c.set(Calendar.DATE, i - 2);
t.setEffectiveDate(c.getTime());
t.setEndDate(c.getTime());
t.setExecutionTimestamp(c.getTime());
t.setTradeType(TradeType.OPTION);
t.setAssetClass(AssetClass.COMMODITY);
trades.add(t);
}
db.addTrade(trades);
}
}
@Test
public void testMaxRNA() throws SQLException {
fakeDB();
Search s = new Search();
s.setTradeType(TradeType.OPTION);
s.setAssetClass(AssetClass.COMMODITY);
s.setMinPrice(0);
s.setMaxPrice(1000000000);
Calendar c = Calendar.getInstance();
c.set(2100, 1, 1, 1, 13);
s.setStartTime(c.getTime());
c.set(2400, 1, 1, 1, 1);
s.setEndTime(c.getTime());
s.setAsset("");
s.setCurrency("");
AnalysisItem itm;
try {
SearchResult sr = Database.getDB().search(s);
if (sr.getNumResults() > 0) {
itm = DBAnalysis.getMaxPrice(s, connection);
assertEquals(itm.getPrice(), 19, 0);
} else {
System.out.println("Empty");
}
} catch (SQLException e){
System.err.println("problem with getMaxPrice");
e.printStackTrace();
}
}
@Test
public void testMaxRNA1PerMonth() throws SQLException {
fakeDB();
Search s = new Search();
s.setTradeType(TradeType.OPTION);
s.setAssetClass(AssetClass.COMMODITY);
s.setMinPrice(0);
s.setMaxPrice(1000000000);
Calendar c = Calendar.getInstance();
c.set(2100, 1, 1, 1, 13);
s.setStartTime(c.getTime());
c.set(2400, 1, 1, 1, 1);
s.setEndTime(c.getTime());
s.setAsset("");
s.setCurrency("");
List<PriceTimePair> list;
try {
SearchResult sr = Database.getDB().search(s);
if (sr.getNumResults() > 0) {
list = DBAnalysis.getPerMonthStats(s, connection, DBAnalysis.EXECUTION_TIME).getMax();
assertEquals((list.get(0).getPrice()), 9, 0);
assertEquals((list.get(1).getPrice()), 19, 0);
} else {
System.out.println("Empty");
}
} catch (SQLException e){
System.err.println("problem with getMaxPricePerMonth");
}
}
@Test
public void testAvgRNA1PerMonth() throws SQLException{
fakeDB();
Search s = new Search();
s.setTradeType(TradeType.OPTION);
s.setAssetClass(AssetClass.COMMODITY);
s.setMinPrice(0);
s.setMaxPrice(1000000000);
Calendar c = Calendar.getInstance();
c.set(2100, 1, 1, 1, 13);
s.setStartTime(c.getTime());
c.set(2400, 1, 1, 1, 1);
s.setEndTime(c.getTime());
s.setAsset("");
s.setCurrency("");
List<PriceTimePair> list;
try {
SearchResult sr = Database.getDB().search(s);
if (sr.getNumResults() > 0) {
list = DBAnalysis.getPerMonthStats(s, connection, DBAnalysis.EXECUTION_TIME).getAvg();
assertEquals((list.get(0).getPrice()), 4.5, 0);
} else {
System.out.println("Empty");
}
} catch (SQLException e){
System.err.println("problem with getAvgPricePerMonth");
}
}
@Test
public void testGetCurrency() throws SQLException {
fakeDB();
Search s = new Search();
s.setTradeType(TradeType.OPTION);
s.setAssetClass(AssetClass.COMMODITY);
s.setMinPrice(0);
s.setMaxPrice(1000000000);
Calendar c = Calendar.getInstance();
c.set(2100, 1, 1, 1, 13);
s.setStartTime(c.getTime());
c.set(2400, 1, 1, 1, 1);
s.setEndTime(c.getTime());
s.setAsset("");
s.setCurrency("");
List<String> list;
try {
SearchResult sr = Database.getDB().search(s);
if (sr.getNumResults() > 0) {
list = DBAnalysis.getCurrencies(s, connection);
assertEquals(list.get(0), "GBP");
assertEquals(list.get(1), "USD");
} else {
System.out.println("Empty");
}
} catch (SQLException e){
System.err.println("problem with getCurrency");
}
}
}