All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.testng.ClassMethodMap Maven / Gradle / Ivy

There is a newer version: 7.10.1
Show newest version
package org.testng;

import org.testng.collections.Lists;
import org.testng.collections.Maps;
import org.testng.internal.XmlMethodSelector;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * This class maintains a map of >.
 * It is used by TestWorkers to determine if the method they just ran
 * is the last of its class, in which case it's time to invoke all the
 * afterClass methods.
 *
 * @author Alex Popescu
 */
public class ClassMethodMap {
  private Map> m_classMap = Maps.newHashMap();
  // These two variables are used throughout the workers to keep track
  // of what beforeClass/afterClass methods have been invoked
  private Map> m_beforeClassMethods = Maps.newHashMap();
  private Map> m_afterClassMethods = Maps.newHashMap();

  public ClassMethodMap(List methods, XmlMethodSelector xmlMethodSelector) {
    for (ITestNGMethod m : methods) {
      // Only add to the class map methods that are included in the
      // method selector. We can pass a null context here since the selector
      // should already have been initialized
      if (xmlMethodSelector != null){
    	  if (! xmlMethodSelector.includeMethod(null, m, true)) continue;
      }

      Object instance = m.getInstance();
      List l = m_classMap.get(instance);
      if (l == null) {
        l = Lists.newArrayList();
        m_classMap.put(instance, l);
      }
      l.add(m);
    }
  }

  /**
   * Remove the method from this map and returns true if it is the last
   * of its class.
   */
  public synchronized boolean removeAndCheckIfLast(ITestNGMethod m, Object instance) {
    List l = m_classMap.get(instance);
    if (l != null) {
      l.remove(m);
      // It's the last method of this class if all the methods remaining in the list belong to a
      // different class
      for (ITestNGMethod tm : l) {
        if (tm.getEnabled() && tm.getTestClass().equals(m.getTestClass())) return false;
      }
      return true;
    } else {
      throw new AssertionError("l should not be null");
    }
  }

  private Class getMethodClass(ITestNGMethod m) {
    return m.getTestClass().getRealClass();
  }

  public Map> getInvokedBeforeClassMethods() {
    return m_beforeClassMethods;
  }

  public Map> getInvokedAfterClassMethods() {
    return m_afterClassMethods;
  }

  public void clear() {
    for(Set instances: m_beforeClassMethods.values()) {
      instances.clear();
      instances= null;
    }
    for(Set instances: m_afterClassMethods.values()) {
      instances.clear();
      instances= null;
    }
    m_beforeClassMethods.clear();
    m_afterClassMethods.clear();
  }
}