package com.le;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Test {
}
class Sample{
@Test
public static void m1(){}
public static void m2(){}
@Test
public static void m3(){
throw new RuntimeException("Boom");
}
public static void m4(){}
@Test
public void m5(){}
public static void m6(){}
@Test
public static void m7(){
throw new RuntimeException("Crash");
}
public static void m8(){};
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface ExceptionTest{
Class extends Exception> value();
}
class Sample2{
@ExceptionTest(ArithmeticException.class)
public static void m1(){
int i=0;
i=i/i;
}
@ExceptionTest(ArithmeticException.class)
public static void m2(){
int[] a=new int[0];
int i=a[1];
}
@ExceptionTest(ArithmeticException.class)
public static void m3(){}
}
public class RunTests {
public void main1() throws Exception {
int tests=0;
int passed=0;
Class testClass=Class.forName("com.le.Sample");
for(Method m:testClass.getDeclaredMethods()){
if(m.isAnnotationPresent(Test.class)){
tests++;
try {
m.invoke(null);
passed++;
} catch (InvocationTargetException ite) {
Throwable exc=ite.getCause();
System.out.println(m+" failed : "+exc);
} catch(Exception e){
System.out.println("INVALID @Test:"+m);
}
}
}
System.out.printf("Passed: %d, Failed: %d%n",passed,tests-passed);
}
public static void main(String[] args) throws Exception {
int tests=0;
int passed=0;
Class testClass=Class.forName("com.le.Sample2");
for(Method m:testClass.getDeclaredMethods()){
if(m.isAnnotationPresent(ExceptionTest.class)){
tests++;
try {
m.invoke(null);
System.out.printf("Test %s failed : no exception%",m);
} catch (InvocationTargetException ite) {
Throwable exc=ite.getCause();
Class extends Exception> excType=m.getAnnotation(ExceptionTest.class).value();
if(excType.isInstance(exc)){
passed++;
}else{
System.out.printf("Test %s failed: expected %s,got %s%n",m,excType.getName(),exc);
}
} catch(Exception e){
System.out.println("INVALID @ExceptionTest:"+m);
}
}
}
System.out.printf("Passed: %d, Failed: %d%n",passed,tests-passed);
}
}