[KeepAnno] Add extraction tests to access visibility test

Bug: b/321674067
Change-Id: I383be8fa73255b3a33b353b1f8ffce2a1b2633dc
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
index afa1871..a9dec7d 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
@@ -7,9 +7,6 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.keepanno.annotations.FieldAccessFlags;
 import com.android.tools.r8.keepanno.annotations.KeepConstraint;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
@@ -32,57 +29,66 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 
 @RunWith(Parameterized.class)
-public class KeepAccessVisibilityFlagsTest extends TestBase {
+public class KeepAccessVisibilityFlagsTest extends KeepAnnoTestBase {
 
   static final String EXPECTED =
       StringUtils.lines(
-          // Field targets.
+          "=== non-private fields:",
           "packagePrivateField",
           "protectedField",
           "publicField",
-          // Method targets.
+          "=== non-package-private methods:",
           "privateMethod",
           "protectedMethod",
           "publicMethod",
-          // Member field targets.
+          "=== private and package-private fields:",
           "packagePrivateField",
           "privateField",
-          // Member method targets.
+          "=== private and package-private methods:",
           "packagePrivateMethod",
           "privateMethod");
 
-  private final TestParameters parameters;
+  static final String UNEXPECTED_PG =
+      StringUtils.lines(
+          "=== non-private fields:",
+          "packagePrivateField",
+          "protectedField",
+          "publicField",
+          "=== non-package-private methods:",
+          "privateMethod",
+          "protectedMethod",
+          "publicMethod",
+          "=== private and package-private fields:",
+          // PG will rename and privatize the unused public and protected field!?
+          "a",
+          "b",
+          "packagePrivateField",
+          "privateField",
+          "=== private and package-private methods:",
+          "packagePrivateMethod",
+          "privateMethod");
+
+  @Parameter public KeepAnnoParameters parameters;
 
   @Parameterized.Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build();
-  }
-
-  public KeepAccessVisibilityFlagsTest(TestParameters parameters) {
-    this.parameters = parameters;
+  public static List<KeepAnnoParameters> data() {
+    return createParameters(
+        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
   }
 
   @Test
-  public void testReference() throws Exception {
-    testForRuntime(parameters)
-        .addProgramClasses(getInputClasses())
-        .run(parameters.getRuntime(), TestClass.class)
-        .assertSuccessWithOutput(EXPECTED);
-  }
-
-  @Test
-  public void testWithRuleExtraction() throws Exception {
-    testForR8(parameters.getBackend())
-        .enableExperimentalKeepAnnotations()
+  public void test() throws Exception {
+    testForKeepAnno(parameters)
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(TestClass.class)
         .allowAccessModification()
-        .setMinApi(parameters)
-        .run(parameters.getRuntime(), TestClass.class)
-        .assertSuccessWithOutput(EXPECTED)
-        .inspect(this::checkOutput);
+        .setExcludedOuterClass(getClass())
+        .run(TestClass.class)
+        .assertSuccessWithOutput(parameters.isPG() ? UNEXPECTED_PG : EXPECTED)
+        .applyIf(parameters.isR8(), r -> r.inspect(this::checkOutput));
   }
 
   public List<Class<?>> getInputClasses() {
@@ -203,6 +209,7 @@
     void foo() {
       // Print all non-private fields.
       {
+        System.out.println("=== non-private fields:");
         List<String> nonPrivateFields = new ArrayList<>();
         for (Field field : FieldRuleTarget.class.getDeclaredFields()) {
           int mod = field.getModifiers();
@@ -214,6 +221,7 @@
       }
       // Print all non-package-private methods.
       {
+        System.out.println("=== non-package-private methods:");
         List<String> nonPackagePrivateMethods = new ArrayList<>();
         for (Method method : MethodRuleTarget.class.getDeclaredMethods()) {
           int mod = method.getModifiers();
@@ -225,6 +233,7 @@
       }
       // Print all private and package-private members.
       {
+        System.out.println("=== private and package-private fields:");
         List<String> privateOrPackagePrivateFields = new ArrayList<>();
         for (Field field : MemberRuleTarget.class.getDeclaredFields()) {
           int mod = field.getModifiers();
@@ -235,6 +244,7 @@
         printSorted(privateOrPackagePrivateFields);
       }
       {
+        System.out.println("=== private and package-private methods:");
         List<String> privateOrPackagePrivateMethods = new ArrayList<>();
         for (Method method : MemberRuleTarget.class.getDeclaredMethods()) {
           int mod = method.getModifiers();
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index 737c95e..947e89e 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.ProguardTestBuilder;
 import com.android.tools.r8.R8FullTestBuilder;
 import com.android.tools.r8.R8TestBuilder;
+import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestBuilder;
@@ -38,11 +39,16 @@
   }
 
   private final KeepAnnoParameters keepAnnoParams;
+  private boolean printRules = false;
 
   private KeepAnnoTestBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
     this.keepAnnoParams = params;
   }
 
+  boolean shouldPrintRules() {
+    return printRules;
+  }
+
   public final TestParameters parameters() {
     return keepAnnoParams.parameters();
   }
@@ -54,6 +60,13 @@
 
   public abstract SingleTestRunResult<?> run(Class<?> mainClass) throws Exception;
 
+  public KeepAnnoTestBuilder applyIfShrinker(
+      ThrowableConsumer<TestShrinkerBuilder<?, ?, ?, ?, ?>> builderConsumer) {
+    applyIfR8(builderConsumer);
+    applyIfPG(builderConsumer::accept);
+    return this;
+  }
+
   public KeepAnnoTestBuilder applyIfR8(
       ThrowableConsumer<TestShrinkerBuilder<?, ?, ?, ?, ?>> builderConsumer) {
     return this;
@@ -75,6 +88,16 @@
     return applyIfR8Native(R8TestBuilder::allowUnusedProguardConfigurationRules);
   }
 
+  public final KeepAnnoTestBuilder allowAccessModification() {
+    applyIfShrinker(TestShrinkerBuilder::allowAccessModification);
+    return this;
+  }
+
+  public KeepAnnoTestBuilder printRules() {
+    printRules = true;
+    return this;
+  }
+
   private static class ReferenceBuilder extends KeepAnnoTestBuilder {
 
     private final TestBuilder<? extends SingleTestRunResult<?>, ?> builder;
@@ -147,7 +170,11 @@
 
     @Override
     public SingleTestRunResult<?> run(Class<?> mainClass) throws Exception {
-      return builder.run(parameters().getRuntime(), mainClass);
+      R8TestCompileResult compileResult = builder.compile();
+      if (shouldPrintRules()) {
+        System.out.println(compileResult.getProguardConfiguration());
+      }
+      return compileResult.run(parameters().getRuntime(), mainClass);
     }
   }
 
@@ -178,6 +205,9 @@
       List<String> rules = KeepAnnoTestUtils.extractRules(programClasses, extractorOptions);
       builder.addProgramClasses(programClasses);
       builder.addKeepRules(rules);
+      if (shouldPrintRules()) {
+        rules.forEach(System.out::println);
+      }
       return this;
     }
 
@@ -218,6 +248,9 @@
       List<String> rules = KeepAnnoTestUtils.extractRules(programClasses, extractorOptions);
       builder.addProgramClasses(programClasses);
       builder.addKeepRules(rules);
+      if (shouldPrintRules()) {
+        rules.forEach(System.out::println);
+      }
       return this;
     }