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;
+  }
+}
