package test.inject;

import org.testng.Assert;
import org.testng.ITestResult;
import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.lang.reflect.Method;

public class InjectBeforeAndAfterMethodsWithTestResultSampleTest {
  static int m_success;
  private ITestResult m_testResult;

  @Test
  public void pass() {
    Assert.assertEquals(m_testResult.getAttribute("before"), 10);
  }
  
  @Test
  public void fail() {
    throw new RuntimeException();
  }
  
  @Test
  public void skip() {
    throw new SkipException("Skipped");
  }
  
  @BeforeClass
  public void init() {
    m_success = 3;
  }

  @BeforeMethod
  public void before(Method m, ITestResult r) {
    m_testResult = r;
    r.setAttribute("before", 10);
  }

  @AfterMethod
  public void after(Method m, ITestResult r) {
    String name = m.getName();
    Assert.assertEquals(r, m_testResult);
    if (("pass".equals(name) && r.getStatus() == ITestResult.SUCCESS)
        || ("fail".equals(name) && r.getStatus() == ITestResult.FAILURE)
        || ("skip".equals(name) && r.getStatus() == ITestResult.SKIP)) {
          m_success--;
        }
  }
}
