package test.dataprovider;

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

/**
 * Make sure that all before methods except beforeTestMethod are invoked before DataProvider.
 */
public class ConfigurationAndDataProvidersSample {

  private boolean m_beforeSuite = false;
  private boolean m_beforeTest = false;
  private boolean m_beforeClass = false;
  private boolean m_beforeTestMethod = false;

  @DataProvider(name = "test1")
  public Object[][] createData() {
    Assert.assertTrue(m_beforeSuite, "beforeSuite should have been invoked");
    Assert.assertTrue(m_beforeTest, "beforeTest should have been invoked");
    Assert.assertTrue(m_beforeClass, "beforeClass should have been invoked");
    Assert.assertFalse(m_beforeTestMethod, "beforeMethod should not have been invoked");

    return new Object[][]{{"Test"}};
  }

  @Test(dataProvider = "test1")
  public void verifyNames(Object p) {
    // do nothing
  }

  @BeforeSuite
  public void setUpSuite() {
    m_beforeSuite = true;
  }

  @BeforeTest
  public void setUpTest() {
    m_beforeTest = true;
  }

  @BeforeClass
  public void setUpClass() {
    m_beforeClass = true;
  }

  @BeforeMethod
  public void setUp() {
    m_beforeTestMethod = true;
  }
}
