1c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beustpackage org.testng.internal;
2c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust
3fa27df3c9ee8e5a47d9a12b5a95cb4fbb16f6273Cédric Beustimport org.testng.IMethodInstance;
4c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beustimport org.testng.ITestNGMethod;
554a1dff85605912356caf3c3bcc4f73e80fd1311Cédric Beustimport org.testng.collections.Objects;
6cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beustimport org.testng.xml.XmlClass;
7cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beustimport org.testng.xml.XmlInclude;
8cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beustimport org.testng.xml.XmlTest;
9c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust
10fa27df3c9ee8e5a47d9a12b5a95cb4fbb16f6273Cédric Beustimport java.util.Comparator;
11cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beustimport java.util.List;
12fa27df3c9ee8e5a47d9a12b5a95cb4fbb16f6273Cédric Beust
13fa27df3c9ee8e5a47d9a12b5a95cb4fbb16f6273Cédric Beustpublic class MethodInstance implements IMethodInstance {
14c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust  private ITestNGMethod m_method;
15c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust
16eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust  public MethodInstance(ITestNGMethod method) {
17c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust    m_method = method;
18c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust  }
19c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust
200f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin  @Override
21c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust  public ITestNGMethod getMethod() {
22c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust    return m_method;
23c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust  }
24c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust
250f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin  @Override
26c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust  public Object[] getInstances() {
27eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust    return new Object[] { getInstance() };
28eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust  }
29eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust
30eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust  @Override
31eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust  public Object getInstance() {
32eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust    return m_method.getInstance();
33c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust  }
340f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
350f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin  @Override
3622cd01e5318bf341707b95b17f4ffc3790e3f215Cédric Beust  public String toString() {
3754a1dff85605912356caf3c3bcc4f73e80fd1311Cédric Beust    return Objects.toStringHelper(getClass())
3854a1dff85605912356caf3c3bcc4f73e80fd1311Cédric Beust        .add("method", m_method)
3954a1dff85605912356caf3c3bcc4f73e80fd1311Cédric Beust        .add("instance", getInstance())
4054a1dff85605912356caf3c3bcc4f73e80fd1311Cédric Beust        .toString();
4122cd01e5318bf341707b95b17f4ffc3790e3f215Cédric Beust  }
4268be32860bc8a1564b550c286b1c1316950c01eathe.mindstorm
43682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust
440f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin  public static final Comparator<IMethodInstance> SORT_BY_INDEX
45fa27df3c9ee8e5a47d9a12b5a95cb4fbb16f6273Cédric Beust    = new Comparator<IMethodInstance>() {
460f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin    @Override
47fa27df3c9ee8e5a47d9a12b5a95cb4fbb16f6273Cédric Beust    public int compare(IMethodInstance o1, IMethodInstance o2) {
48cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      // If the two methods are in different <test>
49cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      XmlTest test1 = o1.getMethod().getTestClass().getXmlTest();
50cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      XmlTest test2 = o2.getMethod().getTestClass().getXmlTest();
51cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust
52cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      // If the two methods are not in the same <test>, we can't compare them
53cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      if (! test1.getName().equals(test2.getName())) {
54cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust        return 0;
55cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      }
56cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust
57cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      int result = 0;
58cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust
59cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      // If the two methods are in the same <class>, compare them by their method
60cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      // index, otherwise compare them with their class index.
61cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      XmlClass class1 = o1.getMethod().getTestClass().getXmlClass();
62cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      XmlClass class2 = o2.getMethod().getTestClass().getXmlClass();
63cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust
64ff0127f4352c413f2036f0072e18ecfd0cc34b81Cédric Beust      // This can happen if these classes came from a @Factory, in which case, they
65ff0127f4352c413f2036f0072e18ecfd0cc34b81Cédric Beust      // don't have an associated XmlClass
66e4607e48367c274c373f3a022add3c7ca0b3e04email@andreaskluth.net      if (class1 == null || class2 == null) {
67e4607e48367c274c373f3a022add3c7ca0b3e04email@andreaskluth.net        if (class1 != null) return -1;
68e4607e48367c274c373f3a022add3c7ca0b3e04email@andreaskluth.net        if (class2 != null) return 1;
69e4607e48367c274c373f3a022add3c7ca0b3e04email@andreaskluth.net        return 0;
70e4607e48367c274c373f3a022add3c7ca0b3e04email@andreaskluth.net      }
71ff0127f4352c413f2036f0072e18ecfd0cc34b81Cédric Beust
72cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      if (! class1.getName().equals(class2.getName())) {
73cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust        int index1 = class1.getIndex();
74cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust        int index2 = class2.getIndex();
75cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust        result = index1 - index2;
76cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      }
77cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      else {
78cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust        XmlInclude include1 =
79cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust            findXmlInclude(class1.getIncludedMethods(), o1.getMethod().getMethodName());
80cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust        XmlInclude include2 =
81cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust          findXmlInclude(class2.getIncludedMethods(), o2.getMethod().getMethodName());
82cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust        if (include1 != null && include2 != null) {
83cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust          result = include1.getIndex() - include2.getIndex();
84cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust        }
85cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      }
8668be32860bc8a1564b550c286b1c1316950c01eathe.mindstorm
8768be32860bc8a1564b550c286b1c1316950c01eathe.mindstorm      return result;
8868be32860bc8a1564b550c286b1c1316950c01eathe.mindstorm    }
89cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust
90cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust    private XmlInclude findXmlInclude(List<XmlInclude> includedMethods, String methodName) {
91cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      for (XmlInclude xi : includedMethods) {
920f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin        if (xi.getName().equals(methodName)) {
930f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin          return xi;
940f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin        }
95cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      }
96cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust      return null;
97cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust    }
9868be32860bc8a1564b550c286b1c1316950c01eathe.mindstorm  };
9968be32860bc8a1564b550c286b1c1316950c01eathe.mindstorm
1000f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin//  public static final Comparator<IMethodInstance> SORT_BY_CLASS
101682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust//    = new Comparator<IMethodInstance>() {
102682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust//    public int compare(IMethodInstance o1, IMethodInstance o2) {
103682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust//      int result= o1.getMethod().getTestClass().getName()
104682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust//        .compareTo(o2.getMethod().getTestClass().getName());
105682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust//      return result;
106682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust//    }
107682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust//  };
108682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust
109c215923051def2e7024aee03ca8508faeaf5adc7Cédric Beust}
110