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