From 24ecea90c39bc358f624b1a496ba6fdfba44711c Mon Sep 17 00:00:00 2001 From: jordanceldridge13 Date: Sun, 22 Feb 2026 21:12:13 -0500 Subject: [PATCH] feat(basketball-player-stats): add game history tracking and average calculation with full test coverage --- pom.xml | 4 +- .../jordaneldridge/BasketballPlayerStats.java | 165 ++++++++++++ .../java/object/jordaneldridge/GameStat.java | 30 +++ .../BasketballPlayerStatsTest.java | 251 ++++++++++++++++++ 4 files changed, 448 insertions(+), 2 deletions(-) create mode 100644 src/main/java/object/jordaneldridge/BasketballPlayerStats.java create mode 100644 src/main/java/object/jordaneldridge/GameStat.java create mode 100644 src/test/java/object/jordaneldridge/BasketballPlayerStatsTest.java diff --git a/pom.xml b/pom.xml index 75da8f3..734a6b1 100644 --- a/pom.xml +++ b/pom.xml @@ -9,8 +9,8 @@ 1.0-SNAPSHOT - 23 - 23 + 21 + 21 UTF-8 diff --git a/src/main/java/object/jordaneldridge/BasketballPlayerStats.java b/src/main/java/object/jordaneldridge/BasketballPlayerStats.java new file mode 100644 index 0000000..055aa61 --- /dev/null +++ b/src/main/java/object/jordaneldridge/BasketballPlayerStats.java @@ -0,0 +1,165 @@ +package object.jordaneldridge; +import java.util.ArrayList; +import java.util.List; + + + +public class BasketballPlayerStats { + + private int playerId; + private String firstName; + private String lastName; + private String team; + private int points; + private int rebounds; + private int assists; + + + + public BasketballPlayerStats(int playerId, + String firstName, + String lastName, + String team, + int points, + int rebounds, + int assists) { + + if (points < 0 || rebounds < 0 || assists < 0) { + throw new IllegalArgumentException("Points, rebounds, and assists cannot be negative."); + } + + this.playerId = playerId; + this.firstName = firstName; + this.lastName = lastName; + this.team = team; + this.points = points; + this.rebounds = rebounds; + this.assists = assists; + } + + private List games = new ArrayList<>(); + + + // Getters + public int getPlayerId() { + return playerId; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public String getTeam() { + return team; + } + + public int getPoints() { + return points; + } + + public int getRebounds() { + return rebounds; + } + + public int getAssists() { + return assists; + } + + // Setters + public void setPlayerId(int playerId) { + this.playerId = playerId; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public void setTeam(String team) { + this.team = team; + } + + public void setPoints(int points) { + if (points < 0) { + throw new IllegalArgumentException("Points cannot be negative."); + } + this.points = points; + } + + public void setRebounds(int rebounds) { + if (rebounds < 0) { + throw new IllegalArgumentException("Rebounds cannot be negative."); + } + this.rebounds = rebounds; + } + + public void setAssists(int assists) { + if (assists < 0) { + throw new IllegalArgumentException("Assists cannot be negative."); + } + this.assists = assists; + } + + public void recordGame(int pts, int reb, int ast) { + + if (pts < 0 || reb < 0 || ast < 0) { + throw new IllegalArgumentException("Game stats cannot be negative."); + } + + GameStat game = new GameStat(pts, reb, ast); + games.add(game); + + this.points += pts; + this.rebounds += reb; + this.assists += ast; + } + + public double calculatePointsPerGame() { + + if (games.isEmpty()) { + throw new IllegalStateException("No games recorded."); + } + + return (double) points / games.size(); + } + + public String getGameBreakdown() { + + if (games.isEmpty()) { + return "No games recorded."; + } + + StringBuilder breakdown = new StringBuilder(); + + for (int i = 0; i < games.size(); i++) { + GameStat game = games.get(i); + + breakdown.append("Game ") + .append(i + 1) + .append(": ") + .append(game.getPoints()) + .append(" PTS, ") + .append(game.getRebounds()) + .append(" REB, ") + .append(game.getAssists()) + .append(" AST\n"); + } + + return breakdown.toString(); + } + + + + + public String getSummary() { + return String.format("%s %s (%s): %d PTS, %d REB, %d AST", + firstName, lastName, team, points, rebounds, assists); + } +} diff --git a/src/main/java/object/jordaneldridge/GameStat.java b/src/main/java/object/jordaneldridge/GameStat.java new file mode 100644 index 0000000..8768ecb --- /dev/null +++ b/src/main/java/object/jordaneldridge/GameStat.java @@ -0,0 +1,30 @@ +package object.jordaneldridge; + +public class GameStat { + + private int points; + private int rebounds; + private int assists; + + public GameStat(int points, int rebounds, int assists) { + if (points < 0 || rebounds < 0 || assists < 0) { + throw new IllegalArgumentException("Stats cannot be negative."); + } + + this.points = points; + this.rebounds = rebounds; + this.assists = assists; + } + + public int getPoints() { + return points; + } + + public int getRebounds() { + return rebounds; + } + + public int getAssists() { + return assists; + } +} diff --git a/src/test/java/object/jordaneldridge/BasketballPlayerStatsTest.java b/src/test/java/object/jordaneldridge/BasketballPlayerStatsTest.java new file mode 100644 index 0000000..ff13ac2 --- /dev/null +++ b/src/test/java/object/jordaneldridge/BasketballPlayerStatsTest.java @@ -0,0 +1,251 @@ +package object.jordaneldridge; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class BasketballPlayerStatsTest { + + @Test + void constructor_createsObjectWithValidValues() { + // Arrange & Act + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Lockdown Legends", 10, 5, 3 + ); + + // Assert + assertEquals(23, player.getPlayerId()); + assertEquals("Jordan", player.getFirstName()); + assertEquals("Eldridge", player.getLastName()); + assertEquals("Lockdown Legends", player.getTeam()); + assertEquals(10, player.getPoints()); + assertEquals(5, player.getRebounds()); + assertEquals(3, player.getAssists()); + } + + @Test + void constructor_throwsWhenStatsAreNegative() { + // Arrange + Act + Assert + assertThrows(IllegalArgumentException.class, () -> + new BasketballPlayerStats(1, "A", "B", "Team", -1, 0, 0) + ); + } + + @Test + void setPoints_updatesPoints() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 1, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + player.setPoints(25); + + // Assert + assertEquals(25, player.getPoints()); + } + + @Test + void setPoints_throwsWhenNegative() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 1, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + Assert + assertThrows(IllegalArgumentException.class, () -> player.setPoints(-5)); + } + + @Test + void setRebounds_updatesRebounds() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 1, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + player.setRebounds(12); + + // Assert + assertEquals(12, player.getRebounds()); + } + + @Test + void setRebounds_throwsWhenNegative() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 1, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + Assert + assertThrows(IllegalArgumentException.class, () -> player.setRebounds(-1)); + } + + @Test + void setAssists_updatesAssists() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 1, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + player.setAssists(7); + + // Assert + assertEquals(7, player.getAssists()); + } + + @Test + void setAssists_throwsWhenNegative() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 1, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + Assert + assertThrows(IllegalArgumentException.class, () -> player.setAssists(-2)); + } + + @Test + void recordGame_increasesTotalsCorrectly() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Team", 10, 5, 3 + ); + + // Act + player.recordGame(12, 7, 4); + + // Assert + assertEquals(22, player.getPoints()); + assertEquals(12, player.getRebounds()); + assertEquals(7, player.getAssists()); + } + + @Test + void recordGame_withZeros_doesNotChangeTotals() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Team", 10, 5, 3 + ); + + // Act + player.recordGame(0, 0, 0); + + // Assert + assertEquals(10, player.getPoints()); + assertEquals(5, player.getRebounds()); + assertEquals(3, player.getAssists()); + } + + @Test + void recordGame_throwsWhenAnyInputIsNegative() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Team", 10, 5, 3 + ); + + // Act + Assert + assertThrows(IllegalArgumentException.class, () -> player.recordGame(-1, 0, 0)); + assertThrows(IllegalArgumentException.class, () -> player.recordGame(0, -1, 0)); + assertThrows(IllegalArgumentException.class, () -> player.recordGame(0, 0, -1)); + } + + // ---------------------------- + // NEW: calculatePointsPerGame() + // ---------------------------- + + @Test + void calculatePointsPerGame_returnsCorrectDouble() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + player.recordGame(10, 1, 1); + player.recordGame(20, 2, 2); + player.recordGame(30, 3, 3); + + double ppg = player.calculatePointsPerGame(); + + // Assert + assertEquals(20.0, ppg); + } + + @Test + void calculatePointsPerGame_oneGame_returnsThatGamesPoints() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + player.recordGame(18, 2, 1); + + // Assert + assertEquals(18.0, player.calculatePointsPerGame()); + } + + @Test + void calculatePointsPerGame_throwsWhenNoGamesRecorded() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + Assert + assertThrows(IllegalStateException.class, player::calculatePointsPerGame); + } + + + + @Test + void getGameBreakdown_returnsNoGamesRecordedMessage_whenEmpty() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + String breakdown = player.getGameBreakdown(); + + // Assert + assertEquals("No games recorded.", breakdown); + } + + @Test + void getGameBreakdown_listsEachGameInOrder() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Team", 0, 0, 0 + ); + + // Act + player.recordGame(20, 5, 3); + player.recordGame(15, 7, 4); + + String breakdown = player.getGameBreakdown(); + + // Assert + assertTrue(breakdown.contains("Game 1: 20 PTS, 5 REB, 3 AST")); + assertTrue(breakdown.contains("Game 2: 15 PTS, 7 REB, 4 AST")); + } + + @Test + void getSummary_returnsFormattedString() { + // Arrange + BasketballPlayerStats player = new BasketballPlayerStats( + 23, "Jordan", "Eldridge", "Lockdown Legends", 22, 7, 5 + ); + + // Act + String summary = player.getSummary(); + + // Assert + assertEquals( + "Jordan Eldridge (Lockdown Legends): 22 PTS, 7 REB, 5 AST", + summary + ); + } +} \ No newline at end of file