package test.factory.github1083;

import org.testng.ITestNGListener;
import org.testng.TestNG;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import test.InvokedMethodNameListener;
import test.SimpleBaseTest;

import java.lang.reflect.Field;
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

public class GitHub1083Test extends SimpleBaseTest {

    @Test(dataProvider = "dp")
    public void testArrayFactorySample(Class<?> sampleClass) throws NoSuchFieldException, IllegalAccessException {
        List<String> parameters = getParameters(sampleClass);
        parameters.clear();
        TestNG tng = create(sampleClass);

        InvokedMethodNameListener listener = new InvokedMethodNameListener();
        tng.addListener((ITestNGListener) listener);

        tng.run();

        assertThat(parameters).containsExactly("bar");
        assertThat(listener.getSucceedMethodNames()).containsExactly("test");
    }

    @DataProvider
    public static Object[][] dp() {
        return new Object[][]{
                new Object[]{ArrayFactorySample.class},
                new Object[]{ConstructorFactorySample.class},
                new Object[]{DataProviderArrayFactorySample.class},
                new Object[]{DataProviderInstanceInfoFactorySample.class},
                new Object[]{InstanceInfoFactorySample.class}
        };
    }

    public static List<String> getParameters(Class<?> clazz) throws NoSuchFieldException, IllegalAccessException {
        Field parameters = clazz.getField("parameters");
        return (List<String>) parameters.get(null);
    }
}
