* We should have our own regression
[cacao.git] / tests / extest.java
index e871de0e16982a4ce899aa0c2a652742ce9447f2..d8a20874ec1594611f91bab7fa86f671cdfc7322 100644 (file)
 public class extest {
+    final static int INDEX1 = 0xcafebabe;
+    final static int INDEX2 = 0xbabecafe;
+    final static int INDEX3 = 0xdeadbeef;
+
+    static boolean printStackTrace;
+    
     public static void main(String[] argv) {
-       try {
-            System.out.print("THROWS: ");
+       printStackTrace = false;
+       if (argv.length > 0) 
+            if (argv[0].equals("stacktrace"))
+                printStackTrace = true;
+
+        boolean catched = false;
+
+       pln("---------- normal exceptions --------------------");
+
+       try {
+            p("throw new Exception():");
+           throw new Exception();
+       } catch (Exception e) {
+            catched = true;
+           ok();
+           pstacktrace(e);
+
+       } finally {
+            /* check if catch block was executed */
+            if (!catched) {
+                failed();
+            }
+        }
+
+       try {
+            p("throw new Exception() (from subroutines):");
            sub();
-            System.out.println("failed.");
+            failed();
        } catch (Exception e) {
-           System.out.println("passed.");
+           ok();
+           pstacktrace(e);
        }
 
-       try {
-            System.out.print("NATIVE: ");
-            System.arraycopy(null, 1, null, 1, 1);
-            System.out.println("failed.");
-       } catch (Exception e) {
-           System.out.println("passed");
+        try {
+            p("NullPointerException:");
+            int[] ia = null;
+            int i = ia.length;
+            failed();
+        } catch (NullPointerException e) {
+           ok();
+           pstacktrace(e);
        }
 
+       pln();
+
+
+       pln("---------- test soft inline exceptions ----------");
+       pln("/* thrown twice to check the inline jump code */");
+
         try {
-            System.out.print("NULL: ");
+            p("ArithmeticException (only w/ -softnull):");
+            int i = 1, j = 0, k = i / j;
+            failed();
+        } catch (ArithmeticException e) {
+           String msg = e.getMessage();
+
+           if (msg == null || !msg.equals("/ by zero")) {
+               pln("FAILED: wrong message: " + msg + ", should be: / by zero");
+               pstacktrace(e);
+           } else {
+                ok();
+                pstacktrace(e);
+            }
+       }
+
+        try {
+            p("ArithmeticException (only w/ -softnull):");
+            long i = 1, j = 0, k = i / j;
+            failed();
+        } catch (ArithmeticException e) {
+           String msg = e.getMessage();
+
+           if (msg == null || !msg.equals("/ by zero")) {
+               pln("FAILED: wrong message: " + msg + ", should be: / by zero");
+
+           } else {
+                ok();
+                pstacktrace(e);
+            }
+       }
+
+
+        try {
+            p("ArrayIndexOutOfBoundsException:");
+            int[] ia = new int[1];
+            ia[INDEX1] = 1;
+            failed();
+        } catch (ArrayIndexOutOfBoundsException e) {
+           String msg = e.getMessage();
+
+           if (msg == null || !msg.equals(String.valueOf(INDEX1))) {
+               pln("FAILED: wrong index: " + msg + ", should be: " + INDEX1);
+               pstacktrace(e);
+           } else {
+               ok();
+               pstacktrace(e);
+           }
+       }
+
+        try {
+            p("ArrayIndexOutOfBoundsException:");
+            int[] ia = new int[1];
+            ia[INDEX2] = 1;
+            failed();
+        } catch (ArrayIndexOutOfBoundsException e) {
+           String msg = e.getMessage();
+
+           if (msg == null || !msg.equals(String.valueOf(INDEX2))) {
+               pln("FAILED: wrong index: " + msg + ", should be: " + INDEX2);
+               pstacktrace(e);
+           } else {
+               ok();
+               pstacktrace(e);
+
+           }
+       }
+
+
+        try {
+            p("ArrayStoreException:");
+           Integer[] ia = new Integer[1];
+            Object[] oa = (Object[]) ia;
+           oa[0] = new Object();
+            failed();
+        } catch (ArrayStoreException e) {
+           ok();
+           pstacktrace(e);
+       }
+
+        try {
+            p("ArrayStoreException:");
+           Integer[] ia = new Integer[1];
+            Object[] oa = (Object[]) ia;
+           oa[0] = new Object();
+            failed();
+        } catch (ArrayStoreException e) {
+           ok();
+           pstacktrace(e);
+       }
+
+
+        try {
+            p("ClassCastException:");
+            Object o = new Object();
+            Integer i = (Integer) o;
+            failed();
+        } catch (ClassCastException e) {
+           ok();
+           pstacktrace(e);
+       }
+
+        try {
+            p("ClassCastException:");
+            Object o = new Object();
+            Integer i = null;
+            i = (Integer) o;
+            failed();
+        } catch (ClassCastException e) {
+           ok();
+           pstacktrace(e);
+       }
+
+
+        try {
+            p("NegativeArraySizeException:");
+            int[] ia = new int[-1];
+            failed();
+        } catch (NegativeArraySizeException e) {
+           ok();
+           pstacktrace(e);
+       }
+
+        try {
+            p("NegativeArraySizeException:");
+            int[] ia = new int[-1];
+            failed();
+        } catch (NegativeArraySizeException e) {
+           ok();
+           pstacktrace(e);
+       }
+
+        
+        try {
+            p("NullPointerException (only w/ -softnull):");
+            int[] ia = null;
+            int i = ia.length;
+            failed();
+        } catch (NullPointerException e) {
+           ok();
+           pstacktrace(e);
+       }
+
+        try {
+            p("NullPointerException (only w/ -softnull):");
             int[] ia = null;
             int i = ia.length;
-            System.out.println("failed.");
+            failed();
         } catch (NullPointerException e) {
-           System.out.println("passed.");
+           ok();
+           pstacktrace(e);
        }
 
         try {
-            System.out.print("ARITHMETIC: ");
-            int i = 1;
-            int j = 0;
-            int k = i / j;
-            System.out.println("failed.");
+            p("OutOfMemoryError:");
+           /* 100 MB should be enough */
+           byte[] ba = new byte[100 * 1024 * 1024];
+            failed();
+        } catch (OutOfMemoryError e) {
+           ok();
+           pstacktrace(e);
+       }
+
+        try {
+            p("OutOfMemoryError:");
+           /* 100 MB should be enough */
+           byte[] ba = new byte[100 * 1024 * 1024];
+            failed();
+        } catch (OutOfMemoryError e) {
+           ok();
+           pstacktrace(e);
+       }
+        
+       pln();
+
+
+       pln("---------- exceptions in leaf functions ---------");
+
+        try {
+            p("ArithmeticException:");
+            aesub(1, 0);
+            failed();
         } catch (ArithmeticException e) {
-           System.out.println("passed.");
+            ok();
+            pstacktrace(e);
+        }
+
+        try {
+            p("ArrayIndexOutOfBoundsException:");
+            aioobesub(new int[1]);
+            failed();
+        } catch (ArrayIndexOutOfBoundsException e) {
+           String msg = e.getMessage();
+
+           if (msg == null || !msg.equals(String.valueOf(INDEX3))) {
+               pln("FAILED: wrong index: " + msg + ", should be: " + INDEX3);
+               pstacktrace(e);
+           } else {
+               ok();
+               pstacktrace(e);
+
+           }
+        }
+
+        try {
+            p("ClassCastException:");
+            ccesub(new Object(), new Integer(0));
+            failed();
+        } catch (ClassCastException e) {
+            ok();
+            pstacktrace(e);
+        }
+
+        try {
+            p("NullPointerException:");
+            npesub(null);
+            failed();
+        } catch (NullPointerException e) {
+            ok();
+            pstacktrace(e);
+        }
+
+       pln();
+
+
+       pln("---------- some asmpart exceptions --------------");
+
+        try {
+            p("NullPointerException in <clinit> (PUTSTATIC):");
+            extest_clinit_1.i = 1;
+            failed();
+        } catch (ExceptionInInitializerError e) {
+            if (e.getCause().getClass() != NullPointerException.class) {
+                failed();
+            } else {
+                ok();
+               pstacktrace(e);
+            }
+        }
+
+        try {
+            p("NullPointerException in <clinit> (GETSTATIC):");
+            int i = extest_clinit_2.i;
+            failed();
+        } catch (ExceptionInInitializerError e) {
+            if (e.getCause().getClass() != NullPointerException.class) {
+                failed();
+            } else {
+                ok();
+               pstacktrace(e);
+            }
+        }
+
+       pln();
+
+
+       pln("---------- exception related things -------------");
+
+        try {
+            p("load/link an exception class in asmpart:");
+            throw new Exception();
+        } catch (UnknownError e) {
+            /* this exception class MUST NOT be loaded before!!!
+               otherwise this test in useless */
+        } catch (Exception e) {
+           ok();
+           pstacktrace(e);
+       }
+
+        pln();
+
+
+       pln("---------- native stub exceptions ---------------");
+
+       try {
+            p("NullPointerException (native):");
+            System.arraycopy(null, 1, null, 1, 1);
+            failed();
+       } catch (Exception e) {
+           ok();
+            pstacktrace(e);
        }
 
-        System.out.println("NULL (without catch): ");
+        try {
+            p("NullPointerException in <clinit>:");
+            extest_clinit_3.sub();
+            failed();
+        } catch (ExceptionInInitializerError e) {
+            ok();
+            pstacktrace(e);
+        } catch (UnsatisfiedLinkError e) {
+            /* catch this one for staticvm and say it's ok */
+            ok();
+            pstacktrace(e);
+        }
+
+        /*
+        try {
+            p("UnsatisfiedLinkError:");
+            nsub();
+            failed();
+        } catch (UnsatisfiedLinkError e) {
+            ok();
+            pstacktrace(e);
+        }
+        */
+
+        pln();
+
+
+       pln("---------- no OK beyond this point --------------");
+
+        pln("NullPointerException (without catch):");
         String s = null;
         int i = s.length();
-        System.out.println("failed.");
+        failed();
     }
 
-    public synchronized static void sub() throws Exception {
-        int a, b, c, d;
+    synchronized static void sub() throws Exception {
        sub2();
     }
 
-    public static void sub2() throws Exception {
+    static void sub2() throws Exception {
        sub3();
     }
 
-    public synchronized static void sub3() throws Exception {
+    synchronized static void sub3() throws Exception {
        sub4();
     }
 
-    public static void sub4() throws Exception {
+    static void sub4() throws Exception {
        throw new Exception();
     }
+
+    static void aesub(int a, int b) {
+        int c = a / b;
+    }
+
+    static void aioobesub(int[] ia) {
+        ia[INDEX3] = 0;
+    }
+
+    static void ccesub(Object o, Integer i) {
+        i = (Integer) o;
+    }
+
+    static void npesub(int[] ia) {
+        int a = ia.length;
+    }
+
+    static native void nsub();
+
+    static void p(String s) {
+       System.out.print(s);
+        for (int i = s.length(); i < 46; i++) {
+            System.out.print(" ");
+        }
+    }
+
+    static void pln() {
+       System.out.println();
+    }
+
+    static void pln(String s) {
+       System.out.println(s);
+    }
+
+    static void ok() {
+        pln("OK");
+    }
+
+    static void failed() {
+        pln("FAILED");
+    }
+
+    static void pstacktrace(Throwable e) {
+       if (!printStackTrace)
+            return;
+       e.printStackTrace();
+       System.out.println();
+    }
+}
+
+public class extest_clinit_1 {
+    static {
+        String s = null;
+        s.length();
+    }
+
+    public static int i;
+}
+
+public class extest_clinit_2 {
+    static {
+        String s = null;
+        s.length();
+    }
+
+    public static int i;
+}
+
+public class extest_clinit_3 {
+    static {
+        String s = null;
+        s.length();
+    }
+
+    public static native void sub();
 }