diff --git a/src/main/java/millions/App.java b/src/main/java/millions/App.java index 825265b..8ffc777 100644 --- a/src/main/java/millions/App.java +++ b/src/main/java/millions/App.java @@ -6,6 +6,9 @@ import millions.controller.GameController; import millions.view.StartView; +/** + * Main JavaFX application entry point for the Millions stock trading game. + */ public class App extends Application { @Override diff --git a/src/main/java/millions/calculators/TransactionCalculatorFactory.java b/src/main/java/millions/calculators/TransactionCalculatorFactory.java index 8d461bd..36a71c0 100644 --- a/src/main/java/millions/calculators/TransactionCalculatorFactory.java +++ b/src/main/java/millions/calculators/TransactionCalculatorFactory.java @@ -5,6 +5,9 @@ import millions.model.calculators.SaleCalculator; import millions.model.calculators.TransactionCalculator; +/** + * Factory for creating transaction calculators. + */ public class TransactionCalculatorFactory { private TransactionCalculatorFactory() {} diff --git a/src/main/java/millions/controller/GameController.java b/src/main/java/millions/controller/GameController.java index 075230c..b6e5561 100644 --- a/src/main/java/millions/controller/GameController.java +++ b/src/main/java/millions/controller/GameController.java @@ -9,6 +9,7 @@ import millions.model.Player; import millions.model.Stock; +/** Controls game initialization. */ public class GameController { private Player player; private Exchange exchange; diff --git a/src/main/java/millions/controller/fileIO/CSVStockFileParser.java b/src/main/java/millions/controller/fileIO/CSVStockFileParser.java index 5a0cee0..e52ebf9 100644 --- a/src/main/java/millions/controller/fileIO/CSVStockFileParser.java +++ b/src/main/java/millions/controller/fileIO/CSVStockFileParser.java @@ -1,19 +1,18 @@ package millions.controller.fileIO; -import millions.model.Stock; - import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import millions.model.Stock; +/** Parses CSV lines into Stock objects. */ public class CSVStockFileParser { private List lines; public CSVStockFileParser(List lines) { if (verifyCSV(lines)) { this.lines = lines; - } - else { + } else { // throw file format error } } @@ -21,22 +20,22 @@ public CSVStockFileParser(List lines) { // returns true if all entries have exactly 3 data points public boolean verifyCSV(List lines) { return lines.stream() - .filter(l -> !(l.startsWith("#") || l.isBlank())) - .noneMatch(l -> l.split(",").length != 3); - + .filter(l -> !(l.startsWith("#") || l.isBlank())) + .noneMatch(l -> l.split(",").length != 3); } public List parse() { List stocks = new ArrayList<>(); lines.stream() .filter(l -> !((l.startsWith("#") || l.isBlank()))) - .forEach(l -> { - String[] split = l.split(","); - String symbol = split[0]; - String company = split[1]; - BigDecimal price = new BigDecimal(split[2]); - stocks.add(new Stock(symbol, company, price)); - }); + .forEach( + l -> { + String[] split = l.split(","); + String symbol = split[0]; + String company = split[1]; + BigDecimal price = new BigDecimal(split[2]); + stocks.add(new Stock(symbol, company, price)); + }); return stocks; } } diff --git a/src/main/java/millions/controller/fileIO/CSVStockFileWriter.java b/src/main/java/millions/controller/fileIO/CSVStockFileWriter.java index 463ea04..52fee6e 100644 --- a/src/main/java/millions/controller/fileIO/CSVStockFileWriter.java +++ b/src/main/java/millions/controller/fileIO/CSVStockFileWriter.java @@ -8,6 +8,9 @@ import java.util.List; //TODO: Validation of data before writing +/** + * Writes stock data to a CSV file. + */ public class CSVStockFileWriter implements StockFileWriter { private final List stocks; private String finalString; diff --git a/src/main/java/millions/controller/fileIO/StockFileReader.java b/src/main/java/millions/controller/fileIO/StockFileReader.java index 47a0809..31e37ee 100644 --- a/src/main/java/millions/controller/fileIO/StockFileReader.java +++ b/src/main/java/millions/controller/fileIO/StockFileReader.java @@ -10,6 +10,9 @@ import java.util.List; +/** + * Reads a file and returns its lines as a list of strings. + */ public class StockFileReader { private final Path filePath; diff --git a/src/main/java/millions/controller/fileIO/StockFileWriter.java b/src/main/java/millions/controller/fileIO/StockFileWriter.java index 32a8e13..cfd1baf 100644 --- a/src/main/java/millions/controller/fileIO/StockFileWriter.java +++ b/src/main/java/millions/controller/fileIO/StockFileWriter.java @@ -2,6 +2,9 @@ import java.nio.file.Path; +/** + * Interface for writing stock data to a file. + */ public interface StockFileWriter { public void formatString(); public boolean write(Path path); diff --git a/src/main/java/millions/model/Exchange.java b/src/main/java/millions/model/Exchange.java index 57d91fd..869cff6 100644 --- a/src/main/java/millions/model/Exchange.java +++ b/src/main/java/millions/model/Exchange.java @@ -14,6 +14,9 @@ import millions.model.factories.SaleFactory; import millions.model.factories.TransactionFactory; +/** + * The stock exchange where players buy and sell shares. Manages stocks and simulates weekly price changes. + */ public class Exchange { private String name; private Map stocks; diff --git a/src/main/java/millions/model/ExchangeListener.java b/src/main/java/millions/model/ExchangeListener.java index b75057e..6731d45 100644 --- a/src/main/java/millions/model/ExchangeListener.java +++ b/src/main/java/millions/model/ExchangeListener.java @@ -1,5 +1,8 @@ package millions.model; +/** + * Listener for exchange events such as week advances and completed transactions. + */ public interface ExchangeListener { void onWeekAdvanced(int newWeek); diff --git a/src/main/java/millions/model/Player.java b/src/main/java/millions/model/Player.java index 09f43d4..2dfd684 100644 --- a/src/main/java/millions/model/Player.java +++ b/src/main/java/millions/model/Player.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; +/** Player class. */ public class Player { private String name; private BigDecimal startingMoney; @@ -15,6 +16,11 @@ public class Player { public int weeksTraded; private final List listeners = new ArrayList<>(); + /** + * @param name Name of player + * @param startingMoney Amount of money the player starts with + * @throws IllegalArgumentException + */ public Player(String name, BigDecimal startingMoney) { this.name = name; this.startingMoney = startingMoney; @@ -31,6 +37,10 @@ public Player(String name, BigDecimal startingMoney) { } } + /** + * @param amount How much money to add + * @throws IllegalArgumentException + */ public void addMoney(BigDecimal amount) { if (amount == null || amount.compareTo(BigDecimal.ZERO) < 0) { throw new IllegalArgumentException("Amount cannot be null or negative"); @@ -39,6 +49,10 @@ public void addMoney(BigDecimal amount) { notifyMoneyChanged(); } + /** + * @param amount How much money to withdeaw + * @throws IllegalArgumentException + */ public void withdrawMoney(BigDecimal amount) { if (amount == null || amount.compareTo(BigDecimal.ZERO) < 0) { throw new IllegalArgumentException("Amount cannot be null or negative"); @@ -47,6 +61,9 @@ public void withdrawMoney(BigDecimal amount) { notifyMoneyChanged(); } + /** + * @return + */ public String getStatus() { // TODO dobbel sjekk logikken int weeksTraded = transactionArchive.countDistinctWeeks(); @@ -63,42 +80,69 @@ public String getStatus() { return status; } + /** + * @return + */ public String getName() { return this.name; } + /** + * @return + */ public BigDecimal getMoney() { return this.money; } + /** + * @return + */ public Portfolio getPortfolio() { return this.portfolio; } + /** + * @param share Share to be added + */ public void addShareToPortfolio(Share share) { this.portfolio.addShare(share); notifyPortfolioChanged(); notifyStatusChanged(); } + /** + * @param share Share to be removed + */ public void removeShareFromPortfolio(Share share) { this.portfolio.removeShare(share); notifyPortfolioChanged(); notifyStatusChanged(); } + /** + * @return + */ public BigDecimal getNetWorth() { return this.money.add(this.portfolio.getNetWorth()); } + /** + * @return + */ public TransactionArchive getTransactionArchive() { return this.transactionArchive; } + /** + * @param listener + */ public void addListener(PlayerListener listener) { listeners.add(listener); } + /** + * @param listener + */ public void removeListener(PlayerListener listener) { listeners.remove(listener); } diff --git a/src/main/java/millions/model/PlayerListener.java b/src/main/java/millions/model/PlayerListener.java index f576ac7..e397ead 100644 --- a/src/main/java/millions/model/PlayerListener.java +++ b/src/main/java/millions/model/PlayerListener.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; +/** Listener for player state changes. */ public interface PlayerListener { void onMoneyChanged(BigDecimal newBalance); diff --git a/src/main/java/millions/model/Portfolio.java b/src/main/java/millions/model/Portfolio.java index 0c4af05..210f784 100644 --- a/src/main/java/millions/model/Portfolio.java +++ b/src/main/java/millions/model/Portfolio.java @@ -5,6 +5,7 @@ import java.util.List; import millions.model.calculators.SaleCalculator; +/** A collection of shares owned by a player. */ public class Portfolio { List shares; @@ -12,24 +13,42 @@ public Portfolio() { shares = new ArrayList<>(); } + /** + * @param share Share to be added + * @return + */ public boolean addShare(Share share) { return this.shares.add(share); } + /** + * @param share Share to be removed + * @return + */ public boolean removeShare(Share share) { return this.shares.remove(share); } + /** + * @return + */ public List getShares() { return this.shares; } + /** + * @param symbol + * @return + */ public List getShares(String symbol) { return this.shares.stream() .filter(share -> share.getStock().getSymbol().equals(symbol)) .toList(); } + /** + * @return + */ public BigDecimal getNetWorth() { BigDecimal total = BigDecimal.ZERO; for (Share share : shares) { @@ -39,6 +58,10 @@ public BigDecimal getNetWorth() { return total; } + /** + * @param share + * @return + */ public boolean contains(Share share) { return this.shares.contains(share); } diff --git a/src/main/java/millions/model/Purchase.java b/src/main/java/millions/model/Purchase.java index 59da2c0..8bbacb8 100644 --- a/src/main/java/millions/model/Purchase.java +++ b/src/main/java/millions/model/Purchase.java @@ -2,6 +2,9 @@ import millions.model.calculators.PurchaseCalculator; +/** + * A transaction representing the purchase of shares. + */ public class Purchase extends Transaction { public Purchase(Share share, int week) { diff --git a/src/main/java/millions/model/Sale.java b/src/main/java/millions/model/Sale.java index dbd3637..1c17745 100644 --- a/src/main/java/millions/model/Sale.java +++ b/src/main/java/millions/model/Sale.java @@ -2,6 +2,9 @@ import millions.model.calculators.SaleCalculator; +/** + * A transaction representing the sale of shares. + */ public class Sale extends Transaction { public Sale(Share share, int week) { diff --git a/src/main/java/millions/model/Share.java b/src/main/java/millions/model/Share.java index 615dc68..7967b95 100644 --- a/src/main/java/millions/model/Share.java +++ b/src/main/java/millions/model/Share.java @@ -2,11 +2,18 @@ import java.math.BigDecimal; +/** Represents a holding of a specific stock with a quantity and purchase price. */ public class Share { Stock stock; BigDecimal quantity; BigDecimal purchasePrice; + /** + * @param stock Which stock the share is for. + * @param quantity How many stocks + * @param purchasePrice Purchase price of the share + * @throws IllegalArgumentException + */ public Share(Stock stock, BigDecimal quantity, BigDecimal purchasePrice) { this.stock = stock; this.quantity = quantity; @@ -23,18 +30,28 @@ public Share(Stock stock, BigDecimal quantity, BigDecimal purchasePrice) { } } + /** Share() with int quantity */ public Share(Stock stock, int quantity, BigDecimal purchasePrice) { this(stock, BigDecimal.valueOf(quantity), purchasePrice); } + /** + * @return + */ public Stock getStock() { return this.stock; } + /** + * @return + */ public BigDecimal getQuantity() { return this.quantity; } + /** + * @return + */ public BigDecimal getPurchasePrice() { return this.purchasePrice; } diff --git a/src/main/java/millions/model/Stock.java b/src/main/java/millions/model/Stock.java index 65b70da..cc1a23f 100644 --- a/src/main/java/millions/model/Stock.java +++ b/src/main/java/millions/model/Stock.java @@ -4,11 +4,18 @@ import java.util.ArrayList; import java.util.List; +/** Stock */ public class Stock { String symbol; String company; List prices; + /** + * @param symbol Stock ticker symbol + * @param company company name + * @param prices List of prices + * @throws IllegalArgumentException + */ public Stock(String symbol, String company, List prices) { this.symbol = symbol; this.company = company; @@ -23,30 +30,49 @@ public Stock(String symbol, String company, List prices) { } } + /** Stock() with single price instead of list */ public Stock(String symbol, String company, BigDecimal initialPrice) { this(symbol, company, new ArrayList<>(List.of(initialPrice))); } + /** + * @return + */ public String getSymbol() { return this.symbol; } + /** + * @return + */ public String getCompany() { return this.company; } + /** + * @return + */ public BigDecimal getSalesPrice() { return this.prices.getLast(); } + /** + * @param price Sales price + */ public void addNewSalesPrice(BigDecimal price) { this.prices.add(price); } + /** + * @return + */ public List getHistoricalPrices() { return this.prices; } + /** + * @return + */ public BigDecimal getHighestPrice() { BigDecimal highestPrice = this.prices.get(0); for (BigDecimal price : this.prices) { @@ -57,6 +83,9 @@ public BigDecimal getHighestPrice() { return highestPrice; } + /** + * @return + */ public BigDecimal getLowestPrice() { BigDecimal lowestPrice = this.prices.get(0); for (BigDecimal price : this.prices) { @@ -67,6 +96,9 @@ public BigDecimal getLowestPrice() { return lowestPrice; } + /** + * @return + */ public BigDecimal getLatestPriceChange() { if (this.prices.size() < 2) { return BigDecimal.ZERO; diff --git a/src/main/java/millions/model/Transaction.java b/src/main/java/millions/model/Transaction.java index 8dfdd4f..6e1e8b1 100644 --- a/src/main/java/millions/model/Transaction.java +++ b/src/main/java/millions/model/Transaction.java @@ -2,6 +2,7 @@ import millions.model.calculators.TransactionCalculator; +/** Abstract base class for stock transactions */ public abstract class Transaction { private Share share; diff --git a/src/main/java/millions/model/TransactionArchive.java b/src/main/java/millions/model/TransactionArchive.java index 5e8b407..5ae7f9f 100644 --- a/src/main/java/millions/model/TransactionArchive.java +++ b/src/main/java/millions/model/TransactionArchive.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.stream.Collectors; +/** Stores and queries commited transactions. */ public class TransactionArchive { List transactions; diff --git a/src/main/java/millions/model/calculators/PurchaseCalculator.java b/src/main/java/millions/model/calculators/PurchaseCalculator.java index 1f7b341..ab2608d 100644 --- a/src/main/java/millions/model/calculators/PurchaseCalculator.java +++ b/src/main/java/millions/model/calculators/PurchaseCalculator.java @@ -3,6 +3,7 @@ import java.math.BigDecimal; import millions.model.Share; +/** Calculates costs for a purchase transaction. Commission */ public class PurchaseCalculator implements TransactionCalculator { BigDecimal purchasePrice; BigDecimal quantity; diff --git a/src/main/java/millions/model/calculators/SaleCalculator.java b/src/main/java/millions/model/calculators/SaleCalculator.java index 9b0a84e..a907b46 100644 --- a/src/main/java/millions/model/calculators/SaleCalculator.java +++ b/src/main/java/millions/model/calculators/SaleCalculator.java @@ -4,6 +4,7 @@ import java.math.RoundingMode; import millions.model.Share; +/** Calculates costs for a sale transaction. Commission and profit tax */ public class SaleCalculator implements TransactionCalculator { BigDecimal purchasePrice; BigDecimal salesPrice; diff --git a/src/main/java/millions/model/calculators/TransactionCalculator.java b/src/main/java/millions/model/calculators/TransactionCalculator.java index d2d3917..9e6ecfb 100644 --- a/src/main/java/millions/model/calculators/TransactionCalculator.java +++ b/src/main/java/millions/model/calculators/TransactionCalculator.java @@ -2,6 +2,9 @@ import java.math.BigDecimal; +/** + * Interface for calculating transaction costs including gross, commission, tax, and total. + */ public interface TransactionCalculator { public BigDecimal calculateGross(); diff --git a/src/main/java/millions/model/factories/PurchaseFactory.java b/src/main/java/millions/model/factories/PurchaseFactory.java index e2b52f7..0af39aa 100644 --- a/src/main/java/millions/model/factories/PurchaseFactory.java +++ b/src/main/java/millions/model/factories/PurchaseFactory.java @@ -3,6 +3,9 @@ import millions.model.Purchase; import millions.model.Share; +/** + * Factory for creating purchase transactions. + */ public class PurchaseFactory extends TransactionFactory { public Purchase createTransaction(Share share, int week) { return new Purchase(share, week); diff --git a/src/main/java/millions/model/factories/SaleFactory.java b/src/main/java/millions/model/factories/SaleFactory.java index 4da40ee..6753a5e 100644 --- a/src/main/java/millions/model/factories/SaleFactory.java +++ b/src/main/java/millions/model/factories/SaleFactory.java @@ -3,6 +3,9 @@ import millions.model.Sale; import millions.model.Share; +/** + * Factory for creating sale transactions. + */ public class SaleFactory extends TransactionFactory { public Sale createTransaction(Share share, int week) { return new Sale(share, week); diff --git a/src/main/java/millions/model/factories/TransactionFactory.java b/src/main/java/millions/model/factories/TransactionFactory.java index 8c2eb5c..e77d31d 100644 --- a/src/main/java/millions/model/factories/TransactionFactory.java +++ b/src/main/java/millions/model/factories/TransactionFactory.java @@ -3,6 +3,9 @@ import millions.model.Share; import millions.model.Transaction; +/** + * Abstract factory for creating transactions. + */ public abstract class TransactionFactory { public abstract Transaction createTransaction(Share share, int week); } diff --git a/src/main/java/millions/view/StartView.java b/src/main/java/millions/view/StartView.java index 564883b..0c85a46 100644 --- a/src/main/java/millions/view/StartView.java +++ b/src/main/java/millions/view/StartView.java @@ -10,6 +10,7 @@ import javafx.stage.FileChooser; import javafx.stage.Stage; +/** The initial game setup screen where the player enters their info. */ public class StartView extends VBox { private TextField nameField;