package test.sample;

import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

/**
 * Check to see that AfterClass is called only at the end and that after methods
 * are called in reverse order of the before methods.
 */
public class AfterClassCalledAtEnd extends BaseAfterClassCalledAtEnd {
  boolean m_before1Class = false;
  boolean m_test1 = false;
  boolean m_test2 = false;
  boolean m_test3 = false;

  @BeforeClass(groups = { "before1Class" } )
  public void before1Class() {
    m_before1Class = true;
  }

  @AfterClass(groups = { "someGroup" })
  public void afterClass() {
    m_afterClass = true;
    assert m_test1 && m_test2 && m_test3 :
      "One of the test methods was not invoked: " + m_test1 + " " + m_test2 + " " + m_test3;
  }

  @Test(description = "Verify that beforeClass and afterClass are called correctly")
  public void test1() { 
    m_test1 = true;
    assert m_before1Class : "beforeClass configuration must be called before method";
    assert ! m_afterClass : "afterClass configuration must not be called before test method";
  }
  
  @Test
  public void test2() {
    m_test2 = true;
    assert m_before1Class : "beforeClass configuration must be called before method";
    assert ! m_afterClass : "afterClass configuration must not be called before test method"; 
  }

  @Test
  public void test3() {
    m_test3 = true;
    assert m_before1Class : "beforeClass configuration must be called before method";
    assert ! m_afterClass : "afterClass configuration must not be called before test method"; 
  }

}