import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;


public class MastermindTest {

    private Mastermind game;

    @BeforeEach
    public void setUp() {
        this.game = new Mastermind(10, 4, 6);
    }

    @Test
    public void test_check_code_len() {
        assertFalse(this.game.checkCode(List.of(1, 1, 1)));
        assertTrue(this.game.checkCode(List.of(1, 1, 1, 1)));
        assertFalse(this.game.checkCode(List.of(1, 1, 1, 1, 1)));
    }

    @Test
    public void test_check_code_range() {
        assertFalse(this.game.checkCode(List.of(1, 1, 1, -3)));
        assertFalse(this.game.checkCode(List.of(1, 1, -2, 1)));
        assertFalse(this.game.checkCode(List.of(1, -1, 1, 1)));
        assertFalse(this.game.checkCode(List.of(0, 1, 1, 1)));
        assertTrue(this.game.checkCode(List.of(1, 2, 3, 4)));
        assertTrue(this.game.checkCode(List.of(6, 5, 4, 3)));
        assertFalse(this.game.checkCode(List.of(7, 6, 6, 6)));
        assertFalse(this.game.checkCode(List.of(6, 8, 6, 6)));
        assertFalse(this.game.checkCode(List.of(6, 6, 9, 6)));
        assertFalse(this.game.checkCode(List.of(6, 6, 6, 10)));
    }

    @Test
    public void test_has_remaining_attempts() {
        this.game.chances = 0;
        assertFalse(this.game.hasRemainingAttempts());
        this.game.chances = 1;
        assertTrue(this.game.hasRemainingAttempts());
    }

    @Test
    public void test_is_right_answer() {
        assertTrue(this.game.isRightAnswer(new int[]{4, 0}));
        assertFalse(this.game.isRightAnswer(new int[]{0, 4}));
        assertFalse(this.game.isRightAnswer(new int[]{0, 0}));
        assertFalse(this.game.isRightAnswer(new int[]{4, 1}));
    }

    @Test
    public void test_guess_pattern() {
        List<Integer> code = List.of(6, 5, 1, 4);
        assertArrayEquals(new int[]{0, 1}, Mastermind.provideHints(code, List.of(1, 1, 2, 2)));
        assertArrayEquals(new int[]{1, 1}, Mastermind.provideHints(code, List.of(6, 1, 2, 3)));
        assertArrayEquals(new int[]{1, 0}, Mastermind.provideHints(code, List.of(1, 1, 1, 1)));
        assertArrayEquals(new int[]{1, 0}, Mastermind.provideHints(code, List.of(6, 6, 6, 6)));
        assertArrayEquals(new int[]{4, 0}, Mastermind.provideHints(code, List.of(6, 5, 1, 4)));
    }
}
