Skip to content

Feat/factory #39

Merged
merged 2 commits into from
Apr 21, 2026
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 {

Expand Down
30 changes: 16 additions & 14 deletions src/main/java/millions/model/Exchange.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Stock> 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<Stock> stockList) {
this.name = name;
Expand All @@ -31,25 +36,30 @@ public Exchange(String name, List<Stock> 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) {
throw new IllegalArgumentException("Stock not found");
}

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<String, Stock> getStocks() {
Expand Down Expand Up @@ -86,14 +96,6 @@ public List<Stock> getLosers(int limit) {
.collect(Collectors.toList());
}

public List<Stock> getLosers(int limit) {
List<Stock> 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()) {
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/millions/model/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ public void withdrawMoney(BigDecimal amount) {
}

public String getStatus() {
// TODO dobbel sjekk logikken
int weeksTraded = transactionArchive.countDistinctWeeks();

String status = "Novice";
BigDecimal netWorth = getNetWorth();
BigDecimal netWorthChange = netWorth.divide(startingMoney, RoundingMode.DOWN);
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/millions/model/calculators/SaleCalculator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
24 changes: 19 additions & 5 deletions src/test/java/millions/ExchangeTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -93,8 +93,15 @@ public void testGetGainers() {
exchange.advance();
List<Stock> 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());
Expand All @@ -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());
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/millions/SaleTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand Down