diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Exchange.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Exchange.java index 9cbccbf..6276925 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Exchange.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Exchange.java @@ -55,11 +55,13 @@ public Transaction buy(String symbol, BigDecimal quantity, Player player) { Stock stock = stockMap.get(symbol); Share share = new Share(stock, quantity, stock.getSalesPrice()); TransactionCalculator calculator = new PurchaseCalculator(share); + player.withdrawMoney(calculator.calculateTotal()); return new Purchase(share, week, calculator); } public Transaction sell(Share share, Player player) { TransactionCalculator calculator = new SaleCalculator(share); + player.addMoney(calculator.calculateTotal()); return new Sale(share, week, calculator); } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Player.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Player.java index 0114bbf..0d5939d 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Player.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Player.java @@ -1,7 +1,6 @@ package edu.ntnu.idi.idatt2003.g40.mappe; import java.math.BigDecimal; -import java.util.Objects; public class Player { diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/ExchangeTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/ExchangeTest.java index a06f463..9e11d44 100644 --- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/ExchangeTest.java +++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/ExchangeTest.java @@ -1,3 +1,92 @@ -public class ExchangeTest { - -} +package edu.ntnu.idi.idatt2003.g40.mappe; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class ExchangeTest { + + @Test + void constructorSetsNameWeekAndStocksCorrectly() { + Stock apple = new Stock("AAPL", "Apple", new BigDecimal("150")); + Stock tesla = new Stock("TSLA", "Tesla", new BigDecimal("200")); + + Exchange exchange = new Exchange("NASDAQ", List.of(apple, tesla)); + + assertEquals("NASDAQ", exchange.getName()); + assertEquals(1, exchange.getWeek()); + assertTrue(exchange.hasStock("AAPL")); + assertTrue(exchange.hasStock("TSLA")); + } + + @Test + void getStockReturnsCorrectStock() { + Stock apple = new Stock("AAPL", "Apple", new BigDecimal("150")); + Exchange exchange = new Exchange("NASDAQ", List.of(apple)); + + Stock result = exchange.getStock("AAPL"); + + assertSame(apple, result); + } + + @Test + void findStocksReturnsMatchingStocksBySymbolOrCompany() { + Stock apple = new Stock("AAPL", "Apple", new BigDecimal("150")); + Stock tesla = new Stock("TSLA", "Tesla", new BigDecimal("200")); + Exchange exchange = new Exchange("NASDAQ", List.of(apple, tesla)); + + List resultBySymbol = exchange.findStocks("AAP"); + List resultByCompany = exchange.findStocks("tes"); + + assertEquals(1, resultBySymbol.size()); + assertTrue(resultBySymbol.contains(apple)); + + assertEquals(1, resultByCompany.size()); + assertTrue(resultByCompany.contains(tesla)); + } + + @Test + void buyReturnsPurchaseAndWithdrawsMoneyFromPlayer() { + Stock apple = new Stock("AAPL", "Apple", new BigDecimal("100")); + Exchange exchange = new Exchange("NASDAQ", List.of(apple)); + Player player = new Player("Alice", new BigDecimal("1000")); + + Transaction transaction = exchange.buy("AAPL", new BigDecimal("2"), player); + + assertInstanceOf(Purchase.class, transaction); + assertEquals(1, transaction.getWeek()); + assertEquals(new BigDecimal("2"), transaction.getShare().getQuantity()); + assertEquals(new BigDecimal("100"), transaction.getShare().getPurchasePrice()); + assertEquals(new BigDecimal("799.000"), player.getMoney()); + } + + @Test + void sellReturnsSaleAndAddsMoneyToPlayer() { + Stock apple = new Stock("AAPL", "Apple", new BigDecimal("150")); + Exchange exchange = new Exchange("NASDAQ", List.of(apple)); + Player player = new Player("Alice", new BigDecimal("1000")); + Share share = new Share(apple, new BigDecimal("2"), new BigDecimal("100")); + + Transaction transaction = exchange.sell(share, player); + + assertInstanceOf(Sale.class, transaction); + assertEquals(1, transaction.getWeek()); + assertSame(share, transaction.getShare()); + assertEquals(new BigDecimal("1267.9000"), player.getMoney()); + } + + @Test + void advanceIncreasesWeekAndUpdatesStockPrice() { + Stock apple = new Stock("AAPL", "Apple", new BigDecimal("100")); + Exchange exchange = new Exchange("NASDAQ", List.of(apple)); + + BigDecimal oldPrice = apple.getSalesPrice(); + exchange.advance(); + + assertEquals(2, exchange.getWeek()); + assertNotEquals(oldPrice, apple.getSalesPrice()); + } +} \ No newline at end of file diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PlayerTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PlayerTest.java index e3c1316..f62c0d5 100644 --- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PlayerTest.java +++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PlayerTest.java @@ -1,3 +1,48 @@ -public class PlayerTest { - -} +package edu.ntnu.idi.idatt2003.g40.mappe; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.*; + +class PlayerTest { + + @Test + void constructorSetsNameMoneyPortfolioAndArchive() { + Player player = new Player("Alice", new BigDecimal("1000")); + + assertEquals("Alice", player.getName()); + assertEquals(new BigDecimal("1000"), player.getMoney()); + assertNotNull(player.getPortfolio()); + assertNotNull(player.getTransactionArchive()); + } + + @Test + void addMoneyIncreasesBalance() { + Player player = new Player("Bob", new BigDecimal("500")); + + player.addMoney(new BigDecimal("200")); + + assertEquals(new BigDecimal("700"), player.getMoney()); + } + + @Test + void withdrawMoneyDecreasesBalance() { + Player player = new Player("Charlie", new BigDecimal("500")); + + player.withdrawMoney(new BigDecimal("150")); + + assertEquals(new BigDecimal("350"), player.getMoney()); + } + + @Test + void addAndWithdrawMoneyUpdateBalanceCorrectly() { + Player player = new Player("Dana", new BigDecimal("1000")); + + player.addMoney(new BigDecimal("250")); + player.withdrawMoney(new BigDecimal("300")); + + assertEquals(new BigDecimal("950"), player.getMoney()); + } +} \ No newline at end of file diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PortfolioTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PortfolioTest.java index 3518005..c8a5e3a 100644 --- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PortfolioTest.java +++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PortfolioTest.java @@ -1,3 +1,80 @@ -public class PortfolioTest { - -} +package edu.ntnu.idi.idatt2003.g40.mappe; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class PortfolioTest { + + @Test + void addShareAddsShareToPortfolio() { + Portfolio portfolio = new Portfolio(); + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + + boolean result = portfolio.addShare(share); + + assertTrue(result); + assertTrue(portfolio.contains(share)); + } + + @Test + void removeShareRemovesShareFromPortfolio() { + Portfolio portfolio = new Portfolio(); + Stock stock = new Stock("TSLA", "Tesla", new BigDecimal("200")); + Share share = new Share(stock, new BigDecimal("1"), new BigDecimal("200")); + + portfolio.addShare(share); + boolean result = portfolio.removeShare(share); + + assertTrue(result); + assertFalse(portfolio.contains(share)); + } + + @Test + void getSharesReturnsAllShares() { + Portfolio portfolio = new Portfolio(); + + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("3"), new BigDecimal("150")); + + portfolio.addShare(share); + + List shares = portfolio.getShares(); + + assertEquals(1, shares.size()); + assertTrue(shares.contains(share)); + } + + @Test + void getSharesWithSymbolReturnsMatchingShares() { + Portfolio portfolio = new Portfolio(); + + Stock apple = new Stock("AAPL", "Apple", new BigDecimal("150")); + Stock tesla = new Stock("TSLA", "Tesla", new BigDecimal("200")); + + Share appleShare = new Share(apple, new BigDecimal("1"), new BigDecimal("150")); + Share teslaShare = new Share(tesla, new BigDecimal("1"), new BigDecimal("200")); + + portfolio.addShare(appleShare); + portfolio.addShare(teslaShare); + + List result = portfolio.getShares("AAPL"); + + assertEquals(1, result.size()); + assertTrue(result.contains(appleShare)); + } + + @Test + void containsReturnsFalseWhenShareNotPresent() { + Portfolio portfolio = new Portfolio(); + + Stock stock = new Stock("NVDA", "Nvidia", new BigDecimal("800")); + Share share = new Share(stock, new BigDecimal("1"), new BigDecimal("800")); + + assertFalse(portfolio.contains(share)); + } +} \ No newline at end of file diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PurchaseCalculatorTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PurchaseCalculatorTest.java index 6737cf2..4c73305 100644 --- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PurchaseCalculatorTest.java +++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/PurchaseCalculatorTest.java @@ -1,3 +1,45 @@ -public class PurchaseCalculatorTest { - +package edu.ntnu.idi.idatt2003.g40.mappe; + +import org.junit.jupiter.api.Test; +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class PurchaseCalculatorTest { + + @Test + void calculateGrossReturnsPurchasePriceTimesQuantity() { + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + PurchaseCalculator calculator = new PurchaseCalculator(share); + + assertEquals(new BigDecimal("200"), calculator.calculateGross()); + } + + @Test + void calculateCommissionReturnsHalfPercentOfGross() { + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + PurchaseCalculator calculator = new PurchaseCalculator(share); + + assertEquals(new BigDecimal("1.000"), calculator.calculateCommission()); + } + + @Test + void calculateTaxReturnsZero() { + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + PurchaseCalculator calculator = new PurchaseCalculator(share); + + assertEquals(BigDecimal.ZERO, calculator.calculateTax()); + } + + @Test + void calculateTotalReturnsGrossPlusCommission() { + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + PurchaseCalculator calculator = new PurchaseCalculator(share); + + assertEquals(new BigDecimal("201.000"), calculator.calculateTotal()); + } } diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/SaleCalculatorTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/SaleCalculatorTest.java index 5422865..3b7a0c6 100644 --- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/SaleCalculatorTest.java +++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/SaleCalculatorTest.java @@ -1,3 +1,55 @@ -public class SaleCalculatorTest { - -} +package edu.ntnu.idi.idatt2003.g40.mappe; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SaleCalculatorTest { + + @Test + void calculateGrossReturnsSalesPriceTimesQuantity() { + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + SaleCalculator calculator = new SaleCalculator(share); + + assertEquals(new BigDecimal("300"), calculator.calculateGross()); + } + + @Test + void calculateCommissionReturnsOnePercentOfGross() { + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + SaleCalculator calculator = new SaleCalculator(share); + + assertEquals(new BigDecimal("3.00"), calculator.calculateCommission()); + } + + @Test + void calculateTaxReturnsThirtyPercentOfProfitWhenProfitIsPositive() { + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + SaleCalculator calculator = new SaleCalculator(share); + + assertEquals(new BigDecimal("29.1000"), calculator.calculateTax()); + } + + @Test + void calculateTaxReturnsZeroWhenProfitIsZeroOrNegative() { + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("90")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + SaleCalculator calculator = new SaleCalculator(share); + + assertEquals(BigDecimal.ZERO, calculator.calculateTax()); + } + + @Test + void calculateTotalReturnsGrossMinusCommissionMinusTax() { + Stock stock = new Stock("AAPL", "Apple", new BigDecimal("150")); + Share share = new Share(stock, new BigDecimal("2"), new BigDecimal("100")); + SaleCalculator calculator = new SaleCalculator(share); + + assertEquals(new BigDecimal("267.9000"), calculator.calculateTotal()); + } +} \ No newline at end of file diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/ShareTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/ShareTest.java index 2e94fdf..0a5deb1 100644 --- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/ShareTest.java +++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/ShareTest.java @@ -1,3 +1,48 @@ -public class ShareTest { - -} +package edu.ntnu.idi.idatt2003.g40.mappe; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; + +class ShareTest { + + @Test + void constructorStoresAllValuesCorrectly() { + Stock stock = new Stock("AAPL", "Apple Inc.", new BigDecimal("150.00")); + BigDecimal quantity = new BigDecimal("10"); + BigDecimal purchasePrice = new BigDecimal("145.50"); + + Share share = new Share(stock, quantity, purchasePrice); + + assertSame(stock, share.getStock()); + assertEquals(quantity, share.getQuantity()); + assertEquals(purchasePrice, share.getPurchasePrice()); + } + + @Test + void shareSupportsDecimalValues() { + Stock stock = new Stock("TSLA", "Tesla Inc.", new BigDecimal("200.00")); + + Share share = new Share( + stock, + new BigDecimal("2.5"), + new BigDecimal("198.75") + ); + + assertEquals(new BigDecimal("2.5"), share.getQuantity()); + assertEquals(new BigDecimal("198.75"), share.getPurchasePrice()); + } + + @Test + void getStockReturnsCorrectStockObject() { + Stock stock = new Stock("NVDA", "NVIDIA Corporation", new BigDecimal("875.40")); + Share share = new Share(stock, new BigDecimal("4"), new BigDecimal("850.00")); + + assertSame(stock, share.getStock()); + assertEquals("NVDA", share.getStock().getSymbol()); + assertEquals("NVIDIA Corporation", share.getStock().getCompany()); + } +} \ No newline at end of file diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/TransactionArchiveTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/TransactionArchiveTest.java index cf935b8..17726ad 100644 --- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/TransactionArchiveTest.java +++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/TransactionArchiveTest.java @@ -1,3 +1,130 @@ -public class TransactionArchiveTest { - -} +package edu.ntnu.idi.idatt2003.g40.mappe; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class TransactionArchiveTest { + + private final TransactionCalculator calculator = new TransactionCalculator() { + @Override + public BigDecimal calculateGross() { + return BigDecimal.ZERO; + } + + @Override + public BigDecimal calculateCommission() { + return BigDecimal.ZERO; + } + + @Override + public BigDecimal calculateTax() { + return BigDecimal.ZERO; + } + + @Override + public BigDecimal calculateTotal() { + return BigDecimal.ZERO; + } + }; + + @Test + void newArchiveIsEmpty() { + TransactionArchive archive = new TransactionArchive(); + + assertTrue(archive.isEmpty()); + } + + @Test + void addMakesArchiveNonEmpty() { + TransactionArchive archive = new TransactionArchive(); + Transaction transaction = createPurchase("AAPL", "Apple", 1); + + boolean result = archive.add(transaction); + + assertTrue(result); + assertFalse(archive.isEmpty()); + } + + @Test + void getTransactionsReturnsOnlyTransactionsFromGivenWeek() { + TransactionArchive archive = new TransactionArchive(); + + Transaction transaction1 = createPurchase("AAPL", "Apple", 1); + Transaction transaction2 = createSale("TSLA", "Tesla", 2); + Transaction transaction3 = createPurchase("NVDA", "Nvidia", 1); + + archive.add(transaction1); + archive.add(transaction2); + archive.add(transaction3); + + List result = archive.getTransactions(1); + + assertEquals(2, result.size()); + assertTrue(result.contains(transaction1)); + assertTrue(result.contains(transaction3)); + } + + @Test + void getPurchasesReturnsOnlyPurchasesFromGivenWeek() { + TransactionArchive archive = new TransactionArchive(); + + Purchase purchase1 = createPurchase("AAPL", "Apple", 1); + Purchase purchase2 = createPurchase("NVDA", "Nvidia", 2); + Sale sale = createSale("TSLA", "Tesla", 1); + + archive.add(purchase1); + archive.add(purchase2); + archive.add(sale); + + List result = archive.getPurchases(1); + + assertEquals(1, result.size()); + assertTrue(result.contains(purchase1)); + } + + @Test + void getSalesReturnsOnlySalesFromGivenWeek() { + TransactionArchive archive = new TransactionArchive(); + + Sale sale1 = createSale("TSLA", "Tesla", 1); + Sale sale2 = createSale("NVDA", "Nvidia", 2); + Purchase purchase = createPurchase("AAPL", "Apple", 1); + + archive.add(sale1); + archive.add(sale2); + archive.add(purchase); + + List result = archive.getSales(1); + + assertEquals(1, result.size()); + assertTrue(result.contains(sale1)); + } + + @Test + void countDistinctWeeksCountsUniqueWeeksOnly() { + TransactionArchive archive = new TransactionArchive(); + + archive.add(createPurchase("AAPL", "Apple", 1)); + archive.add(createSale("TSLA", "Tesla", 1)); + archive.add(createPurchase("NVDA", "Nvidia", 2)); + archive.add(createSale("META", "Meta", 3)); + + assertEquals(3, archive.countDistinctWeeks()); + } + + private Purchase createPurchase(String symbol, String company, int week) { + Stock stock = new Stock(symbol, company, new BigDecimal("100")); + Share share = new Share(stock, BigDecimal.ONE, new BigDecimal("100")); + return new Purchase(share, week, calculator); + } + + private Sale createSale(String symbol, String company, int week) { + Stock stock = new Stock(symbol, company, new BigDecimal("100")); + Share share = new Share(stock, BigDecimal.ONE, new BigDecimal("100")); + return new Sale(share, week, calculator); + } +} \ No newline at end of file