package dotsandboxes;

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

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class DotsAndBoxesGridTest {
    /*
     * Because Test classes are classes, they can have fields, and can have static
     * fields.
     * This field is a logger. Loggers are like a more advanced println, for writing
     * messages out to the console or a log file.
     */
    private static final Logger logger = LogManager.getLogger(DotsAndBoxesGridTest.class);

    /*
     * Tests are functions that have an @Test annotation before them.
     * The typical format of a test is that it contains some code that does
     * something, and then one
     * or more assertions to check that a condition holds.
     *
     * This is a dummy test just to show that the test suite itself runs
     */
    @Test
    public void testTestSuiteRuns() {
        logger.info("Dummy test to show the test suite runs");
        assertTrue(true);
    }

    // FIXME: You need to write tests for the two known bugs in the code.
    @Test
    public void testCompleteBox() {
        logger.info("Testing whether the algorithm for testing whether a box is complete is wrong");

        DotsAndBoxesGrid grid = new DotsAndBoxesGrid(15, 8, 2);
        
        // draw three sides of a box, not four!
        grid.drawVertical(1, 1, 1);
        grid.drawVertical(2, 1, 1);
        grid.drawHorizontal(1, 1, 1);
        // grid.drawHorizontal(1, 2, 1);

        assertFalse(grid.boxComplete(1, 1));
    }

    @Test
    public void testHorizontalAlreadyDrawn() {
        logger.info("Testing whether an exception is thrown if a horizontal line is already drawn.");

        DotsAndBoxesGrid grid = new DotsAndBoxesGrid(15, 8, 2);

        grid.drawHorizontal(1, 1, 1);
        Exception exeption = assertThrows(IllegalStateException.class, () -> {
            grid.drawHorizontal(1, 1, 1);
        });

        String expectedMessage = "Horizontal line already drawn";
        String actualMessage = exeption.getMessage();

        assertTrue(actualMessage.contains(expectedMessage));
    }

    @Test
    public void testVerticalAlreadyDrawn() {
        logger.info("Testing whether an exception is thrown if a horizontal line is already drawn.");

        DotsAndBoxesGrid grid = new DotsAndBoxesGrid(15, 8, 2);

        grid.drawVertical(1, 1, 1);
        Exception exeption = assertThrows(IllegalStateException.class, () -> {
            grid.drawVertical(1, 1, 1);
        });

        String expectedMessage = "Vertical line already drawn";
        String actualMessage = exeption.getMessage();

        assertTrue(actualMessage.contains(expectedMessage));
    }
}