"""Validates the Gherkin file features/track_guesses.feature
Feature: Playing a round
  As a Wordle game
  I need to track how many guesses were already given, stating wins/losses
  In order to play the game
"""
from literate_wordle.game import WordleGame, WordleMoveOutcome, play_round
from literate_wordle.guess import CharacterScore as Score
[docs]def test_first_guess_allowed():
    """Scenario: First guess is allowed"""
    # Given a wordle answer
    answer = "orbit"
    # And I didn't guess before
    guess_number = 0
    game = WordleGame(answer=answer, guess_number=guess_number)
    # When I guess the word
    guess = "kebab"
    result = play_round(guess, game)
    # Then my guess is scored
    OUTCOME_CONTINUE = WordleMoveOutcome.GUESS_SCORED_CONTINUE
    assert result.outcome == OUTCOME_CONTINUE, "Game shouldn't be over yet"
    assert result.score is not None, "No score given as result"
    assert len(result.score) == 5, "Score of incorrect length"
    ALLOWED_CHARS = [score.value for score in Score]
    assert all(
        char in ALLOWED_CHARS for char in list(result.score)
    ), "Score doesn't match score's characters" 
[docs]def test_sixth_guess_allowed():
    """Scenario: Fifth guess still allowed"""
    # Given a wordle answer
    answer = "orbit"
    # And I guessed 5 times
    guess_number = 6
    game = WordleGame(answer=answer, guess_number=guess_number)
    # When I guess the word
    guess = "kebab"
    result = play_round(guess, game)
    # Then my guess is scored
    OUTCOME_CONTINUE = WordleMoveOutcome.GUESS_SCORED_CONTINUE
    assert result.outcome == OUTCOME_CONTINUE, "Game shouldn't be over yet"
    assert result.score is not None, "No score given as result"
    assert len(result.score) == 5, "Score of incorrect length"
    OK_CHARS = ["🟩", "🟨", "⬜"]
    assert all(
        char in OK_CHARS for char in list(result.score)
    ), "Score doesn't match score's characters" 
[docs]def test_seventh_guess_fails_game():
    """Scenario: Sixth failed guess is game over"""
    # Given a wordle answer
    answer = "orbit"
    # And I guessed 6 times already
    # Guessing 6 times BEFORE, using seventh now:
    guess_number = 7
    game = WordleGame(answer, guess_number)
    # When I guess the word
    # And my guess isn't the answer
    guess = "kebab"
    result = play_round(guess, game)
    # Then my guess isn't scored
    assert result.outcome == WordleMoveOutcome.GAME_OVER_LOST, "Should have lost game"
    # But game shows "Game Over"
    assert "game over" in result.message.lower(), "Should show game over message"
    # And game shows the real answer
    assert answer in result.message 
[docs]def test_winning_guess_wins():
    """Scenario: Winning guess"""
    # Given a wordle answer
    answer = "orbit"
    # And I guessed 3 times
    guess_number = 3
    game = WordleGame(answer, guess_number)
    # When I guess the word
    # And my guess is the answer
    guess = answer
    result = play_round(guess, game)
    # Then my guess is scored
    assert result.score is not None, "Guess should be scored"
    # And the score is perfect
    assert result.score == "🟩🟩🟩🟩🟩"
    # And game shows "Game Won
    assert result.outcome == WordleMoveOutcome.GAME_WON, "Should have won game"
    assert "game won" in result.message.lower() 
# Case covered by existing gherkin feature:
# Intentional, see wordle.org for reasoning
[docs]def test_invalid_guess_not_counted():
    """Scenario: Invalid guess isn't counted"""
    # Given a wordle answer
    answer = "orbit"
    # And I guessed 3 times
    guess_number = 3
    game = WordleGame(answer=answer, guess_number=guess_number)
    # When I guess the word
    # But my guess isn't a dictionary word
    guess = "xolfy"
    result = play_round(guess, game)
    # Then my guess is rejected as invalid word
    OUTCOME_BADWORD = WordleMoveOutcome.GUESS_NOTVALID_CONTINUE
    assert result.outcome == OUTCOME_BADWORD, "Guess should have been rejected"
    # And my guess is not scored
    assert result.score is None, "No score should be given on bad word"