Skip to content

Commit

Permalink
Merge pull request #39 from IDATT2003-gruppe06/feat/factory
Browse files Browse the repository at this point in the history
Feat/factory
  • Loading branch information
mohenoen authored Apr 21, 2026
2 parents 8cc72ce + df49c31 commit a566207
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 21 deletions.
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

0 comments on commit a566207

Please sign in to comment.