diff --git a/src/main/java/millions/model/Exchange.java b/src/main/java/millions/model/Exchange.java index c19ed0e..8f59eb7 100644 --- a/src/main/java/millions/model/Exchange.java +++ b/src/main/java/millions/model/Exchange.java @@ -86,6 +86,14 @@ public List getLosers(int limit) { .collect(Collectors.toList()); } + public List getLosers(int limit) { + List 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()) { diff --git a/src/main/java/millions/model/Stock.java b/src/main/java/millions/model/Stock.java index 65b70da..f470e6b 100644 --- a/src/main/java/millions/model/Stock.java +++ b/src/main/java/millions/model/Stock.java @@ -73,7 +73,7 @@ public BigDecimal getLatestPriceChange() { } BigDecimal currentPrice = this.prices.getLast(); - BigDecimal lastPrice = this.prices.get(this.prices.size() - 2); + BigDecimal lastPrice = this.prices.get(this.prices.size() - 1); return currentPrice.subtract(lastPrice); } diff --git a/src/test/java/millions/ExchangeTest.java b/src/test/java/millions/ExchangeTest.java index ca4c2fc..59f9cf9 100644 --- a/src/test/java/millions/ExchangeTest.java +++ b/src/test/java/millions/ExchangeTest.java @@ -4,11 +4,8 @@ import java.math.BigDecimal; import java.util.List; +import java.util.stream.IntStream; -import millions.model.Exchange; -import millions.model.Player; -import millions.model.Share; -import millions.model.Stock; import org.junit.jupiter.api.Test; class ExchangeTest { @@ -85,4 +82,40 @@ public void testNullsAndInvalid() { assertThrows( IllegalArgumentException.class, () -> exchange.buy("DOGL", player, BigDecimal.valueOf(-2))); } + + @Test + public void testGetGainers() { + Stock s1 = new Stock("MSFT", "EpsteinSoft Inc.", BigDecimal.valueOf(0.02)); + Stock s2 = new Stock("PEAR", "Pear Inc.", BigDecimal.valueOf(300)); + Stock s3 = new Stock("DOGL", "DOOGLE Inc.", BigDecimal.valueOf(200.00)); + + Exchange exchange = new Exchange("exchange", List.of(s1, s2, s3)); + exchange.advance(); + List 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); + + assertTrue(isSorted); + assertEquals(3, gainers.size()); + } + + @Test + public void testGetLosers() { + Stock s1 = new Stock("MSFT", "EpsteinSoft Inc.", BigDecimal.valueOf(0.02)); + Stock s2 = new Stock("PEAR", "Pear Inc.", BigDecimal.valueOf(300)); + Stock s3 = new Stock("DOGL", "DOOGLE Inc.", BigDecimal.valueOf(200.00)); + + Exchange exchange = new Exchange("exchange", List.of(s1, s2, s3)); + + List losers = exchange.getLosers(3); + 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); + + assertTrue(isSorted); + assertEquals(3, losers.size()); + } }