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

  public final class ActionsKt {
    method public static androidx.ui.test.SemanticsNodeInteraction doClick(androidx.ui.test.SemanticsNodeInteraction);
    method public static boolean waitForIdleCompose();
  }

  public final class AssertionsKt {
    method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> assertCountEquals(java.util.List<androidx.ui.test.SemanticsNodeInteraction>, int count);
    method public static void assertDoesNotExist(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
    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 assertIsChecked(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 assertIsSelected(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsUnchecked(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsUnselected(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertIsVisible(androidx.ui.test.SemanticsNodeInteraction);
    method public static void assertNoLongerExists(androidx.ui.test.SemanticsNodeInteraction);
    method public static androidx.ui.test.SemanticsNodeInteraction assertSemanticsIsEqualTo(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.semantics.SemanticsConfiguration expectedProperties);
    method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
    method public static void verify(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.String> assertionMessage, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> condition);
  }

  public final class CollectedSizes {
    ctor public CollectedSizes(androidx.ui.core.PxSize size, androidx.ui.core.Density density);
    method public androidx.ui.test.CollectedSizes assertHeightEqualsTo(androidx.ui.core.Dp expectedHeight);
    method public androidx.ui.test.CollectedSizes assertHeightEqualsTo(kotlin.jvm.functions.Function1<? super androidx.ui.core.DensityScope,androidx.ui.core.IntPx> expectedHeightPx);
    method public androidx.ui.test.CollectedSizes assertIsSquareWithSize(androidx.ui.core.Dp expectedSize);
    method public androidx.ui.test.CollectedSizes assertIsSquareWithSize(kotlin.jvm.functions.Function1<? super androidx.ui.core.DensityScope,androidx.ui.core.IntPx> expectedSquarePx);
    method public androidx.ui.test.CollectedSizes assertWidthEqualsTo(androidx.ui.core.Dp expectedWidth);
    method public androidx.ui.test.CollectedSizes assertWidthEqualsTo(kotlin.jvm.functions.Function1<? super androidx.ui.core.DensityScope,androidx.ui.core.IntPx> expectedWidthPx);
  }

  public interface ComposeTestRule extends org.junit.rules.TestRule {
    method public androidx.ui.core.Density getDensity();
    method public android.util.DisplayMetrics getDisplayMetrics();
    method public void runOnUiThread(kotlin.jvm.functions.Function0<kotlin.Unit> action);
    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
    property public abstract androidx.ui.core.Density density;
    property public abstract android.util.DisplayMetrics displayMetrics;
  }

  public final class ComposeTestRuleKt {
    method public static androidx.ui.test.ComposeTestRule createComposeRule(boolean disableTransitions = false);
  }

  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 FiltersKt {
    method public static boolean getHasClickAction(androidx.ui.core.semantics.SemanticsConfiguration);
    method public static boolean isInMutuallyExclusiveGroup(androidx.ui.core.semantics.SemanticsConfiguration);
    method public static boolean isToggleable(androidx.ui.core.semantics.SemanticsConfiguration);
  }

  public final class FindersKt {
    method public static androidx.ui.test.SemanticsNodeInteraction find(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
    method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> findAll(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
    method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> findAllByTag(String testTag);
    method public static androidx.ui.test.SemanticsNodeInteraction findByTag(String testTag);
    method public static androidx.ui.test.SemanticsNodeInteraction findByText(String text, boolean ignoreCase = false);
  }

  public final class GoldenSemanticsKt {
    method public static void assertEquals(androidx.ui.core.semantics.SemanticsConfiguration, androidx.ui.core.semantics.SemanticsConfiguration expected);
    method public static androidx.ui.core.semantics.SemanticsConfiguration copyWith(androidx.ui.core.semantics.SemanticsConfiguration, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,kotlin.Unit> diff);
    method public static androidx.ui.core.semantics.SemanticsConfiguration createFullSemantics(Boolean? isEnabled = null, String? value = null, androidx.ui.foundation.selection.ToggleableState? toggleableState = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? isSelected = null);
  }

  public final class OutputKt {
    method public static void dumpSemantics(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> consumer);
  }

  public final class SemanticsNodeInteraction {
  }

  public final class SemanticsTreeInteractionKt {
  }

  public final class SizesTestingKt {
    method public static androidx.ui.layout.DpConstraints getBigTestConstraints();
    method public static androidx.ui.test.CollectedSizes setContentAndCollectSizes(androidx.ui.test.ComposeTestRule, androidx.ui.layout.DpConstraints parentConstraints = BigTestConstraints, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static androidx.ui.core.PxSize setContentAndGetPixelSize(androidx.ui.test.ComposeTestRule, androidx.ui.layout.DpConstraints parentConstraints = BigTestConstraints, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> performSetContent = { setContent(it) }, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

}

package androidx.ui.test.android {

  public final class AndroidComposeTestRule implements androidx.ui.test.ComposeTestRule {
    ctor public AndroidComposeTestRule(boolean disableTransitions, boolean shouldThrowOnRecomposeTimeout);
    ctor public AndroidComposeTestRule();
    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
    method public androidx.test.rule.ActivityTestRule<androidx.ui.test.android.DefaultTestActivity> getActivityTestRule();
    method public androidx.ui.core.Density getDensity();
    method public android.util.DisplayMetrics getDisplayMetrics();
    method public void runOnUiThread(kotlin.jvm.functions.Function0<kotlin.Unit> action);
    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
    property public final androidx.test.rule.ActivityTestRule<androidx.ui.test.android.DefaultTestActivity> activityTestRule;
    property public androidx.ui.core.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 DefaultTestActivity extends android.app.Activity {
    ctor public DefaultTestActivity();
    method public java.util.concurrent.CountDownLatch getHasFocusLatch();
    method public void setHasFocusLatch(java.util.concurrent.CountDownLatch p);
    property public final java.util.concurrent.CountDownLatch hasFocusLatch;
  }

}

package androidx.ui.test.android.fake {

  public final class FakeViewStructureKt {
  }

}

