package org.ggp.base.validator;

import java.util.List;

import org.ggp.base.util.game.TestGameRepository;
import org.junit.Assert;
import org.junit.Test;

public class StaticValidationTest {

    @Test
    public void testConn4Validation() throws Exception {
        validate("connectFour");
    }
    @Test
    public void testSimpleMutexValidation() throws Exception {
        validate("simpleMutex");
    }
    @Test
    public void test1AValidation() throws Exception {
        //Warning from empty-bodied rule
        expectWarnings(validate("test_case_1a"));
    }
    @Test
    public void test1BValidation() throws Exception {
        validate("test_case_1b");
    }
    @Test
    public void test2AValidation() throws Exception {
        validate("test_case_2a");
    }
    @Test
    public void test2BValidation() throws Exception {
        validate("test_case_2b");
    }
    @Test
    public void test2CValidation() throws Exception {
        validate("test_case_2c");
    }
    @Test
    public void test3AValidation() throws Exception {
      //Warning from empty-bodied sentence
        expectWarnings(validate("test_case_3a"));
    }
    @Test(expected=ValidatorException.class)
    public void test3BValidation() throws Exception {
        validate("test_case_3b");
    }
    @Test
    public void test3CValidation() throws Exception {
        validate("test_case_3c");
    }
    @Test
    public void test3DValidation() throws Exception {
        validate("test_case_3d");
    }
    @Test(expected=ValidatorException.class)
    public void test3EValidation() throws Exception {
        validate("test_case_3e");
    }
    @Test(expected=ValidatorException.class)
    public void test3FValidation() throws Exception {
        validate("test_case_3f");
    }
    @Test
    public void test4AValidation() throws Exception {
        validate("test_case_4a");
    }
    @Test
    public void test5AValidation() throws Exception {
        validate("test_case_5a");
    }
    @Test
    public void test5BValidation() throws Exception {
        validate("test_case_5b");
    }
    @Test
    public void test5CValidation() throws Exception {
        validate("test_case_5c");
    }
    @Test(expected=ValidatorException.class)
    public void testCleanNotDistinctValidation() throws Exception {
        validate("test_clean_not_distinct");
    }
    @Test
    public void testFunctionAritiesDiffer() throws Exception {
        expectWarnings(validate("test_invalid_function_arities_differ"));
    }
    @Test
    public void testSentenceAritiesDiffer() throws Exception {
        expectWarnings(validate("test_invalid_sentence_arities_differ"));
    }

    @Test
    public void testTicTacToeValidation() throws Exception {
        validate("ticTacToe");
    }

    protected List<ValidatorWarning> validate(String gameName) throws Exception {
        return new StaticValidator().checkValidity(new TestGameRepository().getGame(gameName));
    }

    private void expectWarnings(List<ValidatorWarning> warnings) {
        Assert.assertFalse("Expected warnings, but there were none", warnings.isEmpty());
    }
}
