diff --git a/src/main/java/Controller/StockFileHandler.java b/src/main/java/Controller/StockFileHandler.java new file mode 100644 index 0000000..8874232 --- /dev/null +++ b/src/main/java/Controller/StockFileHandler.java @@ -0,0 +1,53 @@ +package Controller; +import java.nio.file.*; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import Model.Stock; + +public class StockFileHandler { + + // lesing + public List loadStocksFromFile(String filename) throws IOException { + List stocks = new ArrayList<>(); + List lines = Files.readAllLines(Paths.get(filename)); + + for (String line : lines) { + line = line.trim(); + if (line.isEmpty() || line.startsWith("#")) { + continue; + } + + String[] parts = line.split(","); + if (parts.length == 3) { + String symbol = parts[0]; + String name = parts[1]; + BigDecimal price = new BigDecimal(parts[2]); + + stocks.add(new Stock(symbol, name, price)); + } + } + return stocks; // returnerer listen + } + + // lagring + public void saveStocksToFile(String filename, List stocks) throws IOException { + List lines = new ArrayList<>(); + + // header + lines.add("# Ticker,Name,Price"); + + for (Stock stock : stocks) { + // formaterer hver aksje som "SYMBOL,NAME,PRICE" + String line = String.format("%s,%s,%s", + stock.getSymbol(), + stock.getCompany(), + stock.getSalesPrice().toString()); + lines.add(line); + } + + Files.write(Paths.get(filename), lines); + } +} \ No newline at end of file diff --git a/src/main/java/Exchange.java b/src/main/java/Model/Exchange.java similarity index 83% rename from src/main/java/Exchange.java rename to src/main/java/Model/Exchange.java index afbde59..320fae8 100644 --- a/src/main/java/Exchange.java +++ b/src/main/java/Model/Exchange.java @@ -1,3 +1,4 @@ +package Model; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; @@ -109,6 +110,17 @@ public void advance() { } } + public List getGainers(int limit) { // viser "vinnerne" + return stockMap.values().stream() + .sorted((stock1, stock2) -> stock2.getLatestPriceChange().compareTo(stock1.getLatestPriceChange())) + .limit(limit) + .toList(); + } - + public List getLosers(int limit) { // viser "taperne" + return stockMap.values().stream() + .sorted((stock1, stock2) -> stock1.getLatestPriceChange().compareTo(stock2.getLatestPriceChange())) + .limit(limit) + .toList(); + } } diff --git a/src/main/java/Player.java b/src/main/java/Model/Player.java similarity index 98% rename from src/main/java/Player.java rename to src/main/java/Model/Player.java index 59b4f72..e7a1e31 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Model/Player.java @@ -1,3 +1,4 @@ +package Model; import java.math.BigDecimal; public class Player { diff --git a/src/main/java/Portfolio.java b/src/main/java/Model/Portfolio.java similarity index 72% rename from src/main/java/Portfolio.java rename to src/main/java/Model/Portfolio.java index a25561f..05dd1de 100644 --- a/src/main/java/Portfolio.java +++ b/src/main/java/Model/Portfolio.java @@ -1,3 +1,5 @@ +package Model; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -34,5 +36,14 @@ public List getShares(String symbol) { public boolean contains(Share share) { return shares.contains(share); } + + public BigDecimal getNetWorth() { + BigDecimal total = BigDecimal.ZERO; + for (Share share : shares) { + SaleCalculator calc = new SaleCalculator(share); + total = total.add(calc.calculateTotal()); + } + return total; + } } diff --git a/src/main/java/Purchase.java b/src/main/java/Model/Purchase.java similarity index 97% rename from src/main/java/Purchase.java rename to src/main/java/Model/Purchase.java index 67b1049..d0b14fe 100644 --- a/src/main/java/Purchase.java +++ b/src/main/java/Model/Purchase.java @@ -1,3 +1,4 @@ +package Model; import java.math.BigDecimal; public class Purchase extends Transaction { diff --git a/src/main/java/PurchaseCalculator.java b/src/main/java/Model/PurchaseCalculator.java similarity index 98% rename from src/main/java/PurchaseCalculator.java rename to src/main/java/Model/PurchaseCalculator.java index 78f8e90..6a29413 100644 --- a/src/main/java/PurchaseCalculator.java +++ b/src/main/java/Model/PurchaseCalculator.java @@ -1,3 +1,4 @@ +package Model; import java.math.BigDecimal; public class PurchaseCalculator implements TransactionCalculator { diff --git a/src/main/java/Sale.java b/src/main/java/Model/Sale.java similarity index 97% rename from src/main/java/Sale.java rename to src/main/java/Model/Sale.java index 7a3efc2..42fee68 100644 --- a/src/main/java/Sale.java +++ b/src/main/java/Model/Sale.java @@ -1,3 +1,4 @@ +package Model; import java.math.BigDecimal; public class Sale extends Transaction { diff --git a/src/main/java/SaleCalculator.java b/src/main/java/Model/SaleCalculator.java similarity index 98% rename from src/main/java/SaleCalculator.java rename to src/main/java/Model/SaleCalculator.java index f868729..27fd394 100644 --- a/src/main/java/SaleCalculator.java +++ b/src/main/java/Model/SaleCalculator.java @@ -1,3 +1,4 @@ +package Model; import java.math.BigDecimal; public class SaleCalculator implements TransactionCalculator{ diff --git a/src/main/java/Share.java b/src/main/java/Model/Share.java similarity index 97% rename from src/main/java/Share.java rename to src/main/java/Model/Share.java index 0ab76b5..dee79dd 100644 --- a/src/main/java/Share.java +++ b/src/main/java/Model/Share.java @@ -1,3 +1,4 @@ +package Model; import java.math.BigDecimal; public class Share { diff --git a/src/main/java/Stock.java b/src/main/java/Model/Stock.java similarity index 50% rename from src/main/java/Stock.java rename to src/main/java/Model/Stock.java index e650b01..6916dc3 100644 --- a/src/main/java/Stock.java +++ b/src/main/java/Model/Stock.java @@ -1,3 +1,4 @@ +package Model; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -30,4 +31,28 @@ public BigDecimal getSalesPrice() { public void addNewSalesPrice(BigDecimal price) { prices.add(price); } + + public List getHistoricalPrices() { + return new ArrayList<>(prices); // returnerer en kopi for å beskytte selve listen + } + + public BigDecimal getHighestPrice() { + return prices.stream() + .reduce(prices.get(0), BigDecimal::max); + } + + public BigDecimal getLowestPrice() { + return prices.stream() + .reduce(prices.get(0), BigDecimal::min); + } + + public BigDecimal getLatestPriceChange() { + if (prices.size() < 2) { + return BigDecimal.ZERO; + } + + BigDecimal latest = prices.get(prices.size() - 1); + BigDecimal previous = prices.get(prices.size() - 2); + return latest.subtract(previous); + } } diff --git a/src/main/java/Transaction.java b/src/main/java/Model/Transaction.java similarity index 97% rename from src/main/java/Transaction.java rename to src/main/java/Model/Transaction.java index 18d07ed..1ef6aa8 100644 --- a/src/main/java/Transaction.java +++ b/src/main/java/Model/Transaction.java @@ -1,3 +1,4 @@ +package Model; public abstract class Transaction { private Share share; private int week; diff --git a/src/main/java/TransactionArchive.java b/src/main/java/Model/TransactionArchive.java similarity index 98% rename from src/main/java/TransactionArchive.java rename to src/main/java/Model/TransactionArchive.java index 6d86d71..92ca3c2 100644 --- a/src/main/java/TransactionArchive.java +++ b/src/main/java/Model/TransactionArchive.java @@ -1,3 +1,4 @@ +package Model; import java.util.ArrayList; import java.util.stream.Collectors; import java.util.List; diff --git a/src/main/java/TransactionCalculator.java b/src/main/java/Model/TransactionCalculator.java similarity index 94% rename from src/main/java/TransactionCalculator.java rename to src/main/java/Model/TransactionCalculator.java index 0bafc6e..560992d 100644 --- a/src/main/java/TransactionCalculator.java +++ b/src/main/java/Model/TransactionCalculator.java @@ -1,3 +1,4 @@ +package Model; import java.math.BigDecimal; public interface TransactionCalculator { diff --git a/src/main/java/aksjer.csv b/src/main/java/aksjer.csv new file mode 100644 index 0000000..8dfbf02 --- /dev/null +++ b/src/main/java/aksjer.csv @@ -0,0 +1,5 @@ +# Top 500 US Stocks by Market Cap +# Ticker,Name,Price +NVDA,Nvidia,191.27 +AAPL,Apple Inc.,276.43 +MSFT,Microsoft,404.68 \ No newline at end of file diff --git a/src/test/java/ExchangeTest.java b/src/test/java/ExchangeTest.java index eb3ad47..f80b1d9 100644 --- a/src/test/java/ExchangeTest.java +++ b/src/test/java/ExchangeTest.java @@ -1,5 +1,9 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; + +import Model.Exchange; +import Model.Stock; + import static org.junit.jupiter.api.Assertions.*; import java.math.BigDecimal; diff --git a/src/test/java/PortfolioTest.java b/src/test/java/PortfolioTest.java index 36f7419..d921601 100644 --- a/src/test/java/PortfolioTest.java +++ b/src/test/java/PortfolioTest.java @@ -1,6 +1,11 @@ import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; + +import Model.Portfolio; +import Model.Share; +import Model.Stock; + import java.math.BigDecimal; public class PortfolioTest { diff --git a/src/test/java/PurchaseTest.java b/src/test/java/PurchaseTest.java new file mode 100644 index 0000000..2f87b39 --- /dev/null +++ b/src/test/java/PurchaseTest.java @@ -0,0 +1,42 @@ +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.math.BigDecimal; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import Model.Player; +import Model.Purchase; +import Model.Share; +import Model.Stock; + +public class PurchaseTest { + Stock stock; + Share share; + Purchase purchase; + + @BeforeEach + void setUp() { + this.stock = new Stock("symbol", "company", new BigDecimal(100)); + this.share = new Share(this.stock, new BigDecimal(20), new BigDecimal(50)); + this.purchase = new Purchase(this.share, 18); + } + + @Test + void commit_validPurchase_updatesPlayer() { + + // Arrange + Player player = new Player("Jane", new BigDecimal(500000)); + BigDecimal startingMoney = player.getMoney(); + + // Act + this.purchase.commit(player); + + // Assert + assertEquals(1, startingMoney.subtract(player.getMoney()).signum()); + + } + + + +} diff --git a/src/test/java/SaleTest.java b/src/test/java/SaleTest.java new file mode 100644 index 0000000..a17d1e2 --- /dev/null +++ b/src/test/java/SaleTest.java @@ -0,0 +1,62 @@ +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import Model.Player; +import Model.Sale; +import Model.Share; +import Model.Stock; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.math.BigDecimal; + +public class SaleTest { + Stock stock; + Share share; + Sale sale; + + @BeforeEach + void setUp(){ + this.stock = new Stock("symbol", "company", new BigDecimal(100)); + this.share = new Share(this.stock, new BigDecimal(20), new BigDecimal(80)); + this.sale = new Sale(this.share, 18); + } + + @Test + void commit_validSale_updatesPlayerState() { + + // Arrange + Player player = new Player("Jane", new BigDecimal(500)); + player.getPortfolio().addShare(this.share); + + // Act + this.sale.commit(player); + + // Assert + assertTrue(player.getTransactionArchive().getTransactions(this.sale.getWeek()).contains(this.sale)); + assertFalse(player.getPortfolio().contains(this.share)); + assertTrue(this.sale.isCommitted()); + } + + @Test + void commit_alreadyCommitted_noAction() { + + // Arrange + Player player = new Player("Jane", new BigDecimal(500)); + player.getPortfolio().addShare(this.share); + this.sale.commit(player); + BigDecimal moneyAfterFirstCommit = player.getMoney(); + + // Act + this.sale.commit(player); + + // Assert + assertEquals(moneyAfterFirstCommit, player.getMoney()); + assertEquals(1, player.getTransactionArchive().getTransactions(this.sale.getWeek()).size()); + assertTrue(this.sale.isCommitted()); + } + + +} diff --git a/src/test/java/ShareTest.java b/src/test/java/ShareTest.java index ba6dc76..3d840bb 100644 --- a/src/test/java/ShareTest.java +++ b/src/test/java/ShareTest.java @@ -1,6 +1,10 @@ import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; + +import Model.Share; +import Model.Stock; + import java.math.BigDecimal; diff --git a/src/test/java/StockTest.java b/src/test/java/StockTest.java index 1bfcc2a..fcc0d09 100644 --- a/src/test/java/StockTest.java +++ b/src/test/java/StockTest.java @@ -1,4 +1,7 @@ import org.junit.jupiter.api.Test; + +import Model.Stock; + import static org.junit.jupiter.api.Assertions.*; import java.math.BigDecimal; diff --git a/target/classes/Exchange.class b/target/classes/Exchange.class deleted file mode 100644 index dde00a7..0000000 Binary files a/target/classes/Exchange.class and /dev/null differ diff --git a/target/classes/Portfolio.class b/target/classes/Portfolio.class deleted file mode 100644 index 2dc1492..0000000 Binary files a/target/classes/Portfolio.class and /dev/null differ diff --git a/target/classes/PurchaseCalculator.class b/target/classes/PurchaseCalculator.class deleted file mode 100644 index bab65f2..0000000 Binary files a/target/classes/PurchaseCalculator.class and /dev/null differ diff --git a/target/classes/Share.class b/target/classes/Share.class deleted file mode 100644 index 9e7f4f9..0000000 Binary files a/target/classes/Share.class and /dev/null differ diff --git a/target/classes/Stock.class b/target/classes/Stock.class deleted file mode 100644 index af494f4..0000000 Binary files a/target/classes/Stock.class and /dev/null differ diff --git a/target/classes/TransactionCalculator.class b/target/classes/TransactionCalculator.class deleted file mode 100644 index 47f318a..0000000 Binary files a/target/classes/TransactionCalculator.class and /dev/null differ diff --git a/target/test-classes/ExchangeTest.class b/target/test-classes/ExchangeTest.class new file mode 100644 index 0000000..69ecbef Binary files /dev/null and b/target/test-classes/ExchangeTest.class differ diff --git a/target/test-classes/PortfolioTest.class b/target/test-classes/PortfolioTest.class new file mode 100644 index 0000000..9be31bc Binary files /dev/null and b/target/test-classes/PortfolioTest.class differ diff --git a/target/test-classes/ShareTest.class b/target/test-classes/ShareTest.class new file mode 100644 index 0000000..0c78c04 Binary files /dev/null and b/target/test-classes/ShareTest.class differ diff --git a/target/test-classes/StockTest.class b/target/test-classes/StockTest.class new file mode 100644 index 0000000..1a94286 Binary files /dev/null and b/target/test-classes/StockTest.class differ