diff --git a/src/main/java/subway/SubwayInitializer.java b/src/main/java/subway/SubwayInitializer.java new file mode 100644 index 000000000..70d03953b --- /dev/null +++ b/src/main/java/subway/SubwayInitializer.java @@ -0,0 +1,31 @@ +package subway; + +public class SubwayInitializer { + private final SubwayService subwayService; + + public SubwayInitializer(SubwayService subwayService) { + this.subwayService = subwayService; + } + + public void initialize() { + initializeStations(); + initializeLines(); + } + + private void initializeStations() { + subwayService.addStation("교대역"); + subwayService.addStation("강남역"); + subwayService.addStation("역삼역"); + subwayService.addStation("남부터미널역"); + subwayService.addStation("양재역"); + subwayService.addStation("양재시민의숲역"); + subwayService.addStation("매봉역"); + } + + private void initializeLines() { + subwayService.addLine("2호선", new String[]{"교대역", "강남역", "역삼역"}); + subwayService.addLine("3호선", new String[]{"교대역", "남부터미널역", "양재역", "매봉역"}); + subwayService.addLine("신분당선", new String[]{"강남역", "양재역", "양재시민의숲역"}); + } + +} diff --git a/src/main/java/subway/SubwayService.java b/src/main/java/subway/SubwayService.java index cc96d7a01..d46168c2e 100644 --- a/src/main/java/subway/SubwayService.java +++ b/src/main/java/subway/SubwayService.java @@ -1,4 +1,25 @@ package subway; +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; + public class SubwayService { + + public void addStation(String name) { + StationRepository.addStation(new Station(name)); + } + + public void addLine(String name, String[] stationNames) { + Line line = new Line(name); + for (String stationName : stationNames) { + Station station = StationRepository.stations().stream() + .filter(s -> s.getName().equals(stationName)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 존재하지 않는 역입니다.")); + line.addStation(station); + } + LineRepository.addLine(line); + } } diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..fde014dfd 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,7 +1,12 @@ package subway.domain; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public class Line { private String name; + private List stations = new ArrayList<>(); public Line(String name) { this.name = name; @@ -11,5 +16,11 @@ public String getName() { return name; } - // 추가 기능 구현 + public void addStation(Station station) { + stations.add(station); + } + + public List getStations() { + return Collections.unmodifiableList(stations); + } } diff --git a/src/test/java/subway/SubwayInitializerTest.java b/src/test/java/subway/SubwayInitializerTest.java new file mode 100644 index 000000000..e1659f64a --- /dev/null +++ b/src/test/java/subway/SubwayInitializerTest.java @@ -0,0 +1,72 @@ +package subway; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class SubwayInitializerTest { + + @Nested + @DisplayName("SubwayInitializer") + class SubwayService_Init { + SubwayInitializer subwayInitializer; + SubwayService subwayService; + + @BeforeEach + void setUp() { + subwayInitializer = new SubwayInitializer(subwayService); + } + + @Test + @DisplayName("지하철 초기화") + void initSubwayLine() { + subwayInitializer.initialize(); + + // 지하철 역 초기화 + assertStationsInitialized(StationRepository.stations()); + + // 지하철 노선 초기화 + assertLinesInitialized(LineRepository.lines()); + } + private void assertStationsInitialized(List stations) { + assertEquals(7, stations.size()); + assertAll("stations", + () -> assertTrue(stations.stream().anyMatch(station -> station.getName().equals("교대역"))), + () -> assertTrue(stations.stream().anyMatch(station -> station.getName().equals("강남역"))), + () -> assertTrue(stations.stream().anyMatch(station -> station.getName().equals("역삼역"))), + () -> assertTrue(stations.stream().anyMatch(station -> station.getName().equals("남부터미널역"))), + () -> assertTrue(stations.stream().anyMatch(station -> station.getName().equals("양재역"))), + () -> assertTrue(stations.stream().anyMatch(station -> station.getName().equals("양재시민의숲역"))), + () -> assertTrue(stations.stream().anyMatch(station -> station.getName().equals("매봉역"))) + ); + } + + private void assertLinesInitialized(List lines) { + assertEquals(3, lines.size()); + + assertLine(lines, "2호선", new String[]{"교대역", "강남역", "역삼역"}); + assertLine(lines, "3호선", new String[]{"교대역", "남부터미널역", "양재역", "매봉역"}); + assertLine(lines, "신분당선", new String[]{"강남역", "양재역", "양재시민의숲역"}); + } + + private void assertLine(List lines, String lineName, String[] stationNames) { + Line line = lines.stream().filter(l -> l.getName().equals(lineName)).findFirst().orElse(null); + + assertNotNull(line, lineName); + assertEquals(stationNames.length, line.getStations().size(), lineName); + + for (int i = 0; i < stationNames.length; i++) { + assertEquals(stationNames[i], line.getStations().get(i).getName(), lineName); + } + } + } +} \ No newline at end of file diff --git a/src/test/java/subway/SubwayServiceTest.java b/src/test/java/subway/SubwayServiceTest.java index 6025352df..70ed1c37e 100644 --- a/src/test/java/subway/SubwayServiceTest.java +++ b/src/test/java/subway/SubwayServiceTest.java @@ -1,37 +1,5 @@ package subway; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - public class SubwayServiceTest { - @Nested - @DisplayName("SubwayService Initialization") - class SubwayService_Init { - SubwayService subwayService; - - @BeforeEach - void setUp() { - subwayService = new SubwayService(); - } - - @Test - @DisplayName("지하철 노선도 초기화") - void initSubwayLine() { - subwayService.initSubwayLine(); - - assertAll( - () -> assertEquals(Arrays.asList("교대역", "강남역", "역삼역"), subwayService.getStations("2호선")), - () -> assertEquals(Arrays.asList("교대역", "남부터미널역", "양재역", "매봉역"), subwayService.getStations("3호선")), - () -> assertEquals(Arrays.asList("강남역", "양재역", "양재시민의숲역"), subwayService.getStations("신분당선")) - ); - } - } }