Reland "Update profile rewrite tests to inspect individual items..."

This reverts commit e06aa9655946677ad8b0fa38b9ca87b99b87b4f9.

Change-Id: Ife29bfe16672c77668ec6bfb3515f48657cf4333
diff --git a/src/main/java/com/android/tools/r8/utils/ClassReferenceUtils.java b/src/main/java/com/android/tools/r8/utils/ClassReferenceUtils.java
index 072022d..0ee9a72 100644
--- a/src/main/java/com/android/tools/r8/utils/ClassReferenceUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ClassReferenceUtils.java
@@ -45,6 +45,10 @@
     }
   }
 
+  public static String toSmaliString(ClassReference classReference) {
+    return classReference.getDescriptor();
+  }
+
   public static DexType toDexType(ClassReference classReference, DexItemFactory dexItemFactory) {
     return dexItemFactory.createType(classReference.getDescriptor());
   }
diff --git a/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
index e192b41..1d08f27 100644
--- a/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
@@ -79,7 +79,7 @@
         .build();
   }
 
-  public ExternalArtProfile getExpectedResidualArtProfile(CodeInspector inspector) {
+  private void inspect(ArtProfileInspector profileInspector, CodeInspector inspector) {
     ClassSubject barClassSubject = inspector.clazz(Bar.class);
     assertThat(barClassSubject, isPresentAndRenamed());
 
@@ -89,24 +89,13 @@
     MethodSubject worldMethodSubject = barClassSubject.uniqueMethodWithOriginalName("world");
     assertThat(worldMethodSubject, isPresentAndRenamed());
 
-    return ExternalArtProfile.builder()
-        .addRules(
-            ExternalArtProfileClassRule.builder().setClassReference(mainClassReference).build(),
-            ExternalArtProfileMethodRule.builder().setMethodReference(mainMethodReference).build(),
-            ExternalArtProfileClassRule.builder()
-                .setClassReference(barClassSubject.getFinalReference())
-                .build(),
-            ExternalArtProfileMethodRule.builder()
-                .setMethodReference(helloMethodSubject.getFinalReference())
-                .build(),
-            ExternalArtProfileMethodRule.builder()
-                .setMethodReference(worldMethodSubject.getFinalReference())
-                .build())
-        .build();
-  }
-
-  private void inspect(ArtProfileInspector profileInspector, CodeInspector inspector) {
-    profileInspector.assertEqualTo(getExpectedResidualArtProfile(inspector));
+    profileInspector
+        .assertContainsClassRules(mainClassReference, barClassSubject.getFinalReference())
+        .assertContainsMethodRules(
+            mainMethodReference,
+            helloMethodSubject.getFinalReference(),
+            worldMethodSubject.getFinalReference())
+        .assertContainsNoOtherRules();
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java
index c68b02f..bbef17f 100644
--- a/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java
@@ -78,33 +78,22 @@
         .build();
   }
 
-  private ExternalArtProfile getExpectedResidualArtProfile(CodeInspector inspector) {
+  private void inspect(ArtProfileInspector profileInspector, CodeInspector inspector) {
     ClassSubject greeterClassSubject = inspector.clazz(Greeter.class);
     assertThat(greeterClassSubject, isPresentAndRenamed());
 
     MethodSubject greetMethodSubject = greeterClassSubject.uniqueMethodWithOriginalName("greet");
     assertThat(greetMethodSubject, isPresentAndRenamed());
 
-    return ExternalArtProfile.builder()
-        .addRules(
-            ExternalArtProfileClassRule.builder().setClassReference(mainClassReference).build(),
-            ExternalArtProfileMethodRule.builder()
-                .setMethodReference(mainMethodReference)
-                .setMethodRuleInfo(ArtProfileMethodRuleInfoImpl.builder().setIsStartup().build())
-                .build(),
-            ExternalArtProfileClassRule.builder()
-                .setClassReference(greeterClassSubject.getFinalReference())
-                .build(),
-            ExternalArtProfileMethodRule.builder()
-                .setMethodReference(greetMethodSubject.getFinalReference())
-                .setMethodRuleInfo(
-                    ArtProfileMethodRuleInfoImpl.builder().setIsHot().setIsPostStartup().build())
-                .build())
-        .build();
-  }
-
-  private void inspect(ArtProfileInspector profileInspector, CodeInspector inspector) {
-    profileInspector.assertEqualTo(getExpectedResidualArtProfile(inspector));
+    profileInspector
+        .assertContainsClassRules(mainClassReference, greeterClassSubject.getFinalReference())
+        .inspectMethodRule(
+            mainMethodReference,
+            ruleInspector -> ruleInspector.assertIsStartup().assertNotHot().assertNotPostStartup())
+        .inspectMethodRule(
+            greetMethodSubject.getFinalReference(),
+            ruleInspector -> ruleInspector.assertIsHot().assertIsPostStartup().assertNotStartup())
+        .assertContainsNoOtherRules();
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
index 1a4bfda..3cd8e10 100644
--- a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
@@ -86,15 +86,6 @@
         .build();
   }
 
-  private ExternalArtProfile getExpectedResidualArtProfile(MethodSubject forEachMethodSubject) {
-    return ExternalArtProfile.builder()
-        .addRule(
-            ExternalArtProfileMethodRule.builder()
-                .setMethodReference(forEachMethodSubject.getFinalReference())
-                .build())
-        .build();
-  }
-
   private void inspect(ArtProfileInspector profileInspector, CodeInspector inspector) {
     ClassSubject consumerClassSubject =
         inspector.clazz(
@@ -112,7 +103,7 @@
                 && libraryDesugaringSpecification == LibraryDesugaringSpecification.JDK8));
     assertEquals(consumerClassSubject.asTypeSubject(), forEachMethodSubject.getParameter(0));
 
-    profileInspector.assertEqualTo(getExpectedResidualArtProfile(forEachMethodSubject));
+    profileInspector.assertContainsMethodRule(forEachMethodSubject).assertContainsNoOtherRules();
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
index 5b23bff..e45e4a5 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
@@ -69,14 +69,11 @@
   }
 
   private void inspectResidualArtProfile(ArtProfileInspector profileInspector) {
-    if (parameters.isCfRuntime()) {
-      profileInspector.assertEqualTo(getArtProfile());
-    } else {
-      assert parameters.isDexRuntime();
-      // TODO(b/265729283): Since Main.main() is in the art profile, so should the two synthetic
-      //  lambdas be.
-      profileInspector.assertEqualTo(getArtProfile());
-    }
+    // TODO(b/265729283): Since Main.main() is in the art profile, so should the two synthetic
+    //  lambdas be when compiling to dex.
+    profileInspector
+        .assertContainsMethodRule(MethodReferenceUtils.mainMethod(Main.class))
+        .assertContainsNoOtherRules();
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
index 9dd4d42..9951db3 100644
--- a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
+++ b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
@@ -9,9 +9,8 @@
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.utils.StringUtils;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.function.Consumer;
 
 /**
@@ -24,9 +23,49 @@
  */
 public class ExternalArtProfile {
 
-  private final List<ExternalArtProfileRule> rules;
+  private abstract static class ReferenceBox<R> {
 
-  ExternalArtProfile(List<ExternalArtProfileRule> rules) {
+    private final R reference;
+
+    ReferenceBox(R reference) {
+      this.reference = reference;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (this == o) {
+        return true;
+      }
+      if (o == null || getClass() != o.getClass()) {
+        return false;
+      }
+      ReferenceBox<?> that = (ReferenceBox<?>) o;
+      return reference.equals(that.reference);
+    }
+
+    @Override
+    public int hashCode() {
+      return reference.hashCode();
+    }
+  }
+
+  private static class ClassReferenceBox extends ReferenceBox<ClassReference> {
+
+    ClassReferenceBox(ClassReference reference) {
+      super(reference);
+    }
+  }
+
+  private static class MethodReferenceBox extends ReferenceBox<MethodReference> {
+
+    MethodReferenceBox(MethodReference reference) {
+      super(reference);
+    }
+  }
+
+  private final Map<ReferenceBox<?>, ExternalArtProfileRule> rules;
+
+  ExternalArtProfile(Map<ReferenceBox<?>, ExternalArtProfileRule> rules) {
     this.rules = rules;
   }
 
@@ -34,14 +73,30 @@
     return new Builder();
   }
 
+  public boolean containsClassRule(ClassReference classReference) {
+    return rules.containsKey(new ClassReferenceBox(classReference));
+  }
+
+  public boolean containsMethodRule(MethodReference methodReference) {
+    return rules.containsKey(new MethodReferenceBox(methodReference));
+  }
+
   public void forEach(
       Consumer<ExternalArtProfileClassRule> classRuleConsumer,
       Consumer<ExternalArtProfileMethodRule> methodRuleConsumer) {
-    for (ExternalArtProfileRule rule : rules) {
+    for (ExternalArtProfileRule rule : rules.values()) {
       rule.accept(classRuleConsumer, methodRuleConsumer);
     }
   }
 
+  public ExternalArtProfileClassRule getClassRule(ClassReference classReference) {
+    return (ExternalArtProfileClassRule) rules.get(new ClassReferenceBox(classReference));
+  }
+
+  public ExternalArtProfileMethodRule getMethodRule(MethodReference methodReference) {
+    return (ExternalArtProfileMethodRule) rules.get(new MethodReferenceBox(methodReference));
+  }
+
   public int size() {
     return rules.size();
   }
@@ -65,12 +120,13 @@
 
   @Override
   public String toString() {
-    return StringUtils.join(System.lineSeparator(), rules, ExternalArtProfileRule::toString);
+    return StringUtils.join(
+        System.lineSeparator(), rules.values(), ExternalArtProfileRule::toString);
   }
 
   public static class Builder {
 
-    private final List<ExternalArtProfileRule> rules = new ArrayList<>();
+    private final Map<ReferenceBox<?>, ExternalArtProfileRule> rules = new LinkedHashMap<>();
 
     public Builder addClassRule(ClassReference classReference) {
       return addRule(
@@ -91,12 +147,17 @@
     }
 
     public Builder addRule(ExternalArtProfileRule rule) {
-      rules.add(rule);
+      rule.accept(
+          classRule -> rules.put(new ClassReferenceBox(classRule.getClassReference()), classRule),
+          methodRule ->
+              rules.put(new MethodReferenceBox(methodRule.getMethodReference()), methodRule));
       return this;
     }
 
     public Builder addRules(ExternalArtProfileRule... rules) {
-      Collections.addAll(this.rules, rules);
+      for (ExternalArtProfileRule rule : rules) {
+        addRule(rule);
+      }
       return this;
     }
 
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileClassRule.java b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileClassRule.java
index d6cd80a..956cd6e 100644
--- a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileClassRule.java
+++ b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileClassRule.java
@@ -6,6 +6,7 @@
 
 import com.android.tools.r8.references.ClassReference;
 import java.util.function.Consumer;
+import java.util.function.Predicate;
 
 /**
  * Represents a class rule from an ART baseline profile, backed by {@link ClassReference}. Class
@@ -36,6 +37,13 @@
   }
 
   @Override
+  public boolean test(
+      Predicate<ExternalArtProfileClassRule> classRuleConsumer,
+      Predicate<ExternalArtProfileMethodRule> methodRuleConsumer) {
+    return classRuleConsumer.test(this);
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (this == obj) {
       return true;
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileMethodRule.java b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileMethodRule.java
index 96943a6..4eadead 100644
--- a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileMethodRule.java
+++ b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileMethodRule.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.utils.MethodReferenceUtils;
 import java.util.function.Consumer;
+import java.util.function.Predicate;
 
 /** Represents a method rule from an ART baseline profile, backed by {@link MethodReference}. */
 public class ExternalArtProfileMethodRule extends ExternalArtProfileRule {
@@ -44,6 +45,13 @@
   }
 
   @Override
+  public boolean test(
+      Predicate<ExternalArtProfileClassRule> classRuleConsumer,
+      Predicate<ExternalArtProfileMethodRule> methodRuleConsumer) {
+    return methodRuleConsumer.test(this);
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (this == obj) {
       return true;
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileRule.java b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileRule.java
index bd3c99e..7138589 100644
--- a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileRule.java
+++ b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfileRule.java
@@ -5,10 +5,15 @@
 package com.android.tools.r8.profile.art.model;
 
 import java.util.function.Consumer;
+import java.util.function.Predicate;
 
 public abstract class ExternalArtProfileRule {
 
   public abstract void accept(
       Consumer<ExternalArtProfileClassRule> classRuleConsumer,
       Consumer<ExternalArtProfileMethodRule> methodRuleConsumer);
+
+  public abstract boolean test(
+      Predicate<ExternalArtProfileClassRule> classRuleConsumer,
+      Predicate<ExternalArtProfileMethodRule> methodRuleConsumer);
 }
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileClassRuleInspector.java b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileClassRuleInspector.java
new file mode 100644
index 0000000..eded89d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileClassRuleInspector.java
@@ -0,0 +1,16 @@
+// Copyright (c) 2023, 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.profile.art.utils;
+
+import com.android.tools.r8.profile.art.model.ExternalArtProfileClassRule;
+
+public class ArtProfileClassRuleInspector {
+
+  private final ExternalArtProfileClassRule classRule;
+
+  ArtProfileClassRuleInspector(ExternalArtProfileClassRule classRule) {
+    this.classRule = classRule;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
index af0a9a9..22b5370 100644
--- a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
+++ b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
@@ -4,15 +4,28 @@
 
 package com.android.tools.r8.profile.art.utils;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
+import com.android.tools.r8.profile.art.model.ExternalArtProfileClassRule;
+import com.android.tools.r8.profile.art.model.ExternalArtProfileMethodRule;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.function.Consumer;
 
 public class ArtProfileInspector {
 
   private final ExternalArtProfile artProfile;
 
+  private final Set<ClassReference> checkedClassReferences = new HashSet<>();
+  private final Set<MethodReference> checkedMethodReferences = new HashSet<>();
+
   public ArtProfileInspector(ExternalArtProfile artProfile) {
     this.artProfile = artProfile;
   }
@@ -22,13 +35,63 @@
     return this;
   }
 
-  public ArtProfileInspector assertEqualTo(ExternalArtProfile otherArtProfile) {
-    assertEquals(otherArtProfile, artProfile);
+  public ArtProfileInspector assertNotEmpty() {
+    assertNotEquals(0, artProfile.size());
     return this;
   }
 
-  public ArtProfileInspector assertNotEmpty() {
-    assertNotEquals(0, artProfile.size());
+  public ArtProfileInspector assertContainsClassRule(ClassReference classReference) {
+    assertThat(artProfile, ArtProfileMatchers.containsClassRule(classReference));
+    checkedClassReferences.add(classReference);
+    return this;
+  }
+
+  public ArtProfileInspector assertContainsClassRule(ClassSubject classSubject) {
+    return assertContainsClassRule(classSubject.getFinalReference());
+  }
+
+  public ArtProfileInspector assertContainsClassRules(ClassReference... classReferences) {
+    for (ClassReference classReference : classReferences) {
+      assertContainsClassRule(classReference);
+    }
+    return this;
+  }
+
+  public ArtProfileInspector assertContainsMethodRule(MethodReference methodReference) {
+    assertThat(artProfile, ArtProfileMatchers.containsMethodRule(methodReference));
+    checkedMethodReferences.add(methodReference);
+    return this;
+  }
+
+  public ArtProfileInspector assertContainsMethodRule(MethodSubject methodSubject) {
+    return assertContainsMethodRule(methodSubject.getFinalReference());
+  }
+
+  public ArtProfileInspector assertContainsMethodRules(MethodReference... methodReferences) {
+    for (MethodReference methodReference : methodReferences) {
+      assertContainsMethodRule(methodReference);
+    }
+    return this;
+  }
+
+  public ArtProfileInspector assertContainsNoOtherRules() {
+    assertEquals(checkedClassReferences.size() + checkedMethodReferences.size(), artProfile.size());
+    return this;
+  }
+
+  public ArtProfileInspector inspectClassRule(
+      ClassReference classReference, Consumer<ArtProfileClassRuleInspector> inspector) {
+    assertContainsClassRule(classReference);
+    ExternalArtProfileClassRule classRule = artProfile.getClassRule(classReference);
+    inspector.accept(new ArtProfileClassRuleInspector(classRule));
+    return this;
+  }
+
+  public ArtProfileInspector inspectMethodRule(
+      MethodReference methodReference, Consumer<ArtProfileMethodRuleInspector> inspector) {
+    assertContainsMethodRule(methodReference);
+    ExternalArtProfileMethodRule methodRule = artProfile.getMethodRule(methodReference);
+    inspector.accept(new ArtProfileMethodRuleInspector(methodRule));
     return this;
   }
 }
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMatchers.java b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMatchers.java
new file mode 100644
index 0000000..64355a9
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMatchers.java
@@ -0,0 +1,72 @@
+// Copyright (c) 2023, 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.profile.art.utils;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.profile.art.model.ExternalArtProfile;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.utils.ClassReferenceUtils;
+import com.android.tools.r8.utils.MethodReferenceUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+public class ArtProfileMatchers {
+
+  public static Matcher<ExternalArtProfile> containsClassRule(ClassReference classReference) {
+    return new TypeSafeMatcher<ExternalArtProfile>() {
+      @Override
+      protected boolean matchesSafely(ExternalArtProfile subject) {
+        return subject.containsClassRule(classReference);
+      }
+
+      @Override
+      public void describeTo(Description description) {
+        description.appendText(
+            "contains class rule " + ClassReferenceUtils.toSmaliString(classReference));
+      }
+
+      @Override
+      public void describeMismatchSafely(ExternalArtProfile subject, Description description) {
+        description.appendText("profile did not");
+      }
+    };
+  }
+
+  public static Matcher<ExternalArtProfile> containsClassRule(ClassSubject classSubject) {
+    assertThat(classSubject, isPresent());
+    return containsClassRule(classSubject.getFinalReference());
+  }
+
+  public static Matcher<ExternalArtProfile> containsMethodRule(MethodReference methodReference) {
+    return new TypeSafeMatcher<ExternalArtProfile>() {
+      @Override
+      protected boolean matchesSafely(ExternalArtProfile subject) {
+        return subject.containsMethodRule(methodReference);
+      }
+
+      @Override
+      public void describeTo(Description description) {
+        description.appendText(
+            "contains method rule " + MethodReferenceUtils.toSmaliString(methodReference));
+      }
+
+      @Override
+      public void describeMismatchSafely(ExternalArtProfile subject, Description description) {
+        description.appendText("profile did not");
+      }
+    };
+  }
+
+  public static Matcher<ExternalArtProfile> containsMethodRule(MethodSubject methodSubject) {
+    assertThat(methodSubject, isPresent());
+    return containsMethodRule(methodSubject.getFinalReference());
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMethodRuleInspector.java b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMethodRuleInspector.java
new file mode 100644
index 0000000..fbca727
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileMethodRuleInspector.java
@@ -0,0 +1,49 @@
+// Copyright (c) 2023, 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.profile.art.utils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.profile.art.model.ExternalArtProfileMethodRule;
+
+public class ArtProfileMethodRuleInspector {
+
+  private final ExternalArtProfileMethodRule methodRule;
+
+  ArtProfileMethodRuleInspector(ExternalArtProfileMethodRule methodRule) {
+    this.methodRule = methodRule;
+  }
+
+  public ArtProfileMethodRuleInspector assertIsHot() {
+    assertTrue(methodRule.getMethodRuleInfo().isHot());
+    return this;
+  }
+
+  public ArtProfileMethodRuleInspector assertIsStartup() {
+    assertTrue(methodRule.getMethodRuleInfo().isStartup());
+    return this;
+  }
+
+  public ArtProfileMethodRuleInspector assertIsPostStartup() {
+    assertTrue(methodRule.getMethodRuleInfo().isPostStartup());
+    return this;
+  }
+
+  public ArtProfileMethodRuleInspector assertNotHot() {
+    assertFalse(methodRule.getMethodRuleInfo().isHot());
+    return this;
+  }
+
+  public ArtProfileMethodRuleInspector assertNotStartup() {
+    assertFalse(methodRule.getMethodRuleInfo().isStartup());
+    return this;
+  }
+
+  public ArtProfileMethodRuleInspector assertNotPostStartup() {
+    assertFalse(methodRule.getMethodRuleInfo().isPostStartup());
+    return this;
+  }
+}