// 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 assertIsNotSelected(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 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-eWrXCG0(android.graphics.Bitmap, long expected, int x, int y, kotlin.jvm.functions.Function1<? super androidx.compose.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.compose.ui.graphics.Color> expectedColorProvider);
    method public static void assertShape-ozjeA3I(android.graphics.Bitmap, androidx.ui.unit.Density density, float horizontalPadding, float verticalPadding, long backgroundColor, long shapeColor, androidx.compose.ui.graphics.Shape shape = androidx.compose.ui.graphics.RectangleShapeKt.RectangleShape, float shapeOverlapPixelCount = 1.0f);
    method public static void assertShape-xgsQ8N8(android.graphics.Bitmap, androidx.ui.unit.Density density, androidx.compose.ui.graphics.Shape shape, long shapeColor, long backgroundColor, androidx.compose.ui.graphics.Shape backgroundShape = androidx.compose.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.compose.ui.graphics.Path, androidx.compose.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(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.compose.ui.text.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 isFocused();
    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 isNotFocused();
    method public static androidx.ui.test.SemanticsMatcher isNotHidden();
    method public static androidx.ui.test.SemanticsMatcher isNotSelected();
    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();
  }

  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.compose.ui.geometry.Offset position = center);
    method public static void doubleClick(androidx.ui.test.GestureScope, androidx.compose.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.compose.ui.geometry.Offset position);
    method public static void down(androidx.ui.test.PartialGestureScope, androidx.compose.ui.geometry.Offset position);
    method public static inline float getBottom(androidx.ui.test.BaseGestureScope);
    method public static androidx.compose.ui.geometry.Offset getBottomCenter(androidx.ui.test.BaseGestureScope);
    method public static androidx.compose.ui.geometry.Offset getBottomLeft(androidx.ui.test.BaseGestureScope);
    method public static androidx.compose.ui.geometry.Offset getBottomRight(androidx.ui.test.BaseGestureScope);
    method public static androidx.compose.ui.geometry.Offset getCenter(androidx.ui.test.BaseGestureScope);
    method public static androidx.compose.ui.geometry.Offset getCenterLeft(androidx.ui.test.BaseGestureScope);
    method public static androidx.compose.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 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.compose.ui.geometry.Offset getTopCenter(androidx.ui.test.BaseGestureScope);
    method public static androidx.compose.ui.geometry.Offset getTopLeft(androidx.ui.test.BaseGestureScope);
    method public static androidx.compose.ui.geometry.Offset getTopRight(androidx.ui.test.BaseGestureScope);
    method public static inline int getWidth(androidx.ui.test.BaseGestureScope);
    method public static androidx.compose.ui.geometry.Offset localToGlobal(androidx.ui.test.BaseGestureScope, androidx.compose.ui.geometry.Offset position);
    method public static void longClick(androidx.ui.test.GestureScope, androidx.compose.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.compose.ui.geometry.Offset delta);
    method public static void moveBy(androidx.ui.test.PartialGestureScope, androidx.compose.ui.geometry.Offset delta);
    method public static void movePointerBy(androidx.ui.test.PartialGestureScope, int pointerId, androidx.compose.ui.geometry.Offset delta);
    method public static void movePointerTo(androidx.ui.test.PartialGestureScope, int pointerId, androidx.compose.ui.geometry.Offset position);
    method public static void moveTo(androidx.ui.test.PartialGestureScope, int pointerId, androidx.compose.ui.geometry.Offset position);
    method public static void moveTo(androidx.ui.test.PartialGestureScope, androidx.compose.ui.geometry.Offset position);
    method public static androidx.compose.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.compose.ui.geometry.Offset start0, androidx.compose.ui.geometry.Offset end0, androidx.compose.ui.geometry.Offset start1, androidx.compose.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.compose.ui.geometry.Offset position = center);
    method @Deprecated public static void sendDoubleClick(androidx.ui.test.GestureScope, androidx.compose.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.compose.ui.geometry.Offset position);
    method @Deprecated public static void sendDown(androidx.ui.test.PartialGestureScope, androidx.compose.ui.geometry.Offset position);
    method @Deprecated public static void sendLongClick(androidx.ui.test.GestureScope, androidx.compose.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.compose.ui.geometry.Offset delta);
    method @Deprecated public static void sendMoveBy(androidx.ui.test.PartialGestureScope, androidx.compose.ui.geometry.Offset delta);
    method @Deprecated public static void sendMoveTo(androidx.ui.test.PartialGestureScope, int pointerId, androidx.compose.ui.geometry.Offset position);
    method @Deprecated public static void sendMoveTo(androidx.ui.test.PartialGestureScope, androidx.compose.ui.geometry.Offset position);
    method @Deprecated public static void sendPinch(androidx.ui.test.GestureScope, androidx.compose.ui.geometry.Offset start0, androidx.compose.ui.geometry.Offset end0, androidx.compose.ui.geometry.Offset start1, androidx.compose.ui.geometry.Offset end1, androidx.ui.unit.Duration duration = 400.milliseconds);
    method @Deprecated public static void sendSwipe(androidx.ui.test.GestureScope, androidx.compose.ui.geometry.Offset start, androidx.compose.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.compose.ui.geometry.Offset start, androidx.compose.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.compose.ui.geometry.Offset start, androidx.compose.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.compose.ui.geometry.Offset start, androidx.compose.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.compose.animation.core.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, 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 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(boolean disableTransitions = false, boolean disableBlinkingCursor = true);
    method public static inline <reified T extends androidx.activity.ComponentActivity> androidx.ui.test.android.AndroidComposeTestRule<T>! createAndroidComposeRule(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 {
  }

}

