From 6977a2131b5e4c47116b85a6fdbfeb7d314aaad5 Mon Sep 17 00:00:00 2001 From: martin Date: Mon, 20 Apr 2026 09:56:21 +0200 Subject: [PATCH 1/2] Changing to factory pattern for Transaction --- .../TransactionCalculatorFactory.java | 5 +++- src/main/java/millions/model/Exchange.java | 30 ++++++++++--------- src/main/java/millions/model/Player.java | 2 ++ .../model/calculators/SaleCalculator.java | 3 ++ src/test/java/millions/ExchangeTest.java | 2 +- src/test/java/millions/SaleTest.java | 2 +- 6 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/main/java/millions/calculators/TransactionCalculatorFactory.java b/src/main/java/millions/calculators/TransactionCalculatorFactory.java index dd79b39..8d461bd 100644 --- a/src/main/java/millions/calculators/TransactionCalculatorFactory.java +++ b/src/main/java/millions/calculators/TransactionCalculatorFactory.java @@ -1,6 +1,9 @@ package millions.calculators; -import millions.Share; +import millions.model.Share; +import millions.model.calculators.PurchaseCalculator; +import millions.model.calculators.SaleCalculator; +import millions.model.calculators.TransactionCalculator; public class TransactionCalculatorFactory { diff --git a/src/main/java/millions/model/Exchange.java b/src/main/java/millions/model/Exchange.java index 8f59eb7..46ab5ef 100644 --- a/src/main/java/millions/model/Exchange.java +++ b/src/main/java/millions/model/Exchange.java @@ -9,12 +9,17 @@ import java.util.Map; import java.util.Random; import java.util.stream.Collectors; +import millions.model.factories.PurchaseFactory; +import millions.model.factories.SaleFactory; +import millions.model.factories.TransactionFactory; public class Exchange { private String name; private Map stocks; private int weekNumber; private Random random = new Random(); + private final TransactionFactory purchaseFactory = new PurchaseFactory(); + private final TransactionFactory saleFactory = new SaleFactory(); public Exchange(String name, List stockList) { this.name = name; @@ -31,7 +36,7 @@ public Exchange(String name, List stockList) { } } - public void buy(String symbol, Player player, BigDecimal quantity) { + public Transaction buy(String symbol, Player player, BigDecimal quantity) { Stock stock = this.stocks.get(symbol); if (stock == null) { @@ -39,17 +44,22 @@ public void buy(String symbol, Player player, BigDecimal quantity) { } Share shareToBuy = new Share(stock, quantity, stock.getSalesPrice()); - Purchase purchase = new Purchase(shareToBuy, this.weekNumber); + + Transaction purchase = purchaseFactory.createTransaction(shareToBuy, weekNumber); purchase.commit(player); + + return purchase; } - public void buy(String symbol, Player player, int quantity) { - this.buy(symbol, player, BigDecimal.valueOf(quantity)); + public Transaction buy(String symbol, Player player, int quantity) { + return this.buy(symbol, player, BigDecimal.valueOf(quantity)); } - public void sell(Share share, Player player) { - Sale sale = new Sale(share, weekNumber); + public Transaction sell(Share share, Player player) { + Transaction sale = saleFactory.createTransaction(share, weekNumber); + sale.commit(player); + return sale; } public Map getStocks() { @@ -86,14 +96,6 @@ public List getLosers(int limit) { .collect(Collectors.toList()); } - public List getLosers(int limit) { - List gainers = new ArrayList<>(this.getStocks().values()); - gainers = gainers.stream() - .sorted((s1,s2) -> s1.getLatestPriceChange().compareTo(s2.getLatestPriceChange())) - .toList().reversed(); - return gainers.subList(0, limit); - } - public void advance() { this.weekNumber++; for (Stock stock : this.stocks.values()) { diff --git a/src/main/java/millions/model/Player.java b/src/main/java/millions/model/Player.java index 9f3a682..fa323e6 100644 --- a/src/main/java/millions/model/Player.java +++ b/src/main/java/millions/model/Player.java @@ -43,6 +43,8 @@ public void withdrawMoney(BigDecimal amount) { } public String getStatus() { + int weeksTraded = transactionArchive.countDistinctWeeks(); + String status = "Novice"; BigDecimal netWorth = getNetWorth(); BigDecimal netWorthChange = netWorth.divide(startingMoney, RoundingMode.DOWN); diff --git a/src/main/java/millions/model/calculators/SaleCalculator.java b/src/main/java/millions/model/calculators/SaleCalculator.java index 5adbfaf..9b0a84e 100644 --- a/src/main/java/millions/model/calculators/SaleCalculator.java +++ b/src/main/java/millions/model/calculators/SaleCalculator.java @@ -31,6 +31,9 @@ public BigDecimal calculateTax() { BigDecimal purchaseCosts = this.purchasePrice.multiply(this.quantity); BigDecimal earnings = this.calculateGross().subtract(this.calculateCommission()).subtract(purchaseCosts); + if (earnings.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } return earnings .multiply(new BigDecimal("30")) .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP); diff --git a/src/test/java/millions/ExchangeTest.java b/src/test/java/millions/ExchangeTest.java index 59f9cf9..b8603c6 100644 --- a/src/test/java/millions/ExchangeTest.java +++ b/src/test/java/millions/ExchangeTest.java @@ -5,7 +5,7 @@ import java.math.BigDecimal; import java.util.List; import java.util.stream.IntStream; - +import millions.model.*; import org.junit.jupiter.api.Test; class ExchangeTest { diff --git a/src/test/java/millions/SaleTest.java b/src/test/java/millions/SaleTest.java index 1c02005..2d725f4 100644 --- a/src/test/java/millions/SaleTest.java +++ b/src/test/java/millions/SaleTest.java @@ -22,7 +22,7 @@ public void testHappyPath() { sale.commit(player); assertTrue(sale.isCommitted()); - assertEquals(120, player.getMoney().intValue()); + assertEquals(119, player.getMoney().intValue()); assertFalse(player.getPortfolio().getShares().contains(share)); } From df49c3162c4ba29c83314dd491ed637d6da0c708 Mon Sep 17 00:00:00 2001 From: martin Date: Mon, 20 Apr 2026 12:22:32 +0200 Subject: [PATCH 2/2] fix: Changed test after changing return. --- src/main/java/millions/model/Player.java | 1 + src/test/java/millions/ExchangeTest.java | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/millions/model/Player.java b/src/main/java/millions/model/Player.java index fa323e6..4324bce 100644 --- a/src/main/java/millions/model/Player.java +++ b/src/main/java/millions/model/Player.java @@ -43,6 +43,7 @@ public void withdrawMoney(BigDecimal amount) { } public String getStatus() { + // TODO dobbel sjekk logikken int weeksTraded = transactionArchive.countDistinctWeeks(); String status = "Novice"; diff --git a/src/test/java/millions/ExchangeTest.java b/src/test/java/millions/ExchangeTest.java index b8603c6..a17bb50 100644 --- a/src/test/java/millions/ExchangeTest.java +++ b/src/test/java/millions/ExchangeTest.java @@ -93,8 +93,15 @@ public void testGetGainers() { exchange.advance(); List gainers = exchange.getGainers(3); - boolean isSorted = IntStream.range(0, gainers.size() -1) - .allMatch(i -> gainers.get(i).getLatestPriceChange().compareTo(gainers.get(i+1).getLatestPriceChange()) <= 0); + boolean isSorted = + IntStream.range(0, gainers.size() - 1) + .allMatch( + i -> + gainers + .get(i) + .getLatestPriceChange() + .compareTo(gainers.get(i + 1).getLatestPriceChange()) + >= 0); assertTrue(isSorted); assertEquals(3, gainers.size()); @@ -112,8 +119,15 @@ public void testGetLosers() { for (Stock s : losers) { System.out.println(s.getLatestPriceChange()); } - boolean isSorted = IntStream.range(0, losers.size() -1) - .allMatch(i -> losers.get(i).getLatestPriceChange().compareTo(losers.get(i+1).getLatestPriceChange()) <= 0); + boolean isSorted = + IntStream.range(0, losers.size() - 1) + .allMatch( + i -> + losers + .get(i) + .getLatestPriceChange() + .compareTo(losers.get(i + 1).getLatestPriceChange()) + <= 0); assertTrue(isSorted); assertEquals(3, losers.size());