Adds some additional api area to our test compilation units.

http://gwt-code-reviews.appspot.com/586801/show
Patch by: tobyr
Review by: spoon


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8226 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
index 05feb9d..92f4f0f 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
@@ -74,7 +74,8 @@
           "java.io.Serializable", "java.lang.Object", "java.lang.String",
           "java.lang.Class", "java.lang.CharSequence", "java.lang.Cloneable",
           "java.lang.Comparable", "java.lang.Enum", "java.lang.Iterable",
-          "java.util.Iterator", "com.google.gwt.core.client.GWT",
+          "java.util.Iterator", "java.lang.AssertionError",
+          "com.google.gwt.core.client.GWT",
           "com.google.gwt.core.client.JavaScriptObject",
           "com.google.gwt.lang.ClassLiteralHolder",
           "com.google.gwt.core.client.RunAsyncCallback",
@@ -459,8 +460,8 @@
     return x;
   }
 
-  public JEnumType createEnum(SourceInfo info, String name) {
-    JEnumType x = new JEnumType(info, name);
+  public JEnumType createEnum(SourceInfo info, String name, boolean isAbstract) {
+    JEnumType x = new JEnumType(info, name, isAbstract);
     x.setSuperClass(getTypeJavaLangEnum());
 
     allTypes.add(x);
diff --git a/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java b/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
index 7bff82a..7a9e6f5 100644
--- a/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
+++ b/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
@@ -49,6 +49,24 @@
       StringBuffer code = new StringBuffer();
       code.append("package java.lang;\n");
       code.append("public class Class<T> {\n");
+      code.append("  public String getName() { return null; }\n");
+      code.append("  public String getSimpleName() { return null; }\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource CLASS_NOT_FOUND_EXCEPTION = new MockJavaResource(
+      "java.lang.ClassNotFoundException") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("public class ClassNotFoundException extends Exception {\n");
+      code.append("  public ClassNotFoundException() {}\n");
+      code.append("  public ClassNotFoundException(String msg) {}\n");
+      code.append("  public ClassNotFoundException(String msg, Throwable t) {}\n");
+      code.append("  public Throwable getCause() { return null; }\n");
+      code.append("  public Throwable getException() { return null; }\n");
       code.append("}\n");
       return code;
     }
@@ -64,6 +82,24 @@
       return code;
     }
   };
+  public static final MockJavaResource DOUBLE = new MockJavaResource(
+      "java.lang.Double") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("public class Double {\n");
+      code.append("  private double value;\n");
+      code.append("  public Double(double value) {\n");
+      code.append("    this.value = value;\n");
+      code.append("  }\n");
+      code.append("  public static boolean isNaN(double d) { return false; }\n");
+      code.append("  public static Double valueOf(double d) { return new Double(d); }\n");
+      code.append("  public double doubleValue() { return value; }\n");
+      code.append("}\n");
+      return code;
+    }
+  };
   public static final MockJavaResource ENUM = new MockJavaResource(
       "java.lang.Enum") {
     @Override
@@ -77,6 +113,17 @@
       return code;
     }
   };
+  public static final MockJavaResource ERROR = new MockJavaResource(
+      "java.lang.Error") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("public class Error extends Throwable {\n");
+      code.append("}\n");
+      return code;
+    }
+  };
   public static final MockJavaResource EXCEPTION = new MockJavaResource(
       "java.lang.Exception") {
     @Override
@@ -88,6 +135,23 @@
       return code;
     }
   };
+  public static final MockJavaResource FLOAT = new MockJavaResource(
+      "java.lang.Float") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("public class Float {\n");
+      code.append("  private float value;\n");
+      code.append("  public Float(float value) {\n");
+      code.append("    this.value = value;\n");
+      code.append("  }\n");
+      code.append("  public static Float valueOf(float f) { return new Float(f); }\n");
+      code.append("  public float floatValue() { return value; }\n");
+      code.append("}\n");
+      return code;
+    }
+  };
   public static final MockJavaResource FOO = new MockJavaResource("test.Foo") {
     @Override
     protected CharSequence getContent() {
@@ -99,6 +163,23 @@
       return code;
     }
   };
