package org.testng.junit;

import java.util.List;
import org.testng.ITestClass;
import org.testng.ITestNGMethod;
import org.testng.collections.Lists;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlTest;

// NO JUnit specific code here to avoid runtime errors
public abstract class JUnitTestClass implements ITestClass {

  private List<ITestNGMethod> m_testMethods = Lists.newArrayList();
  private List<ITestNGMethod> m_beforeClass = Lists.newArrayList();
  private List<ITestNGMethod> m_afterClass = Lists.newArrayList();
  private List<ITestNGMethod> m_beforeTest = Lists.newArrayList();
  private List<ITestNGMethod> m_afterTest = Lists.newArrayList();
  private final Class<?> m_realClass;
  private final Object[] m_instances;
  private final long[] m_instanceHashes;

  public JUnitTestClass(Class<?> test) {
    m_realClass = test;
    m_instances = new Object[] {test};
    m_instanceHashes = new long[] {test.hashCode()};
  }

  List<ITestNGMethod> getTestMethodList() {
    return m_testMethods;
  }

  /** @see org.testng.IClass#addInstance(java.lang.Object) */
  @Override
  public void addInstance(Object instance) {
    throw new IllegalStateException("addInstance is not supported for JUnit");
  }

  /** @see org.testng.IClass#getName() */
  @Override
  public String getName() {
    return m_realClass.getName();
  }

  /** @see org.testng.IClass#getRealClass() */
  @Override
  public Class getRealClass() {
    return m_realClass;
  }

  @Override
  public String getTestName() {
    return null;
  }

  @Override
  public XmlTest getXmlTest() {
    return null;
  }

  @Override
  public XmlClass getXmlClass() {
    return null;
  }

  /** @see org.testng.ITestClass#getInstanceHashCodes() */
  @Override
  public long[] getInstanceHashCodes() {
    return m_instanceHashes;
  }

  /** @see org.testng.ITestClass#getInstances(boolean) */
  @Override
  public Object[] getInstances(boolean reuse) {
    return m_instances;
  }

  /** @see org.testng.ITestClass#getTestMethods() */
  @Override
  public ITestNGMethod[] getTestMethods() {
    return m_testMethods.toArray(new ITestNGMethod[m_testMethods.size()]);
  }

  /** @see org.testng.ITestClass#getBeforeTestMethods() */
  @Override
  public ITestNGMethod[] getBeforeTestMethods() {
    return m_beforeTest.toArray(new ITestNGMethod[m_beforeTest.size()]);
  }

  /** @see org.testng.ITestClass#getAfterTestMethods() */
  @Override
  public ITestNGMethod[] getAfterTestMethods() {
    return m_afterTest.toArray(new ITestNGMethod[m_afterTest.size()]);
  }

  /** @see org.testng.ITestClass#getBeforeClassMethods() */
  @Override
  public ITestNGMethod[] getBeforeClassMethods() {
    return m_beforeClass.toArray(new ITestNGMethod[m_beforeClass.size()]);
  }

  /** @see org.testng.ITestClass#getAfterClassMethods() */
  @Override
  public ITestNGMethod[] getAfterClassMethods() {
    return m_afterClass.toArray(new ITestNGMethod[m_afterClass.size()]);
  }

  // features not supported by JUnit
  private static final ITestNGMethod[] EMPTY_METHODARRAY = new ITestNGMethod[0];

  /** @see org.testng.ITestClass#getBeforeSuiteMethods() */
  @Override
  public ITestNGMethod[] getBeforeSuiteMethods() {
    return EMPTY_METHODARRAY;
  }

  /** @see org.testng.ITestClass#getAfterSuiteMethods() */
  @Override
  public ITestNGMethod[] getAfterSuiteMethods() {
    return EMPTY_METHODARRAY;
  }

  /** @see org.testng.ITestClass#getBeforeGroupsMethods() */
  @Override
  public ITestNGMethod[] getBeforeGroupsMethods() {
    return EMPTY_METHODARRAY;
  }

  /** @see org.testng.ITestClass#getAfterGroupsMethods() */
  @Override
  public ITestNGMethod[] getAfterGroupsMethods() {
    return EMPTY_METHODARRAY;
  }

  // already deprecated stuff, not usable in junit
  /** @see org.testng.ITestClass#getBeforeTestConfigurationMethods() */
  @Override
  public ITestNGMethod[] getBeforeTestConfigurationMethods() {
    return EMPTY_METHODARRAY;
  }

  /** @see org.testng.ITestClass#getAfterTestConfigurationMethods() */
  @Override
  public ITestNGMethod[] getAfterTestConfigurationMethods() {
    return EMPTY_METHODARRAY;
  }
}
