class TestPresentStartMenuOptionsUseCase(TestCase):
    def setUp(self):
        self.minefield_repository = InMemoryMinefieldRepository()
        self.subject = PresentStartMenuOptionsUseCase(minefield_repository=self.minefield_repository)

    def test_present_start_menu_options_without_existing_minefields(self):
        menu_options = get_keywords(test_action_method=self.subject,
                                    keyword_argument='menu_options',
                                    spy_class=PresentStartMenuOptionsUseCaseObserver,
                                    spied_upon_method_name='did_present_start_menu_options')
        expected_menu_options = MenuOptions(
            options=[StartMenuOptionType.StartNewGame, StartMenuOptionType.Quit],
            initially_selected_option=StartMenuOptionType.StartNewGame)

        self.assertEqual(menu_options, expected_menu_options)

    def test_present_start_menu_options_with_existing_minefields(self):
        self.minefield_repository.create_minefield(board=Board(row_count=5, column_count=5),
                                                   mine_coordinates=frozenset([Coordinate(1, 1)]))
        menu_options = get_keywords(test_action_method=self.subject,
                                    keyword_argument='menu_options',
                                    spy_class=PresentStartMenuOptionsUseCaseObserver,
                                    spied_upon_method_name='did_present_start_menu_options')
        expected_options = [StartMenuOptionType.StartNewGame, StartMenuOptionType.ResumeGame, StartMenuOptionType.Quit]
        expected_menu_options = MenuOptions(options=expected_options,
                                            initially_selected_option=StartMenuOptionType.StartNewGame)

        self.assertEqual(menu_options, expected_menu_options)

    def test_present_start_menu_options_should_notify_observer_with_present_create_board_options_callable(self):
        present_create_board_options = get_keywords(test_action_method=self.subject,
                                                    keyword_argument='present_create_board_options',
                                                    spy_class=PresentStartMenuOptionsUseCaseObserver,
                                                    spied_upon_method_name='did_present_start_menu_options')
        create_board = get_keywords(test_action_method=present_create_board_options,
                                    keyword_argument='create_board',
                                    spy_class=PresentCreateBoardOptionsUseCaseObserver,
                                    spied_upon_method_name='did_present_create_board_options')
        create_board = partial(create_board.__call__, row_count=7, column_count=6)
        board = get_keywords(test_action_method=create_board,
                             keyword_argument='board',
                             spy_class=CreateBoardUseCaseObserver,
                             spied_upon_method_name='did_create_board')
        expected_board = Board(row_count=7, column_count=6)
        assert_boards_equal(board=board, expected_board=expected_board, test_case=self)
        board_snapshot = get_keywords(test_action_method=create_board,
                                      keyword_argument='board_snapshot',
                                      spy_class=CreateBoardUseCaseObserver,
                                      spied_upon_method_name='did_create_board')
        expected_board_snapshot = [[CellType.Unknown for column in range(6)] for row in range(7)]
        assert_board_snapshots_equal(board_snapshot=board_snapshot,
                                     expected_board_snapshot=expected_board_snapshot,
                                     test_case=self)