+  public static final MockJavaResource INTEGER = new MockJavaResource(
+      "java.lang.Integer") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("public class Integer {\n");
+      code.append("  private int value;\n");
+      code.append("  public Integer(int value) {\n");
+      code.append("    this.value = value;\n");
+      code.append("  }\n");
+      code.append("  public static Integer valueOf(int i) { return new Integer(i); }\n");
+      code.append("  public int intValue() { return value; }\n");
+      code.append("}\n");
+      return code;
+    }
+  };
   public static final MockJavaResource IS_SERIALIZABLE = new MockJavaResource(
       "com.google.gwt.user.client.rpc.IsSerializable") {
     @Override
@@ -132,6 +213,19 @@
       return code;
     }
   };
+  public static final MockJavaResource NO_CLASS_DEF_FOUND_ERROR = new MockJavaResource(
+      "java.lang.NoClassDefFoundError") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("public class NoClassDefFoundError extends Error {\n");
+      code.append("  public NoClassDefFoundError() {}\n");
+      code.append("  public NoClassDefFoundError(String msg) {}\n");
+      code.append("}\n");
+      return code;
+    }
+  };
   public static final MockJavaResource OBJECT = new MockJavaResource(
       "java.lang.Object") {
     @Override
@@ -164,8 +258,33 @@
       code.append("package java.lang;\n");
       code.append("import java.io.Serializable;\n");
       code.append("public final class String implements Serializable {\n");
+      /*
+       * TODO(scottb) Can't add String constructors because they are "magic" in
+       * GWT. (They're re-vectored to static calls). Maybe we should generalize
+       * the compiler magic to work via annotations, and annotate only the real
+       * GWT string.
+       */
+      // code.append("  public String(String s) {}\n");
       code.append("  private static final long serialVersionUID = 0L;\n");
+      code.append("  public char charAt(int index) { return 'a'; }\n");
+      code.append("  public boolean equals(Object obj) { return false; }\n");
+      code.append("  public boolean equalsIgnoreCase(String str) { return false; }\n");
       code.append("  public int length() { return 0; }\n");
+      code.append("  public String replace(char c1, char c2) { return null; }\n");
+      code.append("  public boolean startsWith(String str) { return false; }\n");
+      code.append("  public String toLowerCase() { return null; }\n");
+      code.append("  public static String valueOf(boolean b) { return null; }\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource STRING_BUILDER = new MockJavaResource(
+      "java.lang.StringBuilder") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("public final class StringBuilder {\n");
       code.append("}\n");
       return code;
     }
@@ -189,6 +308,8 @@
       StringBuffer code = new StringBuffer();
       code.append("package java.lang;\n");
       code.append("public class Throwable {\n");
+      code.append("  public String getMessage() { return \"\"; }\n");
+      code.append("  public Throwable getCause() { return null; }\n");
       code.append("}\n");
       return code;
     }
@@ -196,8 +317,9 @@
 
   public static MockJavaResource[] getStandardResources() {
     return new MockJavaResource[] {
-        ANNOTATION, CLASS, COLLECTION, ENUM, EXCEPTION, IS_SERIALIZABLE,
-        JAVASCRIPTOBJECT, MAP, OBJECT, SERIALIZABLE, STRING, SUPPRESS_WARNINGS,
-        THROWABLE};
+        ANNOTATION, CLASS, CLASS_NOT_FOUND_EXCEPTION, COLLECTION, DOUBLE, ENUM,
+        EXCEPTION, ERROR, FLOAT, INTEGER, IS_SERIALIZABLE, JAVASCRIPTOBJECT,
+        MAP, NO_CLASS_DEF_FOUND_ERROR, OBJECT, SERIALIZABLE, STRING,
+        STRING_BUILDER, SUPPRESS_WARNINGS, THROWABLE};
   }
 }
diff --git a/dev/core/test/com/google/gwt/dev/jjs/JavaAstConstructor.java b/dev/core/test/com/google/gwt/dev/jjs/JavaAstConstructor.java
index 9fbd3bd..a3a360e 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/JavaAstConstructor.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/JavaAstConstructor.java
@@ -57,6 +57,7 @@
       StringBuffer code = new StringBuffer();
       code.append("package com.google.gwt.lang;\n");
       code.append("public final class Array {\n");
