// Signature format: 3.0
package androidx.ui.test {

  public final class ActionsKt {
    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void callSemanticsAction(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
    method @Deprecated public static void callSemanticsAction(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction doClick(androidx.ui.test.SemanticsNodeInteraction);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction doGesture(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.test.GestureScope,kotlin.Unit> block);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction doPartialGesture(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.test.PartialGestureScope,kotlin.Unit> block);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction doScrollTo(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction performClick(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction performGesture(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.test.GestureScope,kotlin.Unit> block);
    method public static androidx.ui.test.SemanticsNodeInteraction performPartialGesture(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.test.PartialGestureScope,kotlin.Unit> block);
    method public static androidx.ui.test.SemanticsNodeInteraction performScrollTo(androidx.ui.test.SemanticsNodeInteraction);
    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsAction(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
    method public static void performSemanticsAction(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
  }

  public final class AnimationClockTestRule implements org.junit.rules.TestRule {
    ctor public AnimationClockTestRule();
    method public void advanceClock(long milliseconds);
    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
    method public androidx.ui.test.TestAnimationClock getClock();
    method public boolean isPaused();
    method public void pauseClock();
    method public void resumeClock();
    property public final androidx.ui.test.TestAnimationClock clock;
    property public final boolean isPaused;
  }

  public final class AssertionsKt {
    method public static androidx.ui.test.SemanticsNodeInteraction assert(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.test.SemanticsMatcher matcher, kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError = null);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.ui.test.SemanticsNodeInteractionCollection, androidx.ui.test.SemanticsMatcher matcher);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.ui.test.SemanticsNodeInteractionCollection, androidx.ui.test.SemanticsMatcher matcher);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
    method public static androidx.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsHidden(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsInMutuallyExclusiveGroup(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsNotHidden(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsOff(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsOn(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsUnselected(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertLabelEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
    method public static androidx.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.semantics.AccessibilityRangeInfo value);
    method public static androidx.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
    method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
  }

  public abstract sealed class BaseGestureScope {
  }

  public final class BitmapHelpersKt {
    method public static void assertPixelColor-9bBi3KA(android.graphics.Bitmap, long expected, int x, int y, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Color,java.lang.String> error = { color -> return "Pixel(" + x + ", " + y + ") expected to be " + expected + ", but was " + color });
    method public static void assertPixels(android.graphics.Bitmap, androidx.ui.unit.IntSize? expectedSize = null, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntOffset,androidx.ui.graphics.Color> expectedColorProvider);
    method public static void assertShape--mmofgM(android.graphics.Bitmap, androidx.ui.unit.Density density, float horizontalPadding, float verticalPadding, long backgroundColor, long shapeColor, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, float shapeOverlapPixelCount = 1.0f);
    method public static void assertShape-t2RoSCg(android.graphics.Bitmap, androidx.ui.unit.Density density, androidx.ui.graphics.Shape shape, long shapeColor, long backgroundColor, androidx.ui.graphics.Shape backgroundShape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, float sizeX = width.toFloat(), float sizeY = height.toFloat(), float shapeSizeX = sizeX, float shapeSizeY = sizeY, float centerX = width / 2.0, float centerY = height / 2.0, float shapeOverlapPixelCount = 1.0f);
    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(androidx.ui.test.SemanticsNodeInteraction);
    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(android.view.View);
    method public static boolean contains(androidx.ui.graphics.Path, androidx.ui.geometry.Offset offset);
  }

  public final class BoundsAssertionsKt {
    method public static androidx.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast-Gf70O4E(androidx.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
    method public static androidx.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo-Gf70O4E(androidx.ui.test.SemanticsNodeInteraction, float expectedHeight);
    method public static void assertIsEqualTo-552lcfo(float, float expected, String subject = "", float tolerance = null(0.5));
    method public static void assertIsNotEqualTo-552lcfo(float, float unexpected, String subject = "", float tolerance = null(0.5));
    method public static androidx.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo-Gf70O4E(androidx.ui.test.SemanticsNodeInteraction, float expectedTop);
    method public static androidx.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo-jINh5Q8(androidx.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
    method public static androidx.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo-Gf70O4E(androidx.ui.test.SemanticsNodeInteraction, float expectedTop);
    method public static androidx.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast-Gf70O4E(androidx.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
    method public static androidx.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo-Gf70O4E(androidx.ui.test.SemanticsNodeInteraction, float expectedWidth);
    method public static float getAlignmentLinePosition(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.AlignmentLine line);
    method public static androidx.ui.unit.Bounds getBoundsInRoot(androidx.ui.test.SemanticsNodeInteraction);
  }

  public interface ComposeBenchmarkScope<T> extends androidx.ui.test.ComposeExecutionControl {
    method public void createTestCase();
    method public void disposeContent();
    method public void draw();
    method public void drawFinish();
    method public void drawPrepare();
    method public void emitContent();
    method public T! getTestCase();
    method public void invalidateViews();
    method public void measureWithSpec(int widthSpec, int heightSpec);
    method public void requestLayout();
  }

  public final class ComposeBenchmarkScopeKt {
    method public static <T> void setupContent(androidx.ui.test.ComposeBenchmarkScope<T>);
  }

  public interface ComposeExecutionControl {
    method public void capturePreviewPictureToActivity();
    method public void doFrame();
    method public void drawToBitmap();
    method public boolean getDidLastRecomposeHaveChanges();
    method public int getMeasuredHeight();
    method public int getMeasuredWidth();
    method public boolean hasPendingChanges();
    method public kotlinx.coroutines.Job launchRecomposeIn(kotlinx.coroutines.CoroutineScope coroutineScope);
    method public void layout();
    method public void measure();
    method public void recompose();
    property public abstract boolean didLastRecomposeHaveChanges;
    property public abstract int measuredHeight;
    property public abstract int measuredWidth;
  }

  public final class ComposeExecutionControlKt {
    method public static void assertHasPendingChanges(androidx.ui.test.ComposeExecutionControl);
    method public static void assertLastRecomposeHadChanges(androidx.ui.test.ComposeExecutionControl);
    method public static void assertLastRecomposeHadNoChanges(androidx.ui.test.ComposeExecutionControl);
    method public static void assertMeasureSizeIsPositive(androidx.ui.test.ComposeExecutionControl);
    method public static void assertNoPendingChanges(androidx.ui.test.ComposeExecutionControl);
    method public static void doFramesAssertAllHadChangesExceptLastOne(androidx.ui.test.ComposeExecutionControl, int numberOfFramesToBeStable);
    method public static int doFramesUntilNoChangesPending(androidx.ui.test.ComposeExecutionControl, int maxAmountOfFrames = 10);
    method public static void recomposeAssertHadChanges(androidx.ui.test.ComposeExecutionControl);
  }

  public interface ComposeTestCase {
    method @androidx.compose.Composable public void emitContent();
  }

  public interface ComposeTestCaseSetup {
    method public void performTestWithEventsControl(kotlin.jvm.functions.Function1<? super androidx.ui.test.ComposeExecutionControl,kotlin.Unit> block);
  }

  public interface ComposeTestRule extends org.junit.rules.TestRule {
    method @androidx.ui.test.ExperimentalTesting public androidx.ui.test.ComposeTestCaseSetup forGivenTestCase(androidx.ui.test.ComposeTestCase testCase);
    method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
    method public androidx.ui.unit.Density getDensity();
    method public android.util.DisplayMetrics getDisplayMetrics();
    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
    property public abstract androidx.ui.test.AnimationClockTestRule clockTestRule;
    property public abstract androidx.ui.unit.Density density;
    property public abstract android.util.DisplayMetrics displayMetrics;
  }

  public final class ComposeTestRuleKt {
    method public static androidx.ui.test.ComposeTestRule createComposeRule(androidx.compose.Recomposer? recomposer = null, boolean disableTransitions = false, boolean disableBlinkingCursor = true);
  }

  public final class DisableTransitions implements org.junit.rules.TestRule {
    ctor public DisableTransitions();
    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
  }

  public final class DisableTransitions.DisableTransitionsStatement extends org.junit.runners.model.Statement {
    ctor public DisableTransitions.DisableTransitionsStatement(org.junit.runners.model.Statement base);
    method public void evaluate();
  }

  public final class ErrorMessagesKt {
  }

  @kotlin.RequiresOptIn(message="This testing API is experimental and is likely to be changed or removed" + " entirely") public @interface ExperimentalTesting {
  }

  public final class FiltersKt {
    method public static androidx.ui.test.SemanticsMatcher hasAnyAncestor(androidx.ui.test.SemanticsMatcher matcher);
    method public static androidx.ui.test.SemanticsMatcher hasAnyChild(androidx.ui.test.SemanticsMatcher matcher);
    method public static androidx.ui.test.SemanticsMatcher hasAnyDescendant(androidx.ui.test.SemanticsMatcher matcher);
    method public static androidx.ui.test.SemanticsMatcher hasAnySibling(androidx.ui.test.SemanticsMatcher matcher);
    method public static androidx.ui.test.SemanticsMatcher hasClickAction();
    method public static androidx.ui.test.SemanticsMatcher hasImeAction(androidx.ui.input.ImeAction actionType);
    method public static androidx.ui.test.SemanticsMatcher hasInputMethodsSupport();
    method public static androidx.ui.test.SemanticsMatcher hasLabel(String label, boolean ignoreCase = false);
    method public static androidx.ui.test.SemanticsMatcher hasNoClickAction();
    method public static androidx.ui.test.SemanticsMatcher hasNoScrollAction();
    method public static androidx.ui.test.SemanticsMatcher hasParent(androidx.ui.test.SemanticsMatcher matcher);
    method public static androidx.ui.test.SemanticsMatcher hasRangeInfo(androidx.ui.semantics.AccessibilityRangeInfo rangeInfo);
    method public static androidx.ui.test.SemanticsMatcher hasScrollAction();
    method public static androidx.ui.test.SemanticsMatcher hasSubstring(String substring, boolean ignoreCase = false);
    method public static androidx.ui.test.SemanticsMatcher hasTestTag(String testTag);
    method public static androidx.ui.test.SemanticsMatcher hasText(String text, boolean ignoreCase = false);
    method public static androidx.ui.test.SemanticsMatcher hasValue(String value);
    method public static androidx.ui.test.SemanticsMatcher isDialog();
    method public static androidx.ui.test.SemanticsMatcher isEnabled();
    method public static androidx.ui.test.SemanticsMatcher isHidden();
    method public static androidx.ui.test.SemanticsMatcher isInMutuallyExclusiveGroup();
    method public static androidx.ui.test.SemanticsMatcher isNotEnabled();
    method public static androidx.ui.test.SemanticsMatcher isNotHidden();
    method public static androidx.ui.test.SemanticsMatcher isOff();
    method public static androidx.ui.test.SemanticsMatcher isOn();
    method public static androidx.ui.test.SemanticsMatcher isPopup();
    method public static androidx.ui.test.SemanticsMatcher isRoot();
    method public static androidx.ui.test.SemanticsMatcher isSelectable();
    method public static androidx.ui.test.SemanticsMatcher isSelected();
    method public static androidx.ui.test.SemanticsMatcher isToggleable();
    method public static androidx.ui.test.SemanticsMatcher isUnselected();
  }

  public final class FindersKt {
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction find(androidx.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree = false);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteractionCollection findAll(androidx.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree = false);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteractionCollection findAllByLabel(String label, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteractionCollection findAllByTag(String testTag, boolean useUnmergedTree = false);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteractionCollection findAllByText(String text, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction findByLabel(String label, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction findBySubstring(String text, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction findByTag(String testTag, boolean useUnmergedTree = false);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction findByText(String text, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method @Deprecated public static androidx.ui.test.SemanticsNodeInteraction findRoot(boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection onAllNodes(androidx.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection onAllNodesWithLabel(String label, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection onAllNodesWithTag(String testTag, boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection onAllNodesWithText(String text, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteraction onNode(androidx.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteraction onNodeWithLabel(String label, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteraction onNodeWithSubstring(String text, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteraction onNodeWithTag(String testTag, boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteraction onNodeWithText(String text, boolean ignoreCase = false, boolean useUnmergedTree = false);
    method public static androidx.ui.test.SemanticsNodeInteraction onRoot(boolean useUnmergedTree = false);
  }

  public final class GestureScope extends androidx.ui.test.BaseGestureScope {
  }

  public final class GestureScopeKt {
    method public static void cancel(androidx.ui.test.PartialGestureScope);
    method public static void click(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset position = center);
    method public static void doubleClick(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset position = center, androidx.ui.unit.Duration delay = androidx.ui.test.GestureScopeKt.doubleClickDelay);
    method public static void down(androidx.ui.test.PartialGestureScope, int pointerId, androidx.ui.geometry.Offset position);
    method public static void down(androidx.ui.test.PartialGestureScope, androidx.ui.geometry.Offset position);
    method public static inline float getBottom(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset getBottomCenter(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset getBottomLeft(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset getBottomRight(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset getCenter(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset getCenterLeft(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset getCenterRight(androidx.ui.test.BaseGestureScope);
    method public static inline float getCenterX(androidx.ui.test.BaseGestureScope);
    method public static inline float getCenterY(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.unit.PxBounds getGlobalBounds(androidx.ui.test.BaseGestureScope);
    method public static inline int getHeight(androidx.ui.test.BaseGestureScope);
    method public static inline float getLeft(androidx.ui.test.BaseGestureScope);
    method public static inline float getRight(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.unit.IntSize getSize(androidx.ui.test.BaseGestureScope);
    method public static inline float getTop(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset getTopCenter(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset getTopLeft(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset getTopRight(androidx.ui.test.BaseGestureScope);
    method public static inline int getWidth(androidx.ui.test.BaseGestureScope);
    method public static androidx.ui.geometry.Offset localToGlobal(androidx.ui.test.BaseGestureScope, androidx.ui.geometry.Offset position);
    method public static void longClick(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset position = center, androidx.ui.unit.Duration duration = androidx.ui.core.gesture.ConstantsKt.LongPressTimeout + 100.milliseconds);
    method public static void move(androidx.ui.test.PartialGestureScope);
    method public static void moveBy(androidx.ui.test.PartialGestureScope, int pointerId, androidx.ui.geometry.Offset delta);
    method public static void moveBy(androidx.ui.test.PartialGestureScope, androidx.ui.geometry.Offset delta);
    method public static void movePointerBy(androidx.ui.test.PartialGestureScope, int pointerId, androidx.ui.geometry.Offset delta);
    method public static void movePointerTo(androidx.ui.test.PartialGestureScope, int pointerId, androidx.ui.geometry.Offset position);
    method public static void moveTo(androidx.ui.test.PartialGestureScope, int pointerId, androidx.ui.geometry.Offset position);
    method public static void moveTo(androidx.ui.test.PartialGestureScope, androidx.ui.geometry.Offset position);
    method public static androidx.ui.geometry.Offset percentOffset(androidx.ui.test.BaseGestureScope, @FloatRange(from=-1.0, to=1.0) float x = 0f, @FloatRange(from=-1.0, to=1.0) float y = 0f);
    method public static void pinch(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset start0, androidx.ui.geometry.Offset end0, androidx.ui.geometry.Offset start1, androidx.ui.geometry.Offset end1, androidx.ui.unit.Duration duration = 400.milliseconds);
    method @Deprecated public static void sendCancel(androidx.ui.test.PartialGestureScope);
    method @Deprecated public static void sendClick(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset position = center);
    method @Deprecated public static void sendDoubleClick(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset position = center, androidx.ui.unit.Duration delay = androidx.ui.test.GestureScopeKt.doubleClickDelay);
    method @Deprecated public static void sendDown(androidx.ui.test.PartialGestureScope, int pointerId, androidx.ui.geometry.Offset position);
    method @Deprecated public static void sendDown(androidx.ui.test.PartialGestureScope, androidx.ui.geometry.Offset position);
    method @Deprecated public static void sendLongClick(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset position = center, androidx.ui.unit.Duration duration = androidx.ui.core.gesture.ConstantsKt.LongPressTimeout + 100.milliseconds);
    method @Deprecated public static void sendMove(androidx.ui.test.PartialGestureScope);
    method @Deprecated public static void sendMoveBy(androidx.ui.test.PartialGestureScope, int pointerId, androidx.ui.geometry.Offset delta);
    method @Deprecated public static void sendMoveBy(androidx.ui.test.PartialGestureScope, androidx.ui.geometry.Offset delta);
    method @Deprecated public static void sendMoveTo(androidx.ui.test.PartialGestureScope, int pointerId, androidx.ui.geometry.Offset position);
    method @Deprecated public static void sendMoveTo(androidx.ui.test.PartialGestureScope, androidx.ui.geometry.Offset position);
    method @Deprecated public static void sendPinch(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset start0, androidx.ui.geometry.Offset end0, androidx.ui.geometry.Offset start1, androidx.ui.geometry.Offset end1, androidx.ui.unit.Duration duration = 400.milliseconds);
    method @Deprecated public static void sendSwipe(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset end, androidx.ui.unit.Duration duration = 200.milliseconds);
    method @Deprecated public static void sendSwipeDown(androidx.ui.test.GestureScope);
    method @Deprecated public static void sendSwipeLeft(androidx.ui.test.GestureScope);
    method @Deprecated public static void sendSwipeRight(androidx.ui.test.GestureScope);
    method @Deprecated public static void sendSwipeUp(androidx.ui.test.GestureScope);
    method @Deprecated public static void sendSwipeWithVelocity(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset end, @FloatRange(from=0.0) float endVelocity, androidx.ui.unit.Duration duration = 200.milliseconds);
    method @Deprecated public static void sendUp(androidx.ui.test.PartialGestureScope, int pointerId = 0);
    method public static void swipe(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset end, androidx.ui.unit.Duration duration = 200.milliseconds);
    method public static void swipeDown(androidx.ui.test.GestureScope);
    method public static void swipeLeft(androidx.ui.test.GestureScope);
    method public static void swipeRight(androidx.ui.test.GestureScope);
    method public static void swipeUp(androidx.ui.test.GestureScope);
    method public static void swipeWithVelocity(androidx.ui.test.GestureScope, androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset end, @FloatRange(from=0.0) float endVelocity, androidx.ui.unit.Duration duration = 200.milliseconds);
    method public static void up(androidx.ui.test.PartialGestureScope, int pointerId = 0);
  }

  public final class KeyInputHelpersKt {
    method public static boolean performKeyPress(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.keyinput.KeyEvent2 keyEvent);
  }

  public final class OutputKt {
    method public static void printToLog(androidx.ui.test.SemanticsNodeInteraction, String tag, @IntRange(from=0) int maxDepth = 2147483647);
    method public static void printToLog(androidx.ui.test.SemanticsNodeInteractionCollection, String tag, @IntRange(from=0) int maxDepth = 0);
    method public static String printToString(androidx.ui.test.SemanticsNodeInteraction, @IntRange(from=0) int maxDepth = 2147483647);
    method public static String printToString(androidx.ui.test.SemanticsNodeInteractionCollection, @IntRange(from=0) int maxDepth = 0);
  }

  public final class PartialGestureScope extends androidx.ui.test.BaseGestureScope {
  }

  public final class SelectionResult {
    ctor public SelectionResult(java.util.List<androidx.ui.core.semantics.SemanticsNode> selectedNodes, String? customErrorOnNoMatch);
    method public String? getCustomErrorOnNoMatch();
    method public java.util.List<androidx.ui.core.semantics.SemanticsNode> getSelectedNodes();
  }

  public final class SelectorsKt {
    method public static androidx.ui.test.SemanticsNodeInteractionCollection filter(androidx.ui.test.SemanticsNodeInteractionCollection, androidx.ui.test.SemanticsMatcher matcher);
    method public static androidx.ui.test.SemanticsNodeInteraction filterToOne(androidx.ui.test.SemanticsNodeInteractionCollection, androidx.ui.test.SemanticsMatcher matcher);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection onAncestors(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction onChild(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction onChildAt(androidx.ui.test.SemanticsNodeInteraction, int index);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection onChildren(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction onFirst(androidx.ui.test.SemanticsNodeInteractionCollection);
    method public static androidx.ui.test.SemanticsNodeInteraction onLast(androidx.ui.test.SemanticsNodeInteractionCollection);
    method public static androidx.ui.test.SemanticsNodeInteraction onParent(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction onSibling(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteractionCollection onSiblings(androidx.ui.test.SemanticsNodeInteraction);
  }

  public final class SemanticsMatcher {
    ctor public SemanticsMatcher(String description, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsNode,java.lang.Boolean> matcher);
    method public infix androidx.ui.test.SemanticsMatcher and(androidx.ui.test.SemanticsMatcher other);
    method public String getDescription();
    method public boolean matches(androidx.ui.core.semantics.SemanticsNode node);
    method public boolean matchesAny(Iterable<androidx.ui.core.semantics.SemanticsNode> nodes);
    method public operator androidx.ui.test.SemanticsMatcher not();
    method public infix androidx.ui.test.SemanticsMatcher or(androidx.ui.test.SemanticsMatcher other);
    field public static final androidx.ui.test.SemanticsMatcher.Companion Companion;
  }

  public static final class SemanticsMatcher.Companion {
    method public <T> androidx.ui.test.SemanticsMatcher expectValue(androidx.ui.semantics.SemanticsPropertyKey<T> key, T? expectedValue);
    method public <T> androidx.ui.test.SemanticsMatcher keyIsDefined(androidx.ui.semantics.SemanticsPropertyKey<T> key);
    method public <T> androidx.ui.test.SemanticsMatcher keyNotDefined(androidx.ui.semantics.SemanticsPropertyKey<T> key);
  }

  public final class SemanticsNodeInteraction {
    method public void assertDoesNotExist();
    method public androidx.ui.test.SemanticsNodeInteraction assertExists(String? errorMessageOnFail = null);
    method public androidx.ui.core.semantics.SemanticsNode fetchSemanticsNode(String? errorMessageOnFail = null);
  }

  public final class SemanticsNodeInteractionCollection {
    ctor public SemanticsNodeInteractionCollection(internal boolean useUnmergedTree, internal androidx.ui.test.SemanticsSelector selector);
    method public java.util.List<androidx.ui.core.semantics.SemanticsNode> fetchSemanticsNodes(String? errorMessageOnFail = null);
    method public operator androidx.ui.test.SemanticsNodeInteraction get(int index);
  }

  public final class SemanticsSelector {
    ctor public SemanticsSelector(String description, boolean requiresExactlyOneNode, androidx.ui.test.SemanticsSelector? chainedInputSelector, kotlin.jvm.functions.Function1<? super java.lang.Iterable<androidx.ui.core.semantics.SemanticsNode>,androidx.ui.test.SelectionResult> selector);
    method public String getDescription();
    method public androidx.ui.test.SelectionResult map(Iterable<androidx.ui.core.semantics.SemanticsNode> nodes, String errorOnFail);
  }

  public final class SemanticsSelectorKt {
  }

  public final class StateRestorationTester {
    ctor public StateRestorationTester(androidx.ui.test.ComposeTestRule composeTestRule);
    method public void emulateSavedInstanceStateRestore();
    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
  }

  public final class SynchronizationKt {
    method public static <T> T! runOnIdle(kotlin.jvm.functions.Function0<? extends T> action);
    method @Deprecated public static <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
    method public static <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
    method public static void waitForIdle();
  }

  public interface TestAnimationClock extends androidx.animation.AnimationClockObservable {
    method public void advanceClock(long milliseconds);
    method public boolean isIdle();
    method public boolean isPaused();
    method public void pauseClock();
    method public void resumeClock();
    property public abstract boolean isIdle;
    property public abstract boolean isPaused;
  }

  public final class TextActionsKt {
    method @Deprecated public static void doClearText(androidx.ui.test.SemanticsNodeInteraction, boolean alreadyHasFocus = false);
    method @Deprecated public static void doReplaceText(androidx.ui.test.SemanticsNodeInteraction, String text, boolean alreadyHasFocus = false);
    method @Deprecated public static void doSendImeAction(androidx.ui.test.SemanticsNodeInteraction, boolean alreadyHasFocus = false);
    method @Deprecated public static void doSendText(androidx.ui.test.SemanticsNodeInteraction, String text, boolean alreadyHasFocus = false);
    method public static void performImeAction(androidx.ui.test.SemanticsNodeInteraction, boolean alreadyHasFocus = false);
    method public static void performTextClearance(androidx.ui.test.SemanticsNodeInteraction, boolean alreadyHasFocus = false);
    method public static void performTextInput(androidx.ui.test.SemanticsNodeInteraction, String text, boolean alreadyHasFocus = false);
    method public static void performTextReplacement(androidx.ui.test.SemanticsNodeInteraction, String text, boolean alreadyHasFocus = false);
  }

}

package androidx.ui.test.android {

  public final class AndroidComposeTestCaseRunnerKt {
    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, androidx.activity.ComponentActivity activity);
  }

  public final class AndroidComposeTestCaseSetup implements androidx.ui.test.ComposeTestCaseSetup {
    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestCase testCase, androidx.activity.ComponentActivity activity);
    method public void performTestWithEventsControl(kotlin.jvm.functions.Function1<? super androidx.ui.test.ComposeExecutionControl,kotlin.Unit> block);
  }

  public final class AndroidComposeTestRule<T extends androidx.activity.ComponentActivity> implements androidx.ui.test.ComposeTestRule {
    ctor public AndroidComposeTestRule(androidx.test.ext.junit.rules.ActivityScenarioRule<T> activityRule, androidx.compose.Recomposer? recomposer, boolean disableTransitions, boolean disableBlinkingCursor);
    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
    method @androidx.ui.test.ExperimentalTesting public androidx.ui.test.ComposeTestCaseSetup forGivenTestCase(androidx.ui.test.ComposeTestCase testCase);
    method public androidx.test.ext.junit.rules.ActivityScenarioRule<T> getActivityRule();
    method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
    method public androidx.ui.unit.Density getDensity();
    method public android.util.DisplayMetrics getDisplayMetrics();
    method public androidx.compose.Recomposer? getRecomposer();
    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
    property public androidx.ui.test.AnimationClockTestRule clockTestRule;
    property public androidx.ui.unit.Density density;
    property public android.util.DisplayMetrics displayMetrics;
  }

  public final class AndroidComposeTestRule.AndroidComposeStatement extends org.junit.runners.model.Statement {
    ctor public AndroidComposeTestRule.AndroidComposeStatement(org.junit.runners.model.Statement base);
    method public void evaluate();
  }

  public final class AndroidComposeTestRuleKt {
    method public static inline <reified T extends androidx.activity.ComponentActivity> androidx.ui.test.android.AndroidComposeTestRule<T>! AndroidComposeTestRule(androidx.compose.Recomposer? recomposer = null, boolean disableTransitions = false, boolean disableBlinkingCursor = true);
  }

  public final class ComposeIdlingResourceKt {
    method public static void registerComposeWithEspresso();
    method public static void registerTestClock(androidx.ui.test.TestAnimationClock clock);
    method public static void unregisterComposeFromEspresso();
    method public static void unregisterTestClock(androidx.ui.test.TestAnimationClock clock);
  }

  public final class ComposeNotIdleException extends java.lang.Throwable {
    ctor public ComposeNotIdleException(String? message, Throwable? cause);
  }

  public final class WindowCaptureKt {
  }

}

package androidx.ui.test.android.fake {

  public final class FakeViewStructureKt {
  }

}

