/**
* Java. Level 3. Lesson 7. Homework
*
* @author Sergey Iryupin
* @version Jul 30, 2018
* @link https://github.com/biblelamp
*/
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class HW7Lesson {
public static void main(String[] args) {
TestingClass.start(TestingClass.class);
}
}
class TestingClass {
public static void start(Class cls) {
performTests(cls);
}
private static void performTests(Class cls) throws RuntimeException {
TestingClass testingObj = null;
try {
testingObj = (TestingClass)cls.newInstance();
} catch (Exception e) {
e.printStackTrace();
return;
}
Method beforeMethod = null;
Method afterMethod = null;
Method[] methods = cls.getMethods();
List testingMethods = new ArrayList();
for (Method method : methods)
if (method.getAnnotation(BeforeSuite.class) != null) {
if (beforeMethod != null)
throw new RuntimeException("The method with the @BeforeSuite annotation should be one");
beforeMethod = method;
} else if (method.getAnnotation(AfterSuite.class) != null) {
if (afterMethod != null)
throw new RuntimeException("The method with the @AfterSuite annotation should be one");
afterMethod = method;
} else if (method.getAnnotation(Test.class) != null){
Test annotationTst = method.getAnnotation(Test.class);
testingMethods.add(new MethodWithPriority(method, annotationTst.value()));
}
testingMethods.sort(
Comparator.comparing(MethodWithPriority::getPriority));
try {
if (beforeMethod != null)
beforeMethod.invoke(testingObj);
for (MethodWithPriority methodWP : testingMethods)
methodWP.method.invoke(testingObj);
if (afterMethod != null)
afterMethod.invoke(testingObj);
} catch (Exception e){
e.printStackTrace();
}
}
@Test(value = 5)
public void Test5() {
System.out.println("Performed Test 5");
}
@Test(value = 3)
public void Test2(){
System.out.println("Performed Test 2");
}
@Test(value = 1)
public void Test1(){
System.out.println("Performed Test 1");
}
@BeforeSuite
public void BeforeAll(){
System.out.println("This method is performed before all");
}
@AfterSuite
public void AfterAll() {
System.out.println("This method is performed after all");
}
}
class MethodWithPriority {
public Method method;
public Integer priority;
public MethodWithPriority(Method method, int priority) {
this.method = method;
this.priority = priority;
}
public Integer getPriority() {
return priority;
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface BeforeSuite {}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface AfterSuite {}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Test {
int value();
}