+      code.append("  public int length;\n");
       code.append("}\n");
       return code;
     }
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java
index ffdc7ca..60fadff 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java
@@ -3,7 +3,7 @@
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.dev.jjs.ast.JMethodBody;
 import com.google.gwt.dev.jjs.ast.JProgram;
-import com.google.gwt.dev.jjs.impl.OptimizerTestBase;
+import com.google.gwt.dev.jjs.impl.JJSTestBase;
 import com.google.gwt.dev.jjs.impl.gflow.cfg.CfgBuilder;
 import com.google.gwt.dev.jjs.impl.gflow.cfg.CfgEdge;
 import com.google.gwt.dev.jjs.impl.gflow.cfg.Cfg;
@@ -15,7 +15,7 @@
 /**
  * Test class for CfgBuilfer.
  */
-public class CfgBuilderTest extends OptimizerTestBase {
+public class CfgBuilderTest extends JJSTestBase {
   @Override
   protected void setUp() throws Exception {
     super.setUp();
@@ -768,7 +768,7 @@
             "READ(b) -> [*]",
             "COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
             "STMT -> [*]",
-            "OPTTHROW(throwCheckedException()) -> [NOTHROW=*, 2, RE=4]",
+            "OPTTHROW(throwCheckedException()) -> [NOTHROW=*, 2, RE=4, E=4]",
             "CALL(throwCheckedException) -> [*]",
             "1: STMT -> [*]",
             "READWRITE(k, null) -> [3]",
@@ -799,7 +799,7 @@
             "READ(b) -> [*]",
             "COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
             "STMT -> [*]",
-            "OPTTHROW(throwCheckedException()) -> [NOTHROW=*, 2, RE=3]",
+            "OPTTHROW(throwCheckedException()) -> [NOTHROW=*, 2, RE=3, E=5]",
             "CALL(throwCheckedException) -> [*]",
             "1: STMT -> [*]",
             "READWRITE(k, null) -> [4]",
@@ -811,7 +811,7 @@
             "READWRITE(l, null) -> [*]",
             "4: STMT -> [*]",
             "READWRITE(j, null) -> [*]",
-            "END"
+            "5: END"
         );
   }
 
@@ -833,7 +833,7 @@
             "READ(b) -> [*]",
             "COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
             "STMT -> [*]",
-            "OPTTHROW(throwUncheckedException()) -> [NOTHROW=*, RE=2, RE=3]",
+            "OPTTHROW(throwUncheckedException()) -> [NOTHROW=*, RE=2, RE=3, E=5]",
             "CALL(throwUncheckedException) -> [*]",
             "1: STMT -> [*]",
             "READWRITE(k, null) -> [4]",
@@ -845,7 +845,7 @@
             "READWRITE(l, null) -> [*]",
             "4: STMT -> [*]",
             "READWRITE(j, null) -> [*]",
-            "END"
+            "5: END"
         );
   }
 
@@ -1017,7 +1017,7 @@
         ).is(
         "BLOCK -> [*]",
         "STMT -> [*]",
-        "OPTTHROW(createFoo()) -> [NOTHROW=*, RE=1]",
+        "OPTTHROW(createFoo()) -> [NOTHROW=*, RE=1, E=1]",
         "CALL(createFoo) -> [*]",
         "WRITE(foo, EntryPoint.createFoo()) -> [*]",
         "STMT -> [*]",
@@ -1034,7 +1034,7 @@
         ).is(
         "BLOCK -> [*]",
         "STMT -> [*]",
-        "OPTTHROW(createFoo()) -> [NOTHROW=*, RE=1]",
+        "OPTTHROW(createFoo()) -> [NOTHROW=*, RE=1, E=1]",
         "CALL(createFoo) -> [*]",
         "WRITE(foo, EntryPoint.createFoo()) -> [*]",
         "STMT -> [*]",
@@ -1309,6 +1309,7 @@
         "9: END"
     );
   }
+  
   public void testSwitchWithLoopAndBreak() throws Exception {
     assertCfg("void",
         "switch(i) {",
@@ -1345,7 +1346,89 @@
             "3: END"
     );
   }
+  
+  public void testBreakStatement1() throws Exception {
+    assertCfg("void",
+        "lbl: {",
+        "  break lbl;",
+        "}"
+        ).is(
+            "BLOCK -> [*]",
+            "BLOCK -> [*]",
+            "STMT -> [*]",
+            "GOTO -> [*]",
+            "END");
+  }
 
