package org.atoum.intellij.plugin.atoum.tests;

import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import com.jetbrains.php.lang.psi.PhpFile;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import org.atoum.intellij.plugin.atoum.Utils;

import java.io.File;

public class UtilsTest extends LightCodeInsightFixtureTestCase {
    protected String getTestDataPath() {
        return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath();
    }

    public void testGetFirstClassFromFile() {
        PhpClass phpClass = Utils.getFirstClassFromFile((PhpFile) myFixture.configureByFile(
            "TestSimpleClass.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClass", phpClass.getFQN());

        phpClass = Utils.getFirstClassFromFile((PhpFile) myFixture.configureByFile(
            "TestMultipleClassNotFirst.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\AnotherClassDefinedBeforeTheTest", phpClass.getFQN());
    }

    public void testGetFirstTestClassFromFile() {
        // Include stubs
        myFixture.copyFileToProject("atoum.php");

        PhpClass phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
            "TestSimpleClass.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClass", phpClass.getFQN());

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
            "TestMultipleClassNotFirst.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\TestMultipleClassNotFirst", phpClass.getFQN());

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
            "TestSimpleClassWithoutUse.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClassWithoutUse", phpClass.getFQN());

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
            "TestWithParentClass.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\TestWithParentClass", phpClass.getFQN());

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
            "TestWrongExtends.php"
        ));
        assertNull(phpClass);

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
            "TestWrongNamespace.php"
        ));
        assertNull(phpClass);
    }

    public void testGetFirstTestClassFromFileWithoutStubs() {
        PhpClass phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
                "TestSimpleClass.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClass", phpClass.getFQN());

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
                "TestMultipleClassNotFirst.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\TestMultipleClassNotFirst", phpClass.getFQN());

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
                "TestSimpleClassWithoutUse.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClassWithoutUse", phpClass.getFQN());

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
                "TestWithParentClass.php"
        ));
        assertNotNull(phpClass);
        assertEquals("\\PhpStormPlugin\\tests\\units\\TestWithParentClass", phpClass.getFQN());

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
                "TestWrongExtends.php"
        ));
        assertNull(phpClass);

        phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
                "TestWrongNamespace.php"
        ));
        assertNull(phpClass);
    }
}