package test.dataprovider;

import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
import org.testng.internal.ConstructorOrMethod;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ConstructorOrMethodSample {

    String s;

    @Factory(dataProvider = "dp1")
    public ConstructorOrMethodSample(String s) {
        this.s = s;
    }

    @DataProvider(name = "dp1")
    public static Object[][] createData1(ConstructorOrMethod cOrM) {
        Assert.assertEquals(cOrM.getDeclaringClass(), ConstructorOrMethodSample.class);
        Assert.assertNull(cOrM.getMethod());
        Assert.assertNotNull(cOrM.getConstructor());

        Constructor c = cOrM.getConstructor();
        Assert.assertNotNull(c.getAnnotation(Factory.class));
        Assert.assertEquals(c.getParameterTypes().length, 1);
        Assert.assertEquals(c.getParameterTypes()[0], String.class);

        return new Object[][]{{"0"}, {"1"}};
    }

    @Test
    public void test1() {
    }

    @DataProvider(name = "dp2")
    public Object[][] createData2(ConstructorOrMethod cOrM) {
        Assert.assertEquals(cOrM.getDeclaringClass(), ConstructorOrMethodSample.class);
        Assert.assertNotNull(cOrM.getMethod());
        Assert.assertNull(cOrM.getConstructor());

        Method m = cOrM.getMethod();
        Assert.assertEquals(m.getName(), "test2");

        return new Object[][]{{"Cedric" + s}, {"Alois" + s}};
    }

    @Test(dataProvider = "dp2")
    public void test2(String s) {
    }
}