+  public void testBreakStatement2() throws Exception {
+    assertCfg("void",
+        "lbl: break lbl;"
+        ).is(
+            "BLOCK -> [*]",
+            "STMT -> [*]",
+            "GOTO -> [*]",
+            "END");
+  }
+
+  public void testBreakStatement3() throws Exception {
+    assertCfg("void",
+        "lbl: {",
+        "  i = 1;",
+        "  if (b) break lbl;",
+        "  i = 2;",
+        "}"
+        ).is(
+            "BLOCK -> [*]",
+            "BLOCK -> [*]",
+            "STMT -> [*]",
+            "WRITE(i, 1) -> [*]",
+            "STMT -> [*]",
+            "READ(b) -> [*]",
+            "COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
+            "STMT -> [*]",
+            "GOTO -> [2]",
+            "1: STMT -> [*]",
+            "WRITE(i, 2) -> [*]",
+            "2: END");
+  }
+
+  public void testBreakStatement4() throws Exception {
+    assertCfg("void",
+        "lbl1: {",
+        "  i = 1;",
+        "  lbl2: {",
+        "    j = 1;",
+        "    if (b) break lbl1;",
+        "    j = 2;",
+        "    if (b) break lbl2;",
+        "  }",
+        "  i = 2;",
+        "}"
+        ).is(
+            "BLOCK -> [*]",
+            "BLOCK -> [*]",
+            "STMT -> [*]",
+            "WRITE(i, 1) -> [*]",
+            "BLOCK -> [*]",
+            "STMT -> [*]",
+            "WRITE(j, 1) -> [*]",
+            "STMT -> [*]",
+            "READ(b) -> [*]",
+            "COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
+            "STMT -> [*]",
+            "GOTO -> [3]",
+            "1: STMT -> [*]",
+            "WRITE(j, 2) -> [*]",
+            "STMT -> [*]",
+            "READ(b) -> [*]",
+            "COND (EntryPoint.b) -> [THEN=*, ELSE=2]",
+            "STMT -> [*]",
+            "GOTO -> [*]",
+            "2: STMT -> [*]",
+            "WRITE(i, 2) -> [*]",
+            "3: END");
+  }
+  
   private CfgBuilderResult assertCfg(String returnType, String ...codeSnippet)
       throws UnableToCompleteException {
     JProgram program = compileSnippet(returnType, 
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTest.java
index 8a14d53..d3c36e0 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTest.java
@@ -56,7 +56,7 @@
     analyze("void", "int i = foo();").into(
         "BLOCK -> [* T]",
         "STMT -> [* T]",
-        "OPTTHROW(foo()) -> [NOTHROW=* T, RE=1 T]",
+        "OPTTHROW(foo()) -> [NOTHROW=* T, RE=1 T, E=1 T]",
         "CALL(foo) -> [* T]",
         "WRITE(i, EntryPoint.foo()) -> [* T]",
         "1: END");
@@ -129,7 +129,7 @@
         "STMT -> [* T]",
         "WRITE(j, 0) -> [* {j = 0}]",
         "STMT -> [* {j = 0}]",
-        "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}]",
+        "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}, E=2 {j = 0}]",
         "CALL(foo) -> [* {j = 0}]",
         "COND (EntryPoint.foo() == 1) -> [THEN=* {j = 0}, ELSE=1 {j = 0}]",
         "STMT -> [* {j = 0}]",
@@ -144,11 +144,11 @@
         "STMT -> [* T]",
         "WRITE(j, 0) -> [* {j = 0}]",
         "STMT -> [* {j = 0}]",
-        "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}]",
+        "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}, E=2 {j = 0}]",
         "CALL(foo) -> [* {j = 0}]",
         "COND (EntryPoint.foo() == 1) -> [THEN=* {j = 0}, ELSE=1 {j = 0}]",
         "STMT -> [* {j = 0}]",
-        "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}]",
+        "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}, E=2 {j = 0}]",
         "CALL(foo) -> [* {j = 0}]",
         "WRITE(j, EntryPoint.foo()) -> [* T]",
         "1: STMT -> [* T]",