package test.interleavedorder;

import java.util.ArrayList;
import java.util.List;

import org.testng.Assert;
import org.testng.TestListenerAdapter;
import org.testng.TestNG;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import test.BaseTest;
import testhelper.OutputDirectoryPatch;


public class InterleavedInvocationTest extends BaseTest {
  public static List<String> LOG = new ArrayList<String>();

  @BeforeTest
  public void beforeTest() {
    LOG = new ArrayList<String>();
  }

  private void verifyInvocation(int number, List<String> log, int index) {
    Assert.assertEquals(log.get(index), "beforeTestChild" + number + "Class");
    Assert.assertTrue(("test1".equals(log.get(index + 1)) && "test2".equals(LOG.get(index + 2)))
        || ("test2".equals(LOG.get(index + 1)) && "test1".equals(LOG.get(index + 2))),
        "test methods were not invoked correctly");
    Assert.assertEquals(log.get(index + 3), "afterTestChild" + number + "Class");
  }

  @Test
  public void invocationOrder() {
    TestListenerAdapter tla = new TestListenerAdapter();
    TestNG testng = new TestNG();
    testng.setOutputDirectory(OutputDirectoryPatch.getOutputDirectory());
    testng.setTestClasses(new Class[] { TestChild1.class, TestChild2.class });
    testng.addListener(tla);
    testng.setVerbose(0);
    testng.run();
    
    Assert.assertEquals(LOG.size(), 8, LOG.toString());
    int number1 = "beforeTestChild1Class".equals(LOG.get(0)) ? 1 : 2;
    int number2 = number1 == 1 ? 2 : 1;
    verifyInvocation(number1, LOG, 0);
    verifyInvocation(number2, LOG, 4);
  }

  public static void ppp(String s) {
    System.out.println("[InterleavedTest] " + s);
  }
}
