diff --git a/docs/README.md b/docs/README.md index e69de29..2c1fc52 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,18 @@ +#### 조건 +>들여쓰기 깊이 2까지만 허용 +>함수나 메서드가 한 가지 일만 하도록 최대한 작게 만들기 +>입력이 올바르지 않은 경우 ValueError + +#### 기본 입출력 +* [x] 자동차 이름과 시도 횟수 입력받기 + (단, 이름은 5자 이하, 쉼표로 구분) +* [x] 실행 결과 (전진 횟수 * '-' 사용) + +#### 전진 여부 함수 +* [x] 0~9 사이 무작위 값 +* [x] 그 값이 4 이상이면 전진 + +#### 최종 우승자 출력 +* [x] 전진 최대값 구하기 +* [x] 자동차 전진값 == 최대값인 경우 winner 리스트에 추가 +* [x] 형식에 맞추어 출력 \ No newline at end of file diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 4128547..19c558f 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -1,11 +1,70 @@ +""" 자동차 경주 게임 """ + +import random +FORWARD_THRESHOLD = 4 + + def main(): """ - 프로그램의 진입점 함수. - 여기에서 전체 프로그램 로직을 시작합니다. + 프로그램을 실행하고, 자동차 경주의 시뮬레이션을 수행하는 함수 + 사용자로부터 자동차 이름과 시도 횟수를 입력받고, + 각 시도마다 경주를 진행하여 최종 우승자를 출력. """ - # 프로그램의 메인 로직을 여기에 구현 print("프로그램이 시작되었습니다.") + car_names = input("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)\n") + cars = car_names.split(",") + if not all(car.strip() for car in cars): + raise ValueError("자동차 이름은 빈 문자열이 될 수 없습니다.") + if len(cars) != len(set(cars)): + raise ValueError("중복된 이름은 허용되지 않습니다.") + for car in cars: + if len(car) > 5: + raise ValueError("이름이 5자를 초과합니다.") + + car_positions = {car: 0 for car in cars} + + attempts = input("시도할 횟수는 몇 회인가요?\n") + if not attempts.isdigit(): + raise ValueError("시도 횟수는 숫자로 입력하세요.") + attempts = int(attempts) + if attempts <= 0: + raise ValueError("시도 횟수는 1 이상이어야 합니다.") + + print("\n실행 결과") + for _ in range(attempts): + movement(cars, car_positions) + for car in cars: + print(car + " : " + '-' * car_positions[car]) + print() + print_winner(cars, car_positions) + + +def movement(cars, car_positions): + """ + 각 자동차가 0에서 9 사이의 랜덤 숫자를 생성하여, + 4 이상의 숫자가 나오면 해당 자동차의 위치를 1 증가시키는 함수 + """ + for car in cars: + if random.randint(0, 9) >= FORWARD_THRESHOLD: + car_positions[car] += 1 + + +def get_winner(cars, car_positions): + """ + 경주에서 우승한 자동차를 구하는 함수 + """ + max_value = max(car_positions.values()) + return [car for car in cars if car_positions[car] == max_value] + + +def print_winner(cars, car_positions): + """ + 최종 우승자를 출력하는 함수 + """ + winner = get_winner(cars, car_positions) + print(f"최종 우승자 : {', '.join(winner)}") + if __name__ == "__main__": # 프로그램이 직접 실행될 때만 main() 함수를 호출 diff --git a/tests/racingcar/test_main.py b/tests/racingcar/test_main.py index 2bb91be..71e3e22 100644 --- a/tests/racingcar/test_main.py +++ b/tests/racingcar/test_main.py @@ -19,7 +19,7 @@ def test_전진_및_정지(capsys): main() # 프로그램 실행 # 출력값을 캡처한 후 검증 - 캡처된_출력 = capsys.readouterr() + 캡처된_출력 = capsys.readouterr().out assert all(예상_출력 in 캡처된_출력 for 예상_출력 in ["pobi : -", "woni : ", "최종 우승자 : pobi"]) @@ -34,5 +34,51 @@ def test_이름에_대한_예외(): with patch('builtins.input', side_effect=["pobi,javaji", "1"]): main() # 프로그램 실행 - # 추가적인 시나리오에 대한 테스트를 필요에 따라 작성할 수 있습니다. + +# 잘못된 시도 횟수에 대한 예외 처리 테스트 +def test_시도_횟수에_대한_예외(): + """ + 시도 횟수에 대한 예외 처리를 테스트합니다. + 'pytest.raises'를 사용해 IllegalArgumentException과 유사한 ValueError를 발생시키는지 검증합니다. + """ + with pytest.raises(ValueError): + # 시도 횟수가 0인 경우에 대한 입력을 모의 처리 + with patch('builtins.input', side_effect=["pobi,won", "0"]): + main() # 프로그램 실행 + + +# 이름의 중복에 대한 예외 처리 테스트 +def test_이름_중복에_대한_예외(): + """ + 이름 중복에 대한 예외 처리를 테스트합니다. + 'pytest.raises'를 사용해 IllegalArgumentException과 유사한 ValueError를 발생시키는지 검증합니다. + """ + with pytest.raises(ValueError): + # 자동차 이름이 중복된 경우에 대한 입력을 모의 처리 + with patch('builtins.input', side_effect=["pobi,won,pobi", "1"]): + main() # 프로그램 실행 + + +# 빈 이름에 대한 예외 처리 테스트 +def test_자동차_이름이_빈_경우에_대한_예외(): + """ + 자동차 이름이 빈 경우에 대한 예외 처리를 테스트합니다. + 'pytest.raises'를 사용해 IllegalArgumentException과 유사한 ValueError를 발생시키는지 검증합니다. + """ + with pytest.raises(ValueError): + # 자동차 이름이 빈 경우에 대한 입력을 모의 처리 + with patch('builtins.input', side_effect=["pobi,won, ", "1"]): + main() # 프로그램 실행 + + +# 시도 횟수에 문자열 입력에 대한 예외 처리 테스트 +def test_시도_횟수에_문자열_입력에_대한_예외(): + """ + 시도 횟수에 문자열 입력에 대한 예외 처리를 테스트합니다. + 'pytest.raises'를 사용해 IllegalArgumentException과 유사한 ValueError를 발생시키는지 검증합니다. + """ + with pytest.raises(ValueError): + # 시도 횟수에 문자열이 입력된 경우에 대한 입력을 모의 처리 + with patch('builtins.input', side_effect=["pobi,won", "abc"]): + main() # 프로그램 실행 \ No newline at end of file