gitextract_x04z9exv/ ├── .github/ │ └── workflows/ │ ├── ci-pipeline.yml │ ├── docs.yml │ └── maven_central_publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── build.gradle.kts ├── buildSrc/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── kotlin/ │ └── Versions.kt ├── composeApp/ │ ├── build.gradle.kts │ ├── karma.config.d/ │ │ └── wasm/ │ │ └── config.js │ └── src/ │ ├── androidMain/ │ │ ├── AndroidManifest.xml │ │ ├── kotlin/ │ │ │ ├── Platform.android.kt │ │ │ └── com/ │ │ │ └── atiurin/ │ │ │ └── samplekmp/ │ │ │ └── MainActivity.kt │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_launcher_background.xml │ │ ├── drawable-v24/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── values/ │ │ └── strings.xml │ ├── commonMain/ │ │ ├── composeResources/ │ │ │ └── drawable/ │ │ │ └── compose-multiplatform.xml │ │ └── kotlin/ │ │ ├── App.kt │ │ ├── Greeting.kt │ │ ├── Platform.kt │ │ ├── repositories/ │ │ │ ├── ContactRepository.kt │ │ │ └── Storage.kt │ │ └── ui/ │ │ └── screens/ │ │ └── ContactsListScreen.kt │ ├── commonTest/ │ │ └── kotlin/ │ │ ├── BaseInteractionTest.kt │ │ ├── ExampleTest.kt │ │ ├── ListTest.kt │ │ ├── UltronTestFlowTest.kt │ │ └── UltronTestFlowTest2.kt │ ├── desktopMain/ │ │ └── kotlin/ │ │ ├── Platform.jvm.kt │ │ └── main.kt │ ├── desktopTest/ │ │ └── kotlin/ │ │ └── DesktopSampleTest.kt │ ├── iosMain/ │ │ └── kotlin/ │ │ ├── MainViewController.kt │ │ └── Platform.ios.kt │ ├── iosTest/ │ │ └── kotlin/ │ │ └── IOSSampleTest.kt │ ├── jsMain/ │ │ └── kotlin/ │ │ └── Platform.js.kt │ ├── jsTest/ │ │ └── kotlin/ │ │ └── JsSampleTest.kt │ └── wasmJsMain/ │ ├── kotlin/ │ │ ├── Platform.wasmJs.kt │ │ └── main.kt │ └── resources/ │ ├── index.html │ └── styles.css ├── docs/ │ ├── .gitignore │ ├── README.md │ ├── babel.config.js │ ├── docs/ │ │ ├── android/ │ │ │ ├── _category_.json │ │ │ ├── espress.md │ │ │ ├── recyclerview.md │ │ │ ├── rootview.md │ │ │ ├── testconditions.md │ │ │ ├── uiautomator.md │ │ │ └── webview.md │ │ ├── common/ │ │ │ ├── _category_.json │ │ │ ├── allure.md │ │ │ ├── boolean.md │ │ │ ├── customassertion.md │ │ │ ├── extension.md │ │ │ ├── listeners.md │ │ │ ├── resulthandler.md │ │ │ ├── uiblock.md │ │ │ └── ultrontest.md │ │ ├── compose/ │ │ │ ├── _category_.json │ │ │ ├── android.md │ │ │ ├── api.md │ │ │ ├── index.md │ │ │ ├── lazylist.md │ │ │ └── multiplatform.md │ │ ├── index.md │ │ └── intro/ │ │ ├── _category_.json │ │ ├── configuration.md │ │ ├── connect.md │ │ └── dependencies.md │ ├── docusaurus.config.ts │ ├── package.json │ ├── sidebars.ts │ ├── src/ │ │ ├── components/ │ │ │ └── HomepageFeatures/ │ │ │ ├── index.tsx │ │ │ └── styles.module.css │ │ ├── css/ │ │ │ └── custom.css │ │ └── pages/ │ │ ├── index.module.css │ │ ├── index.tsx │ │ └── markdown-page.md │ ├── static/ │ │ └── .nojekyll │ └── tsconfig.json ├── gradle/ │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── iosApp/ │ ├── Configuration/ │ │ └── Config.xcconfig │ ├── iosApp/ │ │ ├── Assets.xcassets/ │ │ │ ├── AccentColor.colorset/ │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── ContentView.swift │ │ ├── Info.plist │ │ ├── Preview Content/ │ │ │ └── Preview Assets.xcassets/ │ │ │ └── Contents.json │ │ └── iOSApp.swift │ └── iosApp.xcodeproj/ │ └── project.pbxproj ├── prepare-emulator.bat ├── prepare-emulator.sh ├── sample-app/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── atiurin/ │ │ └── sampleapp/ │ │ ├── framework/ │ │ │ ├── CustomTestRunner.kt │ │ │ ├── DummyMetaObject.kt │ │ │ ├── Log.kt │ │ │ ├── ScreenshotLifecycleListener.kt │ │ │ ├── ultronext/ │ │ │ │ ├── UltronComposeExt.kt │ │ │ │ ├── UltronEspressoExt.kt │ │ │ │ ├── UltronEspressoWebExt.kt │ │ │ │ └── UltronUiAutomatorExt.kt │ │ │ └── utils/ │ │ │ ├── AssertUtils.kt │ │ │ ├── EspressoUtil.kt │ │ │ ├── TestDataUtils.kt │ │ │ └── TimeUtils.kt │ │ ├── pages/ │ │ │ ├── ChatPage.kt │ │ │ ├── ComposeElementsPage.kt │ │ │ ├── ComposeListPage.kt │ │ │ ├── ComposeSecondPage.kt │ │ │ ├── FriendsListPage.kt │ │ │ ├── UiElementsPage.kt │ │ │ ├── UiObject2ElementsPage.kt │ │ │ ├── UiObject2FriendsListPage.kt │ │ │ ├── UiObjectElementsPage.kt │ │ │ ├── WebViewPage.kt │ │ │ └── uiblock/ │ │ │ ├── ComposeUiBlockScreen.kt │ │ │ ├── EspressoUiBlockScreen.kt │ │ │ ├── UiObject2UiBlockScreen.kt │ │ │ └── WebElementUiBlockScreen.kt │ │ └── tests/ │ │ ├── BaseTest.kt │ │ ├── UiElementsTest.kt │ │ ├── compose/ │ │ │ ├── CheckboxTest.kt │ │ │ ├── CollectionInteractionTest.kt │ │ │ ├── ComposeConfigTest.kt │ │ │ ├── ComposeCustomAssertionTest.kt │ │ │ ├── ComposeEmptyListTest.kt │ │ │ ├── ComposeListTest.kt │ │ │ ├── ComposeListWithPositionTestTagTest.kt │ │ │ ├── ComposeUIElementsTest.kt │ │ │ ├── DefaultComponentActivityTest.kt │ │ │ ├── RunUltronUiTest.kt │ │ │ ├── SampleClassTest.kt │ │ │ ├── SemNodeInteractionObjectTest.kt │ │ │ ├── TreeTest.kt │ │ │ ├── UltronComposeUiBlockTest.kt │ │ │ └── elements/ │ │ │ └── DataPickerTest.kt │ │ ├── espresso/ │ │ │ ├── CustomClicksTest.kt │ │ │ ├── CustomMatchersTest.kt │ │ │ ├── DemoEspressoTest.kt │ │ │ ├── RecyclerPerfTest.kt │ │ │ ├── RecyclerViewTest.kt │ │ │ ├── UltronActivityRuleTest.kt │ │ │ ├── UltronEspressoConfigTest.kt │ │ │ ├── UltronEspressoUiBlockTest.kt │ │ │ ├── ViewInteractionActionsTest.kt │ │ │ ├── ViewInteractionAssertionsTest.kt │ │ │ ├── ViewTest.kt │ │ │ └── WithSuitableRootTest.kt │ │ ├── espresso_web/ │ │ │ ├── BaseWebViewTest.kt │ │ │ ├── EspressoWebUiElementsTest.kt │ │ │ ├── UltronWebDocumentTest.kt │ │ │ ├── UltronWebElementTest.kt │ │ │ ├── UltronWebElementsTest.kt │ │ │ └── UltronWebUiBlockTest.kt │ │ ├── testlifecycle/ │ │ │ ├── ExceptionsProcessingTest.kt │ │ │ ├── ParametrizedTest.kt │ │ │ ├── SetUpTearDownRuleTest.kt │ │ │ ├── UltronTestFlowTest.kt │ │ │ ├── UltronTestFlowTest2.kt │ │ │ ├── UltronTestPlan.kt │ │ │ └── UltronTestRuleSequenceMergeTest.kt │ │ └── uiautomator/ │ │ ├── UiAutomatorCustomAssertionTest.kt │ │ ├── UltronUiAutomatorPerfTest.kt │ │ ├── UltronUiObject2ActionsTest.kt │ │ ├── UltronUiObject2AssertionsTest.kt │ │ ├── UltronUiObject2ScrollTest.kt │ │ ├── UltronUiObject2UiBlockTest.kt │ │ ├── UltronUiObjectActionsTest.kt │ │ └── UltronUiObjectAssertionsTest.kt │ ├── debug/ │ │ └── AndroidManifest.xml │ └── main/ │ ├── AndroidManifest.xml │ ├── assets/ │ │ ├── webview.html │ │ └── webview_small.html │ ├── java/ │ │ └── com/ │ │ └── atiurin/ │ │ └── sampleapp/ │ │ ├── MyApplication.kt │ │ ├── activity/ │ │ │ ├── BusyActivity.kt │ │ │ ├── ChatActivity.kt │ │ │ ├── ComposeElementsActivity.kt │ │ │ ├── ComposeListActivity.kt │ │ │ ├── ComposeListWithPositionTestTagActivity.kt │ │ │ ├── ComposeRouterActivity.kt │ │ │ ├── ComposeSecondActivity.kt │ │ │ ├── CustomClicksActivity.kt │ │ │ ├── LoginActivity.kt │ │ │ ├── MainActivity.kt │ │ │ ├── ProfileActivity.kt │ │ │ ├── SplashActivity.kt │ │ │ ├── UiBlockActivity.kt │ │ │ ├── UiElementsActivity.kt │ │ │ └── WebViewActivity.kt │ │ ├── adapters/ │ │ │ ├── ContactAdapter.kt │ │ │ └── MessageAdapter.kt │ │ ├── async/ │ │ │ ├── AsyncDataLoading.kt │ │ │ ├── ContactsPresenter.kt │ │ │ ├── Either.kt │ │ │ ├── GetContacts.kt │ │ │ ├── UseCase.kt │ │ │ └── task/ │ │ │ └── CompatAsyncTask.kt │ │ ├── compose/ │ │ │ ├── ContacsList.kt │ │ │ ├── CustomButton.kt │ │ │ ├── DatePicker.kt │ │ │ ├── LinearProgressBar.kt │ │ │ ├── LoadingAnimation.kt │ │ │ ├── RadioGroup.kt │ │ │ ├── RegionsClickListener.kt │ │ │ ├── SimpleOutlinedText.kt │ │ │ ├── SwipeableNode.kt │ │ │ ├── app/ │ │ │ │ ├── App.kt │ │ │ │ ├── AppBar.kt │ │ │ │ └── AppScreen.kt │ │ │ └── screen/ │ │ │ ├── DatePickerScreen.kt │ │ │ └── NavigationScreen.kt │ │ ├── data/ │ │ │ ├── Tags.kt │ │ │ ├── entities/ │ │ │ │ ├── Contact.kt │ │ │ │ ├── Message.kt │ │ │ │ └── User.kt │ │ │ ├── loaders/ │ │ │ │ └── MessageLoader.kt │ │ │ ├── repositories/ │ │ │ │ ├── ContactRepositoty.kt │ │ │ │ ├── MessageRepository.kt │ │ │ │ └── Storage.kt │ │ │ └── viewmodel/ │ │ │ ├── ContactsViewModel.kt │ │ │ └── DataViewModel.kt │ │ ├── idlingresources/ │ │ │ ├── AbstractIdlingResource.kt │ │ │ ├── Holder.kt │ │ │ ├── IdlingHelper.kt │ │ │ └── resources/ │ │ │ ├── ChatIdlingResource.kt │ │ │ └── ContactsIdlingResource.kt │ │ ├── managers/ │ │ │ ├── AccountManager.kt │ │ │ └── PrefsManager.kt │ │ ├── utils/ │ │ │ └── TimeUtils.kt │ │ └── view/ │ │ ├── CircleImageView.java │ │ └── listeners/ │ │ └── OnSwipeTouchListener.kt │ └── res/ │ ├── drawable/ │ │ ├── background_splash.xml │ │ ├── circle.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_menu_camera.xml │ │ ├── ic_menu_gallery.xml │ │ ├── ic_menu_manage.xml │ │ ├── ic_menu_send.xml │ │ ├── ic_menu_share.xml │ │ ├── ic_menu_slideshow.xml │ │ ├── img.xml │ │ └── side_nav_bar.xml │ ├── drawable-anydpi/ │ │ ├── ic_account.xml │ │ ├── ic_attach_file.xml │ │ ├── ic_exit.xml │ │ ├── ic_messages.xml │ │ └── ic_send.xml │ ├── drawable-v24/ │ │ └── ic_launcher_foreground.xml │ ├── layout/ │ │ ├── activity_chat.xml │ │ ├── activity_custom_clicks.xml │ │ ├── activity_login.xml │ │ ├── activity_main.xml │ │ ├── activity_profile.xml │ │ ├── activity_uiblock.xml │ │ ├── activity_uielements.xml │ │ ├── activity_webview.xml │ │ ├── app_bar_main.xml │ │ ├── content_main.xml │ │ ├── list_item.xml │ │ ├── message_item.xml │ │ ├── my_text_view.xml │ │ ├── nav_header_main.xml │ │ └── ui_block_contact_item.xml │ ├── menu/ │ │ ├── activity_main_drawer.xml │ │ └── main.xml │ ├── mipmap-anydpi-v26/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ ├── values/ │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── values-v21/ │ └── styles.xml ├── settings.gradle.kts ├── ultron-allure/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── atiurin/ │ │ └── ultron/ │ │ └── allure/ │ │ ├── UltronAllureTestRunner.kt │ │ ├── attachment/ │ │ │ ├── AllureDirectoryUtil.kt │ │ │ └── AttachUtil.kt │ │ ├── condition/ │ │ │ ├── AllureConditionExecutorWrapper.kt │ │ │ └── AllureConditionsExecutor.kt │ │ ├── config/ │ │ │ ├── AllureAttachStrategy.kt │ │ │ ├── AllureConfigParams.kt │ │ │ └── UltronAllureConfig.kt │ │ ├── hierarchy/ │ │ │ └── AllureHierarchyDumper.kt │ │ ├── listeners/ │ │ │ ├── DetailedOperationAllureListener.kt │ │ │ ├── ScreenshotAttachListener.kt │ │ │ └── WindowHierarchyAttachListener.kt │ │ ├── runner/ │ │ │ ├── LogcatAttachRunListener.kt │ │ │ ├── ScreenshotAttachRunListener.kt │ │ │ ├── UltronAllureResultsTransferListener.kt │ │ │ ├── UltronAllureRunInformer.kt │ │ │ ├── UltronLogAttachRunListener.kt │ │ │ ├── UltronLogCleanerRunListener.kt │ │ │ ├── UltronTestRunListener.kt │ │ │ └── WindowHierarchyAttachRunListener.kt │ │ ├── screenshot/ │ │ │ └── AllureScreenshot.kt │ │ └── step/ │ │ └── UltronStep.kt │ └── test/ │ └── java/ │ └── com/ │ └── atiurin/ │ └── ultron/ │ └── allure/ │ └── ExampleUnitTest.kt ├── ultron-android/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ ├── main/ │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── atiurin/ │ │ │ └── ultron/ │ │ │ ├── core/ │ │ │ │ ├── config/ │ │ │ │ │ ├── UltronConfig.kt │ │ │ │ │ └── UltronConfigParams.kt │ │ │ │ ├── espresso/ │ │ │ │ │ ├── EspressoOperationExecutor.kt │ │ │ │ │ ├── EspressoOperationResult.kt │ │ │ │ │ ├── UltronEspresso.kt │ │ │ │ │ ├── UltronEspressoInteraction.kt │ │ │ │ │ ├── UltronEspressoOperation.kt │ │ │ │ │ ├── UltronEspressoOperationLifecycle.kt │ │ │ │ │ ├── UltronEspressoUiBlock.kt │ │ │ │ │ ├── action/ │ │ │ │ │ │ ├── EspressoActionExecutor.kt │ │ │ │ │ │ ├── EspressoActionType.kt │ │ │ │ │ │ ├── UltronCustomClickAction.kt │ │ │ │ │ │ ├── UltronEspressoActionParams.kt │ │ │ │ │ │ ├── UltronSwipeAction.kt │ │ │ │ │ │ └── UltronTypeTextAction.kt │ │ │ │ │ ├── assertion/ │ │ │ │ │ │ ├── EspressoAssertionExecutor.kt │ │ │ │ │ │ ├── EspressoAssertionType.kt │ │ │ │ │ │ └── UltronEspressoAssertionParams.kt │ │ │ │ │ └── recyclerview/ │ │ │ │ │ ├── RecyclerViewItemExecutor.kt │ │ │ │ │ ├── RecyclerViewItemMatchingExecutor.kt │ │ │ │ │ ├── RecyclerViewItemPositionalExecutor.kt │ │ │ │ │ ├── RecyclerViewScrollAction.kt │ │ │ │ │ ├── RecyclerViewScrollToPositionViewAction.kt │ │ │ │ │ ├── RecyclerViewUtils.kt │ │ │ │ │ ├── UltronRecyclerView.kt │ │ │ │ │ ├── UltronRecyclerViewImpl.kt │ │ │ │ │ └── UltronRecyclerViewItem.kt │ │ │ │ ├── espressoweb/ │ │ │ │ │ ├── UltronWebLifecycle.kt │ │ │ │ │ ├── operation/ │ │ │ │ │ │ ├── EspressoWebOperationType.kt │ │ │ │ │ │ ├── WebInteractionOperation.kt │ │ │ │ │ │ ├── WebInteractionOperationExecutor.kt │ │ │ │ │ │ ├── WebInteractionOperationIterationResult.kt │ │ │ │ │ │ ├── WebOperationExecutor.kt │ │ │ │ │ │ └── WebOperationResult.kt │ │ │ │ │ └── webelement/ │ │ │ │ │ ├── UltronWebDocument.kt │ │ │ │ │ ├── UltronWebElement.kt │ │ │ │ │ ├── UltronWebElementId.kt │ │ │ │ │ ├── UltronWebElementUiBlock.kt │ │ │ │ │ ├── UltronWebElementXpath.kt │ │ │ │ │ └── UltronWebElements.kt │ │ │ │ └── uiautomator/ │ │ │ │ ├── UiAutomatorActionType.kt │ │ │ │ ├── UiAutomatorAssertionType.kt │ │ │ │ ├── UiAutomatorOperation.kt │ │ │ │ ├── UiAutomatorOperationExecutor.kt │ │ │ │ ├── UiAutomatorOperationResult.kt │ │ │ │ ├── UltronUiAutomatorLifecycle.kt │ │ │ │ ├── uiobject/ │ │ │ │ │ ├── UiAutomatorUiSelectorOperation.kt │ │ │ │ │ ├── UiAutomatorUiSelectorOperationExecutor.kt │ │ │ │ │ └── UltronUiObject.kt │ │ │ │ └── uiobject2/ │ │ │ │ ├── UiAutomatorBySelectorAction.kt │ │ │ │ ├── UiAutomatorBySelectorActionExecutor.kt │ │ │ │ ├── UiAutomatorBySelectorAssertion.kt │ │ │ │ ├── UiAutomatorBySelectorAssertionExecutor.kt │ │ │ │ ├── UltronUiObject2.kt │ │ │ │ └── UltronUiObject2UiBlock.kt │ │ │ ├── custom/ │ │ │ │ └── espresso/ │ │ │ │ ├── action/ │ │ │ │ │ ├── AnonymousViewAction.kt │ │ │ │ │ ├── CustomEspressoActionType.kt │ │ │ │ │ ├── GetContentDescriptionAction.kt │ │ │ │ │ ├── GetDrawableAction.kt │ │ │ │ │ ├── GetTextAction.kt │ │ │ │ │ └── GetViewAction.kt │ │ │ │ ├── assertion/ │ │ │ │ │ ├── AnyRootAssertions.kt │ │ │ │ │ ├── CustomEspressoAssertionType.kt │ │ │ │ │ ├── DrawableAssertion.kt │ │ │ │ │ ├── ExistsEspressoViewAssertion.kt │ │ │ │ │ └── TextColorAssertion.kt │ │ │ │ ├── base/ │ │ │ │ │ ├── Checker.kt │ │ │ │ │ ├── IterableUtils.kt │ │ │ │ │ ├── RootViewPickerCreator.kt │ │ │ │ │ ├── UltronRootViewFinder.kt │ │ │ │ │ └── UltronViewFinder.kt │ │ │ │ └── matcher/ │ │ │ │ ├── AppCompatTextMatcher.kt │ │ │ │ ├── DrawableMatchers.kt │ │ │ │ ├── ElementWithAttributeMatcher.kt │ │ │ │ ├── NotUniqueViewMatchers.kt │ │ │ │ ├── SuitableRootMatcher.kt │ │ │ │ └── TextColorMatchers.kt │ │ │ ├── extensions/ │ │ │ │ ├── BitmapExt.kt │ │ │ │ ├── DataInterationExt.kt │ │ │ │ ├── DrawableExt.kt │ │ │ │ ├── MatcherViewExt.kt │ │ │ │ ├── PerfomOnViewExt.kt │ │ │ │ ├── RecyclerViewExt.kt │ │ │ │ ├── ReflectionExt.kt │ │ │ │ ├── ViewExt.kt │ │ │ │ └── ViewInteractionExt.kt │ │ │ └── utils/ │ │ │ ├── ViewGroupUtils.kt │ │ │ └── ViewUtils.kt │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ └── test/ │ └── java/ │ └── com/ │ └── atiurin/ │ └── ultron/ │ └── ExampleUnitTest.java ├── ultron-common/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ ├── androidMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── atiurin/ │ │ └── ultron/ │ │ ├── core/ │ │ │ └── config/ │ │ │ └── UltronAndroidCommonConfig.kt │ │ ├── extensions/ │ │ │ ├── AnyExt.android.kt │ │ │ ├── BundleExt.kt │ │ │ ├── DescriptionExt.kt │ │ │ └── FileExt.android.kt │ │ ├── hierarchy/ │ │ │ ├── HierarchyDumpResult.kt │ │ │ ├── HierarchyDumper.kt │ │ │ └── UiDeviceHierarchyDumper.kt │ │ ├── log/ │ │ │ ├── UltronFileLoggerImpl.android.kt │ │ │ ├── UltronLog.android.kt │ │ │ └── UltronLogcatLogger.android.kt │ │ ├── runner/ │ │ │ ├── RunListener.kt │ │ │ ├── UltronLogRunListener.kt │ │ │ ├── UltronRunInformer.kt │ │ │ └── UltronRunListener.kt │ │ ├── screenshot/ │ │ │ ├── ScreenshotResult.kt │ │ │ ├── Screenshoter.kt │ │ │ ├── UiAutomationScreenshoter.kt │ │ │ └── ViewScreenshoter.kt │ │ ├── testlifecycle/ │ │ │ ├── activity/ │ │ │ │ ├── UltronActivityRule.kt │ │ │ │ ├── UltronActivityScenario.kt │ │ │ │ └── UltronInstrumentationActivityInvoker.kt │ │ │ ├── rulesequence/ │ │ │ │ └── RuleSequence.kt │ │ │ └── setupteardown/ │ │ │ ├── Condition.kt │ │ │ ├── ConditionExecutorWrapper.kt │ │ │ ├── ConditionRule.kt │ │ │ ├── ConditionsExecutor.kt │ │ │ ├── DefaultConditionExecutorWrapper.kt │ │ │ ├── DefaultConditionsExecutor.kt │ │ │ ├── RuleSequenceTearDown.kt │ │ │ ├── SetUp.kt │ │ │ ├── SetUpRule.kt │ │ │ ├── TearDown.kt │ │ │ └── TearDownRule.kt │ │ └── utils/ │ │ ├── ActivityUtil.android.kt.kt │ │ ├── InstrumentationUtil.android.kt │ │ └── ThreadUtil.android.kt │ ├── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── atiurin/ │ │ └── ultron/ │ │ ├── annotations/ │ │ │ └── ExperimentalUltronApi.kt │ │ ├── core/ │ │ │ ├── common/ │ │ │ │ ├── AbstractOperationLifecycle.kt │ │ │ │ ├── DefaultElementInfo.kt │ │ │ │ ├── DefaultOperationIterationResult.kt │ │ │ │ ├── ElementInfo.kt │ │ │ │ ├── Operation.kt │ │ │ │ ├── OperationExecutor.kt │ │ │ │ ├── OperationIterationResult.kt │ │ │ │ ├── OperationProcessor.kt │ │ │ │ ├── OperationResult.kt │ │ │ │ ├── ResultDescriptor.kt │ │ │ │ ├── UltronOperationType.kt │ │ │ │ ├── assertion/ │ │ │ │ │ ├── DefaultOperationAssertion.kt │ │ │ │ │ ├── EmptyOperationAssertion.kt │ │ │ │ │ ├── NoListenersOperationAssertion.kt │ │ │ │ │ ├── OperationAssertion.kt │ │ │ │ │ └── SoftAssertion.kt │ │ │ │ ├── options/ │ │ │ │ │ ├── ClickOption.kt │ │ │ │ │ ├── ContentDescriptionContainsOption.kt │ │ │ │ │ ├── DoubleClickOption.kt │ │ │ │ │ ├── LongClickOption.kt │ │ │ │ │ ├── PerformCustomBlockOption.kt │ │ │ │ │ ├── TextContainsOption.kt │ │ │ │ │ └── TextEqualsOption.kt │ │ │ │ └── resultanalyzer/ │ │ │ │ ├── CheckOperationResultAnalyzer.kt │ │ │ │ ├── DefaultSoftAssertionOperationResultAnalyzer.kt │ │ │ │ ├── OperationResultAnalyzer.kt │ │ │ │ ├── SoftAssertionOperationResultAnalyzer.kt │ │ │ │ └── UltronDefaultOperationResultAnalyzer.kt │ │ │ ├── config/ │ │ │ │ └── UltronCommonConfig.kt │ │ │ └── test/ │ │ │ ├── TestMethod.kt │ │ │ ├── UltronTest.kt │ │ │ └── context/ │ │ │ ├── DefaultUltronTestContext.kt │ │ │ ├── DefaultUltronTestContextProvider.kt │ │ │ ├── UltronTestContext.kt │ │ │ └── UltronTestContextProvider.kt │ │ ├── exceptions/ │ │ │ ├── UltronAssertionBlockException.kt │ │ │ ├── UltronAssertionException.kt │ │ │ ├── UltronException.kt │ │ │ ├── UltronOperationException.kt │ │ │ ├── UltronUiAutomatorException.kt │ │ │ └── UltronWrapperException.kt │ │ ├── extensions/ │ │ │ └── AnyCommonExt.kt │ │ ├── file/ │ │ │ └── MimeType.kt │ │ ├── listeners/ │ │ │ ├── AbstractListener.kt │ │ │ ├── AbstractListenersContainer.kt │ │ │ ├── LifecycleListener.kt │ │ │ ├── LogLifecycleListener.kt │ │ │ ├── UltronLifecycleListener.kt │ │ │ └── UltronListenerUtil.kt │ │ ├── log/ │ │ │ ├── LogLevel.kt │ │ │ ├── ULogger.kt │ │ │ ├── UltronFileLogger.kt │ │ │ ├── UltronLog.kt │ │ │ └── UltronLogUtil.kt │ │ ├── page/ │ │ │ ├── Page.kt │ │ │ └── Screen.kt │ │ └── utils/ │ │ ├── AssertUtils.kt │ │ ├── ThreadUtil.kt │ │ └── TimeUtil.kt │ ├── jsWasmMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── atiurin/ │ │ └── ultron/ │ │ └── utils/ │ │ └── ThreadUtil.jsWasm.kt │ ├── jvmMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── atiurin/ │ │ └── ultron/ │ │ └── utils/ │ │ └── ThreadUtil.jvm.kt │ ├── nativeMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── atiurin/ │ │ └── ultron/ │ │ └── utils/ │ │ └── ThreadUtil.native.kt │ └── shared/ │ └── kotlin/ │ └── com/ │ └── atiurin/ │ └── ultron/ │ └── log/ │ └── UltronLog.shared.kt └── ultron-compose/ ├── build.gradle.kts ├── gradle.properties └── src/ ├── androidMain/ │ └── kotlin/ │ └── com/ │ └── atiurin/ │ └── ultron/ │ ├── core/ │ │ └── compose/ │ │ ├── ComposeRuleContainer.android.kt │ │ ├── UltronComposeUiBlockExt.kt │ │ ├── activity/ │ │ │ └── AndroidComposeTestRule.kt │ │ ├── config/ │ │ │ └── UltronComposeConfig.android.kt │ │ ├── list/ │ │ │ ├── ItemChildInteractionProvider.android.kt │ │ │ └── UltronComposeListItem.android.kt │ │ ├── listeners/ │ │ │ └── ComposDebugListener.kt │ │ └── nodeinteraction/ │ │ └── UltronComposeSemanticsNodeInteraction.android.kt │ └── extensions/ │ ├── ReflectionComposeExt.android.kt │ ├── SemanticsMatcherExt.android.kt │ └── SemanticsNodeInteractionExt.android.kt ├── commonMain/ │ └── kotlin/ │ └── com/ │ └── atiurin/ │ └── ultron/ │ ├── core/ │ │ └── compose/ │ │ ├── ComposeTestContainer.kt │ │ ├── ComposeTestEnvironment.kt │ │ ├── UltronUiTest.kt │ │ ├── config/ │ │ │ ├── UltronComposeConfig.kt │ │ │ └── UltronComposeConfigParams.kt │ │ ├── list/ │ │ │ ├── ComposeItemExecutor.kt │ │ │ ├── IndexComposeItemExecutor.kt │ │ │ ├── ItemChildInteractionProvider.kt │ │ │ ├── MatcherComposeItemExecutor.kt │ │ │ ├── PositionComposeItemExecutor.kt │ │ │ ├── UltronComposeList.kt │ │ │ └── UltronComposeListItem.kt │ │ ├── nodeinteraction/ │ │ │ ├── SwipePosition.kt │ │ │ ├── UltronComposeOffsets.kt │ │ │ ├── UltronComposeSemanticsNodeInteraction.kt │ │ │ └── UltronComposeSemanticsNodeInteractionClicks.kt │ │ ├── operation/ │ │ │ ├── ComposeOperationExecutor.kt │ │ │ ├── ComposeOperationResult.kt │ │ │ ├── ComposeOperationType.kt │ │ │ ├── UltronComposeCollectionInteraction.kt │ │ │ ├── UltronComposeOperation.kt │ │ │ ├── UltronComposeOperationLifecycle.kt │ │ │ └── UltronComposeOperationParams.kt │ │ ├── option/ │ │ │ └── ComposeSwipeOption.kt │ │ └── page/ │ │ └── UltronComposeUiBlock.kt │ └── extensions/ │ ├── AssertionsExt.kt │ ├── FiltersExt.kt │ ├── SemanticsMatcherExt.kt │ ├── SemanticsNodeExt.kt │ ├── SemanticsNodeInteractionExt.kt │ ├── SemanticsSelectorExt.kt │ └── TouchInjectionScopeExt.kt ├── jvmMain/ │ └── kotlin/ │ └── com/ │ └── atiurin/ │ └── ultron/ │ └── core/ │ └── compose/ │ └── UltronUiTest.jvm.kt ├── shared/ │ └── kotlin/ │ └── com/ │ └── atiurin/ │ └── ultron/ │ ├── core/ │ │ └── compose/ │ │ ├── config/ │ │ │ └── UltronComposeConfig.shared.kt │ │ └── list/ │ │ ├── ItemChildInteractionProvider.shared.kt │ │ └── UltronComposeListItem.shared.kt │ └── extensions/ │ └── SemanticsNodeInteractionCommonExt.shared.kt └── test/ └── java/ └── com/ └── atiurin/ └── ultron/ └── compose/ └── ExampleUnitTest.kt