package edu.brown.cs.student; import edu.brown.cs.student.term.DatabaseQuerier; import edu.brown.cs.student.term.hub.Holder; import edu.brown.cs.student.term.hub.HubSearch; import edu.brown.cs.student.term.hub.LinkMapper; import edu.brown.cs.student.term.profit.ProfitCalculation; import edu.brown.cs.student.term.profit.StockHolding; import edu.brown.cs.student.term.repl.commands.SetupCommand; import edu.brown.cs.student.term.trade.Trade; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.time.LocalDate; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.sql.Date; import java.time.Instant; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class ProfitCalculationTest { /** * these should span the entire mock dataset */ //12 am on 3/11 in UTC private Instant start = Instant.parse("2021-03-11T05:00:00.00Z"); //12 am on 3/28 in UTC private Instant end = Instant.parse("2021-03-28T05:00:00.00Z"); private DatabaseQuerier db; @Before public void setUp() { try { db = new DatabaseQuerier("data/profit_testing.sqlite3"); } catch (Exception e) { System.out.println("DBQuerier Test, couldn't connect to db???"); } } @After public void tearDown() { db = null; } @Test public void testBasicTrades() { setUp(); ProfitCalculation profitCalculation = new ProfitCalculation(DatabaseQuerier.getConn(), "Don", new Date(1518010558000l), new Date(1618698807000l)); //price of GME at end time is 154.69 List trade = profitCalculation.getHoldingsList(); //buy with no sell assertEquals(trade.get(0).getUnrealizedGain(), 3842.25, .25); assertEquals(trade.get(0).getRealizedGain(), 0, .01); //just sell profitCalculation = new ProfitCalculation(DatabaseQuerier.getConn(), "SELL", new Date(1518010558000l), new Date(1618698807000l)); trade = profitCalculation.getHoldingsList(); assertTrue(trade.isEmpty()); assertEquals(profitCalculation.calculateGains(), 0, 0.001); tearDown(); } @Test public void otherBuySellCases() { setUp(); //buy and sell at same timestamp ProfitCalculation profitCalculation = new ProfitCalculation(DatabaseQuerier.getConn(), "concurrentBS", new Date(1518010558000l), new Date(1715629591000l)); assertEquals(profitCalculation.getProfitMap().get(100), 1, .01); //buys at multiple prices profitCalculation = new ProfitCalculation(DatabaseQuerier.getConn(), "mulitpleBuyPrices", new Date(1518010558000l), new Date(1715629591000l)); assertEquals(profitCalculation.getProfitMap().get(101), 1, .01); assertEquals(profitCalculation.getMoneyInput(), 3750, .01); assertEquals(profitCalculation.getHoldingsList().get(0).getRealizedGain(), 3750, 0.01); //left over holdings profitCalculation = new ProfitCalculation(DatabaseQuerier.getConn(), "dontSellAll", new Date(1518010558000l), new Date(1715629591000l)); assertEquals(profitCalculation.getHoldingsList().get(0).getShares(), 25, .01); tearDown(); } @Test public void testAPICalls() { ProfitCalculation profitCalculation = new ProfitCalculation(DatabaseQuerier.getConn(), "Don", new Date(1618234200000l), new Date(1618703800000l)); //check sp500 calculation. 411.28 to 417.30 assertEquals(profitCalculation.compareToSP500(), .01464, .001); tearDown(); } @Test public void databaseAndConnectionIssues() { //no database connection ProfitCalculation profitCalculation = new ProfitCalculation(null, "Don", new Date(1518010558000l), new Date(1618698807000l)); assertEquals(profitCalculation.getProfitMap(), new HashMap<>()); assertEquals(profitCalculation.getHoldingsList(), new LinkedList<>()); setUp(); //invalid person profitCalculation = new ProfitCalculation(DatabaseQuerier.getConn(), "1234", new Date(1518010558000l), new Date(1618698807000l)); assertEquals(profitCalculation.getHoldingsList(), new LinkedList<>()); //invalid stock ticker profitCalculation = new ProfitCalculation(DatabaseQuerier.getConn(), "invalidTicker", new Date(1518010558000l), new Date(1618698807000l)); assertEquals(profitCalculation.getHoldingsList().get(0).getRealizedGain(), 0, .01); assertEquals(profitCalculation.getHoldingsList().get(0).getUnrealizedGain(), 0, .01); } }