diff --git a/src/test/java/PortfolioTest.java b/src/test/java/PortfolioTest.java index d921601..34e46aa 100644 --- a/src/test/java/PortfolioTest.java +++ b/src/test/java/PortfolioTest.java @@ -1,5 +1,6 @@ import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import Model.Portfolio; @@ -7,82 +8,148 @@ import Model.Stock; import java.math.BigDecimal; +import java.util.List; public class PortfolioTest { - @Test - void testAddSharePortfolio() { - Portfolio portfolio = new Portfolio(); + private Portfolio portfolio; + private Stock stock; + private Share share; - Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); - Share share = new Share(stock, new BigDecimal("10"), new BigDecimal("140")); + @BeforeEach + void setUp() { + portfolio = new Portfolio(); + stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + share = new Share(stock, new BigDecimal("10"), new BigDecimal("140")); + } - boolean result = portfolio.addShare(share); + // ---- Positive tests ---- + @Test + void testAddShare() { + boolean result = portfolio.addShare(share); assertTrue(result); assertTrue(portfolio.contains(share)); } @Test - void testRemoveSharePortfolio() { - Portfolio portfolio = new Portfolio(); - - Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); - Share share = new Share(stock, new BigDecimal("10"), new BigDecimal("140")); + void testAddMultipleShares() { + Stock stock2 = new Stock("GOOGL", "Google", new BigDecimal("200")); + Share share2 = new Share(stock2, new BigDecimal("5"), new BigDecimal("190")); portfolio.addShare(share); + portfolio.addShare(share2); - boolean result = portfolio.removeShare(share); + assertEquals(2, portfolio.getShares().size()); + } + @Test + void testRemoveShare() { + portfolio.addShare(share); + boolean result = portfolio.removeShare(share); assertTrue(result); assertFalse(portfolio.contains(share)); } @Test - void testGetSharesPortfolio() { - Portfolio portfolio = new Portfolio(); - - Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); - Share share = new Share(stock, new BigDecimal("10"), new BigDecimal("140")); + void testRemoveShareNotInPortfolioReturnsFalse() { + boolean result = portfolio.removeShare(share); + assertFalse(result); + } + @Test + void testGetSharesReturnsAll() { portfolio.addShare(share); - - var shares = portfolio.getShares(); - + List shares = portfolio.getShares(); assertEquals(1, shares.size()); assertTrue(shares.contains(share)); } @Test - void testGetSharesBySymbolPortfolio() { - Portfolio portfolio = new Portfolio(); + void testGetSharesIsDefensiveCopy() { + portfolio.addShare(share); + List copy = portfolio.getShares(); + copy.clear(); + assertEquals(1, portfolio.getShares().size()); + } - Stock stock1 = new Stock("AAPL", "Apple", new BigDecimal("150")); + @Test + void testGetSharesBySymbol() { Stock stock2 = new Stock("GOOGL", "Google", new BigDecimal("200")); + Share share2 = new Share(stock2, new BigDecimal("5"), new BigDecimal("190")); - Share share1 = new Share(stock1, new BigDecimal("10"), new BigDecimal("140")); - Share share2 = new Share(stock2, new BigDecimal("10"), new BigDecimal("190")); - - portfolio.addShare(share1); + portfolio.addShare(share); portfolio.addShare(share2); - var result = portfolio.getShares("AAPL"); - + List result = portfolio.getShares("AAPL"); assertEquals(1, result.size()); - assertTrue(result.contains(share1)); + assertTrue(result.contains(share)); + } + + @Test + void testGetSharesBySymbolNoMatch() { + portfolio.addShare(share); + List result = portfolio.getShares("MSFT"); + assertTrue(result.isEmpty()); + } + + @Test + void testContainsReturnsTrueWhenPresent() { + portfolio.addShare(share); + assertTrue(portfolio.contains(share)); } @Test - void testContainsPortfolio() { - Portfolio portfolio = new Portfolio(); + void testContainsReturnsFalseWhenAbsent() { + assertFalse(portfolio.contains(share)); + } - Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); - Share share = new Share(stock, new BigDecimal("10"), new BigDecimal("140")); + @Test + void testGetNetWorthEmptyPortfolio() { + assertEquals(BigDecimal.ZERO, portfolio.getNetWorth()); + } + @Test + void testGetNetWorthWithShares() { portfolio.addShare(share); + // net worth should be positive when portfolio has holdings + assertTrue(portfolio.getNetWorth().compareTo(BigDecimal.ZERO) > 0); + } - assertTrue(portfolio.contains(share)); + // ---- Negative tests ---- + + @Test + void testAddNullShareThrows() { + assertThrows(IllegalArgumentException.class, () -> + portfolio.addShare(null) + ); } - + @Test + void testRemoveNullShareThrows() { + assertThrows(IllegalArgumentException.class, () -> + portfolio.removeShare(null) + ); + } + + @Test + void testContainsNullShareThrows() { + assertThrows(IllegalArgumentException.class, () -> + portfolio.contains(null) + ); + } + + @Test + void testGetSharesByNullSymbolThrows() { + assertThrows(IllegalArgumentException.class, () -> + portfolio.getShares((String) null) + ); + } + + @Test + void testGetSharesByBlankSymbolThrows() { + assertThrows(IllegalArgumentException.class, () -> + portfolio.getShares(" ") + ); + } } diff --git a/target/test-classes/PortfolioTest.class b/target/test-classes/PortfolioTest.class index 9be31bc..679e0c4 100644 Binary files a/target/test-classes/PortfolioTest.class and b/target/test-classes/PortfolioTest.class differ