Skip to content

Commit

Permalink
Added getLosers and tests for getLosers/Gainers
Browse files Browse the repository at this point in the history
  • Loading branch information
martin committed Apr 20, 2026
1 parent c3a9c17 commit c72ee46
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
8 changes: 8 additions & 0 deletions src/main/java/millions/model/Exchange.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,14 @@ 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
2 changes: 1 addition & 1 deletion src/main/java/millions/model/Stock.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
41 changes: 37 additions & 4 deletions src/test/java/millions/ExchangeTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<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);

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<Stock> 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());
}
}

0 comments on commit c72ee46

Please sign in to comment.