[ApiModel] Add tests for missing super type, trycatch and hashCode

Bug: 207832084
Bug: 207812068
Bug: 207452750
Change-Id: Iea80fea273a66ce86e44a9525361b284e28aa6fa
diff --git a/src/test/java/com/android/tools/r8/softverification/FoundClass.java b/src/test/java/com/android/tools/r8/softverification/FoundClass.java
index cc25389..2165828 100644
--- a/src/test/java/com/android/tools/r8/softverification/FoundClass.java
+++ b/src/test/java/com/android/tools/r8/softverification/FoundClass.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.softverification;
 
-public class FoundClass {
+public class FoundClass extends RuntimeException {
 
   public static int staticField = 42;
 
diff --git a/src/test/java/com/android/tools/r8/softverification/MissingClass.java b/src/test/java/com/android/tools/r8/softverification/MissingClass.java
index d653af7..189ba2b 100644
--- a/src/test/java/com/android/tools/r8/softverification/MissingClass.java
+++ b/src/test/java/com/android/tools/r8/softverification/MissingClass.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.softverification;
 
-public class MissingClass {
+public class MissingClass extends RuntimeException {
 
   public static int staticField = 42;
 
diff --git a/src/test/java/com/android/tools/r8/softverification/MissingMember.java b/src/test/java/com/android/tools/r8/softverification/MissingMember.java
index 9fee087..8d9a2de 100644
--- a/src/test/java/com/android/tools/r8/softverification/MissingMember.java
+++ b/src/test/java/com/android/tools/r8/softverification/MissingMember.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.softverification;
 
-public class MissingMember {
+public class MissingMember extends RuntimeException {
 
   public static int staticField = 42;
 
diff --git a/src/test/java/com/android/tools/r8/softverification/MissingSuperType.java b/src/test/java/com/android/tools/r8/softverification/MissingSuperType.java
new file mode 100644
index 0000000..e77ea01
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/softverification/MissingSuperType.java
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.softverification;
+
+public class MissingSuperType extends MissingClass {
+
+  public static int staticField = 42;
+
+  public int instanceField = 42;
+
+  public static void staticMethod() {
+    System.out.println("MissingSuperType::staticMethod");
+  }
+
+  @Override
+  public void instanceMethod() {
+    System.out.println("MissingSuperType::instanceMethod");
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/softverification/TestHashCode.java b/src/test/java/com/android/tools/r8/softverification/TestHashCode.java
new file mode 100644
index 0000000..d856b71
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/softverification/TestHashCode.java
@@ -0,0 +1,26 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.softverification;
+
+public class TestHashCode {
+
+  public static String run() {
+    return run(null);
+  }
+
+  public static String run(MissingClass missingClass) {
+    if (System.currentTimeMillis() == 0) {
+      missingClass.hashCode();
+    }
+    if (System.currentTimeMillis() == 0) {
+      missingClass.hashCode();
+    }
+    String currentString = "foobar";
+    for (int i = 0; i < 10; i++) {
+      currentString = "foobar" + (i + currentString.length());
+    }
+    return currentString;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/softverification/TestRunner.java b/src/test/java/com/android/tools/r8/softverification/TestRunner.java
index 6baef2a..dbe5ab1 100644
--- a/src/test/java/com/android/tools/r8/softverification/TestRunner.java
+++ b/src/test/java/com/android/tools/r8/softverification/TestRunner.java
@@ -47,9 +47,15 @@
     measure.start("InstanceField");
     TestInstanceField.run();
     sb.append(measure.stop());
+    measure.start("HashCode");
+    TestHashCode.run();
+    sb.append(measure.stop());
     measure.start("InstanceMethod");
     TestInstanceMethod.run();
     sb.append(measure.stop());
+    measure.start("TryCatch");
+    TestTryCatch.run();
+    sb.append(measure.stop());
     return sb.toString();
   }
 
diff --git a/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java b/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java
index 375f03f..c3f91db 100644
--- a/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java
+++ b/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java
@@ -74,8 +74,11 @@
 
   private static final Path ANDROID_STUDIO_LIB_PATH = Paths.get("PATH_TO_PROJECT/libs/library.jar");
 
-  private static final int COUNT = 1100;
+  private static final int COUNT = 800;
 
+  private static final List<Class<?>> referenceClasses =
+      ImmutableList.of(
+          MissingClass.class, MissingMember.class, FoundClass.class, MissingSuperType.class);
   private static final List<Class<?>> testClasses =
       ImmutableList.of(
           TestCheckCast.class,
@@ -85,7 +88,9 @@
           TestStaticField.class,
           TestStaticMethod.class,
           TestInstanceField.class,
-          TestInstanceMethod.class);
+          TestInstanceMethod.class,
+          TestHashCode.class,
+          TestTryCatch.class);
   private static final Collection<String> testClassBinaryNames =
       ImmutableSet.copyOf(ListUtils.map(testClasses, TestBase::binaryName));
 
@@ -93,8 +98,7 @@
     ZipBuilder builder = ZipBuilder.builder(path);
     builder.addFilesRelative(
         ToolHelper.getClassPathForTests(), ToolHelper.getClassFileForTestClass(Measure.class));
-    for (Class<?> clazz :
-        ImmutableList.of(MissingClass.class, MissingMember.class, FoundClass.class)) {
+    for (Class<?> clazz : referenceClasses) {
       String postFix = clazz.getSimpleName();
       int classCounter = 0;
       for (int i = 0; i < COUNT; i++) {
@@ -168,6 +172,11 @@
             .replaceClassDescriptorInMethodInstructions(
                 descriptor(MissingClass.class),
                 getDescriptorFromClassBinaryName(referenceBinaryName))
+            .transformTryCatchBlock(
+                "run",
+                (start, end, handler, type, visitor) -> {
+                  visitor.visitTryCatchBlock(start, end, handler, referenceBinaryName);
+                })
             .transform());
   }
 
diff --git a/src/test/java/com/android/tools/r8/softverification/TestTryCatch.java b/src/test/java/com/android/tools/r8/softverification/TestTryCatch.java
new file mode 100644
index 0000000..4be92a3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/softverification/TestTryCatch.java
@@ -0,0 +1,25 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.softverification;
+
+public class TestTryCatch {
+
+  public static Object getObject() {
+    return new Object();
+  }
+
+  public static String run() {
+    try {
+      getObject();
+    } catch (MissingClass e) {
+      throw new RuntimeException("Foo");
+    }
+    String currentString = "foobar";
+    for (int i = 0; i < 10; i++) {
+      currentString = "foobar" + (i + currentString.length());
+    }
+    return currentString;
+  }
+}