diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/states/PopulationException.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/states/PopulationException.java new file mode 100644 index 000000000..da0d0100d --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/states/PopulationException.java @@ -0,0 +1,7 @@ +package com.codedifferently.lesson16.states; + +class PopulationTooLowException extends Exception { + public PopulationTooLowException(String message) { + super(message); + } +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/states/State.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/states/State.java new file mode 100644 index 000000000..63a59b4d6 --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/states/State.java @@ -0,0 +1,49 @@ +package com.codedifferently.lesson16.states; + +import java.util.ArrayList; + +public class State { + private String name; + private String capital; + private int population; + private double area; + private Region region; + private ArrayList majorCities; + + enum Region { + NORTHEAST, + MIDWEST, + SOUTH, + WEST, + PACIFIC + } + + public State(String name, String capital, int population, double area, Region region) { + this.name = name; + this.capital = capital; + this.population = population; + this.area = area; + this.region = region; + this.majorCities = new ArrayList<>(); + } + + public void updatePopulation(int newPopulation) throws PopulationTooLowException { + if (newPopulation < 10000) { + throw new PopulationTooLowException("Population too low for a state!"); + } + this.population = newPopulation; + System.out.println("Population updated to " + newPopulation); + } + + public void addMajorCity(String city) { + majorCities.add(city); + System.out.println(city = "added to major cities of " + name); + } + + public void listMajorCities() { + System.out.println("Major cities in " + name + ":"); + for (String city : majorCities) { + System.out.println("- " + city); + } + } +} diff --git a/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/states/StateTest.java b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/states/StateTest.java new file mode 100644 index 000000000..3369edc04 --- /dev/null +++ b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/states/StateTest.java @@ -0,0 +1,67 @@ +package com.codedifferently.lesson16.states; + +import static org.assertj.core.api.Assertions.*; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class StateTest { + + private State state; + + @BeforeEach + public void setUp() { + state = new State("California", "Sacramento", 39500000, 423967, State.Region.WEST); + } + + @Test + public void constructor_ShouldInitializeFieldsCorrectly() { + assertThat(state) + .extracting("name", "capital", "population", "area", "region") + .containsExactly("California", "Sacramento", 39500000, 423967.0, State.Region.WEST); + } + + @Test + public void updatePopulation_ShouldUpdateCorrectly_WhenValid() throws PopulationTooLowException { + state.updatePopulation(5000000); + assertThat(state).extracting("population").isEqualTo(5000000); + } + + @Test + public void updatePopulation_ShouldThrowException_WhenTooLow() { + assertThatThrownBy(() -> state.updatePopulation(9000)) + .isInstanceOf(PopulationTooLowException.class) + .hasMessage("Population too low for a state!"); + } + + @Test + public void addMajorCity_ShouldAddCityToList() { + state.addMajorCity("Los Angeles"); + state.addMajorCity("San Francisco"); + + // Check if the cities were added (accessing via reflection for private field) + assertThat(state) + .extracting("majorCities") + .asList() + .containsExactly("Los Angeles", "San Francisco"); + } + + @Test + public void listMajorCities_ShouldPrintCityList() { + state.addMajorCity("Los Angeles"); + state.addMajorCity("San Diego"); + + // Capture the output + ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outContent)); + + state.listMajorCities(); + + System.setOut(System.out); // Reset back + + String expectedOutput = "Major cities in California:\n- Los Angeles\n- San Diego\n"; + assertThat(outContent.toString().trim()).isEqualToIgnoringNewLines(expectedOutput.trim()); + } +}