"""Test Mastermind Evaluator.""" from collections import Counter import pytest from mastermind_evaluator import BLACK_PEG from mastermind_evaluator import BLUE_PEG from mastermind_evaluator import get_random_colored_pegs from mastermind_evaluator import GREEN_PEG from mastermind_evaluator import interview_question_adapter from mastermind_evaluator import mastermind_evaluator from mastermind_evaluator import ORANGE_PEG from mastermind_evaluator import PEG_COLOR_OPTIONS from mastermind_evaluator import PURPLE_PEG from mastermind_evaluator import RED_PEG from mastermind_evaluator import WHITE_PEG from mastermind_evaluator import YELLOW_PEG BLACK_1 = Counter({BLACK_PEG: 1}) BLACK_1_WHITE_1 = Counter({BLACK_PEG: 1, WHITE_PEG: 1}) BLACK_1_WHITE_2 = Counter({BLACK_PEG: 1, WHITE_PEG: 2}) BLACK_1_WHITE_3 = Counter({BLACK_PEG: 1, WHITE_PEG: 3}) BLACK_2 = Counter({BLACK_PEG: 2}) BLACK_2_WHITE_1 = Counter({BLACK_PEG: 2, WHITE_PEG: 1}) BLACK_2_WHITE_2 = Counter({BLACK_PEG: 2, WHITE_PEG: 2}) BLACK_3 = Counter({BLACK_PEG: 3}) BLACK_3_WHITE_1 = Counter({BLACK_PEG: 3, WHITE_PEG: 1}) BLACK_4 = Counter({BLACK_PEG: 4}) NO_SCORE = Counter() WHITE_1 = Counter({WHITE_PEG: 1}) WHITE_2 = Counter({WHITE_PEG: 2}) WHITE_3 = Counter({WHITE_PEG: 3}) WHITE_4 = Counter({WHITE_PEG: 4}) test_descriptions = {key: key for key in { 'BLACK_1 1', 'BLACK_1 2', 'BLACK_1_WHITE_1 1', 'BLACK_1_WHITE_1 2', 'BLACK_1_WHITE_2 1', 'BLACK_1_WHITE_2 2', 'BLACK_1_WHITE_3 1', 'BLACK_2 1', 'BLACK_2 2', 'BLACK_2_WHITE_1 1', 'BLACK_2_WHITE_1 2', 'BLACK_2_WHITE_2 1', 'BLACK_2_WHITE_2 2', 'BLACK_3 1', 'BLACK_3 2', 'BLACK_3_WHITE_1 1', 'BLACK_4 1', 'BLACK_4 2', 'BLACK_4 3', 'BLACK_4 4', 'NO_SCORE 1', 'NO_SCORE 2', 'NO_SCORE 3', 'NO_SCORE 4', 'WHITE_1 1', 'WHITE_1 2', 'WHITE_2 1', 'WHITE_2 2', 'WHITE_3 1', 'WHITE_3 2', 'WHITE_4 1', 'WHITE_4 2', 'WHITE_4 3', 'WHITE_4 4', }} @pytest.mark.parametrize('num_pegs', range(4, 11)) def test_get_random_colored_pegs(num_pegs): """Test get_random_colored_pegs.""" random_colored_pegs = get_random_colored_pegs(num_pegs=num_pegs) assert num_pegs == len(random_colored_pegs) assert PEG_COLOR_OPTIONS >= set(random_colored_pegs) @pytest.mark.parametrize(( 'test_description', 'secret_pegs', 'guess_pegs', 'num_guesses', 'num_pegs_in_code', 'num_scoring_pegs', 'max_num_guesses', 'expected_is_game_over', 'expected_is_correct', 'expected_scoring_pegs', ), [ ( test_descriptions.pop('BLACK_4 1'), [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 6, 4, 10, True, True, BLACK_4, ), ( test_descriptions.pop('BLACK_4 2'), [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 6, 4, 10, False, False, BLACK_4, ), ( test_descriptions.pop('BLACK_4 3'), [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, GREEN_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 6, 4, 10, False, False, BLACK_4, ), ( test_descriptions.pop('BLACK_3 1'), [BLUE_PEG, BLUE_PEG, BLUE_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 6, 4, 10, False, False, BLACK_3, ), ( test_descriptions.pop('BLACK_2 1'), [BLUE_PEG, BLUE_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 6, 4, 10, False, False, BLACK_2, ), ( test_descriptions.pop('BLACK_1 1'), [BLUE_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 6, 4, 10, False, False, BLACK_1, ), ( test_descriptions.pop('NO_SCORE 1'), [GREEN_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 6, 4, 10, False, False, NO_SCORE, ), ( test_descriptions.pop('WHITE_4 1'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG], 1, 6, 4, 10, False, False, WHITE_4, ), ( test_descriptions.pop('WHITE_4 2'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG, ORANGE_PEG], [GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, YELLOW_PEG], 1, 6, 4, 10, False, False, WHITE_4, ), ( test_descriptions.pop('WHITE_4 3'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, PURPLE_PEG, ORANGE_PEG], [GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG, RED_PEG, YELLOW_PEG], 1, 6, 4, 10, False, False, WHITE_4, ), ( test_descriptions.pop('WHITE_3 1'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, PURPLE_PEG, ORANGE_PEG], [GREEN_PEG, BLUE_PEG, GREEN_PEG, RED_PEG, RED_PEG, YELLOW_PEG], 1, 6, 4, 10, False, False, WHITE_3, ), ( test_descriptions.pop('WHITE_2 1'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, PURPLE_PEG, ORANGE_PEG], [GREEN_PEG, BLUE_PEG, RED_PEG, RED_PEG, RED_PEG, YELLOW_PEG], 1, 6, 4, 10, False, False, WHITE_2, ), ( test_descriptions.pop('WHITE_1 1'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, PURPLE_PEG, ORANGE_PEG], [GREEN_PEG, RED_PEG, RED_PEG, RED_PEG, RED_PEG, YELLOW_PEG], 1, 6, 4, 10, False, False, WHITE_1, ), ( test_descriptions.pop('NO_SCORE 2'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, PURPLE_PEG, ORANGE_PEG], [RED_PEG, RED_PEG, RED_PEG, RED_PEG, RED_PEG, YELLOW_PEG], 1, 6, 4, 10, False, False, NO_SCORE, ), ( test_descriptions.pop('BLACK_3_WHITE_1 1'), [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, GREEN_PEG, YELLOW_PEG, ORANGE_PEG], 1, 6, 4, 10, False, False, BLACK_3_WHITE_1, ), ( test_descriptions.pop('BLACK_2_WHITE_2 1'), [BLUE_PEG, BLUE_PEG, ORANGE_PEG, BLUE_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, GREEN_PEG, YELLOW_PEG, ORANGE_PEG], 1, 6, 4, 10, False, False, BLACK_2_WHITE_2, ), ( test_descriptions.pop('BLACK_1_WHITE_3 1'), [BLUE_PEG, BLUE_PEG, ORANGE_PEG, BLUE_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, ORANGE_PEG, BLUE_PEG, GREEN_PEG, YELLOW_PEG, ORANGE_PEG], 1, 6, 4, 10, False, False, BLACK_1_WHITE_3, ), ( test_descriptions.pop('BLACK_1_WHITE_1 1'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, ORANGE_PEG, ORANGE_PEG, ORANGE_PEG, ORANGE_PEG], 1, 6, 4, 10, False, False, BLACK_1_WHITE_1, ), ( test_descriptions.pop('BLACK_1_WHITE_2 1'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, GREEN_PEG, ORANGE_PEG, ORANGE_PEG, ORANGE_PEG], 1, 6, 4, 10, False, False, BLACK_1_WHITE_2, ), ( test_descriptions.pop('BLACK_2_WHITE_1 1'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, ORANGE_PEG, ORANGE_PEG, ORANGE_PEG], 1, 6, 4, 10, False, False, BLACK_2_WHITE_1, ), ( test_descriptions.pop('BLACK_4 4'), [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 4, 4, 10, True, True, BLACK_4, ), ( test_descriptions.pop('BLACK_3 2'), [BLUE_PEG, BLUE_PEG, GREEN_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG], 1, 4, 4, 10, False, False, BLACK_3, ), ( test_descriptions.pop('BLACK_2 2'), [BLUE_PEG, BLUE_PEG, GREEN_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 4, 4, 10, False, False, BLACK_2, ), ( test_descriptions.pop('BLACK_1 2'), [BLUE_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 4, 4, 10, False, False, BLACK_1, ), ( test_descriptions.pop('NO_SCORE 3'), [GREEN_PEG, GREEN_PEG, GREEN_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, BLUE_PEG], 1, 4, 4, 10, False, False, NO_SCORE, ), ( test_descriptions.pop('WHITE_4 4'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [GREEN_PEG, BLUE_PEG, GREEN_PEG, BLUE_PEG], 1, 4, 4, 10, False, False, WHITE_4, ), ( test_descriptions.pop('WHITE_3 2'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [GREEN_PEG, BLUE_PEG, GREEN_PEG, RED_PEG], 1, 4, 4, 10, False, False, WHITE_3, ), ( test_descriptions.pop('WHITE_2 2'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [GREEN_PEG, BLUE_PEG, RED_PEG, RED_PEG], 1, 4, 4, 10, False, False, WHITE_2, ), ( test_descriptions.pop('WHITE_1 2'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [GREEN_PEG, RED_PEG, RED_PEG, RED_PEG], 1, 4, 4, 10, False, False, WHITE_1, ), ( test_descriptions.pop('NO_SCORE 4'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [RED_PEG, RED_PEG, RED_PEG, RED_PEG], 1, 4, 4, 10, False, False, NO_SCORE, ), ( test_descriptions.pop('BLACK_2_WHITE_2 2'), [BLUE_PEG, BLUE_PEG, ORANGE_PEG, BLUE_PEG], [BLUE_PEG, BLUE_PEG, BLUE_PEG, ORANGE_PEG], 1, 4, 4, 10, False, False, BLACK_2_WHITE_2, ), ( test_descriptions.pop('BLACK_1_WHITE_1 2'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, ORANGE_PEG, ORANGE_PEG], 1, 4, 4, 10, False, False, BLACK_1_WHITE_1, ), ( test_descriptions.pop('BLACK_1_WHITE_2 2'), [BLUE_PEG, GREEN_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, GREEN_PEG, ORANGE_PEG], 1, 4, 4, 10, False, False, BLACK_1_WHITE_2, ), ( test_descriptions.pop('BLACK_2_WHITE_1 2'), [BLUE_PEG, BLUE_PEG, BLUE_PEG, GREEN_PEG], [BLUE_PEG, BLUE_PEG, GREEN_PEG, ORANGE_PEG], 1, 4, 4, 10, False, False, BLACK_2_WHITE_1, ), ]) def test_mastermind_evaluator( test_description, secret_pegs, guess_pegs, num_guesses, num_pegs_in_code, num_scoring_pegs, max_num_guesses, expected_is_game_over, expected_is_correct, expected_scoring_pegs, ): """Test mastermind_evaluator.""" game_state = mastermind_evaluator( secret_pegs=secret_pegs, guess_pegs=guess_pegs, num_guesses=num_guesses, num_pegs_in_secret_code=num_pegs_in_code, num_scoring_pegs=num_scoring_pegs, max_num_guesses=max_num_guesses, ) (_i0, is_correct), (_i1, is_game_over), (_i2, scoring_pegs) = sorted( game_state.items()) assert expected_is_correct == is_correct assert expected_is_game_over == is_game_over assert expected_scoring_pegs == Counter(scoring_pegs) @pytest.mark.parametrize(( 'secret_code', 'guess', 'scoring', ), [ ( 'blue blue red red', 'blue red yellow green', 'black white', ), ( 'green green green blue', 'blue red red orange', 'white', ), ( 'green green yellow orange', 'red red purple blue', '', ), ( 'red red green orange', 'red red green orange', 'Winner!', ), ( 'red red orange blue', 'red orange red blue', 'black black white white', ), ]) def test_interview_question_adapter(secret_code, guess, scoring): """Test interview_question_adapter.""" assert Counter(scoring.split(' ')) == Counter( interview_question_adapter(secret_code, guess).split(' '))