From 0187457ae8a3d4c09d7262bb6d596d9e53c98473 Mon Sep 17 00:00:00 2001 From: Elisabeth Berg Date: Sun, 24 May 2026 22:32:47 +0200 Subject: [PATCH] Added more tests to PortfolioTest --- src/test/java/PortfolioTest.java | 139 ++++++++++++++++++------ target/test-classes/PortfolioTest.class | Bin 2606 -> 5806 bytes 2 files changed, 103 insertions(+), 36 deletions(-) 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 9be31bceb298913e26cf5eed9840f892c234ed1a..679e0c4d7ea6495c5d426472e08b43044c6df084 100644 GIT binary patch literal 5806 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