diff --git a/src/main/java/edu/ntnu/idi/idatt/Exchange.java b/src/main/java/edu/ntnu/idi/idatt/Exchange.java index 2153bd9..f4a8d79 100644 --- a/src/main/java/edu/ntnu/idi/idatt/Exchange.java +++ b/src/main/java/edu/ntnu/idi/idatt/Exchange.java @@ -8,6 +8,7 @@ import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; /** * Exchange class @@ -99,6 +100,44 @@ public List findStocks(String searchTerm) { return stocksFound; } + /** + * Method for obtaining gainers + * + *

+ * Returns the stocks that have done it the best + * in the latest week. + *

+ * + * @param limit - Amount of stocks to be returned. + * @return A list of stocks sorted in declining order. + */ + public List getGainers(int limit) { + return stockMap.values().stream() + .filter(stock -> stock.getLatestPriceChange().compareTo(BigDecimal.ZERO) > 0) + .sorted(Comparator.comparing(Stock::getLatestPriceChange).reversed()) + .limit(limit) + .toList(); + } + + /** + * Method for obtaining losers + * + *

+ * Returns the stocks that have done it the worst + * in value in the latest week. + *

+ * + * @param limit - Amount of stocks to be returned. + * @return A list of stocks sorted in inclining order. + */ + public List getLosers(int limit) { + return stockMap.values().stream() + .filter(stock -> stock.getLatestPriceChange().compareTo(BigDecimal.ZERO) < 0) + .sorted(Comparator.comparing(Stock::getLatestPriceChange)) + .limit(limit) + .toList(); + } + /** * Method to allow a player to buy a stock. * diff --git a/src/main/java/edu/ntnu/idi/idatt/marked/Stock.java b/src/main/java/edu/ntnu/idi/idatt/marked/Stock.java index 0dbf411..d84e7bb 100644 --- a/src/main/java/edu/ntnu/idi/idatt/marked/Stock.java +++ b/src/main/java/edu/ntnu/idi/idatt/marked/Stock.java @@ -87,7 +87,7 @@ public BigDecimal getLatestPriceChange() { return BigDecimal.ZERO; } int size = prices.size(); - return prices.get(size - 1).min(prices.get(size - 2)); + return prices.get(size - 1).subtract(prices.get(size - 2)); } /** diff --git a/src/test/java/edu/ntnu/idi/idatt/ExchangeTest.java b/src/test/java/edu/ntnu/idi/idatt/ExchangeTest.java index 743f3be..64c4b35 100644 --- a/src/test/java/edu/ntnu/idi/idatt/ExchangeTest.java +++ b/src/test/java/edu/ntnu/idi/idatt/ExchangeTest.java @@ -120,6 +120,24 @@ void PTAdvance() { } + /** + * Test for obtaining the gainers and loosers. + */ + @Test + void PTgetGainers_Losers() { + // Simulate price change + stocks.get(0).addNewSalesPrice(new BigDecimal("4333")); + stocks.get(1).addNewSalesPrice(new BigDecimal("50")); + stocks.get(2).addNewSalesPrice(new BigDecimal("3")); + stocks.get(3).addNewSalesPrice(new BigDecimal("800")); + + assertEquals(2, exchange.getGainers(2).size()); + assertEquals(2, exchange.getLosers(2).size()); + + assertEquals(List.of(stocks.get(0)), exchange.getGainers(1)); + assertEquals(List.of(stocks.get(2)), exchange.getLosers(1)); + } + /** * Negative tests for stock-related methods. * diff --git a/src/test/java/edu/ntnu/idi/idatt/marked/StockTest.java b/src/test/java/edu/ntnu/idi/idatt/marked/StockTest.java index 5064a68..941d9c5 100644 --- a/src/test/java/edu/ntnu/idi/idatt/marked/StockTest.java +++ b/src/test/java/edu/ntnu/idi/idatt/marked/StockTest.java @@ -36,7 +36,7 @@ void PTgetPrices() { assertEquals(prices, stock.getHistoricalPrices()); assertEquals(new BigDecimal("39.5"), stock.getLowestPrice()); assertEquals(new BigDecimal("51.2"), stock.getHighestPrice()); - assertEquals(new BigDecimal("43.4").min(new BigDecimal("51.2")), stock.getLatestPriceChange()); + assertEquals(new BigDecimal("43.4").subtract(new BigDecimal("51.2")), stock.getLatestPriceChange()); } @Test