diff --git a/README.md b/README.md index bcc623a9f5..37c7a1a342 100644 --- a/README.md +++ b/README.md @@ -268,11 +268,11 @@ gcloud: ## The path to the application binary file. ## The path may be in the local filesystem or in Google Cloud Storage using gs:// notation. ## Android App Bundles are specified as .aab, all other files are assumed to be APKs. - app: ../test_app/apks/app-debug.apk + app: ../test_projects/android/apks/app-debug.apk ## The path to the binary file containing instrumentation tests. ## The given path may be in the local filesystem or in Google Cloud Storage using a URL beginning with gs://. - test: ../test_app/apks/app-debug-androidTest.apk + test: ../test_projects/android/apks/app-debug-androidTest.apk ## Automatically log into the test device using a preconfigured Google account before beginning the test. ## Disabled by default. Use --auto-google-login to enable. @@ -404,9 +404,9 @@ flank: ## Include additional app/test apk pairs in the run. Apks are unique by just filename and not by path! ## If app is omitted, then the top level app is used for that pair. # additional-app-test-apks: - # - app: ../test_app/apks/app-debug.apk - # test: ../test_app/apks/app1-debug-androidTest.apk - # - test: ../test_app/apks/app2-debug-androidTest.apk + # - app: ../test_projects/android/apks/app-debug.apk + # test: ../test_projects/android/apks/app1-debug-androidTest.apk + # - test: ../test_projects/android/apks/app2-debug-androidTest.apk ## The max time this test run can execute before it is cancelled (default: unlimited). # run-timeout: 60m @@ -577,8 +577,8 @@ In CI, it may be useful to generate the file via a shell script: ``` cat << 'EOF' > ./flank.yml gcloud: - app: ../../test_app/apks/app-debug.apk - test: ../../test_app/apks/app-debug-androidTest.apk + app: ../../test_projects/android/apks/app-debug.apk + test: ../../test_projects/android/apks/app-debug-androidTest.apk EOF ``` diff --git a/docs/onboarding/1_environment_setup.md b/docs/onboarding/1_environment_setup.md index bc40337d87..050c822eeb 100644 --- a/docs/onboarding/1_environment_setup.md +++ b/docs/onboarding/1_environment_setup.md @@ -3,14 +3,14 @@ This document may be incomplete now or in the future, so if you faced any proble ### Mac 1. Install a brew, it's not mandatory but may be convenient for installing other software. -1. Currently, the zsh is default shell on a mac. If you prefer bash use `chsh -s /bin/bash`. +1. Currently, the zsh is the default shell on a mac. If you prefer bash use `chsh -s /bin/bash`. ### Env config Bunch of useful exports. You can paste them to your `.bashrc` ```bash FLANK_REPO="type path to your local flank repository" export PATH=$PATH:$HOME/$FLANK_REPO/flank/test_runner/bash -export PATH=$PATH:$HOME/$FLANK_REPO/flank/test_app/bash +export PATH=$PATH:$HOME/$FLANK_REPO/flank/test_projects/android/bash export PATH=$PATH:$HOME/Library/Android/sdk/platform-tools export PATH=$PATH:$HOME/Library/Python/2.7/bin #export PATH=$PATH:$HOME/"path to your local gcloud repository"/gcloud_cli/google-cloud-sdk/bin diff --git a/release_notes.md b/release_notes.md index b7e40ae698..bcde1b5668 100644 --- a/release_notes.md +++ b/release_notes.md @@ -11,7 +11,7 @@ - [#906](https://github.com/Flank/flank/pull/909) Added option to print iOS and Android screen orientations. ([adamfilipow92](https://github.com/adamfilipow92)) - [#907](https://github.com/Flank/flank/pull/907) Added option to print Android available locales to test against. ([piotradamczyk5](https://github.com/piotradamczyk5)) - [#913](https://github.com/Flank/flank/pull/913) Add Gradle Enterprise API example. ([pawelpasterz](https://github.com/pawelpasterz)) -- +- [#916](https://github.com/Flank/flank/pull/916) Test artifacts monorepo. ([jan-gogo](https://github.com/jan-gogo)) - ## v20.07.0 diff --git a/test_app/gradle b/test_app/gradle deleted file mode 120000 index b7b5f49c0d..0000000000 --- a/test_app/gradle +++ /dev/null @@ -1 +0,0 @@ -../test_runner/gradle \ No newline at end of file diff --git a/test_app/gradle.properties b/test_app/gradle.properties deleted file mode 120000 index aee478e347..0000000000 --- a/test_app/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -../test_runner/gradle.properties \ No newline at end of file diff --git a/test_app/gradlew b/test_app/gradlew deleted file mode 120000 index c258c94211..0000000000 --- a/test_app/gradlew +++ /dev/null @@ -1 +0,0 @@ -../test_runner/gradlew \ No newline at end of file diff --git a/test_app/gradlew.bat b/test_app/gradlew.bat deleted file mode 120000 index d5dafa4605..0000000000 --- a/test_app/gradlew.bat +++ /dev/null @@ -1 +0,0 @@ -../test_runner/gradlew.bat \ No newline at end of file diff --git a/test_app/test/apk/app-debug.apk b/test_app/test/apk/app-debug.apk deleted file mode 100644 index 1862b4ae85..0000000000 Binary files a/test_app/test/apk/app-debug.apk and /dev/null differ diff --git a/test_app/.gitignore b/test_projects/android/.gitignore similarity index 100% rename from test_app/.gitignore rename to test_projects/android/.gitignore diff --git a/test_app/apks/app-debug-androidTest.apk b/test_projects/android/apks/app-debug-androidTest.apk similarity index 100% rename from test_app/apks/app-debug-androidTest.apk rename to test_projects/android/apks/app-debug-androidTest.apk diff --git a/test_app/apks/app-debug.apk b/test_projects/android/apks/app-debug.apk similarity index 100% rename from test_app/apks/app-debug.apk rename to test_projects/android/apks/app-debug.apk diff --git a/test_app/apks/error-androidTest.apk b/test_projects/android/apks/error-androidTest.apk similarity index 100% rename from test_app/apks/error-androidTest.apk rename to test_projects/android/apks/error-androidTest.apk diff --git a/test_app/apks/flaky-androidTest.apk b/test_projects/android/apks/flaky-androidTest.apk similarity index 100% rename from test_app/apks/flaky-androidTest.apk rename to test_projects/android/apks/flaky-androidTest.apk diff --git a/test_app/apks/invalid.apk b/test_projects/android/apks/invalid.apk similarity index 100% rename from test_app/apks/invalid.apk rename to test_projects/android/apks/invalid.apk diff --git a/test_app/apks/nested/app-debug-androidTest.apk b/test_projects/android/apks/nested/app-debug-androidTest.apk similarity index 100% rename from test_app/apks/nested/app-debug-androidTest.apk rename to test_projects/android/apks/nested/app-debug-androidTest.apk diff --git a/test_app/app/.gitignore b/test_projects/android/app/.gitignore similarity index 100% rename from test_app/app/.gitignore rename to test_projects/android/app/.gitignore diff --git a/test_app/app/build.gradle b/test_projects/android/app/build.gradle similarity index 100% rename from test_app/app/build.gradle rename to test_projects/android/app/build.gradle diff --git a/test_app/app/proguard-rules.pro b/test_projects/android/app/proguard-rules.pro similarity index 100% rename from test_app/app/proguard-rules.pro rename to test_projects/android/app/proguard-rules.pro diff --git a/test_app/app/src/androidTest/java/com/example/test_app/BaseInstrumentedTest.kt b/test_projects/android/app/src/androidTest/java/com/example/test_app/BaseInstrumentedTest.kt similarity index 100% rename from test_app/app/src/androidTest/java/com/example/test_app/BaseInstrumentedTest.kt rename to test_projects/android/app/src/androidTest/java/com/example/test_app/BaseInstrumentedTest.kt diff --git a/test_app/app/src/androidTest/java/com/example/test_app/screenshot/EspressoScreenshot.kt b/test_projects/android/app/src/androidTest/java/com/example/test_app/screenshot/EspressoScreenshot.kt similarity index 100% rename from test_app/app/src/androidTest/java/com/example/test_app/screenshot/EspressoScreenshot.kt rename to test_projects/android/app/src/androidTest/java/com/example/test_app/screenshot/EspressoScreenshot.kt diff --git a/test_app/app/src/androidTest/java/com/example/test_app/screenshot/ScreenshotTestRule.kt b/test_projects/android/app/src/androidTest/java/com/example/test_app/screenshot/ScreenshotTestRule.kt similarity index 100% rename from test_app/app/src/androidTest/java/com/example/test_app/screenshot/ScreenshotTestRule.kt rename to test_projects/android/app/src/androidTest/java/com/example/test_app/screenshot/ScreenshotTestRule.kt diff --git a/test_app/app/src/androidTestMultiple/java/com.example.test_app/InstrumentedTest.kt b/test_projects/android/app/src/androidTestMultiple/java/com.example.test_app/InstrumentedTest.kt similarity index 100% rename from test_app/app/src/androidTestMultiple/java/com.example.test_app/InstrumentedTest.kt rename to test_projects/android/app/src/androidTestMultiple/java/com.example.test_app/InstrumentedTest.kt diff --git a/test_app/app/src/androidTestMultiple/java/com.example.test_app/ParameterizedTest.kt b/test_projects/android/app/src/androidTestMultiple/java/com.example.test_app/ParameterizedTest.kt similarity index 100% rename from test_app/app/src/androidTestMultiple/java/com.example.test_app/ParameterizedTest.kt rename to test_projects/android/app/src/androidTestMultiple/java/com.example.test_app/ParameterizedTest.kt diff --git a/test_app/app/src/androidTestMultiple/java/com.example.test_app/bar/BarInstrumentedTest.kt b/test_projects/android/app/src/androidTestMultiple/java/com.example.test_app/bar/BarInstrumentedTest.kt similarity index 100% rename from test_app/app/src/androidTestMultiple/java/com.example.test_app/bar/BarInstrumentedTest.kt rename to test_projects/android/app/src/androidTestMultiple/java/com.example.test_app/bar/BarInstrumentedTest.kt diff --git a/test_app/app/src/androidTestMultiple/java/com.example.test_app/foo/FooInstrumentedTest.kt b/test_projects/android/app/src/androidTestMultiple/java/com.example.test_app/foo/FooInstrumentedTest.kt similarity index 100% rename from test_app/app/src/androidTestMultiple/java/com.example.test_app/foo/FooInstrumentedTest.kt rename to test_projects/android/app/src/androidTestMultiple/java/com.example.test_app/foo/FooInstrumentedTest.kt diff --git a/test_app/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedClassParameterizedNamed.kt b/test_projects/android/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedClassParameterizedNamed.kt similarity index 100% rename from test_app/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedClassParameterizedNamed.kt rename to test_projects/android/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedClassParameterizedNamed.kt diff --git a/test_app/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedClassTestParameterized.kt b/test_projects/android/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedClassTestParameterized.kt similarity index 100% rename from test_app/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedClassTestParameterized.kt rename to test_projects/android/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedClassTestParameterized.kt diff --git a/test_app/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedMethodTestJUnitParamsRunner.kt b/test_projects/android/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedMethodTestJUnitParamsRunner.kt similarity index 100% rename from test_app/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedMethodTestJUnitParamsRunner.kt rename to test_projects/android/app/src/androidTestMultiple/java/com/example/test_app/parametrized/EspressoParametrizedMethodTestJUnitParamsRunner.kt diff --git a/test_app/app/src/androidTestSingle/java/com.example.test_app/InstrumentedTest.kt b/test_projects/android/app/src/androidTestSingle/java/com.example.test_app/InstrumentedTest.kt similarity index 100% rename from test_app/app/src/androidTestSingle/java/com.example.test_app/InstrumentedTest.kt rename to test_projects/android/app/src/androidTestSingle/java/com.example.test_app/InstrumentedTest.kt diff --git a/test_app/app/src/main/AndroidManifest.xml b/test_projects/android/app/src/main/AndroidManifest.xml similarity index 100% rename from test_app/app/src/main/AndroidManifest.xml rename to test_projects/android/app/src/main/AndroidManifest.xml diff --git a/test_app/app/src/main/java/com/example/test_app/MainActivity.kt b/test_projects/android/app/src/main/java/com/example/test_app/MainActivity.kt similarity index 100% rename from test_app/app/src/main/java/com/example/test_app/MainActivity.kt rename to test_projects/android/app/src/main/java/com/example/test_app/MainActivity.kt diff --git a/test_app/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/test_projects/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from test_app/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to test_projects/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/test_app/app/src/main/res/drawable/ic_launcher_background.xml b/test_projects/android/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from test_app/app/src/main/res/drawable/ic_launcher_background.xml rename to test_projects/android/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/test_app/app/src/main/res/layout/activity_main.xml b/test_projects/android/app/src/main/res/layout/activity_main.xml similarity index 100% rename from test_app/app/src/main/res/layout/activity_main.xml rename to test_projects/android/app/src/main/res/layout/activity_main.xml diff --git a/test_app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/test_projects/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from test_app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to test_projects/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/test_app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/test_projects/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from test_app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to test_projects/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/test_app/app/src/main/res/mipmap-hdpi/ic_launcher.png b/test_projects/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from test_app/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to test_projects/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/test_app/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/test_projects/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from test_app/app/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to test_projects/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/test_app/app/src/main/res/mipmap-mdpi/ic_launcher.png b/test_projects/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from test_app/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to test_projects/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/test_app/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/test_projects/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from test_app/app/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to test_projects/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/test_app/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/test_projects/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from test_app/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to test_projects/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/test_app/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/test_projects/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from test_app/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to test_projects/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/test_app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/test_projects/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from test_app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to test_projects/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/test_app/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/test_projects/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from test_app/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to test_projects/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/test_app/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/test_projects/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from test_app/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to test_projects/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/test_app/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/test_projects/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from test_app/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to test_projects/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/test_app/app/src/main/res/values/colors.xml b/test_projects/android/app/src/main/res/values/colors.xml similarity index 100% rename from test_app/app/src/main/res/values/colors.xml rename to test_projects/android/app/src/main/res/values/colors.xml diff --git a/test_app/app/src/main/res/values/strings.xml b/test_projects/android/app/src/main/res/values/strings.xml similarity index 100% rename from test_app/app/src/main/res/values/strings.xml rename to test_projects/android/app/src/main/res/values/strings.xml diff --git a/test_app/app/src/main/res/values/styles.xml b/test_projects/android/app/src/main/res/values/styles.xml similarity index 100% rename from test_app/app/src/main/res/values/styles.xml rename to test_projects/android/app/src/main/res/values/styles.xml diff --git a/test_app/bash/generate-multi-modules-apks.sh b/test_projects/android/bash/generate-multi-modules-apks.sh similarity index 89% rename from test_app/bash/generate-multi-modules-apks.sh rename to test_projects/android/bash/generate-multi-modules-apks.sh index ed7d44eba8..ff04b44c53 100755 --- a/test_app/bash/generate-multi-modules-apks.sh +++ b/test_projects/android/bash/generate-multi-modules-apks.sh @@ -2,9 +2,9 @@ set -euxo pipefail -PROJECT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." >/dev/null 2>&1 && pwd )" +PROJECT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../../.." >/dev/null 2>&1 && pwd )" -TEST_APP_DIR="$PROJECT_DIR/test_app" +TEST_APP_DIR="$PROJECT_DIR/test_projects/android" MULTI_MODULES_DIR="$PROJECT_DIR/test_runner/src/test/kotlin/ftl/fixtures/tmp/apk/multi-modules/" "$TEST_APP_DIR/gradlew" :multi-modules:multiapp:assemble \ @@ -30,4 +30,4 @@ MULTI_MODULES_DIR="$PROJECT_DIR/test_runner/src/test/kotlin/ftl/fixtures/tmp/apk :multi-modules:testModule20:assembleAndroidTest \ mkdir -p "$MULTI_MODULES_DIR" -find multi-modules -type f -name "*.apk" -exec cp {} "$MULTI_MODULES_DIR" \; +find multi-modules -type f -name "*.apk" -exec cp {} "$MULTI_MODULES_DIR" \; \ No newline at end of file diff --git a/test_app/bash/generate_apks.sh b/test_projects/android/bash/generate_apks.sh similarity index 100% rename from test_app/bash/generate_apks.sh rename to test_projects/android/bash/generate_apks.sh diff --git a/test_app/bash/generate_duplicated_names_apks.sh b/test_projects/android/bash/generate_duplicated_names_apks.sh similarity index 86% rename from test_app/bash/generate_duplicated_names_apks.sh rename to test_projects/android/bash/generate_duplicated_names_apks.sh index f3136e7846..18261938a9 100755 --- a/test_app/bash/generate_duplicated_names_apks.sh +++ b/test_projects/android/bash/generate_duplicated_names_apks.sh @@ -12,7 +12,7 @@ TEST_APP_DIR="$DIR/.." dir2:testModule:assembleAndroidTest \ dir3:testModule:assembleAndroidTest \ -APKS_DIR="$TEST_APP_DIR/../test_runner/src/test/kotlin/ftl/fixtures/tmp/apk/duplicated_names" +APKS_DIR="$TEST_APP_DIR/../../test_runner/src/test/kotlin/ftl/fixtures/tmp/apk/duplicated_names" for INDEX in 0 1 2 3 do DIR_NAME="dir$INDEX" diff --git a/test_app/bash/test_filters.sh b/test_projects/android/bash/test_filters.sh similarity index 100% rename from test_app/bash/test_filters.sh rename to test_projects/android/bash/test_filters.sh diff --git a/test_app/build.gradle b/test_projects/android/build.gradle similarity index 100% rename from test_app/build.gradle rename to test_projects/android/build.gradle diff --git a/test_app/dir0/testModule/.gitignore b/test_projects/android/dir0/testModule/.gitignore similarity index 100% rename from test_app/dir0/testModule/.gitignore rename to test_projects/android/dir0/testModule/.gitignore diff --git a/test_app/dir0/testModule/build.gradle b/test_projects/android/dir0/testModule/build.gradle similarity index 100% rename from test_app/dir0/testModule/build.gradle rename to test_projects/android/dir0/testModule/build.gradle diff --git a/test_app/dir0/testModule/src/androidTest/java/com/example/test/DuplicatedApkNameTests.kt b/test_projects/android/dir0/testModule/src/androidTest/java/com/example/test/DuplicatedApkNameTests.kt similarity index 100% rename from test_app/dir0/testModule/src/androidTest/java/com/example/test/DuplicatedApkNameTests.kt rename to test_projects/android/dir0/testModule/src/androidTest/java/com/example/test/DuplicatedApkNameTests.kt diff --git a/test_app/dir0/testModule/src/main/AndroidManifest.xml b/test_projects/android/dir0/testModule/src/main/AndroidManifest.xml similarity index 100% rename from test_app/dir0/testModule/src/main/AndroidManifest.xml rename to test_projects/android/dir0/testModule/src/main/AndroidManifest.xml diff --git a/test_app/dir1/testModule/.gitignore b/test_projects/android/dir1/testModule/.gitignore similarity index 100% rename from test_app/dir1/testModule/.gitignore rename to test_projects/android/dir1/testModule/.gitignore diff --git a/test_app/dir1/testModule/build.gradle b/test_projects/android/dir1/testModule/build.gradle similarity index 100% rename from test_app/dir1/testModule/build.gradle rename to test_projects/android/dir1/testModule/build.gradle diff --git a/test_app/dir1/testModule/src/androidTest/java/com/example/test1/DuplicatedApkNameTests.kt b/test_projects/android/dir1/testModule/src/androidTest/java/com/example/test1/DuplicatedApkNameTests.kt similarity index 100% rename from test_app/dir1/testModule/src/androidTest/java/com/example/test1/DuplicatedApkNameTests.kt rename to test_projects/android/dir1/testModule/src/androidTest/java/com/example/test1/DuplicatedApkNameTests.kt diff --git a/test_app/dir1/testModule/src/main/AndroidManifest.xml b/test_projects/android/dir1/testModule/src/main/AndroidManifest.xml similarity index 100% rename from test_app/dir1/testModule/src/main/AndroidManifest.xml rename to test_projects/android/dir1/testModule/src/main/AndroidManifest.xml diff --git a/test_app/dir2/testModule/.gitignore b/test_projects/android/dir2/testModule/.gitignore similarity index 100% rename from test_app/dir2/testModule/.gitignore rename to test_projects/android/dir2/testModule/.gitignore diff --git a/test_app/dir2/testModule/build.gradle b/test_projects/android/dir2/testModule/build.gradle similarity index 100% rename from test_app/dir2/testModule/build.gradle rename to test_projects/android/dir2/testModule/build.gradle diff --git a/test_app/dir2/testModule/src/androidTest/java/com/example/test2/DuplicatedApkNameTests.kt b/test_projects/android/dir2/testModule/src/androidTest/java/com/example/test2/DuplicatedApkNameTests.kt similarity index 100% rename from test_app/dir2/testModule/src/androidTest/java/com/example/test2/DuplicatedApkNameTests.kt rename to test_projects/android/dir2/testModule/src/androidTest/java/com/example/test2/DuplicatedApkNameTests.kt diff --git a/test_app/dir2/testModule/src/main/AndroidManifest.xml b/test_projects/android/dir2/testModule/src/main/AndroidManifest.xml similarity index 100% rename from test_app/dir2/testModule/src/main/AndroidManifest.xml rename to test_projects/android/dir2/testModule/src/main/AndroidManifest.xml diff --git a/test_app/dir3/testModule/.gitignore b/test_projects/android/dir3/testModule/.gitignore similarity index 100% rename from test_app/dir3/testModule/.gitignore rename to test_projects/android/dir3/testModule/.gitignore diff --git a/test_app/dir3/testModule/build.gradle b/test_projects/android/dir3/testModule/build.gradle similarity index 100% rename from test_app/dir3/testModule/build.gradle rename to test_projects/android/dir3/testModule/build.gradle diff --git a/test_app/dir3/testModule/src/androidTest/java/com/example/test3/DuplicatedApkNameTests.kt b/test_projects/android/dir3/testModule/src/androidTest/java/com/example/test3/DuplicatedApkNameTests.kt similarity index 100% rename from test_app/dir3/testModule/src/androidTest/java/com/example/test3/DuplicatedApkNameTests.kt rename to test_projects/android/dir3/testModule/src/androidTest/java/com/example/test3/DuplicatedApkNameTests.kt diff --git a/test_app/dir3/testModule/src/main/AndroidManifest.xml b/test_projects/android/dir3/testModule/src/main/AndroidManifest.xml similarity index 100% rename from test_app/dir3/testModule/src/main/AndroidManifest.xml rename to test_projects/android/dir3/testModule/src/main/AndroidManifest.xml diff --git a/test_app/flank.yml b/test_projects/android/flank.yml similarity index 100% rename from test_app/flank.yml rename to test_projects/android/flank.yml diff --git a/test_projects/android/gradle.properties b/test_projects/android/gradle.properties new file mode 100644 index 0000000000..0e5e6ca363 --- /dev/null +++ b/test_projects/android/gradle.properties @@ -0,0 +1,15 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2560m +kotlin.code.style=official +org.gradle.parallel=true + diff --git a/test_projects/android/gradle/wrapper/gradle-wrapper.jar b/test_projects/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..490fda8577 Binary files /dev/null and b/test_projects/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/test_projects/android/gradle/wrapper/gradle-wrapper.properties b/test_projects/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..186b71557c --- /dev/null +++ b/test_projects/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/test_projects/android/gradlew b/test_projects/android/gradlew new file mode 100755 index 0000000000..2fe81a7d95 --- /dev/null +++ b/test_projects/android/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/test_projects/android/gradlew.bat b/test_projects/android/gradlew.bat new file mode 100644 index 0000000000..62bd9b9cce --- /dev/null +++ b/test_projects/android/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/test_app/multi-modules/fullyIgnoredModule/build.gradle b/test_projects/android/multi-modules/fullyIgnoredModule/build.gradle similarity index 100% rename from test_app/multi-modules/fullyIgnoredModule/build.gradle rename to test_projects/android/multi-modules/fullyIgnoredModule/build.gradle diff --git a/test_app/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ModuleTests.kt b/test_projects/android/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ModuleTests.kt rename to test_projects/android/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ModuleTests.kt diff --git a/test_app/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ModuleTests2.kt b/test_projects/android/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ModuleTests2.kt rename to test_projects/android/multi-modules/fullyIgnoredModule/src/androidTest/java/com/example/fullyIgnoredModule/ModuleTests2.kt diff --git a/test_app/multi-modules/fullyIgnoredModule/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/fullyIgnoredModule/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/fullyIgnoredModule/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/fullyIgnoredModule/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/multiapp/.gitignore b/test_projects/android/multi-modules/multiapp/.gitignore similarity index 100% rename from test_app/multi-modules/multiapp/.gitignore rename to test_projects/android/multi-modules/multiapp/.gitignore diff --git a/test_app/multi-modules/multiapp/build.gradle b/test_projects/android/multi-modules/multiapp/build.gradle similarity index 100% rename from test_app/multi-modules/multiapp/build.gradle rename to test_projects/android/multi-modules/multiapp/build.gradle diff --git a/test_app/multi-modules/multiapp/proguard-rules.pro b/test_projects/android/multi-modules/multiapp/proguard-rules.pro similarity index 100% rename from test_app/multi-modules/multiapp/proguard-rules.pro rename to test_projects/android/multi-modules/multiapp/proguard-rules.pro diff --git a/test_app/multi-modules/multiapp/src/androidTest/java/com/example/multiapp/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/multiapp/src/androidTest/java/com/example/multiapp/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/multiapp/src/androidTest/java/com/example/multiapp/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/multiapp/src/androidTest/java/com/example/multiapp/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/multiapp/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/multiapp/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/multiapp/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/multiapp/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/multiapp/src/main/java/com/example/multiapp/MainActivity.kt b/test_projects/android/multi-modules/multiapp/src/main/java/com/example/multiapp/MainActivity.kt similarity index 100% rename from test_app/multi-modules/multiapp/src/main/java/com/example/multiapp/MainActivity.kt rename to test_projects/android/multi-modules/multiapp/src/main/java/com/example/multiapp/MainActivity.kt diff --git a/test_app/multi-modules/multiapp/src/main/res/drawable/ic_launcher_background.xml b/test_projects/android/multi-modules/multiapp/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/drawable/ic_launcher_background.xml rename to test_projects/android/multi-modules/multiapp/src/main/res/drawable/ic_launcher_background.xml diff --git a/test_app/multi-modules/multiapp/src/main/res/layout/activity_main.xml b/test_projects/android/multi-modules/multiapp/src/main/res/layout/activity_main.xml similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/layout/activity_main.xml rename to test_projects/android/multi-modules/multiapp/src/main/res/layout/activity_main.xml diff --git a/test_app/multi-modules/multiapp/src/main/res/menu/menu_main.xml b/test_projects/android/multi-modules/multiapp/src/main/res/menu/menu_main.xml similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/menu/menu_main.xml rename to test_projects/android/multi-modules/multiapp/src/main/res/menu/menu_main.xml diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-hdpi/ic_launcher.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-hdpi/ic_launcher.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-hdpi/ic_launcher_round.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-mdpi/ic_launcher.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-mdpi/ic_launcher.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-mdpi/ic_launcher_round.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-xhdpi/ic_launcher.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-xhdpi/ic_launcher.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-xxhdpi/ic_launcher.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/test_app/multi-modules/multiapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to test_projects/android/multi-modules/multiapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/test_app/multi-modules/multiapp/src/main/res/values/colors.xml b/test_projects/android/multi-modules/multiapp/src/main/res/values/colors.xml similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/values/colors.xml rename to test_projects/android/multi-modules/multiapp/src/main/res/values/colors.xml diff --git a/test_app/multi-modules/multiapp/src/main/res/values/dimens.xml b/test_projects/android/multi-modules/multiapp/src/main/res/values/dimens.xml similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/values/dimens.xml rename to test_projects/android/multi-modules/multiapp/src/main/res/values/dimens.xml diff --git a/test_app/multi-modules/multiapp/src/main/res/values/strings.xml b/test_projects/android/multi-modules/multiapp/src/main/res/values/strings.xml similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/values/strings.xml rename to test_projects/android/multi-modules/multiapp/src/main/res/values/strings.xml diff --git a/test_app/multi-modules/multiapp/src/main/res/values/styles.xml b/test_projects/android/multi-modules/multiapp/src/main/res/values/styles.xml similarity index 100% rename from test_app/multi-modules/multiapp/src/main/res/values/styles.xml rename to test_projects/android/multi-modules/multiapp/src/main/res/values/styles.xml diff --git a/test_app/multi-modules/multiapp/src/test/java/com/example/multiapp/ExampleUnitTest.kt b/test_projects/android/multi-modules/multiapp/src/test/java/com/example/multiapp/ExampleUnitTest.kt similarity index 100% rename from test_app/multi-modules/multiapp/src/test/java/com/example/multiapp/ExampleUnitTest.kt rename to test_projects/android/multi-modules/multiapp/src/test/java/com/example/multiapp/ExampleUnitTest.kt diff --git a/test_app/multi-modules/testModule/.gitignore b/test_projects/android/multi-modules/testModule/.gitignore similarity index 100% rename from test_app/multi-modules/testModule/.gitignore rename to test_projects/android/multi-modules/testModule/.gitignore diff --git a/test_app/multi-modules/testModule/build.gradle b/test_projects/android/multi-modules/testModule/build.gradle similarity index 100% rename from test_app/multi-modules/testModule/build.gradle rename to test_projects/android/multi-modules/testModule/build.gradle diff --git a/test_app/multi-modules/testModule/src/androidTest/java/com/example/testModule/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule/src/androidTest/java/com/example/testModule/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule/src/androidTest/java/com/example/testModule/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule/src/androidTest/java/com/example/testModule/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule/src/androidTest/java/com/example/testModule/ModuleTests.kt b/test_projects/android/multi-modules/testModule/src/androidTest/java/com/example/testModule/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule/src/androidTest/java/com/example/testModule/ModuleTests.kt rename to test_projects/android/multi-modules/testModule/src/androidTest/java/com/example/testModule/ModuleTests.kt diff --git a/test_app/multi-modules/testModule/src/androidTest/java/com/example/testModule/ModuleTests2.kt b/test_projects/android/multi-modules/testModule/src/androidTest/java/com/example/testModule/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule/src/androidTest/java/com/example/testModule/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule/src/androidTest/java/com/example/testModule/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule/src/main/java/com/example/testModule/Module1Class.kt b/test_projects/android/multi-modules/testModule/src/main/java/com/example/testModule/Module1Class.kt similarity index 100% rename from test_app/multi-modules/testModule/src/main/java/com/example/testModule/Module1Class.kt rename to test_projects/android/multi-modules/testModule/src/main/java/com/example/testModule/Module1Class.kt diff --git a/test_app/multi-modules/testModule/src/test/java/com/example/common/ExampleUnitTest.kt b/test_projects/android/multi-modules/testModule/src/test/java/com/example/common/ExampleUnitTest.kt similarity index 100% rename from test_app/multi-modules/testModule/src/test/java/com/example/common/ExampleUnitTest.kt rename to test_projects/android/multi-modules/testModule/src/test/java/com/example/common/ExampleUnitTest.kt diff --git a/test_app/multi-modules/testModule1/.gitignore b/test_projects/android/multi-modules/testModule1/.gitignore similarity index 100% rename from test_app/multi-modules/testModule1/.gitignore rename to test_projects/android/multi-modules/testModule1/.gitignore diff --git a/test_app/multi-modules/testModule1/build.gradle b/test_projects/android/multi-modules/testModule1/build.gradle similarity index 100% rename from test_app/multi-modules/testModule1/build.gradle rename to test_projects/android/multi-modules/testModule1/build.gradle diff --git a/test_app/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ModuleTests.kt b/test_projects/android/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ModuleTests.kt rename to test_projects/android/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ModuleTests.kt diff --git a/test_app/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ModuleTests2.kt b/test_projects/android/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule1/src/androidTest/java/com/example/testmodule1/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule1/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule1/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule1/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule1/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule1/src/test/java/com/example/testmodule1/ExampleUnitTest.kt b/test_projects/android/multi-modules/testModule1/src/test/java/com/example/testmodule1/ExampleUnitTest.kt similarity index 100% rename from test_app/multi-modules/testModule1/src/test/java/com/example/testmodule1/ExampleUnitTest.kt rename to test_projects/android/multi-modules/testModule1/src/test/java/com/example/testmodule1/ExampleUnitTest.kt diff --git a/test_app/multi-modules/testModule10/.gitignore b/test_projects/android/multi-modules/testModule10/.gitignore similarity index 100% rename from test_app/multi-modules/testModule10/.gitignore rename to test_projects/android/multi-modules/testModule10/.gitignore diff --git a/test_app/multi-modules/testModule10/build.gradle b/test_projects/android/multi-modules/testModule10/build.gradle similarity index 100% rename from test_app/multi-modules/testModule10/build.gradle rename to test_projects/android/multi-modules/testModule10/build.gradle diff --git a/test_app/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ModuleTests.kt b/test_projects/android/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ModuleTests.kt rename to test_projects/android/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ModuleTests.kt diff --git a/test_app/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ModuleTests2.kt b/test_projects/android/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule10/src/androidTest/java/com/example/testModule10/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule10/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule10/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule10/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule10/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule11/.gitignore b/test_projects/android/multi-modules/testModule11/.gitignore similarity index 100% rename from test_app/multi-modules/testModule11/.gitignore rename to test_projects/android/multi-modules/testModule11/.gitignore diff --git a/test_app/multi-modules/testModule11/build.gradle b/test_projects/android/multi-modules/testModule11/build.gradle similarity index 100% rename from test_app/multi-modules/testModule11/build.gradle rename to test_projects/android/multi-modules/testModule11/build.gradle diff --git a/test_app/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ModuleTests.kt b/test_projects/android/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ModuleTests.kt rename to test_projects/android/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ModuleTests.kt diff --git a/test_app/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ModuleTests2.kt b/test_projects/android/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule11/src/androidTest/java/com/example/testModule11/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule11/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule11/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule11/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule11/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule12/.gitignore b/test_projects/android/multi-modules/testModule12/.gitignore similarity index 100% rename from test_app/multi-modules/testModule12/.gitignore rename to test_projects/android/multi-modules/testModule12/.gitignore diff --git a/test_app/multi-modules/testModule12/build.gradle b/test_projects/android/multi-modules/testModule12/build.gradle similarity index 100% rename from test_app/multi-modules/testModule12/build.gradle rename to test_projects/android/multi-modules/testModule12/build.gradle diff --git a/test_app/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ModuleTests.kt b/test_projects/android/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ModuleTests.kt rename to test_projects/android/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ModuleTests.kt diff --git a/test_app/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ModuleTests2.kt b/test_projects/android/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule12/src/androidTest/java/com/example/testModule12/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule12/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule12/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule12/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule12/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule13/.gitignore b/test_projects/android/multi-modules/testModule13/.gitignore similarity index 100% rename from test_app/multi-modules/testModule13/.gitignore rename to test_projects/android/multi-modules/testModule13/.gitignore diff --git a/test_app/multi-modules/testModule13/build.gradle b/test_projects/android/multi-modules/testModule13/build.gradle similarity index 100% rename from test_app/multi-modules/testModule13/build.gradle rename to test_projects/android/multi-modules/testModule13/build.gradle diff --git a/test_app/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ModuleTests.kt b/test_projects/android/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ModuleTests.kt rename to test_projects/android/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ModuleTests.kt diff --git a/test_app/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ModuleTests2.kt b/test_projects/android/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule13/src/androidTest/java/com/example/testModule13/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule13/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule13/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule13/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule13/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule14/.gitignore b/test_projects/android/multi-modules/testModule14/.gitignore similarity index 100% rename from test_app/multi-modules/testModule14/.gitignore rename to test_projects/android/multi-modules/testModule14/.gitignore diff --git a/test_app/multi-modules/testModule14/build.gradle b/test_projects/android/multi-modules/testModule14/build.gradle similarity index 100% rename from test_app/multi-modules/testModule14/build.gradle rename to test_projects/android/multi-modules/testModule14/build.gradle diff --git a/test_app/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ModuleTests.kt b/test_projects/android/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ModuleTests.kt rename to test_projects/android/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ModuleTests.kt diff --git a/test_app/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ModuleTests2.kt b/test_projects/android/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule14/src/androidTest/java/com/example/testModule14/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule14/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule14/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule14/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule14/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule15/.gitignore b/test_projects/android/multi-modules/testModule15/.gitignore similarity index 100% rename from test_app/multi-modules/testModule15/.gitignore rename to test_projects/android/multi-modules/testModule15/.gitignore diff --git a/test_app/multi-modules/testModule15/build.gradle b/test_projects/android/multi-modules/testModule15/build.gradle similarity index 100% rename from test_app/multi-modules/testModule15/build.gradle rename to test_projects/android/multi-modules/testModule15/build.gradle diff --git a/test_app/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ModuleTests.kt b/test_projects/android/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ModuleTests.kt rename to test_projects/android/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ModuleTests.kt diff --git a/test_app/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ModuleTests2.kt b/test_projects/android/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule15/src/androidTest/java/com/example/testModule15/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule15/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule15/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule15/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule15/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule16/.gitignore b/test_projects/android/multi-modules/testModule16/.gitignore similarity index 100% rename from test_app/multi-modules/testModule16/.gitignore rename to test_projects/android/multi-modules/testModule16/.gitignore diff --git a/test_app/multi-modules/testModule16/build.gradle b/test_projects/android/multi-modules/testModule16/build.gradle similarity index 100% rename from test_app/multi-modules/testModule16/build.gradle rename to test_projects/android/multi-modules/testModule16/build.gradle diff --git a/test_app/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ModuleTests.kt b/test_projects/android/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ModuleTests.kt rename to test_projects/android/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ModuleTests.kt diff --git a/test_app/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ModuleTests2.kt b/test_projects/android/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule16/src/androidTest/java/com/example/testModule16/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule16/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule16/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule16/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule16/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule17/.gitignore b/test_projects/android/multi-modules/testModule17/.gitignore similarity index 100% rename from test_app/multi-modules/testModule17/.gitignore rename to test_projects/android/multi-modules/testModule17/.gitignore diff --git a/test_app/multi-modules/testModule17/build.gradle b/test_projects/android/multi-modules/testModule17/build.gradle similarity index 100% rename from test_app/multi-modules/testModule17/build.gradle rename to test_projects/android/multi-modules/testModule17/build.gradle diff --git a/test_app/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ModuleTests.kt b/test_projects/android/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ModuleTests.kt rename to test_projects/android/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ModuleTests.kt diff --git a/test_app/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ModuleTests2.kt b/test_projects/android/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule17/src/androidTest/java/com/example/testModule17/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule17/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule17/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule17/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule17/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule18/.gitignore b/test_projects/android/multi-modules/testModule18/.gitignore similarity index 100% rename from test_app/multi-modules/testModule18/.gitignore rename to test_projects/android/multi-modules/testModule18/.gitignore diff --git a/test_app/multi-modules/testModule18/build.gradle b/test_projects/android/multi-modules/testModule18/build.gradle similarity index 100% rename from test_app/multi-modules/testModule18/build.gradle rename to test_projects/android/multi-modules/testModule18/build.gradle diff --git a/test_app/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ModuleTests.kt b/test_projects/android/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ModuleTests.kt rename to test_projects/android/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ModuleTests.kt diff --git a/test_app/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ModuleTests2.kt b/test_projects/android/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule18/src/androidTest/java/com/example/testModule18/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule18/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule18/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule18/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule18/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule19/.gitignore b/test_projects/android/multi-modules/testModule19/.gitignore similarity index 100% rename from test_app/multi-modules/testModule19/.gitignore rename to test_projects/android/multi-modules/testModule19/.gitignore diff --git a/test_app/multi-modules/testModule19/build.gradle b/test_projects/android/multi-modules/testModule19/build.gradle similarity index 100% rename from test_app/multi-modules/testModule19/build.gradle rename to test_projects/android/multi-modules/testModule19/build.gradle diff --git a/test_app/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ModuleTests.kt b/test_projects/android/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ModuleTests.kt rename to test_projects/android/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ModuleTests.kt diff --git a/test_app/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ModuleTests2.kt b/test_projects/android/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule19/src/androidTest/java/com/example/testModule19/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule19/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule19/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule19/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule19/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule2/build.gradle b/test_projects/android/multi-modules/testModule2/build.gradle similarity index 100% rename from test_app/multi-modules/testModule2/build.gradle rename to test_projects/android/multi-modules/testModule2/build.gradle diff --git a/test_app/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ModuleTests.kt b/test_projects/android/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ModuleTests.kt rename to test_projects/android/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ModuleTests.kt diff --git a/test_app/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ModuleTests2.kt b/test_projects/android/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule2/src/androidTest/java/com/example/testmodule2/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule2/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule2/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule2/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule2/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule20/.gitignore b/test_projects/android/multi-modules/testModule20/.gitignore similarity index 100% rename from test_app/multi-modules/testModule20/.gitignore rename to test_projects/android/multi-modules/testModule20/.gitignore diff --git a/test_app/multi-modules/testModule20/build.gradle b/test_projects/android/multi-modules/testModule20/build.gradle similarity index 100% rename from test_app/multi-modules/testModule20/build.gradle rename to test_projects/android/multi-modules/testModule20/build.gradle diff --git a/test_app/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ModuleTests.kt b/test_projects/android/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ModuleTests.kt rename to test_projects/android/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ModuleTests.kt diff --git a/test_app/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ModuleTests2.kt b/test_projects/android/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule20/src/androidTest/java/com/example/testmodule20/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule20/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule20/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule20/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule20/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule3/build.gradle b/test_projects/android/multi-modules/testModule3/build.gradle similarity index 100% rename from test_app/multi-modules/testModule3/build.gradle rename to test_projects/android/multi-modules/testModule3/build.gradle diff --git a/test_app/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ModuleTests.kt b/test_projects/android/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ModuleTests.kt rename to test_projects/android/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ModuleTests.kt diff --git a/test_app/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ModuleTests3.kt b/test_projects/android/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ModuleTests3.kt similarity index 100% rename from test_app/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ModuleTests3.kt rename to test_projects/android/multi-modules/testModule3/src/androidTest/java/com/example/testModule3/ModuleTests3.kt diff --git a/test_app/multi-modules/testModule3/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule3/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule3/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule3/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule4/.gitignore b/test_projects/android/multi-modules/testModule4/.gitignore similarity index 100% rename from test_app/multi-modules/testModule4/.gitignore rename to test_projects/android/multi-modules/testModule4/.gitignore diff --git a/test_app/multi-modules/testModule4/build.gradle b/test_projects/android/multi-modules/testModule4/build.gradle similarity index 100% rename from test_app/multi-modules/testModule4/build.gradle rename to test_projects/android/multi-modules/testModule4/build.gradle diff --git a/test_app/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ModuleTests.kt b/test_projects/android/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ModuleTests.kt rename to test_projects/android/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ModuleTests.kt diff --git a/test_app/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ModuleTests2.kt b/test_projects/android/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule4/src/androidTest/java/com/example/testModule4/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule4/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule4/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule4/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule4/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule5/.gitignore b/test_projects/android/multi-modules/testModule5/.gitignore similarity index 100% rename from test_app/multi-modules/testModule5/.gitignore rename to test_projects/android/multi-modules/testModule5/.gitignore diff --git a/test_app/multi-modules/testModule5/build.gradle b/test_projects/android/multi-modules/testModule5/build.gradle similarity index 100% rename from test_app/multi-modules/testModule5/build.gradle rename to test_projects/android/multi-modules/testModule5/build.gradle diff --git a/test_app/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ModuleTests.kt b/test_projects/android/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ModuleTests.kt rename to test_projects/android/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ModuleTests.kt diff --git a/test_app/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ModuleTests5.kt b/test_projects/android/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ModuleTests5.kt similarity index 100% rename from test_app/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ModuleTests5.kt rename to test_projects/android/multi-modules/testModule5/src/androidTest/java/com/example/testModule5/ModuleTests5.kt diff --git a/test_app/multi-modules/testModule5/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule5/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule5/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule5/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule6/.gitignore b/test_projects/android/multi-modules/testModule6/.gitignore similarity index 100% rename from test_app/multi-modules/testModule6/.gitignore rename to test_projects/android/multi-modules/testModule6/.gitignore diff --git a/test_app/multi-modules/testModule6/build.gradle b/test_projects/android/multi-modules/testModule6/build.gradle similarity index 100% rename from test_app/multi-modules/testModule6/build.gradle rename to test_projects/android/multi-modules/testModule6/build.gradle diff --git a/test_app/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ModuleTests.kt b/test_projects/android/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ModuleTests.kt rename to test_projects/android/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ModuleTests.kt diff --git a/test_app/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ModuleTests2.kt b/test_projects/android/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule6/src/androidTest/java/com/example/testModule6/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule6/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule6/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule6/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule6/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule6/src/test/java/com/example/testmodule1/ExampleUnitTest.kt b/test_projects/android/multi-modules/testModule6/src/test/java/com/example/testmodule1/ExampleUnitTest.kt similarity index 100% rename from test_app/multi-modules/testModule6/src/test/java/com/example/testmodule1/ExampleUnitTest.kt rename to test_projects/android/multi-modules/testModule6/src/test/java/com/example/testmodule1/ExampleUnitTest.kt diff --git a/test_app/multi-modules/testModule7/.gitignore b/test_projects/android/multi-modules/testModule7/.gitignore similarity index 100% rename from test_app/multi-modules/testModule7/.gitignore rename to test_projects/android/multi-modules/testModule7/.gitignore diff --git a/test_app/multi-modules/testModule7/build.gradle b/test_projects/android/multi-modules/testModule7/build.gradle similarity index 100% rename from test_app/multi-modules/testModule7/build.gradle rename to test_projects/android/multi-modules/testModule7/build.gradle diff --git a/test_app/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ModuleTests.kt b/test_projects/android/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ModuleTests.kt rename to test_projects/android/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ModuleTests.kt diff --git a/test_app/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ModuleTests2.kt b/test_projects/android/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule7/src/androidTest/java/com/example/testModule7/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule7/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule7/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule7/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule7/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule7/src/test/java/com/example/testmodule1/ExampleUnitTest.kt b/test_projects/android/multi-modules/testModule7/src/test/java/com/example/testmodule1/ExampleUnitTest.kt similarity index 100% rename from test_app/multi-modules/testModule7/src/test/java/com/example/testmodule1/ExampleUnitTest.kt rename to test_projects/android/multi-modules/testModule7/src/test/java/com/example/testmodule1/ExampleUnitTest.kt diff --git a/test_app/multi-modules/testModule8/.gitignore b/test_projects/android/multi-modules/testModule8/.gitignore similarity index 100% rename from test_app/multi-modules/testModule8/.gitignore rename to test_projects/android/multi-modules/testModule8/.gitignore diff --git a/test_app/multi-modules/testModule8/build.gradle b/test_projects/android/multi-modules/testModule8/build.gradle similarity index 100% rename from test_app/multi-modules/testModule8/build.gradle rename to test_projects/android/multi-modules/testModule8/build.gradle diff --git a/test_app/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ModuleTests.kt b/test_projects/android/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ModuleTests.kt rename to test_projects/android/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ModuleTests.kt diff --git a/test_app/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ModuleTests2.kt b/test_projects/android/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule8/src/androidTest/java/com/example/testModule8/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule8/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule8/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule8/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule8/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModule8/src/test/java/com/example/testmodule1/ExampleUnitTest.kt b/test_projects/android/multi-modules/testModule8/src/test/java/com/example/testmodule1/ExampleUnitTest.kt similarity index 100% rename from test_app/multi-modules/testModule8/src/test/java/com/example/testmodule1/ExampleUnitTest.kt rename to test_projects/android/multi-modules/testModule8/src/test/java/com/example/testmodule1/ExampleUnitTest.kt diff --git a/test_app/multi-modules/testModule9/.gitignore b/test_projects/android/multi-modules/testModule9/.gitignore similarity index 100% rename from test_app/multi-modules/testModule9/.gitignore rename to test_projects/android/multi-modules/testModule9/.gitignore diff --git a/test_app/multi-modules/testModule9/build.gradle b/test_projects/android/multi-modules/testModule9/build.gradle similarity index 100% rename from test_app/multi-modules/testModule9/build.gradle rename to test_projects/android/multi-modules/testModule9/build.gradle diff --git a/test_app/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ExampleInstrumentedTest.kt b/test_projects/android/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ExampleInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ExampleInstrumentedTest.kt rename to test_projects/android/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ExampleInstrumentedTest.kt diff --git a/test_app/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ModuleTests.kt b/test_projects/android/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ModuleTests.kt similarity index 100% rename from test_app/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ModuleTests.kt rename to test_projects/android/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ModuleTests.kt diff --git a/test_app/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ModuleTests2.kt b/test_projects/android/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ModuleTests2.kt similarity index 100% rename from test_app/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ModuleTests2.kt rename to test_projects/android/multi-modules/testModule9/src/androidTest/java/com/example/testModule9/ModuleTests2.kt diff --git a/test_app/multi-modules/testModule9/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModule9/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModule9/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModule9/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModuleCommon/.gitignore b/test_projects/android/multi-modules/testModuleCommon/.gitignore similarity index 100% rename from test_app/multi-modules/testModuleCommon/.gitignore rename to test_projects/android/multi-modules/testModuleCommon/.gitignore diff --git a/test_app/multi-modules/testModuleCommon/build.gradle b/test_projects/android/multi-modules/testModuleCommon/build.gradle similarity index 100% rename from test_app/multi-modules/testModuleCommon/build.gradle rename to test_projects/android/multi-modules/testModuleCommon/build.gradle diff --git a/test_app/multi-modules/testModuleCommon/src/androidTest/java/com/example/common/SeparatedCommonTest.kt b/test_projects/android/multi-modules/testModuleCommon/src/androidTest/java/com/example/common/SeparatedCommonTest.kt similarity index 100% rename from test_app/multi-modules/testModuleCommon/src/androidTest/java/com/example/common/SeparatedCommonTest.kt rename to test_projects/android/multi-modules/testModuleCommon/src/androidTest/java/com/example/common/SeparatedCommonTest.kt diff --git a/test_app/multi-modules/testModuleCommon/src/main/AndroidManifest.xml b/test_projects/android/multi-modules/testModuleCommon/src/main/AndroidManifest.xml similarity index 100% rename from test_app/multi-modules/testModuleCommon/src/main/AndroidManifest.xml rename to test_projects/android/multi-modules/testModuleCommon/src/main/AndroidManifest.xml diff --git a/test_app/multi-modules/testModuleCommon/src/main/java/com/example/common/CommonInstrumentedTest.kt b/test_projects/android/multi-modules/testModuleCommon/src/main/java/com/example/common/CommonInstrumentedTest.kt similarity index 100% rename from test_app/multi-modules/testModuleCommon/src/main/java/com/example/common/CommonInstrumentedTest.kt rename to test_projects/android/multi-modules/testModuleCommon/src/main/java/com/example/common/CommonInstrumentedTest.kt diff --git a/test_app/multi-modules/testModuleCommon/src/test/java/com/example/common/ExampleUnitTest.kt b/test_projects/android/multi-modules/testModuleCommon/src/test/java/com/example/common/ExampleUnitTest.kt similarity index 100% rename from test_app/multi-modules/testModuleCommon/src/test/java/com/example/common/ExampleUnitTest.kt rename to test_projects/android/multi-modules/testModuleCommon/src/test/java/com/example/common/ExampleUnitTest.kt diff --git a/test_app/settings.gradle b/test_projects/android/settings.gradle similarity index 100% rename from test_app/settings.gradle rename to test_projects/android/settings.gradle diff --git a/test_app/gohello/.gitignore b/test_projects/gohello/.gitignore similarity index 100% rename from test_app/gohello/.gitignore rename to test_projects/gohello/.gitignore diff --git a/test_app/gohello/build.sh b/test_projects/gohello/build.sh similarity index 100% rename from test_app/gohello/build.sh rename to test_projects/gohello/build.sh diff --git a/test_app/gohello/go.mod b/test_projects/gohello/go.mod similarity index 100% rename from test_app/gohello/go.mod rename to test_projects/gohello/go.mod diff --git a/test_app/gohello/main.go b/test_projects/gohello/main.go similarity index 100% rename from test_app/gohello/main.go rename to test_projects/gohello/main.go diff --git a/test_projects/ios/EarlGreyExample/.gitignore b/test_projects/ios/EarlGreyExample/.gitignore new file mode 100644 index 0000000000..4003300b15 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/.gitignore @@ -0,0 +1,6 @@ +results/ +.DS_Store +Pods/ +Podfile.lock +xcuserdata/ +*.xcworkspace/ diff --git a/test_projects/ios/EarlGreyExample/Cartfile.private b/test_projects/ios/EarlGreyExample/Cartfile.private new file mode 100644 index 0000000000..af613f6806 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/Cartfile.private @@ -0,0 +1 @@ +github "google/EarlGrey" "master" diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/project.pbxproj b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..86e31df388 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/project.pbxproj @@ -0,0 +1,771 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2CB731501C29E54A00CF35C1 /* EarlGreyExampleSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CB7314F1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests.swift */; }; + 2CB7315A1C29E8E600CF35C1 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */; }; + 2CB7315B1C29E8F400CF35C1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5F5A53591ADE670C00F81DF0 /* Main.storyboard */; }; + 2CE7FA481C35AAB00079DE2F /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CE7FA471C35AAB00079DE2F /* ViewController.swift */; }; + 43B9CF95CB86CA7BDB94BC22 /* EarlGrey.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30458E6EA62788C672D341BD /* EarlGrey.framework */; }; + 517D2BB32B84B46C74ACF76E /* Pods_EarlGreyExampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B02EBE064F84893161A1BDF1 /* Pods_EarlGreyExampleTests.framework */; }; + 5F5A537E1ADE67D500F81DF0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F5A537D1ADE67D500F81DF0 /* AppDelegate.swift */; }; + 5F99610B1AE0CF4F0034F503 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961061AE0CF4F0034F503 /* Images.xcassets */; }; + 5FDE055D1B0DAA090037B82F /* EarlGreyExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FDE055C1B0DAA090037B82F /* EarlGreyExampleTests.m */; }; + 98B78EE8FECFC807129A9B61 /* EarlGrey.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30458E6EA62788C672D341BD /* EarlGrey.framework */; }; + AF90B914C0B9954981958AD7 /* EarlGrey.framework in EarlGrey Copy Files */ = {isa = PBXBuildFile; fileRef = 30458E6EA62788C672D341BD /* EarlGrey.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + D86EFD464BCAB30D8CF715E2 /* EarlGrey.framework in EarlGrey Copy Files */ = {isa = PBXBuildFile; fileRef = 30458E6EA62788C672D341BD /* EarlGrey.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + FD983D6A1D67E0BE0059F4CC /* EarlGrey.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD983D691D67E0BE0059F4CC /* EarlGrey.swift */; }; + FE17CED20CB2E96C5E915AB5 /* Pods_EarlGreyExampleSwiftTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE462CCB606B955EBC25A7A6 /* Pods_EarlGreyExampleSwiftTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 2CB731521C29E54A00CF35C1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5F5A53441ADE670C00F81DF0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5F5A53781ADE67D500F81DF0; + remoteInfo = EarlGreyExampleSwift; + }; + 2CE9D3321C344E3F000E6C9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5F5A53441ADE670C00F81DF0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5F5A53781ADE67D500F81DF0; + remoteInfo = EarlGreyExampleSwift; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1956B30E151A788EAC215A71 /* EarlGrey Copy Files */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(TEST_HOST)/../"; + dstSubfolderSpec = 0; + files = ( + AF90B914C0B9954981958AD7 /* EarlGrey.framework in EarlGrey Copy Files */, + ); + name = "EarlGrey Copy Files"; + runOnlyForDeploymentPostprocessing = 0; + }; + 70B129A1281EA24A3FC4DE45 /* EarlGrey Copy Files */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(TEST_HOST)/../"; + dstSubfolderSpec = 0; + files = ( + D86EFD464BCAB30D8CF715E2 /* EarlGrey.framework in EarlGrey Copy Files */, + ); + name = "EarlGrey Copy Files"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1676FBBCE58AFA8E25C3BAC2 /* Pods-EarlGreyExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EarlGreyExampleTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-EarlGreyExampleTests/Pods-EarlGreyExampleTests.debug.xcconfig"; sourceTree = ""; }; + 2CB7314D1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EarlGreyExampleSwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2CB7314F1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EarlGreyExampleSwiftTests.swift; sourceTree = ""; }; + 2CB731511C29E54A00CF35C1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2CE7FA471C35AAB00079DE2F /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 30458E6EA62788C672D341BD /* EarlGrey.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = EarlGrey.framework; path = Pods/EarlGrey/EarlGrey/EarlGrey.framework; sourceTree = SOURCE_ROOT; }; + 3BAE975E1CB1AB7508455ECD /* Pods-EarlGreyExampleSwiftTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EarlGreyExampleSwiftTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-EarlGreyExampleSwiftTests/Pods-EarlGreyExampleSwiftTests.debug.xcconfig"; sourceTree = ""; }; + 5F5A53501ADE670C00F81DF0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = ../EarlGreyExample/Info.plist; sourceTree = ""; }; + 5F5A535A1ADE670C00F81DF0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5F5A53791ADE67D500F81DF0 /* EarlGreyExampleSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = EarlGreyExampleSwift.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5F5A537D1ADE67D500F81DF0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5F9961061AE0CF4F0034F503 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = SOURCE_ROOT; }; + 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = SOURCE_ROOT; }; + 5FDE05581B0DAA090037B82F /* EarlGreyExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EarlGreyExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 5FDE055C1B0DAA090037B82F /* EarlGreyExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EarlGreyExampleTests.m; sourceTree = ""; }; + 79869E9F8BAF297BD262C9F8 /* Pods-EarlGreyExampleSwiftTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EarlGreyExampleSwiftTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-EarlGreyExampleSwiftTests/Pods-EarlGreyExampleSwiftTests.release.xcconfig"; sourceTree = ""; }; + 8C563C1E162825ACD796DD57 /* Pods-EarlGreyExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EarlGreyExampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-EarlGreyExampleTests/Pods-EarlGreyExampleTests.release.xcconfig"; sourceTree = ""; }; + B02EBE064F84893161A1BDF1 /* Pods_EarlGreyExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EarlGreyExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BE462CCB606B955EBC25A7A6 /* Pods_EarlGreyExampleSwiftTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EarlGreyExampleSwiftTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FD983D691D67E0BE0059F4CC /* EarlGrey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EarlGrey.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2CB7314A1C29E54A00CF35C1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 43B9CF95CB86CA7BDB94BC22 /* EarlGrey.framework in Frameworks */, + FE17CED20CB2E96C5E915AB5 /* Pods_EarlGreyExampleSwiftTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5F5A53761ADE67D500F81DF0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5FDE05551B0DAA090037B82F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 98B78EE8FECFC807129A9B61 /* EarlGrey.framework in Frameworks */, + 517D2BB32B84B46C74ACF76E /* Pods_EarlGreyExampleTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2CB7314E1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests */ = { + isa = PBXGroup; + children = ( + FD983D691D67E0BE0059F4CC /* EarlGrey.swift */, + 2CB7314F1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests.swift */, + 2CB731511C29E54A00CF35C1 /* Info.plist */, + ); + path = EarlGreyExampleSwiftTests; + sourceTree = ""; + }; + 397A9767214A451548874623 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 30458E6EA62788C672D341BD /* EarlGrey.framework */, + BE462CCB606B955EBC25A7A6 /* Pods_EarlGreyExampleSwiftTests.framework */, + B02EBE064F84893161A1BDF1 /* Pods_EarlGreyExampleTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 5F5A53431ADE670C00F81DF0 = { + isa = PBXGroup; + children = ( + 5F5A537A1ADE67D500F81DF0 /* EarlGreyExampleSwift */, + 5FDE05591B0DAA090037B82F /* EarlGreyExampleTests */, + 2CB7314E1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests */, + 5F5A534D1ADE670C00F81DF0 /* Products */, + 5F9961041AE0CF4F0034F503 /* Shared */, + 397A9767214A451548874623 /* Frameworks */, + EACA53D86CAFAAC9074D448C /* Pods */, + ); + sourceTree = ""; + wrapsLines = 0; + }; + 5F5A534D1ADE670C00F81DF0 /* Products */ = { + isa = PBXGroup; + children = ( + 5F5A53791ADE67D500F81DF0 /* EarlGreyExampleSwift.app */, + 5FDE05581B0DAA090037B82F /* EarlGreyExampleTests.xctest */, + 2CB7314D1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 5F5A537A1ADE67D500F81DF0 /* EarlGreyExampleSwift */ = { + isa = PBXGroup; + children = ( + 5F5A537D1ADE67D500F81DF0 /* AppDelegate.swift */, + 5F5A537B1ADE67D500F81DF0 /* Supporting Files */, + 2CE7FA471C35AAB00079DE2F /* ViewController.swift */, + ); + path = EarlGreyExampleSwift; + sourceTree = ""; + }; + 5F5A537B1ADE67D500F81DF0 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 5F5A53501ADE670C00F81DF0 /* Info.plist */, + 5F5A53591ADE670C00F81DF0 /* Main.storyboard */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 5F9961041AE0CF4F0034F503 /* Shared */ = { + isa = PBXGroup; + children = ( + 5F9961061AE0CF4F0034F503 /* Images.xcassets */, + 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */, + ); + name = Shared; + path = ../shared; + sourceTree = ""; + }; + 5FDE05591B0DAA090037B82F /* EarlGreyExampleTests */ = { + isa = PBXGroup; + children = ( + 5FDE055C1B0DAA090037B82F /* EarlGreyExampleTests.m */, + ); + path = EarlGreyExampleTests; + sourceTree = ""; + }; + EACA53D86CAFAAC9074D448C /* Pods */ = { + isa = PBXGroup; + children = ( + 3BAE975E1CB1AB7508455ECD /* Pods-EarlGreyExampleSwiftTests.debug.xcconfig */, + 79869E9F8BAF297BD262C9F8 /* Pods-EarlGreyExampleSwiftTests.release.xcconfig */, + 1676FBBCE58AFA8E25C3BAC2 /* Pods-EarlGreyExampleTests.debug.xcconfig */, + 8C563C1E162825ACD796DD57 /* Pods-EarlGreyExampleTests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 2CB7314C1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2CB731541C29E54A00CF35C1 /* Build configuration list for PBXNativeTarget "EarlGreyExampleSwiftTests" */; + buildPhases = ( + 4E0ABCA0541CD21983DF6A11 /* [CP] Check Pods Manifest.lock */, + 2CB731491C29E54A00CF35C1 /* Sources */, + 2CB7314A1C29E54A00CF35C1 /* Frameworks */, + 2CB7314B1C29E54A00CF35C1 /* Resources */, + 1956B30E151A788EAC215A71 /* EarlGrey Copy Files */, + 1F85CDCBA363EC6F8EF3C76B /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 2CB731531C29E54A00CF35C1 /* PBXTargetDependency */, + ); + name = EarlGreyExampleSwiftTests; + productName = EarlGreyExampleSwiftTests; + productReference = 2CB7314D1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 5F5A53781ADE67D500F81DF0 /* EarlGreyExampleSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5F5A53991ADE67D500F81DF0 /* Build configuration list for PBXNativeTarget "EarlGreyExampleSwift" */; + buildPhases = ( + 5F5A53751ADE67D500F81DF0 /* Sources */, + 5F5A53761ADE67D500F81DF0 /* Frameworks */, + 5F5A53771ADE67D500F81DF0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = EarlGreyExampleSwift; + productName = EarlGreyExampleSwift; + productReference = 5F5A53791ADE67D500F81DF0 /* EarlGreyExampleSwift.app */; + productType = "com.apple.product-type.application"; + }; + 5FDE05571B0DAA090037B82F /* EarlGreyExampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5FDE05621B0DAA090037B82F /* Build configuration list for PBXNativeTarget "EarlGreyExampleTests" */; + buildPhases = ( + 60D2EC5C304601693C28D9DB /* [CP] Check Pods Manifest.lock */, + 5FDE05541B0DAA090037B82F /* Sources */, + 5FDE05551B0DAA090037B82F /* Frameworks */, + 5FDE05561B0DAA090037B82F /* Resources */, + 70B129A1281EA24A3FC4DE45 /* EarlGrey Copy Files */, + BC774C933F4837A9FDC02927 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 2CE9D3331C344E3F000E6C9F /* PBXTargetDependency */, + ); + name = EarlGreyExampleTests; + productName = EarlGreyExampleTests; + productReference = 5FDE05581B0DAA090037B82F /* EarlGreyExampleTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5F5A53441ADE670C00F81DF0 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = "Google Inc."; + TargetAttributes = { + 2CB7314C1C29E54A00CF35C1 = { + CreatedOnToolsVersion = 7.2; + DevelopmentTeam = H86XEK7ZTM; + LastSwiftMigration = 0800; + TestTargetID = 5F5A53781ADE67D500F81DF0; + }; + 5F5A53781ADE67D500F81DF0 = { + CreatedOnToolsVersion = 6.3; + DevelopmentTeam = H86XEK7ZTM; + LastSwiftMigration = 0800; + }; + 5FDE05571B0DAA090037B82F = { + CreatedOnToolsVersion = 6.3.2; + DevelopmentTeam = H86XEK7ZTM; + TestTargetID = 5F5A53781ADE67D500F81DF0; + }; + }; + }; + buildConfigurationList = 5F5A53471ADE670C00F81DF0 /* Build configuration list for PBXProject "EarlGreyExample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 5F5A53431ADE670C00F81DF0; + productRefGroup = 5F5A534D1ADE670C00F81DF0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5F5A53781ADE67D500F81DF0 /* EarlGreyExampleSwift */, + 5FDE05571B0DAA090037B82F /* EarlGreyExampleTests */, + 2CB7314C1C29E54A00CF35C1 /* EarlGreyExampleSwiftTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2CB7314B1C29E54A00CF35C1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5F5A53771ADE67D500F81DF0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2CB7315B1C29E8F400CF35C1 /* Main.storyboard in Resources */, + 2CB7315A1C29E8E600CF35C1 /* LaunchScreen.xib in Resources */, + 5F99610B1AE0CF4F0034F503 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5FDE05561B0DAA090037B82F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 1F85CDCBA363EC6F8EF3C76B /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-EarlGreyExampleSwiftTests/Pods-EarlGreyExampleSwiftTests-frameworks.sh", + "${PODS_ROOT}/EarlGrey/EarlGrey/EarlGrey.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/EarlGrey.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-EarlGreyExampleSwiftTests/Pods-EarlGreyExampleSwiftTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 4E0ABCA0541CD21983DF6A11 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-EarlGreyExampleSwiftTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 60D2EC5C304601693C28D9DB /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-EarlGreyExampleTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + BC774C933F4837A9FDC02927 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-EarlGreyExampleTests/Pods-EarlGreyExampleTests-frameworks.sh", + "${PODS_ROOT}/EarlGrey/EarlGrey/EarlGrey.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/EarlGrey.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-EarlGreyExampleTests/Pods-EarlGreyExampleTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 2CB731491C29E54A00CF35C1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FD983D6A1D67E0BE0059F4CC /* EarlGrey.swift in Sources */, + 2CB731501C29E54A00CF35C1 /* EarlGreyExampleSwiftTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5F5A53751ADE67D500F81DF0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2CE7FA481C35AAB00079DE2F /* ViewController.swift in Sources */, + 5F5A537E1ADE67D500F81DF0 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5FDE05541B0DAA090037B82F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5FDE055D1B0DAA090037B82F /* EarlGreyExampleTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 2CB731531C29E54A00CF35C1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5F5A53781ADE67D500F81DF0 /* EarlGreyExampleSwift */; + targetProxy = 2CB731521C29E54A00CF35C1 /* PBXContainerItemProxy */; + }; + 2CE9D3331C344E3F000E6C9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5F5A53781ADE67D500F81DF0 /* EarlGreyExampleSwift */; + targetProxy = 2CE9D3321C344E3F000E6C9F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 5F5A53591ADE670C00F81DF0 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5F5A535A1ADE670C00F81DF0 /* Base */, + ); + name = Main.storyboard; + path = ../EarlGreyExample; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 2CB731551C29E54A00CF35C1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3BAE975E1CB1AB7508455ECD /* Pods-EarlGreyExampleSwiftTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = H86XEK7ZTM; + ENABLE_TESTABILITY = YES; + INFOPLIST_FILE = EarlGreyExampleSwiftTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGreySwiftTests; + PRODUCT_MODULE_NAME = EarlGreyExampleTestsSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/EarlGreyExampleSwift.app/EarlGreyExampleSwift"; + }; + name = Debug; + }; + 2CB731561C29E54A00CF35C1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 79869E9F8BAF297BD262C9F8 /* Pods-EarlGreyExampleSwiftTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = H86XEK7ZTM; + INFOPLIST_FILE = EarlGreyExampleSwiftTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGreySwiftTests; + PRODUCT_MODULE_NAME = EarlGreyExampleTestsSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/EarlGreyExampleSwift.app/EarlGreyExampleSwift"; + }; + name = Release; + }; + 5F5A536D1ADE670C00F81DF0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + COPY_PHASE_STRIP = NO; + DEFINES_MODULE = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_MODULE_NAME = EarlGreyExample; + PRODUCT_NAME = EarlGreyExample; + SDKROOT = iphoneos; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5F5A536E1ADE670C00F81DF0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + COPY_PHASE_STRIP = YES; + DEFINES_MODULE = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_MODULE_NAME = EarlGreyExample; + PRODUCT_NAME = EarlGreyExample; + SDKROOT = iphoneos; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5F5A53951ADE67D500F81DF0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = H86XEK7ZTM; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + INFOPLIST_FILE = "$(SRCROOT)/EarlGreyExample/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGrey3; + PRODUCT_MODULE_NAME = EarlGreyExampleSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 5F5A53961ADE67D500F81DF0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = H86XEK7ZTM; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + INFOPLIST_FILE = "$(SRCROOT)/EarlGreyExample/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGrey3; + PRODUCT_MODULE_NAME = EarlGreyExampleSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; + 5FDE05601B0DAA090037B82F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1676FBBCE58AFA8E25C3BAC2 /* Pods-EarlGreyExampleTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = H86XEK7ZTM; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + EarlGreyExample, + $CONFIGURATION_TEMP_DIR/EarlGreyExampleSwift.build/DerivedSources, + ); + INFOPLIST_FILE = EarlGreyExample/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGreyTests; + PRODUCT_MODULE_NAME = EarlGreyExampleTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "EarlGreyExampleSwift-Swift.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = ""; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/EarlGreyExampleSwift.app/EarlGreyExampleSwift"; + }; + name = Debug; + }; + 5FDE05611B0DAA090037B82F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8C563C1E162825ACD796DD57 /* Pods-EarlGreyExampleTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = H86XEK7ZTM; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + EarlGreyExample, + $CONFIGURATION_TEMP_DIR/EarlGreyExampleSwift.build/DerivedSources, + ); + INFOPLIST_FILE = EarlGreyExample/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGreyTests; + PRODUCT_MODULE_NAME = EarlGreyExampleTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "EarlGreyExampleSwift-Swift.h"; + SWIFT_VERSION = ""; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/EarlGreyExampleSwift.app/EarlGreyExampleSwift"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2CB731541C29E54A00CF35C1 /* Build configuration list for PBXNativeTarget "EarlGreyExampleSwiftTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2CB731551C29E54A00CF35C1 /* Debug */, + 2CB731561C29E54A00CF35C1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5F5A53471ADE670C00F81DF0 /* Build configuration list for PBXProject "EarlGreyExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5F5A536D1ADE670C00F81DF0 /* Debug */, + 5F5A536E1ADE670C00F81DF0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5F5A53991ADE67D500F81DF0 /* Build configuration list for PBXNativeTarget "EarlGreyExampleSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5F5A53951ADE67D500F81DF0 /* Debug */, + 5F5A53961ADE67D500F81DF0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5FDE05621B0DAA090037B82F /* Build configuration list for PBXNativeTarget "EarlGreyExampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5FDE05601B0DAA090037B82F /* Debug */, + 5FDE05611B0DAA090037B82F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5F5A53441ADE670C00F81DF0 /* Project object */; +} diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleSwiftTests.xcscheme b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleSwiftTests.xcscheme new file mode 100644 index 0000000000..f696d36ce8 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleSwiftTests.xcscheme @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleTests.xcscheme b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleTests.xcscheme new file mode 100644 index 0000000000..339efeb9b1 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleTests.xcscheme @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExample/Base.lproj/Main.storyboard b/test_projects/ios/EarlGreyExample/EarlGreyExample/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..ebc274b2f7 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExample/Base.lproj/Main.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExample/Info.plist b/test_projects/ios/EarlGreyExample/EarlGreyExample/Info.plist new file mode 100644 index 0000000000..9be04fae8b --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExample/Info.plist @@ -0,0 +1,69 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIcons + + CFBundleIcons~ipad + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + license + + + Copyright 2016 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExampleSwift/AppDelegate.swift b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwift/AppDelegate.swift new file mode 100644 index 0000000000..5965b518b3 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwift/AppDelegate.swift @@ -0,0 +1,28 @@ +// +// Copyright 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + return true + } +} + diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExampleSwift/ViewController.swift b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwift/ViewController.swift new file mode 100644 index 0000000000..1c7e517b7a --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwift/ViewController.swift @@ -0,0 +1,148 @@ +// +// Copyright 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { + + var tableItems = (1...50).map { $0 } + + override func viewDidLoad() { + super.viewDidLoad() + + // Create the send message view to contain one of the two send buttons + let sendMessageView = SendMessageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) + sendMessageView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(sendMessageView) + + // Create buttons + let clickMe = createButton("ClickMe") + view.addSubview(clickMe) + let send = createButton("Send") + // Change label to identify this button more easily for the layout test + send.accessibilityLabel = "SendForLayoutTest" + view.addSubview(send) + let send2 = createButton("Send") + sendMessageView.addSubview(send2) + + // Create a UITableView to send some elements out of the screen + let table = createTable() + view.addSubview(table) + + // Create constraints + let views = ["clickMe": clickMe, "send": send, "send2": send2, "table": table, + "sendMessageView": sendMessageView] + let metrics = ["smallMargin": 10, "mediumMargin": 20, "largeMargin": 40, "buttonSize": 100, + "tableSize": 320] + var allConstraints = [NSLayoutConstraint]() + let verticalConstraints = NSLayoutConstraint.constraints( + withVisualFormat: "V:|-largeMargin-[clickMe]-largeMargin-[send2]-largeMargin-[table]|", + options: [], + metrics: metrics, + views: views) + allConstraints += verticalConstraints + let buttonsHorizontalConstraints = NSLayoutConstraint.constraints( + withVisualFormat: "|-smallMargin-[clickMe(buttonSize)]-mediumMargin-[send(buttonSize)]", + options:.alignAllTop, + metrics: metrics, + views: views) + allConstraints += buttonsHorizontalConstraints + let sendMessageViewConstraints = NSLayoutConstraint.constraints( + withVisualFormat: "|-smallMargin-[send2(buttonSize)]", + options:.alignAllTop, + metrics: metrics, + views: views) + allConstraints += sendMessageViewConstraints + let tableConstraints = NSLayoutConstraint.constraints( + withVisualFormat: "|-smallMargin-[table(tableSize)]", + options:.alignAllTop, + metrics: metrics, + views: views) + allConstraints += tableConstraints + NSLayoutConstraint.activate(allConstraints) + } + + func createButton(_ title: String) -> UIButton { + let button = UIButton(type: .system) + button.frame = CGRect(x: 0, y: 0, width: 100, height: 100) + button.backgroundColor = UIColor.green + button.setTitle(title, for: UIControlState()) + button.addTarget(self, action: #selector(ViewController.buttonAction(_:)), + for: .touchUpInside) + button.accessibilityIdentifier = title + button.accessibilityLabel = title + button.translatesAutoresizingMaskIntoConstraints = false + return button + } + + @objc func buttonAction(_ sender: UIButton!) { + if let id = sender.accessibilityIdentifier { + print("Button \(id) clicked") + } + } + + func createTable() -> UITableView { + let tableView = UITableView() + tableView.frame = CGRect(x: 0, y: 0, width: 320, height: 200) + tableView.delegate = self + tableView.dataSource = self + tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.estimatedRowHeight = 85.0 + tableView.rowHeight = UITableViewAutomaticDimension + tableView.accessibilityIdentifier = "table" + return tableView + } + + func numberOfSections(in tableView:UITableView) -> Int { + return 1 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return tableItems.count + } + + func tableView(_ tableView: UITableView, + cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell:UITableViewCell = + tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell + // For cell 1 to 7, add a date + var cellID : String + if ((indexPath as NSIndexPath).row >= 1 && (indexPath as NSIndexPath).row <= 7) { + cellID = getDateForIndex((indexPath as NSIndexPath).row) + } else { + cellID = "Cell\(tableItems[(indexPath as NSIndexPath).row])" + } + cell.textLabel?.text = cellID + cell.accessibilityIdentifier = cellID + return cell + } + + func getDateForIndex(_ index: Int) -> String { + var date = Date() + var dateDeltaComponents = DateComponents() + dateDeltaComponents.day = index + date = (Calendar.current as NSCalendar).date( + byAdding: dateDeltaComponents, to: date, options: NSCalendar.Options(rawValue: 0))! + let formatter = DateFormatter() + formatter.dateStyle = .long + return formatter.string(from: date) + } +} + +@objc class SendMessageView: UIView { + // empty sub class of UIView to exercise inRoot +} diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGrey.swift b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGrey.swift new file mode 100644 index 0000000000..f36384f4ee --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGrey.swift @@ -0,0 +1,188 @@ +// +// Copyright 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import EarlGrey +import Foundation + +public func GREYAssert(_ expression: @autoclosure () -> Bool, reason: String) { + GREYAssert(expression, reason, details: "Expected expression to be true") +} + +public func GREYAssertTrue(_ expression: @autoclosure () -> Bool, reason: String) { + GREYAssert(expression(), reason, details: "Expected the boolean expression to be true") +} + +public func GREYAssertFalse(_ expression: @autoclosure () -> Bool, reason: String) { + GREYAssert(!expression(), reason, details: "Expected the boolean expression to be false") +} + +public func GREYAssertNotNil(_ expression: @autoclosure ()-> Any?, reason: String) { + GREYAssert(expression() != nil, reason, details: "Expected expression to be not nil") +} + +public func GREYAssertNil(_ expression: @autoclosure () -> Any?, reason: String) { + GREYAssert(expression() == nil, reason, details: "Expected expression to be nil") +} + +public func GREYAssertEqual(_ left: @autoclosure () -> AnyObject?, + _ right: @autoclosure () -> AnyObject?, reason: String) { + GREYAssert(left() === right(), reason, details: "Expected left term to be equal to right term") +} + +public func GREYAssertNotEqual(_ left: @autoclosure () -> AnyObject?, + _ right: @autoclosure () -> AnyObject?, reason: String) { + GREYAssert(left() !== right(), reason, details: "Expected left term to not equal the right term") +} + +public func GREYAssertEqualObjects( _ left: @autoclosure () -> T?, + _ right: @autoclosure () -> T?, + reason: String) { + GREYAssert(left() == right(), reason, details: "Expected object of the left term to be equal " + + "to the object of the right term") +} + +public func GREYAssertNotEqualObjects( _ left: @autoclosure () -> T?, + _ right: @autoclosure () -> T?, + reason: String) { + GREYAssert(left() != right(), reason, details: "Expected object of the left term to not " + + "equal the object of the right term") +} + +public func GREYFail(_ reason: String) { + EarlGrey.handle(exception: GREYFrameworkException(name: kGREYAssertionFailedException, + reason: reason), + details: "") +} + +public func GREYFailWithDetails(_ reason: String, details: String) { + EarlGrey.handle(exception: GREYFrameworkException(name: kGREYAssertionFailedException, + reason: reason), + details: details) +} + +private func GREYAssert(_ expression: @autoclosure () -> Bool, + _ reason: String, details: String) { + GREYSetCurrentAsFailable() + GREYWaitUntilIdle() + if !expression() { + EarlGrey.handle(exception: GREYFrameworkException(name: kGREYAssertionFailedException, + reason: reason), + details: details) + } +} + +private func GREYSetCurrentAsFailable() { + let greyFailureHandlerSelector = + #selector(GREYFailureHandler.setInvocationFile(_:andInvocationLine:)) + let greyFailureHandler = + Thread.current.threadDictionary.value(forKey: kGREYFailureHandlerKey) as! GREYFailureHandler + if greyFailureHandler.responds(to: greyFailureHandlerSelector) { + greyFailureHandler.setInvocationFile!(#file, andInvocationLine:#line) + } +} + +private func GREYWaitUntilIdle() { + GREYUIThreadExecutor.sharedInstance().drainUntilIdle() +} + +open class EarlGrey: NSObject { + public static func selectElement(with matcher: GREYMatcher, + file: StaticString = #file, + line: UInt = #line) -> GREYInteraction { + return EarlGreyImpl.invoked(fromFile: file.description, lineNumber: line) + .selectElement(with: matcher) + } + + @available(*, deprecated, renamed: "selectElement(with:)") + open class func select(elementWithMatcher matcher:GREYMatcher, + file: StaticString = #file, + line: UInt = #line) -> GREYElementInteraction { + return EarlGreyImpl.invoked(fromFile: file.description, lineNumber: line) + .selectElement(with: matcher) + } + + open class func setFailureHandler(handler: GREYFailureHandler, + file: StaticString = #file, + line: UInt = #line) { + return EarlGreyImpl.invoked(fromFile: file.description, lineNumber: line) + .setFailureHandler(handler) + } + + open class func handle(exception: GREYFrameworkException, + details: String, + file: StaticString = #file, + line: UInt = #line) { + return EarlGreyImpl.invoked(fromFile: file.description, lineNumber: line) + .handle(exception, details: details) + } + + @discardableResult open class func rotateDeviceTo(orientation: UIDeviceOrientation, + errorOrNil: UnsafeMutablePointer!, + file: StaticString = #file, + line: UInt = #line) + -> Bool { + return EarlGreyImpl.invoked(fromFile: file.description, lineNumber: line) + .rotateDevice(to: orientation, + errorOrNil: errorOrNil) + } +} + +extension GREYInteraction { + @discardableResult public func assert(_ matcher: @autoclosure () -> GREYMatcher) -> Self { + return self.__assert(with: matcher()) + } + + @discardableResult public func assert(_ matcher: @autoclosure () -> GREYMatcher, + error:UnsafeMutablePointer!) -> Self { + return self.__assert(with: matcher(), error: error) + } + + @available(*, deprecated, renamed: "assert(_:)") + @discardableResult public func assert(with matcher: GREYMatcher!) -> Self { + return self.__assert(with: matcher) + } + + @available(*, deprecated, renamed: "assert(_:error:)") + @discardableResult public func assert(with matcher: GREYMatcher!, + error:UnsafeMutablePointer!) -> Self { + return self.__assert(with: matcher, error: error) + } + + @discardableResult public func perform(_ action: GREYAction!) -> Self { + return self.__perform(action) + } + + @discardableResult public func perform(_ action: GREYAction!, + error:UnsafeMutablePointer!) -> Self { + return self.__perform(action, error: error) + } + + @discardableResult public func using(searchAction: GREYAction, + onElementWithMatcher matcher: GREYMatcher) -> Self { + return self.usingSearch(searchAction, onElementWith: matcher) + } +} + +extension GREYCondition { + open func waitWithTimeout(seconds: CFTimeInterval) -> Bool { + return self.wait(withTimeout: seconds) + } + + open func waitWithTimeout(seconds: CFTimeInterval, pollInterval: CFTimeInterval) + -> Bool { + return self.wait(withTimeout: seconds, pollInterval: pollInterval) + } +} diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift new file mode 100644 index 0000000000..ef80a494e6 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift @@ -0,0 +1,258 @@ +// +// Copyright 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import EarlGrey +import XCTest + +@testable import EarlGreyExampleSwift + +class EarlGreyExampleSwiftTests: XCTestCase { + + func testThatThrows() throws { + + } + + func testBasicSelection() { + // Select the button with Accessibility ID "clickMe". + // This should throw a warning for "Result of Call Unused." + EarlGrey.selectElement(with: grey_accessibilityID("ClickMe")) + } + + func testBasicSelectionAndAction() { + // Select and tap the button with Accessibility ID "clickMe". + EarlGrey.selectElement(with: grey_accessibilityID("ClickMe")) + .perform(grey_tap()) + } + + func testBasicSelectionAndAssert() { + // Select the button with Accessibility ID "clickMe" and assert it's visible. + EarlGrey.selectElement(with: grey_accessibilityID("ClickMe")) + .assert(grey_sufficientlyVisible()) + } + + func testBasicSelectionActionAssert() { + // Select and tap the button with Accessibility ID "clickMe", then assert it's visible. + EarlGrey.selectElement(with: grey_accessibilityID("ClickMe")) + .perform(grey_tap()) + .assert(grey_sufficientlyVisible()) + } + + func testSelectionOnMultipleElements() { + // This test will fail because both buttons are visible and match the selection. + // We add a custom error here to prevent the Test Suite failing. + var error: NSError? + EarlGrey.selectElement(with: grey_text("Non-Existent Element Text")) + .perform(grey_tap(), error: &error) + + if let _ = error { + print("Test Failed with Error : \(error.self!)") + } + } + + func testCollectionMatchers() { + // First way to disambiguate: use collection matchers. + let visibleSendButtonMatcher: GREYMatcher! = + grey_allOf([grey_accessibilityID("ClickMe"), grey_sufficientlyVisible()]) + EarlGrey.selectElement(with: visibleSendButtonMatcher) + .perform(grey_doubleTap()) + } + + func testWithInRoot() { + // Second way to disambiguate: use inRoot to focus on a specific window or container. + // There are two buttons with accessibility id "Send", but only one is inside SendMessageView. + EarlGrey.selectElement(with: grey_accessibilityID("Send")) + .inRoot(grey_kindOfClass(SendMessageView.self)) + .perform(grey_doubleTap()) + } + + func testWithCustomMatcher() { + // Define the match condition: matches table cells that contains a date for a Thursday. + let matches: MatchesBlock = { (element: Any?) -> Bool in + if let cell = element as? UITableViewCell { + let formatter = DateFormatter() + formatter.dateStyle = DateFormatter.Style.long + if let date = formatter.date(from: cell.textLabel!.text!) { + let calendar = Calendar.current + let weekday = (calendar as NSCalendar).component(NSCalendar.Unit.weekday, from: date) + return weekday == 5 + } else { + return false + } + } else { + return false + } + } + + // Create a description for the matcher. + let describe: DescribeToBlock = { (description: Any) -> Void in + let greyDescription:GREYDescription = description as! GREYDescription + greyDescription.appendText("Date for a Thursday") + } + + // Create an EarlGrey custom matcher. + let matcherForThursday: GREYElementMatcherBlock! = + GREYElementMatcherBlock.init(matchesBlock: matches, descriptionBlock: describe) + // Profit + EarlGrey.selectElement(with: matcherForThursday) + .perform(grey_doubleTap()) + } + + func testTableCellOutOfScreen() { + // Go find one cell out of the screen. + EarlGrey.selectElement(with: grey_accessibilityID("Cell30")) + .usingSearch(grey_scrollInDirection(GREYDirection.down, 100), + onElementWith: grey_accessibilityID("table")) + .perform(grey_tap()) + // Move back to top of the table. + EarlGrey.selectElement(with: grey_accessibilityID("Cell1")) + .usingSearch(grey_scrollInDirection(GREYDirection.up, 500), + onElementWith: grey_accessibilityID("table")) + .perform(grey_doubleTap()) + } + + func testCatchErrorOnFailure() { + // TapMe doesn't exist, but the test doesn't fail because we are getting a pointer to the + // error. + var error: NSError? + EarlGrey.selectElement(with: grey_accessibilityID("TapMe")) + .perform(grey_tap(), error: &error) + if let myError = error { + print(myError) + } + } + + func testCustomAction() { + // Fade in and out an element. + let fadeInAndOut = { (element: UIView) -> Void in + UIView.animate(withDuration: 1.0, delay: 0.0, + options: UIViewAnimationOptions.curveEaseOut, + animations: { element.alpha = 0.0 }, completion: { + (finished: Bool) -> Void in + UIView.animate(withDuration: 1.0, + delay: 0.0, + options: UIViewAnimationOptions.curveEaseIn, + animations: { element.alpha = 1.0 }, + completion: nil) + }) + } + // Define a custom action that applies fadeInAndOut to the selected element. + let tapClickMe: GREYActionBlock = + GREYActionBlock.action(withName: "Fade In And Out", perform: { + (element: Any?, errorOrNil: UnsafeMutablePointer?) -> Bool in + // First make sure element is attached to a window. + let elementAsView :UIView = element as! UIView + guard let window = elementAsView.window! as UIView! else { + let errorInfo = [NSLocalizedDescriptionKey: + NSLocalizedString("Element is not attached to a window", + comment: "")] + errorOrNil?.pointee = NSError(domain: kGREYInteractionErrorDomain, + code: 1, + userInfo: errorInfo) + return false + } + fadeInAndOut(window) + return true + }); + EarlGrey.selectElement(with: grey_accessibilityID("ClickMe")) + .perform(tapClickMe) + } + + func testWithCustomAssertion() { + // Write a custom assertion that checks if the alpha of an element is equal to the expected + // value. + let alphaEqual = { (expectedAlpha: CGFloat) -> GREYAssertionBlock in + return GREYAssertionBlock.assertion(withName: "Assert Alpha Equal", + assertionBlockWithError: { + (element: Any?, errorOrNil: UnsafeMutablePointer?) -> Bool in + guard let view = element! as! UIView as UIView! else { + let errorInfo = [NSLocalizedDescriptionKey: + NSLocalizedString("Element is not a UIView", + comment: "")] + errorOrNil?.pointee = + NSError(domain: kGREYInteractionErrorDomain, + code: 2, + userInfo: errorInfo) + return false + } + return view.alpha == expectedAlpha + }) + } + EarlGrey.selectElement(with: grey_accessibilityID("ClickMe")) + .assert(alphaEqual(1.0)) + } + + func testWithCustomFailureHandler() { + // This test will fail and use our custom handler to handle the failure. + // The custom handler is defined at the end of this file. + let myHandler = SampleFailureHandler() + EarlGrey.setFailureHandler(handler: myHandler) + EarlGrey.selectElement(with: grey_accessibilityID("TapMe")) + .perform(grey_tap()) + } + + func testLayout() { + // Define a layout constraint. + let onTheRight: GREYLayoutConstraint = + GREYLayoutConstraint(attribute: GREYLayoutAttribute.left, + relatedBy: GREYLayoutRelation.greaterThanOrEqual, + toReferenceAttribute: GREYLayoutAttribute.right, + multiplier: 1.0, + constant: 0.0) + EarlGrey.selectElement(with: grey_accessibilityLabel("SendForLayoutTest")) + .assert(grey_layout([onTheRight], grey_accessibilityID("ClickMe"))) + } + + func testWithCondition() { + let myCondition = GREYCondition.init(name: "Example condition", block: { () -> Bool in + for j in 0...100000 { + _ = j + } + return true + }) + // Wait for my condition to be satisfied or timeout after 5 seconds. + let success = myCondition.wait(withTimeout: 5) + if !success { + // Just printing for the example. + print("Condition not met") + } else { + EarlGrey.selectElement(with: grey_accessibilityID("ClickMe")) + .perform(grey_tap()) + } + } + + func testWithGreyAssertions() { + GREYAssert(1 == 1, reason: "Assert with GREYAssert") + GREYAssertTrue(1 == 1, reason: "Assert with GREYAssertTrue") + GREYAssertFalse(1 != 1, reason: "Assert with GREYAssertFalse") + GREYAssertNotNil(1, reason: "Assert with GREYAssertNotNil") + GREYAssertNil(nil, reason: "Assert with GREYAssertNil") + GREYAssertEqualObjects(1, 1, reason: "Assert with GREYAssertEqualObjects") + // Uncomment one of the following lines to fail the test. + //GREYFail("Failing with GREYFail") + } +} + +class SampleFailureHandler : NSObject, GREYFailureHandler { + /** + * Called by the framework to raise an exception. + * + * @param exception The exception to be handled. + * @param details Extra information about the failure. + */ + public func handle(_ exception: GREYFrameworkException!, details: String!) { + print("Test Failed With Reason : \(exception.reason!) and details \(details)") + } +} diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/Info.plist b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/Info.plist new file mode 100644 index 0000000000..985c2357fc --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/Info.plist @@ -0,0 +1,42 @@ + + + + + license + + + Copyright 2016 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExampleTests/EarlGreyExampleTests.m b/test_projects/ios/EarlGreyExample/EarlGreyExampleTests/EarlGreyExampleTests.m new file mode 100644 index 0000000000..fbba2ae6bc --- /dev/null +++ b/test_projects/ios/EarlGreyExample/EarlGreyExampleTests/EarlGreyExampleTests.m @@ -0,0 +1,254 @@ +// +// Copyright 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +@import EarlGrey; + +#import "EarlGreyExampleSwift-Swift.h" + +@interface PrintOnlyHandler : NSObject +@end + +@implementation PrintOnlyHandler + +- (void)handleException:(GREYFrameworkException *)exception details:(NSString *)details { + NSLog(@"Test Failed With Reason : %@ and details : %@", [exception reason], details); +} + +@end + +@interface EarlGreyExampleTests : XCTestCase +- (id) matcherForThursdays; +@end + +@implementation EarlGreyExampleTests + +- (void)testBasicSelection { + // Select the button with Accessibility ID "clickMe". + [EarlGrey selectElementWithMatcher:grey_accessibilityID(@"ClickMe")]; +} + +- (void)testBasicSelectionAndAction { + // Select and tap the button with Accessibility ID "clickMe". + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"ClickMe")] + performAction:grey_tap()]; +} + +- (void)testBasicSelectionAndAssert { + // Select the button with Accessibility ID "clickMe" and assert it's visible. + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"ClickMe")] + assertWithMatcher:grey_sufficientlyVisible()]; +} + +- (void)testBasicSelectionActionAssert { + // Select and tap the button with Accessibility ID "clickMe", then assert it's visible. + [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"ClickMe")] + performAction:grey_tap()] + assertWithMatcher:grey_sufficientlyVisible()]; +} + +- (void)testSelectionOnMultipleElements { + // This test will fail because both buttons are visible and match the selection. + // We add a custom error here to prevent the Test Suite failing. + NSError *error; + [[EarlGrey selectElementWithMatcher:grey_sufficientlyVisible()] + performAction:grey_tap() error:&error]; + if (error) { + NSLog(@"Test Failed with Error : %@", [error description]); + } +} + +- (void)testCollectionMatchers { + id visibleSendButtonMatcher = + grey_allOf(grey_accessibilityID(@"ClickMe"), grey_sufficientlyVisible(), nil); + [[EarlGrey selectElementWithMatcher:visibleSendButtonMatcher] + performAction:grey_doubleTap()]; +} + +- (void)testWithInRoot { + // Second way to disambiguate: use inRoot to focus on a specific window or container. + // There are two buttons with accessibility id "Send", but only one is inside SendMessageView. + [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Send")] + inRoot:grey_kindOfClass([SendMessageView class])] + performAction:grey_doubleTap()]; +} + +// Define a custom matcher for table cells that contains a date for a Thursday. +- (id)matcherForThursdays { + MatchesBlock matches = ^BOOL(UIView *cell) { + if ([cell isKindOfClass:[UITableViewCell class]]) { + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateStyle = NSDateFormatterLongStyle; + NSDate *date = [formatter dateFromString:[[(UITableViewCell *)cell textLabel] text]]; + if (!date) { + return NO; + } + NSCalendar *calendar = [NSCalendar currentCalendar]; + NSInteger weekday = [calendar component:NSCalendarUnitWeekday fromDate:date]; + return weekday == 5; + } else { + return NO; + } + }; + DescribeToBlock describe = ^void(id description) { + [description appendText:@"Date for a Thursday"]; + }; + + return [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches + descriptionBlock:describe]; +} + +- (void)testWithCustomMatcher { + // Use the custom matcher. + [[EarlGrey selectElementWithMatcher:[self matcherForThursdays]] + performAction:grey_doubleTap()]; +} + +- (void)testTableCellOutOfScreen { + // Go find one cell out of the screen. + [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Cell30")] + usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 50) + onElementWithMatcher:grey_accessibilityID(@"table")] + performAction:grey_doubleTap()]; + + // Move back to top of the table. + [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Cell1")] + usingSearchAction:grey_scrollInDirection(kGREYDirectionUp, 500) + onElementWithMatcher:grey_accessibilityID(@"table")] + performAction:grey_doubleTap()]; +} + +- (void)testCatchErrorOnFailure { + // TapMe doesn't exist, but the test doesn't fail because we are getting a pointer to the error. + NSError *error; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"TapMe")] + performAction:grey_tap() error:&error]; + if (error) { + NSLog(@"Error: %@", [error localizedDescription]); + } +} + +// Fade in and out an element. +- (void)fadeInAndOut:(UIView *)element { + [UIView animateWithDuration:1.0 + delay:0.0 + options:UIViewAnimationOptionCurveEaseOut + animations: ^{ + element.alpha = 0.0;} + completion: ^(BOOL finished) { + [UIView animateWithDuration:1.0 + delay:0.0 + options:UIViewAnimationOptionCurveEaseIn + animations: ^{ + element.alpha = 1.0;} + completion: nil]; + }]; + +} + +// Define a custom action that applies fadeInAndOut to the selected element. +- (id)tapClickMe { + return [GREYActionBlock actionWithName:@"Fade In And Out" + constraints:nil + performBlock: ^(id element, NSError *__strong *errorOrNil) { + // First make sure element is attached to a window. + if ([element window] == nil) { + NSDictionary *errorInfo = @{ + NSLocalizedDescriptionKey: + NSLocalizedString(@"Element is not attached to a window", @"")}; + *errorOrNil = [NSError errorWithDomain:kGREYInteractionErrorDomain + code:1 + userInfo:errorInfo]; + return NO; + } else { + [self fadeInAndOut:[element window]]; + return YES; + } + }]; +} + +- (void)testCustomAction { + // Test using the custom action tapClickMe. + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"ClickMe")] + performAction:[self tapClickMe]]; +} + +// Write a custom assertion that checks if the alpha of an element is equal to the expected value. +- (id)alphaEqual:(CGFloat)expectedAlpha { + return [GREYAssertionBlock assertionWithName:@"Assert Alpha Equal" + assertionBlockWithError:^BOOL(UIView *element, + NSError *__strong *errorOrNil) { + // Assertions can be performed on nil elements. Make sure view isn’t nil. + if (element == nil) { + *errorOrNil = + [NSError errorWithDomain:kGREYInteractionErrorDomain + code:kGREYInteractionElementNotFoundErrorCode + userInfo:nil]; + return NO; + } + return element.alpha == expectedAlpha; + }]; +} + + +- (void)testWithCustomAssertion { + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"ClickMe")] + assert:([self alphaEqual:1.0])]; +} + +- (void)testWithCustomFailureHandler { + // This test will fail and use our custom handler to handle the failure. + // The custom handler is defined at the beginning of this file. + PrintOnlyHandler *myHandler = [[PrintOnlyHandler alloc] init]; + [EarlGrey setFailureHandler:myHandler]; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"TapMe")] + performAction:(grey_tap())]; +} + +- (void)testLayout { + // Define a layout constraint. + GREYLayoutConstraint *onTheRight = + [GREYLayoutConstraint layoutConstraintWithAttribute:kGREYLayoutAttributeLeft + relatedBy:kGREYLayoutRelationGreaterThanOrEqual + toReferenceAttribute:kGREYLayoutAttributeRight + multiplier:1.0 + constant:0.0]; + + [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"SendForLayoutTest")] + assertWithMatcher:grey_layout(@[onTheRight], grey_accessibilityID(@"ClickMe"))]; +} + +- (void)testWithCondition { + GREYCondition *myCondition = [GREYCondition conditionWithName: @"Example condition" block: ^BOOL { + int i = 1; + while (i <= 100000) { + i++; + } + return YES; + }]; + // Wait for my condition to be satisfied or timeout after 5 seconds. + BOOL success = [myCondition waitWithTimeout:5]; + if (!success) { + // Just printing for the example. + NSLog(@"Condition not met"); + } else { + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"ClickMe")] + performAction:grey_tap()]; + } +} + +@end diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-60-2x.png b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-60-2x.png new file mode 100644 index 0000000000..b9a111279d Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-60-2x.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-60-3x.png b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-60-3x.png new file mode 100644 index 0000000000..ee601441e8 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-60-3x.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-76-2x.png b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-76-2x.png new file mode 100644 index 0000000000..07fd0baa97 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-76-2x.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-76.png b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-76.png new file mode 100644 index 0000000000..6e371661e5 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-76.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-83.5-2x.png b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-83.5-2x.png new file mode 100644 index 0000000000..0a8fa99683 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/AppIcon-83.5-2x.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/Contents.json b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..03efe4af51 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,79 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "AppIcon-60-2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "AppIcon-60-3x.png", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "AppIcon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "AppIcon-76-2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "AppIcon-83.5-2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} + diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/Contents.json b/test_projects/ios/EarlGreyExample/Images.xcassets/Contents.json new file mode 100644 index 0000000000..da4a164c91 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/Icon.imageset/Contents.json b/test_projects/ios/EarlGreyExample/Images.xcassets/Icon.imageset/Contents.json new file mode 100644 index 0000000000..5ef323db6c --- /dev/null +++ b/test_projects/ios/EarlGreyExample/Images.xcassets/Icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Icon.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/Icon.imageset/Icon.png b/test_projects/ios/EarlGreyExample/Images.xcassets/Icon.imageset/Icon.png new file mode 100644 index 0000000000..09f8544225 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/Icon.imageset/Icon.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Contents.json b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..ca58e2c43b --- /dev/null +++ b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,81 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "landscape", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "667h", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default_2x.png", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "subtype" : "retina4", + "filename" : "Default-568h_2x.png", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Portrait~ipad.png", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Landscape~ipad.png", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Portrait_2x~ipad.png", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Landscape_2x~ipad.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-568h_2x.png b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-568h_2x.png new file mode 100644 index 0000000000..1a200c9298 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-568h_2x.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Landscape_2x~ipad.png b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Landscape_2x~ipad.png new file mode 100644 index 0000000000..f87955afc5 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Landscape_2x~ipad.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png new file mode 100644 index 0000000000..cf013072e5 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Portrait_2x~ipad.png b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Portrait_2x~ipad.png new file mode 100644 index 0000000000..6e1bc897c1 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Portrait_2x~ipad.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png new file mode 100644 index 0000000000..a4cea1f046 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png differ diff --git a/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default_2x.png b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default_2x.png new file mode 100644 index 0000000000..ce6d9ef537 Binary files /dev/null and b/test_projects/ios/EarlGreyExample/Images.xcassets/LaunchImage.launchimage/Default_2x.png differ diff --git a/test_projects/ios/EarlGreyExample/LICENSE b/test_projects/ios/EarlGreyExample/LICENSE new file mode 100644 index 0000000000..4e58d9023e --- /dev/null +++ b/test_projects/ios/EarlGreyExample/LICENSE @@ -0,0 +1,598 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +-------------------------------------------------------------------------------------------- + +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public licenses. +Notwithstanding, Creative Commons may elect to apply one of its public +licenses to material it publishes and in those instances will be +considered the "Licensor." Except for the limited purpose of indicating +that material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the public +licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/test_projects/ios/EarlGreyExample/LaunchScreen.xib b/test_projects/ios/EarlGreyExample/LaunchScreen.xib new file mode 100644 index 0000000000..cfaac9a20d --- /dev/null +++ b/test_projects/ios/EarlGreyExample/LaunchScreen.xib @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test_projects/ios/EarlGreyExample/Podfile b/test_projects/ios/EarlGreyExample/Podfile new file mode 100644 index 0000000000..f658eb0909 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/Podfile @@ -0,0 +1,36 @@ +# +# Copyright 2016 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# EarlGreyExample +platform :ios, '8.0' + +source 'https://github.com/CocoaPods/Specs.git' + +use_frameworks! + +target "EarlGreyExampleTests" do + project 'EarlGreyExample' + + inherit! :search_paths + pod 'EarlGrey' +end + +target "EarlGreyExampleSwiftTests" do + project 'EarlGreyExample' + + inherit! :search_paths + pod 'EarlGrey' +end + diff --git a/test_projects/ios/EarlGreyExample/README.md b/test_projects/ios/EarlGreyExample/README.md new file mode 100644 index 0000000000..4ec978798e --- /dev/null +++ b/test_projects/ios/EarlGreyExample/README.md @@ -0,0 +1,12 @@ +# Update Instructions + +Example from: +https://github.com/google/EarlGrey/tree/b1ab378a7ab342f95cb28fe1a391a68ce6e9834b/Demo/EarlGreyExample + +- Build with `./build_example.sh` +- Download existing release and extract to `archive` +- Unzip `earlgrey_example.zip` +- Delete the old `xctestrun` files and `Debug-iphoneos` folder into the `archive` folder +- Copy the new files from the unzipped `earlgrey_example.zip` into `archive` +- Copy individual Swift test binary from `Debug-iphoneos/EarlGreyExampleSwiftTests.xctest/EarlGreyExampleSwiftTests` to `swift/EarlGreyExampleSwiftTests` +- Copy individual Swift test binary from `Debug-iphoneos/EarlGreyExampleTests.xctest/EarlGreyExampleTests` to `objc/EarlGreyExampleTests` diff --git a/test_projects/ios/EarlGreyExample/build_example.sh b/test_projects/ios/EarlGreyExample/build_example.sh new file mode 100755 index 0000000000..df03cd26e0 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/build_example.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -euxo pipefail + +if ! [ -x "$(command -v xcpretty)" ]; then + gem install xcpretty +fi + +DD="dd_tmp" +ZIP="earlgrey_example.zip" + +rm -rf "$DD" + +xcodebuild build-for-testing \ + -allowProvisioningUpdates \ + -workspace ./EarlGreyExample.xcworkspace \ + -scheme "EarlGreyExampleSwiftTests" \ + -derivedDataPath "$DD" \ + -sdk iphoneos \ + | xcpretty + +xcodebuild build-for-testing \ + -allowProvisioningUpdates \ + -workspace ./EarlGreyExample.xcworkspace \ + -scheme "EarlGreyExampleTests" \ + -derivedDataPath "$DD" \ + -sdk iphoneos \ + | xcpretty + +pushd "$DD/Build/Products" +zip -r "$ZIP" *-iphoneos *.xctestrun +popd +mv "$DD/Build/Products/$ZIP" . diff --git a/test_projects/ios/EarlGreyExample/build_ftl.sh b/test_projects/ios/EarlGreyExample/build_ftl.sh new file mode 100755 index 0000000000..36c2dd7a32 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/build_ftl.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +set -euxo pipefail + +if ! [ -x "$(command -v xcpretty)" ]; then + gem install xcpretty +fi + +DD="dd_tmp" +SCHEME="EarlGreyExampleSwiftTests" +ZIP="ios_earlgrey2.zip" + +rm -rf "$DD" + +xcodebuild build-for-testing \ + -allowProvisioningUpdates \ + -workspace ./EarlGreyExample.xcworkspace \ + -scheme "$SCHEME" \ + -derivedDataPath "$DD" \ + -sdk iphoneos \ + | xcpretty + +pushd "$DD/Build/Products" +zip -r "$ZIP" *-iphoneos *.xctestrun +popd +mv "$DD/Build/Products/$ZIP" . diff --git a/test_projects/ios/EarlGreyExample/earlgrey_gem.yml b/test_projects/ios/EarlGreyExample/earlgrey_gem.yml new file mode 100644 index 0000000000..87f08b8c63 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/earlgrey_gem.yml @@ -0,0 +1,4 @@ +EarlGreyExampleSwiftTests: + - add_swift: true + - add_build_phase: true + - add_framework: true diff --git a/test_projects/ios/EarlGreyExample/flank.ios.yml b/test_projects/ios/EarlGreyExample/flank.ios.yml new file mode 100644 index 0000000000..6ad796b4e9 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/flank.ios.yml @@ -0,0 +1,9 @@ +gcloud: + xcode-version: 11.3.1 + test: ./earlgrey_example.zip + xctestrun-file: ./dd_tmp/Build/Products/EarlGreyExampleSwiftTests_iphoneos13.4-arm64e.xctestrun + device: + - model: iphone8 + version: 12.0 + orientation: portrait + locale: en_US diff --git a/test_projects/ios/EarlGreyExample/run_ftl_local.sh b/test_projects/ios/EarlGreyExample/run_ftl_local.sh new file mode 100755 index 0000000000..600117bfb9 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/run_ftl_local.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -euxo pipefail + +DD="dd_tmp" +SCHEME="appUITests" +ZIP="ios_earlgrey2.zip" + +# Firebase test lab runs using -xctestrun +xcodebuild test-without-building \ + -xctestrun $DD/Build/Products/*.xctestrun \ + -derivedDataPath "$DD" \ + -destination 'id=ADD_YOUR_ID_HERE' + +# get device identifier in Xcode -> Window -> Devices and Simulators diff --git a/test_projects/ios/EarlGreyExample/universal_framework.sh b/test_projects/ios/EarlGreyExample/universal_framework.sh new file mode 100755 index 0000000000..f703753799 --- /dev/null +++ b/test_projects/ios/EarlGreyExample/universal_framework.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +set -euxo pipefail + +COMBO="./ios-frameworks" +DEVICE="$COMBO/Debug-iphoneos" +SIM="$COMBO/Debug-iphonesimulator" + +lipo -create $DEVICE/libChannelLib.a $SIM/libChannelLib.a -output $COMBO/libChannelLib.a +lipo -create $DEVICE/libCommonLib.a $SIM/libCommonLib.a -output $COMBO/libCommonLib.a +lipo -create $DEVICE/libeDistantObject.a $SIM/libeDistantObject.a -output $COMBO/libeDistantObject.a +lipo -create $DEVICE/libTestLib.a $SIM/libTestLib.a -output $COMBO/libTestLib.a +lipo -create $DEVICE/libUILib.a $SIM/libUILib.a -output $COMBO/libUILib.a + +cp -RL $DEVICE/AppFramework.framework $COMBO/AppFramework.framework +DEVICE_FRAMEWORK="$DEVICE/AppFramework.framework/AppFramework" +SIM_FRAMEWORK="$SIM/AppFramework.framework/AppFramework" +UNI_FRAMEWORK="$COMBO/AppFramework.framework/AppFramework" + +lipo -create \ + "$DEVICE_FRAMEWORK" \ + "$SIM_FRAMEWORK" \ + -output "$UNI_FRAMEWORK" + +dsymutil "$UNI_FRAMEWORK" \ + --out "$COMBO/AppFramework.framework.dSYM" diff --git a/test_runner/flank-invalid.yml b/test_runner/flank-invalid.yml index 301847cd3b..acf44af5c2 100644 --- a/test_runner/flank-invalid.yml +++ b/test_runner/flank-invalid.yml @@ -1,6 +1,6 @@ gcloud: - app: ../test_app/apks/app-debug.apk - test: ../test_app/apks/app-debug-androidTest.apk + app: ../test_projects/android/apks/app-debug.apk + test: ../test_projects/android/apks/app-debug-androidTest.apk flank: incorrect: fields diff --git a/test_runner/flank.error.yml b/test_runner/flank.error.yml index 116195baf9..d906e8326d 100644 --- a/test_runner/flank.error.yml +++ b/test_runner/flank.error.yml @@ -1,7 +1,7 @@ # flank android run -c flank.error.yml gcloud: - app: ../test_app/apks/app-debug.apk - test: ../test_app/apks/error-androidTest.apk + app: ../test_projects/android/apks/app-debug.apk + test: ../test_projects/android/apks/error-androidTest.apk device: - model: NexusLowRes version: 28 diff --git a/test_runner/flank.yml b/test_runner/flank.yml index 6a23f5ad72..9dca0ee356 100644 --- a/test_runner/flank.yml +++ b/test_runner/flank.yml @@ -50,11 +50,11 @@ gcloud: ## The path to the application binary file. ## The path may be in the local filesystem or in Google Cloud Storage using gs:// notation. ## Android App Bundles are specified as .aab, all other files are assumed to be APKs. - app: ../test_app/apks/app-debug.apk + app: ../test_projects/android/apks/app-debug.apk ## The path to the binary file containing instrumentation tests. ## The given path may be in the local filesystem or in Google Cloud Storage using a URL beginning with gs://. - test: ../test_app/apks/app-debug-androidTest.apk + test: ../test_projects/android/apks/app-debug-androidTest.apk ## Automatically log into the test device using a preconfigured Google account before beginning the test. ## Disabled by default. Use --auto-google-login to enable. @@ -186,9 +186,9 @@ flank: ## Include additional app/test apk pairs in the run. Apks are unique by just filename and not by path! ## If app is omitted, then the top level app is used for that pair. # additional-app-test-apks: - # - app: ../test_app/apks/app-debug.apk - # test: ../test_app/apks/app1-debug-androidTest.apk - # - test: ../test_app/apks/app2-debug-androidTest.apk + # - app: ../test_projects/android/apks/app-debug.apk + # test: ../test_projects/android/apks/app1-debug-androidTest.apk + # - test: ../test_projects/android/apks/app2-debug-androidTest.apk ## The max time this test run can execute before it is cancelled (default: unlimited). # run-timeout: 60m diff --git a/test_runner/src/main/kotlin/ftl/args/ArgsFileVisitor.kt b/test_runner/src/main/kotlin/ftl/args/ArgsFileVisitor.kt index 4b837ade0f..bb619237cc 100644 --- a/test_runner/src/main/kotlin/ftl/args/ArgsFileVisitor.kt +++ b/test_runner/src/main/kotlin/ftl/args/ArgsFileVisitor.kt @@ -39,7 +39,7 @@ class ArgsFileVisitor(glob: String) : SimpleFileVisitor() { @Throws(java.nio.file.NoSuchFileException::class) fun walk(searchPath: Path): List { val searchString = searchPath.toString() - // /Users/tmp/code/flank/test_app/** => /Users/tmp/code/flank/test_app/ + // /Users/tmp/code/flank/test_projects/android/** => /Users/tmp/code/flank/test_projects/android/ // /Users/tmp/code/* => /Users/tmp/code/ val beforeGlob = Paths.get(searchString.substringBefore(SINGLE_GLOB)) // must not follow links when resolving paths or /tmp turns into /private/tmp diff --git a/test_runner/src/test/kotlin/ftl/args/AndroidArgsFileTest.kt b/test_runner/src/test/kotlin/ftl/args/AndroidArgsFileTest.kt index ff20cbc74b..3bde8ec00e 100644 --- a/test_runner/src/test/kotlin/ftl/args/AndroidArgsFileTest.kt +++ b/test_runner/src/test/kotlin/ftl/args/AndroidArgsFileTest.kt @@ -33,9 +33,9 @@ class AndroidArgsFileTest { private val localYamlFile = getPath("src/test/kotlin/ftl/fixtures/flank.local.yml") private val gcsYamlFile = getPath("src/test/kotlin/ftl/fixtures/flank.gcs.yml") - private val appApkLocal = getString("../test_app/apks/app-debug.apk") + private val appApkLocal = getString("../test_projects/android/apks/app-debug.apk") private val appApkGcs = "gs://tmp_bucket_2/app-debug.apk" - private val testApkLocal = getString("../test_app/apks/app-debug-androidTest.apk") + private val testApkLocal = getString("../test_projects/android/apks/app-debug-androidTest.apk") private val testApkGcs = "gs://tmp_bucket_2/app-debug-androidTest.apk" private val testName = "class com.example.app.ExampleUiTest#testPasses" private val directoryToPull = "/sdcard/screenshots" diff --git a/test_runner/src/test/kotlin/ftl/args/AndroidArgsTest.kt b/test_runner/src/test/kotlin/ftl/args/AndroidArgsTest.kt index 31dc91bf26..4919e9a0ec 100644 --- a/test_runner/src/test/kotlin/ftl/args/AndroidArgsTest.kt +++ b/test_runner/src/test/kotlin/ftl/args/AndroidArgsTest.kt @@ -43,11 +43,11 @@ import java.util.UUID @RunWith(FlankTestRunner::class) class AndroidArgsTest { private val empty = emptyList() - private val appApk = "../test_app/apks/app-debug.apk" - private val invalidApk = "../test_app/apks/invalid.apk" - private val testApk = "../test_app/apks/app-debug-androidTest.apk" - private val testErrorApk = "../test_app/apks/error-androidTest.apk" - private val testFlakyApk = "../test_app/apks/flaky-androidTest.apk" + private val appApk = "../test_projects/android/apks/app-debug.apk" + private val invalidApk = "../test_projects/android/apks/invalid.apk" + private val testApk = "../test_projects/android/apks/app-debug-androidTest.apk" + private val testErrorApk = "../test_projects/android/apks/error-androidTest.apk" + private val testFlakyApk = "../test_projects/android/apks/flaky-androidTest.apk" private val appApkAbsolutePath = appApk.absolutePath() private val testApkAbsolutePath = testApk.absolutePath() private val testErrorApkAbsolutePath = testErrorApk.absolutePath() @@ -1360,8 +1360,8 @@ AndroidArgs """ flank: additional-app-test-apks: - - app: ../test_app/apks/app-debug.apk - test: ../test_app/apks/app1-debug-androidTest.apk + - app: ../test_projects/android/apks/app-debug.apk + test: ../test_projects/android/apks/app1-debug-androidTest.apk """.trimIndent() ).map { inject -> """ diff --git a/test_runner/src/test/kotlin/ftl/args/ArgsHelperFilePathTest.kt b/test_runner/src/test/kotlin/ftl/args/ArgsHelperFilePathTest.kt index f1fbb9cf04..1a5cc647ba 100644 --- a/test_runner/src/test/kotlin/ftl/args/ArgsHelperFilePathTest.kt +++ b/test_runner/src/test/kotlin/ftl/args/ArgsHelperFilePathTest.kt @@ -22,8 +22,8 @@ class ArgsHelperFilePathTest { fun `check apk glob path resolves correctly`() { assumeFalse(isWindows) - val testApkRelativePath = "../test_app/apks/nested/app-debug-androidTest.apk" - val testApkBlobPath = "../test_app/apks/**/app-debug-*.apk" + val testApkRelativePath = "../test_projects/android/apks/nested/app-debug-androidTest.apk" + val testApkBlobPath = "../test_projects/android/apks/**/app-debug-*.apk" val actual = ArgsHelper.evaluateFilePath(testApkBlobPath) val expected = testApkRelativePath.absolutePath() @@ -57,11 +57,11 @@ class ArgsHelperFilePathTest { @Test fun evaluateEnvVarInFilePath() { - environmentVariables.set("TEST_APK_DIR", "test_app/apks") + environmentVariables.set("TEST_APK_DIR", "test_projects/android/apks") val testApkPath = "../\$TEST_APK_DIR/app-debug-androidTest.apk" val actual = ArgsHelper.evaluateFilePath(testApkPath) - val expected = "../test_app/apks/app-debug-androidTest.apk".absolutePath() + val expected = "../test_projects/android/apks/app-debug-androidTest.apk".absolutePath() Truth.assertThat(actual).isEqualTo(expected) } diff --git a/test_runner/src/test/kotlin/ftl/args/ArgsHelperTest.kt b/test_runner/src/test/kotlin/ftl/args/ArgsHelperTest.kt index e54570b1ed..0994607cf9 100644 --- a/test_runner/src/test/kotlin/ftl/args/ArgsHelperTest.kt +++ b/test_runner/src/test/kotlin/ftl/args/ArgsHelperTest.kt @@ -155,10 +155,10 @@ class ArgsHelperTest { @Test fun evaluateEnvVarInFilePath() { - environmentVariables.set("TEST_APK_DIR", "test_app/apks") + environmentVariables.set("TEST_APK_DIR", "test_projects/android/apks") val testApkPath = "../\$TEST_APK_DIR/app-debug-androidTest.apk" val actual = ArgsHelper.evaluateFilePath(testApkPath) - val expected = "../test_app/apks/app-debug-androidTest.apk".absolutePath() + val expected = "../test_projects/android/apks/app-debug-androidTest.apk".absolutePath() assertThat(actual).isEqualTo(expected) } diff --git a/test_runner/src/test/kotlin/ftl/args/IosArgsTest.kt b/test_runner/src/test/kotlin/ftl/args/IosArgsTest.kt index a581c69f18..e4ec6e6de9 100644 --- a/test_runner/src/test/kotlin/ftl/args/IosArgsTest.kt +++ b/test_runner/src/test/kotlin/ftl/args/IosArgsTest.kt @@ -31,7 +31,7 @@ class IosArgsTest { private val testPath = "./src/test/kotlin/ftl/fixtures/tmp/earlgrey_example.zip" private val xctestrunFile = "./src/test/kotlin/ftl/fixtures/tmp/EarlGreyExampleSwiftTests_iphoneos13.4-arm64e.xctestrun" - private val invalidApp = "../test_app/apks/invalid.apk" + private val invalidApp = "../test_projects/android/apks/invalid.apk" private val xctestrunFileAbsolutePath = xctestrunFile.absolutePath() private val testAbsolutePath = testPath.absolutePath() private val resultDir = "test_dir" diff --git a/test_runner/src/test/kotlin/ftl/args/yml/test_error_yaml_cases/flank-bad-yaml-formatting.yml b/test_runner/src/test/kotlin/ftl/args/yml/test_error_yaml_cases/flank-bad-yaml-formatting.yml index 8c348c0a16..02afcb5907 100644 --- a/test_runner/src/test/kotlin/ftl/args/yml/test_error_yaml_cases/flank-bad-yaml-formatting.yml +++ b/test_runner/src/test/kotlin/ftl/args/yml/test_error_yaml_cases/flank-bad-yaml-formatting.yml @@ -2,5 +2,5 @@ flank: disable-sharding: false project: flank-open-source gcloud: - app: ../test_app/apks/app-debug.apk - test: ../test_app/apks/app-debug-androidTest.apk + app: ../test_projects/android/apks/app-debug.apk + test: ../test_projects/android/apks/app-debug-androidTest.apk diff --git a/test_runner/src/test/kotlin/ftl/cli/firebase/RefreshCommandTest.kt b/test_runner/src/test/kotlin/ftl/cli/firebase/RefreshCommandTest.kt index 6fb94f0c08..42cc5d5e7c 100644 --- a/test_runner/src/test/kotlin/ftl/cli/firebase/RefreshCommandTest.kt +++ b/test_runner/src/test/kotlin/ftl/cli/firebase/RefreshCommandTest.kt @@ -50,8 +50,8 @@ class RefreshCommandTest { Files.write( yamlCfg, """ gcloud: - app: ../test_app/apks/app-debug.apk - test: ../test_app/apks/app-debug-androidTest.apk + app: ../test_projects/android/apks/app-debug.apk + test: ../test_projects/android/apks/app-debug-androidTest.apk flank: legacy-junit-result: true """.trimIndent().toByteArray() diff --git a/test_runner/src/test/kotlin/ftl/fixtures/flank.local.yml b/test_runner/src/test/kotlin/ftl/fixtures/flank.local.yml index 074a7a9735..8112d59d8a 100644 --- a/test_runner/src/test/kotlin/ftl/fixtures/flank.local.yml +++ b/test_runner/src/test/kotlin/ftl/fixtures/flank.local.yml @@ -1,6 +1,6 @@ gcloud: - app: ../test_app/apks/app-debug.apk - test: ../test_app/apks/app-debug-androidTest.apk + app: ../test_projects/android/apks/app-debug.apk + test: ../test_projects/android/apks/app-debug-androidTest.apk results-bucket: tmp_bucket_2 auto-google-login: true use-orchestrator: true diff --git a/test_runner/src/test/kotlin/ftl/fixtures/simple-android-flank.yml b/test_runner/src/test/kotlin/ftl/fixtures/simple-android-flank.yml index 019456bf86..e486f718ba 100644 --- a/test_runner/src/test/kotlin/ftl/fixtures/simple-android-flank.yml +++ b/test_runner/src/test/kotlin/ftl/fixtures/simple-android-flank.yml @@ -1,6 +1,6 @@ gcloud: - app: "../test_app/apks/app-debug.apk" - test: "../test_app/apks/app-debug-androidTest.apk" + app: "../test_projects/android/apks/app-debug.apk" + test: "../test_projects/android/apks/app-debug-androidTest.apk" results-dir: test_dir flank: legacy-junit-result: true diff --git a/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-apk.yml b/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-apk.yml index 483bbf9c25..f48933467e 100644 --- a/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-apk.yml +++ b/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-apk.yml @@ -9,4 +9,4 @@ flank: num-test-runs: 1 additional-app-test-apks: - test: ./src/test/kotlin/ftl/fixtures/tmp/apk/app-multiple-flaky-debug-androidTest.apk - - test: ../test_app/apks/invalid.apk + - test: ../test_projects/android/apks/invalid.apk diff --git a/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-apk2.yml b/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-apk2.yml index 8848097d4d..6c10a0d503 100644 --- a/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-apk2.yml +++ b/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-apk2.yml @@ -1,10 +1,10 @@ gcloud: - app: "../test_app/apks/app-debug.apk" - test: "../test_app/apks/app-debug-androidTest.apk" + app: "../test_projects/android/apks/app-debug.apk" + test: "../test_projects/android/apks/app-debug-androidTest.apk" um-flaky-test-attempts: 1 flank: disable-sharding: false max-test-shards: 2 additional-app-test-apks: - - test: "../test_app/apks/error-androidTest.apk" + - test: "../test_projects/android/apks/error-androidTest.apk" diff --git a/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-mixed.yml b/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-mixed.yml index e358f441f6..8f8d7890d8 100644 --- a/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-mixed.yml +++ b/test_runner/src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-mixed.yml @@ -13,4 +13,4 @@ flank: additional-app-test-apks: - test: ./src/test/kotlin/ftl/fixtures/tmp/apk/app-single-success-debug-androidTest.apk - test: ./src/test/kotlin/ftl/fixtures/tmp/apk/app-multiple-flaky-debug-androidTest.apk - - test: ../test_app/apks/invalid.apk + - test: ../test_projects/android/apks/invalid.apk diff --git a/test_runner/src/test/kotlin/ftl/gc/GcAndroidTestMatrixTest.kt b/test_runner/src/test/kotlin/ftl/gc/GcAndroidTestMatrixTest.kt index fcaee4a507..bfd4fe644e 100644 --- a/test_runner/src/test/kotlin/ftl/gc/GcAndroidTestMatrixTest.kt +++ b/test_runner/src/test/kotlin/ftl/gc/GcAndroidTestMatrixTest.kt @@ -18,8 +18,8 @@ import java.io.StringReader @RunWith(FlankTestRunner::class) class GcAndroidTestMatrixTest { - private val appApk = "../test_app/apks/app-debug.apk" - private val testApk = "../test_app/apks/app-debug-androidTest.apk" + private val appApk = "../test_projects/android/apks/app-debug.apk" + private val testApk = "../test_projects/android/apks/app-debug-androidTest.apk" @After fun tearDown() = unmockkAll() diff --git a/test_runner/src/test/kotlin/ftl/gc/GcStorageTest.kt b/test_runner/src/test/kotlin/ftl/gc/GcStorageTest.kt index c30380b359..890189fa26 100644 --- a/test_runner/src/test/kotlin/ftl/gc/GcStorageTest.kt +++ b/test_runner/src/test/kotlin/ftl/gc/GcStorageTest.kt @@ -19,7 +19,7 @@ class GcStorageTest { @Test fun `upload missingBucket`() { val androidArgs = mockk() - every { androidArgs.appApk } returns "../test_app/apks/app-debug.apk" + every { androidArgs.appApk } returns "../test_projects/android/apks/app-debug.apk" GcStorage.upload(androidArgs.appApk!!, "does-not-exist", "nope") } diff --git a/test_runner/src/test/kotlin/ftl/test/util/LocalGcs.kt b/test_runner/src/test/kotlin/ftl/test/util/LocalGcs.kt index 1b449b0c3f..c31ed502d1 100644 --- a/test_runner/src/test/kotlin/ftl/test/util/LocalGcs.kt +++ b/test_runner/src/test/kotlin/ftl/test/util/LocalGcs.kt @@ -29,8 +29,8 @@ object LocalGcs { } fun uploadFiles() { - val appApk = "../test_app/apks/app-debug.apk" - val testApk = "../test_app/apks/app-debug-androidTest.apk" + val appApk = "../test_projects/android/apks/app-debug.apk" + val testApk = "../test_projects/android/apks/app-debug-androidTest.apk" val ipaZip = "./src/test/kotlin/ftl/fixtures/tmp/earlgrey_example.zip" val xctestrun = "./src/test/kotlin/ftl/fixtures/tmp/EarlGreyExampleSwiftTests_iphoneos13.4-arm64e.xctestrun"