package test.sample;

import static org.testng.Assert.assertEquals;

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

/**
 * This class is used to test invocationCountTest
 *
 * @author cbeust
 */
public class InvocationCountTest {

  //
  // Invocation test
  //
  private static int m_count = 0;

  @AfterSuite(groups = {"invocationOnly"})
  public void afterSuite() {
    m_count = 0;
    m_count2 = 0;
    m_count3 = 0;
  }

  @Test(
      groups = {"invocationOnly"},
      invocationCount = 10)
  public void tenTimesShouldSucceed() {
    m_count++;
  }

  //
  // Invocation + Success percentage test
  // This method will work the first 8 times and fail after that, but overall
  // the test should still pass because successPercentage = 80
  //
  private static int m_count2 = 0;

  @Test(
      groups = {"successPercentageThatSucceedsOnly"},
      invocationCount = 10,
      successPercentage = 80)
  public void successPercentageShouldSucceed() {
    if (m_count2 >= 8) {
      throw new RuntimeException("Called more than eight times : " + m_count2);
    }
    m_count2++;
  }

  //
  // Invocation + Success percentage test
  // This method will work the first 8 times and fail after that.  One of
  // the failures will fall under the percentage tolerance but the next one
  // will not.
  //
  private static int m_count3 = 0;

  @Test(
      groups = {"successPercentageThatFailsOnly"},
      invocationCount = 10,
      successPercentage = 90)
  public void successPercentageShouldFail() {
    if (m_count3 >= 8) {
      throw new RuntimeException("Called more than eight times : " + m_count3);
    }
    m_count3++;
  }

  @AfterClass(groups = {"invocationOnly"})
  public void verify() {
    assertEquals(
        m_count,
        10,
        "Method should have been invoked 10 times but was invoked " + m_count + " times");
  }
}
