From e49925a4f3bb79ca69fcc4c53179b54af84aac28 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Thu, 5 Nov 2020 20:57:10 +0100 Subject: [PATCH 01/26] Added TestAction --- Example/Podfile.lock | 2 +- Example/Pods/Manifest.lock | 2 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 1127 +++++++++-------- ...le-TABTestKit_ExampleUITests-frameworks.sh | 94 +- ...e-TABTestKit_ExampleUITests.debug.xcconfig | 2 + ...TABTestKit_ExampleUITests.release.xcconfig | 2 + .../Pods-TABTestKit_Example-frameworks.sh | 94 +- .../Pods-TABTestKit_Example.debug.xcconfig | 2 + .../Pods-TABTestKit_Example.release.xcconfig | 2 + .../ShowTime/ShowTime.debug.xcconfig | 2 + .../ShowTime/ShowTime.release.xcconfig | 2 + .../TABTestKit/TABTestKit.debug.xcconfig | 2 + .../TABTestKit/TABTestKit.release.xcconfig | 2 + ...tricLogin_AuthenticationFailureTests.swift | 2 +- .../BiometricLogin_HappyPathTests.swift | 2 +- ...BiometricLogin_PermissionDeniedTests.swift | 2 +- .../CollectionViewScreen.swift | 2 +- .../CollectionViewTests.swift | 2 +- .../OtherElementsTests.swift | 2 +- .../TableScreen.swift | 2 +- .../TableTests.swift | 2 +- TABTestKit/Classes/BDD/Step.swift | 64 +- .../Classes/Contexts/Action/StepAction.swift | 12 + .../Classes/Contexts/AlertContext.swift | 6 +- TABTestKit/Classes/Contexts/AppContext.swift | 52 +- .../Classes/Contexts/BiometricsContext.swift | 24 +- .../Classes/Contexts/InteractionContext.swift | 134 +- .../Classes/Contexts/KeyboardContext.swift | 6 +- .../Classes/Contexts/NavigationContext.swift | 70 +- .../Classes/Contexts/SheetContext.swift | 6 +- .../Contexts/SystemPreferencesContext.swift | 34 +- 31 files changed, 910 insertions(+), 849 deletions(-) create mode 100644 TABTestKit/Classes/Contexts/Action/StepAction.swift diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 36468ea8..378d2fe3 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -24,4 +24,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: b6b0b334dee592f181c8d68b62229392f1cd2529 -COCOAPODS: 1.9.3 +COCOAPODS: 1.10.0 diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index 36468ea8..378d2fe3 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -24,4 +24,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: b6b0b334dee592f181c8d68b62229392f1cd2529 -COCOAPODS: 1.9.3 +COCOAPODS: 1.10.0 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 0f752b92..399d5c46 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,232 +7,234 @@ objects = { /* Begin PBXBuildFile section */ - 030C8476D8BE89065E5328E67EF56752 /* DatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A869D57AC8EDD0ED0BC6DA6BD96660 /* DatePicker.swift */; }; - 037438E458F376D3ED3311C9C9C424D1 /* ActivitySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF3CF5B9ABEEA0EDC977AFA1D3653700 /* ActivitySheet.swift */; }; - 06F0BA93FE06A8B562D3D88F82D1FF43 /* Biometrics-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = 76351B41B9C4CCADF915B35D11C74EAC /* Biometrics-Bridging-Header.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 073BB799FC643900737132A1DAC712C1 /* Editable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5D608343740CFA224AF053B57F66F67 /* Editable.swift */; }; - 0E61D42891FE5FEC32F4F79B64A0A31A /* SystemPreferencesContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = C886680EDE8E68E288F0B0967127256D /* SystemPreferencesContext.swift */; }; - 11278B65581A09C350D0FE282C241B2F /* SegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B82B2F93A1BE5B4C63A8A4CB66E2BE9 /* SegmentedControl.swift */; }; - 145EF16BC9E3275A3BE2EA2E24CCC25B /* SystemPreferencesResetScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21A5843633E4D75EE8E1556F939DB746 /* SystemPreferencesResetScreen.swift */; }; - 1769E66936A8148901759A505D1134D8 /* Screen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EECF51F8060F5B8BFA4281A38586E83 /* Screen.swift */; }; + 0526DE7ECA45A28FA1B5AEF4C07049E4 /* Dismissable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 149ED91D61E38D4ADE77ECD1C3CDCA8B /* Dismissable.swift */; }; + 0B6D2B8E54F6A7A48D48594517090835 /* InteractionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A07B83AE28D9690E0C0D9EB1D6B8EA /* InteractionContext.swift */; }; + 129360CE5E67138943C2C4748D82367A /* XCUIElement+hasKeyboardFocus.swift in Sources */ = {isa = PBXBuildFile; fileRef = AABB82F79590AA2D0458F8674BFCB4FD /* XCUIElement+hasKeyboardFocus.swift */; }; 182CC29C7BAFE0334AC07728900F1D6C /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */; }; - 1CF73984D3297083B164E8AFDFB68A9D /* KeyboardContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = B34195E62CE6D4325A0363AF69BD0FB9 /* KeyboardContext.swift */; }; - 1EEECE824542B4516057559E98B80E1C /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = E59DB98EC39EB118496B12CB4BE9C95C /* Alert.swift */; }; - 1F4FEC3156C65D28F6B9458BD75E2F88 /* NavigationContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2F76C444323B6EB045D04A8CE4B6F18 /* NavigationContext.swift */; }; - 1FDB0E9D01FF2441B2C4BFDB3367E927 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = B906394D23C1F041CA4124C3B1FFF2F3 /* Button.swift */; }; - 205F7DF3026977DA94FAC59A3D0B9F32 /* InteractionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D91666C6805484361A8042FE298F3C08 /* InteractionContext.swift */; }; - 214C5AC2BEB372773B81A89E3CA9649E /* systemPreferencesRootScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8D0C69508B528128406927836573B67 /* systemPreferencesRootScreen.swift */; }; - 22824B0B33B4C8170ED1DE4ABC96A61A /* XCUIDevice+frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5109E1F024CAEEB532DC9DC19512FF1 /* XCUIDevice+frame.swift */; }; - 22AB496E63075EE106F9BA6B4D5CA93A /* Biometrics.h in Headers */ = {isa = PBXBuildFile; fileRef = FBA47936DBE7936C98F0EC94B9E8CEAC /* Biometrics.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 232838548112A58B1405F1649A3C8D5A /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 833F3150E7163B9CDD9DC3F6667D24AE /* Switch.swift */; }; - 24D51ED262D69888D4892E35D4B296B1 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = D633AFB6915D96D516CD0872E60E2415 /* App.swift */; }; - 25CB8336A1F82DDC9CD5005EFBB7F29B /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = B99BC68F60289EE3D2B827C55151ED07 /* Icon.swift */; }; - 267805C828A9D1D94D9CACAE5C603CDD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */; }; + 1F38EFDFA992989D1F842F283343D571 /* Completable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A57D682A4852F19188AA9E4B0FEDED5 /* Completable.swift */; }; + 204619BA88B79A0A38CE757859A37EC8 /* Adjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC125873B3EFEB103E5E93686ACCEA70 /* Adjustable.swift */; }; + 24434A6AD8C5B0B6F299F883C087D75F /* BiometricsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74E8DD8489CD119E2996B2D7AA50966 /* BiometricsContext.swift */; }; + 248E3015488597454E4DB64E1CBD9F33 /* TABTestKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B81AB3802539BA40C55F66E8195FD5C /* TABTestKit-dummy.m */; }; 27CB0A5EB157C02C3FDFCC594331324E /* ShowTime-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 69152FFA4489AC24B45BCE5208B3B41A /* ShowTime-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 28C2F366D4A968DBCF276D13CF9EF6CF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */; }; - 297A89E5D9EA42B0F082560478BD138D /* ScrollableScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D132E7F63ED7978B99EF4975197150F /* ScrollableScreen.swift */; }; - 33A0126A9943D162EDCC4DE493D8A168 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C061463250766C9C05995AB8EE63E66 /* XCTest.framework */; }; + 2B247D46ADB72B94A03A0692F9371692 /* Slider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8A44FD7A43078E47015085C7ECBCD3 /* Slider.swift */; }; + 2E9EAD4A7F3B3392B572ED690DCABC20 /* DatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22E3B09F25859704FF547774837360F /* DatePicker.swift */; }; + 2F6C3202D54D6620EC5BF96782955D5A /* SystemPreferencesContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2F0B07615633500EA51A42DA7490BC2 /* SystemPreferencesContext.swift */; }; + 2F7918BEF8541A66867040B87BD3C527 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B7C80EA631CE3D4F91D5A0ACE3C07DD /* TextField.swift */; }; + 30A3E04F64979C6D3D1CE35E32E3211A /* Screen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4C02A966CF1BC688A54BF0B112D0A9 /* Screen.swift */; }; + 34DEA23FC760111AC8D6ED0ACD1657AB /* Safari.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEEDF5103B9F8405649E4D01A6F91F6 /* Safari.swift */; }; 3C892CB7517172243FF2DA110515208C /* ShowTime-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F094F44DD0301CC76E1365673D3FCF9C /* ShowTime-dummy.m */; }; - 3DDA18D51471D4B5A53CA30FB7A4800E /* TABTestKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 39F10CDF64864F18B3EEAAE5618F2993 /* TABTestKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 481F82DB88069C6B92FF1778580B39F6 /* Slider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97B6600289CF1454BB2B7A95FE5523AB /* Slider.swift */; }; - 4CF2489EF04BC5D95D8CC7B883F8F136 /* SystemPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4508197147D357E5AC5F92B14089EC1 /* SystemPreferences.swift */; }; - 4D991C4CAEF57EB28E0F107BCBCC5464 /* XCUIElement+wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58185D0DA6046583EA0F3992B136C18F /* XCUIElement+wait.swift */; }; - 4DF904622DBED25D617FB92185ACCAF7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */; }; - 56D50EAF7965D5AE0E5181A61398C2FE /* CellContaining.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDF4947C9E27BB97B30F06939F64E9E0 /* CellContaining.swift */; }; - 6693CC10486D411C5AEE771A4DED0AB4 /* Tappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E846D1B6D74DE542E5CA9527BD39F15F /* Tappable.swift */; }; - 672CCDA6A5E3879637348218DCC4A967 /* BiometricsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A361D13461D8EC6C08FFF31BDF8D1806 /* BiometricsContext.swift */; }; - 67BDAF48BC71ADD6FFBD9BC3F60CC489 /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B5D2EB83CCADFD7A1E0058D8A2B609 /* Attributes.swift */; }; - 697DDFCEB90BB157DB000D322CD19D5C /* PageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1146247962F18FFC769B180EB17B0A5D /* PageIndicator.swift */; }; - 6BEE0D6E2E2AB96DD64F04F9B4C33B2D /* Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFFE450A2ED2E1A13F6291EF95C4F19 /* Header.swift */; }; - 6D14253BA9582C897106391DA95677C5 /* Dismissable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3EE8B1C53D5F26ACBFF010AEABAE28B /* Dismissable.swift */; }; - 6FB96E7AE7560CFFE96A83D5A2B9FFC9 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8889DDD0297F197C953F944C127449C /* WebView.swift */; }; - 707000A4026440BF85F559F095DEB890 /* Completable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 733C9EB16F7A1DF6E9E333F54B511D02 /* Completable.swift */; }; - 723BE432EFB0A62753F492943A3A67B4 /* TABTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9017D3505D12281FD18FE6120B0A5DE /* TABTestCase.swift */; }; + 42A829C16312CA165D00DACC0ADEC0EA /* Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E214E6576455D02201D7B55F31A4133F /* Keyboard.swift */; }; + 434755ECAB25587245B6D59856CAF2AE /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092EC4D876C695B96674917011FCC5FA /* WebView.swift */; }; + 447DB66D7F291D402E2F204F75E4448A /* SystemPreferencesResetScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90408CD3B2C81444801D688492D9460E /* SystemPreferencesResetScreen.swift */; }; + 46775302AF7999648B09D9ED3EE48C74 /* Refreshable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2044C4793465B9C0C768D78DA10A7679 /* Refreshable.swift */; }; + 4AF4160DAFDFE90B91E767F11D53C676 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = E072805065CBE35D26F3B040D2B421CF /* Image.swift */; }; + 4CF8C1EB590C78B81CCAF8907F83B665 /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2B4A426013298D3CA6A5F02BCF6816A /* Sheet.swift */; }; + 511D6D75092453FCA862CD556E4A3292 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; + 607E4FE677496D6D5046DD9B998F44DD /* Biometrics-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = 153AD2F265BBC65A6F302110A59B6EE2 /* Biometrics-Bridging-Header.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6355B326EDD3C569A10F9CD737ABDD37 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 499A0952B5A4C30C064B2490AA26968C /* Label.swift */; }; + 660673CF4BD18AF55C3081895930F715 /* SegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6303D83C1AD37A8EBD76AC289A8B879 /* SegmentedControl.swift */; }; + 6643C096FB4A1113F2FAC7B3A2FFEE37 /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F5D26D3157B797157282240E8EAB587 /* TabBar.swift */; }; + 6E5998C704D81C5561D9F3A0AE87E3F4 /* SecureTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DDF7E00678659F81ED27C85A2021C4A /* SecureTextField.swift */; }; + 700688692E1A02B5BD67FF220AEE4647 /* ValueRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC46B20374B589B005A9908C70225CDF /* ValueRepresentable.swift */; }; + 728FE99FD0CE9401CFA2752F4B3A56EE /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = A92FD9CDEED38DB956AF467A2FDF2E50 /* Attributes.swift */; }; + 72D00E3EC4AC546C8ED0616A85ACA0F3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; 74E2F7EA36D277B32C6F922F069AD086 /* Pods-TABTestKit_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FEFF9CD73B2D6723ED60BBDD46577CD /* Pods-TABTestKit_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 74FE7D271C05B5F5CF16CD40289ED053 /* NavBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BB533F397C5D4FD9F1F0910B521877 /* NavBar.swift */; }; - 7E50C1883D363FEBF04C6B1F0D12E834 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0AB1F764B8B3C263215AFEFC01143A /* Cell.swift */; }; + 77E53D47B396A553F04FD9770B92EFDE /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E1F208D3BC3FE76031A1E12102E345 /* App.swift */; }; + 7E1ABD14D61D063FBBD27FC841E05A59 /* Array+Safe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760EC83C92512F8EBC55188AC82EEF94 /* Array+Safe.swift */; }; 7E7556B81F678C3A6E6580D9039C676A /* Pods-TABTestKit_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 28061D8B4A5060F09E692D4BC586713B /* Pods-TABTestKit_Example-dummy.m */; }; - 7FF9CA487AB366CCB8F77DD7B22AB8F4 /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 270FD9B498764D8FEA3F42DB3007EE80 /* Sheet.swift */; }; - 84B1885DB2D83AFD090C3CCCA8472C4E /* CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DB84493C64353132E6F27571A43A3F6 /* CollectionView.swift */; }; - 8722F7FE01B09905CE43F5FE2F84E4AB /* Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0930640B9F785B2533E020EBE1A83252 /* Table.swift */; }; + 7FFF240E73592A018E7EF51D34C46822 /* ScrollableScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BF325AC84FB7CC481DFADB84F36E2E /* ScrollableScreen.swift */; }; + 864EF0C73ED7C41B254B7DDA8755FB93 /* CellContaining.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1194970946CD5BB5114B6422390CF7 /* CellContaining.swift */; }; + 8760E5691C6B92CAAC17935225A01921 /* StepAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF96D9F53868097BAFDE27415EF8ED46 /* StepAction.swift */; }; 8927BD966BA8175BBCD4A4C1E98EC03C /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C6AFBB671D10E6AEF0786D8E3E16BDE4 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 94D870EB04EAD571F26204DFA1DE5BF8 /* Adjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1A9256A8DD33C89BAAB57A235F2804 /* Adjustable.swift */; }; - 965F572E8A4577F5564E718B08CA0DEC /* AppContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62E07EF0C9BE6DEF51F0BE719EFEB9E /* AppContext.swift */; }; - 96CF87699933D48A91FDD92BBBBD3A96 /* SystemPreferencesGeneralScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFE83F853FC56745500A916FBFE0BD09 /* SystemPreferencesGeneralScreen.swift */; }; - 981319D676A5ECFF485A539211C464A2 /* ScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3B5FEA5DCDCA2D582C00DE6B76CDC0B /* ScrollView.swift */; }; - 9914EC8EA7D7B376F4F8046D2F5A8380 /* XCUIElement+isVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00B178BBB394C26212D58AE9F1A3376E /* XCUIElement+isVisible.swift */; }; - 9D1D06B968FEF34BEFBC5DA3B5F211A3 /* XCTFatalFail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28FC2FFEC625B0FA3CD74A1DA0360038 /* XCTFatalFail.swift */; }; - A3D01C0F1E1F3BD46CBE767C7A2BD535 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */; }; - A41B5CCF42789157090E258FE089586C /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99645CE216E89A6655EC66E732CECD38 /* Element.swift */; }; - AE182ECBB0181991D6E601FF083869A3 /* SheetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2E454FE7393A49B62A15ECF95C55AF /* SheetContext.swift */; }; - B169B20C039E782186565E2E52ACB787 /* AlertContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44D3D373915DB3F443D51C091A399226 /* AlertContext.swift */; }; - B355BFBF02732C2EFDFCC79CE84DBEEF /* Picker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8F3ADBAFBD856493872E3528629CE26 /* Picker.swift */; }; - B390F02F5BF0E704C2530E6B864C8DA4 /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525F300EF39DA23BCE9573EFDF316426 /* TabBar.swift */; }; - B3F91A927D31FD30CAE8C721D3CDD916 /* Scrollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11F2A3A2A26E9B32CC1F97EE09E1F276 /* Scrollable.swift */; }; - B958E7CE0D4615F3F9D93D4E33F4DF36 /* TABTestKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 76218D3926FC14AD26D4F85F24A78116 /* TABTestKit-dummy.m */; }; + 8A39120AAB3F245151C6EC45731384E8 /* XCUIDevice+frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88F91005C0CA7E7AB203F33B8DDF0BDA /* XCUIDevice+frame.swift */; }; + 8B2F8F080ECC1DE1DB954E16F23F0FBE /* Stepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1C097DE9EF042095E371FF0D20AA4B /* Stepper.swift */; }; + 8C7FE2BCC4F430E5425E85E25BA62A70 /* BaseApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2916459F4C61003896E56CF7908EEC77 /* BaseApp.swift */; }; + 8F20672129F9D3960CD2C81807143AA6 /* ScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1E8D8FAF1D803A9233EF39DA854BB82 /* ScrollView.swift */; }; + 941194E6C860FAA1FA7F87D8B1CE7ED0 /* Scrollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C29536084B2800DEE14820D0BE9E084 /* Scrollable.swift */; }; + 9E751CCA8B991AD984B5F2DB579EFEF9 /* XCUIElement+wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1848ED8032296034A5B64A0616D8A8E /* XCUIElement+wait.swift */; }; + A103AA3DDCC0C574830CCD6754CC4FB7 /* XCUIElement+isVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 976E5B1537BAD0007743ADFE257F3ED9 /* XCUIElement+isVisible.swift */; }; + A29A51BD9D9C4DE0FC4ADBF9B866D437 /* KeyboardContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D94A0FB25BE70C26B804A9A2603B49BA /* KeyboardContext.swift */; }; + A4B195BEC072B3D3D043AC9043325480 /* TABTestKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2230FEC425952A5BA46EC7FDD23058D1 /* TABTestKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A70409F4523267C2454E0CC80FFBB3FC /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDBFD83FEF615ADC0D94D503B355C4F /* Button.swift */; }; + A7E465D6DAB265AFAB4B375CF7C50591 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */; }; + A8C378399954F4B3FF9A059EFDC6E0CA /* Tappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E09319DABE4D8C5448854E80E3853ED /* Tappable.swift */; }; + A9FA41F25B8BC1FD497E26444897E649 /* Editable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E46CB78D2D032E4EAC290B6E830C3C96 /* Editable.swift */; }; + ABF987C8B05650B7F587B98CF8D49040 /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0DC2299BB313B3066A280DEC1E5CDB0 /* Icon.swift */; }; + AD68A7303B63A43663767D46878A6449 /* NavigationContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE1404009DDB760BE1E31CCC5950EF46 /* NavigationContext.swift */; }; + B04E97D1F83E7D0C2C06311A3C941CDB /* CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE8CCF054B911545AED8388FFB343F82 /* CollectionView.swift */; }; + B16D01DE1E4487F2B39335D599CBFF0A /* PageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 473AA326F87C4822D3DEF5DCCF966EE8 /* PageIndicator.swift */; }; + B4E611CBED96EAE1973130134CFAF1F8 /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 715A80E3D9A38499E143D0074A2A6314 /* Element.swift */; }; + B5042D490C77BDC6BBF549D2197C7434 /* TABTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2026D34CB7674FFED1BE47D406D9B597 /* TABTestCase.swift */; }; + B505C57F9951DF732BE85B3F79A45082 /* Element+defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025EF15BCB08745BD9C4C4B4AB26450D /* Element+defaults.swift */; }; + BA01284A4D51779CE18C4B4B1072E600 /* Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4E90763630537295317F66AA307F8D6 /* Header.swift */; }; BA42C86F6872AC87ADF7110F65920109 /* ShowTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */; }; - C28393A7BA4949E7EC11BA68290E0A89 /* Biometrics.m in Sources */ = {isa = PBXBuildFile; fileRef = 516FEC36F601143A1A7D9C4483043E02 /* Biometrics.m */; }; - C45F1CA24939CFC0EA011576B184E517 /* BaseApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063860976CBFED0CEABD0E3213F93A8E /* BaseApp.swift */; }; - C5E46852D59375EE4308956FD7ACADE6 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E96D37C7B544B5D3F8FABFDB3A65DFD /* TextField.swift */; }; - C9939C0BDAD41AA1F33BE52342C396FB /* Refreshable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C38F549CCB18E20A90695795AEC5AC6 /* Refreshable.swift */; }; - CE96ADAED2FDB8BB47A327A08562475C /* SecureTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E0C2DB87953FDF97B668A8BE0A744E /* SecureTextField.swift */; }; - D83B7250A5C7CDFE4F64E0EEDD639892 /* Safari.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378BEB1C3B86DE939F26118388E95363 /* Safari.swift */; }; - D86774E04E3EAF51A19C123A7D21000A /* XCUIElement+hasKeyboardFocus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2729792DB920A36618545DE30B46AA58 /* XCUIElement+hasKeyboardFocus.swift */; }; - D8771E317705B1A18BFDE9E3C391EF7F /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16CB0412D2D22CA01914F6BAE91169D /* Step.swift */; }; - DA63CBAA1FD4B0B8D56B351BC7B277F4 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288D4CA144C64E07905184F6CBAAE867 /* Label.swift */; }; - E09FEFAFFD39157648FFABB51E2EB3EA /* NormalizedCoordinate+Locations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C79CDE470DD3341A0A34BD1C052A973 /* NormalizedCoordinate+Locations.swift */; }; - E11FF4E3610B51833B5B25BFEC9439EB /* Array+Safe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44A8EB04ABAA59D35775222D7010AA51 /* Array+Safe.swift */; }; - E3AA3BD0B36A8D7D0DDADCA23C123130 /* Stepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 996EB6D6F78C53D2C9B5D4FBC4C13D84 /* Stepper.swift */; }; - E558577851F19778E543AE6D7DCFF30A /* Springboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A9E2EEC134947F1BCADD81AFCF32A5B /* Springboard.swift */; }; - E87367920E610653998714517B01869C /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3343170286ADD343A663D64B81BB398B /* View.swift */; }; - E9BA1D90C07B623069A2D6BB1686441B /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BEC99316035011631C40BFCF3197901 /* TextView.swift */; }; - EBD37C76644005FA6D30F6FCAA57EA58 /* Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2B8E3108E83AEF1A861292D5E667A5 /* Keyboard.swift */; }; - F19E657512049CDD2FD1414E408073C8 /* CGVector+Offset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 409D0012B0FB4B730BAB1D8F54421886 /* CGVector+Offset.swift */; }; - F566D30798059D2B906BF3245752870F /* ValueRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42287AC46DDDC0D1AA7184E181C68C89 /* ValueRepresentable.swift */; }; - F67B7C7FDE9074CDCFA68E004947AA92 /* Element+defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE3694A3ADDFDB10E97129C26B4C12F /* Element+defaults.swift */; }; - FB0F482C6EC685FC996684E7E0C58A81 /* Scenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1AB2E805D93F75BF37BD873B9BF6585 /* Scenario.swift */; }; - FB1E11C5834A94EA4E92203A824C7712 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310D0511477295F4E8D3A2CECA4D953A /* Image.swift */; }; + BA8CF7D98500DADAD801E5914AB1A8F4 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC36AF763EBBF2DF4B36283B4C75793 /* Switch.swift */; }; + BB36BBFC917C379101B97E49B7C8C6A2 /* Biometrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 615131A83CD77EDBDDA573C8A53FDCB9 /* Biometrics.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BB9D41F5E8A093EBC9EDE2DFBF5EF784 /* NavBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D53904E3AE615F5E554DEF60414590 /* NavBar.swift */; }; + BDD923D69FE552C4696A7BD85516FE67 /* CGVector+Offset.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF84DFAA86AB4BDBA6D94F5A66C3984D /* CGVector+Offset.swift */; }; + BF6743BA40FE71C7005AEDC847FA3C1D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; + C8329B375D10AE87331E532409BB51C6 /* ActivitySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 184A29E3CD8F8FF08FAED47BE68CB72F /* ActivitySheet.swift */; }; + C9B1B4B9ADB19D402DC91F9810176A0A /* Biometrics.m in Sources */ = {isa = PBXBuildFile; fileRef = D986710E90E0E2B27659F1C5931FF615 /* Biometrics.m */; }; + CCDFD3C2EDCC10DE9FDE0397CF868A28 /* SystemPreferencesGeneralScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD7A28A7D202E4E61D15C6A1FB046451 /* SystemPreferencesGeneralScreen.swift */; }; + CEF0F61CEA6A291ECE769EEE0EE67CE2 /* AlertContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF2C9E6830DB96BBF7BD5C41F5B1C84 /* AlertContext.swift */; }; + D58CD66F5B82023A328B46FC39D2C44B /* Scenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D9864B94D0C97C982DACCDD8B382B1E /* Scenario.swift */; }; + D9C87601EDBA2030486ECA748E65693F /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = A78E3481BE402A4FDF449CAC1F905879 /* Alert.swift */; }; + E017FF0578E7F7F6958DBBC66FD4091B /* XCTFatalFail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FDA9F7A425746A960A32C149C5455EC /* XCTFatalFail.swift */; }; + E273C321857663376A2DD140D4128DF2 /* AppContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFA6157708C12EB751341B7814EBCDE8 /* AppContext.swift */; }; + EB84A3CBE94963C26AD0D70463996617 /* Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AAD3CF2833BFDFB728F571AA636BAEA /* Table.swift */; }; + EC20F678A51FFAD90B3D3D1F76C58719 /* NormalizedCoordinate+Locations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297B44527731C02E0B19295DB523568F /* NormalizedCoordinate+Locations.swift */; }; + EC38D41C9E6F9C66D1A6184EDFB74184 /* Springboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D2E06167D45FF1CD5C3C7579BEF0CCC /* Springboard.swift */; }; + EC47F602CD37E5EC24DE51E7875BA16A /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8ADED80001DED8F960B8A08F3F1026D /* Step.swift */; }; + EE2DE74B688C2BA2BCA8D8D56B3CDE42 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 281BE70296D811DC0C196F1952BE0179 /* View.swift */; }; + F4BF8B887488C4B0900D5C36A2B48886 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85AFC7AC121EDD585A794CBEF219ED8 /* TextView.swift */; }; + F7A4CDA05AB92DA971CDBBDEDF78F974 /* SheetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 656317B1689F8389F8D8A13FB0281F7E /* SheetContext.swift */; }; + F8C8632658B840BA4531A5F8EEA2521E /* systemPreferencesRootScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A6C582E6031CB7A125F0800F45055D /* systemPreferencesRootScreen.swift */; }; + FA5FE4421DD144891167A9BBA2FC9DA5 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D829733A2418052EC220B9F4AC655D5 /* Cell.swift */; }; + FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; + FEE6DD6A8EDEDF4078C41A22CEE26DE7 /* Picker.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4ED3C029720CC0633629F1A9A14FC9 /* Picker.swift */; }; + FFB682562D658DE0039CA1B643E5B987 /* SystemPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17E5A6B3BBA55868A7DDA07A8771ACA /* SystemPreferences.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 459B20C91CD2950F24B4BC4D74B43491 /* PBXContainerItemProxy */ = { + 754B214DB1E883537932FD5B5ED94709 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9C4F771642E79689CC6A0648ABEA808C; - remoteInfo = TABTestKit; + remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; + remoteInfo = ShowTime; }; - A5E99FC687310BF5C8B3315D4816D50E /* PBXContainerItemProxy */ = { + 902C0ED431E559D207A6E8DBB73303A3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; remoteInfo = ShowTime; }; - C5E51B0AE3854C7BCA159A65A87A74D4 /* PBXContainerItemProxy */ = { + CB3F99CE3F0D729A59560288C1918820 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; - remoteInfo = ShowTime; + remoteGlobalIDString = 9C4F771642E79689CC6A0648ABEA808C; + remoteInfo = TABTestKit; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 00B178BBB394C26212D58AE9F1A3376E /* XCUIElement+isVisible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+isVisible.swift"; sourceTree = ""; }; - 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 063860976CBFED0CEABD0E3213F93A8E /* BaseApp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseApp.swift; sourceTree = ""; }; - 0930640B9F785B2533E020EBE1A83252 /* Table.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Table.swift; sourceTree = ""; }; - 0AE3694A3ADDFDB10E97129C26B4C12F /* Element+defaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Element+defaults.swift"; sourceTree = ""; }; - 0AF0A2E0D69C6A4EF1AB4402DB0A38EA /* TABTestKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TABTestKit-Info.plist"; sourceTree = ""; }; - 0C38F549CCB18E20A90695795AEC5AC6 /* Refreshable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Refreshable.swift; sourceTree = ""; }; - 10B1611A1B50B1DA5565DB251CBF81F4 /* TABTestKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.debug.xcconfig; sourceTree = ""; }; - 1146247962F18FFC769B180EB17B0A5D /* PageIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PageIndicator.swift; sourceTree = ""; }; - 11F2A3A2A26E9B32CC1F97EE09E1F276 /* Scrollable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scrollable.swift; sourceTree = ""; }; - 13B5D2EB83CCADFD7A1E0058D8A2B609 /* Attributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Attributes.swift; sourceTree = ""; }; - 13BA1BD868EA98BFAF1291D67025BC2E /* TABTestKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TABTestKit.modulemap; sourceTree = ""; }; + 025EF15BCB08745BD9C4C4B4AB26450D /* Element+defaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Element+defaults.swift"; sourceTree = ""; }; + 092EC4D876C695B96674917011FCC5FA /* WebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; + 0D9864B94D0C97C982DACCDD8B382B1E /* Scenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scenario.swift; sourceTree = ""; }; + 0FDA9F7A425746A960A32C149C5455EC /* XCTFatalFail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = XCTFatalFail.swift; sourceTree = ""; }; 14146CA31421B9CAE5A93C48F6E9FFAF /* Pods-TABTestKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example.debug.xcconfig"; sourceTree = ""; }; + 149ED91D61E38D4ADE77ECD1C3CDCA8B /* Dismissable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Dismissable.swift; sourceTree = ""; }; + 153AD2F265BBC65A6F302110A59B6EE2 /* Biometrics-Bridging-Header.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Biometrics-Bridging-Header.h"; sourceTree = ""; }; + 1794163B004EA69BCBE099E34F056F90 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 17AE207B2FD67E1096C542744391C322 /* Pods-TABTestKit_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-acknowledgements.plist"; sourceTree = ""; }; - 1B0AB1F764B8B3C263215AFEFC01143A /* Cell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = ""; }; + 184A29E3CD8F8FF08FAED47BE68CB72F /* ActivitySheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ActivitySheet.swift; sourceTree = ""; }; 1CB830EB632DA8DED42D4E33C4E59DD9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh"; sourceTree = ""; }; - 21A5843633E4D75EE8E1556F939DB746 /* SystemPreferencesResetScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesResetScreen.swift; sourceTree = ""; }; - 246C5312AD287517A78640A4FAF48421 /* ShowTime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ShowTime.framework; path = ShowTime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 26E0C2DB87953FDF97B668A8BE0A744E /* SecureTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SecureTextField.swift; sourceTree = ""; }; - 270FD9B498764D8FEA3F42DB3007EE80 /* Sheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Sheet.swift; sourceTree = ""; }; - 2729792DB920A36618545DE30B46AA58 /* XCUIElement+hasKeyboardFocus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+hasKeyboardFocus.swift"; sourceTree = ""; }; + 1E4C02A966CF1BC688A54BF0B112D0A9 /* Screen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = ""; }; + 1FF2C9E6830DB96BBF7BD5C41F5B1C84 /* AlertContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AlertContext.swift; sourceTree = ""; }; + 2026D34CB7674FFED1BE47D406D9B597 /* TABTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TABTestCase.swift; path = TABTestKit/Classes/TABTestCase.swift; sourceTree = ""; }; + 2044C4793465B9C0C768D78DA10A7679 /* Refreshable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Refreshable.swift; sourceTree = ""; }; + 2230FEC425952A5BA46EC7FDD23058D1 /* TABTestKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-umbrella.h"; sourceTree = ""; }; + 22D53904E3AE615F5E554DEF60414590 /* NavBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavBar.swift; sourceTree = ""; }; + 246C5312AD287517A78640A4FAF48421 /* ShowTime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ShowTime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28061D8B4A5060F09E692D4BC586713B /* Pods-TABTestKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TABTestKit_Example-dummy.m"; sourceTree = ""; }; - 288D4CA144C64E07905184F6CBAAE867 /* Label.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; - 28FC2FFEC625B0FA3CD74A1DA0360038 /* XCTFatalFail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = XCTFatalFail.swift; sourceTree = ""; }; - 2BEC99316035011631C40BFCF3197901 /* TextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; - 2C061463250766C9C05995AB8EE63E66 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 2E96D37C7B544B5D3F8FABFDB3A65DFD /* TextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; - 2E97F8EAABEDB0295C8BBA3ADB4A81C2 /* Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 310D0511477295F4E8D3A2CECA4D953A /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; - 31BB533F397C5D4FD9F1F0910B521877 /* NavBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavBar.swift; sourceTree = ""; }; - 3343170286ADD343A663D64B81BB398B /* View.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; - 378BEB1C3B86DE939F26118388E95363 /* Safari.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Safari.swift; sourceTree = ""; }; - 39F10CDF64864F18B3EEAAE5618F2993 /* TABTestKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-umbrella.h"; sourceTree = ""; }; - 409D0012B0FB4B730BAB1D8F54421886 /* CGVector+Offset.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGVector+Offset.swift"; sourceTree = ""; }; - 42287AC46DDDC0D1AA7184E181C68C89 /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; - 44A8EB04ABAA59D35775222D7010AA51 /* Array+Safe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Array+Safe.swift"; sourceTree = ""; }; - 44D3D373915DB3F443D51C091A399226 /* AlertContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AlertContext.swift; sourceTree = ""; }; - 4A9E2EEC134947F1BCADD81AFCF32A5B /* Springboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Springboard.swift; sourceTree = ""; }; - 5029125F64A9A19889E338765CD0299E /* TABTestKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = TABTestKit.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 516836C45DBE97859AF1DD3AC2CD4B01 /* Pods_TABTestKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TABTestKit_Example.framework; path = "Pods-TABTestKit_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 516FEC36F601143A1A7D9C4483043E02 /* Biometrics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Biometrics.m; sourceTree = ""; }; - 525F300EF39DA23BCE9573EFDF316426 /* TabBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; }; + 281BE70296D811DC0C196F1952BE0179 /* View.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; + 2916459F4C61003896E56CF7908EEC77 /* BaseApp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseApp.swift; sourceTree = ""; }; + 297B44527731C02E0B19295DB523568F /* NormalizedCoordinate+Locations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NormalizedCoordinate+Locations.swift"; sourceTree = ""; }; + 2D2E06167D45FF1CD5C3C7579BEF0CCC /* Springboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Springboard.swift; sourceTree = ""; }; + 2E8A44FD7A43078E47015085C7ECBCD3 /* Slider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Slider.swift; sourceTree = ""; }; + 2E97F8EAABEDB0295C8BBA3ADB4A81C2 /* Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 37A07B83AE28D9690E0C0D9EB1D6B8EA /* InteractionContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionContext.swift; sourceTree = ""; }; + 3A1194970946CD5BB5114B6422390CF7 /* CellContaining.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CellContaining.swift; sourceTree = ""; }; + 3F5D26D3157B797157282240E8EAB587 /* TabBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; }; + 473AA326F87C4822D3DEF5DCCF966EE8 /* PageIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PageIndicator.swift; sourceTree = ""; }; + 476A6223DF0F58F25425C2F46B6EEC2C /* TABTestKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.debug.xcconfig; sourceTree = ""; }; + 499A0952B5A4C30C064B2490AA26968C /* Label.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; + 516836C45DBE97859AF1DD3AC2CD4B01 /* Pods_TABTestKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TABTestKit_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 549B858328CB2EF8360076242052506E /* Pods-TABTestKit_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TABTestKit_Example.modulemap"; sourceTree = ""; }; - 58185D0DA6046583EA0F3992B136C18F /* XCUIElement+wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+wait.swift"; sourceTree = ""; }; - 5C817F0E0208382B131E5FFB430F8A17 /* TABTestKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TABTestKit.framework; path = TABTestKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E1A9256A8DD33C89BAAB57A235F2804 /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; - 5EFFE450A2ED2E1A13F6291EF95C4F19 /* Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Header.swift; sourceTree = ""; }; + 57A6C582E6031CB7A125F0800F45055D /* systemPreferencesRootScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = systemPreferencesRootScreen.swift; sourceTree = ""; }; + 58E1F208D3BC3FE76031A1E12102E345 /* App.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; + 5A57D682A4852F19188AA9E4B0FEDED5 /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Completable.swift; sourceTree = ""; }; + 5B81AB3802539BA40C55F66E8195FD5C /* TABTestKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TABTestKit-dummy.m"; sourceTree = ""; }; + 5C817F0E0208382B131E5FFB430F8A17 /* TABTestKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TABTestKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5D829733A2418052EC220B9F4AC655D5 /* Cell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = ""; }; + 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 615131A83CD77EDBDDA573C8A53FDCB9 /* Biometrics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Biometrics.h; sourceTree = ""; }; + 656317B1689F8389F8D8A13FB0281F7E /* SheetContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SheetContext.swift; sourceTree = ""; }; 69152FFA4489AC24B45BCE5208B3B41A /* ShowTime-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ShowTime-umbrella.h"; sourceTree = ""; }; - 6B82B2F93A1BE5B4C63A8A4CB66E2BE9 /* SegmentedControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; 6E79134F82F3A8D58969B44D7F169338 /* Pods-TABTestKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TABTestKit_Example-acknowledgements.markdown"; sourceTree = ""; }; - 733C9EB16F7A1DF6E9E333F54B511D02 /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Completable.swift; sourceTree = ""; }; - 76218D3926FC14AD26D4F85F24A78116 /* TABTestKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TABTestKit-dummy.m"; sourceTree = ""; }; - 76351B41B9C4CCADF915B35D11C74EAC /* Biometrics-Bridging-Header.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Biometrics-Bridging-Header.h"; sourceTree = ""; }; - 7EECF51F8060F5B8BFA4281A38586E83 /* Screen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = ""; }; - 833F3150E7163B9CDD9DC3F6667D24AE /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = ""; }; + 715A80E3D9A38499E143D0074A2A6314 /* Element.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Element.swift; sourceTree = ""; }; + 75BF325AC84FB7CC481DFADB84F36E2E /* ScrollableScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollableScreen.swift; sourceTree = ""; }; + 760EC83C92512F8EBC55188AC82EEF94 /* Array+Safe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Array+Safe.swift"; sourceTree = ""; }; + 8591E75230F75ECEE5BEC23D21898581 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 868ADACA5883EB6D8424E49AA839A438 /* TABTestKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = TABTestKit.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 88F91005C0CA7E7AB203F33B8DDF0BDA /* XCUIDevice+frame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIDevice+frame.swift"; sourceTree = ""; }; + 8B7C80EA631CE3D4F91D5A0ACE3C07DD /* TextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; + 8C29536084B2800DEE14820D0BE9E084 /* Scrollable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scrollable.swift; sourceTree = ""; }; + 8DDF7E00678659F81ED27C85A2021C4A /* SecureTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SecureTextField.swift; sourceTree = ""; }; + 90408CD3B2C81444801D688492D9460E /* SystemPreferencesResetScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesResetScreen.swift; sourceTree = ""; }; 91B1EB1FAB79CE231C85712DE4D31CC0 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.plist"; sourceTree = ""; }; - 9636ED3E95A98C45C798682289AABB5A /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 965A292F186CF36A47FF8AB1CADE1B85 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig"; sourceTree = ""; }; - 97B6600289CF1454BB2B7A95FE5523AB /* Slider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Slider.swift; sourceTree = ""; }; - 99645CE216E89A6655EC66E732CECD38 /* Element.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Element.swift; sourceTree = ""; }; - 996EB6D6F78C53D2C9B5D4FBC4C13D84 /* Stepper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Stepper.swift; sourceTree = ""; }; + 976E5B1537BAD0007743ADFE257F3ED9 /* XCUIElement+isVisible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+isVisible.swift"; sourceTree = ""; }; 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m"; sourceTree = ""; }; - 9C79CDE470DD3341A0A34BD1C052A973 /* NormalizedCoordinate+Locations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NormalizedCoordinate+Locations.swift"; sourceTree = ""; }; - 9D132E7F63ED7978B99EF4975197150F /* ScrollableScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollableScreen.swift; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9DB84493C64353132E6F27571A43A3F6 /* CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionView.swift; sourceTree = ""; }; + 9AAD3CF2833BFDFB728F571AA636BAEA /* Table.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Table.swift; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9E09319DABE4D8C5448854E80E3853ED /* Tappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Tappable.swift; sourceTree = ""; }; + 9EDBFD83FEF615ADC0D94D503B355C4F /* Button.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; + 9EEEDF5103B9F8405649E4D01A6F91F6 /* Safari.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Safari.swift; sourceTree = ""; }; 9FEFF9CD73B2D6723ED60BBDD46577CD /* Pods-TABTestKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TABTestKit_Example-umbrella.h"; sourceTree = ""; }; - A361D13461D8EC6C08FFF31BDF8D1806 /* BiometricsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BiometricsContext.swift; sourceTree = ""; }; - A3EE8B1C53D5F26ACBFF010AEABAE28B /* Dismissable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Dismissable.swift; sourceTree = ""; }; A3F9B3AEE6873539F9B3FD0F64E7DB43 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.markdown"; sourceTree = ""; }; + A78E3481BE402A4FDF449CAC1F905879 /* Alert.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = ""; }; + A92FD9CDEED38DB956AF467A2FDF2E50 /* Attributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Attributes.swift; sourceTree = ""; }; AA47AB426A72CF612E6CDF50B0E91C8F /* ShowTime.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ShowTime.debug.xcconfig; sourceTree = ""; }; AA9FC38AC03409CABA3E4DD246E3CF1C /* ShowTime-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ShowTime-prefix.pch"; sourceTree = ""; }; + AABB82F79590AA2D0458F8674BFCB4FD /* XCUIElement+hasKeyboardFocus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+hasKeyboardFocus.swift"; sourceTree = ""; }; AB4E151C064820753E3685012C75D924 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist"; sourceTree = ""; }; ADB4763ABC911105EE431BA516439FE1 /* ShowTime.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ShowTime.modulemap; sourceTree = ""; }; + AE1C097DE9EF042095E371FF0D20AA4B /* Stepper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Stepper.swift; sourceTree = ""; }; AFD57256DAD4C8414BD38FD34982C7B0 /* Pods-TABTestKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example.release.xcconfig"; sourceTree = ""; }; - B16CB0412D2D22CA01914F6BAE91169D /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Step.swift; sourceTree = ""; }; - B34195E62CE6D4325A0363AF69BD0FB9 /* KeyboardContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardContext.swift; sourceTree = ""; }; - B62E07EF0C9BE6DEF51F0BE719EFEB9E /* AppContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppContext.swift; sourceTree = ""; }; - B8889DDD0297F197C953F944C127449C /* WebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; - B8F3ADBAFBD856493872E3528629CE26 /* Picker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Picker.swift; sourceTree = ""; }; - B906394D23C1F041CA4124C3B1FFF2F3 /* Button.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; - B99BC68F60289EE3D2B827C55151ED07 /* Icon.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; - BD2E454FE7393A49B62A15ECF95C55AF /* SheetContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SheetContext.swift; sourceTree = ""; }; + B17E5A6B3BBA55868A7DDA07A8771ACA /* SystemPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferences.swift; sourceTree = ""; }; + B1E8D8FAF1D803A9233EF39DA854BB82 /* ScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollView.swift; sourceTree = ""; }; + B85AFC7AC121EDD585A794CBEF219ED8 /* TextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; + B8ADED80001DED8F960B8A08F3F1026D /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Step.swift; sourceTree = ""; }; + BE8CCF054B911545AED8388FFB343F82 /* CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionView.swift; sourceTree = ""; }; + BF84DFAA86AB4BDBA6D94F5A66C3984D /* CGVector+Offset.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGVector+Offset.swift"; sourceTree = ""; }; + C2B4A426013298D3CA6A5F02BCF6816A /* Sheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Sheet.swift; sourceTree = ""; }; C354231844F21D916AF8E0D9E0F587FF /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap"; sourceTree = ""; }; C6AFBB671D10E6AEF0786D8E3E16BDE4 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h"; sourceTree = ""; }; - C886680EDE8E68E288F0B0967127256D /* SystemPreferencesContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesContext.swift; sourceTree = ""; }; - C9017D3505D12281FD18FE6120B0A5DE /* TABTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TABTestCase.swift; path = TABTestKit/Classes/TABTestCase.swift; sourceTree = ""; }; - CB2B8E3108E83AEF1A861292D5E667A5 /* Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Keyboard.swift; sourceTree = ""; }; + CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + CAC36AF763EBBF2DF4B36283B4C75793 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = ""; }; CBA3199C63C53E992A3F26F5ADCBB639 /* Pods-TABTestKit_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-Info.plist"; sourceTree = ""; }; - D1AB2E805D93F75BF37BD873B9BF6585 /* Scenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scenario.swift; sourceTree = ""; }; - D3B5FEA5DCDCA2D582C00DE6B76CDC0B /* ScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollView.swift; sourceTree = ""; }; - D5A869D57AC8EDD0ED0BC6DA6BD96660 /* DatePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DatePicker.swift; sourceTree = ""; }; - D633AFB6915D96D516CD0872E60E2415 /* App.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; - D87AACBC58E2252912FEC4132CF481CE /* TABTestKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-prefix.pch"; sourceTree = ""; }; - D91666C6805484361A8042FE298F3C08 /* InteractionContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionContext.swift; sourceTree = ""; }; + CD7A28A7D202E4E61D15C6A1FB046451 /* SystemPreferencesGeneralScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesGeneralScreen.swift; sourceTree = ""; }; + D22E3B09F25859704FF547774837360F /* DatePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DatePicker.swift; sourceTree = ""; }; + D390EE6C19BFD5F1C1C797DDE47E11AE /* TABTestKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.release.xcconfig; sourceTree = ""; }; + D65FF7511026254AD42DCA65B096E729 /* TABTestKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TABTestKit.modulemap; sourceTree = ""; }; + D94A0FB25BE70C26B804A9A2603B49BA /* KeyboardContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardContext.swift; sourceTree = ""; }; + D986710E90E0E2B27659F1C5931FF615 /* Biometrics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Biometrics.m; sourceTree = ""; }; DF441583F13AEDF6DF852C5354F264E1 /* ShowTime-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ShowTime-Info.plist"; sourceTree = ""; }; - E4508197147D357E5AC5F92B14089EC1 /* SystemPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferences.swift; sourceTree = ""; }; - E59DB98EC39EB118496B12CB4BE9C95C /* Alert.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = ""; }; - E846D1B6D74DE542E5CA9527BD39F15F /* Tappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Tappable.swift; sourceTree = ""; }; - E8D0C69508B528128406927836573B67 /* systemPreferencesRootScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = systemPreferencesRootScreen.swift; sourceTree = ""; }; - E97F64AF467C08D1FB58F73CF59C7EB4 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + E072805065CBE35D26F3B040D2B421CF /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; + E0DC2299BB313B3066A280DEC1E5CDB0 /* Icon.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; + E1848ED8032296034A5B64A0616D8A8E /* XCUIElement+wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+wait.swift"; sourceTree = ""; }; + E214E6576455D02201D7B55F31A4133F /* Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Keyboard.swift; sourceTree = ""; }; + E46CB78D2D032E4EAC290B6E830C3C96 /* Editable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Editable.swift; sourceTree = ""; }; + E4E90763630537295317F66AA307F8D6 /* Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Header.swift; sourceTree = ""; }; + E6303D83C1AD37A8EBD76AC289A8B879 /* SegmentedControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; + E74E8DD8489CD119E2996B2D7AA50966 /* BiometricsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BiometricsContext.swift; sourceTree = ""; }; EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShowTime.swift; path = Sources/ShowTime/ShowTime.swift; sourceTree = ""; }; EC7677F7A126781D8591BE7C185D48F7 /* Pods-TABTestKit_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TABTestKit_Example-frameworks.sh"; sourceTree = ""; }; - EDF4947C9E27BB97B30F06939F64E9E0 /* CellContaining.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CellContaining.swift; sourceTree = ""; }; - EF3CF5B9ABEEA0EDC977AFA1D3653700 /* ActivitySheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ActivitySheet.swift; sourceTree = ""; }; - EFE83F853FC56745500A916FBFE0BD09 /* SystemPreferencesGeneralScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesGeneralScreen.swift; sourceTree = ""; }; + EE1404009DDB760BE1E31CCC5950EF46 /* NavigationContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavigationContext.swift; sourceTree = ""; }; + EF96D9F53868097BAFDE27415EF8ED46 /* StepAction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StepAction.swift; sourceTree = ""; }; F094F44DD0301CC76E1365673D3FCF9C /* ShowTime-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ShowTime-dummy.m"; sourceTree = ""; }; - F2F76C444323B6EB045D04A8CE4B6F18 /* NavigationContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavigationContext.swift; sourceTree = ""; }; - F3F8FE35B25F667403E340317EA9F9FD /* TABTestKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.release.xcconfig; sourceTree = ""; }; - F5109E1F024CAEEB532DC9DC19512FF1 /* XCUIDevice+frame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIDevice+frame.swift"; sourceTree = ""; }; - F5D608343740CFA224AF053B57F66F67 /* Editable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Editable.swift; sourceTree = ""; }; - FBA47936DBE7936C98F0EC94B9E8CEAC /* Biometrics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Biometrics.h; sourceTree = ""; }; + F09670B2248CA33BD5A05396463DC7DB /* TABTestKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-prefix.pch"; sourceTree = ""; }; + F2F0B07615633500EA51A42DA7490BC2 /* SystemPreferencesContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesContext.swift; sourceTree = ""; }; + FA7DCD7F1B963A9EEA6DA99154E69718 /* TABTestKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TABTestKit-Info.plist"; sourceTree = ""; }; + FC125873B3EFEB103E5E93686ACCEA70 /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; + FC46B20374B589B005A9908C70225CDF /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; + FC4ED3C029720CC0633629F1A9A14FC9 /* Picker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Picker.swift; sourceTree = ""; }; FD03AA75DD58014781A38E023C12CD42 /* ShowTime.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ShowTime.release.xcconfig; sourceTree = ""; }; FDC54A8EC562A73143E238094E80179D /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig"; sourceTree = ""; }; + FFA6157708C12EB751341B7814EBCDE8 /* AppContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppContext.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -240,24 +242,24 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 267805C828A9D1D94D9CACAE5C603CDD /* Foundation.framework in Frameworks */, + 72D00E3EC4AC546C8ED0616A85ACA0F3 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 434AAE768A8C9EA8DFD951F6ABAC9D5C /* Frameworks */ = { + 418205BA8D2153848D70D92D706B76AE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A3D01C0F1E1F3BD46CBE767C7A2BD535 /* Foundation.framework in Frameworks */, + 511D6D75092453FCA862CD556E4A3292 /* Foundation.framework in Frameworks */, + A7E465D6DAB265AFAB4B375CF7C50591 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4898BC30FDFD419F968119FDEDDF05A7 /* Frameworks */ = { + 434AAE768A8C9EA8DFD951F6ABAC9D5C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4DF904622DBED25D617FB92185ACCAF7 /* Foundation.framework in Frameworks */, - 33A0126A9943D162EDCC4DE493D8A168 /* XCTest.framework in Frameworks */, + FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -265,27 +267,31 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28C2F366D4A968DBCF276D13CF9EF6CF /* Foundation.framework in Frameworks */, + BF6743BA40FE71C7005AEDC847FA3C1D /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 09D33B2E9C4207D5883730B1CC953ACA /* Contexts */ = { + 0E00B61EFA8FBAB508DCA33045014C1A /* Protocols */ = { isa = PBXGroup; children = ( - 44D3D373915DB3F443D51C091A399226 /* AlertContext.swift */, - B62E07EF0C9BE6DEF51F0BE719EFEB9E /* AppContext.swift */, - A361D13461D8EC6C08FFF31BDF8D1806 /* BiometricsContext.swift */, - D91666C6805484361A8042FE298F3C08 /* InteractionContext.swift */, - B34195E62CE6D4325A0363AF69BD0FB9 /* KeyboardContext.swift */, - F2F76C444323B6EB045D04A8CE4B6F18 /* NavigationContext.swift */, - BD2E454FE7393A49B62A15ECF95C55AF /* SheetContext.swift */, - C886680EDE8E68E288F0B0967127256D /* SystemPreferencesContext.swift */, + FC125873B3EFEB103E5E93686ACCEA70 /* Adjustable.swift */, + 3A1194970946CD5BB5114B6422390CF7 /* CellContaining.swift */, + 5A57D682A4852F19188AA9E4B0FEDED5 /* Completable.swift */, + 149ED91D61E38D4ADE77ECD1C3CDCA8B /* Dismissable.swift */, + E46CB78D2D032E4EAC290B6E830C3C96 /* Editable.swift */, + 715A80E3D9A38499E143D0074A2A6314 /* Element.swift */, + 2044C4793465B9C0C768D78DA10A7679 /* Refreshable.swift */, + 1E4C02A966CF1BC688A54BF0B112D0A9 /* Screen.swift */, + 8C29536084B2800DEE14820D0BE9E084 /* Scrollable.swift */, + 75BF325AC84FB7CC481DFADB84F36E2E /* ScrollableScreen.swift */, + 9E09319DABE4D8C5448854E80E3853ED /* Tappable.swift */, + FC46B20374B589B005A9908C70225CDF /* ValueRepresentable.swift */, ); - name = Contexts; - path = TABTestKit/Classes/Contexts; + name = Protocols; + path = TABTestKit/Classes/Protocols; sourceTree = ""; }; 0EAD851B593C7D383A5B9F66278D5202 /* ShowTime */ = { @@ -294,14 +300,22 @@ EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */, 3AD53452E6F9B27B718A63F5668EEEAC /* Support Files */, ); - name = ShowTime; path = ShowTime; sourceTree = ""; }; + 0ECFFA0BD8E5ECB95E73668449F4FBDC /* include */ = { + isa = PBXGroup; + children = ( + 615131A83CD77EDBDDA573C8A53FDCB9 /* Biometrics.h */, + 153AD2F265BBC65A6F302110A59B6EE2 /* Biometrics-Bridging-Header.h */, + ); + path = include; + sourceTree = ""; + }; 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E285571EF144F8DACCF451128B351DD /* iOS */, + 974814B39C0012DECD183BBB91B32103 /* iOS */, ); name = Frameworks; sourceTree = ""; @@ -309,11 +323,19 @@ 18BB3C90BDF1A5F1D336E77B09EBB1F2 /* Development Pods */ = { isa = PBXGroup; children = ( - F6B926016CF4E01F84A53067AEAFC3D1 /* TABTestKit */, + 85D70514B77813E55820C48EC648606D /* TABTestKit */, ); name = "Development Pods"; sourceTree = ""; }; + 1E164B4E2336CFE66C555DC88213C038 /* Action */ = { + isa = PBXGroup; + children = ( + EF96D9F53868097BAFDE27415EF8ED46 /* StepAction.swift */, + ); + path = Action; + sourceTree = ""; + }; 2C065241B34ABECCB0CE7068DB612DD4 /* Products */ = { isa = PBXGroup; children = ( @@ -342,31 +364,15 @@ path = "Target Support Files/Pods-TABTestKit_Example"; sourceTree = ""; }; - 2FA8FCAA9775EF55974403A605D05230 /* Extensions */ = { + 30CA81CE1C53280781D2B068A2179357 /* Screens */ = { isa = PBXGroup; children = ( - 44A8EB04ABAA59D35775222D7010AA51 /* Array+Safe.swift */, - 409D0012B0FB4B730BAB1D8F54421886 /* CGVector+Offset.swift */, - 0AE3694A3ADDFDB10E97129C26B4C12F /* Element+defaults.swift */, - 9C79CDE470DD3341A0A34BD1C052A973 /* NormalizedCoordinate+Locations.swift */, - 28FC2FFEC625B0FA3CD74A1DA0360038 /* XCTFatalFail.swift */, - F5109E1F024CAEEB532DC9DC19512FF1 /* XCUIDevice+frame.swift */, - 2729792DB920A36618545DE30B46AA58 /* XCUIElement+hasKeyboardFocus.swift */, - 00B178BBB394C26212D58AE9F1A3376E /* XCUIElement+isVisible.swift */, - 58185D0DA6046583EA0F3992B136C18F /* XCUIElement+wait.swift */, + CD7A28A7D202E4E61D15C6A1FB046451 /* SystemPreferencesGeneralScreen.swift */, + 90408CD3B2C81444801D688492D9460E /* SystemPreferencesResetScreen.swift */, + 57A6C582E6031CB7A125F0800F45055D /* systemPreferencesRootScreen.swift */, ); - name = Extensions; - path = TABTestKit/Classes/Extensions; - sourceTree = ""; - }; - 351F0940FBB3A7248B16461D572961DD /* BDD */ = { - isa = PBXGroup; - children = ( - D1AB2E805D93F75BF37BD873B9BF6585 /* Scenario.swift */, - B16CB0412D2D22CA01914F6BAE91169D /* Step.swift */, - ); - name = BDD; - path = TABTestKit/Classes/BDD; + name = Screens; + path = TABTestKit/Classes/Screens; sourceTree = ""; }; 3AD53452E6F9B27B718A63F5668EEEAC /* Support Files */ = { @@ -384,120 +390,107 @@ path = "../Target Support Files/ShowTime"; sourceTree = ""; }; - 3E285571EF144F8DACCF451128B351DD /* iOS */ = { + 7F9009F1182E3BDED6F366005188C8B5 /* Pods */ = { isa = PBXGroup; children = ( - 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */, - 2C061463250766C9C05995AB8EE63E66 /* XCTest.framework */, + 0EAD851B593C7D383A5B9F66278D5202 /* ShowTime */, ); - name = iOS; + name = Pods; sourceTree = ""; }; - 456C8615377475D12A602BADDD74F8AC /* Elements */ = { + 85D70514B77813E55820C48EC648606D /* TABTestKit */ = { isa = PBXGroup; children = ( - EF3CF5B9ABEEA0EDC977AFA1D3653700 /* ActivitySheet.swift */, - E59DB98EC39EB118496B12CB4BE9C95C /* Alert.swift */, - 13B5D2EB83CCADFD7A1E0058D8A2B609 /* Attributes.swift */, - B906394D23C1F041CA4124C3B1FFF2F3 /* Button.swift */, - 1B0AB1F764B8B3C263215AFEFC01143A /* Cell.swift */, - 9DB84493C64353132E6F27571A43A3F6 /* CollectionView.swift */, - D5A869D57AC8EDD0ED0BC6DA6BD96660 /* DatePicker.swift */, - 5EFFE450A2ED2E1A13F6291EF95C4F19 /* Header.swift */, - B99BC68F60289EE3D2B827C55151ED07 /* Icon.swift */, - 310D0511477295F4E8D3A2CECA4D953A /* Image.swift */, - CB2B8E3108E83AEF1A861292D5E667A5 /* Keyboard.swift */, - 288D4CA144C64E07905184F6CBAAE867 /* Label.swift */, - 31BB533F397C5D4FD9F1F0910B521877 /* NavBar.swift */, - 1146247962F18FFC769B180EB17B0A5D /* PageIndicator.swift */, - B8F3ADBAFBD856493872E3528629CE26 /* Picker.swift */, - D3B5FEA5DCDCA2D582C00DE6B76CDC0B /* ScrollView.swift */, - 26E0C2DB87953FDF97B668A8BE0A744E /* SecureTextField.swift */, - 6B82B2F93A1BE5B4C63A8A4CB66E2BE9 /* SegmentedControl.swift */, - 270FD9B498764D8FEA3F42DB3007EE80 /* Sheet.swift */, - 97B6600289CF1454BB2B7A95FE5523AB /* Slider.swift */, - 996EB6D6F78C53D2C9B5D4FBC4C13D84 /* Stepper.swift */, - 833F3150E7163B9CDD9DC3F6667D24AE /* Switch.swift */, - 525F300EF39DA23BCE9573EFDF316426 /* TabBar.swift */, - 0930640B9F785B2533E020EBE1A83252 /* Table.swift */, - 2E96D37C7B544B5D3F8FABFDB3A65DFD /* TextField.swift */, - 2BEC99316035011631C40BFCF3197901 /* TextView.swift */, - 3343170286ADD343A663D64B81BB398B /* View.swift */, - B8889DDD0297F197C953F944C127449C /* WebView.swift */, + 2026D34CB7674FFED1BE47D406D9B597 /* TABTestCase.swift */, + AC73F36C03ABEB18ECABEEB56DEA6C5F /* Apps */, + A170EF323166D08D6104EA4094F0A3E5 /* BDD */, + 920C5A1774C7C2BB227427854E3DF244 /* Biometrics */, + 94B451ED218596EA473804773EEE1E23 /* Contexts */, + D667C66B65FD5FE39D30414BDF4D5655 /* Elements */, + 8832E4BEF8AE3F567354ECB423550F9A /* Extensions */, + F163C1772F5C6E3EB1BC6C339AF46D83 /* Pod */, + 0E00B61EFA8FBAB508DCA33045014C1A /* Protocols */, + 30CA81CE1C53280781D2B068A2179357 /* Screens */, + C8186AD6D4F57687B3FF5A4DAF11B83F /* Support Files */, ); - name = Elements; - path = TABTestKit/Classes/Elements; + name = TABTestKit; + path = ../..; sourceTree = ""; }; - 6A7EBFBEC7844CA8D6AD72301695BC6E /* Apps */ = { + 8832E4BEF8AE3F567354ECB423550F9A /* Extensions */ = { isa = PBXGroup; children = ( - D633AFB6915D96D516CD0872E60E2415 /* App.swift */, - 063860976CBFED0CEABD0E3213F93A8E /* BaseApp.swift */, - 378BEB1C3B86DE939F26118388E95363 /* Safari.swift */, - 4A9E2EEC134947F1BCADD81AFCF32A5B /* Springboard.swift */, - E4508197147D357E5AC5F92B14089EC1 /* SystemPreferences.swift */, + 760EC83C92512F8EBC55188AC82EEF94 /* Array+Safe.swift */, + BF84DFAA86AB4BDBA6D94F5A66C3984D /* CGVector+Offset.swift */, + 025EF15BCB08745BD9C4C4B4AB26450D /* Element+defaults.swift */, + 297B44527731C02E0B19295DB523568F /* NormalizedCoordinate+Locations.swift */, + 0FDA9F7A425746A960A32C149C5455EC /* XCTFatalFail.swift */, + 88F91005C0CA7E7AB203F33B8DDF0BDA /* XCUIDevice+frame.swift */, + AABB82F79590AA2D0458F8674BFCB4FD /* XCUIElement+hasKeyboardFocus.swift */, + 976E5B1537BAD0007743ADFE257F3ED9 /* XCUIElement+isVisible.swift */, + E1848ED8032296034A5B64A0616D8A8E /* XCUIElement+wait.swift */, ); - name = Apps; - path = TABTestKit/Classes/Apps; + name = Extensions; + path = TABTestKit/Classes/Extensions; sourceTree = ""; }; - 7828C064F857E3C1EAE7C9B73201E07C /* Pod */ = { + 920C5A1774C7C2BB227427854E3DF244 /* Biometrics */ = { isa = PBXGroup; children = ( - E97F64AF467C08D1FB58F73CF59C7EB4 /* LICENSE */, - 9636ED3E95A98C45C798682289AABB5A /* README.md */, - 5029125F64A9A19889E338765CD0299E /* TABTestKit.podspec */, + D986710E90E0E2B27659F1C5931FF615 /* Biometrics.m */, + 0ECFFA0BD8E5ECB95E73668449F4FBDC /* include */, ); - name = Pod; + name = Biometrics; + path = TABTestKit/Classes/Biometrics; sourceTree = ""; }; - 7983087C3129CCABC779E3D0EC3D3BFE /* include */ = { + 94B451ED218596EA473804773EEE1E23 /* Contexts */ = { isa = PBXGroup; children = ( - FBA47936DBE7936C98F0EC94B9E8CEAC /* Biometrics.h */, - 76351B41B9C4CCADF915B35D11C74EAC /* Biometrics-Bridging-Header.h */, + 1FF2C9E6830DB96BBF7BD5C41F5B1C84 /* AlertContext.swift */, + FFA6157708C12EB751341B7814EBCDE8 /* AppContext.swift */, + E74E8DD8489CD119E2996B2D7AA50966 /* BiometricsContext.swift */, + 37A07B83AE28D9690E0C0D9EB1D6B8EA /* InteractionContext.swift */, + D94A0FB25BE70C26B804A9A2603B49BA /* KeyboardContext.swift */, + EE1404009DDB760BE1E31CCC5950EF46 /* NavigationContext.swift */, + 656317B1689F8389F8D8A13FB0281F7E /* SheetContext.swift */, + F2F0B07615633500EA51A42DA7490BC2 /* SystemPreferencesContext.swift */, + 1E164B4E2336CFE66C555DC88213C038 /* Action */, ); - name = include; - path = include; + name = Contexts; + path = TABTestKit/Classes/Contexts; sourceTree = ""; }; - 7BBFEA5590048061B9C0E421C6913A22 /* Biometrics */ = { + 974814B39C0012DECD183BBB91B32103 /* iOS */ = { isa = PBXGroup; children = ( - 516FEC36F601143A1A7D9C4483043E02 /* Biometrics.m */, - 7983087C3129CCABC779E3D0EC3D3BFE /* include */, + CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */, + 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */, ); - name = Biometrics; - path = TABTestKit/Classes/Biometrics; + name = iOS; sourceTree = ""; }; - 7F9009F1182E3BDED6F366005188C8B5 /* Pods */ = { + A170EF323166D08D6104EA4094F0A3E5 /* BDD */ = { isa = PBXGroup; children = ( - 0EAD851B593C7D383A5B9F66278D5202 /* ShowTime */, + 0D9864B94D0C97C982DACCDD8B382B1E /* Scenario.swift */, + B8ADED80001DED8F960B8A08F3F1026D /* Step.swift */, ); - name = Pods; + name = BDD; + path = TABTestKit/Classes/BDD; sourceTree = ""; }; - A0704CDE6B94E4F4482FBC2CDDF1C733 /* Protocols */ = { + AC73F36C03ABEB18ECABEEB56DEA6C5F /* Apps */ = { isa = PBXGroup; children = ( - 5E1A9256A8DD33C89BAAB57A235F2804 /* Adjustable.swift */, - EDF4947C9E27BB97B30F06939F64E9E0 /* CellContaining.swift */, - 733C9EB16F7A1DF6E9E333F54B511D02 /* Completable.swift */, - A3EE8B1C53D5F26ACBFF010AEABAE28B /* Dismissable.swift */, - F5D608343740CFA224AF053B57F66F67 /* Editable.swift */, - 99645CE216E89A6655EC66E732CECD38 /* Element.swift */, - 0C38F549CCB18E20A90695795AEC5AC6 /* Refreshable.swift */, - 7EECF51F8060F5B8BFA4281A38586E83 /* Screen.swift */, - 11F2A3A2A26E9B32CC1F97EE09E1F276 /* Scrollable.swift */, - 9D132E7F63ED7978B99EF4975197150F /* ScrollableScreen.swift */, - E846D1B6D74DE542E5CA9527BD39F15F /* Tappable.swift */, - 42287AC46DDDC0D1AA7184E181C68C89 /* ValueRepresentable.swift */, + 58E1F208D3BC3FE76031A1E12102E345 /* App.swift */, + 2916459F4C61003896E56CF7908EEC77 /* BaseApp.swift */, + 9EEEDF5103B9F8405649E4D01A6F91F6 /* Safari.swift */, + 2D2E06167D45FF1CD5C3C7579BEF0CCC /* Springboard.swift */, + B17E5A6B3BBA55868A7DDA07A8771ACA /* SystemPreferences.swift */, ); - name = Protocols; - path = TABTestKit/Classes/Protocols; + name = Apps; + path = TABTestKit/Classes/Apps; sourceTree = ""; }; BF4BFAF140349307273B1343616A213B /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests */ = { @@ -517,16 +510,16 @@ path = "Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; sourceTree = ""; }; - C5A671305C6457E83B366DFDC513209E /* Support Files */ = { + C8186AD6D4F57687B3FF5A4DAF11B83F /* Support Files */ = { isa = PBXGroup; children = ( - 13BA1BD868EA98BFAF1291D67025BC2E /* TABTestKit.modulemap */, - 76218D3926FC14AD26D4F85F24A78116 /* TABTestKit-dummy.m */, - 0AF0A2E0D69C6A4EF1AB4402DB0A38EA /* TABTestKit-Info.plist */, - D87AACBC58E2252912FEC4132CF481CE /* TABTestKit-prefix.pch */, - 39F10CDF64864F18B3EEAAE5618F2993 /* TABTestKit-umbrella.h */, - 10B1611A1B50B1DA5565DB251CBF81F4 /* TABTestKit.debug.xcconfig */, - F3F8FE35B25F667403E340317EA9F9FD /* TABTestKit.release.xcconfig */, + D65FF7511026254AD42DCA65B096E729 /* TABTestKit.modulemap */, + 5B81AB3802539BA40C55F66E8195FD5C /* TABTestKit-dummy.m */, + FA7DCD7F1B963A9EEA6DA99154E69718 /* TABTestKit-Info.plist */, + F09670B2248CA33BD5A05396463DC7DB /* TABTestKit-prefix.pch */, + 2230FEC425952A5BA46EC7FDD23058D1 /* TABTestKit-umbrella.h */, + 476A6223DF0F58F25425C2F46B6EEC2C /* TABTestKit.debug.xcconfig */, + D390EE6C19BFD5F1C1C797DDE47E11AE /* TABTestKit.release.xcconfig */, ); name = "Support Files"; path = "Example/Pods/Target Support Files/TABTestKit"; @@ -544,34 +537,50 @@ ); sourceTree = ""; }; - D76E1F2CA7E4E47763301BE5EBF14D5C /* Screens */ = { + D667C66B65FD5FE39D30414BDF4D5655 /* Elements */ = { isa = PBXGroup; children = ( - EFE83F853FC56745500A916FBFE0BD09 /* SystemPreferencesGeneralScreen.swift */, - 21A5843633E4D75EE8E1556F939DB746 /* SystemPreferencesResetScreen.swift */, - E8D0C69508B528128406927836573B67 /* systemPreferencesRootScreen.swift */, + 184A29E3CD8F8FF08FAED47BE68CB72F /* ActivitySheet.swift */, + A78E3481BE402A4FDF449CAC1F905879 /* Alert.swift */, + A92FD9CDEED38DB956AF467A2FDF2E50 /* Attributes.swift */, + 9EDBFD83FEF615ADC0D94D503B355C4F /* Button.swift */, + 5D829733A2418052EC220B9F4AC655D5 /* Cell.swift */, + BE8CCF054B911545AED8388FFB343F82 /* CollectionView.swift */, + D22E3B09F25859704FF547774837360F /* DatePicker.swift */, + E4E90763630537295317F66AA307F8D6 /* Header.swift */, + E0DC2299BB313B3066A280DEC1E5CDB0 /* Icon.swift */, + E072805065CBE35D26F3B040D2B421CF /* Image.swift */, + E214E6576455D02201D7B55F31A4133F /* Keyboard.swift */, + 499A0952B5A4C30C064B2490AA26968C /* Label.swift */, + 22D53904E3AE615F5E554DEF60414590 /* NavBar.swift */, + 473AA326F87C4822D3DEF5DCCF966EE8 /* PageIndicator.swift */, + FC4ED3C029720CC0633629F1A9A14FC9 /* Picker.swift */, + B1E8D8FAF1D803A9233EF39DA854BB82 /* ScrollView.swift */, + 8DDF7E00678659F81ED27C85A2021C4A /* SecureTextField.swift */, + E6303D83C1AD37A8EBD76AC289A8B879 /* SegmentedControl.swift */, + C2B4A426013298D3CA6A5F02BCF6816A /* Sheet.swift */, + 2E8A44FD7A43078E47015085C7ECBCD3 /* Slider.swift */, + AE1C097DE9EF042095E371FF0D20AA4B /* Stepper.swift */, + CAC36AF763EBBF2DF4B36283B4C75793 /* Switch.swift */, + 3F5D26D3157B797157282240E8EAB587 /* TabBar.swift */, + 9AAD3CF2833BFDFB728F571AA636BAEA /* Table.swift */, + 8B7C80EA631CE3D4F91D5A0ACE3C07DD /* TextField.swift */, + B85AFC7AC121EDD585A794CBEF219ED8 /* TextView.swift */, + 281BE70296D811DC0C196F1952BE0179 /* View.swift */, + 092EC4D876C695B96674917011FCC5FA /* WebView.swift */, ); - name = Screens; - path = TABTestKit/Classes/Screens; + name = Elements; + path = TABTestKit/Classes/Elements; sourceTree = ""; }; - F6B926016CF4E01F84A53067AEAFC3D1 /* TABTestKit */ = { + F163C1772F5C6E3EB1BC6C339AF46D83 /* Pod */ = { isa = PBXGroup; children = ( - C9017D3505D12281FD18FE6120B0A5DE /* TABTestCase.swift */, - 6A7EBFBEC7844CA8D6AD72301695BC6E /* Apps */, - 351F0940FBB3A7248B16461D572961DD /* BDD */, - 7BBFEA5590048061B9C0E421C6913A22 /* Biometrics */, - 09D33B2E9C4207D5883730B1CC953ACA /* Contexts */, - 456C8615377475D12A602BADDD74F8AC /* Elements */, - 2FA8FCAA9775EF55974403A605D05230 /* Extensions */, - 7828C064F857E3C1EAE7C9B73201E07C /* Pod */, - A0704CDE6B94E4F4482FBC2CDDF1C733 /* Protocols */, - D76E1F2CA7E4E47763301BE5EBF14D5C /* Screens */, - C5A671305C6457E83B366DFDC513209E /* Support Files */, + 1794163B004EA69BCBE099E34F056F90 /* LICENSE */, + 8591E75230F75ECEE5BEC23D21898581 /* README.md */, + 868ADACA5883EB6D8424E49AA839A438 /* TABTestKit.podspec */, ); - name = TABTestKit; - path = ../..; + name = Pod; sourceTree = ""; }; F7FD97F3CC6F18F4AAAE10E5DE0D2076 /* Targets Support Files */ = { @@ -586,16 +595,6 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0C0F97697811C405610881996CE9A656 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 06F0BA93FE06A8B562D3D88F82D1FF43 /* Biometrics-Bridging-Header.h in Headers */, - 22AB496E63075EE106F9BA6B4D5CA93A /* Biometrics.h in Headers */, - 3DDA18D51471D4B5A53CA30FB7A4800E /* TABTestKit-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 1546A71728D546C8D2A345948964F954 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -620,6 +619,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + D356A50F312242BCA3664228963A3A48 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 607E4FE677496D6D5046DD9B998F44DD /* Biometrics-Bridging-Header.h in Headers */, + BB36BBFC917C379101B97E49B7C8C6A2 /* Biometrics.h in Headers */, + A4B195BEC072B3D3D043AC9043325480 /* TABTestKit-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -635,8 +644,8 @@ buildRules = ( ); dependencies = ( - 6ABED8E8798787021313E7A6A34C5822 /* PBXTargetDependency */, - D2C0AE78D1A7C3188C075C052FB16CB6 /* PBXTargetDependency */, + EA47B01DB270D1A566E7ECA62E92083E /* PBXTargetDependency */, + 495B0C8160E87358E035F1F9A14ADDE5 /* PBXTargetDependency */, ); name = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; productName = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; @@ -655,7 +664,7 @@ buildRules = ( ); dependencies = ( - 6B4FC25B4CF187B3889A0C4A44770FBA /* PBXTargetDependency */, + 05D629619F9F1F155F63B187B430CDD3 /* PBXTargetDependency */, ); name = "Pods-TABTestKit_Example"; productName = "Pods-TABTestKit_Example"; @@ -682,12 +691,12 @@ }; 9C4F771642E79689CC6A0648ABEA808C /* TABTestKit */ = { isa = PBXNativeTarget; - buildConfigurationList = 46ECDB4027B6A2823CE01521E3099989 /* Build configuration list for PBXNativeTarget "TABTestKit" */; + buildConfigurationList = 69E5949F88046C827AC56987D8B59AA2 /* Build configuration list for PBXNativeTarget "TABTestKit" */; buildPhases = ( - 0C0F97697811C405610881996CE9A656 /* Headers */, - EA289E9666BF0769FC14C34FFE0689C0 /* Sources */, - 4898BC30FDFD419F968119FDEDDF05A7 /* Frameworks */, - 625FBD6C7BFFC36DD292F6F3A64839A9 /* Resources */, + D356A50F312242BCA3664228963A3A48 /* Headers */, + 3E062CB356E7277E2EE56872DBCE18B8 /* Sources */, + 418205BA8D2153848D70D92D706B76AE /* Frameworks */, + 7492929DE215F3C71C8EFA0E05E51C92 /* Resources */, ); buildRules = ( ); @@ -736,7 +745,7 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 625FBD6C7BFFC36DD292F6F3A64839A9 /* Resources */ = { + 7492929DE215F3C71C8EFA0E05E51C92 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -768,130 +777,131 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9D50542E455CC3979D6826F7F6B472DE /* Sources */ = { + 3E062CB356E7277E2EE56872DBCE18B8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7E7556B81F678C3A6E6580D9039C676A /* Pods-TABTestKit_Example-dummy.m in Sources */, + C8329B375D10AE87331E532409BB51C6 /* ActivitySheet.swift in Sources */, + 204619BA88B79A0A38CE757859A37EC8 /* Adjustable.swift in Sources */, + D9C87601EDBA2030486ECA748E65693F /* Alert.swift in Sources */, + CEF0F61CEA6A291ECE769EEE0EE67CE2 /* AlertContext.swift in Sources */, + 77E53D47B396A553F04FD9770B92EFDE /* App.swift in Sources */, + E273C321857663376A2DD140D4128DF2 /* AppContext.swift in Sources */, + 7E1ABD14D61D063FBBD27FC841E05A59 /* Array+Safe.swift in Sources */, + 728FE99FD0CE9401CFA2752F4B3A56EE /* Attributes.swift in Sources */, + 8C7FE2BCC4F430E5425E85E25BA62A70 /* BaseApp.swift in Sources */, + C9B1B4B9ADB19D402DC91F9810176A0A /* Biometrics.m in Sources */, + 24434A6AD8C5B0B6F299F883C087D75F /* BiometricsContext.swift in Sources */, + A70409F4523267C2454E0CC80FFBB3FC /* Button.swift in Sources */, + FA5FE4421DD144891167A9BBA2FC9DA5 /* Cell.swift in Sources */, + 864EF0C73ED7C41B254B7DDA8755FB93 /* CellContaining.swift in Sources */, + BDD923D69FE552C4696A7BD85516FE67 /* CGVector+Offset.swift in Sources */, + B04E97D1F83E7D0C2C06311A3C941CDB /* CollectionView.swift in Sources */, + 1F38EFDFA992989D1F842F283343D571 /* Completable.swift in Sources */, + 2E9EAD4A7F3B3392B572ED690DCABC20 /* DatePicker.swift in Sources */, + 0526DE7ECA45A28FA1B5AEF4C07049E4 /* Dismissable.swift in Sources */, + A9FA41F25B8BC1FD497E26444897E649 /* Editable.swift in Sources */, + B505C57F9951DF732BE85B3F79A45082 /* Element+defaults.swift in Sources */, + B4E611CBED96EAE1973130134CFAF1F8 /* Element.swift in Sources */, + BA01284A4D51779CE18C4B4B1072E600 /* Header.swift in Sources */, + ABF987C8B05650B7F587B98CF8D49040 /* Icon.swift in Sources */, + 4AF4160DAFDFE90B91E767F11D53C676 /* Image.swift in Sources */, + 0B6D2B8E54F6A7A48D48594517090835 /* InteractionContext.swift in Sources */, + 42A829C16312CA165D00DACC0ADEC0EA /* Keyboard.swift in Sources */, + A29A51BD9D9C4DE0FC4ADBF9B866D437 /* KeyboardContext.swift in Sources */, + 6355B326EDD3C569A10F9CD737ABDD37 /* Label.swift in Sources */, + BB9D41F5E8A093EBC9EDE2DFBF5EF784 /* NavBar.swift in Sources */, + AD68A7303B63A43663767D46878A6449 /* NavigationContext.swift in Sources */, + EC20F678A51FFAD90B3D3D1F76C58719 /* NormalizedCoordinate+Locations.swift in Sources */, + B16D01DE1E4487F2B39335D599CBFF0A /* PageIndicator.swift in Sources */, + FEE6DD6A8EDEDF4078C41A22CEE26DE7 /* Picker.swift in Sources */, + 46775302AF7999648B09D9ED3EE48C74 /* Refreshable.swift in Sources */, + 34DEA23FC760111AC8D6ED0ACD1657AB /* Safari.swift in Sources */, + D58CD66F5B82023A328B46FC39D2C44B /* Scenario.swift in Sources */, + 30A3E04F64979C6D3D1CE35E32E3211A /* Screen.swift in Sources */, + 941194E6C860FAA1FA7F87D8B1CE7ED0 /* Scrollable.swift in Sources */, + 7FFF240E73592A018E7EF51D34C46822 /* ScrollableScreen.swift in Sources */, + 8F20672129F9D3960CD2C81807143AA6 /* ScrollView.swift in Sources */, + 6E5998C704D81C5561D9F3A0AE87E3F4 /* SecureTextField.swift in Sources */, + 660673CF4BD18AF55C3081895930F715 /* SegmentedControl.swift in Sources */, + 4CF8C1EB590C78B81CCAF8907F83B665 /* Sheet.swift in Sources */, + F7A4CDA05AB92DA971CDBBDEDF78F974 /* SheetContext.swift in Sources */, + 2B247D46ADB72B94A03A0692F9371692 /* Slider.swift in Sources */, + EC38D41C9E6F9C66D1A6184EDFB74184 /* Springboard.swift in Sources */, + EC47F602CD37E5EC24DE51E7875BA16A /* Step.swift in Sources */, + 8B2F8F080ECC1DE1DB954E16F23F0FBE /* Stepper.swift in Sources */, + BA8CF7D98500DADAD801E5914AB1A8F4 /* Switch.swift in Sources */, + FFB682562D658DE0039CA1B643E5B987 /* SystemPreferences.swift in Sources */, + 2F6C3202D54D6620EC5BF96782955D5A /* SystemPreferencesContext.swift in Sources */, + CCDFD3C2EDCC10DE9FDE0397CF868A28 /* SystemPreferencesGeneralScreen.swift in Sources */, + 447DB66D7F291D402E2F204F75E4448A /* SystemPreferencesResetScreen.swift in Sources */, + F8C8632658B840BA4531A5F8EEA2521E /* systemPreferencesRootScreen.swift in Sources */, + 6643C096FB4A1113F2FAC7B3A2FFEE37 /* TabBar.swift in Sources */, + EB84A3CBE94963C26AD0D70463996617 /* Table.swift in Sources */, + B5042D490C77BDC6BBF549D2197C7434 /* TABTestCase.swift in Sources */, + 248E3015488597454E4DB64E1CBD9F33 /* TABTestKit-dummy.m in Sources */, + A8C378399954F4B3FF9A059EFDC6E0CA /* Tappable.swift in Sources */, + 8760E5691C6B92CAAC17935225A01921 /* StepAction.swift in Sources */, + 2F7918BEF8541A66867040B87BD3C527 /* TextField.swift in Sources */, + F4BF8B887488C4B0900D5C36A2B48886 /* TextView.swift in Sources */, + 700688692E1A02B5BD67FF220AEE4647 /* ValueRepresentable.swift in Sources */, + EE2DE74B688C2BA2BCA8D8D56B3CDE42 /* View.swift in Sources */, + 434755ECAB25587245B6D59856CAF2AE /* WebView.swift in Sources */, + E017FF0578E7F7F6958DBBC66FD4091B /* XCTFatalFail.swift in Sources */, + 8A39120AAB3F245151C6EC45731384E8 /* XCUIDevice+frame.swift in Sources */, + 129360CE5E67138943C2C4748D82367A /* XCUIElement+hasKeyboardFocus.swift in Sources */, + A103AA3DDCC0C574830CCD6754CC4FB7 /* XCUIElement+isVisible.swift in Sources */, + 9E751CCA8B991AD984B5F2DB579EFEF9 /* XCUIElement+wait.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A3D1DBE0B97482C7D9E971A0A69C18FE /* Sources */ = { + 9D50542E455CC3979D6826F7F6B472DE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3C892CB7517172243FF2DA110515208C /* ShowTime-dummy.m in Sources */, - BA42C86F6872AC87ADF7110F65920109 /* ShowTime.swift in Sources */, + 7E7556B81F678C3A6E6580D9039C676A /* Pods-TABTestKit_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - EA289E9666BF0769FC14C34FFE0689C0 /* Sources */ = { + A3D1DBE0B97482C7D9E971A0A69C18FE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 037438E458F376D3ED3311C9C9C424D1 /* ActivitySheet.swift in Sources */, - 94D870EB04EAD571F26204DFA1DE5BF8 /* Adjustable.swift in Sources */, - 1EEECE824542B4516057559E98B80E1C /* Alert.swift in Sources */, - B169B20C039E782186565E2E52ACB787 /* AlertContext.swift in Sources */, - 24D51ED262D69888D4892E35D4B296B1 /* App.swift in Sources */, - 965F572E8A4577F5564E718B08CA0DEC /* AppContext.swift in Sources */, - E11FF4E3610B51833B5B25BFEC9439EB /* Array+Safe.swift in Sources */, - 67BDAF48BC71ADD6FFBD9BC3F60CC489 /* Attributes.swift in Sources */, - C45F1CA24939CFC0EA011576B184E517 /* BaseApp.swift in Sources */, - C28393A7BA4949E7EC11BA68290E0A89 /* Biometrics.m in Sources */, - 672CCDA6A5E3879637348218DCC4A967 /* BiometricsContext.swift in Sources */, - 1FDB0E9D01FF2441B2C4BFDB3367E927 /* Button.swift in Sources */, - 7E50C1883D363FEBF04C6B1F0D12E834 /* Cell.swift in Sources */, - 56D50EAF7965D5AE0E5181A61398C2FE /* CellContaining.swift in Sources */, - F19E657512049CDD2FD1414E408073C8 /* CGVector+Offset.swift in Sources */, - 84B1885DB2D83AFD090C3CCCA8472C4E /* CollectionView.swift in Sources */, - 707000A4026440BF85F559F095DEB890 /* Completable.swift in Sources */, - 030C8476D8BE89065E5328E67EF56752 /* DatePicker.swift in Sources */, - 6D14253BA9582C897106391DA95677C5 /* Dismissable.swift in Sources */, - 073BB799FC643900737132A1DAC712C1 /* Editable.swift in Sources */, - F67B7C7FDE9074CDCFA68E004947AA92 /* Element+defaults.swift in Sources */, - A41B5CCF42789157090E258FE089586C /* Element.swift in Sources */, - 6BEE0D6E2E2AB96DD64F04F9B4C33B2D /* Header.swift in Sources */, - 25CB8336A1F82DDC9CD5005EFBB7F29B /* Icon.swift in Sources */, - FB1E11C5834A94EA4E92203A824C7712 /* Image.swift in Sources */, - 205F7DF3026977DA94FAC59A3D0B9F32 /* InteractionContext.swift in Sources */, - EBD37C76644005FA6D30F6FCAA57EA58 /* Keyboard.swift in Sources */, - 1CF73984D3297083B164E8AFDFB68A9D /* KeyboardContext.swift in Sources */, - DA63CBAA1FD4B0B8D56B351BC7B277F4 /* Label.swift in Sources */, - 74FE7D271C05B5F5CF16CD40289ED053 /* NavBar.swift in Sources */, - 1F4FEC3156C65D28F6B9458BD75E2F88 /* NavigationContext.swift in Sources */, - E09FEFAFFD39157648FFABB51E2EB3EA /* NormalizedCoordinate+Locations.swift in Sources */, - 697DDFCEB90BB157DB000D322CD19D5C /* PageIndicator.swift in Sources */, - B355BFBF02732C2EFDFCC79CE84DBEEF /* Picker.swift in Sources */, - C9939C0BDAD41AA1F33BE52342C396FB /* Refreshable.swift in Sources */, - D83B7250A5C7CDFE4F64E0EEDD639892 /* Safari.swift in Sources */, - FB0F482C6EC685FC996684E7E0C58A81 /* Scenario.swift in Sources */, - 1769E66936A8148901759A505D1134D8 /* Screen.swift in Sources */, - B3F91A927D31FD30CAE8C721D3CDD916 /* Scrollable.swift in Sources */, - 297A89E5D9EA42B0F082560478BD138D /* ScrollableScreen.swift in Sources */, - 981319D676A5ECFF485A539211C464A2 /* ScrollView.swift in Sources */, - CE96ADAED2FDB8BB47A327A08562475C /* SecureTextField.swift in Sources */, - 11278B65581A09C350D0FE282C241B2F /* SegmentedControl.swift in Sources */, - 7FF9CA487AB366CCB8F77DD7B22AB8F4 /* Sheet.swift in Sources */, - AE182ECBB0181991D6E601FF083869A3 /* SheetContext.swift in Sources */, - 481F82DB88069C6B92FF1778580B39F6 /* Slider.swift in Sources */, - E558577851F19778E543AE6D7DCFF30A /* Springboard.swift in Sources */, - D8771E317705B1A18BFDE9E3C391EF7F /* Step.swift in Sources */, - E3AA3BD0B36A8D7D0DDADCA23C123130 /* Stepper.swift in Sources */, - 232838548112A58B1405F1649A3C8D5A /* Switch.swift in Sources */, - 4CF2489EF04BC5D95D8CC7B883F8F136 /* SystemPreferences.swift in Sources */, - 0E61D42891FE5FEC32F4F79B64A0A31A /* SystemPreferencesContext.swift in Sources */, - 96CF87699933D48A91FDD92BBBBD3A96 /* SystemPreferencesGeneralScreen.swift in Sources */, - 145EF16BC9E3275A3BE2EA2E24CCC25B /* SystemPreferencesResetScreen.swift in Sources */, - 214C5AC2BEB372773B81A89E3CA9649E /* systemPreferencesRootScreen.swift in Sources */, - B390F02F5BF0E704C2530E6B864C8DA4 /* TabBar.swift in Sources */, - 8722F7FE01B09905CE43F5FE2F84E4AB /* Table.swift in Sources */, - 723BE432EFB0A62753F492943A3A67B4 /* TABTestCase.swift in Sources */, - B958E7CE0D4615F3F9D93D4E33F4DF36 /* TABTestKit-dummy.m in Sources */, - 6693CC10486D411C5AEE771A4DED0AB4 /* Tappable.swift in Sources */, - C5E46852D59375EE4308956FD7ACADE6 /* TextField.swift in Sources */, - E9BA1D90C07B623069A2D6BB1686441B /* TextView.swift in Sources */, - F566D30798059D2B906BF3245752870F /* ValueRepresentable.swift in Sources */, - E87367920E610653998714517B01869C /* View.swift in Sources */, - 6FB96E7AE7560CFFE96A83D5A2B9FFC9 /* WebView.swift in Sources */, - 9D1D06B968FEF34BEFBC5DA3B5F211A3 /* XCTFatalFail.swift in Sources */, - 22824B0B33B4C8170ED1DE4ABC96A61A /* XCUIDevice+frame.swift in Sources */, - D86774E04E3EAF51A19C123A7D21000A /* XCUIElement+hasKeyboardFocus.swift in Sources */, - 9914EC8EA7D7B376F4F8046D2F5A8380 /* XCUIElement+isVisible.swift in Sources */, - 4D991C4CAEF57EB28E0F107BCBCC5464 /* XCUIElement+wait.swift in Sources */, + 3C892CB7517172243FF2DA110515208C /* ShowTime-dummy.m in Sources */, + BA42C86F6872AC87ADF7110F65920109 /* ShowTime.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 6ABED8E8798787021313E7A6A34C5822 /* PBXTargetDependency */ = { + 05D629619F9F1F155F63B187B430CDD3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ShowTime; target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; - targetProxy = A5E99FC687310BF5C8B3315D4816D50E /* PBXContainerItemProxy */; + targetProxy = 754B214DB1E883537932FD5B5ED94709 /* PBXContainerItemProxy */; }; - 6B4FC25B4CF187B3889A0C4A44770FBA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ShowTime; - target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; - targetProxy = C5E51B0AE3854C7BCA159A65A87A74D4 /* PBXContainerItemProxy */; - }; - D2C0AE78D1A7C3188C075C052FB16CB6 /* PBXTargetDependency */ = { + 495B0C8160E87358E035F1F9A14ADDE5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = TABTestKit; target = 9C4F771642E79689CC6A0648ABEA808C /* TABTestKit */; - targetProxy = 459B20C91CD2950F24B4BC4D74B43491 /* PBXContainerItemProxy */; + targetProxy = CB3F99CE3F0D729A59560288C1918820 /* PBXContainerItemProxy */; + }; + EA47B01DB270D1A566E7ECA62E92083E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ShowTime; + target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; + targetProxy = 902C0ED431E559D207A6E8DBB73303A3 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 040B3C23F3536587D5A4EB91C89D63A1 /* Debug */ = { + 1646DCD1D131AC6871E47A82611B9CA3 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA47AB426A72CF612E6CDF50B0E91C8F /* ShowTime.debug.xcconfig */; + baseConfigurationReference = 476A6223DF0F58F25425C2F46B6EEC2C /* TABTestKit.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CODE_SIGN_IDENTITY = ""; + CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -900,14 +910,14 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/ShowTime/ShowTime-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/ShowTime/ShowTime-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/TABTestKit/TABTestKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/TABTestKit/TABTestKit-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/ShowTime/ShowTime.modulemap"; - PRODUCT_MODULE_NAME = ShowTime; - PRODUCT_NAME = ShowTime; + MODULEMAP_FILE = "Target Support Files/TABTestKit/TABTestKit.modulemap"; + PRODUCT_MODULE_NAME = TABTestKit; + PRODUCT_NAME = TABTestKit; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -918,14 +928,13 @@ }; name = Debug; }; - 0BFA6A1F08DB617ED88EA69685ABDDE4 /* Release */ = { + 434AD7DDD7CDC54CD05BBA56068285F5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 965A292F186CF36A47FF8AB1CADE1B85 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig */; + baseConfigurationReference = AFD57256DAD4C8414BD38FD34982C7B0 /* Pods-TABTestKit_Example.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -934,12 +943,12 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -954,13 +963,44 @@ }; name = Release; }; - 5461FC43C9BCAC3590847BBEA1352C97 /* Release */ = { + 5407334CEC971382882AB78E99C30C7D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FD03AA75DD58014781A38E023C12CD42 /* ShowTime.release.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/ShowTime/ShowTime-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ShowTime/ShowTime-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/ShowTime/ShowTime.modulemap"; + PRODUCT_MODULE_NAME = ShowTime; + PRODUCT_NAME = ShowTime; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 61081AD43A298056B736B34131E3076D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F3F8FE35B25F667403E340317EA9F9FD /* TABTestKit.release.xcconfig */; + baseConfigurationReference = D390EE6C19BFD5F1C1C797DDE47E11AE /* TABTestKit.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -988,10 +1028,45 @@ }; name = Release; }; - 6410F571BA8C1AEC6A19403F1B61B0B5 /* Debug */ = { + 629D06E19575297CAE6C6F248B858401 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 14146CA31421B9CAE5A93C48F6E9FFAF /* Pods-TABTestKit_Example.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 6C98B09FF5CCB107837D1A84E8F3A4F1 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -1014,6 +1089,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1021,16 +1097,13 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", + "POD_CONFIGURATION_RELEASE=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1040,91 +1113,21 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.4; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; - name = Debug; - }; - 7B8B0B183596E59238D618A15FFBF496 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AFD57256DAD4C8414BD38FD34982C7B0 /* Pods-TABTestKit_Example.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; name = Release; }; - 9C013AE42837DDBED81C8A67FA1E1264 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FD03AA75DD58014781A38E023C12CD42 /* ShowTime.release.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/ShowTime/ShowTime-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/ShowTime/ShowTime-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/ShowTime/ShowTime.modulemap"; - PRODUCT_MODULE_NAME = ShowTime; - PRODUCT_NAME = ShowTime; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - A27713CB74E99AF202AADC23200A32F4 /* Release */ = { + 8E6A8FF58D100B7F9B1943F455C00F02 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -1147,6 +1150,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1154,13 +1158,16 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1170,24 +1177,23 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.4; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; - name = Release; + name = Debug; }; - B5CE3F147104D954E37FBE9577891D2E /* Debug */ = { + BA33D30D021A068EC0F3ABCB9902BD57 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 10B1611A1B50B1DA5565DB251CBF81F4 /* TABTestKit.debug.xcconfig */; + baseConfigurationReference = AA47AB426A72CF612E6CDF50B0E91C8F /* ShowTime.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1196,14 +1202,14 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/TABTestKit/TABTestKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/TABTestKit/TABTestKit-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/ShowTime/ShowTime-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ShowTime/ShowTime-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/TABTestKit/TABTestKit.modulemap"; - PRODUCT_MODULE_NAME = TABTestKit; - PRODUCT_NAME = TABTestKit; + MODULEMAP_FILE = "Target Support Files/ShowTime/ShowTime.modulemap"; + PRODUCT_MODULE_NAME = ShowTime; + PRODUCT_NAME = ShowTime; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -1214,14 +1220,13 @@ }; name = Debug; }; - C3C3A1E9CBD3ACA59EE6FEB79CB855BF /* Debug */ = { + D45A84110BABE7AA265F8CFFD2B22A56 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 14146CA31421B9CAE5A93C48F6E9FFAF /* Pods-TABTestKit_Example.debug.xcconfig */; + baseConfigurationReference = FDC54A8EC562A73143E238094E80179D /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1230,12 +1235,12 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1249,14 +1254,13 @@ }; name = Debug; }; - CE151341453F4E20E4C42D1306D5AC47 /* Debug */ = { + E4B54416D67231A088E7DB1D7AA6FFA6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FDC54A8EC562A73143E238094E80179D /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig */; + baseConfigurationReference = 965A292F186CF36A47FF8AB1CADE1B85 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1279,10 +1283,11 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; /* End XCBuildConfiguration section */ @@ -1290,8 +1295,8 @@ 067D966EBEDF3E100B9F20252DC91A03 /* Build configuration list for PBXNativeTarget "Pods-TABTestKit_Example-TABTestKit_ExampleUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - CE151341453F4E20E4C42D1306D5AC47 /* Debug */, - 0BFA6A1F08DB617ED88EA69685ABDDE4 /* Release */, + D45A84110BABE7AA265F8CFFD2B22A56 /* Debug */, + E4B54416D67231A088E7DB1D7AA6FFA6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1299,26 +1304,26 @@ 13338E6A92763276D7E744F0BE126971 /* Build configuration list for PBXNativeTarget "ShowTime" */ = { isa = XCConfigurationList; buildConfigurations = ( - 040B3C23F3536587D5A4EB91C89D63A1 /* Debug */, - 9C013AE42837DDBED81C8A67FA1E1264 /* Release */, + BA33D30D021A068EC0F3ABCB9902BD57 /* Debug */, + 5407334CEC971382882AB78E99C30C7D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 46ECDB4027B6A2823CE01521E3099989 /* Build configuration list for PBXNativeTarget "TABTestKit" */ = { + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - B5CE3F147104D954E37FBE9577891D2E /* Debug */, - 5461FC43C9BCAC3590847BBEA1352C97 /* Release */, + 8E6A8FF58D100B7F9B1943F455C00F02 /* Debug */, + 6C98B09FF5CCB107837D1A84E8F3A4F1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + 69E5949F88046C827AC56987D8B59AA2 /* Build configuration list for PBXNativeTarget "TABTestKit" */ = { isa = XCConfigurationList; buildConfigurations = ( - 6410F571BA8C1AEC6A19403F1B61B0B5 /* Debug */, - A27713CB74E99AF202AADC23200A32F4 /* Release */, + 1646DCD1D131AC6871E47A82611B9CA3 /* Debug */, + 61081AD43A298056B736B34131E3076D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1326,8 +1331,8 @@ E466F9F3945C666B20BA45180ECDC7D7 /* Build configuration list for PBXNativeTarget "Pods-TABTestKit_Example" */ = { isa = XCConfigurationList; buildConfigurations = ( - C3C3A1E9CBD3ACA59EE6FEB79CB855BF /* Debug */, - 7B8B0B183596E59238D618A15FFBF496 /* Release */, + 629D06E19575297CAE6C6F248B858401 /* Debug */, + 434AD7DDD7CDC54CD05BBA56068285F5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh b/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh index 5a09e16b..b2596c98 100755 --- a/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh +++ b/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh @@ -19,9 +19,8 @@ mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +BCSYMBOLMAP_DIR="BCSymbolMaps" -# Used as a return value for each invocation of `strip_invalid_archs` function. -STRIP_BINARY_RETVAL=0 # This protects against multiple targets copying the same framework dependency at the same time. The solution # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html @@ -45,6 +44,16 @@ install_framework() source="$(readlink "${source}")" fi + if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then + # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied + find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do + echo "Installing $f" + install_bcsymbolmap "$f" "$destination" + rm "$f" + done + rmdir "${source}/${BCSYMBOLMAP_DIR}" + fi + # Use filter instead of exclude so missing patterns don't throw errors. echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" @@ -80,7 +89,6 @@ install_framework() done fi } - # Copies and strips a vendored dSYM install_dsym() { local source="$1" @@ -95,12 +103,11 @@ install_dsym() { binary_name="$(ls "$source/Contents/Resources/DWARF")" binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" - # Strip invalid architectures so "fat" simulator / device frameworks work on device + # Strip invalid architectures from the dSYM. if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then strip_invalid_archs "$binary" "$warn_missing_arch" fi - - if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + if [[ $STRIP_BINARY_RETVAL == 0 ]]; then # Move the stripped file into its final destination. echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" @@ -111,28 +118,8 @@ install_dsym() { fi } -# Copies the bcsymbolmap files of a vendored framework -install_bcsymbolmap() { - local bcsymbolmap_path="$1" - local destination="${BUILT_PRODUCTS_DIR}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identity - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 # Strip invalid architectures strip_invalid_archs() { @@ -147,7 +134,7 @@ strip_invalid_archs() { if [[ "$warn_missing_arch" == "true" ]]; then echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." fi - STRIP_BINARY_RETVAL=0 + STRIP_BINARY_RETVAL=1 return fi stripped="" @@ -161,40 +148,31 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi - STRIP_BINARY_RETVAL=1 + STRIP_BINARY_RETVAL=0 } -install_artifact() { - artifact="$1" - base="$(basename "$artifact")" - case $base in - *.framework) - install_framework "$artifact" - ;; - *.dSYM) - # Suppress arch warnings since XCFrameworks will include many dSYM files - install_dsym "$artifact" "false" - ;; - *.bcsymbolmap) - install_bcsymbolmap "$artifact" - ;; - *) - echo "error: Unrecognized artifact "$artifact"" - ;; - esac +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" } -copy_artifacts() { - file_list="$1" - while read artifact; do - install_artifact "$artifact" - done <$file_list -} +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" -ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" -if [ -r "${ARTIFACT_LIST_FILE}" ]; then - copy_artifacts "${ARTIFACT_LIST_FILE}" -fi + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/ShowTime/ShowTime.framework" diff --git a/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig index a466e26c..4135b998 100644 --- a/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig @@ -1,4 +1,5 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/ShowTime" "${PODS_CONFIGURATION_BUILD_DIR}/TABTestKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ShowTime/ShowTime.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/TABTestKit/TABTestKit.framework/Headers" @@ -9,4 +10,5 @@ PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig b/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig index a466e26c..4135b998 100644 --- a/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests/Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig @@ -1,4 +1,5 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/ShowTime" "${PODS_CONFIGURATION_BUILD_DIR}/TABTestKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ShowTime/ShowTime.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/TABTestKit/TABTestKit.framework/Headers" @@ -9,4 +10,5 @@ PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-frameworks.sh index 5e6d87b6..6fcd36b1 100755 --- a/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-frameworks.sh +++ b/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-frameworks.sh @@ -19,9 +19,8 @@ mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +BCSYMBOLMAP_DIR="BCSymbolMaps" -# Used as a return value for each invocation of `strip_invalid_archs` function. -STRIP_BINARY_RETVAL=0 # This protects against multiple targets copying the same framework dependency at the same time. The solution # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html @@ -45,6 +44,16 @@ install_framework() source="$(readlink "${source}")" fi + if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then + # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied + find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do + echo "Installing $f" + install_bcsymbolmap "$f" "$destination" + rm "$f" + done + rmdir "${source}/${BCSYMBOLMAP_DIR}" + fi + # Use filter instead of exclude so missing patterns don't throw errors. echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" @@ -80,7 +89,6 @@ install_framework() done fi } - # Copies and strips a vendored dSYM install_dsym() { local source="$1" @@ -95,12 +103,11 @@ install_dsym() { binary_name="$(ls "$source/Contents/Resources/DWARF")" binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" - # Strip invalid architectures so "fat" simulator / device frameworks work on device + # Strip invalid architectures from the dSYM. if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then strip_invalid_archs "$binary" "$warn_missing_arch" fi - - if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + if [[ $STRIP_BINARY_RETVAL == 0 ]]; then # Move the stripped file into its final destination. echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" @@ -111,28 +118,8 @@ install_dsym() { fi } -# Copies the bcsymbolmap files of a vendored framework -install_bcsymbolmap() { - local bcsymbolmap_path="$1" - local destination="${BUILT_PRODUCTS_DIR}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identity - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 # Strip invalid architectures strip_invalid_archs() { @@ -147,7 +134,7 @@ strip_invalid_archs() { if [[ "$warn_missing_arch" == "true" ]]; then echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." fi - STRIP_BINARY_RETVAL=0 + STRIP_BINARY_RETVAL=1 return fi stripped="" @@ -161,40 +148,31 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi - STRIP_BINARY_RETVAL=1 + STRIP_BINARY_RETVAL=0 } -install_artifact() { - artifact="$1" - base="$(basename "$artifact")" - case $base in - *.framework) - install_framework "$artifact" - ;; - *.dSYM) - # Suppress arch warnings since XCFrameworks will include many dSYM files - install_dsym "$artifact" "false" - ;; - *.bcsymbolmap) - install_bcsymbolmap "$artifact" - ;; - *) - echo "error: Unrecognized artifact "$artifact"" - ;; - esac +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" } -copy_artifacts() { - file_list="$1" - while read artifact; do - install_artifact "$artifact" - done <$file_list -} +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" -ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" -if [ -r "${ARTIFACT_LIST_FILE}" ]; then - copy_artifacts "${ARTIFACT_LIST_FILE}" -fi + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/ShowTime/ShowTime.framework" diff --git a/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.debug.xcconfig index 0a98ce50..3f2d7dd8 100644 --- a/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.debug.xcconfig @@ -1,4 +1,5 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ShowTime" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ShowTime/ShowTime.framework/Headers" @@ -9,4 +10,5 @@ PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.release.xcconfig index 0a98ce50..3f2d7dd8 100644 --- a/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.release.xcconfig @@ -1,4 +1,5 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ShowTime" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ShowTime/ShowTime.framework/Headers" @@ -9,4 +10,5 @@ PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/ShowTime/ShowTime.debug.xcconfig b/Example/Pods/Target Support Files/ShowTime/ShowTime.debug.xcconfig index 25d81f1c..12cf5616 100644 --- a/Example/Pods/Target Support Files/ShowTime/ShowTime.debug.xcconfig +++ b/Example/Pods/Target Support Files/ShowTime/ShowTime.debug.xcconfig @@ -1,3 +1,4 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ShowTime GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS @@ -5,6 +6,7 @@ PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/ShowTime +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/ShowTime/ShowTime.release.xcconfig b/Example/Pods/Target Support Files/ShowTime/ShowTime.release.xcconfig index 25d81f1c..12cf5616 100644 --- a/Example/Pods/Target Support Files/ShowTime/ShowTime.release.xcconfig +++ b/Example/Pods/Target Support Files/ShowTime/ShowTime.release.xcconfig @@ -1,3 +1,4 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ShowTime GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS @@ -5,6 +6,7 @@ PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/ShowTime +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/TABTestKit/TABTestKit.debug.xcconfig b/Example/Pods/Target Support Files/TABTestKit/TABTestKit.debug.xcconfig index d013c636..2182cbd2 100644 --- a/Example/Pods/Target Support Files/TABTestKit/TABTestKit.debug.xcconfig +++ b/Example/Pods/Target Support Files/TABTestKit/TABTestKit.debug.xcconfig @@ -1,3 +1,4 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TABTestKit ENABLE_BITCODE = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" @@ -8,6 +9,7 @@ PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/TABTestKit/TABTestKit.release.xcconfig b/Example/Pods/Target Support Files/TABTestKit/TABTestKit.release.xcconfig index d013c636..2182cbd2 100644 --- a/Example/Pods/Target Support Files/TABTestKit/TABTestKit.release.xcconfig +++ b/Example/Pods/Target Support Files/TABTestKit/TABTestKit.release.xcconfig @@ -1,3 +1,4 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TABTestKit ENABLE_BITCODE = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" @@ -8,6 +9,7 @@ PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/TABTestKit_ExampleUITests/BiometricLogin_AuthenticationFailureTests.swift b/Example/TABTestKit_ExampleUITests/BiometricLogin_AuthenticationFailureTests.swift index a75d33d7..4a5252b6 100644 --- a/Example/TABTestKit_ExampleUITests/BiometricLogin_AuthenticationFailureTests.swift +++ b/Example/TABTestKit_ExampleUITests/BiometricLogin_AuthenticationFailureTests.swift @@ -11,7 +11,7 @@ import TABTestKit final class BiometricLogin_AuthenticationFailureTests: TABTestCase, SystemPreferencesContext { override func preLaunchSetup(_ launch: @escaping () -> Void) { - resetAllPrivacyPrompts() + resetAllPrivacyPrompts().execute() launch() } diff --git a/Example/TABTestKit_ExampleUITests/BiometricLogin_HappyPathTests.swift b/Example/TABTestKit_ExampleUITests/BiometricLogin_HappyPathTests.swift index cd0bf27c..7ecec4fc 100644 --- a/Example/TABTestKit_ExampleUITests/BiometricLogin_HappyPathTests.swift +++ b/Example/TABTestKit_ExampleUITests/BiometricLogin_HappyPathTests.swift @@ -13,7 +13,7 @@ import TABTestKit final class BiometricLogin_HappyPathTests: TABTestCase, SystemPreferencesContext { // TODO: Enable parallel tests override func preLaunchSetup(_ launch: @escaping () -> Void) { - resetAllPrivacyPrompts() + resetAllPrivacyPrompts().execute() launch() } diff --git a/Example/TABTestKit_ExampleUITests/BiometricLogin_PermissionDeniedTests.swift b/Example/TABTestKit_ExampleUITests/BiometricLogin_PermissionDeniedTests.swift index 3034323d..94d3a2ae 100644 --- a/Example/TABTestKit_ExampleUITests/BiometricLogin_PermissionDeniedTests.swift +++ b/Example/TABTestKit_ExampleUITests/BiometricLogin_PermissionDeniedTests.swift @@ -11,7 +11,7 @@ import TABTestKit final class BiometricLogin_PermissionDeniedTests: TABTestCase, SystemPreferencesContext { override func preLaunchSetup(_ launch: @escaping () -> Void) { - resetAllPrivacyPrompts() + resetAllPrivacyPrompts().execute() launch() } diff --git a/Example/TABTestKit_ExampleUITests/CollectionViewScreen.swift b/Example/TABTestKit_ExampleUITests/CollectionViewScreen.swift index be44bdc5..b59500e2 100644 --- a/Example/TABTestKit_ExampleUITests/CollectionViewScreen.swift +++ b/Example/TABTestKit_ExampleUITests/CollectionViewScreen.swift @@ -23,7 +23,7 @@ struct CollectionViewScreen: ScrollableScreen { extension CollectionViewScreen: Refreshable, InteractionContext { func refresh() { - scroll(trait, .upwards, until: trait.cell(matchingID: "CollectionCell 0"), is: .visible) + scroll(trait, .upwards, until: trait.cell(matchingID: "CollectionCell 0"), is: .visible).execute() // Pull the collection view down to refresh trait.scroll(.upwards) } diff --git a/Example/TABTestKit_ExampleUITests/CollectionViewTests.swift b/Example/TABTestKit_ExampleUITests/CollectionViewTests.swift index 7696053a..8742f1c2 100644 --- a/Example/TABTestKit_ExampleUITests/CollectionViewTests.swift +++ b/Example/TABTestKit_ExampleUITests/CollectionViewTests.swift @@ -11,7 +11,7 @@ import TABTestKit final class CollectionViewTests: TABTestCase, SystemPreferencesContext { override func preLaunchSetup(_ launch: @escaping () -> Void) { - resetAllPrivacyPrompts() + resetAllPrivacyPrompts().execute() launch() } diff --git a/Example/TABTestKit_ExampleUITests/OtherElementsTests.swift b/Example/TABTestKit_ExampleUITests/OtherElementsTests.swift index 7702f2d9..d4b99469 100644 --- a/Example/TABTestKit_ExampleUITests/OtherElementsTests.swift +++ b/Example/TABTestKit_ExampleUITests/OtherElementsTests.swift @@ -11,7 +11,7 @@ import TABTestKit final class OtherElementsTests: TABTestCase, SystemPreferencesContext { override func preLaunchSetup(_ launch: @escaping () -> Void) { - resetAllPrivacyPrompts() + resetAllPrivacyPrompts().execute() launch() } diff --git a/Example/TABTestKit_ExampleUITests/TableScreen.swift b/Example/TABTestKit_ExampleUITests/TableScreen.swift index fe74b215..8a81d3f0 100644 --- a/Example/TABTestKit_ExampleUITests/TableScreen.swift +++ b/Example/TABTestKit_ExampleUITests/TableScreen.swift @@ -33,7 +33,7 @@ extension TableScreen: Scrollable, Refreshable, InteractionContext { } func refresh() { - scroll(table, .upwards, until: section0Header, is: .visible) + scroll(table, .upwards, until: section0Header, is: .visible).execute() // Pull the table down to refresh table.scroll(.upwards) } diff --git a/Example/TABTestKit_ExampleUITests/TableTests.swift b/Example/TABTestKit_ExampleUITests/TableTests.swift index 5d4cf1f0..9fcbeab8 100644 --- a/Example/TABTestKit_ExampleUITests/TableTests.swift +++ b/Example/TABTestKit_ExampleUITests/TableTests.swift @@ -11,7 +11,7 @@ import TABTestKit final class TableTests: TABTestCase, SystemPreferencesContext { override func preLaunchSetup(_ launch: @escaping () -> Void) { - resetAllPrivacyPrompts() + resetAllPrivacyPrompts().execute() launch() } diff --git a/TABTestKit/Classes/BDD/Step.swift b/TABTestKit/Classes/BDD/Step.swift index d644224f..3443780f 100644 --- a/TABTestKit/Classes/BDD/Step.swift +++ b/TABTestKit/Classes/BDD/Step.swift @@ -9,10 +9,10 @@ import Foundation -public typealias Given = Step -public typealias When = Step -public typealias Then = Step -public typealias And = Step +open class Given: Step {} +open class When: Step {} +open class Then: Step {} +open class And: Step {} /// Defines an executable step to be used in tests. /// @@ -21,7 +21,7 @@ public typealias And = Step /// /// Do not use this Step type directly, instead use one of the typealiases above, like Given, When, Then or And. /// To learn more about how to use a Step read this article: https://medium.com/kinandcartacreated/swifty-gherkins-part-1-28abba7dfd8 -public struct Step { +open class Step { /// A reference to the most recently created Step, useful if you want to find out what step failed. public static var current: Step? @@ -31,73 +31,69 @@ public struct Step { public let function: StaticString /// The file this step is defined in. public let file: StaticString - + + init(handler: () -> StepAction, line: UInt, function: StaticString, file: StaticString) { + self.line = line + self.function = function + self.file = file + Step.current = self + handler().execute() + } + + init(handler: @autoclosure () -> StepAction, line: UInt, function: StaticString, file: StaticString) { + self.line = line + self.function = function + self.file = file + Step.current = self + handler().execute() + } + // MARK: - Standard init, i.e. Given(somethingHappens) @discardableResult - public init(_ handler: () -> Void, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + public convenience init(_ handler: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { self.init(handler: handler, line: line, function: function, file: file) } @discardableResult - public init(_ handler: @autoclosure () -> Void, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + public convenience init(_ handler: @autoclosure () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { self.init(handler: handler, line: line, function: function, file: file) } // MARK: - "I" init, i.e. Given(I: doSomething) @discardableResult - public init(I handler: () -> Void, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + public convenience init(I handler: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { self.init(handler: handler, line: line, function: function, file: file) } @discardableResult - public init(I handler: @autoclosure () -> Void, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + public convenience init(I handler: @autoclosure () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { self.init(handler: handler, line: line, function: function, file: file) } // MARK: - "the" init, i.e. Given(the: thingIsTrue) @discardableResult - public init(the handler: () -> Void, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + public convenience init(the handler: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { self.init(handler: handler, line: line, function: function, file: file) } @discardableResult - public init(the handler: @autoclosure () -> Void, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + public convenience init(the handler: @autoclosure () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { self.init(handler: handler, line: line, function: function, file: file) } // MARK: - "a" init, i.e. Given(a: serverErrorIsReturned) @discardableResult - init(a handler: @autoclosure () -> Void, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + convenience init(a handler: @autoclosure () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { self.init(handler: handler, line: line, function: function, file: file) } @discardableResult - init(a handler: () -> Void, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + convenience init(a handler: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { self.init(handler: handler, line: line, function: function, file: file) } } - -private extension Step { - - init(handler: () -> Void, line: UInt, function: StaticString, file: StaticString) { - self.line = line - self.function = function - self.file = file - Step.current = self - handler() - } - - init(handler: @autoclosure () -> Void, line: UInt, function: StaticString, file: StaticString) { - self.line = line - self.function = function - self.file = file - Step.current = self - handler() - } - -} diff --git a/TABTestKit/Classes/Contexts/Action/StepAction.swift b/TABTestKit/Classes/Contexts/Action/StepAction.swift new file mode 100644 index 00000000..9290e867 --- /dev/null +++ b/TABTestKit/Classes/Contexts/Action/StepAction.swift @@ -0,0 +1,12 @@ +// +// StepAction.swift +// TABTestKit +// +// Created by Stefan Renne on 05/11/2020. +// + +import Foundation + +public struct StepAction { + public let execute: () -> Void +} diff --git a/TABTestKit/Classes/Contexts/AlertContext.swift b/TABTestKit/Classes/Contexts/AlertContext.swift index dbb82044..463b5bf2 100644 --- a/TABTestKit/Classes/Contexts/AlertContext.swift +++ b/TABTestKit/Classes/Contexts/AlertContext.swift @@ -10,8 +10,10 @@ import XCTest public protocol AlertContext {} public extension AlertContext { - func tap(_ actionButtonID: String, in alert: Alert) { - alert.actionButton(withID: actionButtonID).tap() + func tap(_ actionButtonID: String, in alert: Alert) -> StepAction { + StepAction { + alert.actionButton(withID: actionButtonID).tap() + } } } diff --git a/TABTestKit/Classes/Contexts/AppContext.swift b/TABTestKit/Classes/Contexts/AppContext.swift index 2334fbf2..d0f01172 100644 --- a/TABTestKit/Classes/Contexts/AppContext.swift +++ b/TABTestKit/Classes/Contexts/AppContext.swift @@ -11,38 +11,54 @@ import XCTest public protocol AppContext {} public extension AppContext { - func backgroundTheApp() { - App.shared.background() + func backgroundTheApp() -> StepAction { + StepAction { + App.shared.background() + } } - func foregroundTheApp() { - App.shared.activate() + func foregroundTheApp() -> StepAction { + StepAction { + App.shared.activate() + } } - func terminateTheApp() { - App.shared.terminate() + func terminateTheApp() -> StepAction { + StepAction { + App.shared.terminate() + } } - func launchTheApp(clean: Bool) { - App.shared.launch(clean: clean) + func launchTheApp(clean: Bool) -> StepAction { + StepAction { + App.shared.launch(clean: clean) + } } - func waitForApp(toBe state: XCUIApplication.State, timeout: TimeInterval = 10) { - XCTAssertTrue(App.shared.wait(for: App.shared.state == state, timeout: timeout), "App did not have the right state before the timeout. Expected \(state.rawValue), got \(App.shared.state.rawValue)") + func waitForApp(toBe state: XCUIApplication.State, timeout: TimeInterval = 10) -> StepAction { + StepAction { + XCTAssertTrue(App.shared.wait(for: App.shared.state == state, timeout: timeout), "App did not have the right state before the timeout. Expected \(state.rawValue), got \(App.shared.state.rawValue)") + } } - func relaunchTheApp() { - backgroundTheApp() - terminateTheApp() - launchTheApp(clean: false) + func relaunchTheApp() -> StepAction { + StepAction { + backgroundTheApp().execute() + terminateTheApp().execute() + launchTheApp(clean: false).execute() + } } - func goBackToTABTestKitExampleApp() { - XCTAssertEqual(App.shared.name, "TABTestKit_Example") + func goBackToTABTestKitExampleApp() -> StepAction { + StepAction { + XCTAssertEqual(App.shared.name, "TABTestKit_Example") + } } - func openSafari() { // TODO: Move to Safari context - Safari().activate() + func openSafari() -> StepAction { // TODO: Move to Safari context + StepAction { + Safari().activate() + } } } diff --git a/TABTestKit/Classes/Contexts/BiometricsContext.swift b/TABTestKit/Classes/Contexts/BiometricsContext.swift index 5f8234ae..0fcfeeb2 100644 --- a/TABTestKit/Classes/Contexts/BiometricsContext.swift +++ b/TABTestKit/Classes/Contexts/BiometricsContext.swift @@ -13,20 +13,28 @@ import Biometrics public protocol BiometricsContext {} public extension BiometricsContext { - func deviceBiometricsAreEnabled() { - Biometrics.enrolled() + func deviceBiometricsAreEnabled() -> StepAction { + StepAction { + Biometrics.enrolled() + } } - func deviceBiometricsAreDisabled() { - Biometrics.unenrolled() + func deviceBiometricsAreDisabled() -> StepAction { + StepAction { + Biometrics.unenrolled() + } } - func successfullyAuthenticateBiometrics() { - Biometrics.successfulAuthentication() + func successfullyAuthenticateBiometrics() -> StepAction { + StepAction { + Biometrics.successfulAuthentication() + } } - func failToAuthenticateBiometrics() { - Biometrics.unsuccessfulAuthentication() + func failToAuthenticateBiometrics() -> StepAction { + StepAction { + Biometrics.unsuccessfulAuthentication() + } } } diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index 5c24414c..29406ca9 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -10,86 +10,116 @@ import XCTest public protocol InteractionContext {} public extension InteractionContext { - func tap(_ element: Tappable) { - element.tap() + func tap(_ element: Tappable) -> StepAction { + StepAction { + element.tap() + } } - func doubleTap(_ element: Tappable) { - element.doubleTap() + func doubleTap(_ element: Tappable) -> StepAction { + StepAction { + element.doubleTap() + } } - func twoFingerTap(_ element: Tappable) { - element.twoFingerTap() + func twoFingerTap(_ element: Tappable) -> StepAction { + StepAction { + element.twoFingerTap() + } } - func longPress(_ element: Tappable, duration: TimeInterval = 0.5) { - element.longPress(duration: duration) + func longPress(_ element: Tappable, duration: TimeInterval = 0.5) -> StepAction { + StepAction { + element.longPress(duration: duration) + } } - func type(_ text: String, into element: Editable) { - element.type(text) + func type(_ text: String, into element: Editable) -> StepAction { + StepAction { + element.type(text) + } } - func delete(_ numberOfCharacters: Int, charactersFrom element: Editable) { - element.delete(numberOfCharacters: numberOfCharacters) + func delete(_ numberOfCharacters: Int, charactersFrom element: Editable) -> StepAction { + StepAction { + element.delete(numberOfCharacters: numberOfCharacters) + } } - func state(of element: Element, is states: ElementAttributes.State...) { - states.forEach { element.await($0) } + func state(of element: Element, is states: ElementAttributes.State...) -> StepAction { + StepAction { + states.forEach { element.await($0) } + } } - func state(of element: Element, isNot states: ElementAttributes.State...) { - states.forEach { element.await(not: $0) } + func state(of element: Element, isNot states: ElementAttributes.State...) -> StepAction { + StepAction { + states.forEach { element.await(not: $0) } + } } - func scroll(_ element: Scrollable, _ direction: ElementAttributes.Direction, until otherElement: Element, is states: ElementAttributes.State..., maxTries: Int = 10) { - states.forEach { state in - var numberOfTries = 0 - repeat { - guard !otherElement.determine(state, timeout: 1) else { return } - numberOfTries += 1 - element.scroll(direction) - } while numberOfTries <= maxTries - XCTFail("Ran of out tries (\(maxTries)) waiting for element to become \(state)") - } + func scroll(_ element: Scrollable, _ direction: ElementAttributes.Direction, until otherElement: Element, is states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { + StepAction { + states.forEach { state in + var numberOfTries = 0 + repeat { + guard !otherElement.determine(state, timeout: 1) else { return } + numberOfTries += 1 + element.scroll(direction) + } while numberOfTries <= maxTries + XCTFail("Ran of out tries (\(maxTries)) waiting for element to become \(state)") + } + } } - func scroll(_ element: Scrollable, _ direction: ElementAttributes.Direction, until otherElement: Element, isNot states: ElementAttributes.State..., maxTries: Int = 10) { - states.forEach { state in - var numberOfTries = 0 - repeat { - guard !otherElement.determine(not: state, timeout: 1) else { return } - numberOfTries += 1 - element.scroll(direction) - } while numberOfTries <= maxTries - XCTFail("Ran of out tries (\(maxTries)) waiting for element to become not \(state)") - } + func scroll(_ element: Scrollable, _ direction: ElementAttributes.Direction, until otherElement: Element, isNot states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { + StepAction { + states.forEach { state in + var numberOfTries = 0 + repeat { + guard !otherElement.determine(not: state, timeout: 1) else { return } + numberOfTries += 1 + element.scroll(direction) + } while numberOfTries <= maxTries + XCTFail("Ran of out tries (\(maxTries)) waiting for element to become not \(state)") + } + } } - func scroll(_ element: Scrollable, _ direction: ElementAttributes.Direction, until otherElement: Element, valueIs value: String, maxTries: Int = 10) { - var numberOfTries = 0 - repeat { - guard !(otherElement.value == value) else { return } - numberOfTries += 1 - element.scroll(direction) - } while numberOfTries <= maxTries - XCTFail("Ran of out tries (\(maxTries)) waiting for element to become \(value)") + func scroll(_ element: Scrollable, _ direction: ElementAttributes.Direction, until otherElement: Element, valueIs value: String, maxTries: Int = 10) -> StepAction { + StepAction { + var numberOfTries = 0 + repeat { + guard !(otherElement.value == value) else { return } + numberOfTries += 1 + element.scroll(direction) + } while numberOfTries <= maxTries + XCTFail("Ran of out tries (\(maxTries)) waiting for element to become \(value)") + } } - func value(of element: ElementWithValue, is expectedValue: ElementWithValue.Value) { - XCTAssertTrue(element.underlyingXCUIElement.wait(for: element.value == expectedValue), "Element did not have the right value before timing out! Expected: \(expectedValue), actual: \(element.value)") + func value(of element: ElementWithValue, is expectedValue: ElementWithValue.Value) -> StepAction { + StepAction { + XCTAssertTrue(element.underlyingXCUIElement.wait(for: element.value == expectedValue), "Element did not have the right value before timing out! Expected: \(expectedValue), actual: \(element.value)") + } } - func label(of element: Element, is expectedLabel: String) { - XCTAssertTrue(element.underlyingXCUIElement.wait(for: element.label == expectedLabel), "Element did not have the right label before timing out! Expected: \(expectedLabel), actual: \(element.label)") + func label(of element: Element, is expectedLabel: String) -> StepAction { + StepAction { + XCTAssertTrue(element.underlyingXCUIElement.wait(for: element.label == expectedLabel), "Element did not have the right label before timing out! Expected: \(expectedLabel), actual: \(element.label)") + } } - func adjust(_ element: AdjustableElement, to newValue: AdjustableElement.Value) { - element.adjust(to: newValue) + func adjust(_ element: AdjustableElement, to newValue: AdjustableElement.Value) -> StepAction { + StepAction { + element.adjust(to: newValue) + } } - func refresh(_ refreshableThing: Refreshable) { - refreshableThing.refresh() + func refresh(_ refreshableThing: Refreshable) -> StepAction { + StepAction { + refreshableThing.refresh() + } } } diff --git a/TABTestKit/Classes/Contexts/KeyboardContext.swift b/TABTestKit/Classes/Contexts/KeyboardContext.swift index f2b983ee..4e501a7a 100644 --- a/TABTestKit/Classes/Contexts/KeyboardContext.swift +++ b/TABTestKit/Classes/Contexts/KeyboardContext.swift @@ -11,9 +11,11 @@ import XCTest public protocol KeyboardContext {} public extension KeyboardContext { - func keyboardType(is type: Keyboard.KeyboardType) { + func keyboardType(is type: Keyboard.KeyboardType) -> StepAction { let actual = keyboard.keyboardType - XCTAssertEqual(type, actual, "Actual keyboard type (\(actual)) does not match expected keyboard type (\(type))") + return StepAction { + XCTAssertEqual(type, actual, "Actual keyboard type (\(actual)) does not match expected keyboard type (\(type))") + } } } diff --git a/TABTestKit/Classes/Contexts/NavigationContext.swift b/TABTestKit/Classes/Contexts/NavigationContext.swift index 71c4d5f3..d93fe5c2 100644 --- a/TABTestKit/Classes/Contexts/NavigationContext.swift +++ b/TABTestKit/Classes/Contexts/NavigationContext.swift @@ -13,51 +13,59 @@ public extension NavigationContext { /// Asserts that a screen can be seen, by awaiting on its trait. /// /// - Parameter screen: The screen to await. - func see(_ screen: ScreenType) { + func see(_ screen: ScreenType) -> StepAction { see(screen.trait) } /// Asserts that a screen does not exist, by awaiting on its trait. /// /// - Parameter screen: The screen to await. - func doNotSee(_ screen: ScreenType) { + func doNotSee(_ screen: ScreenType) -> StepAction { doNotSee(screen.trait) } /// Asserts that an element can be seen, by awaiting for it to exist and be visible. /// /// - Parameter element: The element to await. - func see(_ element: Element) { - element.await(.exists, .visible) + func see(_ element: Element) -> StepAction { + StepAction { + element.await(.exists, .visible) + } } /// Asserts that an element does not exist, by waiting for it to not exist. /// /// - Parameter element: The element to await. - func doNotSee(_ element: Element) { - element.await(not: .exists) + func doNotSee(_ element: Element) -> StepAction { + StepAction { + element.await(not: .exists) + } } /// Completes one or more things that knows how to complete itself. /// /// - Parameter completableThings: One or more Completable things. Typically, this would be a Screen that conforms to Completable. - func complete(_ completableThings: Completable...) { + func complete(_ completableThings: Completable...) -> StepAction { guard !completableThings.isEmpty else { XCTFatalFail("You must provide at least one Completable thing to complete!") } - completableThings.forEach { - $0.await() - $0.complete() - } + return StepAction { + completableThings.forEach { + $0.await() + $0.complete() + } + } } /// Dismisses one or more things that knows how to complete itself. /// /// - Parameter dismissableThings: One or more Dismissable things. Typically, this would be a Screen that conforms to Dismissable. - func dismiss(_ dismissableThings: Dismissable...) { + func dismiss(_ dismissableThings: Dismissable...) -> StepAction { guard !dismissableThings.isEmpty else { XCTFatalFail("You must provide at least one Dismissable thing to dismiss!") } - dismissableThings.forEach { - $0.await() - $0.dismiss() - } + return StepAction { + dismissableThings.forEach { + $0.await() + $0.dismiss() + } + } } /// Opens the specified URL from the test runner app. @@ -78,22 +86,24 @@ public extension NavigationContext { /// Universal Links. /// /// - Parameter url: The URL to open. - func open(_ url: URL) { - springboard.activate() - if !Icon.testRunner.determine(.hittable, timeout: 1) { - XCUIDevice.shared.press(.home) // Ensure we're on the first page of the home screen - sleep(1) - while !Icon.testRunner.determine(.hittable, timeout: 1) { - springboard.swipeLeft() + func open(_ url: URL) -> StepAction { + StepAction { + springboard.activate() + if !Icon.testRunner.determine(.hittable, timeout: 1) { + XCUIDevice.shared.press(.home) // Ensure we're on the first page of the home screen + sleep(1) + while !Icon.testRunner.determine(.hittable, timeout: 1) { + springboard.swipeLeft() + } } - } - Icon.testRunner.tap() - sleep(1) - UIApplication.shared.open(url) - let openAppConfirmationAlert = Alert(id: "“\(Bundle.main.appName)” wants to open “\(App.shared.name)”", parent: springboard) - if openAppConfirmationAlert.determine(.exists, timeout: 1) { + Icon.testRunner.tap() sleep(1) - openAppConfirmationAlert.actionButton(withID: "Open").tap() + UIApplication.shared.open(url) + let openAppConfirmationAlert = Alert(id: "“\(Bundle.main.appName)” wants to open “\(App.shared.name)”", parent: springboard) + if openAppConfirmationAlert.determine(.exists, timeout: 1) { + sleep(1) + openAppConfirmationAlert.actionButton(withID: "Open").tap() + } } } diff --git a/TABTestKit/Classes/Contexts/SheetContext.swift b/TABTestKit/Classes/Contexts/SheetContext.swift index 160698ad..f037617e 100644 --- a/TABTestKit/Classes/Contexts/SheetContext.swift +++ b/TABTestKit/Classes/Contexts/SheetContext.swift @@ -10,8 +10,10 @@ import Foundation public protocol SheetContext {} public extension SheetContext { - func tap(_ actionButtonID: String, in sheet: Sheet) { - sheet.actionButton(withID: actionButtonID).tap() + func tap(_ actionButtonID: String, in sheet: Sheet) -> StepAction { + StepAction { + sheet.actionButton(withID: actionButtonID).tap() + } } } diff --git a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift index b056bff3..e9b51b67 100644 --- a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift +++ b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift @@ -10,24 +10,30 @@ import Foundation public protocol SystemPreferencesContext {} public extension SystemPreferencesContext { - func resetAllPrivacyPrompts() { - if SystemPreferences().state != .notRunning { - openSystemPreferences() // Turns out you can't terminate an app if it's not in the foreground, but we want to terminate it so that it can be reset back to the start, so we're weirdly activating it here before doing anything. Might be a bug. - } - terminateSystemPreferences() - openSystemPreferences() - systemPreferencesRootScreen.generalCell.tap() - systemPreferencesGeneralScreen.resetCell.tap() - systemPreferencesResetScreen.resetCell.tap() - systemPreferencesResetScreen.confirmResetSheet.actionButton(withID: "Reset Warnings").tap() + func resetAllPrivacyPrompts() -> StepAction { + StepAction { + if SystemPreferences().state != .notRunning { + openSystemPreferences().execute() // Turns out you can't terminate an app if it's not in the foreground, but we want to terminate it so that it can be reset back to the start, so we're weirdly activating it here before doing anything. Might be a bug. + } + terminateSystemPreferences().execute() + openSystemPreferences().execute() + systemPreferencesRootScreen.generalCell.tap() + systemPreferencesGeneralScreen.resetCell.tap() + systemPreferencesResetScreen.resetCell.tap() + systemPreferencesResetScreen.confirmResetSheet.actionButton(withID: "Reset Warnings").tap() + } } - func openSystemPreferences() { - SystemPreferences().activate() + func openSystemPreferences() -> StepAction { + StepAction { + SystemPreferences().activate() + } } - func terminateSystemPreferences() { - SystemPreferences().terminate() + func terminateSystemPreferences() -> StepAction{ + StepAction { + SystemPreferences().terminate() + } } } From d4b7c2e2044c0b0b121ee61121662ef2b9082d42 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Fri, 6 Nov 2020 10:13:34 +0100 Subject: [PATCH 02/26] Implemented CustomStringConvertible for screens, elements, keyboard, application state & ElementAttributes --- Example/Pods/Pods.xcodeproj/project.pbxproj | 4 ++ TABTestKit/Classes/Elements/Attributes.swift | 40 +++++++++++++++++++ TABTestKit/Classes/Elements/Keyboard.swift | 25 ++++++++++++ .../XCUIApplicationState+String.swift | 27 +++++++++++++ TABTestKit/Classes/Protocols/Element.swift | 21 +++++++++- TABTestKit/Classes/Protocols/Screen.swift | 9 ++++- 6 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 TABTestKit/Classes/Extensions/XCUIApplicationState+String.swift diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 399d5c46..57a4c108 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -88,6 +88,7 @@ EE2DE74B688C2BA2BCA8D8D56B3CDE42 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 281BE70296D811DC0C196F1952BE0179 /* View.swift */; }; F4BF8B887488C4B0900D5C36A2B48886 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85AFC7AC121EDD585A794CBEF219ED8 /* TextView.swift */; }; F7A4CDA05AB92DA971CDBBDEDF78F974 /* SheetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 656317B1689F8389F8D8A13FB0281F7E /* SheetContext.swift */; }; + F809D6C225554A4900CF86E9 /* XCUIApplicationState+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */; }; F8C8632658B840BA4531A5F8EEA2521E /* systemPreferencesRootScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A6C582E6031CB7A125F0800F45055D /* systemPreferencesRootScreen.swift */; }; FA5FE4421DD144891167A9BBA2FC9DA5 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D829733A2418052EC220B9F4AC655D5 /* Cell.swift */; }; FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; @@ -228,6 +229,7 @@ F094F44DD0301CC76E1365673D3FCF9C /* ShowTime-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ShowTime-dummy.m"; sourceTree = ""; }; F09670B2248CA33BD5A05396463DC7DB /* TABTestKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-prefix.pch"; sourceTree = ""; }; F2F0B07615633500EA51A42DA7490BC2 /* SystemPreferencesContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesContext.swift; sourceTree = ""; }; + F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCUIApplicationState+String.swift"; sourceTree = ""; }; FA7DCD7F1B963A9EEA6DA99154E69718 /* TABTestKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TABTestKit-Info.plist"; sourceTree = ""; }; FC125873B3EFEB103E5E93686ACCEA70 /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; FC46B20374B589B005A9908C70225CDF /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; @@ -429,6 +431,7 @@ AABB82F79590AA2D0458F8674BFCB4FD /* XCUIElement+hasKeyboardFocus.swift */, 976E5B1537BAD0007743ADFE257F3ED9 /* XCUIElement+isVisible.swift */, E1848ED8032296034A5B64A0616D8A8E /* XCUIElement+wait.swift */, + F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */, ); name = Extensions; path = TABTestKit/Classes/Extensions; @@ -841,6 +844,7 @@ B5042D490C77BDC6BBF549D2197C7434 /* TABTestCase.swift in Sources */, 248E3015488597454E4DB64E1CBD9F33 /* TABTestKit-dummy.m in Sources */, A8C378399954F4B3FF9A059EFDC6E0CA /* Tappable.swift in Sources */, + F809D6C225554A4900CF86E9 /* XCUIApplicationState+String.swift in Sources */, 8760E5691C6B92CAAC17935225A01921 /* StepAction.swift in Sources */, 2F7918BEF8541A66867040B87BD3C527 /* TextField.swift in Sources */, F4BF8B887488C4B0900D5C36A2B48886 /* TextView.swift in Sources */, diff --git a/TABTestKit/Classes/Elements/Attributes.swift b/TABTestKit/Classes/Elements/Attributes.swift index 3bc1cb02..d9b4650b 100644 --- a/TABTestKit/Classes/Elements/Attributes.swift +++ b/TABTestKit/Classes/Elements/Attributes.swift @@ -58,3 +58,43 @@ public enum ElementAttributes { } } + +extension ElementAttributes.State: CustomStringConvertible { + public var description: String { + switch self { + case .exists: + return "exists" + case .hittable: + return "hittable" + case .visible: + return "visible" + case let .visibleIn(element): + return "visible in \(element.description)" + case .selected: + return "selected" + case .enabled: + return "enabled" + case .hasKeyboardFocus: + return "has keyboard focus" + } + + } +} + +extension ElementAttributes.Direction: CustomStringConvertible { + public var description: String { + switch self { + case .upwards: + return "upwards" + case .downwards: + return "downwards" + case .left: + return "left" + case .right: + return "right" + case let .from(fromCoordinate, toCoordinate): + return "from \(fromCoordinate.dx)x\(fromCoordinate.dy) to \(toCoordinate.dx)x\(toCoordinate.dy)" + + } + } +} diff --git a/TABTestKit/Classes/Elements/Keyboard.swift b/TABTestKit/Classes/Elements/Keyboard.swift index 5b923e06..aa888b8c 100644 --- a/TABTestKit/Classes/Elements/Keyboard.swift +++ b/TABTestKit/Classes/Elements/Keyboard.swift @@ -63,6 +63,31 @@ public struct Keyboard: Element { } +extension Keyboard.KeyboardType: CustomStringConvertible { + public var description: String { + switch self { + case .regular: + return "regular" + case .numberPad: + return "number keypad" + case .decimalPad: + return "decimal keypad" + case .emailAddress: + return "email address" + case .numbersAndPunctuation: + return "numbers and punctuation" + case .phonePad: + return "telephone keypad" + case .twitter: + return "twitter" + case .url: + return "url" + case .webSearch: + return "web search" + } + } +} + public extension Keyboard { /// Represents a Key that the Keyboard contains. diff --git a/TABTestKit/Classes/Extensions/XCUIApplicationState+String.swift b/TABTestKit/Classes/Extensions/XCUIApplicationState+String.swift new file mode 100644 index 00000000..882a85cd --- /dev/null +++ b/TABTestKit/Classes/Extensions/XCUIApplicationState+String.swift @@ -0,0 +1,27 @@ +// +// XCUIApplicationState+String.swift +// TABTestKit +// +// Created by Stefan Renne on 06/11/2020. +// + +import XCTest + +extension XCUIApplication.State: CustomStringConvertible { + public var description: String { + switch self { + case .unknown: + return "unknown" + case .notRunning: + return "not running" + case .runningBackgroundSuspended: + return "running background suspended" + case .runningBackground: + return "running background" + case .runningForeground: + return "running foreground" + @unknown default: + return "unknown" + } + } +} diff --git a/TABTestKit/Classes/Protocols/Element.swift b/TABTestKit/Classes/Protocols/Element.swift index 6db3342a..05e63ad1 100644 --- a/TABTestKit/Classes/Protocols/Element.swift +++ b/TABTestKit/Classes/Protocols/Element.swift @@ -10,7 +10,7 @@ import XCTest /// Represents a UI element. /// Pretty much every element on-screen has (or should have) some sort of ID, except for nav bars and tab bars etc. /// Sometimes identifiers can just be the text of the element, for example a UILabel ID can just be the text. -public protocol Element { +public protocol Element: CustomStringConvertible { /// The ID of the element. This could be the accessibilityIdentifier or the text of a label. /// An ID is not required, but it is recommended. @@ -56,7 +56,24 @@ public extension Element { var topCoordinate: CGVector { return defaultTopCoordinate } var underlyingXCUIElement: XCUIElement { return defaultUnderlyingXCUIElement } - +} + +extension Element { + public var description: String { + let indexFormatter = NumberFormatter() + indexFormatter.numberStyle = .ordinal + indexFormatter.locale = Locale(identifier: "en_GB") + + let indexString: String? = index > 0 ? indexFormatter.string(for: index) : nil + + let name: String? = [label, value, id] + .compactMap { $0 } + .first(where: { !$0.isEmpty }) + + return [indexString, name, String(describing: Swift.type(of: self))] + .compactMap { $0 } + .joined(separator: " ") + } } public extension Element { diff --git a/TABTestKit/Classes/Protocols/Screen.swift b/TABTestKit/Classes/Protocols/Screen.swift index da3f5c59..b9439e71 100644 --- a/TABTestKit/Classes/Protocols/Screen.swift +++ b/TABTestKit/Classes/Protocols/Screen.swift @@ -14,13 +14,19 @@ import XCTest /// /// Typically, you'd just set a Header or ViewController as the trait, /// but it can be anything. -public protocol Screen { +public protocol Screen: CustomStringConvertible { associatedtype Trait: Element /// The trait of the screen. Typically a ViewController or Header. /// By default, the traits are used to await a screen. var trait: Trait { get } +} + +extension Screen { + public var description: String { + String(describing: Swift.type(of: self)) + } } public extension Screen { @@ -28,5 +34,4 @@ public extension Screen { func await() { trait.await(.exists, .hittable, .visible) } - } From f2540c4f5f1bd9782680c00edb06adec7ff92e4e Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Sat, 7 Nov 2020 10:58:50 +0100 Subject: [PATCH 03/26] Started on step descriptions --- .../xcschemes/TABTestKit.xcscheme | 2 +- Example/TABTestKit.xcodeproj/project.pbxproj | 9 ++- .../xcschemes/TABTestKit-Example.xcscheme | 2 +- TABTestKit/Classes/BDD/Step.swift | 67 +++++++++-------- .../Classes/Contexts/Action/StepAction.swift | 1 + .../Classes/Contexts/AlertContext.swift | 2 +- TABTestKit/Classes/Contexts/AppContext.swift | 16 ++--- .../Classes/Contexts/BiometricsContext.swift | 8 +-- .../Classes/Contexts/InteractionContext.swift | 72 ++++++++++++------- .../Classes/Contexts/KeyboardContext.swift | 2 +- .../Classes/Contexts/NavigationContext.swift | 35 ++++++--- .../Classes/Contexts/SheetContext.swift | 2 +- .../Contexts/SystemPreferencesContext.swift | 6 +- TABTestKit/Classes/Elements/Attributes.swift | 30 ++++++-- .../NormalizedCoordinate+Locations.swift | 35 +++++++++ TABTestKit/Classes/Protocols/Element.swift | 10 +-- 16 files changed, 200 insertions(+), 99 deletions(-) diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/TABTestKit.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/TABTestKit.xcscheme index 093f8403..55a5fb95 100644 --- a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/TABTestKit.xcscheme +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/TABTestKit.xcscheme @@ -1,6 +1,6 @@ StepAction, line: UInt, function: StaticString, file: StaticString) { + init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { self.line = line self.function = function self.file = file + self.description = description Step.current = self - handler().execute() - } - - init(handler: @autoclosure () -> StepAction, line: UInt, function: StaticString, file: StaticString) { - self.line = line - self.function = function - self.file = file - Step.current = self - handler().execute() + XCTContext.runActivity(named: description) { _ in + handler() + } } // MARK: - Standard init, i.e. Given(somethingHappens) @discardableResult - public convenience init(_ handler: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(handler: handler, line: line, function: function, file: file) + public convenience init(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(action(), line: line, function: function, file: file) } @discardableResult - public convenience init(_ handler: @autoclosure () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(handler: handler, line: line, function: function, file: file) + public convenience init(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Swift.type(of: self)), action.description] + .joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) } // MARK: - "I" init, i.e. Given(I: doSomething) @discardableResult - public convenience init(I handler: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(handler: handler, line: line, function: function, file: file) + public convenience init(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(I: action(), line: line, function: function, file: file) } @discardableResult - public convenience init(I handler: @autoclosure () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(handler: handler, line: line, function: function, file: file) + public convenience init(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Swift.type(of: self)), "I", action.description] + .joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) } // MARK: - "the" init, i.e. Given(the: thingIsTrue) @discardableResult - public convenience init(the handler: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(handler: handler, line: line, function: function, file: file) + public convenience init(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(the: action(), line: line, function: function, file: file) } @discardableResult - public convenience init(the handler: @autoclosure () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(handler: handler, line: line, function: function, file: file) + public convenience init(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Swift.type(of: self)), "the", action.description] + .joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) } // MARK: - "a" init, i.e. Given(a: serverErrorIsReturned) - - @discardableResult - convenience init(a handler: @autoclosure () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(handler: handler, line: line, function: function, file: file) - } - + + @discardableResult + convenience init(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(a: action(), line: line, function: function, file: file) + } + @discardableResult - convenience init(a handler: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(handler: handler, line: line, function: function, file: file) + convenience init(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Swift.type(of: self)), "a", action.description] + .joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) } } diff --git a/TABTestKit/Classes/Contexts/Action/StepAction.swift b/TABTestKit/Classes/Contexts/Action/StepAction.swift index 9290e867..fe64814b 100644 --- a/TABTestKit/Classes/Contexts/Action/StepAction.swift +++ b/TABTestKit/Classes/Contexts/Action/StepAction.swift @@ -8,5 +8,6 @@ import Foundation public struct StepAction { + public let description: String public let execute: () -> Void } diff --git a/TABTestKit/Classes/Contexts/AlertContext.swift b/TABTestKit/Classes/Contexts/AlertContext.swift index 463b5bf2..979d3424 100644 --- a/TABTestKit/Classes/Contexts/AlertContext.swift +++ b/TABTestKit/Classes/Contexts/AlertContext.swift @@ -11,7 +11,7 @@ public protocol AlertContext {} public extension AlertContext { func tap(_ actionButtonID: String, in alert: Alert) -> StepAction { - StepAction { + StepAction(description: "tap on the \(actionButtonID) button in the alert") { alert.actionButton(withID: actionButtonID).tap() } } diff --git a/TABTestKit/Classes/Contexts/AppContext.swift b/TABTestKit/Classes/Contexts/AppContext.swift index d0f01172..8334c474 100644 --- a/TABTestKit/Classes/Contexts/AppContext.swift +++ b/TABTestKit/Classes/Contexts/AppContext.swift @@ -12,37 +12,37 @@ public protocol AppContext {} public extension AppContext { func backgroundTheApp() -> StepAction { - StepAction { + StepAction(description: "background the app") { App.shared.background() } } func foregroundTheApp() -> StepAction { - StepAction { + StepAction(description: "foreground the app") { App.shared.activate() } } func terminateTheApp() -> StepAction { - StepAction { + StepAction(description: "terminate the app") { App.shared.terminate() } } func launchTheApp(clean: Bool) -> StepAction { - StepAction { + StepAction(description: "launch the app") { App.shared.launch(clean: clean) } } func waitForApp(toBe state: XCUIApplication.State, timeout: TimeInterval = 10) -> StepAction { - StepAction { + StepAction(description: "wait for the app to be \(state.description)") { XCTAssertTrue(App.shared.wait(for: App.shared.state == state, timeout: timeout), "App did not have the right state before the timeout. Expected \(state.rawValue), got \(App.shared.state.rawValue)") } } func relaunchTheApp() -> StepAction { - StepAction { + StepAction(description: "relaunch the app") { backgroundTheApp().execute() terminateTheApp().execute() launchTheApp(clean: false).execute() @@ -50,13 +50,13 @@ public extension AppContext { } func goBackToTABTestKitExampleApp() -> StepAction { - StepAction { + StepAction(description: "go back to the TABTestKit Example app") { XCTAssertEqual(App.shared.name, "TABTestKit_Example") } } func openSafari() -> StepAction { // TODO: Move to Safari context - StepAction { + StepAction(description: "open safari") { Safari().activate() } } diff --git a/TABTestKit/Classes/Contexts/BiometricsContext.swift b/TABTestKit/Classes/Contexts/BiometricsContext.swift index 0fcfeeb2..ebca260e 100644 --- a/TABTestKit/Classes/Contexts/BiometricsContext.swift +++ b/TABTestKit/Classes/Contexts/BiometricsContext.swift @@ -14,25 +14,25 @@ public protocol BiometricsContext {} public extension BiometricsContext { func deviceBiometricsAreEnabled() -> StepAction { - StepAction { + StepAction(description: "device biometrics are enabled") { Biometrics.enrolled() } } func deviceBiometricsAreDisabled() -> StepAction { - StepAction { + StepAction(description: "device biometrics are disabled") { Biometrics.unenrolled() } } func successfullyAuthenticateBiometrics() -> StepAction { - StepAction { + StepAction(description: "successfully authenticate biometrics") { Biometrics.successfulAuthentication() } } func failToAuthenticateBiometrics() -> StepAction { - StepAction { + StepAction(description: "fail to authenticate biometrics") { Biometrics.unsuccessfulAuthentication() } } diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index 29406ca9..fa26b0b5 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -10,56 +10,71 @@ import XCTest public protocol InteractionContext {} public extension InteractionContext { - func tap(_ element: Tappable) -> StepAction { - StepAction { + func tap(_ element: Tappable & CustomStringConvertible) -> StepAction { + StepAction(description: "tap on the \(element.description)") { element.tap() } } - func doubleTap(_ element: Tappable) -> StepAction { - StepAction { + func doubleTap(_ element: Tappable & CustomStringConvertible) -> StepAction { + StepAction(description: "double tap on the \(element.description)") { element.doubleTap() } } - func twoFingerTap(_ element: Tappable) -> StepAction { - StepAction { + func twoFingerTap(_ element: Tappable & CustomStringConvertible) -> StepAction { + StepAction(description: "two finger tap on the \(element.description)") { element.twoFingerTap() } } - func longPress(_ element: Tappable, duration: TimeInterval = 0.5) -> StepAction { - StepAction { + func longPress(_ element: Tappable & CustomStringConvertible, duration: TimeInterval = 0.5) -> StepAction { + StepAction(description: "long press on the \(element.description)") { element.longPress(duration: duration) } } - func type(_ text: String, into element: Editable) -> StepAction { - StepAction { + func type(_ text: String, into element: Editable & CustomStringConvertible) -> StepAction { + StepAction(description: "type '\(text)' into the \(element.description)") { element.type(text) } } - func delete(_ numberOfCharacters: Int, charactersFrom element: Editable) -> StepAction { - StepAction { + func delete(_ numberOfCharacters: Int, charactersFrom element: Editable & CustomStringConvertible) -> StepAction { + StepAction(description: "delete \(numberOfCharacters) characters from the \(element.description)") { element.delete(numberOfCharacters: numberOfCharacters) } } func state(of element: Element, is states: ElementAttributes.State...) -> StepAction { - StepAction { + + let stateDescription = states + .map(\.description) + .joined(separator: " and ") + + return StepAction(description: "state of the \(element) \(stateDescription)") { states.forEach { element.await($0) } } } func state(of element: Element, isNot states: ElementAttributes.State...) -> StepAction { - StepAction { + + let stateDescription = states + .map(\.negativeDescription) + .joined(separator: " or ") + + return StepAction(description: "state of the \(element) \(stateDescription)") { states.forEach { element.await(not: $0) } } } - func scroll(_ element: Scrollable, _ direction: ElementAttributes.Direction, until otherElement: Element, is states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { - StepAction { + func scroll(_ element: Scrollable & CustomStringConvertible, _ direction: ElementAttributes.Direction, until otherElement: Element, is states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { + + let stateDescription = states + .map(\.description) + .joined(separator: " and ") + + return StepAction(description: "scroll the \(element) \(direction) until the \(otherElement) \(stateDescription)") { states.forEach { state in var numberOfTries = 0 repeat { @@ -72,8 +87,13 @@ public extension InteractionContext { } } - func scroll(_ element: Scrollable, _ direction: ElementAttributes.Direction, until otherElement: Element, isNot states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { - StepAction { + func scroll(_ element: Scrollable & CustomStringConvertible, _ direction: ElementAttributes.Direction, until otherElement: Element, isNot states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { + + let stateDescription = states + .map(\.negativeDescription) + .joined(separator: " or ") + + return StepAction(description: "scroll the \(element) \(direction) until the \(otherElement) \(stateDescription)") { states.forEach { state in var numberOfTries = 0 repeat { @@ -86,8 +106,8 @@ public extension InteractionContext { } } - func scroll(_ element: Scrollable, _ direction: ElementAttributes.Direction, until otherElement: Element, valueIs value: String, maxTries: Int = 10) -> StepAction { - StepAction { + func scroll(_ element: Scrollable & CustomStringConvertible, _ direction: ElementAttributes.Direction, until otherElement: Element, valueIs value: String, maxTries: Int = 10) -> StepAction { + StepAction(description: "scroll the \(element) \(direction) until the \(otherElement)'s value is '\(value)'") { var numberOfTries = 0 repeat { guard !(otherElement.value == value) else { return } @@ -99,25 +119,25 @@ public extension InteractionContext { } func value(of element: ElementWithValue, is expectedValue: ElementWithValue.Value) -> StepAction { - StepAction { + StepAction(description: "value of the \(element) is '\(expectedValue)'") { XCTAssertTrue(element.underlyingXCUIElement.wait(for: element.value == expectedValue), "Element did not have the right value before timing out! Expected: \(expectedValue), actual: \(element.value)") } } func label(of element: Element, is expectedLabel: String) -> StepAction { - StepAction { + StepAction(description: "label of the \(element) is '\(expectedLabel)'") { XCTAssertTrue(element.underlyingXCUIElement.wait(for: element.label == expectedLabel), "Element did not have the right label before timing out! Expected: \(expectedLabel), actual: \(element.label)") } } - func adjust(_ element: AdjustableElement, to newValue: AdjustableElement.Value) -> StepAction { - StepAction { + func adjust(_ element: AdjustableElement, to newValue: AdjustableElement.Value) -> StepAction { + StepAction(description: "adjust the \(element) to '\(newValue)'") { element.adjust(to: newValue) } } - func refresh(_ refreshableThing: Refreshable) -> StepAction { - StepAction { + func refresh(_ refreshableThing: Refreshable & CustomStringConvertible) -> StepAction { + StepAction(description: "refresh the \(refreshableThing)") { refreshableThing.refresh() } } diff --git a/TABTestKit/Classes/Contexts/KeyboardContext.swift b/TABTestKit/Classes/Contexts/KeyboardContext.swift index 4e501a7a..62b35083 100644 --- a/TABTestKit/Classes/Contexts/KeyboardContext.swift +++ b/TABTestKit/Classes/Contexts/KeyboardContext.swift @@ -13,7 +13,7 @@ public extension KeyboardContext { func keyboardType(is type: Keyboard.KeyboardType) -> StepAction { let actual = keyboard.keyboardType - return StepAction { + return StepAction(description: "keyboard is \(type.description)") { XCTAssertEqual(type, actual, "Actual keyboard type (\(actual)) does not match expected keyboard type (\(type))") } } diff --git a/TABTestKit/Classes/Contexts/NavigationContext.swift b/TABTestKit/Classes/Contexts/NavigationContext.swift index d93fe5c2..add26113 100644 --- a/TABTestKit/Classes/Contexts/NavigationContext.swift +++ b/TABTestKit/Classes/Contexts/NavigationContext.swift @@ -14,21 +14,25 @@ public extension NavigationContext { /// /// - Parameter screen: The screen to await. func see(_ screen: ScreenType) -> StepAction { - see(screen.trait) + StepAction(description: "see the \(screen.description)") { + screen.trait.await(.exists, .visible) + } } /// Asserts that a screen does not exist, by awaiting on its trait. /// /// - Parameter screen: The screen to await. func doNotSee(_ screen: ScreenType) -> StepAction { - doNotSee(screen.trait) + StepAction(description: "do not see the \(screen.description)") { + screen.trait.await(not: .exists) + } } /// Asserts that an element can be seen, by awaiting for it to exist and be visible. /// /// - Parameter element: The element to await. func see(_ element: Element) -> StepAction { - StepAction { + StepAction(description: "see the \(element.description)") { element.await(.exists, .visible) } } @@ -37,7 +41,7 @@ public extension NavigationContext { /// /// - Parameter element: The element to await. func doNotSee(_ element: Element) -> StepAction { - StepAction { + StepAction(description: "do not see the \(element.description)") { element.await(not: .exists) } } @@ -45,9 +49,15 @@ public extension NavigationContext { /// Completes one or more things that knows how to complete itself. /// /// - Parameter completableThings: One or more Completable things. Typically, this would be a Screen that conforms to Completable. - func complete(_ completableThings: Completable...) -> StepAction { + func complete(_ completableThings: CompletableWithDescription...) -> StepAction { + guard !completableThings.isEmpty else { XCTFatalFail("You must provide at least one Completable thing to complete!") } - return StepAction { + + let completableDescription = completableThings + .map(\.description) + .joined(separator: " and the ") + + return StepAction(description: "complete the \(completableDescription)") { completableThings.forEach { $0.await() $0.complete() @@ -58,9 +68,15 @@ public extension NavigationContext { /// Dismisses one or more things that knows how to complete itself. /// /// - Parameter dismissableThings: One or more Dismissable things. Typically, this would be a Screen that conforms to Dismissable. - func dismiss(_ dismissableThings: Dismissable...) -> StepAction { + func dismiss(_ dismissableThings: DismissableWithDescription...) -> StepAction { + guard !dismissableThings.isEmpty else { XCTFatalFail("You must provide at least one Dismissable thing to dismiss!") } - return StepAction { + + let dismissableDescription = dismissableThings + .map(\.description) + .joined(separator: " and the ") + + return StepAction(description: "dismiss the \(dismissableDescription)") { dismissableThings.forEach { $0.await() $0.dismiss() @@ -87,7 +103,8 @@ public extension NavigationContext { /// /// - Parameter url: The URL to open. func open(_ url: URL) -> StepAction { - StepAction { + + StepAction(description: "open '\(url.absoluteString)'") { springboard.activate() if !Icon.testRunner.determine(.hittable, timeout: 1) { XCUIDevice.shared.press(.home) // Ensure we're on the first page of the home screen diff --git a/TABTestKit/Classes/Contexts/SheetContext.swift b/TABTestKit/Classes/Contexts/SheetContext.swift index f037617e..e28f2161 100644 --- a/TABTestKit/Classes/Contexts/SheetContext.swift +++ b/TABTestKit/Classes/Contexts/SheetContext.swift @@ -11,7 +11,7 @@ public protocol SheetContext {} public extension SheetContext { func tap(_ actionButtonID: String, in sheet: Sheet) -> StepAction { - StepAction { + StepAction(description: "tap on the \(actionButtonID) button in the sheet") { sheet.actionButton(withID: actionButtonID).tap() } } diff --git a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift index e9b51b67..1a1c7823 100644 --- a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift +++ b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift @@ -11,7 +11,7 @@ public protocol SystemPreferencesContext {} public extension SystemPreferencesContext { func resetAllPrivacyPrompts() -> StepAction { - StepAction { + StepAction(description: "reset all privacy prompts") { if SystemPreferences().state != .notRunning { openSystemPreferences().execute() // Turns out you can't terminate an app if it's not in the foreground, but we want to terminate it so that it can be reset back to the start, so we're weirdly activating it here before doing anything. Might be a bug. } @@ -25,13 +25,13 @@ public extension SystemPreferencesContext { } func openSystemPreferences() -> StepAction { - StepAction { + StepAction(description: "open system preferences") { SystemPreferences().activate() } } func terminateSystemPreferences() -> StepAction{ - StepAction { + StepAction(description: "terminate system preferences") { SystemPreferences().terminate() } } diff --git a/TABTestKit/Classes/Elements/Attributes.swift b/TABTestKit/Classes/Elements/Attributes.swift index d9b4650b..61c509e2 100644 --- a/TABTestKit/Classes/Elements/Attributes.swift +++ b/TABTestKit/Classes/Elements/Attributes.swift @@ -65,19 +65,37 @@ extension ElementAttributes.State: CustomStringConvertible { case .exists: return "exists" case .hittable: - return "hittable" + return "is hittable" case .visible: - return "visible" + return "is visible" case let .visibleIn(element): - return "visible in \(element.description)" + return "is visible in the \(element.description)" case .selected: - return "selected" + return "is selected" case .enabled: - return "enabled" + return "is enabled" case .hasKeyboardFocus: return "has keyboard focus" } + } + public var negativeDescription: String { + switch self { + case .exists: + return "does not exist" + case .hittable: + return "is not hittable" + case .visible: + return "is not visible" + case let .visibleIn(element): + return "is not visible in the \(element.description)" + case .selected: + return "is not selected" + case .enabled: + return "is not enabled" + case .hasKeyboardFocus: + return "has no keyboard focus" + } } } @@ -93,7 +111,7 @@ extension ElementAttributes.Direction: CustomStringConvertible { case .right: return "right" case let .from(fromCoordinate, toCoordinate): - return "from \(fromCoordinate.dx)x\(fromCoordinate.dy) to \(toCoordinate.dx)x\(toCoordinate.dy)" + return "from \(fromCoordinate.description) to \(toCoordinate.description)" } } diff --git a/TABTestKit/Classes/Extensions/NormalizedCoordinate+Locations.swift b/TABTestKit/Classes/Extensions/NormalizedCoordinate+Locations.swift index ccfc115f..6da1e493 100644 --- a/TABTestKit/Classes/Extensions/NormalizedCoordinate+Locations.swift +++ b/TABTestKit/Classes/Extensions/NormalizedCoordinate+Locations.swift @@ -140,3 +140,38 @@ public extension CGVector { static let rightThird = CGVector(dx: 0.66, dy: 0.5) } + +extension CGVector: CustomStringConvertible { + public var description: String { + switch self { + case .middle: + return "middle" + case .top: + return "top" + case .bottom: + return "bottom" + case .left: + return "left" + case .right: + return "right" + case .topLeft: + return "top left" + case .topRight: + return "top right" + case .bottomLeft: + return "bottom left" + case .bottomRight: + return "bottom right" + case .topThird: + return "top third" + case .leftThird: + return "left third" + case .bottomThird: + return "bottom third" + case .rightThird: + return "right third" + default: + return "[\(dx),\(dy)]" + } + } +} diff --git a/TABTestKit/Classes/Protocols/Element.swift b/TABTestKit/Classes/Protocols/Element.swift index 05e63ad1..3ec2d3ae 100644 --- a/TABTestKit/Classes/Protocols/Element.swift +++ b/TABTestKit/Classes/Protocols/Element.swift @@ -17,6 +17,9 @@ public protocol Element: CustomStringConvertible { /// You may however wish to just match the first navBar (for example), and since there's usually only one navBar in an /// app, you don't really need to provide an ID for it. var id: String? { get } + + /// The name of the element. Used in the step description + var name: String { get } /// The parent element. By default the parent element is the app being tested. var parent: Element { get } @@ -42,6 +45,8 @@ public protocol Element: CustomStringConvertible { } public extension Element { + + var name: String { return [id].compactMap { $0 }.joined(separator: " ") } var parent: Element { return App.shared } @@ -66,12 +71,9 @@ extension Element { let indexString: String? = index > 0 ? indexFormatter.string(for: index) : nil - let name: String? = [label, value, id] - .compactMap { $0 } - .first(where: { !$0.isEmpty }) - return [indexString, name, String(describing: Swift.type(of: self))] .compactMap { $0 } + .filter { !$0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty } .joined(separator: " ") } } From 5a97357c4c6d9b7a53a812e1bdbcdbef353036e1 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 10:59:17 +0100 Subject: [PATCH 04/26] Added humanReadableString --- Example/Pods/Pods.xcodeproj/project.pbxproj | 4 + .../String+HumanReadableString.swift | 76 +++++++++++++++++++ TABTestKit/Classes/Protocols/Element.swift | 3 +- TABTestKit/Classes/Protocols/Screen.swift | 2 +- 4 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 TABTestKit/Classes/Extensions/String+HumanReadableString.swift diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 57a4c108..5afc7991 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -89,6 +89,7 @@ F4BF8B887488C4B0900D5C36A2B48886 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85AFC7AC121EDD585A794CBEF219ED8 /* TextView.swift */; }; F7A4CDA05AB92DA971CDBBDEDF78F974 /* SheetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 656317B1689F8389F8D8A13FB0281F7E /* SheetContext.swift */; }; F809D6C225554A4900CF86E9 /* XCUIApplicationState+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */; }; + F8AA657F255931AC00E99FF4 /* String+HumanReadableString.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA657E255931AC00E99FF4 /* String+HumanReadableString.swift */; }; F8C8632658B840BA4531A5F8EEA2521E /* systemPreferencesRootScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A6C582E6031CB7A125F0800F45055D /* systemPreferencesRootScreen.swift */; }; FA5FE4421DD144891167A9BBA2FC9DA5 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D829733A2418052EC220B9F4AC655D5 /* Cell.swift */; }; FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; @@ -230,6 +231,7 @@ F09670B2248CA33BD5A05396463DC7DB /* TABTestKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-prefix.pch"; sourceTree = ""; }; F2F0B07615633500EA51A42DA7490BC2 /* SystemPreferencesContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesContext.swift; sourceTree = ""; }; F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCUIApplicationState+String.swift"; sourceTree = ""; }; + F8AA657E255931AC00E99FF4 /* String+HumanReadableString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+HumanReadableString.swift"; sourceTree = ""; }; FA7DCD7F1B963A9EEA6DA99154E69718 /* TABTestKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TABTestKit-Info.plist"; sourceTree = ""; }; FC125873B3EFEB103E5E93686ACCEA70 /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; FC46B20374B589B005A9908C70225CDF /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; @@ -432,6 +434,7 @@ 976E5B1537BAD0007743ADFE257F3ED9 /* XCUIElement+isVisible.swift */, E1848ED8032296034A5B64A0616D8A8E /* XCUIElement+wait.swift */, F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */, + F8AA657E255931AC00E99FF4 /* String+HumanReadableString.swift */, ); name = Extensions; path = TABTestKit/Classes/Extensions; @@ -848,6 +851,7 @@ 8760E5691C6B92CAAC17935225A01921 /* StepAction.swift in Sources */, 2F7918BEF8541A66867040B87BD3C527 /* TextField.swift in Sources */, F4BF8B887488C4B0900D5C36A2B48886 /* TextView.swift in Sources */, + F8AA657F255931AC00E99FF4 /* String+HumanReadableString.swift in Sources */, 700688692E1A02B5BD67FF220AEE4647 /* ValueRepresentable.swift in Sources */, EE2DE74B688C2BA2BCA8D8D56B3CDE42 /* View.swift in Sources */, 434755ECAB25587245B6D59856CAF2AE /* WebView.swift in Sources */, diff --git a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift new file mode 100644 index 00000000..bca05fbc --- /dev/null +++ b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift @@ -0,0 +1,76 @@ +// +// String+HumanReadableString.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import Foundation + +extension String { + var humanReadableString: String { + + let emptySet = CharacterSet.whitespacesAndNewlines + let splitSet = emptySet.union(CharacterSet.uppercaseLetters) + let valueSet = CharacterSet(charactersIn: "\"“”") + let trimmingSet = emptySet.union(CharacterSet(charactersIn: "?!")) + + return map(Character.init) + .reduce(into: [String]()) { (result, character) in + + let lastChunk = result.count > 0 ? result[result.count-1] : nil + let lastCharacter = lastChunk?.last.map(Character.init) + + let isFirstCharachter = result.count == 0 + let isSpitCharacter = splitSet.contains(character: character) + let isPartOfValue = lastChunk?.occurences(of: valueSet) == 1 + let isPartOfLastChunk = splitSet.contains(character: lastCharacter) && isSpitCharacter && !emptySet.contains(character: character) + + if !isPartOfValue && !isPartOfLastChunk && (isSpitCharacter || isFirstCharachter) { + result.append(String(character)) + } else { + result[result.count-1].append(character) + } + } + .compactMap { word -> String? in + let cleanWord = word.trimmingCharacters(in: trimmingSet) + return cleanWord.isEmpty ? nil : cleanWord + } + .map { (word) -> String in + guard word.contains(where: \.isLowercase) else { + return word + } + return word.lcfirst + } + .joined(separator: " ") + } +} + +extension Sequence where Element == String { + var humanReadableString: String { + map(\.humanReadableString) + .filter { !$0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty } + .joined(separator: " ") + } +} + +private extension String { + func occurences(of characterSet: CharacterSet) -> Int { + reduce(into: 0) { (result, character) in + guard characterSet.contains(character: character) else { return } + result += 1 + } + } + + var lcfirst: String { + guard let lowercasedFirstCharacter = first?.lowercased() else { return self } + return ([lowercasedFirstCharacter] + dropFirst().map(String.init)).joined() + } +} + +private extension CharacterSet { + func contains(character: Character?) -> Bool { + guard let character = character else { return false } + return CharacterSet(charactersIn: character.description).isSubset(of: self) + } +} diff --git a/TABTestKit/Classes/Protocols/Element.swift b/TABTestKit/Classes/Protocols/Element.swift index 3ec2d3ae..05bdddc7 100644 --- a/TABTestKit/Classes/Protocols/Element.swift +++ b/TABTestKit/Classes/Protocols/Element.swift @@ -73,8 +73,7 @@ extension Element { return [indexString, name, String(describing: Swift.type(of: self))] .compactMap { $0 } - .filter { !$0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty } - .joined(separator: " ") + .humanReadableString } } diff --git a/TABTestKit/Classes/Protocols/Screen.swift b/TABTestKit/Classes/Protocols/Screen.swift index b9439e71..a2f85a9b 100644 --- a/TABTestKit/Classes/Protocols/Screen.swift +++ b/TABTestKit/Classes/Protocols/Screen.swift @@ -25,7 +25,7 @@ public protocol Screen: CustomStringConvertible { extension Screen { public var description: String { - String(describing: Swift.type(of: self)) + String(describing: Swift.type(of: self)).humanReadableString } } From b0a8a5911dc996500018b3bcad1c76dadbebbe4b Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 11:47:01 +0100 Subject: [PATCH 05/26] Refactored steps + added the ability to setup a screenshot behavior --- CHANGELOG.md | 6 ++ Example/Pods/Pods.xcodeproj/project.pbxproj | 20 +++++ TABTestKit/Classes/Apps/App.swift | 26 +++++- TABTestKit/Classes/BDD/And.swift | 69 ++++++++++++++++ TABTestKit/Classes/BDD/Given.swift | 69 ++++++++++++++++ TABTestKit/Classes/BDD/Step.swift | 79 ++++--------------- TABTestKit/Classes/BDD/Then.swift | 69 ++++++++++++++++ TABTestKit/Classes/BDD/When.swift | 69 ++++++++++++++++ .../String+HumanReadableString.swift | 4 +- .../Extensions/XCTestCase+Screenshot.swift | 21 +++++ TABTestKit/Classes/TABTestCase.swift | 5 ++ 11 files changed, 370 insertions(+), 67 deletions(-) create mode 100644 TABTestKit/Classes/BDD/And.swift create mode 100644 TABTestKit/Classes/BDD/Given.swift create mode 100644 TABTestKit/Classes/BDD/Then.swift create mode 100644 TABTestKit/Classes/BDD/When.swift create mode 100644 TABTestKit/Classes/Extensions/XCTestCase+Screenshot.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fbdd144..aad3d032 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # CHANGELOG +## Pending + +- Added the ability to define a description for Elements & Screens +- Added XCTContext activity for every step +- Added the ability to setup screenshotting behavior + ## 1.7.1 ### Fixed diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 5afc7991..1187087c 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -90,6 +90,11 @@ F7A4CDA05AB92DA971CDBBDEDF78F974 /* SheetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 656317B1689F8389F8D8A13FB0281F7E /* SheetContext.swift */; }; F809D6C225554A4900CF86E9 /* XCUIApplicationState+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */; }; F8AA657F255931AC00E99FF4 /* String+HumanReadableString.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA657E255931AC00E99FF4 /* String+HumanReadableString.swift */; }; + F8AA6681255950F300E99FF4 /* XCTestCase+Screenshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA6680255950F300E99FF4 /* XCTestCase+Screenshot.swift */; }; + F8AA668B2559541E00E99FF4 /* Given.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA668A2559541E00E99FF4 /* Given.swift */; }; + F8AA66912559543800E99FF4 /* When.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA66902559543800E99FF4 /* When.swift */; }; + F8AA66972559543F00E99FF4 /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA66962559543F00E99FF4 /* Then.swift */; }; + F8AA669D2559544400E99FF4 /* And.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA669C2559544400E99FF4 /* And.swift */; }; F8C8632658B840BA4531A5F8EEA2521E /* systemPreferencesRootScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A6C582E6031CB7A125F0800F45055D /* systemPreferencesRootScreen.swift */; }; FA5FE4421DD144891167A9BBA2FC9DA5 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D829733A2418052EC220B9F4AC655D5 /* Cell.swift */; }; FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; @@ -232,6 +237,11 @@ F2F0B07615633500EA51A42DA7490BC2 /* SystemPreferencesContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesContext.swift; sourceTree = ""; }; F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCUIApplicationState+String.swift"; sourceTree = ""; }; F8AA657E255931AC00E99FF4 /* String+HumanReadableString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+HumanReadableString.swift"; sourceTree = ""; }; + F8AA6680255950F300E99FF4 /* XCTestCase+Screenshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Screenshot.swift"; sourceTree = ""; }; + F8AA668A2559541E00E99FF4 /* Given.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Given.swift; sourceTree = ""; }; + F8AA66902559543800E99FF4 /* When.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = When.swift; sourceTree = ""; }; + F8AA66962559543F00E99FF4 /* Then.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = ""; }; + F8AA669C2559544400E99FF4 /* And.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = And.swift; sourceTree = ""; }; FA7DCD7F1B963A9EEA6DA99154E69718 /* TABTestKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TABTestKit-Info.plist"; sourceTree = ""; }; FC125873B3EFEB103E5E93686ACCEA70 /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; FC46B20374B589B005A9908C70225CDF /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; @@ -435,6 +445,7 @@ E1848ED8032296034A5B64A0616D8A8E /* XCUIElement+wait.swift */, F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */, F8AA657E255931AC00E99FF4 /* String+HumanReadableString.swift */, + F8AA6680255950F300E99FF4 /* XCTestCase+Screenshot.swift */, ); name = Extensions; path = TABTestKit/Classes/Extensions; @@ -481,6 +492,10 @@ children = ( 0D9864B94D0C97C982DACCDD8B382B1E /* Scenario.swift */, B8ADED80001DED8F960B8A08F3F1026D /* Step.swift */, + F8AA668A2559541E00E99FF4 /* Given.swift */, + F8AA66902559543800E99FF4 /* When.swift */, + F8AA66962559543F00E99FF4 /* Then.swift */, + F8AA669C2559544400E99FF4 /* And.swift */, ); name = BDD; path = TABTestKit/Classes/BDD; @@ -804,6 +819,7 @@ BDD923D69FE552C4696A7BD85516FE67 /* CGVector+Offset.swift in Sources */, B04E97D1F83E7D0C2C06311A3C941CDB /* CollectionView.swift in Sources */, 1F38EFDFA992989D1F842F283343D571 /* Completable.swift in Sources */, + F8AA668B2559541E00E99FF4 /* Given.swift in Sources */, 2E9EAD4A7F3B3392B572ED690DCABC20 /* DatePicker.swift in Sources */, 0526DE7ECA45A28FA1B5AEF4C07049E4 /* Dismissable.swift in Sources */, A9FA41F25B8BC1FD497E26444897E649 /* Editable.swift in Sources */, @@ -819,6 +835,7 @@ BB9D41F5E8A093EBC9EDE2DFBF5EF784 /* NavBar.swift in Sources */, AD68A7303B63A43663767D46878A6449 /* NavigationContext.swift in Sources */, EC20F678A51FFAD90B3D3D1F76C58719 /* NormalizedCoordinate+Locations.swift in Sources */, + F8AA669D2559544400E99FF4 /* And.swift in Sources */, B16D01DE1E4487F2B39335D599CBFF0A /* PageIndicator.swift in Sources */, FEE6DD6A8EDEDF4078C41A22CEE26DE7 /* Picker.swift in Sources */, 46775302AF7999648B09D9ED3EE48C74 /* Refreshable.swift in Sources */, @@ -829,6 +846,7 @@ 7FFF240E73592A018E7EF51D34C46822 /* ScrollableScreen.swift in Sources */, 8F20672129F9D3960CD2C81807143AA6 /* ScrollView.swift in Sources */, 6E5998C704D81C5561D9F3A0AE87E3F4 /* SecureTextField.swift in Sources */, + F8AA66912559543800E99FF4 /* When.swift in Sources */, 660673CF4BD18AF55C3081895930F715 /* SegmentedControl.swift in Sources */, 4CF8C1EB590C78B81CCAF8907F83B665 /* Sheet.swift in Sources */, F7A4CDA05AB92DA971CDBBDEDF78F974 /* SheetContext.swift in Sources */, @@ -837,6 +855,7 @@ EC47F602CD37E5EC24DE51E7875BA16A /* Step.swift in Sources */, 8B2F8F080ECC1DE1DB954E16F23F0FBE /* Stepper.swift in Sources */, BA8CF7D98500DADAD801E5914AB1A8F4 /* Switch.swift in Sources */, + F8AA6681255950F300E99FF4 /* XCTestCase+Screenshot.swift in Sources */, FFB682562D658DE0039CA1B643E5B987 /* SystemPreferences.swift in Sources */, 2F6C3202D54D6620EC5BF96782955D5A /* SystemPreferencesContext.swift in Sources */, CCDFD3C2EDCC10DE9FDE0397CF868A28 /* SystemPreferencesGeneralScreen.swift in Sources */, @@ -860,6 +879,7 @@ 129360CE5E67138943C2C4748D82367A /* XCUIElement+hasKeyboardFocus.swift in Sources */, A103AA3DDCC0C574830CCD6754CC4FB7 /* XCUIElement+isVisible.swift in Sources */, 9E751CCA8B991AD984B5F2DB579EFEF9 /* XCUIElement+wait.swift in Sources */, + F8AA66972559543F00E99FF4 /* Then.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/TABTestKit/Classes/Apps/App.swift b/TABTestKit/Classes/Apps/App.swift index d842be8d..dc2e91b2 100644 --- a/TABTestKit/Classes/Apps/App.swift +++ b/TABTestKit/Classes/Apps/App.swift @@ -14,11 +14,36 @@ import XCTest /// Using this instead of XCUIApplication() means you get the /// enhanced waits for the correct states when launching/backgrounding etc, inherited from BaseApp. public final class App: BaseApp { + + public struct ScreenshotOption: OptionSet { + public let rawValue: Int + + public init(rawValue: Int) { + self.rawValue = rawValue + } + + public static let onFailure = ScreenshotOption(rawValue: 1 << 0) + public static let beforeStep = ScreenshotOption(rawValue: 1 << 1) + public static let afterStep = ScreenshotOption(rawValue: 1 << 2) + public static let none: ScreenshotOption = [] + public static let all: ScreenshotOption = [.onFailure, .beforeStep, .afterStep] + } /// The shared App instance. Using a shared instance ensure consistency with launch arguments. public static let shared = App() + + public private(set) var screenshotOption: ScreenshotOption = .none + public private(set) var screenshotQuality: XCTAttachment.ImageQuality = .medium + public private(set) var screenshotLifetime: XCTAttachment.Lifetime = .deleteOnSuccess private override init() { super.init() } + + /// Changes the screenshot behavior + public func setScreenshots(option: ScreenshotOption, quality: XCTAttachment.ImageQuality = .medium, lifetime: XCTAttachment.Lifetime = .deleteOnSuccess) { + screenshotOption = option + screenshotQuality = quality + screenshotLifetime = lifetime + } /// Launches the app, cleaning if required. /// Note you are responsible for implementing these launch arguments at the appropriate time in your launch cycle, @@ -31,5 +56,4 @@ public final class App: BaseApp { } super.launch() } - } diff --git a/TABTestKit/Classes/BDD/And.swift b/TABTestKit/Classes/BDD/And.swift new file mode 100644 index 00000000..d1c9c15d --- /dev/null +++ b/TABTestKit/Classes/BDD/And.swift @@ -0,0 +1,69 @@ +// +// And.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import XCTest + +/// Defines an executable And step to be used in tests. +/// +extension XCTestCase { + + // MARK: - Standard init, i.e. And(somethingHappens) + + @discardableResult + public func And(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + And(action(), line: line, function: function, file: file) + } + + @discardableResult + public func And(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["And", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "I" init, i.e. And(I: doSomething) + + @discardableResult + public func And(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + And(I: action(), line: line, function: function, file: file) + } + + @discardableResult + public func And(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["And", "I", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "the" init, i.e. And(the: thingIsTrue) + + @discardableResult + public func And(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + And(the: action(), line: line, function: function, file: file) + } + + @discardableResult + public func And(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["And", "the", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "a" init, i.e. And(a: serverErrorIsReturned) + + @discardableResult + public func And(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + And(a: action(), line: line, function: function, file: file) + } + + @discardableResult + public func And(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["And", "a", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } +} diff --git a/TABTestKit/Classes/BDD/Given.swift b/TABTestKit/Classes/BDD/Given.swift new file mode 100644 index 00000000..c81fcb0e --- /dev/null +++ b/TABTestKit/Classes/BDD/Given.swift @@ -0,0 +1,69 @@ +// +// Given.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import XCTest + +/// Defines an executable Given step to be used in tests. +/// +extension XCTestCase { + + // MARK: - Standard init, i.e. Given(somethingHappens) + + @discardableResult + public func Given(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + Given(action(), line: line, function: function, file: file) + } + + @discardableResult + public func Given(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["Given", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "I" init, i.e. Given(I: doSomething) + + @discardableResult + public func Given(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + Given(I: action(), line: line, function: function, file: file) + } + + @discardableResult + public func Given(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["Given", "I", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "the" init, i.e. Given(the: thingIsTrue) + + @discardableResult + public func Given(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + Given(the: action(), line: line, function: function, file: file) + } + + @discardableResult + public func Given(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["Given", "the", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "a" init, i.e. Given(a: serverErrorIsReturned) + + @discardableResult + public func Given(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + Given(a: action(), line: line, function: function, file: file) + } + + @discardableResult + public func Given(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["Given", "a", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } +} diff --git a/TABTestKit/Classes/BDD/Step.swift b/TABTestKit/Classes/BDD/Step.swift index 1119c9a5..a27f392e 100644 --- a/TABTestKit/Classes/BDD/Step.swift +++ b/TABTestKit/Classes/BDD/Step.swift @@ -9,11 +9,6 @@ import XCTest -open class Given: Step {} -open class When: Step {} -open class Then: Step {} -open class And: Step {} - /// Defines an executable step to be used in tests. /// /// Steps that are initialised with a function that doesn't take arguments can omit the parenthesis, @@ -25,7 +20,9 @@ open class Step { /// A reference to the most recently created Step, useful if you want to find out what step failed. public static var current: Step? - /// The line in a test function this step is in. + /// The test case this step is executed in. + public let testCase: XCTestCase + /// The line in a test function this step is in. public let line: UInt /// The test function this step is in. public let function: StaticString @@ -34,71 +31,25 @@ open class Step { /// The description of this step. public let description: String - init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { + init(handler: () -> Void, testCase: XCTestCase, description: String, line: UInt, function: StaticString, file: StaticString) { + self.testCase = testCase self.line = line self.function = function self.file = file self.description = description Step.current = self + XCTContext.runActivity(named: description) { _ in - handler() - } - } - // MARK: - Standard init, i.e. Given(somethingHappens) - - @discardableResult - public convenience init(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(action(), line: line, function: function, file: file) - } - - @discardableResult - public convenience init(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = [String(describing: Swift.type(of: self)), action.description] - .joined(separator: " ") - self.init(handler: action.execute, description: description, line: line, function: function, file: file) - } - - // MARK: - "I" init, i.e. Given(I: doSomething) - - @discardableResult - public convenience init(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(I: action(), line: line, function: function, file: file) - } - - @discardableResult - public convenience init(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = [String(describing: Swift.type(of: self)), "I", action.description] - .joined(separator: " ") - self.init(handler: action.execute, description: description, line: line, function: function, file: file) - } - - // MARK: - "the" init, i.e. Given(the: thingIsTrue) - - @discardableResult - public convenience init(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(the: action(), line: line, function: function, file: file) - } - - @discardableResult - public convenience init(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = [String(describing: Swift.type(of: self)), "the", action.description] - .joined(separator: " ") - self.init(handler: action.execute, description: description, line: line, function: function, file: file) - } - - // MARK: - "a" init, i.e. Given(a: serverErrorIsReturned) + if App.shared.screenshotOption.contains(.beforeStep) { + testCase.attachScreenshot() + } - @discardableResult - convenience init(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(a: action(), line: line, function: function, file: file) - } + handler() - @discardableResult - convenience init(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = [String(describing: Swift.type(of: self)), "a", action.description] - .joined(separator: " ") - self.init(handler: action.execute, description: description, line: line, function: function, file: file) - } - + if App.shared.screenshotOption.contains(.afterStep) { + testCase.attachScreenshot() + } + } + } } diff --git a/TABTestKit/Classes/BDD/Then.swift b/TABTestKit/Classes/BDD/Then.swift new file mode 100644 index 00000000..78d55905 --- /dev/null +++ b/TABTestKit/Classes/BDD/Then.swift @@ -0,0 +1,69 @@ +// +// Then.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import XCTest + +/// Defines an executable Then step to be used in tests. +/// +extension XCTestCase { + + // MARK: - Standard init, i.e. Then(somethingHappens) + + @discardableResult + public func Then(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + Then(action(), line: line, function: function, file: file) + } + + @discardableResult + public func Then(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["Then", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "I" init, i.e. Then(I: doSomething) + + @discardableResult + public func Then(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + Then(I: action(), line: line, function: function, file: file) + } + + @discardableResult + public func Then(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["Then", "I", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "the" init, i.e. Then(the: thingIsTrue) + + @discardableResult + public func Then(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + Then(the: action(), line: line, function: function, file: file) + } + + @discardableResult + public func Then(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["Then", "the", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "a" init, i.e. Then(a: serverErrorIsReturned) + + @discardableResult + public func Then(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + Then(a: action(), line: line, function: function, file: file) + } + + @discardableResult + public func Then(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["Then", "a", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } +} diff --git a/TABTestKit/Classes/BDD/When.swift b/TABTestKit/Classes/BDD/When.swift new file mode 100644 index 00000000..79a7a269 --- /dev/null +++ b/TABTestKit/Classes/BDD/When.swift @@ -0,0 +1,69 @@ +// +// When.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import XCTest + +/// Defines an executable When step to be used in tests. +/// +extension XCTestCase { + + // MARK: - Standard init, i.e. When(somethingHappens) + + @discardableResult + public func When(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + When(action(), line: line, function: function, file: file) + } + + @discardableResult + public func When(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["When", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "I" init, i.e. When(I: doSomething) + + @discardableResult + public func When(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + When(I: action(), line: line, function: function, file: file) + } + + @discardableResult + public func When(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["When", "I", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "the" init, i.e. When(the: thingIsTrue) + + @discardableResult + public func When(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + When(the: action(), line: line, function: function, file: file) + } + + @discardableResult + public func When(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["When", "the", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } + + // MARK: - "a" init, i.e. When(a: serverErrorIsReturned) + + @discardableResult + public func When(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + When(a: action(), line: line, function: function, file: file) + } + + @discardableResult + public func When(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { + let description = ["When", "a", action.description] + .joined(separator: " ") + return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) + } +} diff --git a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift index bca05fbc..e51485ec 100644 --- a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift +++ b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift @@ -8,7 +8,7 @@ import Foundation extension String { - var humanReadableString: String { + public var humanReadableString: String { let emptySet = CharacterSet.whitespacesAndNewlines let splitSet = emptySet.union(CharacterSet.uppercaseLetters) @@ -47,7 +47,7 @@ extension String { } extension Sequence where Element == String { - var humanReadableString: String { + public var humanReadableString: String { map(\.humanReadableString) .filter { !$0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty } .joined(separator: " ") diff --git a/TABTestKit/Classes/Extensions/XCTestCase+Screenshot.swift b/TABTestKit/Classes/Extensions/XCTestCase+Screenshot.swift new file mode 100644 index 00000000..e50ac2a3 --- /dev/null +++ b/TABTestKit/Classes/Extensions/XCTestCase+Screenshot.swift @@ -0,0 +1,21 @@ +// +// XCTestCase+Screenshot.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import XCTest + +extension XCTestCase { + + func attachScreenshot() { + // if tests have no host app there is no point in making screenshots + guard #available(iOS 9.0, OSX 10.11, *), Bundle.main.bundlePath.hasSuffix(".app") else { return } + + let screenshot = XCUIScreen.main.screenshot() + let attachment = XCTAttachment(screenshot: screenshot, quality: App.shared.screenshotQuality) + attachment.lifetime = App.shared.screenshotLifetime + add(attachment) + } +} diff --git a/TABTestKit/Classes/TABTestCase.swift b/TABTestKit/Classes/TABTestCase.swift index bd7f0eb8..4e793d58 100644 --- a/TABTestKit/Classes/TABTestCase.swift +++ b/TABTestKit/Classes/TABTestCase.swift @@ -81,6 +81,11 @@ open class TABTestCase: XCTestCase, DefaultContexts { // You can find this attachment in the .xcresult bundle (usually Derived Data). let attachment = createFailureAttachment(description: description, filePath: filePath, lineNumber: lineNumber) add(attachment) + + if App.shared.screenshotOption.contains(.onFailure) { + attachScreenshot() + } + let filePath = Step.current?.filePath ?? filePath let lineNumber = Step.current?.lineNumber ?? lineNumber super.recordFailure(withDescription: description, inFile: filePath, atLine: lineNumber, expected: expected) From 402ead57a8d8508d72fdbddbabf17b14fd48a519 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 12:14:14 +0100 Subject: [PATCH 06/26] Fixed support for older swift versions --- Example/Pods/Pods.xcodeproj/project.pbxproj | 990 +++++++++--------- TABTestKit/Classes/BDD/And.swift | 8 +- TABTestKit/Classes/BDD/Given.swift | 8 +- TABTestKit/Classes/BDD/Then.swift | 8 +- TABTestKit/Classes/BDD/When.swift | 8 +- .../Classes/Contexts/AlertContext.swift | 2 +- TABTestKit/Classes/Contexts/AppContext.swift | 14 +- .../Classes/Contexts/BiometricsContext.swift | 8 +- .../Classes/Contexts/InteractionContext.swift | 28 +- .../Classes/Contexts/NavigationContext.swift | 15 +- .../Classes/Contexts/SheetContext.swift | 2 +- .../Contexts/SystemPreferencesContext.swift | 6 +- .../String+HumanReadableString.swift | 2 +- 13 files changed, 551 insertions(+), 548 deletions(-) diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 1187087c..47e1e3b5 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,117 +7,117 @@ objects = { /* Begin PBXBuildFile section */ - 0526DE7ECA45A28FA1B5AEF4C07049E4 /* Dismissable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 149ED91D61E38D4ADE77ECD1C3CDCA8B /* Dismissable.swift */; }; - 0B6D2B8E54F6A7A48D48594517090835 /* InteractionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A07B83AE28D9690E0C0D9EB1D6B8EA /* InteractionContext.swift */; }; - 129360CE5E67138943C2C4748D82367A /* XCUIElement+hasKeyboardFocus.swift in Sources */ = {isa = PBXBuildFile; fileRef = AABB82F79590AA2D0458F8674BFCB4FD /* XCUIElement+hasKeyboardFocus.swift */; }; + 03B4DA52DF96E031859A0DF2A8C9EB0C /* Completable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DCACD99A57DD7326886398073E8D0F0 /* Completable.swift */; }; + 0624985093AF3B7709891D5AC42315AE /* ValueRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0788D6F9F3512AE4BDA244B4DCDF26E /* ValueRepresentable.swift */; }; + 082157A0B221EBFA65F068F8029B05E6 /* ScrollableScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5D6DC8DEB8AFE62ED3A44D51A6198C0 /* ScrollableScreen.swift */; }; + 0A0A553EC080DE1A5DF339060A9038C5 /* PageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 398CBC48FD3DC75735CF21DC994303C1 /* PageIndicator.swift */; }; + 0E3E25AD0D3DC97BE8A0B6FD2F16D38B /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953A3688CF885118CDDF66A466CC614B /* Button.swift */; }; + 11B3B9F1A8AD84A46B5BA22D8F181F38 /* Array+Safe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F3F765734217A16E21E8B1C09B7FE80 /* Array+Safe.swift */; }; + 1387C6F9EB4523313438D4E580565AC2 /* Stepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 574CE0D3F84DEB81697CA498206D4AAD /* Stepper.swift */; }; + 17D0CB638D3EF5133B62008560DF1327 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1977697003E1D2D4081EBD3C88A058 /* Label.swift */; }; + 18144A36394D1224D583A84665FB4B30 /* String+HumanReadableString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C956BC753D42DFFEAB22C6711757FDE /* String+HumanReadableString.swift */; }; 182CC29C7BAFE0334AC07728900F1D6C /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */; }; - 1F38EFDFA992989D1F842F283343D571 /* Completable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A57D682A4852F19188AA9E4B0FEDED5 /* Completable.swift */; }; - 204619BA88B79A0A38CE757859A37EC8 /* Adjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC125873B3EFEB103E5E93686ACCEA70 /* Adjustable.swift */; }; - 24434A6AD8C5B0B6F299F883C087D75F /* BiometricsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74E8DD8489CD119E2996B2D7AA50966 /* BiometricsContext.swift */; }; - 248E3015488597454E4DB64E1CBD9F33 /* TABTestKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B81AB3802539BA40C55F66E8195FD5C /* TABTestKit-dummy.m */; }; + 185A5E457BB628A20AF9D7BD868EEE7B /* SystemPreferencesGeneralScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16FF8D7D264C777C17EC8E3826E41FC0 /* SystemPreferencesGeneralScreen.swift */; }; + 1BA1C4D131C9AE17F0DBB522DFB48D2D /* XCTestCase+Screenshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28B6F8382724C10ED00299DBAEA904E9 /* XCTestCase+Screenshot.swift */; }; + 1D9712C21C9B75BB08F99297D2FEC7C4 /* BaseApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73619FBD640A527E63538013823ED97D /* BaseApp.swift */; }; + 1EA6F865BCAC4ED83ECD404BE5297A3D /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BAE1DB9682A76CE1F7D25EDF50954B4 /* Alert.swift */; }; + 2054DC424509138E34F3848CE8B90938 /* ActivitySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCDEA02B41E3CFBF3C4F834B67D9C8B1 /* ActivitySheet.swift */; }; + 221E6E8B9F1CF89B139F1D7D1735A7D0 /* Biometrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 4426932FB43D12FD3B25C45B0D3DB5E3 /* Biometrics.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 25A6BB1522B3BDC4454DBA9EF8453015 /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572A3CD5F0DE989B1696DCEDF774676E /* Then.swift */; }; + 26E893A3DFD1E0F22CEF0D67ACA330EB /* Slider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF232CBC0BB1AA412ED181CA70971C93 /* Slider.swift */; }; 27CB0A5EB157C02C3FDFCC594331324E /* ShowTime-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 69152FFA4489AC24B45BCE5208B3B41A /* ShowTime-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2B247D46ADB72B94A03A0692F9371692 /* Slider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8A44FD7A43078E47015085C7ECBCD3 /* Slider.swift */; }; - 2E9EAD4A7F3B3392B572ED690DCABC20 /* DatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22E3B09F25859704FF547774837360F /* DatePicker.swift */; }; - 2F6C3202D54D6620EC5BF96782955D5A /* SystemPreferencesContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2F0B07615633500EA51A42DA7490BC2 /* SystemPreferencesContext.swift */; }; - 2F7918BEF8541A66867040B87BD3C527 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B7C80EA631CE3D4F91D5A0ACE3C07DD /* TextField.swift */; }; - 30A3E04F64979C6D3D1CE35E32E3211A /* Screen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4C02A966CF1BC688A54BF0B112D0A9 /* Screen.swift */; }; - 34DEA23FC760111AC8D6ED0ACD1657AB /* Safari.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEEDF5103B9F8405649E4D01A6F91F6 /* Safari.swift */; }; + 28A60B4F8F938C00338847F8B1E603FE /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948AF33A978CC268F1320B0402AFF101 /* TabBar.swift */; }; + 2AF8FCAF18389CD3F57B6FBE7116C773 /* When.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9782C9ACC640EFC0E9B3C883F8D00D69 /* When.swift */; }; + 2BA7894BCF3EF54F0A70FCD936A11E94 /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6722333D3F5D59F34131D31D1D1FE676 /* Element.swift */; }; + 2C161F124CED23888E0E4216479CA126 /* Scrollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04EF71556DC643FB444C9FD8A2D2273B /* Scrollable.swift */; }; + 2E268691E9DB58B1480521F5DA485F6D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; + 3119966FB6F159933D2133A2187A9AA0 /* Springboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD3EB838D87679B91E046CA0F6674B73 /* Springboard.swift */; }; + 3160F0FA460C86C549927823A13EFB06 /* Scenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F698463C0D1F23C6A08AA0370CACC2C /* Scenario.swift */; }; + 3658750D2FB97E6E2938ED9B5737B3A9 /* XCUIDevice+frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6E8DB302D57F50C5B2FAC9D4278B4EA /* XCUIDevice+frame.swift */; }; 3C892CB7517172243FF2DA110515208C /* ShowTime-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F094F44DD0301CC76E1365673D3FCF9C /* ShowTime-dummy.m */; }; - 42A829C16312CA165D00DACC0ADEC0EA /* Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E214E6576455D02201D7B55F31A4133F /* Keyboard.swift */; }; - 434755ECAB25587245B6D59856CAF2AE /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092EC4D876C695B96674917011FCC5FA /* WebView.swift */; }; - 447DB66D7F291D402E2F204F75E4448A /* SystemPreferencesResetScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90408CD3B2C81444801D688492D9460E /* SystemPreferencesResetScreen.swift */; }; - 46775302AF7999648B09D9ED3EE48C74 /* Refreshable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2044C4793465B9C0C768D78DA10A7679 /* Refreshable.swift */; }; - 4AF4160DAFDFE90B91E767F11D53C676 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = E072805065CBE35D26F3B040D2B421CF /* Image.swift */; }; - 4CF8C1EB590C78B81CCAF8907F83B665 /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2B4A426013298D3CA6A5F02BCF6816A /* Sheet.swift */; }; - 511D6D75092453FCA862CD556E4A3292 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - 607E4FE677496D6D5046DD9B998F44DD /* Biometrics-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = 153AD2F265BBC65A6F302110A59B6EE2 /* Biometrics-Bridging-Header.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6355B326EDD3C569A10F9CD737ABDD37 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 499A0952B5A4C30C064B2490AA26968C /* Label.swift */; }; - 660673CF4BD18AF55C3081895930F715 /* SegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6303D83C1AD37A8EBD76AC289A8B879 /* SegmentedControl.swift */; }; - 6643C096FB4A1113F2FAC7B3A2FFEE37 /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F5D26D3157B797157282240E8EAB587 /* TabBar.swift */; }; - 6E5998C704D81C5561D9F3A0AE87E3F4 /* SecureTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DDF7E00678659F81ED27C85A2021C4A /* SecureTextField.swift */; }; - 700688692E1A02B5BD67FF220AEE4647 /* ValueRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC46B20374B589B005A9908C70225CDF /* ValueRepresentable.swift */; }; - 728FE99FD0CE9401CFA2752F4B3A56EE /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = A92FD9CDEED38DB956AF467A2FDF2E50 /* Attributes.swift */; }; + 400C878BB853BA340BE7FD1E3A481FD4 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608B1CF229A9CA80D894BDF978BDE92E /* Switch.swift */; }; + 454D0D551339A4CA30290742AB4F250B /* CGVector+Offset.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A4630312862B2311E0A09F613CCE9C /* CGVector+Offset.swift */; }; + 4B4774C895517CD336E380ACBCD70436 /* Given.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1D88BC36BB7E74970503C2B4D4E445 /* Given.swift */; }; + 4C7355396E8080F4A3530993D59BDAB5 /* Safari.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345673EC98326958FDD832E970FBC0D5 /* Safari.swift */; }; + 548A49289E50CD23CB54221FFCFE5588 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51B80733D2F02DAC42E2CE0CAC135978 /* App.swift */; }; + 55E7A8DCE73E6FD0B40C3E8F40E83A04 /* Screen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E814D75ED12AC6A3033B80BD5B76CA9B /* Screen.swift */; }; + 63BC4DF41D5551FBFC856D94A9D70A09 /* And.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1060AAEBB6B876925470F0051EF10CE5 /* And.swift */; }; + 663913458AA3C18DB93BDE7BE67BE7C2 /* CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E067CAFBFC1166DFBB2271399EC2CFD /* CollectionView.swift */; }; + 669E062C3F2DEBC7EB29919240C53163 /* Refreshable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF456B5F34BD317666B460FD66B3EACE /* Refreshable.swift */; }; + 6823235A229142892436403BB3B69DAD /* XCUIElement+hasKeyboardFocus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142A5D14FCDDB44F1359E507ADC023E4 /* XCUIElement+hasKeyboardFocus.swift */; }; + 6A672915E5FA84B423A6AF955E36575A /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1725A9931E08FEB9586AAE872DCD810 /* TextView.swift */; }; + 6D9D36D49B55D8CE03B7D06588648409 /* Adjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ABB96D352A83B9EBC717088FEB22046 /* Adjustable.swift */; }; + 6F2C42402666F28495C08EBE5052E70A /* XCUIElement+wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74143AF02ECD026417803851FBC88264 /* XCUIElement+wait.swift */; }; 72D00E3EC4AC546C8ED0616A85ACA0F3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; + 74D0D2FFE04E8F157114F4A66DB38D54 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 480A21749332DE8E5EA766E94E3DF705 /* Cell.swift */; }; 74E2F7EA36D277B32C6F922F069AD086 /* Pods-TABTestKit_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FEFF9CD73B2D6723ED60BBDD46577CD /* Pods-TABTestKit_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 77E53D47B396A553F04FD9770B92EFDE /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E1F208D3BC3FE76031A1E12102E345 /* App.swift */; }; - 7E1ABD14D61D063FBBD27FC841E05A59 /* Array+Safe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760EC83C92512F8EBC55188AC82EEF94 /* Array+Safe.swift */; }; + 7C1E963711893F216562DAE8E2B871BC /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F29FD0CF98ED9351CA4E1F517837FD7A /* Attributes.swift */; }; 7E7556B81F678C3A6E6580D9039C676A /* Pods-TABTestKit_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 28061D8B4A5060F09E692D4BC586713B /* Pods-TABTestKit_Example-dummy.m */; }; - 7FFF240E73592A018E7EF51D34C46822 /* ScrollableScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BF325AC84FB7CC481DFADB84F36E2E /* ScrollableScreen.swift */; }; - 864EF0C73ED7C41B254B7DDA8755FB93 /* CellContaining.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1194970946CD5BB5114B6422390CF7 /* CellContaining.swift */; }; - 8760E5691C6B92CAAC17935225A01921 /* StepAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF96D9F53868097BAFDE27415EF8ED46 /* StepAction.swift */; }; + 8420D91F60519B1D06D806B058277386 /* BiometricsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1157F417976B95B88578E86BABD1D402 /* BiometricsContext.swift */; }; + 891DD55E25FDDE927D847E418424AE95 /* DatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4DAB7171AB13E8D58EC9C015631FC17 /* DatePicker.swift */; }; 8927BD966BA8175BBCD4A4C1E98EC03C /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C6AFBB671D10E6AEF0786D8E3E16BDE4 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A39120AAB3F245151C6EC45731384E8 /* XCUIDevice+frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88F91005C0CA7E7AB203F33B8DDF0BDA /* XCUIDevice+frame.swift */; }; - 8B2F8F080ECC1DE1DB954E16F23F0FBE /* Stepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1C097DE9EF042095E371FF0D20AA4B /* Stepper.swift */; }; - 8C7FE2BCC4F430E5425E85E25BA62A70 /* BaseApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2916459F4C61003896E56CF7908EEC77 /* BaseApp.swift */; }; - 8F20672129F9D3960CD2C81807143AA6 /* ScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1E8D8FAF1D803A9233EF39DA854BB82 /* ScrollView.swift */; }; - 941194E6C860FAA1FA7F87D8B1CE7ED0 /* Scrollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C29536084B2800DEE14820D0BE9E084 /* Scrollable.swift */; }; - 9E751CCA8B991AD984B5F2DB579EFEF9 /* XCUIElement+wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1848ED8032296034A5B64A0616D8A8E /* XCUIElement+wait.swift */; }; - A103AA3DDCC0C574830CCD6754CC4FB7 /* XCUIElement+isVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 976E5B1537BAD0007743ADFE257F3ED9 /* XCUIElement+isVisible.swift */; }; - A29A51BD9D9C4DE0FC4ADBF9B866D437 /* KeyboardContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D94A0FB25BE70C26B804A9A2603B49BA /* KeyboardContext.swift */; }; - A4B195BEC072B3D3D043AC9043325480 /* TABTestKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2230FEC425952A5BA46EC7FDD23058D1 /* TABTestKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A70409F4523267C2454E0CC80FFBB3FC /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDBFD83FEF615ADC0D94D503B355C4F /* Button.swift */; }; - A7E465D6DAB265AFAB4B375CF7C50591 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */; }; - A8C378399954F4B3FF9A059EFDC6E0CA /* Tappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E09319DABE4D8C5448854E80E3853ED /* Tappable.swift */; }; - A9FA41F25B8BC1FD497E26444897E649 /* Editable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E46CB78D2D032E4EAC290B6E830C3C96 /* Editable.swift */; }; - ABF987C8B05650B7F587B98CF8D49040 /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0DC2299BB313B3066A280DEC1E5CDB0 /* Icon.swift */; }; - AD68A7303B63A43663767D46878A6449 /* NavigationContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE1404009DDB760BE1E31CCC5950EF46 /* NavigationContext.swift */; }; - B04E97D1F83E7D0C2C06311A3C941CDB /* CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE8CCF054B911545AED8388FFB343F82 /* CollectionView.swift */; }; - B16D01DE1E4487F2B39335D599CBFF0A /* PageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 473AA326F87C4822D3DEF5DCCF966EE8 /* PageIndicator.swift */; }; - B4E611CBED96EAE1973130134CFAF1F8 /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 715A80E3D9A38499E143D0074A2A6314 /* Element.swift */; }; - B5042D490C77BDC6BBF549D2197C7434 /* TABTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2026D34CB7674FFED1BE47D406D9B597 /* TABTestCase.swift */; }; - B505C57F9951DF732BE85B3F79A45082 /* Element+defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025EF15BCB08745BD9C4C4B4AB26450D /* Element+defaults.swift */; }; - BA01284A4D51779CE18C4B4B1072E600 /* Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4E90763630537295317F66AA307F8D6 /* Header.swift */; }; + 8A9BEED3DA74ACEB982ADA965099660A /* Dismissable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A4E2FD9EA293CEA0430ECEF163A494D /* Dismissable.swift */; }; + 8AAE755BC4847DFE8679B48DF2613DC3 /* Tappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954F7DC72FBBE48914CB5651386710A8 /* Tappable.swift */; }; + 8E9C42DADA943F3230EE19C7FFA6B62B /* InteractionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65ED5E70523A93CB6BBE413726DAAACA /* InteractionContext.swift */; }; + 9F8E588302093F36FA01BDACDD590D21 /* Biometrics.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F90C9131D671249054E927E4DDFA458 /* Biometrics.m */; }; + A140807034B1A3CEF1A2CAEEF34D784A /* SystemPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4732CB370809DB01C84C92F67E78EBF3 /* SystemPreferences.swift */; }; + A2273435F8F15115147FE2936A31B0BD /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 149CAC8C0AE1DBCAC92257002D333344 /* View.swift */; }; + A3531B58C2E3980C723BECD1A3755B03 /* StepAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ED8581DAD6ED00A41AE1E536EEAD58B /* StepAction.swift */; }; + A516E615CBF16674CF73A4E540DBFE92 /* SecureTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0E305787E9DB1C4D9481DC5BD801F34 /* SecureTextField.swift */; }; + A720B0DF02AB34732D0109C5125475FE /* NavigationContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44637C436760778449FA5C2D990AD02 /* NavigationContext.swift */; }; + A9BF4ABCDA227FEBF05866D8774E17F7 /* Biometrics-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = B06054F30FE3F234917DE45221C2E54F /* Biometrics-Bridging-Header.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD88B61462FF92A6ADC617A858778920 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01F16C16CB3E54AB9894D0EBBC49827 /* TextField.swift */; }; + AEDF236E3B3CBB57FFB71AD4F6A8AFFC /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8476933083A60F51BA859B1D618C353C /* Step.swift */; }; + AFF67E5D0FAC2324B4C8E67D07DBCE6E /* TABTestKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AB6E7B255089A991E8E03C689B549DF /* TABTestKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B899CFEA104025B4615C327B9176E0B5 /* NormalizedCoordinate+Locations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65C5769C6582D788F3CF9ED2066A33E3 /* NormalizedCoordinate+Locations.swift */; }; + BA056AE31E8A6D512AC11861D1B92B7F /* Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B0491A64EEB163590B1DFA92FB3428 /* Keyboard.swift */; }; BA42C86F6872AC87ADF7110F65920109 /* ShowTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */; }; - BA8CF7D98500DADAD801E5914AB1A8F4 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC36AF763EBBF2DF4B36283B4C75793 /* Switch.swift */; }; - BB36BBFC917C379101B97E49B7C8C6A2 /* Biometrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 615131A83CD77EDBDDA573C8A53FDCB9 /* Biometrics.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BB9D41F5E8A093EBC9EDE2DFBF5EF784 /* NavBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D53904E3AE615F5E554DEF60414590 /* NavBar.swift */; }; - BDD923D69FE552C4696A7BD85516FE67 /* CGVector+Offset.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF84DFAA86AB4BDBA6D94F5A66C3984D /* CGVector+Offset.swift */; }; BF6743BA40FE71C7005AEDC847FA3C1D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - C8329B375D10AE87331E532409BB51C6 /* ActivitySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 184A29E3CD8F8FF08FAED47BE68CB72F /* ActivitySheet.swift */; }; - C9B1B4B9ADB19D402DC91F9810176A0A /* Biometrics.m in Sources */ = {isa = PBXBuildFile; fileRef = D986710E90E0E2B27659F1C5931FF615 /* Biometrics.m */; }; - CCDFD3C2EDCC10DE9FDE0397CF868A28 /* SystemPreferencesGeneralScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD7A28A7D202E4E61D15C6A1FB046451 /* SystemPreferencesGeneralScreen.swift */; }; - CEF0F61CEA6A291ECE769EEE0EE67CE2 /* AlertContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF2C9E6830DB96BBF7BD5C41F5B1C84 /* AlertContext.swift */; }; - D58CD66F5B82023A328B46FC39D2C44B /* Scenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D9864B94D0C97C982DACCDD8B382B1E /* Scenario.swift */; }; - D9C87601EDBA2030486ECA748E65693F /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = A78E3481BE402A4FDF449CAC1F905879 /* Alert.swift */; }; - E017FF0578E7F7F6958DBBC66FD4091B /* XCTFatalFail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FDA9F7A425746A960A32C149C5455EC /* XCTFatalFail.swift */; }; - E273C321857663376A2DD140D4128DF2 /* AppContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFA6157708C12EB751341B7814EBCDE8 /* AppContext.swift */; }; - EB84A3CBE94963C26AD0D70463996617 /* Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AAD3CF2833BFDFB728F571AA636BAEA /* Table.swift */; }; - EC20F678A51FFAD90B3D3D1F76C58719 /* NormalizedCoordinate+Locations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297B44527731C02E0B19295DB523568F /* NormalizedCoordinate+Locations.swift */; }; - EC38D41C9E6F9C66D1A6184EDFB74184 /* Springboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D2E06167D45FF1CD5C3C7579BEF0CCC /* Springboard.swift */; }; - EC47F602CD37E5EC24DE51E7875BA16A /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8ADED80001DED8F960B8A08F3F1026D /* Step.swift */; }; - EE2DE74B688C2BA2BCA8D8D56B3CDE42 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 281BE70296D811DC0C196F1952BE0179 /* View.swift */; }; - F4BF8B887488C4B0900D5C36A2B48886 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85AFC7AC121EDD585A794CBEF219ED8 /* TextView.swift */; }; - F7A4CDA05AB92DA971CDBBDEDF78F974 /* SheetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 656317B1689F8389F8D8A13FB0281F7E /* SheetContext.swift */; }; - F809D6C225554A4900CF86E9 /* XCUIApplicationState+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */; }; - F8AA657F255931AC00E99FF4 /* String+HumanReadableString.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA657E255931AC00E99FF4 /* String+HumanReadableString.swift */; }; - F8AA6681255950F300E99FF4 /* XCTestCase+Screenshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA6680255950F300E99FF4 /* XCTestCase+Screenshot.swift */; }; - F8AA668B2559541E00E99FF4 /* Given.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA668A2559541E00E99FF4 /* Given.swift */; }; - F8AA66912559543800E99FF4 /* When.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA66902559543800E99FF4 /* When.swift */; }; - F8AA66972559543F00E99FF4 /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA66962559543F00E99FF4 /* Then.swift */; }; - F8AA669D2559544400E99FF4 /* And.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AA669C2559544400E99FF4 /* And.swift */; }; - F8C8632658B840BA4531A5F8EEA2521E /* systemPreferencesRootScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A6C582E6031CB7A125F0800F45055D /* systemPreferencesRootScreen.swift */; }; - FA5FE4421DD144891167A9BBA2FC9DA5 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D829733A2418052EC220B9F4AC655D5 /* Cell.swift */; }; + C2988975AD302D5FF6488D250CBBB0F2 /* Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = D61CC0670E136F04F89113DD91D6DC40 /* Header.swift */; }; + C486ABB6EB046EC5B2B182ECC9B53377 /* Element+defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6E82BB36605AB8908E94034E0293735 /* Element+defaults.swift */; }; + CB7655F133E06F8C594315502B925A3F /* ScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB63B941375587707DC8120D0A9134BE /* ScrollView.swift */; }; + CF74AD555C2757FBCFD1337D31359BD4 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = F90F79197248FD23EC55A47A83DC7A25 /* Image.swift */; }; + D1CE514D723F1893A5F0D053EEACD0EC /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E5CC0B49220F51093ED600491DAAE7F /* Icon.swift */; }; + D4B4436A4C1DE13329D2BC018F130789 /* SystemPreferencesContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89E7E60D72EC0BF0C6581CC1E18ABFA /* SystemPreferencesContext.swift */; }; + DD6C499E277141B25C2204BE0E8606B8 /* NavBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = E426802ACFF354E34870B280D61C7581 /* NavBar.swift */; }; + DDD4D66E76DAB619C8AA40EA09E387E6 /* AlertContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4455139B69052F6E3B8AA44CFB1E3465 /* AlertContext.swift */; }; + DF694D1140E3C47529532EA7F4E6973A /* CellContaining.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4F9D70E051F67A08946A52D1764859 /* CellContaining.swift */; }; + E04F1DDE23CABCDB73F7E6CD585AD14E /* SegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AB8063DF88FBB359AC5393D7A3E50FF /* SegmentedControl.swift */; }; + E0B42CF1477C3EF4C3F5E84252CA44FC /* XCUIElement+isVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9408FECD535679A486704E71C95C40E /* XCUIElement+isVisible.swift */; }; + E1BBCC2558B99876E705C79EF528C25F /* Editable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AC84AE251E8EFACBA975B2FDAF2809 /* Editable.swift */; }; + E259FA3EB3BA2DEBCFDCD12E940A7777 /* XCUIApplicationState+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE841B85565D4AD0ABA4859EE72F277 /* XCUIApplicationState+String.swift */; }; + E42C90139F7D37C13690F81AB2BAED29 /* SheetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1109E2825435A7F93916269AF224F7E9 /* SheetContext.swift */; }; + E7A207E53E8987DB3DE8A4375EABEC52 /* TABTestKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 16CEE68DCE8D52E323C43627EF5E6E00 /* TABTestKit-dummy.m */; }; + E833729A73AC0BF6A38918EBCB6C0422 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D990AD8F8506816337D3D1C152E974E2 /* WebView.swift */; }; + E8BD5261CF14414715FEA9AFFC3907F6 /* SystemPreferencesResetScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A158B37AFCFE2FC2766ADE400A427C31 /* SystemPreferencesResetScreen.swift */; }; + EA74B561CF68CE12A544F44E8CB78F1A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */; }; + EC5A7C4C42700F9F905362B0556E72DD /* Picker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6C0203464458D138C176CC5DA6DF0EA /* Picker.swift */; }; + ED4440EF16FF71F9973E7B8460AF1CDA /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025917F2EDD3691B3F3C9D8A18E848C1 /* Sheet.swift */; }; + F0FAC3BD38D83EDAB71246342EB204F0 /* Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACDAF0CB25831A21FC773D6FE3823EFD /* Table.swift */; }; + F100E7312A5E11F33DB9340EE9828AA4 /* AppContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1CFD0BE1EA4E03A360F521506F95C77 /* AppContext.swift */; }; + F42B697127DBAFCBA46E352C9F92B569 /* systemPreferencesRootScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C56C15410FDD6C55973202E7BD51AB1 /* systemPreferencesRootScreen.swift */; }; + F65900390EE335BD4760630FE869306A /* KeyboardContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = C335DE8DB3A5121E14AEAA3DD404D8E2 /* KeyboardContext.swift */; }; + F69B96B50FE9B18430A9105FDC86A5AA /* TABTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7CB9979922414135C2E9A8B7CEBC97 /* TABTestCase.swift */; }; FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - FEE6DD6A8EDEDF4078C41A22CEE26DE7 /* Picker.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4ED3C029720CC0633629F1A9A14FC9 /* Picker.swift */; }; - FFB682562D658DE0039CA1B643E5B987 /* SystemPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17E5A6B3BBA55868A7DDA07A8771ACA /* SystemPreferences.swift */; }; + FD1DB014E906D82A36EDC3EA5F4939FC /* XCTFatalFail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074592D395E1B324B941268A4BDFE494 /* XCTFatalFail.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 754B214DB1E883537932FD5B5ED94709 /* PBXContainerItemProxy */ = { + 13AAF55A02BCEBB06015B6A2309264A3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; remoteInfo = ShowTime; }; - 902C0ED431E559D207A6E8DBB73303A3 /* PBXContainerItemProxy */ = { + D472450F21315A8F71EF32C3F3A7C706 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; remoteInfo = ShowTime; }; - CB3F99CE3F0D729A59560288C1918820 /* PBXContainerItemProxy */ = { + EFE9C2A8BD7912D5A43F3ED1A52F157E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; @@ -127,128 +127,128 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 025EF15BCB08745BD9C4C4B4AB26450D /* Element+defaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Element+defaults.swift"; sourceTree = ""; }; - 092EC4D876C695B96674917011FCC5FA /* WebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; - 0D9864B94D0C97C982DACCDD8B382B1E /* Scenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scenario.swift; sourceTree = ""; }; - 0FDA9F7A425746A960A32C149C5455EC /* XCTFatalFail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = XCTFatalFail.swift; sourceTree = ""; }; + 025917F2EDD3691B3F3C9D8A18E848C1 /* Sheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Sheet.swift; sourceTree = ""; }; + 04EF71556DC643FB444C9FD8A2D2273B /* Scrollable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scrollable.swift; sourceTree = ""; }; + 074592D395E1B324B941268A4BDFE494 /* XCTFatalFail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = XCTFatalFail.swift; sourceTree = ""; }; + 0BAE1DB9682A76CE1F7D25EDF50954B4 /* Alert.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = ""; }; + 1060AAEBB6B876925470F0051EF10CE5 /* And.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = And.swift; sourceTree = ""; }; + 1109E2825435A7F93916269AF224F7E9 /* SheetContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SheetContext.swift; sourceTree = ""; }; + 1157F417976B95B88578E86BABD1D402 /* BiometricsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BiometricsContext.swift; sourceTree = ""; }; 14146CA31421B9CAE5A93C48F6E9FFAF /* Pods-TABTestKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example.debug.xcconfig"; sourceTree = ""; }; - 149ED91D61E38D4ADE77ECD1C3CDCA8B /* Dismissable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Dismissable.swift; sourceTree = ""; }; - 153AD2F265BBC65A6F302110A59B6EE2 /* Biometrics-Bridging-Header.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Biometrics-Bridging-Header.h"; sourceTree = ""; }; - 1794163B004EA69BCBE099E34F056F90 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + 142A5D14FCDDB44F1359E507ADC023E4 /* XCUIElement+hasKeyboardFocus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+hasKeyboardFocus.swift"; sourceTree = ""; }; + 149CAC8C0AE1DBCAC92257002D333344 /* View.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; + 1625121B576A2F260FF03FA15D2F2915 /* TABTestKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TABTestKit.modulemap; sourceTree = ""; }; + 16CEE68DCE8D52E323C43627EF5E6E00 /* TABTestKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TABTestKit-dummy.m"; sourceTree = ""; }; + 16FF8D7D264C777C17EC8E3826E41FC0 /* SystemPreferencesGeneralScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesGeneralScreen.swift; sourceTree = ""; }; 17AE207B2FD67E1096C542744391C322 /* Pods-TABTestKit_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-acknowledgements.plist"; sourceTree = ""; }; - 184A29E3CD8F8FF08FAED47BE68CB72F /* ActivitySheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ActivitySheet.swift; sourceTree = ""; }; + 1C956BC753D42DFFEAB22C6711757FDE /* String+HumanReadableString.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "String+HumanReadableString.swift"; sourceTree = ""; }; 1CB830EB632DA8DED42D4E33C4E59DD9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh"; sourceTree = ""; }; - 1E4C02A966CF1BC688A54BF0B112D0A9 /* Screen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = ""; }; - 1FF2C9E6830DB96BBF7BD5C41F5B1C84 /* AlertContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AlertContext.swift; sourceTree = ""; }; - 2026D34CB7674FFED1BE47D406D9B597 /* TABTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TABTestCase.swift; path = TABTestKit/Classes/TABTestCase.swift; sourceTree = ""; }; - 2044C4793465B9C0C768D78DA10A7679 /* Refreshable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Refreshable.swift; sourceTree = ""; }; - 2230FEC425952A5BA46EC7FDD23058D1 /* TABTestKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-umbrella.h"; sourceTree = ""; }; - 22D53904E3AE615F5E554DEF60414590 /* NavBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavBar.swift; sourceTree = ""; }; - 246C5312AD287517A78640A4FAF48421 /* ShowTime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ShowTime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1DCACD99A57DD7326886398073E8D0F0 /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Completable.swift; sourceTree = ""; }; + 1F698463C0D1F23C6A08AA0370CACC2C /* Scenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scenario.swift; sourceTree = ""; }; + 246C5312AD287517A78640A4FAF48421 /* ShowTime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ShowTime.framework; path = ShowTime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28061D8B4A5060F09E692D4BC586713B /* Pods-TABTestKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TABTestKit_Example-dummy.m"; sourceTree = ""; }; - 281BE70296D811DC0C196F1952BE0179 /* View.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; - 2916459F4C61003896E56CF7908EEC77 /* BaseApp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseApp.swift; sourceTree = ""; }; - 297B44527731C02E0B19295DB523568F /* NormalizedCoordinate+Locations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NormalizedCoordinate+Locations.swift"; sourceTree = ""; }; - 2D2E06167D45FF1CD5C3C7579BEF0CCC /* Springboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Springboard.swift; sourceTree = ""; }; - 2E8A44FD7A43078E47015085C7ECBCD3 /* Slider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Slider.swift; sourceTree = ""; }; - 2E97F8EAABEDB0295C8BBA3ADB4A81C2 /* Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 37A07B83AE28D9690E0C0D9EB1D6B8EA /* InteractionContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionContext.swift; sourceTree = ""; }; - 3A1194970946CD5BB5114B6422390CF7 /* CellContaining.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CellContaining.swift; sourceTree = ""; }; - 3F5D26D3157B797157282240E8EAB587 /* TabBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; }; - 473AA326F87C4822D3DEF5DCCF966EE8 /* PageIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PageIndicator.swift; sourceTree = ""; }; - 476A6223DF0F58F25425C2F46B6EEC2C /* TABTestKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.debug.xcconfig; sourceTree = ""; }; - 499A0952B5A4C30C064B2490AA26968C /* Label.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; - 516836C45DBE97859AF1DD3AC2CD4B01 /* Pods_TABTestKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TABTestKit_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 28B6F8382724C10ED00299DBAEA904E9 /* XCTestCase+Screenshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Screenshot.swift"; sourceTree = ""; }; + 29DD4BF40C3210946B255EA0753A2C50 /* TABTestKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.release.xcconfig; sourceTree = ""; }; + 2A1977697003E1D2D4081EBD3C88A058 /* Label.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; + 2AB8063DF88FBB359AC5393D7A3E50FF /* SegmentedControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; + 2C56C15410FDD6C55973202E7BD51AB1 /* systemPreferencesRootScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = systemPreferencesRootScreen.swift; sourceTree = ""; }; + 2E97F8EAABEDB0295C8BBA3ADB4A81C2 /* Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2F3F765734217A16E21E8B1C09B7FE80 /* Array+Safe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Array+Safe.swift"; sourceTree = ""; }; + 345673EC98326958FDD832E970FBC0D5 /* Safari.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Safari.swift; sourceTree = ""; }; + 398CBC48FD3DC75735CF21DC994303C1 /* PageIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PageIndicator.swift; sourceTree = ""; }; + 4426932FB43D12FD3B25C45B0D3DB5E3 /* Biometrics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Biometrics.h; sourceTree = ""; }; + 4455139B69052F6E3B8AA44CFB1E3465 /* AlertContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AlertContext.swift; sourceTree = ""; }; + 4732CB370809DB01C84C92F67E78EBF3 /* SystemPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferences.swift; sourceTree = ""; }; + 480A21749332DE8E5EA766E94E3DF705 /* Cell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = ""; }; + 4CE841B85565D4AD0ABA4859EE72F277 /* XCUIApplicationState+String.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIApplicationState+String.swift"; sourceTree = ""; }; + 516836C45DBE97859AF1DD3AC2CD4B01 /* Pods_TABTestKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TABTestKit_Example.framework; path = "Pods-TABTestKit_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 51B80733D2F02DAC42E2CE0CAC135978 /* App.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; 549B858328CB2EF8360076242052506E /* Pods-TABTestKit_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TABTestKit_Example.modulemap"; sourceTree = ""; }; - 57A6C582E6031CB7A125F0800F45055D /* systemPreferencesRootScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = systemPreferencesRootScreen.swift; sourceTree = ""; }; - 58E1F208D3BC3FE76031A1E12102E345 /* App.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; - 5A57D682A4852F19188AA9E4B0FEDED5 /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Completable.swift; sourceTree = ""; }; - 5B81AB3802539BA40C55F66E8195FD5C /* TABTestKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TABTestKit-dummy.m"; sourceTree = ""; }; - 5C817F0E0208382B131E5FFB430F8A17 /* TABTestKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TABTestKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5D829733A2418052EC220B9F4AC655D5 /* Cell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = ""; }; + 572A3CD5F0DE989B1696DCEDF774676E /* Then.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = ""; }; + 574CE0D3F84DEB81697CA498206D4AAD /* Stepper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Stepper.swift; sourceTree = ""; }; + 57B0491A64EEB163590B1DFA92FB3428 /* Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Keyboard.swift; sourceTree = ""; }; + 5ABB96D352A83B9EBC717088FEB22046 /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; + 5C817F0E0208382B131E5FFB430F8A17 /* TABTestKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TABTestKit.framework; path = TABTestKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 615131A83CD77EDBDDA573C8A53FDCB9 /* Biometrics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Biometrics.h; sourceTree = ""; }; - 656317B1689F8389F8D8A13FB0281F7E /* SheetContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SheetContext.swift; sourceTree = ""; }; + 608B1CF229A9CA80D894BDF978BDE92E /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = ""; }; + 65C5769C6582D788F3CF9ED2066A33E3 /* NormalizedCoordinate+Locations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NormalizedCoordinate+Locations.swift"; sourceTree = ""; }; + 65ED5E70523A93CB6BBE413726DAAACA /* InteractionContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionContext.swift; sourceTree = ""; }; + 6722333D3F5D59F34131D31D1D1FE676 /* Element.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Element.swift; sourceTree = ""; }; 69152FFA4489AC24B45BCE5208B3B41A /* ShowTime-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ShowTime-umbrella.h"; sourceTree = ""; }; 6E79134F82F3A8D58969B44D7F169338 /* Pods-TABTestKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TABTestKit_Example-acknowledgements.markdown"; sourceTree = ""; }; - 715A80E3D9A38499E143D0074A2A6314 /* Element.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Element.swift; sourceTree = ""; }; - 75BF325AC84FB7CC481DFADB84F36E2E /* ScrollableScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollableScreen.swift; sourceTree = ""; }; - 760EC83C92512F8EBC55188AC82EEF94 /* Array+Safe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Array+Safe.swift"; sourceTree = ""; }; - 8591E75230F75ECEE5BEC23D21898581 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 868ADACA5883EB6D8424E49AA839A438 /* TABTestKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = TABTestKit.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 88F91005C0CA7E7AB203F33B8DDF0BDA /* XCUIDevice+frame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIDevice+frame.swift"; sourceTree = ""; }; - 8B7C80EA631CE3D4F91D5A0ACE3C07DD /* TextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; - 8C29536084B2800DEE14820D0BE9E084 /* Scrollable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scrollable.swift; sourceTree = ""; }; - 8DDF7E00678659F81ED27C85A2021C4A /* SecureTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SecureTextField.swift; sourceTree = ""; }; - 90408CD3B2C81444801D688492D9460E /* SystemPreferencesResetScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesResetScreen.swift; sourceTree = ""; }; + 70A6CCC96873C0AA1B670BC851D8A52D /* TABTestKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = TABTestKit.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 73619FBD640A527E63538013823ED97D /* BaseApp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseApp.swift; sourceTree = ""; }; + 74143AF02ECD026417803851FBC88264 /* XCUIElement+wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+wait.swift"; sourceTree = ""; }; + 7A4E2FD9EA293CEA0430ECEF163A494D /* Dismissable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Dismissable.swift; sourceTree = ""; }; + 7AB6E7B255089A991E8E03C689B549DF /* TABTestKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-umbrella.h"; sourceTree = ""; }; + 7E5CC0B49220F51093ED600491DAAE7F /* Icon.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; + 7F90C9131D671249054E927E4DDFA458 /* Biometrics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Biometrics.m; sourceTree = ""; }; + 83AC84AE251E8EFACBA975B2FDAF2809 /* Editable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Editable.swift; sourceTree = ""; }; + 8476933083A60F51BA859B1D618C353C /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Step.swift; sourceTree = ""; }; + 8E067CAFBFC1166DFBB2271399EC2CFD /* CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionView.swift; sourceTree = ""; }; 91B1EB1FAB79CE231C85712DE4D31CC0 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.plist"; sourceTree = ""; }; + 93519F3E6A3BA42F4B758A4E518470B7 /* TABTestKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-prefix.pch"; sourceTree = ""; }; + 948AF33A978CC268F1320B0402AFF101 /* TabBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; }; + 953A3688CF885118CDDF66A466CC614B /* Button.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; + 954F7DC72FBBE48914CB5651386710A8 /* Tappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Tappable.swift; sourceTree = ""; }; 965A292F186CF36A47FF8AB1CADE1B85 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig"; sourceTree = ""; }; - 976E5B1537BAD0007743ADFE257F3ED9 /* XCUIElement+isVisible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+isVisible.swift"; sourceTree = ""; }; + 9782C9ACC640EFC0E9B3C883F8D00D69 /* When.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = When.swift; sourceTree = ""; }; 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m"; sourceTree = ""; }; - 9AAD3CF2833BFDFB728F571AA636BAEA /* Table.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Table.swift; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9E09319DABE4D8C5448854E80E3853ED /* Tappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Tappable.swift; sourceTree = ""; }; - 9EDBFD83FEF615ADC0D94D503B355C4F /* Button.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; - 9EEEDF5103B9F8405649E4D01A6F91F6 /* Safari.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Safari.swift; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9ED8581DAD6ED00A41AE1E536EEAD58B /* StepAction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StepAction.swift; sourceTree = ""; }; 9FEFF9CD73B2D6723ED60BBDD46577CD /* Pods-TABTestKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TABTestKit_Example-umbrella.h"; sourceTree = ""; }; + A0E305787E9DB1C4D9481DC5BD801F34 /* SecureTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SecureTextField.swift; sourceTree = ""; }; + A158B37AFCFE2FC2766ADE400A427C31 /* SystemPreferencesResetScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesResetScreen.swift; sourceTree = ""; }; A3F9B3AEE6873539F9B3FD0F64E7DB43 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.markdown"; sourceTree = ""; }; - A78E3481BE402A4FDF449CAC1F905879 /* Alert.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = ""; }; - A92FD9CDEED38DB956AF467A2FDF2E50 /* Attributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Attributes.swift; sourceTree = ""; }; + A89E7E60D72EC0BF0C6581CC1E18ABFA /* SystemPreferencesContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesContext.swift; sourceTree = ""; }; AA47AB426A72CF612E6CDF50B0E91C8F /* ShowTime.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ShowTime.debug.xcconfig; sourceTree = ""; }; AA9FC38AC03409CABA3E4DD246E3CF1C /* ShowTime-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ShowTime-prefix.pch"; sourceTree = ""; }; - AABB82F79590AA2D0458F8674BFCB4FD /* XCUIElement+hasKeyboardFocus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+hasKeyboardFocus.swift"; sourceTree = ""; }; AB4E151C064820753E3685012C75D924 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist"; sourceTree = ""; }; + ACDAF0CB25831A21FC773D6FE3823EFD /* Table.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Table.swift; sourceTree = ""; }; + AD7CB9979922414135C2E9A8B7CEBC97 /* TABTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TABTestCase.swift; path = TABTestKit/Classes/TABTestCase.swift; sourceTree = ""; }; ADB4763ABC911105EE431BA516439FE1 /* ShowTime.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ShowTime.modulemap; sourceTree = ""; }; - AE1C097DE9EF042095E371FF0D20AA4B /* Stepper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Stepper.swift; sourceTree = ""; }; + AE4F9D70E051F67A08946A52D1764859 /* CellContaining.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CellContaining.swift; sourceTree = ""; }; AFD57256DAD4C8414BD38FD34982C7B0 /* Pods-TABTestKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example.release.xcconfig"; sourceTree = ""; }; - B17E5A6B3BBA55868A7DDA07A8771ACA /* SystemPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferences.swift; sourceTree = ""; }; - B1E8D8FAF1D803A9233EF39DA854BB82 /* ScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollView.swift; sourceTree = ""; }; - B85AFC7AC121EDD585A794CBEF219ED8 /* TextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; - B8ADED80001DED8F960B8A08F3F1026D /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Step.swift; sourceTree = ""; }; - BE8CCF054B911545AED8388FFB343F82 /* CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionView.swift; sourceTree = ""; }; - BF84DFAA86AB4BDBA6D94F5A66C3984D /* CGVector+Offset.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGVector+Offset.swift"; sourceTree = ""; }; - C2B4A426013298D3CA6A5F02BCF6816A /* Sheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Sheet.swift; sourceTree = ""; }; + B06054F30FE3F234917DE45221C2E54F /* Biometrics-Bridging-Header.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Biometrics-Bridging-Header.h"; sourceTree = ""; }; + B3019D829E33FE2E46E5E7929D3EC25E /* TABTestKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.debug.xcconfig; sourceTree = ""; }; + BB1D88BC36BB7E74970503C2B4D4E445 /* Given.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Given.swift; sourceTree = ""; }; + C0788D6F9F3512AE4BDA244B4DCDF26E /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; + C2468B3A27C658D13CF927D2A4C8AD02 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + C335DE8DB3A5121E14AEAA3DD404D8E2 /* KeyboardContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardContext.swift; sourceTree = ""; }; C354231844F21D916AF8E0D9E0F587FF /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap"; sourceTree = ""; }; + C4DAB7171AB13E8D58EC9C015631FC17 /* DatePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DatePicker.swift; sourceTree = ""; }; C6AFBB671D10E6AEF0786D8E3E16BDE4 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h"; sourceTree = ""; }; CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - CAC36AF763EBBF2DF4B36283B4C75793 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = ""; }; + CAE5BB42BB2BF6E722362118945E72AC /* TABTestKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TABTestKit-Info.plist"; sourceTree = ""; }; CBA3199C63C53E992A3F26F5ADCBB639 /* Pods-TABTestKit_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-Info.plist"; sourceTree = ""; }; - CD7A28A7D202E4E61D15C6A1FB046451 /* SystemPreferencesGeneralScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesGeneralScreen.swift; sourceTree = ""; }; - D22E3B09F25859704FF547774837360F /* DatePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DatePicker.swift; sourceTree = ""; }; - D390EE6C19BFD5F1C1C797DDE47E11AE /* TABTestKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.release.xcconfig; sourceTree = ""; }; - D65FF7511026254AD42DCA65B096E729 /* TABTestKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TABTestKit.modulemap; sourceTree = ""; }; - D94A0FB25BE70C26B804A9A2603B49BA /* KeyboardContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardContext.swift; sourceTree = ""; }; - D986710E90E0E2B27659F1C5931FF615 /* Biometrics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Biometrics.m; sourceTree = ""; }; + D01F16C16CB3E54AB9894D0EBBC49827 /* TextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; + D1725A9931E08FEB9586AAE872DCD810 /* TextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; + D1CFD0BE1EA4E03A360F521506F95C77 /* AppContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppContext.swift; sourceTree = ""; }; + D44637C436760778449FA5C2D990AD02 /* NavigationContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavigationContext.swift; sourceTree = ""; }; + D5A4630312862B2311E0A09F613CCE9C /* CGVector+Offset.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGVector+Offset.swift"; sourceTree = ""; }; + D61CC0670E136F04F89113DD91D6DC40 /* Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Header.swift; sourceTree = ""; }; + D6C0203464458D138C176CC5DA6DF0EA /* Picker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Picker.swift; sourceTree = ""; }; + D990AD8F8506816337D3D1C152E974E2 /* WebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; + DCDEA02B41E3CFBF3C4F834B67D9C8B1 /* ActivitySheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ActivitySheet.swift; sourceTree = ""; }; DF441583F13AEDF6DF852C5354F264E1 /* ShowTime-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ShowTime-Info.plist"; sourceTree = ""; }; - E072805065CBE35D26F3B040D2B421CF /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; - E0DC2299BB313B3066A280DEC1E5CDB0 /* Icon.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; - E1848ED8032296034A5B64A0616D8A8E /* XCUIElement+wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+wait.swift"; sourceTree = ""; }; - E214E6576455D02201D7B55F31A4133F /* Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Keyboard.swift; sourceTree = ""; }; - E46CB78D2D032E4EAC290B6E830C3C96 /* Editable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Editable.swift; sourceTree = ""; }; - E4E90763630537295317F66AA307F8D6 /* Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Header.swift; sourceTree = ""; }; - E6303D83C1AD37A8EBD76AC289A8B879 /* SegmentedControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; - E74E8DD8489CD119E2996B2D7AA50966 /* BiometricsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BiometricsContext.swift; sourceTree = ""; }; + E426802ACFF354E34870B280D61C7581 /* NavBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavBar.swift; sourceTree = ""; }; + E5D6DC8DEB8AFE62ED3A44D51A6198C0 /* ScrollableScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollableScreen.swift; sourceTree = ""; }; + E814D75ED12AC6A3033B80BD5B76CA9B /* Screen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = ""; }; + E9408FECD535679A486704E71C95C40E /* XCUIElement+isVisible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+isVisible.swift"; sourceTree = ""; }; EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShowTime.swift; path = Sources/ShowTime/ShowTime.swift; sourceTree = ""; }; + EB63B941375587707DC8120D0A9134BE /* ScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollView.swift; sourceTree = ""; }; EC7677F7A126781D8591BE7C185D48F7 /* Pods-TABTestKit_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TABTestKit_Example-frameworks.sh"; sourceTree = ""; }; - EE1404009DDB760BE1E31CCC5950EF46 /* NavigationContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavigationContext.swift; sourceTree = ""; }; - EF96D9F53868097BAFDE27415EF8ED46 /* StepAction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StepAction.swift; sourceTree = ""; }; + EF232CBC0BB1AA412ED181CA70971C93 /* Slider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Slider.swift; sourceTree = ""; }; F094F44DD0301CC76E1365673D3FCF9C /* ShowTime-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ShowTime-dummy.m"; sourceTree = ""; }; - F09670B2248CA33BD5A05396463DC7DB /* TABTestKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-prefix.pch"; sourceTree = ""; }; - F2F0B07615633500EA51A42DA7490BC2 /* SystemPreferencesContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesContext.swift; sourceTree = ""; }; - F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCUIApplicationState+String.swift"; sourceTree = ""; }; - F8AA657E255931AC00E99FF4 /* String+HumanReadableString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+HumanReadableString.swift"; sourceTree = ""; }; - F8AA6680255950F300E99FF4 /* XCTestCase+Screenshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Screenshot.swift"; sourceTree = ""; }; - F8AA668A2559541E00E99FF4 /* Given.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Given.swift; sourceTree = ""; }; - F8AA66902559543800E99FF4 /* When.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = When.swift; sourceTree = ""; }; - F8AA66962559543F00E99FF4 /* Then.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = ""; }; - F8AA669C2559544400E99FF4 /* And.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = And.swift; sourceTree = ""; }; - FA7DCD7F1B963A9EEA6DA99154E69718 /* TABTestKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TABTestKit-Info.plist"; sourceTree = ""; }; - FC125873B3EFEB103E5E93686ACCEA70 /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; - FC46B20374B589B005A9908C70225CDF /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; - FC4ED3C029720CC0633629F1A9A14FC9 /* Picker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Picker.swift; sourceTree = ""; }; + F29FD0CF98ED9351CA4E1F517837FD7A /* Attributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Attributes.swift; sourceTree = ""; }; + F3B14016D4E1EE6F917A37F9A571B4B1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + F6E82BB36605AB8908E94034E0293735 /* Element+defaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Element+defaults.swift"; sourceTree = ""; }; + F6E8DB302D57F50C5B2FAC9D4278B4EA /* XCUIDevice+frame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIDevice+frame.swift"; sourceTree = ""; }; + F90F79197248FD23EC55A47A83DC7A25 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; FD03AA75DD58014781A38E023C12CD42 /* ShowTime.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ShowTime.release.xcconfig; sourceTree = ""; }; + FD3EB838D87679B91E046CA0F6674B73 /* Springboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Springboard.swift; sourceTree = ""; }; FDC54A8EC562A73143E238094E80179D /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig"; sourceTree = ""; }; - FFA6157708C12EB751341B7814EBCDE8 /* AppContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppContext.swift; sourceTree = ""; }; + FF456B5F34BD317666B460FD66B3EACE /* Refreshable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Refreshable.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -260,20 +260,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 418205BA8D2153848D70D92D706B76AE /* Frameworks */ = { + 434AAE768A8C9EA8DFD951F6ABAC9D5C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 511D6D75092453FCA862CD556E4A3292 /* Foundation.framework in Frameworks */, - A7E465D6DAB265AFAB4B375CF7C50591 /* XCTest.framework in Frameworks */, + FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 434AAE768A8C9EA8DFD951F6ABAC9D5C /* Frameworks */ = { + 4F9595A3114B75645FD89BDB2DA0ED56 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */, + 2E268691E9DB58B1480521F5DA485F6D /* Foundation.framework in Frameworks */, + EA74B561CF68CE12A544F44E8CB78F1A /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -288,44 +288,16 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0E00B61EFA8FBAB508DCA33045014C1A /* Protocols */ = { - isa = PBXGroup; - children = ( - FC125873B3EFEB103E5E93686ACCEA70 /* Adjustable.swift */, - 3A1194970946CD5BB5114B6422390CF7 /* CellContaining.swift */, - 5A57D682A4852F19188AA9E4B0FEDED5 /* Completable.swift */, - 149ED91D61E38D4ADE77ECD1C3CDCA8B /* Dismissable.swift */, - E46CB78D2D032E4EAC290B6E830C3C96 /* Editable.swift */, - 715A80E3D9A38499E143D0074A2A6314 /* Element.swift */, - 2044C4793465B9C0C768D78DA10A7679 /* Refreshable.swift */, - 1E4C02A966CF1BC688A54BF0B112D0A9 /* Screen.swift */, - 8C29536084B2800DEE14820D0BE9E084 /* Scrollable.swift */, - 75BF325AC84FB7CC481DFADB84F36E2E /* ScrollableScreen.swift */, - 9E09319DABE4D8C5448854E80E3853ED /* Tappable.swift */, - FC46B20374B589B005A9908C70225CDF /* ValueRepresentable.swift */, - ); - name = Protocols; - path = TABTestKit/Classes/Protocols; - sourceTree = ""; - }; 0EAD851B593C7D383A5B9F66278D5202 /* ShowTime */ = { isa = PBXGroup; children = ( EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */, 3AD53452E6F9B27B718A63F5668EEEAC /* Support Files */, ); + name = ShowTime; path = ShowTime; sourceTree = ""; }; - 0ECFFA0BD8E5ECB95E73668449F4FBDC /* include */ = { - isa = PBXGroup; - children = ( - 615131A83CD77EDBDDA573C8A53FDCB9 /* Biometrics.h */, - 153AD2F265BBC65A6F302110A59B6EE2 /* Biometrics-Bridging-Header.h */, - ); - path = include; - sourceTree = ""; - }; 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -337,17 +309,22 @@ 18BB3C90BDF1A5F1D336E77B09EBB1F2 /* Development Pods */ = { isa = PBXGroup; children = ( - 85D70514B77813E55820C48EC648606D /* TABTestKit */, + F0D12E64DC9ED4EE71E47A0286809539 /* TABTestKit */, ); name = "Development Pods"; sourceTree = ""; }; - 1E164B4E2336CFE66C555DC88213C038 /* Action */ = { + 197CAB34DE6E8DF49260A75273320BBE /* Apps */ = { isa = PBXGroup; children = ( - EF96D9F53868097BAFDE27415EF8ED46 /* StepAction.swift */, + 51B80733D2F02DAC42E2CE0CAC135978 /* App.swift */, + 73619FBD640A527E63538013823ED97D /* BaseApp.swift */, + 345673EC98326958FDD832E970FBC0D5 /* Safari.swift */, + FD3EB838D87679B91E046CA0F6674B73 /* Springboard.swift */, + 4732CB370809DB01C84C92F67E78EBF3 /* SystemPreferences.swift */, ); - path = Action; + name = Apps; + path = TABTestKit/Classes/Apps; sourceTree = ""; }; 2C065241B34ABECCB0CE7068DB612DD4 /* Products */ = { @@ -378,15 +355,18 @@ path = "Target Support Files/Pods-TABTestKit_Example"; sourceTree = ""; }; - 30CA81CE1C53280781D2B068A2179357 /* Screens */ = { + 3017907910E919139755598F963083B2 /* BDD */ = { isa = PBXGroup; children = ( - CD7A28A7D202E4E61D15C6A1FB046451 /* SystemPreferencesGeneralScreen.swift */, - 90408CD3B2C81444801D688492D9460E /* SystemPreferencesResetScreen.swift */, - 57A6C582E6031CB7A125F0800F45055D /* systemPreferencesRootScreen.swift */, + 1060AAEBB6B876925470F0051EF10CE5 /* And.swift */, + BB1D88BC36BB7E74970503C2B4D4E445 /* Given.swift */, + 1F698463C0D1F23C6A08AA0370CACC2C /* Scenario.swift */, + 8476933083A60F51BA859B1D618C353C /* Step.swift */, + 572A3CD5F0DE989B1696DCEDF774676E /* Then.swift */, + 9782C9ACC640EFC0E9B3C883F8D00D69 /* When.swift */, ); - name = Screens; - path = TABTestKit/Classes/Screens; + name = BDD; + path = TABTestKit/Classes/BDD; sourceTree = ""; }; 3AD53452E6F9B27B718A63F5668EEEAC /* Support Files */ = { @@ -404,78 +384,62 @@ path = "../Target Support Files/ShowTime"; sourceTree = ""; }; - 7F9009F1182E3BDED6F366005188C8B5 /* Pods */ = { + 420093D9ACA8FFDEE7BE734AD8A668CA /* Extensions */ = { isa = PBXGroup; children = ( - 0EAD851B593C7D383A5B9F66278D5202 /* ShowTime */, + 2F3F765734217A16E21E8B1C09B7FE80 /* Array+Safe.swift */, + D5A4630312862B2311E0A09F613CCE9C /* CGVector+Offset.swift */, + F6E82BB36605AB8908E94034E0293735 /* Element+defaults.swift */, + 65C5769C6582D788F3CF9ED2066A33E3 /* NormalizedCoordinate+Locations.swift */, + 1C956BC753D42DFFEAB22C6711757FDE /* String+HumanReadableString.swift */, + 28B6F8382724C10ED00299DBAEA904E9 /* XCTestCase+Screenshot.swift */, + 074592D395E1B324B941268A4BDFE494 /* XCTFatalFail.swift */, + 4CE841B85565D4AD0ABA4859EE72F277 /* XCUIApplicationState+String.swift */, + F6E8DB302D57F50C5B2FAC9D4278B4EA /* XCUIDevice+frame.swift */, + 142A5D14FCDDB44F1359E507ADC023E4 /* XCUIElement+hasKeyboardFocus.swift */, + E9408FECD535679A486704E71C95C40E /* XCUIElement+isVisible.swift */, + 74143AF02ECD026417803851FBC88264 /* XCUIElement+wait.swift */, ); - name = Pods; - sourceTree = ""; - }; - 85D70514B77813E55820C48EC648606D /* TABTestKit */ = { - isa = PBXGroup; - children = ( - 2026D34CB7674FFED1BE47D406D9B597 /* TABTestCase.swift */, - AC73F36C03ABEB18ECABEEB56DEA6C5F /* Apps */, - A170EF323166D08D6104EA4094F0A3E5 /* BDD */, - 920C5A1774C7C2BB227427854E3DF244 /* Biometrics */, - 94B451ED218596EA473804773EEE1E23 /* Contexts */, - D667C66B65FD5FE39D30414BDF4D5655 /* Elements */, - 8832E4BEF8AE3F567354ECB423550F9A /* Extensions */, - F163C1772F5C6E3EB1BC6C339AF46D83 /* Pod */, - 0E00B61EFA8FBAB508DCA33045014C1A /* Protocols */, - 30CA81CE1C53280781D2B068A2179357 /* Screens */, - C8186AD6D4F57687B3FF5A4DAF11B83F /* Support Files */, - ); - name = TABTestKit; - path = ../..; + name = Extensions; + path = TABTestKit/Classes/Extensions; sourceTree = ""; }; - 8832E4BEF8AE3F567354ECB423550F9A /* Extensions */ = { + 79C96A6B763094E03ACC52E63989705E /* Pod */ = { isa = PBXGroup; children = ( - 760EC83C92512F8EBC55188AC82EEF94 /* Array+Safe.swift */, - BF84DFAA86AB4BDBA6D94F5A66C3984D /* CGVector+Offset.swift */, - 025EF15BCB08745BD9C4C4B4AB26450D /* Element+defaults.swift */, - 297B44527731C02E0B19295DB523568F /* NormalizedCoordinate+Locations.swift */, - 0FDA9F7A425746A960A32C149C5455EC /* XCTFatalFail.swift */, - 88F91005C0CA7E7AB203F33B8DDF0BDA /* XCUIDevice+frame.swift */, - AABB82F79590AA2D0458F8674BFCB4FD /* XCUIElement+hasKeyboardFocus.swift */, - 976E5B1537BAD0007743ADFE257F3ED9 /* XCUIElement+isVisible.swift */, - E1848ED8032296034A5B64A0616D8A8E /* XCUIElement+wait.swift */, - F809D6C125554A4900CF86E9 /* XCUIApplicationState+String.swift */, - F8AA657E255931AC00E99FF4 /* String+HumanReadableString.swift */, - F8AA6680255950F300E99FF4 /* XCTestCase+Screenshot.swift */, + C2468B3A27C658D13CF927D2A4C8AD02 /* LICENSE */, + F3B14016D4E1EE6F917A37F9A571B4B1 /* README.md */, + 70A6CCC96873C0AA1B670BC851D8A52D /* TABTestKit.podspec */, ); - name = Extensions; - path = TABTestKit/Classes/Extensions; + name = Pod; sourceTree = ""; }; - 920C5A1774C7C2BB227427854E3DF244 /* Biometrics */ = { + 7D6290DA3805378A45F75B754AE5C27A /* Protocols */ = { isa = PBXGroup; children = ( - D986710E90E0E2B27659F1C5931FF615 /* Biometrics.m */, - 0ECFFA0BD8E5ECB95E73668449F4FBDC /* include */, + 5ABB96D352A83B9EBC717088FEB22046 /* Adjustable.swift */, + AE4F9D70E051F67A08946A52D1764859 /* CellContaining.swift */, + 1DCACD99A57DD7326886398073E8D0F0 /* Completable.swift */, + 7A4E2FD9EA293CEA0430ECEF163A494D /* Dismissable.swift */, + 83AC84AE251E8EFACBA975B2FDAF2809 /* Editable.swift */, + 6722333D3F5D59F34131D31D1D1FE676 /* Element.swift */, + FF456B5F34BD317666B460FD66B3EACE /* Refreshable.swift */, + E814D75ED12AC6A3033B80BD5B76CA9B /* Screen.swift */, + 04EF71556DC643FB444C9FD8A2D2273B /* Scrollable.swift */, + E5D6DC8DEB8AFE62ED3A44D51A6198C0 /* ScrollableScreen.swift */, + 954F7DC72FBBE48914CB5651386710A8 /* Tappable.swift */, + C0788D6F9F3512AE4BDA244B4DCDF26E /* ValueRepresentable.swift */, ); - name = Biometrics; - path = TABTestKit/Classes/Biometrics; + name = Protocols; + path = TABTestKit/Classes/Protocols; sourceTree = ""; }; - 94B451ED218596EA473804773EEE1E23 /* Contexts */ = { + 7F9009F1182E3BDED6F366005188C8B5 /* Pods */ = { isa = PBXGroup; children = ( - 1FF2C9E6830DB96BBF7BD5C41F5B1C84 /* AlertContext.swift */, - FFA6157708C12EB751341B7814EBCDE8 /* AppContext.swift */, - E74E8DD8489CD119E2996B2D7AA50966 /* BiometricsContext.swift */, - 37A07B83AE28D9690E0C0D9EB1D6B8EA /* InteractionContext.swift */, - D94A0FB25BE70C26B804A9A2603B49BA /* KeyboardContext.swift */, - EE1404009DDB760BE1E31CCC5950EF46 /* NavigationContext.swift */, - 656317B1689F8389F8D8A13FB0281F7E /* SheetContext.swift */, - F2F0B07615633500EA51A42DA7490BC2 /* SystemPreferencesContext.swift */, - 1E164B4E2336CFE66C555DC88213C038 /* Action */, + 0EAD851B593C7D383A5B9F66278D5202 /* ShowTime */, ); - name = Contexts; - path = TABTestKit/Classes/Contexts; + name = Pods; sourceTree = ""; }; 974814B39C0012DECD183BBB91B32103 /* iOS */ = { @@ -487,31 +451,57 @@ name = iOS; sourceTree = ""; }; - A170EF323166D08D6104EA4094F0A3E5 /* BDD */ = { + AB2C2DE4B3E4940BA585720CBECFA311 /* Elements */ = { isa = PBXGroup; children = ( - 0D9864B94D0C97C982DACCDD8B382B1E /* Scenario.swift */, - B8ADED80001DED8F960B8A08F3F1026D /* Step.swift */, - F8AA668A2559541E00E99FF4 /* Given.swift */, - F8AA66902559543800E99FF4 /* When.swift */, - F8AA66962559543F00E99FF4 /* Then.swift */, - F8AA669C2559544400E99FF4 /* And.swift */, + DCDEA02B41E3CFBF3C4F834B67D9C8B1 /* ActivitySheet.swift */, + 0BAE1DB9682A76CE1F7D25EDF50954B4 /* Alert.swift */, + F29FD0CF98ED9351CA4E1F517837FD7A /* Attributes.swift */, + 953A3688CF885118CDDF66A466CC614B /* Button.swift */, + 480A21749332DE8E5EA766E94E3DF705 /* Cell.swift */, + 8E067CAFBFC1166DFBB2271399EC2CFD /* CollectionView.swift */, + C4DAB7171AB13E8D58EC9C015631FC17 /* DatePicker.swift */, + D61CC0670E136F04F89113DD91D6DC40 /* Header.swift */, + 7E5CC0B49220F51093ED600491DAAE7F /* Icon.swift */, + F90F79197248FD23EC55A47A83DC7A25 /* Image.swift */, + 57B0491A64EEB163590B1DFA92FB3428 /* Keyboard.swift */, + 2A1977697003E1D2D4081EBD3C88A058 /* Label.swift */, + E426802ACFF354E34870B280D61C7581 /* NavBar.swift */, + 398CBC48FD3DC75735CF21DC994303C1 /* PageIndicator.swift */, + D6C0203464458D138C176CC5DA6DF0EA /* Picker.swift */, + EB63B941375587707DC8120D0A9134BE /* ScrollView.swift */, + A0E305787E9DB1C4D9481DC5BD801F34 /* SecureTextField.swift */, + 2AB8063DF88FBB359AC5393D7A3E50FF /* SegmentedControl.swift */, + 025917F2EDD3691B3F3C9D8A18E848C1 /* Sheet.swift */, + EF232CBC0BB1AA412ED181CA70971C93 /* Slider.swift */, + 574CE0D3F84DEB81697CA498206D4AAD /* Stepper.swift */, + 608B1CF229A9CA80D894BDF978BDE92E /* Switch.swift */, + 948AF33A978CC268F1320B0402AFF101 /* TabBar.swift */, + ACDAF0CB25831A21FC773D6FE3823EFD /* Table.swift */, + D01F16C16CB3E54AB9894D0EBBC49827 /* TextField.swift */, + D1725A9931E08FEB9586AAE872DCD810 /* TextView.swift */, + 149CAC8C0AE1DBCAC92257002D333344 /* View.swift */, + D990AD8F8506816337D3D1C152E974E2 /* WebView.swift */, ); - name = BDD; - path = TABTestKit/Classes/BDD; + name = Elements; + path = TABTestKit/Classes/Elements; sourceTree = ""; }; - AC73F36C03ABEB18ECABEEB56DEA6C5F /* Apps */ = { + AEAE73BC79500A571690DECAEFC8A418 /* Contexts */ = { isa = PBXGroup; children = ( - 58E1F208D3BC3FE76031A1E12102E345 /* App.swift */, - 2916459F4C61003896E56CF7908EEC77 /* BaseApp.swift */, - 9EEEDF5103B9F8405649E4D01A6F91F6 /* Safari.swift */, - 2D2E06167D45FF1CD5C3C7579BEF0CCC /* Springboard.swift */, - B17E5A6B3BBA55868A7DDA07A8771ACA /* SystemPreferences.swift */, + 4455139B69052F6E3B8AA44CFB1E3465 /* AlertContext.swift */, + D1CFD0BE1EA4E03A360F521506F95C77 /* AppContext.swift */, + 1157F417976B95B88578E86BABD1D402 /* BiometricsContext.swift */, + 65ED5E70523A93CB6BBE413726DAAACA /* InteractionContext.swift */, + C335DE8DB3A5121E14AEAA3DD404D8E2 /* KeyboardContext.swift */, + D44637C436760778449FA5C2D990AD02 /* NavigationContext.swift */, + 1109E2825435A7F93916269AF224F7E9 /* SheetContext.swift */, + A89E7E60D72EC0BF0C6581CC1E18ABFA /* SystemPreferencesContext.swift */, + EF63F0AB3D126E8F7650F9D277024049 /* Action */, ); - name = Apps; - path = TABTestKit/Classes/Apps; + name = Contexts; + path = TABTestKit/Classes/Contexts; sourceTree = ""; }; BF4BFAF140349307273B1343616A213B /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests */ = { @@ -531,21 +521,6 @@ path = "Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; sourceTree = ""; }; - C8186AD6D4F57687B3FF5A4DAF11B83F /* Support Files */ = { - isa = PBXGroup; - children = ( - D65FF7511026254AD42DCA65B096E729 /* TABTestKit.modulemap */, - 5B81AB3802539BA40C55F66E8195FD5C /* TABTestKit-dummy.m */, - FA7DCD7F1B963A9EEA6DA99154E69718 /* TABTestKit-Info.plist */, - F09670B2248CA33BD5A05396463DC7DB /* TABTestKit-prefix.pch */, - 2230FEC425952A5BA46EC7FDD23058D1 /* TABTestKit-umbrella.h */, - 476A6223DF0F58F25425C2F46B6EEC2C /* TABTestKit.debug.xcconfig */, - D390EE6C19BFD5F1C1C797DDE47E11AE /* TABTestKit.release.xcconfig */, - ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/TABTestKit"; - sourceTree = ""; - }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( @@ -558,50 +533,68 @@ ); sourceTree = ""; }; - D667C66B65FD5FE39D30414BDF4D5655 /* Elements */ = { + D83F39FE2D5E3C95D8638CC5FB81723D /* Screens */ = { isa = PBXGroup; children = ( - 184A29E3CD8F8FF08FAED47BE68CB72F /* ActivitySheet.swift */, - A78E3481BE402A4FDF449CAC1F905879 /* Alert.swift */, - A92FD9CDEED38DB956AF467A2FDF2E50 /* Attributes.swift */, - 9EDBFD83FEF615ADC0D94D503B355C4F /* Button.swift */, - 5D829733A2418052EC220B9F4AC655D5 /* Cell.swift */, - BE8CCF054B911545AED8388FFB343F82 /* CollectionView.swift */, - D22E3B09F25859704FF547774837360F /* DatePicker.swift */, - E4E90763630537295317F66AA307F8D6 /* Header.swift */, - E0DC2299BB313B3066A280DEC1E5CDB0 /* Icon.swift */, - E072805065CBE35D26F3B040D2B421CF /* Image.swift */, - E214E6576455D02201D7B55F31A4133F /* Keyboard.swift */, - 499A0952B5A4C30C064B2490AA26968C /* Label.swift */, - 22D53904E3AE615F5E554DEF60414590 /* NavBar.swift */, - 473AA326F87C4822D3DEF5DCCF966EE8 /* PageIndicator.swift */, - FC4ED3C029720CC0633629F1A9A14FC9 /* Picker.swift */, - B1E8D8FAF1D803A9233EF39DA854BB82 /* ScrollView.swift */, - 8DDF7E00678659F81ED27C85A2021C4A /* SecureTextField.swift */, - E6303D83C1AD37A8EBD76AC289A8B879 /* SegmentedControl.swift */, - C2B4A426013298D3CA6A5F02BCF6816A /* Sheet.swift */, - 2E8A44FD7A43078E47015085C7ECBCD3 /* Slider.swift */, - AE1C097DE9EF042095E371FF0D20AA4B /* Stepper.swift */, - CAC36AF763EBBF2DF4B36283B4C75793 /* Switch.swift */, - 3F5D26D3157B797157282240E8EAB587 /* TabBar.swift */, - 9AAD3CF2833BFDFB728F571AA636BAEA /* Table.swift */, - 8B7C80EA631CE3D4F91D5A0ACE3C07DD /* TextField.swift */, - B85AFC7AC121EDD585A794CBEF219ED8 /* TextView.swift */, - 281BE70296D811DC0C196F1952BE0179 /* View.swift */, - 092EC4D876C695B96674917011FCC5FA /* WebView.swift */, + 16FF8D7D264C777C17EC8E3826E41FC0 /* SystemPreferencesGeneralScreen.swift */, + A158B37AFCFE2FC2766ADE400A427C31 /* SystemPreferencesResetScreen.swift */, + 2C56C15410FDD6C55973202E7BD51AB1 /* systemPreferencesRootScreen.swift */, ); - name = Elements; - path = TABTestKit/Classes/Elements; + name = Screens; + path = TABTestKit/Classes/Screens; sourceTree = ""; }; - F163C1772F5C6E3EB1BC6C339AF46D83 /* Pod */ = { + E72E53D5CEB57A1AC1E19F575171CD45 /* Support Files */ = { isa = PBXGroup; children = ( - 1794163B004EA69BCBE099E34F056F90 /* LICENSE */, - 8591E75230F75ECEE5BEC23D21898581 /* README.md */, - 868ADACA5883EB6D8424E49AA839A438 /* TABTestKit.podspec */, + 1625121B576A2F260FF03FA15D2F2915 /* TABTestKit.modulemap */, + 16CEE68DCE8D52E323C43627EF5E6E00 /* TABTestKit-dummy.m */, + CAE5BB42BB2BF6E722362118945E72AC /* TABTestKit-Info.plist */, + 93519F3E6A3BA42F4B758A4E518470B7 /* TABTestKit-prefix.pch */, + 7AB6E7B255089A991E8E03C689B549DF /* TABTestKit-umbrella.h */, + B3019D829E33FE2E46E5E7929D3EC25E /* TABTestKit.debug.xcconfig */, + 29DD4BF40C3210946B255EA0753A2C50 /* TABTestKit.release.xcconfig */, ); - name = Pod; + name = "Support Files"; + path = "Example/Pods/Target Support Files/TABTestKit"; + sourceTree = ""; + }; + EF63F0AB3D126E8F7650F9D277024049 /* Action */ = { + isa = PBXGroup; + children = ( + 9ED8581DAD6ED00A41AE1E536EEAD58B /* StepAction.swift */, + ); + name = Action; + path = Action; + sourceTree = ""; + }; + F0D12E64DC9ED4EE71E47A0286809539 /* TABTestKit */ = { + isa = PBXGroup; + children = ( + AD7CB9979922414135C2E9A8B7CEBC97 /* TABTestCase.swift */, + 197CAB34DE6E8DF49260A75273320BBE /* Apps */, + 3017907910E919139755598F963083B2 /* BDD */, + F9864E8815A306C53E9C03A1E94E317C /* Biometrics */, + AEAE73BC79500A571690DECAEFC8A418 /* Contexts */, + AB2C2DE4B3E4940BA585720CBECFA311 /* Elements */, + 420093D9ACA8FFDEE7BE734AD8A668CA /* Extensions */, + 79C96A6B763094E03ACC52E63989705E /* Pod */, + 7D6290DA3805378A45F75B754AE5C27A /* Protocols */, + D83F39FE2D5E3C95D8638CC5FB81723D /* Screens */, + E72E53D5CEB57A1AC1E19F575171CD45 /* Support Files */, + ); + name = TABTestKit; + path = ../..; + sourceTree = ""; + }; + F20A8F7964ADAEF4BABA5668C0D8CE80 /* include */ = { + isa = PBXGroup; + children = ( + 4426932FB43D12FD3B25C45B0D3DB5E3 /* Biometrics.h */, + B06054F30FE3F234917DE45221C2E54F /* Biometrics-Bridging-Header.h */, + ); + name = include; + path = include; sourceTree = ""; }; F7FD97F3CC6F18F4AAAE10E5DE0D2076 /* Targets Support Files */ = { @@ -613,6 +606,16 @@ name = "Targets Support Files"; sourceTree = ""; }; + F9864E8815A306C53E9C03A1E94E317C /* Biometrics */ = { + isa = PBXGroup; + children = ( + 7F90C9131D671249054E927E4DDFA458 /* Biometrics.m */, + F20A8F7964ADAEF4BABA5668C0D8CE80 /* include */, + ); + name = Biometrics; + path = TABTestKit/Classes/Biometrics; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -624,29 +627,29 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A42B7353448BA3A32CB7E6407B908E88 /* Headers */ = { + 7BB2632F625D641EEBE9197E2AD1CB75 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 74E2F7EA36D277B32C6F922F069AD086 /* Pods-TABTestKit_Example-umbrella.h in Headers */, + A9BF4ABCDA227FEBF05866D8774E17F7 /* Biometrics-Bridging-Header.h in Headers */, + 221E6E8B9F1CF89B139F1D7D1735A7D0 /* Biometrics.h in Headers */, + AFF67E5D0FAC2324B4C8E67D07DBCE6E /* TABTestKit-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - CCCD40A3CF98074BF1895442469F632F /* Headers */ = { + A42B7353448BA3A32CB7E6407B908E88 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 27CB0A5EB157C02C3FDFCC594331324E /* ShowTime-umbrella.h in Headers */, + 74E2F7EA36D277B32C6F922F069AD086 /* Pods-TABTestKit_Example-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - D356A50F312242BCA3664228963A3A48 /* Headers */ = { + CCCD40A3CF98074BF1895442469F632F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 607E4FE677496D6D5046DD9B998F44DD /* Biometrics-Bridging-Header.h in Headers */, - BB36BBFC917C379101B97E49B7C8C6A2 /* Biometrics.h in Headers */, - A4B195BEC072B3D3D043AC9043325480 /* TABTestKit-umbrella.h in Headers */, + 27CB0A5EB157C02C3FDFCC594331324E /* ShowTime-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -665,8 +668,8 @@ buildRules = ( ); dependencies = ( - EA47B01DB270D1A566E7ECA62E92083E /* PBXTargetDependency */, - 495B0C8160E87358E035F1F9A14ADDE5 /* PBXTargetDependency */, + C13441B545CB63D4F314043EBF65EAE4 /* PBXTargetDependency */, + DD63C705109AD2B54BB4EF1B0DC9FC9E /* PBXTargetDependency */, ); name = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; productName = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; @@ -685,7 +688,7 @@ buildRules = ( ); dependencies = ( - 05D629619F9F1F155F63B187B430CDD3 /* PBXTargetDependency */, + 8FD43C89AE4A8AA4FEA63FD10641528E /* PBXTargetDependency */, ); name = "Pods-TABTestKit_Example"; productName = "Pods-TABTestKit_Example"; @@ -712,12 +715,12 @@ }; 9C4F771642E79689CC6A0648ABEA808C /* TABTestKit */ = { isa = PBXNativeTarget; - buildConfigurationList = 69E5949F88046C827AC56987D8B59AA2 /* Build configuration list for PBXNativeTarget "TABTestKit" */; + buildConfigurationList = 985DDBCB21CD4421AD0C5A8034578044 /* Build configuration list for PBXNativeTarget "TABTestKit" */; buildPhases = ( - D356A50F312242BCA3664228963A3A48 /* Headers */, - 3E062CB356E7277E2EE56872DBCE18B8 /* Sources */, - 418205BA8D2153848D70D92D706B76AE /* Frameworks */, - 7492929DE215F3C71C8EFA0E05E51C92 /* Resources */, + 7BB2632F625D641EEBE9197E2AD1CB75 /* Headers */, + DAEE1357CA2409902C9202B807D5EB7C /* Sources */, + 4F9595A3114B75645FD89BDB2DA0ED56 /* Frameworks */, + 46796FE3552579A8261F1C459A257073 /* Resources */, ); buildRules = ( ); @@ -766,7 +769,7 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 7492929DE215F3C71C8EFA0E05E51C92 /* Resources */ = { + 46796FE3552579A8261F1C459A257073 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -798,135 +801,135 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3E062CB356E7277E2EE56872DBCE18B8 /* Sources */ = { + 9D50542E455CC3979D6826F7F6B472DE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C8329B375D10AE87331E532409BB51C6 /* ActivitySheet.swift in Sources */, - 204619BA88B79A0A38CE757859A37EC8 /* Adjustable.swift in Sources */, - D9C87601EDBA2030486ECA748E65693F /* Alert.swift in Sources */, - CEF0F61CEA6A291ECE769EEE0EE67CE2 /* AlertContext.swift in Sources */, - 77E53D47B396A553F04FD9770B92EFDE /* App.swift in Sources */, - E273C321857663376A2DD140D4128DF2 /* AppContext.swift in Sources */, - 7E1ABD14D61D063FBBD27FC841E05A59 /* Array+Safe.swift in Sources */, - 728FE99FD0CE9401CFA2752F4B3A56EE /* Attributes.swift in Sources */, - 8C7FE2BCC4F430E5425E85E25BA62A70 /* BaseApp.swift in Sources */, - C9B1B4B9ADB19D402DC91F9810176A0A /* Biometrics.m in Sources */, - 24434A6AD8C5B0B6F299F883C087D75F /* BiometricsContext.swift in Sources */, - A70409F4523267C2454E0CC80FFBB3FC /* Button.swift in Sources */, - FA5FE4421DD144891167A9BBA2FC9DA5 /* Cell.swift in Sources */, - 864EF0C73ED7C41B254B7DDA8755FB93 /* CellContaining.swift in Sources */, - BDD923D69FE552C4696A7BD85516FE67 /* CGVector+Offset.swift in Sources */, - B04E97D1F83E7D0C2C06311A3C941CDB /* CollectionView.swift in Sources */, - 1F38EFDFA992989D1F842F283343D571 /* Completable.swift in Sources */, - F8AA668B2559541E00E99FF4 /* Given.swift in Sources */, - 2E9EAD4A7F3B3392B572ED690DCABC20 /* DatePicker.swift in Sources */, - 0526DE7ECA45A28FA1B5AEF4C07049E4 /* Dismissable.swift in Sources */, - A9FA41F25B8BC1FD497E26444897E649 /* Editable.swift in Sources */, - B505C57F9951DF732BE85B3F79A45082 /* Element+defaults.swift in Sources */, - B4E611CBED96EAE1973130134CFAF1F8 /* Element.swift in Sources */, - BA01284A4D51779CE18C4B4B1072E600 /* Header.swift in Sources */, - ABF987C8B05650B7F587B98CF8D49040 /* Icon.swift in Sources */, - 4AF4160DAFDFE90B91E767F11D53C676 /* Image.swift in Sources */, - 0B6D2B8E54F6A7A48D48594517090835 /* InteractionContext.swift in Sources */, - 42A829C16312CA165D00DACC0ADEC0EA /* Keyboard.swift in Sources */, - A29A51BD9D9C4DE0FC4ADBF9B866D437 /* KeyboardContext.swift in Sources */, - 6355B326EDD3C569A10F9CD737ABDD37 /* Label.swift in Sources */, - BB9D41F5E8A093EBC9EDE2DFBF5EF784 /* NavBar.swift in Sources */, - AD68A7303B63A43663767D46878A6449 /* NavigationContext.swift in Sources */, - EC20F678A51FFAD90B3D3D1F76C58719 /* NormalizedCoordinate+Locations.swift in Sources */, - F8AA669D2559544400E99FF4 /* And.swift in Sources */, - B16D01DE1E4487F2B39335D599CBFF0A /* PageIndicator.swift in Sources */, - FEE6DD6A8EDEDF4078C41A22CEE26DE7 /* Picker.swift in Sources */, - 46775302AF7999648B09D9ED3EE48C74 /* Refreshable.swift in Sources */, - 34DEA23FC760111AC8D6ED0ACD1657AB /* Safari.swift in Sources */, - D58CD66F5B82023A328B46FC39D2C44B /* Scenario.swift in Sources */, - 30A3E04F64979C6D3D1CE35E32E3211A /* Screen.swift in Sources */, - 941194E6C860FAA1FA7F87D8B1CE7ED0 /* Scrollable.swift in Sources */, - 7FFF240E73592A018E7EF51D34C46822 /* ScrollableScreen.swift in Sources */, - 8F20672129F9D3960CD2C81807143AA6 /* ScrollView.swift in Sources */, - 6E5998C704D81C5561D9F3A0AE87E3F4 /* SecureTextField.swift in Sources */, - F8AA66912559543800E99FF4 /* When.swift in Sources */, - 660673CF4BD18AF55C3081895930F715 /* SegmentedControl.swift in Sources */, - 4CF8C1EB590C78B81CCAF8907F83B665 /* Sheet.swift in Sources */, - F7A4CDA05AB92DA971CDBBDEDF78F974 /* SheetContext.swift in Sources */, - 2B247D46ADB72B94A03A0692F9371692 /* Slider.swift in Sources */, - EC38D41C9E6F9C66D1A6184EDFB74184 /* Springboard.swift in Sources */, - EC47F602CD37E5EC24DE51E7875BA16A /* Step.swift in Sources */, - 8B2F8F080ECC1DE1DB954E16F23F0FBE /* Stepper.swift in Sources */, - BA8CF7D98500DADAD801E5914AB1A8F4 /* Switch.swift in Sources */, - F8AA6681255950F300E99FF4 /* XCTestCase+Screenshot.swift in Sources */, - FFB682562D658DE0039CA1B643E5B987 /* SystemPreferences.swift in Sources */, - 2F6C3202D54D6620EC5BF96782955D5A /* SystemPreferencesContext.swift in Sources */, - CCDFD3C2EDCC10DE9FDE0397CF868A28 /* SystemPreferencesGeneralScreen.swift in Sources */, - 447DB66D7F291D402E2F204F75E4448A /* SystemPreferencesResetScreen.swift in Sources */, - F8C8632658B840BA4531A5F8EEA2521E /* systemPreferencesRootScreen.swift in Sources */, - 6643C096FB4A1113F2FAC7B3A2FFEE37 /* TabBar.swift in Sources */, - EB84A3CBE94963C26AD0D70463996617 /* Table.swift in Sources */, - B5042D490C77BDC6BBF549D2197C7434 /* TABTestCase.swift in Sources */, - 248E3015488597454E4DB64E1CBD9F33 /* TABTestKit-dummy.m in Sources */, - A8C378399954F4B3FF9A059EFDC6E0CA /* Tappable.swift in Sources */, - F809D6C225554A4900CF86E9 /* XCUIApplicationState+String.swift in Sources */, - 8760E5691C6B92CAAC17935225A01921 /* StepAction.swift in Sources */, - 2F7918BEF8541A66867040B87BD3C527 /* TextField.swift in Sources */, - F4BF8B887488C4B0900D5C36A2B48886 /* TextView.swift in Sources */, - F8AA657F255931AC00E99FF4 /* String+HumanReadableString.swift in Sources */, - 700688692E1A02B5BD67FF220AEE4647 /* ValueRepresentable.swift in Sources */, - EE2DE74B688C2BA2BCA8D8D56B3CDE42 /* View.swift in Sources */, - 434755ECAB25587245B6D59856CAF2AE /* WebView.swift in Sources */, - E017FF0578E7F7F6958DBBC66FD4091B /* XCTFatalFail.swift in Sources */, - 8A39120AAB3F245151C6EC45731384E8 /* XCUIDevice+frame.swift in Sources */, - 129360CE5E67138943C2C4748D82367A /* XCUIElement+hasKeyboardFocus.swift in Sources */, - A103AA3DDCC0C574830CCD6754CC4FB7 /* XCUIElement+isVisible.swift in Sources */, - 9E751CCA8B991AD984B5F2DB579EFEF9 /* XCUIElement+wait.swift in Sources */, - F8AA66972559543F00E99FF4 /* Then.swift in Sources */, + 7E7556B81F678C3A6E6580D9039C676A /* Pods-TABTestKit_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9D50542E455CC3979D6826F7F6B472DE /* Sources */ = { + A3D1DBE0B97482C7D9E971A0A69C18FE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7E7556B81F678C3A6E6580D9039C676A /* Pods-TABTestKit_Example-dummy.m in Sources */, + 3C892CB7517172243FF2DA110515208C /* ShowTime-dummy.m in Sources */, + BA42C86F6872AC87ADF7110F65920109 /* ShowTime.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A3D1DBE0B97482C7D9E971A0A69C18FE /* Sources */ = { + DAEE1357CA2409902C9202B807D5EB7C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3C892CB7517172243FF2DA110515208C /* ShowTime-dummy.m in Sources */, - BA42C86F6872AC87ADF7110F65920109 /* ShowTime.swift in Sources */, + 2054DC424509138E34F3848CE8B90938 /* ActivitySheet.swift in Sources */, + 6D9D36D49B55D8CE03B7D06588648409 /* Adjustable.swift in Sources */, + 1EA6F865BCAC4ED83ECD404BE5297A3D /* Alert.swift in Sources */, + DDD4D66E76DAB619C8AA40EA09E387E6 /* AlertContext.swift in Sources */, + 63BC4DF41D5551FBFC856D94A9D70A09 /* And.swift in Sources */, + 548A49289E50CD23CB54221FFCFE5588 /* App.swift in Sources */, + F100E7312A5E11F33DB9340EE9828AA4 /* AppContext.swift in Sources */, + 11B3B9F1A8AD84A46B5BA22D8F181F38 /* Array+Safe.swift in Sources */, + 7C1E963711893F216562DAE8E2B871BC /* Attributes.swift in Sources */, + 1D9712C21C9B75BB08F99297D2FEC7C4 /* BaseApp.swift in Sources */, + 9F8E588302093F36FA01BDACDD590D21 /* Biometrics.m in Sources */, + 8420D91F60519B1D06D806B058277386 /* BiometricsContext.swift in Sources */, + 0E3E25AD0D3DC97BE8A0B6FD2F16D38B /* Button.swift in Sources */, + 74D0D2FFE04E8F157114F4A66DB38D54 /* Cell.swift in Sources */, + DF694D1140E3C47529532EA7F4E6973A /* CellContaining.swift in Sources */, + 454D0D551339A4CA30290742AB4F250B /* CGVector+Offset.swift in Sources */, + 663913458AA3C18DB93BDE7BE67BE7C2 /* CollectionView.swift in Sources */, + 03B4DA52DF96E031859A0DF2A8C9EB0C /* Completable.swift in Sources */, + 891DD55E25FDDE927D847E418424AE95 /* DatePicker.swift in Sources */, + 8A9BEED3DA74ACEB982ADA965099660A /* Dismissable.swift in Sources */, + E1BBCC2558B99876E705C79EF528C25F /* Editable.swift in Sources */, + C486ABB6EB046EC5B2B182ECC9B53377 /* Element+defaults.swift in Sources */, + 2BA7894BCF3EF54F0A70FCD936A11E94 /* Element.swift in Sources */, + 4B4774C895517CD336E380ACBCD70436 /* Given.swift in Sources */, + C2988975AD302D5FF6488D250CBBB0F2 /* Header.swift in Sources */, + D1CE514D723F1893A5F0D053EEACD0EC /* Icon.swift in Sources */, + CF74AD555C2757FBCFD1337D31359BD4 /* Image.swift in Sources */, + 8E9C42DADA943F3230EE19C7FFA6B62B /* InteractionContext.swift in Sources */, + BA056AE31E8A6D512AC11861D1B92B7F /* Keyboard.swift in Sources */, + F65900390EE335BD4760630FE869306A /* KeyboardContext.swift in Sources */, + 17D0CB638D3EF5133B62008560DF1327 /* Label.swift in Sources */, + DD6C499E277141B25C2204BE0E8606B8 /* NavBar.swift in Sources */, + A720B0DF02AB34732D0109C5125475FE /* NavigationContext.swift in Sources */, + B899CFEA104025B4615C327B9176E0B5 /* NormalizedCoordinate+Locations.swift in Sources */, + 0A0A553EC080DE1A5DF339060A9038C5 /* PageIndicator.swift in Sources */, + EC5A7C4C42700F9F905362B0556E72DD /* Picker.swift in Sources */, + 669E062C3F2DEBC7EB29919240C53163 /* Refreshable.swift in Sources */, + 4C7355396E8080F4A3530993D59BDAB5 /* Safari.swift in Sources */, + 3160F0FA460C86C549927823A13EFB06 /* Scenario.swift in Sources */, + 55E7A8DCE73E6FD0B40C3E8F40E83A04 /* Screen.swift in Sources */, + 2C161F124CED23888E0E4216479CA126 /* Scrollable.swift in Sources */, + 082157A0B221EBFA65F068F8029B05E6 /* ScrollableScreen.swift in Sources */, + CB7655F133E06F8C594315502B925A3F /* ScrollView.swift in Sources */, + A516E615CBF16674CF73A4E540DBFE92 /* SecureTextField.swift in Sources */, + E04F1DDE23CABCDB73F7E6CD585AD14E /* SegmentedControl.swift in Sources */, + ED4440EF16FF71F9973E7B8460AF1CDA /* Sheet.swift in Sources */, + E42C90139F7D37C13690F81AB2BAED29 /* SheetContext.swift in Sources */, + 26E893A3DFD1E0F22CEF0D67ACA330EB /* Slider.swift in Sources */, + 3119966FB6F159933D2133A2187A9AA0 /* Springboard.swift in Sources */, + AEDF236E3B3CBB57FFB71AD4F6A8AFFC /* Step.swift in Sources */, + A3531B58C2E3980C723BECD1A3755B03 /* StepAction.swift in Sources */, + 1387C6F9EB4523313438D4E580565AC2 /* Stepper.swift in Sources */, + 18144A36394D1224D583A84665FB4B30 /* String+HumanReadableString.swift in Sources */, + 400C878BB853BA340BE7FD1E3A481FD4 /* Switch.swift in Sources */, + A140807034B1A3CEF1A2CAEEF34D784A /* SystemPreferences.swift in Sources */, + D4B4436A4C1DE13329D2BC018F130789 /* SystemPreferencesContext.swift in Sources */, + 185A5E457BB628A20AF9D7BD868EEE7B /* SystemPreferencesGeneralScreen.swift in Sources */, + E8BD5261CF14414715FEA9AFFC3907F6 /* SystemPreferencesResetScreen.swift in Sources */, + F42B697127DBAFCBA46E352C9F92B569 /* systemPreferencesRootScreen.swift in Sources */, + 28A60B4F8F938C00338847F8B1E603FE /* TabBar.swift in Sources */, + F0FAC3BD38D83EDAB71246342EB204F0 /* Table.swift in Sources */, + F69B96B50FE9B18430A9105FDC86A5AA /* TABTestCase.swift in Sources */, + E7A207E53E8987DB3DE8A4375EABEC52 /* TABTestKit-dummy.m in Sources */, + 8AAE755BC4847DFE8679B48DF2613DC3 /* Tappable.swift in Sources */, + AD88B61462FF92A6ADC617A858778920 /* TextField.swift in Sources */, + 6A672915E5FA84B423A6AF955E36575A /* TextView.swift in Sources */, + 25A6BB1522B3BDC4454DBA9EF8453015 /* Then.swift in Sources */, + 0624985093AF3B7709891D5AC42315AE /* ValueRepresentable.swift in Sources */, + A2273435F8F15115147FE2936A31B0BD /* View.swift in Sources */, + E833729A73AC0BF6A38918EBCB6C0422 /* WebView.swift in Sources */, + 2AF8FCAF18389CD3F57B6FBE7116C773 /* When.swift in Sources */, + 1BA1C4D131C9AE17F0DBB522DFB48D2D /* XCTestCase+Screenshot.swift in Sources */, + FD1DB014E906D82A36EDC3EA5F4939FC /* XCTFatalFail.swift in Sources */, + E259FA3EB3BA2DEBCFDCD12E940A7777 /* XCUIApplicationState+String.swift in Sources */, + 3658750D2FB97E6E2938ED9B5737B3A9 /* XCUIDevice+frame.swift in Sources */, + 6823235A229142892436403BB3B69DAD /* XCUIElement+hasKeyboardFocus.swift in Sources */, + E0B42CF1477C3EF4C3F5E84252CA44FC /* XCUIElement+isVisible.swift in Sources */, + 6F2C42402666F28495C08EBE5052E70A /* XCUIElement+wait.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 05D629619F9F1F155F63B187B430CDD3 /* PBXTargetDependency */ = { + 8FD43C89AE4A8AA4FEA63FD10641528E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ShowTime; target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; - targetProxy = 754B214DB1E883537932FD5B5ED94709 /* PBXContainerItemProxy */; - }; - 495B0C8160E87358E035F1F9A14ADDE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = TABTestKit; - target = 9C4F771642E79689CC6A0648ABEA808C /* TABTestKit */; - targetProxy = CB3F99CE3F0D729A59560288C1918820 /* PBXContainerItemProxy */; + targetProxy = D472450F21315A8F71EF32C3F3A7C706 /* PBXContainerItemProxy */; }; - EA47B01DB270D1A566E7ECA62E92083E /* PBXTargetDependency */ = { + C13441B545CB63D4F314043EBF65EAE4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ShowTime; target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; - targetProxy = 902C0ED431E559D207A6E8DBB73303A3 /* PBXContainerItemProxy */; + targetProxy = 13AAF55A02BCEBB06015B6A2309264A3 /* PBXContainerItemProxy */; + }; + DD63C705109AD2B54BB4EF1B0DC9FC9E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = TABTestKit; + target = 9C4F771642E79689CC6A0648ABEA808C /* TABTestKit */; + targetProxy = EFE9C2A8BD7912D5A43F3ED1A52F157E /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 1646DCD1D131AC6871E47A82611B9CA3 /* Debug */ = { + 228121E430D0779D22EEC93CD0E8B19F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 476A6223DF0F58F25425C2F46B6EEC2C /* TABTestKit.debug.xcconfig */; + baseConfigurationReference = B3019D829E33FE2E46E5E7929D3EC25E /* TABTestKit.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; @@ -956,11 +959,10 @@ }; name = Debug; }; - 434AD7DDD7CDC54CD05BBA56068285F5 /* Release */ = { + 3BF205385D62D22FC2ACC85FE8A17C89 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AFD57256DAD4C8414BD38FD34982C7B0 /* Pods-TABTestKit_Example.release.xcconfig */; + baseConfigurationReference = 29DD4BF40C3210946B255EA0753A2C50 /* TABTestKit.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -971,19 +973,18 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/TABTestKit/TABTestKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/TABTestKit/TABTestKit-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/TABTestKit/TABTestKit.modulemap"; + PRODUCT_MODULE_NAME = TABTestKit; + PRODUCT_NAME = TABTestKit; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -991,11 +992,13 @@ }; name = Release; }; - 5407334CEC971382882AB78E99C30C7D /* Release */ = { + 434AD7DDD7CDC54CD05BBA56068285F5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FD03AA75DD58014781A38E023C12CD42 /* ShowTime.release.xcconfig */; + baseConfigurationReference = AFD57256DAD4C8414BD38FD34982C7B0 /* Pods-TABTestKit_Example.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1004,18 +1007,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/ShowTime/ShowTime-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/ShowTime/ShowTime-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/ShowTime/ShowTime.modulemap"; - PRODUCT_MODULE_NAME = ShowTime; - PRODUCT_NAME = ShowTime; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-TABTestKit_Example/Pods-TABTestKit_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1023,12 +1027,11 @@ }; name = Release; }; - 61081AD43A298056B736B34131E3076D /* Release */ = { + 5407334CEC971382882AB78E99C30C7D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D390EE6C19BFD5F1C1C797DDE47E11AE /* TABTestKit.release.xcconfig */; + baseConfigurationReference = FD03AA75DD58014781A38E023C12CD42 /* ShowTime.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1037,14 +1040,14 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/TABTestKit/TABTestKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/TABTestKit/TABTestKit-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/ShowTime/ShowTime-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ShowTime/ShowTime-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/TABTestKit/TABTestKit.modulemap"; - PRODUCT_MODULE_NAME = TABTestKit; - PRODUCT_NAME = TABTestKit; + MODULEMAP_FILE = "Target Support Files/ShowTime/ShowTime.modulemap"; + PRODUCT_MODULE_NAME = ShowTime; + PRODUCT_NAME = ShowTime; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -1145,7 +1148,8 @@ MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; @@ -1347,11 +1351,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 69E5949F88046C827AC56987D8B59AA2 /* Build configuration list for PBXNativeTarget "TABTestKit" */ = { + 985DDBCB21CD4421AD0C5A8034578044 /* Build configuration list for PBXNativeTarget "TABTestKit" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1646DCD1D131AC6871E47A82611B9CA3 /* Debug */, - 61081AD43A298056B736B34131E3076D /* Release */, + 228121E430D0779D22EEC93CD0E8B19F /* Debug */, + 3BF205385D62D22FC2ACC85FE8A17C89 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/TABTestKit/Classes/BDD/And.swift b/TABTestKit/Classes/BDD/And.swift index d1c9c15d..a816fd2c 100644 --- a/TABTestKit/Classes/BDD/And.swift +++ b/TABTestKit/Classes/BDD/And.swift @@ -15,7 +15,7 @@ extension XCTestCase { @discardableResult public func And(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - And(action(), line: line, function: function, file: file) + return And(action(), line: line, function: function, file: file) } @discardableResult @@ -29,7 +29,7 @@ extension XCTestCase { @discardableResult public func And(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - And(I: action(), line: line, function: function, file: file) + return And(I: action(), line: line, function: function, file: file) } @discardableResult @@ -43,7 +43,7 @@ extension XCTestCase { @discardableResult public func And(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - And(the: action(), line: line, function: function, file: file) + return And(the: action(), line: line, function: function, file: file) } @discardableResult @@ -57,7 +57,7 @@ extension XCTestCase { @discardableResult public func And(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - And(a: action(), line: line, function: function, file: file) + return And(a: action(), line: line, function: function, file: file) } @discardableResult diff --git a/TABTestKit/Classes/BDD/Given.swift b/TABTestKit/Classes/BDD/Given.swift index c81fcb0e..f0f4224b 100644 --- a/TABTestKit/Classes/BDD/Given.swift +++ b/TABTestKit/Classes/BDD/Given.swift @@ -15,7 +15,7 @@ extension XCTestCase { @discardableResult public func Given(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - Given(action(), line: line, function: function, file: file) + return Given(action(), line: line, function: function, file: file) } @discardableResult @@ -29,7 +29,7 @@ extension XCTestCase { @discardableResult public func Given(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - Given(I: action(), line: line, function: function, file: file) + return Given(I: action(), line: line, function: function, file: file) } @discardableResult @@ -43,7 +43,7 @@ extension XCTestCase { @discardableResult public func Given(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - Given(the: action(), line: line, function: function, file: file) + return Given(the: action(), line: line, function: function, file: file) } @discardableResult @@ -57,7 +57,7 @@ extension XCTestCase { @discardableResult public func Given(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - Given(a: action(), line: line, function: function, file: file) + return Given(a: action(), line: line, function: function, file: file) } @discardableResult diff --git a/TABTestKit/Classes/BDD/Then.swift b/TABTestKit/Classes/BDD/Then.swift index 78d55905..de8b8b2a 100644 --- a/TABTestKit/Classes/BDD/Then.swift +++ b/TABTestKit/Classes/BDD/Then.swift @@ -15,7 +15,7 @@ extension XCTestCase { @discardableResult public func Then(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - Then(action(), line: line, function: function, file: file) + return Then(action(), line: line, function: function, file: file) } @discardableResult @@ -29,7 +29,7 @@ extension XCTestCase { @discardableResult public func Then(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - Then(I: action(), line: line, function: function, file: file) + return Then(I: action(), line: line, function: function, file: file) } @discardableResult @@ -43,7 +43,7 @@ extension XCTestCase { @discardableResult public func Then(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - Then(the: action(), line: line, function: function, file: file) + return Then(the: action(), line: line, function: function, file: file) } @discardableResult @@ -57,7 +57,7 @@ extension XCTestCase { @discardableResult public func Then(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - Then(a: action(), line: line, function: function, file: file) + return Then(a: action(), line: line, function: function, file: file) } @discardableResult diff --git a/TABTestKit/Classes/BDD/When.swift b/TABTestKit/Classes/BDD/When.swift index 79a7a269..974f8a71 100644 --- a/TABTestKit/Classes/BDD/When.swift +++ b/TABTestKit/Classes/BDD/When.swift @@ -15,7 +15,7 @@ extension XCTestCase { @discardableResult public func When(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - When(action(), line: line, function: function, file: file) + return When(action(), line: line, function: function, file: file) } @discardableResult @@ -29,7 +29,7 @@ extension XCTestCase { @discardableResult public func When(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - When(I: action(), line: line, function: function, file: file) + return When(I: action(), line: line, function: function, file: file) } @discardableResult @@ -43,7 +43,7 @@ extension XCTestCase { @discardableResult public func When(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - When(the: action(), line: line, function: function, file: file) + return When(the: action(), line: line, function: function, file: file) } @discardableResult @@ -57,7 +57,7 @@ extension XCTestCase { @discardableResult public func When(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - When(a: action(), line: line, function: function, file: file) + return When(a: action(), line: line, function: function, file: file) } @discardableResult diff --git a/TABTestKit/Classes/Contexts/AlertContext.swift b/TABTestKit/Classes/Contexts/AlertContext.swift index 979d3424..ce53f4a7 100644 --- a/TABTestKit/Classes/Contexts/AlertContext.swift +++ b/TABTestKit/Classes/Contexts/AlertContext.swift @@ -11,7 +11,7 @@ public protocol AlertContext {} public extension AlertContext { func tap(_ actionButtonID: String, in alert: Alert) -> StepAction { - StepAction(description: "tap on the \(actionButtonID) button in the alert") { + return StepAction(description: "tap on the \(actionButtonID) button in the alert") { alert.actionButton(withID: actionButtonID).tap() } } diff --git a/TABTestKit/Classes/Contexts/AppContext.swift b/TABTestKit/Classes/Contexts/AppContext.swift index 8334c474..249341fd 100644 --- a/TABTestKit/Classes/Contexts/AppContext.swift +++ b/TABTestKit/Classes/Contexts/AppContext.swift @@ -12,37 +12,37 @@ public protocol AppContext {} public extension AppContext { func backgroundTheApp() -> StepAction { - StepAction(description: "background the app") { + return StepAction(description: "background the app") { App.shared.background() } } func foregroundTheApp() -> StepAction { - StepAction(description: "foreground the app") { + return StepAction(description: "foreground the app") { App.shared.activate() } } func terminateTheApp() -> StepAction { - StepAction(description: "terminate the app") { + return StepAction(description: "terminate the app") { App.shared.terminate() } } func launchTheApp(clean: Bool) -> StepAction { - StepAction(description: "launch the app") { + return StepAction(description: "launch the app") { App.shared.launch(clean: clean) } } func waitForApp(toBe state: XCUIApplication.State, timeout: TimeInterval = 10) -> StepAction { - StepAction(description: "wait for the app to be \(state.description)") { + return StepAction(description: "wait for the app to be \(state.description)") { XCTAssertTrue(App.shared.wait(for: App.shared.state == state, timeout: timeout), "App did not have the right state before the timeout. Expected \(state.rawValue), got \(App.shared.state.rawValue)") } } func relaunchTheApp() -> StepAction { - StepAction(description: "relaunch the app") { + return StepAction(description: "relaunch the app") { backgroundTheApp().execute() terminateTheApp().execute() launchTheApp(clean: false).execute() @@ -50,7 +50,7 @@ public extension AppContext { } func goBackToTABTestKitExampleApp() -> StepAction { - StepAction(description: "go back to the TABTestKit Example app") { + return StepAction(description: "go back to the TABTestKit Example app") { XCTAssertEqual(App.shared.name, "TABTestKit_Example") } } diff --git a/TABTestKit/Classes/Contexts/BiometricsContext.swift b/TABTestKit/Classes/Contexts/BiometricsContext.swift index ebca260e..7b811813 100644 --- a/TABTestKit/Classes/Contexts/BiometricsContext.swift +++ b/TABTestKit/Classes/Contexts/BiometricsContext.swift @@ -14,25 +14,25 @@ public protocol BiometricsContext {} public extension BiometricsContext { func deviceBiometricsAreEnabled() -> StepAction { - StepAction(description: "device biometrics are enabled") { + return StepAction(description: "device biometrics are enabled") { Biometrics.enrolled() } } func deviceBiometricsAreDisabled() -> StepAction { - StepAction(description: "device biometrics are disabled") { + return StepAction(description: "device biometrics are disabled") { Biometrics.unenrolled() } } func successfullyAuthenticateBiometrics() -> StepAction { - StepAction(description: "successfully authenticate biometrics") { + return StepAction(description: "successfully authenticate biometrics") { Biometrics.successfulAuthentication() } } func failToAuthenticateBiometrics() -> StepAction { - StepAction(description: "fail to authenticate biometrics") { + return StepAction(description: "fail to authenticate biometrics") { Biometrics.unsuccessfulAuthentication() } } diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index fa26b0b5..84f95039 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -11,25 +11,25 @@ public protocol InteractionContext {} public extension InteractionContext { func tap(_ element: Tappable & CustomStringConvertible) -> StepAction { - StepAction(description: "tap on the \(element.description)") { + return StepAction(description: "tap on the \(element.description)") { element.tap() } } func doubleTap(_ element: Tappable & CustomStringConvertible) -> StepAction { - StepAction(description: "double tap on the \(element.description)") { + return StepAction(description: "double tap on the \(element.description)") { element.doubleTap() } } func twoFingerTap(_ element: Tappable & CustomStringConvertible) -> StepAction { - StepAction(description: "two finger tap on the \(element.description)") { + return StepAction(description: "two finger tap on the \(element.description)") { element.twoFingerTap() } } func longPress(_ element: Tappable & CustomStringConvertible, duration: TimeInterval = 0.5) -> StepAction { - StepAction(description: "long press on the \(element.description)") { + return StepAction(description: "long press on the \(element.description)") { element.longPress(duration: duration) } } @@ -41,7 +41,7 @@ public extension InteractionContext { } func delete(_ numberOfCharacters: Int, charactersFrom element: Editable & CustomStringConvertible) -> StepAction { - StepAction(description: "delete \(numberOfCharacters) characters from the \(element.description)") { + return StepAction(description: "delete \(numberOfCharacters) characters from the \(element.description)") { element.delete(numberOfCharacters: numberOfCharacters) } } @@ -49,7 +49,7 @@ public extension InteractionContext { func state(of element: Element, is states: ElementAttributes.State...) -> StepAction { let stateDescription = states - .map(\.description) + .map { $0.description } .joined(separator: " and ") return StepAction(description: "state of the \(element) \(stateDescription)") { @@ -60,7 +60,7 @@ public extension InteractionContext { func state(of element: Element, isNot states: ElementAttributes.State...) -> StepAction { let stateDescription = states - .map(\.negativeDescription) + .map { $0.negativeDescription } .joined(separator: " or ") return StepAction(description: "state of the \(element) \(stateDescription)") { @@ -71,7 +71,7 @@ public extension InteractionContext { func scroll(_ element: Scrollable & CustomStringConvertible, _ direction: ElementAttributes.Direction, until otherElement: Element, is states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { let stateDescription = states - .map(\.description) + .map { $0.description } .joined(separator: " and ") return StepAction(description: "scroll the \(element) \(direction) until the \(otherElement) \(stateDescription)") { @@ -90,7 +90,7 @@ public extension InteractionContext { func scroll(_ element: Scrollable & CustomStringConvertible, _ direction: ElementAttributes.Direction, until otherElement: Element, isNot states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { let stateDescription = states - .map(\.negativeDescription) + .map { $0.negativeDescription } .joined(separator: " or ") return StepAction(description: "scroll the \(element) \(direction) until the \(otherElement) \(stateDescription)") { @@ -107,7 +107,7 @@ public extension InteractionContext { } func scroll(_ element: Scrollable & CustomStringConvertible, _ direction: ElementAttributes.Direction, until otherElement: Element, valueIs value: String, maxTries: Int = 10) -> StepAction { - StepAction(description: "scroll the \(element) \(direction) until the \(otherElement)'s value is '\(value)'") { + return StepAction(description: "scroll the \(element) \(direction) until the \(otherElement)'s value is '\(value)'") { var numberOfTries = 0 repeat { guard !(otherElement.value == value) else { return } @@ -119,25 +119,25 @@ public extension InteractionContext { } func value(of element: ElementWithValue, is expectedValue: ElementWithValue.Value) -> StepAction { - StepAction(description: "value of the \(element) is '\(expectedValue)'") { + return StepAction(description: "value of the \(element) is '\(expectedValue)'") { XCTAssertTrue(element.underlyingXCUIElement.wait(for: element.value == expectedValue), "Element did not have the right value before timing out! Expected: \(expectedValue), actual: \(element.value)") } } func label(of element: Element, is expectedLabel: String) -> StepAction { - StepAction(description: "label of the \(element) is '\(expectedLabel)'") { + return StepAction(description: "label of the \(element) is '\(expectedLabel)'") { XCTAssertTrue(element.underlyingXCUIElement.wait(for: element.label == expectedLabel), "Element did not have the right label before timing out! Expected: \(expectedLabel), actual: \(element.label)") } } func adjust(_ element: AdjustableElement, to newValue: AdjustableElement.Value) -> StepAction { - StepAction(description: "adjust the \(element) to '\(newValue)'") { + return StepAction(description: "adjust the \(element) to '\(newValue)'") { element.adjust(to: newValue) } } func refresh(_ refreshableThing: Refreshable & CustomStringConvertible) -> StepAction { - StepAction(description: "refresh the \(refreshableThing)") { + return StepAction(description: "refresh the \(refreshableThing)") { refreshableThing.refresh() } } diff --git a/TABTestKit/Classes/Contexts/NavigationContext.swift b/TABTestKit/Classes/Contexts/NavigationContext.swift index add26113..4a731ced 100644 --- a/TABTestKit/Classes/Contexts/NavigationContext.swift +++ b/TABTestKit/Classes/Contexts/NavigationContext.swift @@ -14,7 +14,7 @@ public extension NavigationContext { /// /// - Parameter screen: The screen to await. func see(_ screen: ScreenType) -> StepAction { - StepAction(description: "see the \(screen.description)") { + return StepAction(description: "see the \(screen.description)") { screen.trait.await(.exists, .visible) } } @@ -23,7 +23,7 @@ public extension NavigationContext { /// /// - Parameter screen: The screen to await. func doNotSee(_ screen: ScreenType) -> StepAction { - StepAction(description: "do not see the \(screen.description)") { + return StepAction(description: "do not see the \(screen.description)") { screen.trait.await(not: .exists) } } @@ -32,7 +32,7 @@ public extension NavigationContext { /// /// - Parameter element: The element to await. func see(_ element: Element) -> StepAction { - StepAction(description: "see the \(element.description)") { + return StepAction(description: "see the \(element.description)") { element.await(.exists, .visible) } } @@ -41,7 +41,7 @@ public extension NavigationContext { /// /// - Parameter element: The element to await. func doNotSee(_ element: Element) -> StepAction { - StepAction(description: "do not see the \(element.description)") { + return StepAction(description: "do not see the \(element.description)") { element.await(not: .exists) } } @@ -54,7 +54,7 @@ public extension NavigationContext { guard !completableThings.isEmpty else { XCTFatalFail("You must provide at least one Completable thing to complete!") } let completableDescription = completableThings - .map(\.description) + .map { $0.description } .joined(separator: " and the ") return StepAction(description: "complete the \(completableDescription)") { @@ -73,7 +73,7 @@ public extension NavigationContext { guard !dismissableThings.isEmpty else { XCTFatalFail("You must provide at least one Dismissable thing to dismiss!") } let dismissableDescription = dismissableThings - .map(\.description) + .map { $0.description } .joined(separator: " and the ") return StepAction(description: "dismiss the \(dismissableDescription)") { @@ -103,8 +103,7 @@ public extension NavigationContext { /// /// - Parameter url: The URL to open. func open(_ url: URL) -> StepAction { - - StepAction(description: "open '\(url.absoluteString)'") { + return StepAction(description: "open '\(url.absoluteString)'") { springboard.activate() if !Icon.testRunner.determine(.hittable, timeout: 1) { XCUIDevice.shared.press(.home) // Ensure we're on the first page of the home screen diff --git a/TABTestKit/Classes/Contexts/SheetContext.swift b/TABTestKit/Classes/Contexts/SheetContext.swift index e28f2161..1ebb3b06 100644 --- a/TABTestKit/Classes/Contexts/SheetContext.swift +++ b/TABTestKit/Classes/Contexts/SheetContext.swift @@ -11,7 +11,7 @@ public protocol SheetContext {} public extension SheetContext { func tap(_ actionButtonID: String, in sheet: Sheet) -> StepAction { - StepAction(description: "tap on the \(actionButtonID) button in the sheet") { + return StepAction(description: "tap on the \(actionButtonID) button in the sheet") { sheet.actionButton(withID: actionButtonID).tap() } } diff --git a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift index 1a1c7823..fb8de71b 100644 --- a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift +++ b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift @@ -11,7 +11,7 @@ public protocol SystemPreferencesContext {} public extension SystemPreferencesContext { func resetAllPrivacyPrompts() -> StepAction { - StepAction(description: "reset all privacy prompts") { + return StepAction(description: "reset all privacy prompts") { if SystemPreferences().state != .notRunning { openSystemPreferences().execute() // Turns out you can't terminate an app if it's not in the foreground, but we want to terminate it so that it can be reset back to the start, so we're weirdly activating it here before doing anything. Might be a bug. } @@ -25,13 +25,13 @@ public extension SystemPreferencesContext { } func openSystemPreferences() -> StepAction { - StepAction(description: "open system preferences") { + return StepAction(description: "open system preferences") { SystemPreferences().activate() } } func terminateSystemPreferences() -> StepAction{ - StepAction(description: "terminate system preferences") { + return StepAction(description: "terminate system preferences") { SystemPreferences().terminate() } } diff --git a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift index e51485ec..d491e06a 100644 --- a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift +++ b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift @@ -48,7 +48,7 @@ extension String { extension Sequence where Element == String { public var humanReadableString: String { - map(\.humanReadableString) + map { $0.humanReadableString } .filter { !$0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty } .joined(separator: " ") } From a6946684d2e8d809c02ed83f3efd03ca2278f98c Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 12:48:47 +0100 Subject: [PATCH 07/26] Fixed support for older swift versions --- TABTestKit/Classes/Contexts/AppContext.swift | 8 ++++---- .../Classes/Contexts/SystemPreferencesContext.swift | 6 +++--- .../Classes/Extensions/String+HumanReadableString.swift | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/TABTestKit/Classes/Contexts/AppContext.swift b/TABTestKit/Classes/Contexts/AppContext.swift index 249341fd..a4559d7f 100644 --- a/TABTestKit/Classes/Contexts/AppContext.swift +++ b/TABTestKit/Classes/Contexts/AppContext.swift @@ -43,9 +43,9 @@ public extension AppContext { func relaunchTheApp() -> StepAction { return StepAction(description: "relaunch the app") { - backgroundTheApp().execute() - terminateTheApp().execute() - launchTheApp(clean: false).execute() + self.backgroundTheApp().execute() + self.terminateTheApp().execute() + self.launchTheApp(clean: false).execute() } } @@ -56,7 +56,7 @@ public extension AppContext { } func openSafari() -> StepAction { // TODO: Move to Safari context - StepAction(description: "open safari") { + return StepAction(description: "open safari") { Safari().activate() } } diff --git a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift index fb8de71b..51685aa9 100644 --- a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift +++ b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift @@ -13,10 +13,10 @@ public extension SystemPreferencesContext { func resetAllPrivacyPrompts() -> StepAction { return StepAction(description: "reset all privacy prompts") { if SystemPreferences().state != .notRunning { - openSystemPreferences().execute() // Turns out you can't terminate an app if it's not in the foreground, but we want to terminate it so that it can be reset back to the start, so we're weirdly activating it here before doing anything. Might be a bug. + self.openSystemPreferences().execute() // Turns out you can't terminate an app if it's not in the foreground, but we want to terminate it so that it can be reset back to the start, so we're weirdly activating it here before doing anything. Might be a bug. } - terminateSystemPreferences().execute() - openSystemPreferences().execute() + self.terminateSystemPreferences().execute() + self.openSystemPreferences().execute() systemPreferencesRootScreen.generalCell.tap() systemPreferencesGeneralScreen.resetCell.tap() systemPreferencesResetScreen.resetCell.tap() diff --git a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift index d491e06a..bb802f36 100644 --- a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift +++ b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift @@ -37,7 +37,7 @@ extension String { return cleanWord.isEmpty ? nil : cleanWord } .map { (word) -> String in - guard word.contains(where: \.isLowercase) else { + guard word.contains(where: { $0.isLowercase }) else { return word } return word.lcfirst @@ -48,7 +48,7 @@ extension String { extension Sequence where Element == String { public var humanReadableString: String { - map { $0.humanReadableString } + return map { $0.humanReadableString } .filter { !$0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty } .joined(separator: " ") } @@ -56,7 +56,7 @@ extension Sequence where Element == String { private extension String { func occurences(of characterSet: CharacterSet) -> Int { - reduce(into: 0) { (result, character) in + return reduce(into: 0) { (result, character) in guard characterSet.contains(character: character) else { return } result += 1 } From 4632722d2001085cde161a6d8c576f5180baa633 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 13:10:58 +0100 Subject: [PATCH 08/26] Made TABTestCase a singleton --- Example/Pods/Pods.xcodeproj/project.pbxproj | 38 +++-------- TABTestKit/Classes/BDD/And.swift | 69 ------------------- TABTestKit/Classes/BDD/Given.swift | 69 ------------------- TABTestKit/Classes/BDD/Step.swift | 74 ++++++++++++++++++--- TABTestKit/Classes/BDD/Then.swift | 69 ------------------- TABTestKit/Classes/BDD/When.swift | 69 ------------------- TABTestKit/Classes/TABTestCase.swift | 8 +++ 7 files changed, 83 insertions(+), 313 deletions(-) delete mode 100644 TABTestKit/Classes/BDD/And.swift delete mode 100644 TABTestKit/Classes/BDD/Given.swift delete mode 100644 TABTestKit/Classes/BDD/Then.swift delete mode 100644 TABTestKit/Classes/BDD/When.swift diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 47e1e3b5..91481fff 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -23,11 +23,9 @@ 1EA6F865BCAC4ED83ECD404BE5297A3D /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BAE1DB9682A76CE1F7D25EDF50954B4 /* Alert.swift */; }; 2054DC424509138E34F3848CE8B90938 /* ActivitySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCDEA02B41E3CFBF3C4F834B67D9C8B1 /* ActivitySheet.swift */; }; 221E6E8B9F1CF89B139F1D7D1735A7D0 /* Biometrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 4426932FB43D12FD3B25C45B0D3DB5E3 /* Biometrics.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 25A6BB1522B3BDC4454DBA9EF8453015 /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572A3CD5F0DE989B1696DCEDF774676E /* Then.swift */; }; 26E893A3DFD1E0F22CEF0D67ACA330EB /* Slider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF232CBC0BB1AA412ED181CA70971C93 /* Slider.swift */; }; 27CB0A5EB157C02C3FDFCC594331324E /* ShowTime-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 69152FFA4489AC24B45BCE5208B3B41A /* ShowTime-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 28A60B4F8F938C00338847F8B1E603FE /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948AF33A978CC268F1320B0402AFF101 /* TabBar.swift */; }; - 2AF8FCAF18389CD3F57B6FBE7116C773 /* When.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9782C9ACC640EFC0E9B3C883F8D00D69 /* When.swift */; }; 2BA7894BCF3EF54F0A70FCD936A11E94 /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6722333D3F5D59F34131D31D1D1FE676 /* Element.swift */; }; 2C161F124CED23888E0E4216479CA126 /* Scrollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04EF71556DC643FB444C9FD8A2D2273B /* Scrollable.swift */; }; 2E268691E9DB58B1480521F5DA485F6D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; @@ -37,11 +35,9 @@ 3C892CB7517172243FF2DA110515208C /* ShowTime-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F094F44DD0301CC76E1365673D3FCF9C /* ShowTime-dummy.m */; }; 400C878BB853BA340BE7FD1E3A481FD4 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608B1CF229A9CA80D894BDF978BDE92E /* Switch.swift */; }; 454D0D551339A4CA30290742AB4F250B /* CGVector+Offset.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A4630312862B2311E0A09F613CCE9C /* CGVector+Offset.swift */; }; - 4B4774C895517CD336E380ACBCD70436 /* Given.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1D88BC36BB7E74970503C2B4D4E445 /* Given.swift */; }; 4C7355396E8080F4A3530993D59BDAB5 /* Safari.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345673EC98326958FDD832E970FBC0D5 /* Safari.swift */; }; 548A49289E50CD23CB54221FFCFE5588 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51B80733D2F02DAC42E2CE0CAC135978 /* App.swift */; }; 55E7A8DCE73E6FD0B40C3E8F40E83A04 /* Screen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E814D75ED12AC6A3033B80BD5B76CA9B /* Screen.swift */; }; - 63BC4DF41D5551FBFC856D94A9D70A09 /* And.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1060AAEBB6B876925470F0051EF10CE5 /* And.swift */; }; 663913458AA3C18DB93BDE7BE67BE7C2 /* CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E067CAFBFC1166DFBB2271399EC2CFD /* CollectionView.swift */; }; 669E062C3F2DEBC7EB29919240C53163 /* Refreshable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF456B5F34BD317666B460FD66B3EACE /* Refreshable.swift */; }; 6823235A229142892436403BB3B69DAD /* XCUIElement+hasKeyboardFocus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142A5D14FCDDB44F1359E507ADC023E4 /* XCUIElement+hasKeyboardFocus.swift */; }; @@ -131,7 +127,6 @@ 04EF71556DC643FB444C9FD8A2D2273B /* Scrollable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scrollable.swift; sourceTree = ""; }; 074592D395E1B324B941268A4BDFE494 /* XCTFatalFail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = XCTFatalFail.swift; sourceTree = ""; }; 0BAE1DB9682A76CE1F7D25EDF50954B4 /* Alert.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = ""; }; - 1060AAEBB6B876925470F0051EF10CE5 /* And.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = And.swift; sourceTree = ""; }; 1109E2825435A7F93916269AF224F7E9 /* SheetContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SheetContext.swift; sourceTree = ""; }; 1157F417976B95B88578E86BABD1D402 /* BiometricsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BiometricsContext.swift; sourceTree = ""; }; 14146CA31421B9CAE5A93C48F6E9FFAF /* Pods-TABTestKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example.debug.xcconfig"; sourceTree = ""; }; @@ -145,14 +140,14 @@ 1CB830EB632DA8DED42D4E33C4E59DD9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh"; sourceTree = ""; }; 1DCACD99A57DD7326886398073E8D0F0 /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Completable.swift; sourceTree = ""; }; 1F698463C0D1F23C6A08AA0370CACC2C /* Scenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scenario.swift; sourceTree = ""; }; - 246C5312AD287517A78640A4FAF48421 /* ShowTime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ShowTime.framework; path = ShowTime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 246C5312AD287517A78640A4FAF48421 /* ShowTime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ShowTime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28061D8B4A5060F09E692D4BC586713B /* Pods-TABTestKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TABTestKit_Example-dummy.m"; sourceTree = ""; }; 28B6F8382724C10ED00299DBAEA904E9 /* XCTestCase+Screenshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Screenshot.swift"; sourceTree = ""; }; 29DD4BF40C3210946B255EA0753A2C50 /* TABTestKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.release.xcconfig; sourceTree = ""; }; 2A1977697003E1D2D4081EBD3C88A058 /* Label.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; 2AB8063DF88FBB359AC5393D7A3E50FF /* SegmentedControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; 2C56C15410FDD6C55973202E7BD51AB1 /* systemPreferencesRootScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = systemPreferencesRootScreen.swift; sourceTree = ""; }; - 2E97F8EAABEDB0295C8BBA3ADB4A81C2 /* Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2E97F8EAABEDB0295C8BBA3ADB4A81C2 /* Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2F3F765734217A16E21E8B1C09B7FE80 /* Array+Safe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Array+Safe.swift"; sourceTree = ""; }; 345673EC98326958FDD832E970FBC0D5 /* Safari.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Safari.swift; sourceTree = ""; }; 398CBC48FD3DC75735CF21DC994303C1 /* PageIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PageIndicator.swift; sourceTree = ""; }; @@ -161,14 +156,13 @@ 4732CB370809DB01C84C92F67E78EBF3 /* SystemPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferences.swift; sourceTree = ""; }; 480A21749332DE8E5EA766E94E3DF705 /* Cell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = ""; }; 4CE841B85565D4AD0ABA4859EE72F277 /* XCUIApplicationState+String.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIApplicationState+String.swift"; sourceTree = ""; }; - 516836C45DBE97859AF1DD3AC2CD4B01 /* Pods_TABTestKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TABTestKit_Example.framework; path = "Pods-TABTestKit_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 516836C45DBE97859AF1DD3AC2CD4B01 /* Pods_TABTestKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TABTestKit_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 51B80733D2F02DAC42E2CE0CAC135978 /* App.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; 549B858328CB2EF8360076242052506E /* Pods-TABTestKit_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TABTestKit_Example.modulemap"; sourceTree = ""; }; - 572A3CD5F0DE989B1696DCEDF774676E /* Then.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = ""; }; 574CE0D3F84DEB81697CA498206D4AAD /* Stepper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Stepper.swift; sourceTree = ""; }; 57B0491A64EEB163590B1DFA92FB3428 /* Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Keyboard.swift; sourceTree = ""; }; 5ABB96D352A83B9EBC717088FEB22046 /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; - 5C817F0E0208382B131E5FFB430F8A17 /* TABTestKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TABTestKit.framework; path = TABTestKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5C817F0E0208382B131E5FFB430F8A17 /* TABTestKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TABTestKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 608B1CF229A9CA80D894BDF978BDE92E /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = ""; }; 65C5769C6582D788F3CF9ED2066A33E3 /* NormalizedCoordinate+Locations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NormalizedCoordinate+Locations.swift"; sourceTree = ""; }; @@ -176,7 +170,7 @@ 6722333D3F5D59F34131D31D1D1FE676 /* Element.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Element.swift; sourceTree = ""; }; 69152FFA4489AC24B45BCE5208B3B41A /* ShowTime-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ShowTime-umbrella.h"; sourceTree = ""; }; 6E79134F82F3A8D58969B44D7F169338 /* Pods-TABTestKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TABTestKit_Example-acknowledgements.markdown"; sourceTree = ""; }; - 70A6CCC96873C0AA1B670BC851D8A52D /* TABTestKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = TABTestKit.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 70A6CCC96873C0AA1B670BC851D8A52D /* TABTestKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = TABTestKit.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 73619FBD640A527E63538013823ED97D /* BaseApp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseApp.swift; sourceTree = ""; }; 74143AF02ECD026417803851FBC88264 /* XCUIElement+wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+wait.swift"; sourceTree = ""; }; 7A4E2FD9EA293CEA0430ECEF163A494D /* Dismissable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Dismissable.swift; sourceTree = ""; }; @@ -192,9 +186,8 @@ 953A3688CF885118CDDF66A466CC614B /* Button.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; 954F7DC72FBBE48914CB5651386710A8 /* Tappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Tappable.swift; sourceTree = ""; }; 965A292F186CF36A47FF8AB1CADE1B85 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig"; sourceTree = ""; }; - 9782C9ACC640EFC0E9B3C883F8D00D69 /* When.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = When.swift; sourceTree = ""; }; 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m"; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9ED8581DAD6ED00A41AE1E536EEAD58B /* StepAction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StepAction.swift; sourceTree = ""; }; 9FEFF9CD73B2D6723ED60BBDD46577CD /* Pods-TABTestKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TABTestKit_Example-umbrella.h"; sourceTree = ""; }; A0E305787E9DB1C4D9481DC5BD801F34 /* SecureTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SecureTextField.swift; sourceTree = ""; }; @@ -211,9 +204,8 @@ AFD57256DAD4C8414BD38FD34982C7B0 /* Pods-TABTestKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example.release.xcconfig"; sourceTree = ""; }; B06054F30FE3F234917DE45221C2E54F /* Biometrics-Bridging-Header.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Biometrics-Bridging-Header.h"; sourceTree = ""; }; B3019D829E33FE2E46E5E7929D3EC25E /* TABTestKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.debug.xcconfig; sourceTree = ""; }; - BB1D88BC36BB7E74970503C2B4D4E445 /* Given.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Given.swift; sourceTree = ""; }; C0788D6F9F3512AE4BDA244B4DCDF26E /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; - C2468B3A27C658D13CF927D2A4C8AD02 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + C2468B3A27C658D13CF927D2A4C8AD02 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; C335DE8DB3A5121E14AEAA3DD404D8E2 /* KeyboardContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardContext.swift; sourceTree = ""; }; C354231844F21D916AF8E0D9E0F587FF /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap"; sourceTree = ""; }; C4DAB7171AB13E8D58EC9C015631FC17 /* DatePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DatePicker.swift; sourceTree = ""; }; @@ -241,7 +233,7 @@ EF232CBC0BB1AA412ED181CA70971C93 /* Slider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Slider.swift; sourceTree = ""; }; F094F44DD0301CC76E1365673D3FCF9C /* ShowTime-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ShowTime-dummy.m"; sourceTree = ""; }; F29FD0CF98ED9351CA4E1F517837FD7A /* Attributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Attributes.swift; sourceTree = ""; }; - F3B14016D4E1EE6F917A37F9A571B4B1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + F3B14016D4E1EE6F917A37F9A571B4B1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; F6E82BB36605AB8908E94034E0293735 /* Element+defaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Element+defaults.swift"; sourceTree = ""; }; F6E8DB302D57F50C5B2FAC9D4278B4EA /* XCUIDevice+frame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIDevice+frame.swift"; sourceTree = ""; }; F90F79197248FD23EC55A47A83DC7A25 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; @@ -294,7 +286,6 @@ EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */, 3AD53452E6F9B27B718A63F5668EEEAC /* Support Files */, ); - name = ShowTime; path = ShowTime; sourceTree = ""; }; @@ -358,12 +349,8 @@ 3017907910E919139755598F963083B2 /* BDD */ = { isa = PBXGroup; children = ( - 1060AAEBB6B876925470F0051EF10CE5 /* And.swift */, - BB1D88BC36BB7E74970503C2B4D4E445 /* Given.swift */, 1F698463C0D1F23C6A08AA0370CACC2C /* Scenario.swift */, 8476933083A60F51BA859B1D618C353C /* Step.swift */, - 572A3CD5F0DE989B1696DCEDF774676E /* Then.swift */, - 9782C9ACC640EFC0E9B3C883F8D00D69 /* When.swift */, ); name = BDD; path = TABTestKit/Classes/BDD; @@ -564,7 +551,6 @@ children = ( 9ED8581DAD6ED00A41AE1E536EEAD58B /* StepAction.swift */, ); - name = Action; path = Action; sourceTree = ""; }; @@ -593,7 +579,6 @@ 4426932FB43D12FD3B25C45B0D3DB5E3 /* Biometrics.h */, B06054F30FE3F234917DE45221C2E54F /* Biometrics-Bridging-Header.h */, ); - name = include; path = include; sourceTree = ""; }; @@ -826,7 +811,6 @@ 6D9D36D49B55D8CE03B7D06588648409 /* Adjustable.swift in Sources */, 1EA6F865BCAC4ED83ECD404BE5297A3D /* Alert.swift in Sources */, DDD4D66E76DAB619C8AA40EA09E387E6 /* AlertContext.swift in Sources */, - 63BC4DF41D5551FBFC856D94A9D70A09 /* And.swift in Sources */, 548A49289E50CD23CB54221FFCFE5588 /* App.swift in Sources */, F100E7312A5E11F33DB9340EE9828AA4 /* AppContext.swift in Sources */, 11B3B9F1A8AD84A46B5BA22D8F181F38 /* Array+Safe.swift in Sources */, @@ -845,7 +829,6 @@ E1BBCC2558B99876E705C79EF528C25F /* Editable.swift in Sources */, C486ABB6EB046EC5B2B182ECC9B53377 /* Element+defaults.swift in Sources */, 2BA7894BCF3EF54F0A70FCD936A11E94 /* Element.swift in Sources */, - 4B4774C895517CD336E380ACBCD70436 /* Given.swift in Sources */, C2988975AD302D5FF6488D250CBBB0F2 /* Header.swift in Sources */, D1CE514D723F1893A5F0D053EEACD0EC /* Icon.swift in Sources */, CF74AD555C2757FBCFD1337D31359BD4 /* Image.swift in Sources */, @@ -888,11 +871,9 @@ 8AAE755BC4847DFE8679B48DF2613DC3 /* Tappable.swift in Sources */, AD88B61462FF92A6ADC617A858778920 /* TextField.swift in Sources */, 6A672915E5FA84B423A6AF955E36575A /* TextView.swift in Sources */, - 25A6BB1522B3BDC4454DBA9EF8453015 /* Then.swift in Sources */, 0624985093AF3B7709891D5AC42315AE /* ValueRepresentable.swift in Sources */, A2273435F8F15115147FE2936A31B0BD /* View.swift in Sources */, E833729A73AC0BF6A38918EBCB6C0422 /* WebView.swift in Sources */, - 2AF8FCAF18389CD3F57B6FBE7116C773 /* When.swift in Sources */, 1BA1C4D131C9AE17F0DBB522DFB48D2D /* XCTestCase+Screenshot.swift in Sources */, FD1DB014E906D82A36EDC3EA5F4939FC /* XCTFatalFail.swift in Sources */, E259FA3EB3BA2DEBCFDCD12E940A7777 /* XCUIApplicationState+String.swift in Sources */, @@ -1148,8 +1129,7 @@ MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; diff --git a/TABTestKit/Classes/BDD/And.swift b/TABTestKit/Classes/BDD/And.swift deleted file mode 100644 index a816fd2c..00000000 --- a/TABTestKit/Classes/BDD/And.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// And.swift -// TABTestKit -// -// Created by Stefan Renne on 09/11/2020. -// - -import XCTest - -/// Defines an executable And step to be used in tests. -/// -extension XCTestCase { - - // MARK: - Standard init, i.e. And(somethingHappens) - - @discardableResult - public func And(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return And(action(), line: line, function: function, file: file) - } - - @discardableResult - public func And(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["And", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "I" init, i.e. And(I: doSomething) - - @discardableResult - public func And(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return And(I: action(), line: line, function: function, file: file) - } - - @discardableResult - public func And(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["And", "I", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "the" init, i.e. And(the: thingIsTrue) - - @discardableResult - public func And(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return And(the: action(), line: line, function: function, file: file) - } - - @discardableResult - public func And(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["And", "the", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "a" init, i.e. And(a: serverErrorIsReturned) - - @discardableResult - public func And(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return And(a: action(), line: line, function: function, file: file) - } - - @discardableResult - public func And(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["And", "a", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } -} diff --git a/TABTestKit/Classes/BDD/Given.swift b/TABTestKit/Classes/BDD/Given.swift deleted file mode 100644 index f0f4224b..00000000 --- a/TABTestKit/Classes/BDD/Given.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// Given.swift -// TABTestKit -// -// Created by Stefan Renne on 09/11/2020. -// - -import XCTest - -/// Defines an executable Given step to be used in tests. -/// -extension XCTestCase { - - // MARK: - Standard init, i.e. Given(somethingHappens) - - @discardableResult - public func Given(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return Given(action(), line: line, function: function, file: file) - } - - @discardableResult - public func Given(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["Given", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "I" init, i.e. Given(I: doSomething) - - @discardableResult - public func Given(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return Given(I: action(), line: line, function: function, file: file) - } - - @discardableResult - public func Given(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["Given", "I", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "the" init, i.e. Given(the: thingIsTrue) - - @discardableResult - public func Given(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return Given(the: action(), line: line, function: function, file: file) - } - - @discardableResult - public func Given(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["Given", "the", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "a" init, i.e. Given(a: serverErrorIsReturned) - - @discardableResult - public func Given(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return Given(a: action(), line: line, function: function, file: file) - } - - @discardableResult - public func Given(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["Given", "a", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } -} diff --git a/TABTestKit/Classes/BDD/Step.swift b/TABTestKit/Classes/BDD/Step.swift index a27f392e..26ee57d3 100644 --- a/TABTestKit/Classes/BDD/Step.swift +++ b/TABTestKit/Classes/BDD/Step.swift @@ -9,6 +9,11 @@ import XCTest +open class Given: Step {} +open class When: Step {} +open class Then: Step {} +open class And: Step {} + /// Defines an executable step to be used in tests. /// /// Steps that are initialised with a function that doesn't take arguments can omit the parenthesis, @@ -20,9 +25,7 @@ open class Step { /// A reference to the most recently created Step, useful if you want to find out what step failed. public static var current: Step? - /// The test case this step is executed in. - public let testCase: XCTestCase - /// The line in a test function this step is in. + /// The line in a test function this step is in. public let line: UInt /// The test function this step is in. public let function: StaticString @@ -31,25 +34,80 @@ open class Step { /// The description of this step. public let description: String - init(handler: () -> Void, testCase: XCTestCase, description: String, line: UInt, function: StaticString, file: StaticString) { - self.testCase = testCase + init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { self.line = line self.function = function self.file = file self.description = description Step.current = self - XCTContext.runActivity(named: description) { _ in if App.shared.screenshotOption.contains(.beforeStep) { - testCase.attachScreenshot() + TABTestCase.current?.attachScreenshot() } handler() if App.shared.screenshotOption.contains(.afterStep) { - testCase.attachScreenshot() + TABTestCase.current?.attachScreenshot() } } } + + // MARK: - Standard init, i.e. Given(somethingHappens) + + @discardableResult + public convenience init(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(action(), line: line, function: function, file: file) + } + + @discardableResult + public convenience init(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Swift.type(of: self)), action.description] + .joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) + } + + // MARK: - "I" init, i.e. Given(I: doSomething) + + @discardableResult + public convenience init(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(I: action(), line: line, function: function, file: file) + } + + @discardableResult + public convenience init(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Swift.type(of: self)), "I", action.description] + .joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) + } + + // MARK: - "the" init, i.e. Given(the: thingIsTrue) + + @discardableResult + public convenience init(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(the: action(), line: line, function: function, file: file) + } + + @discardableResult + public convenience init(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Swift.type(of: self)), "the", action.description] + .joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) + } + + // MARK: - "a" init, i.e. Given(a: serverErrorIsReturned) + + @discardableResult + convenience init(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(a: action(), line: line, function: function, file: file) + } + + @discardableResult + convenience init(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Swift.type(of: self)), "a", action.description] + .joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) + } + } diff --git a/TABTestKit/Classes/BDD/Then.swift b/TABTestKit/Classes/BDD/Then.swift deleted file mode 100644 index de8b8b2a..00000000 --- a/TABTestKit/Classes/BDD/Then.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// Then.swift -// TABTestKit -// -// Created by Stefan Renne on 09/11/2020. -// - -import XCTest - -/// Defines an executable Then step to be used in tests. -/// -extension XCTestCase { - - // MARK: - Standard init, i.e. Then(somethingHappens) - - @discardableResult - public func Then(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return Then(action(), line: line, function: function, file: file) - } - - @discardableResult - public func Then(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["Then", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "I" init, i.e. Then(I: doSomething) - - @discardableResult - public func Then(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return Then(I: action(), line: line, function: function, file: file) - } - - @discardableResult - public func Then(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["Then", "I", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "the" init, i.e. Then(the: thingIsTrue) - - @discardableResult - public func Then(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return Then(the: action(), line: line, function: function, file: file) - } - - @discardableResult - public func Then(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["Then", "the", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "a" init, i.e. Then(a: serverErrorIsReturned) - - @discardableResult - public func Then(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return Then(a: action(), line: line, function: function, file: file) - } - - @discardableResult - public func Then(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["Then", "a", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } -} diff --git a/TABTestKit/Classes/BDD/When.swift b/TABTestKit/Classes/BDD/When.swift deleted file mode 100644 index 974f8a71..00000000 --- a/TABTestKit/Classes/BDD/When.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// When.swift -// TABTestKit -// -// Created by Stefan Renne on 09/11/2020. -// - -import XCTest - -/// Defines an executable When step to be used in tests. -/// -extension XCTestCase { - - // MARK: - Standard init, i.e. When(somethingHappens) - - @discardableResult - public func When(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return When(action(), line: line, function: function, file: file) - } - - @discardableResult - public func When(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["When", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "I" init, i.e. When(I: doSomething) - - @discardableResult - public func When(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return When(I: action(), line: line, function: function, file: file) - } - - @discardableResult - public func When(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["When", "I", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "the" init, i.e. When(the: thingIsTrue) - - @discardableResult - public func When(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return When(the: action(), line: line, function: function, file: file) - } - - @discardableResult - public func When(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["When", "the", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } - - // MARK: - "a" init, i.e. When(a: serverErrorIsReturned) - - @discardableResult - public func When(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - return When(a: action(), line: line, function: function, file: file) - } - - @discardableResult - public func When(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) -> Step { - let description = ["When", "a", action.description] - .joined(separator: " ") - return Step(handler: action.execute, testCase: self, description: description, line: line, function: function, file: file) - } -} diff --git a/TABTestKit/Classes/TABTestCase.swift b/TABTestKit/Classes/TABTestCase.swift index 4e793d58..26e714c7 100644 --- a/TABTestKit/Classes/TABTestCase.swift +++ b/TABTestKit/Classes/TABTestCase.swift @@ -31,6 +31,14 @@ public typealias DefaultContexts = InteractionContext & NavigationContext & AppC /// Finally, TABTestCase will help you by creating attachments when tests failed, with the last known Scenario and Step /// which are found in the xcresult bundle created as part of the test run (usually in Derived Data). open class TABTestCase: XCTestCase, DefaultContexts { + + /// A reference to the most recently created TABTestCase. + public static var current: TABTestCase? + + open override func invokeTest() { + TABTestCase.current = self + super.invokeTest() + } /// Provides the setup for application that happens before each XCTestCase. /// As part of setUp, preLaunchSetup will be called. From 79fe63cc7dbb02e02cf372e88c23f5c5edad3b8d Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 13:24:39 +0100 Subject: [PATCH 09/26] Moved screenshot option to TABTestCase --- Example/Pods/Pods.xcodeproj/project.pbxproj | 4 -- TABTestKit/Classes/Apps/App.swift | 27 +------------ TABTestKit/Classes/BDD/Step.swift | 8 +--- .../Extensions/XCTestCase+Screenshot.swift | 21 ---------- TABTestKit/Classes/TABTestCase.swift | 38 +++++++++++++++++-- 5 files changed, 38 insertions(+), 60 deletions(-) delete mode 100644 TABTestKit/Classes/Extensions/XCTestCase+Screenshot.swift diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 91481fff..aad07bb3 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -18,7 +18,6 @@ 18144A36394D1224D583A84665FB4B30 /* String+HumanReadableString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C956BC753D42DFFEAB22C6711757FDE /* String+HumanReadableString.swift */; }; 182CC29C7BAFE0334AC07728900F1D6C /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */; }; 185A5E457BB628A20AF9D7BD868EEE7B /* SystemPreferencesGeneralScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16FF8D7D264C777C17EC8E3826E41FC0 /* SystemPreferencesGeneralScreen.swift */; }; - 1BA1C4D131C9AE17F0DBB522DFB48D2D /* XCTestCase+Screenshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28B6F8382724C10ED00299DBAEA904E9 /* XCTestCase+Screenshot.swift */; }; 1D9712C21C9B75BB08F99297D2FEC7C4 /* BaseApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73619FBD640A527E63538013823ED97D /* BaseApp.swift */; }; 1EA6F865BCAC4ED83ECD404BE5297A3D /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BAE1DB9682A76CE1F7D25EDF50954B4 /* Alert.swift */; }; 2054DC424509138E34F3848CE8B90938 /* ActivitySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCDEA02B41E3CFBF3C4F834B67D9C8B1 /* ActivitySheet.swift */; }; @@ -142,7 +141,6 @@ 1F698463C0D1F23C6A08AA0370CACC2C /* Scenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scenario.swift; sourceTree = ""; }; 246C5312AD287517A78640A4FAF48421 /* ShowTime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ShowTime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28061D8B4A5060F09E692D4BC586713B /* Pods-TABTestKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TABTestKit_Example-dummy.m"; sourceTree = ""; }; - 28B6F8382724C10ED00299DBAEA904E9 /* XCTestCase+Screenshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Screenshot.swift"; sourceTree = ""; }; 29DD4BF40C3210946B255EA0753A2C50 /* TABTestKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.release.xcconfig; sourceTree = ""; }; 2A1977697003E1D2D4081EBD3C88A058 /* Label.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; 2AB8063DF88FBB359AC5393D7A3E50FF /* SegmentedControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; @@ -379,7 +377,6 @@ F6E82BB36605AB8908E94034E0293735 /* Element+defaults.swift */, 65C5769C6582D788F3CF9ED2066A33E3 /* NormalizedCoordinate+Locations.swift */, 1C956BC753D42DFFEAB22C6711757FDE /* String+HumanReadableString.swift */, - 28B6F8382724C10ED00299DBAEA904E9 /* XCTestCase+Screenshot.swift */, 074592D395E1B324B941268A4BDFE494 /* XCTFatalFail.swift */, 4CE841B85565D4AD0ABA4859EE72F277 /* XCUIApplicationState+String.swift */, F6E8DB302D57F50C5B2FAC9D4278B4EA /* XCUIDevice+frame.swift */, @@ -874,7 +871,6 @@ 0624985093AF3B7709891D5AC42315AE /* ValueRepresentable.swift in Sources */, A2273435F8F15115147FE2936A31B0BD /* View.swift in Sources */, E833729A73AC0BF6A38918EBCB6C0422 /* WebView.swift in Sources */, - 1BA1C4D131C9AE17F0DBB522DFB48D2D /* XCTestCase+Screenshot.swift in Sources */, FD1DB014E906D82A36EDC3EA5F4939FC /* XCTFatalFail.swift in Sources */, E259FA3EB3BA2DEBCFDCD12E940A7777 /* XCUIApplicationState+String.swift in Sources */, 3658750D2FB97E6E2938ED9B5737B3A9 /* XCUIDevice+frame.swift in Sources */, diff --git a/TABTestKit/Classes/Apps/App.swift b/TABTestKit/Classes/Apps/App.swift index dc2e91b2..d1b42157 100644 --- a/TABTestKit/Classes/Apps/App.swift +++ b/TABTestKit/Classes/Apps/App.swift @@ -14,36 +14,11 @@ import XCTest /// Using this instead of XCUIApplication() means you get the /// enhanced waits for the correct states when launching/backgrounding etc, inherited from BaseApp. public final class App: BaseApp { - - public struct ScreenshotOption: OptionSet { - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - public static let onFailure = ScreenshotOption(rawValue: 1 << 0) - public static let beforeStep = ScreenshotOption(rawValue: 1 << 1) - public static let afterStep = ScreenshotOption(rawValue: 1 << 2) - public static let none: ScreenshotOption = [] - public static let all: ScreenshotOption = [.onFailure, .beforeStep, .afterStep] - } - + /// The shared App instance. Using a shared instance ensure consistency with launch arguments. public static let shared = App() - - public private(set) var screenshotOption: ScreenshotOption = .none - public private(set) var screenshotQuality: XCTAttachment.ImageQuality = .medium - public private(set) var screenshotLifetime: XCTAttachment.Lifetime = .deleteOnSuccess private override init() { super.init() } - - /// Changes the screenshot behavior - public func setScreenshots(option: ScreenshotOption, quality: XCTAttachment.ImageQuality = .medium, lifetime: XCTAttachment.Lifetime = .deleteOnSuccess) { - screenshotOption = option - screenshotQuality = quality - screenshotLifetime = lifetime - } /// Launches the app, cleaning if required. /// Note you are responsible for implementing these launch arguments at the appropriate time in your launch cycle, diff --git a/TABTestKit/Classes/BDD/Step.swift b/TABTestKit/Classes/BDD/Step.swift index 26ee57d3..11f124fe 100644 --- a/TABTestKit/Classes/BDD/Step.swift +++ b/TABTestKit/Classes/BDD/Step.swift @@ -42,15 +42,11 @@ open class Step { Step.current = self XCTContext.runActivity(named: description) { _ in - if App.shared.screenshotOption.contains(.beforeStep) { - TABTestCase.current?.attachScreenshot() - } + TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) handler() - if App.shared.screenshotOption.contains(.afterStep) { - TABTestCase.current?.attachScreenshot() - } + TABTestCase.current?.createScreenshotIfNeeded(for: .afterStep) } } diff --git a/TABTestKit/Classes/Extensions/XCTestCase+Screenshot.swift b/TABTestKit/Classes/Extensions/XCTestCase+Screenshot.swift deleted file mode 100644 index e50ac2a3..00000000 --- a/TABTestKit/Classes/Extensions/XCTestCase+Screenshot.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// XCTestCase+Screenshot.swift -// TABTestKit -// -// Created by Stefan Renne on 09/11/2020. -// - -import XCTest - -extension XCTestCase { - - func attachScreenshot() { - // if tests have no host app there is no point in making screenshots - guard #available(iOS 9.0, OSX 10.11, *), Bundle.main.bundlePath.hasSuffix(".app") else { return } - - let screenshot = XCUIScreen.main.screenshot() - let attachment = XCTAttachment(screenshot: screenshot, quality: App.shared.screenshotQuality) - attachment.lifetime = App.shared.screenshotLifetime - add(attachment) - } -} diff --git a/TABTestKit/Classes/TABTestCase.swift b/TABTestKit/Classes/TABTestCase.swift index 26e714c7..27f5baba 100644 --- a/TABTestKit/Classes/TABTestCase.swift +++ b/TABTestKit/Classes/TABTestCase.swift @@ -32,9 +32,27 @@ public typealias DefaultContexts = InteractionContext & NavigationContext & AppC /// which are found in the xcresult bundle created as part of the test run (usually in Derived Data). open class TABTestCase: XCTestCase, DefaultContexts { + public struct ScreenshotOption: OptionSet { + public let rawValue: Int + + public init(rawValue: Int) { + self.rawValue = rawValue + } + + public static let onFailure = ScreenshotOption(rawValue: 1 << 0) + public static let beforeStep = ScreenshotOption(rawValue: 1 << 1) + public static let afterStep = ScreenshotOption(rawValue: 1 << 2) + public static let none: ScreenshotOption = [] + public static let all: ScreenshotOption = [.onFailure, .beforeStep, .afterStep] + } + /// A reference to the most recently created TABTestCase. public static var current: TABTestCase? + public private(set) var screenshotOption: ScreenshotOption = .none + public private(set) var screenshotQuality: XCTAttachment.ImageQuality = .medium + public private(set) var screenshotLifetime: XCTAttachment.Lifetime = .deleteOnSuccess + open override func invokeTest() { TABTestCase.current = self super.invokeTest() @@ -83,6 +101,22 @@ open class TABTestCase: XCTestCase, DefaultContexts { open func preTerminationTearDown(_ terminate: @escaping () -> Void) { terminate() } + + /// Changes the screenshot behavior + public func setScreenshots(option: ScreenshotOption, quality: XCTAttachment.ImageQuality = .medium, lifetime: XCTAttachment.Lifetime = .deleteOnSuccess) { + screenshotOption = option + screenshotQuality = quality + screenshotLifetime = lifetime + } + + public func createScreenshotIfNeeded(for option: ScreenshotOption ) { + guard screenshotOption.contains(option) else { return } + + let screenshot = XCUIScreen.main.screenshot() + let attachment = XCTAttachment(screenshot: screenshot, quality: screenshotQuality) + attachment.lifetime = screenshotLifetime + add(attachment) + } override open func recordFailure(withDescription description: String, inFile filePath: String, atLine lineNumber: Int, expected: Bool) { // When using Steps and Scenarios it can be really hard to pinpoint where failed, so this attachment saves the info with the last known step and scenario (including the line that failed), to help you. @@ -90,9 +124,7 @@ open class TABTestCase: XCTestCase, DefaultContexts { let attachment = createFailureAttachment(description: description, filePath: filePath, lineNumber: lineNumber) add(attachment) - if App.shared.screenshotOption.contains(.onFailure) { - attachScreenshot() - } + createScreenshotIfNeeded(for: .onFailure) let filePath = Step.current?.filePath ?? filePath let lineNumber = Step.current?.lineNumber ?? lineNumber From 4e3fcf9e0c99a34fcea6e2d49e72e8afc32296ab Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 14:09:07 +0100 Subject: [PATCH 10/26] Fixed support for older swift versions --- TABTestKit/Classes/Contexts/InteractionContext.swift | 2 +- TABTestKit/Classes/Protocols/Screen.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index 84f95039..e62c107f 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -35,7 +35,7 @@ public extension InteractionContext { } func type(_ text: String, into element: Editable & CustomStringConvertible) -> StepAction { - StepAction(description: "type '\(text)' into the \(element.description)") { + return StepAction(description: "type '\(text)' into the \(element.description)") { element.type(text) } } diff --git a/TABTestKit/Classes/Protocols/Screen.swift b/TABTestKit/Classes/Protocols/Screen.swift index a2f85a9b..635d9dc0 100644 --- a/TABTestKit/Classes/Protocols/Screen.swift +++ b/TABTestKit/Classes/Protocols/Screen.swift @@ -25,7 +25,7 @@ public protocol Screen: CustomStringConvertible { extension Screen { public var description: String { - String(describing: Swift.type(of: self)).humanReadableString + return String(describing: Swift.type(of: self)).humanReadableString } } From af67aae95a4894f3cae4739525a08e77774c9b96 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 14:30:04 +0100 Subject: [PATCH 11/26] Processed feedback --- Example/Pods/Pods.xcodeproj/project.pbxproj | 972 ++++++++++---------- TABTestKit/Classes/BDD/And.swift | 36 + TABTestKit/Classes/BDD/Given.swift | 36 + TABTestKit/Classes/BDD/Step.swift | 125 +-- TABTestKit/Classes/BDD/Then.swift | 36 + TABTestKit/Classes/BDD/When.swift | 36 + TABTestKit/Classes/TABTestCase.swift | 7 +- 7 files changed, 695 insertions(+), 553 deletions(-) create mode 100644 TABTestKit/Classes/BDD/And.swift create mode 100644 TABTestKit/Classes/BDD/Given.swift create mode 100644 TABTestKit/Classes/BDD/Then.swift create mode 100644 TABTestKit/Classes/BDD/When.swift diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index aad07bb3..e27db790 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,238 +7,246 @@ objects = { /* Begin PBXBuildFile section */ - 03B4DA52DF96E031859A0DF2A8C9EB0C /* Completable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DCACD99A57DD7326886398073E8D0F0 /* Completable.swift */; }; - 0624985093AF3B7709891D5AC42315AE /* ValueRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0788D6F9F3512AE4BDA244B4DCDF26E /* ValueRepresentable.swift */; }; - 082157A0B221EBFA65F068F8029B05E6 /* ScrollableScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5D6DC8DEB8AFE62ED3A44D51A6198C0 /* ScrollableScreen.swift */; }; - 0A0A553EC080DE1A5DF339060A9038C5 /* PageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 398CBC48FD3DC75735CF21DC994303C1 /* PageIndicator.swift */; }; - 0E3E25AD0D3DC97BE8A0B6FD2F16D38B /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953A3688CF885118CDDF66A466CC614B /* Button.swift */; }; - 11B3B9F1A8AD84A46B5BA22D8F181F38 /* Array+Safe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F3F765734217A16E21E8B1C09B7FE80 /* Array+Safe.swift */; }; - 1387C6F9EB4523313438D4E580565AC2 /* Stepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 574CE0D3F84DEB81697CA498206D4AAD /* Stepper.swift */; }; - 17D0CB638D3EF5133B62008560DF1327 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1977697003E1D2D4081EBD3C88A058 /* Label.swift */; }; - 18144A36394D1224D583A84665FB4B30 /* String+HumanReadableString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C956BC753D42DFFEAB22C6711757FDE /* String+HumanReadableString.swift */; }; + 06FDCF6B474E049A7B79F20C08A98C1C /* AlertContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0E9E5A8C40AE9FA6D056025FD256009 /* AlertContext.swift */; }; + 084AE09317EB2606D787382C22CE0377 /* Editable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B54A4D79DB812556238900425435AC6D /* Editable.swift */; }; + 0A563A4C9E29C02E6ED3AA6F1B1A6DC6 /* AppContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0718F5AABDDB132CECFD6B1F67949777 /* AppContext.swift */; }; + 113B7F1532E3CBB60CB6E2231C6CA6E7 /* InteractionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C29E65C9C1D4879633ECA14F93BF4F /* InteractionContext.swift */; }; + 117F9D190A92A6523FFFF59FCFC58845 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 466A54469B45DE7D4F8490000DC01CD2 /* TextField.swift */; }; 182CC29C7BAFE0334AC07728900F1D6C /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */; }; - 185A5E457BB628A20AF9D7BD868EEE7B /* SystemPreferencesGeneralScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16FF8D7D264C777C17EC8E3826E41FC0 /* SystemPreferencesGeneralScreen.swift */; }; - 1D9712C21C9B75BB08F99297D2FEC7C4 /* BaseApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73619FBD640A527E63538013823ED97D /* BaseApp.swift */; }; - 1EA6F865BCAC4ED83ECD404BE5297A3D /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BAE1DB9682A76CE1F7D25EDF50954B4 /* Alert.swift */; }; - 2054DC424509138E34F3848CE8B90938 /* ActivitySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCDEA02B41E3CFBF3C4F834B67D9C8B1 /* ActivitySheet.swift */; }; - 221E6E8B9F1CF89B139F1D7D1735A7D0 /* Biometrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 4426932FB43D12FD3B25C45B0D3DB5E3 /* Biometrics.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 26E893A3DFD1E0F22CEF0D67ACA330EB /* Slider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF232CBC0BB1AA412ED181CA70971C93 /* Slider.swift */; }; + 18524E640F190A40CF849180B42D4386 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = C15A251953084904192BEF363CC50974 /* Image.swift */; }; + 192A4EF78A1E86328ADD0D960C795404 /* NavigationContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3041A2EF88AEC543518FA21A2216920A /* NavigationContext.swift */; }; + 1BEED53FF31E8DE363B8B7E0FE2386CF /* ScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDC62D7EDE856ADD24BE0C6F22E6A19D /* ScrollView.swift */; }; + 23BE47F2C5FACE3435765A4B12045EBB /* StepAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9070B6D58C73B757448186A920E2623 /* StepAction.swift */; }; + 25B7F8036770E3BAD5AED37B28829CFE /* PageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 646A34A102CAF90BBB108BA83A1DFDF4 /* PageIndicator.swift */; }; + 2633EBB888D79E4645D5A86DE1E207A8 /* TABTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D788703B37BCD0B9B3485EEF292754C0 /* TABTestCase.swift */; }; 27CB0A5EB157C02C3FDFCC594331324E /* ShowTime-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 69152FFA4489AC24B45BCE5208B3B41A /* ShowTime-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 28A60B4F8F938C00338847F8B1E603FE /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948AF33A978CC268F1320B0402AFF101 /* TabBar.swift */; }; - 2BA7894BCF3EF54F0A70FCD936A11E94 /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6722333D3F5D59F34131D31D1D1FE676 /* Element.swift */; }; - 2C161F124CED23888E0E4216479CA126 /* Scrollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04EF71556DC643FB444C9FD8A2D2273B /* Scrollable.swift */; }; - 2E268691E9DB58B1480521F5DA485F6D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - 3119966FB6F159933D2133A2187A9AA0 /* Springboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD3EB838D87679B91E046CA0F6674B73 /* Springboard.swift */; }; - 3160F0FA460C86C549927823A13EFB06 /* Scenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F698463C0D1F23C6A08AA0370CACC2C /* Scenario.swift */; }; - 3658750D2FB97E6E2938ED9B5737B3A9 /* XCUIDevice+frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6E8DB302D57F50C5B2FAC9D4278B4EA /* XCUIDevice+frame.swift */; }; + 2A76C6EE089B367A676CAEC1352AF76A /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0630A033211DB096B3D975C0A8A6D605 /* Icon.swift */; }; + 2AB09904E3907BFAF0FCF8457F36C5DD /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BEFAF4D17AA36C8FF4F731C1A8CA413 /* Switch.swift */; }; + 2B949418FA8DC59294FDD6E2F3D8AE8D /* Safari.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F854565414111D8828F801C8ED21C89 /* Safari.swift */; }; + 2BB20D43FDAA7A3824B0918E85EB285E /* Refreshable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDC3DE5A05803025992E807A9B620C65 /* Refreshable.swift */; }; + 2BF6460484B4BDD7B811862447E09D44 /* XCUIDevice+frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89D415A66DE217B3A58DD8458B849955 /* XCUIDevice+frame.swift */; }; + 2D0EDD823E5C39E82E80FF6F0DCE087F /* SystemPreferencesResetScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E68F10F35B448B759B075167F209FF8B /* SystemPreferencesResetScreen.swift */; }; + 32AA1FAC78298434EEC5DFC1AEFCD7A5 /* systemPreferencesRootScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = D31AB25725A3DF749752F4B423D38992 /* systemPreferencesRootScreen.swift */; }; + 3329F65960EB9D7F9E4886C99CEF7AC2 /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71C4DC4C2C6BA7086DC35863AD1C5C9 /* Element.swift */; }; + 38A02222BFF7CA17255CDF36CC916A92 /* XCUIElement+hasKeyboardFocus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B50C46CCAEFEE409E73BB0945A1386 /* XCUIElement+hasKeyboardFocus.swift */; }; + 38C3C67DD9230FF3415AA1408937B24E /* Stepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90FC842068CBCA1897B40C5530D71B73 /* Stepper.swift */; }; 3C892CB7517172243FF2DA110515208C /* ShowTime-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F094F44DD0301CC76E1365673D3FCF9C /* ShowTime-dummy.m */; }; - 400C878BB853BA340BE7FD1E3A481FD4 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608B1CF229A9CA80D894BDF978BDE92E /* Switch.swift */; }; - 454D0D551339A4CA30290742AB4F250B /* CGVector+Offset.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A4630312862B2311E0A09F613CCE9C /* CGVector+Offset.swift */; }; - 4C7355396E8080F4A3530993D59BDAB5 /* Safari.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345673EC98326958FDD832E970FBC0D5 /* Safari.swift */; }; - 548A49289E50CD23CB54221FFCFE5588 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51B80733D2F02DAC42E2CE0CAC135978 /* App.swift */; }; - 55E7A8DCE73E6FD0B40C3E8F40E83A04 /* Screen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E814D75ED12AC6A3033B80BD5B76CA9B /* Screen.swift */; }; - 663913458AA3C18DB93BDE7BE67BE7C2 /* CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E067CAFBFC1166DFBB2271399EC2CFD /* CollectionView.swift */; }; - 669E062C3F2DEBC7EB29919240C53163 /* Refreshable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF456B5F34BD317666B460FD66B3EACE /* Refreshable.swift */; }; - 6823235A229142892436403BB3B69DAD /* XCUIElement+hasKeyboardFocus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142A5D14FCDDB44F1359E507ADC023E4 /* XCUIElement+hasKeyboardFocus.swift */; }; - 6A672915E5FA84B423A6AF955E36575A /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1725A9931E08FEB9586AAE872DCD810 /* TextView.swift */; }; - 6D9D36D49B55D8CE03B7D06588648409 /* Adjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ABB96D352A83B9EBC717088FEB22046 /* Adjustable.swift */; }; - 6F2C42402666F28495C08EBE5052E70A /* XCUIElement+wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74143AF02ECD026417803851FBC88264 /* XCUIElement+wait.swift */; }; + 402FF89F68EA5737BB680809553A0850 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */; }; + 43E9C61618AE664876822B258D5111C2 /* Element+defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDED6BADF920ACCC2DD498A47F99D3EE /* Element+defaults.swift */; }; + 48162352D9DBE11D17253F20DF940F52 /* Tappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA58C9CF8C3C1E9778E23BB340E830B7 /* Tappable.swift */; }; + 48B4E1DD9C1B6A6DF048E7FF451721FC /* XCTFatalFail.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55787F6DF817B75F3CAFE58D2C75A03 /* XCTFatalFail.swift */; }; + 498BAC78410A3326F0D0B6783CF1E1CD /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = E95305EAAE76580C42BAE10B8BA594A4 /* View.swift */; }; + 4A04B8D4048231DDDC1033B9B76BE374 /* Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 730A5800CBEF9A14270AA853398D4322 /* Keyboard.swift */; }; + 4E6399D30DA5D5907DC244F670CFEF6F /* Given.swift in Sources */ = {isa = PBXBuildFile; fileRef = 113B2F6486B7E7BC2CB41EC1FDFDD7F2 /* Given.swift */; }; + 4EB917867D63259330A8DDAC0E290EB1 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 380747A33CBA0FF82E8CEB03411E427C /* Cell.swift */; }; + 4EE7462D720FD1FE0B2FD646103DCE83 /* SystemPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345FC0348148646DBEDE0FBDACE559C2 /* SystemPreferences.swift */; }; + 56D644760585A3D34D1AE036069EC6A3 /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCA3B772A48D4211760F912E0F520AD /* Alert.swift */; }; + 5AED8D6EFDC28A63308987AF0C1A35E0 /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6AFCEC547D4081C1DDACB4A91B07FF /* Sheet.swift */; }; + 5B3274ABF7AB0F6FA03129CA840D457C /* BiometricsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54BDB8F76CB7BFE0C528BEBE724823DE /* BiometricsContext.swift */; }; + 5D0EFF1733E4DDD38ECDDCA8AD3339C9 /* ScrollableScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DFD8B4AD1A37548984761B52E84606 /* ScrollableScreen.swift */; }; + 5D2612AC51A0116828886FB1526751B8 /* Completable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C94641B67764C3DA9DA9C1D38EE6BBC /* Completable.swift */; }; + 5FD5D211829AB1894F7B5EE1BE829A3C /* NormalizedCoordinate+Locations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4783CAC79F17D1896489A64424F9BD48 /* NormalizedCoordinate+Locations.swift */; }; + 6ADF17B20B6EFDCEC55E674308005E2A /* XCUIApplicationState+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B459502363B50DE1504A1E3E310CEE0 /* XCUIApplicationState+String.swift */; }; + 6D3083CF5F97B2973DC8330ECAFCF90E /* Scenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26AA4B2AF62940849952DF099E1C16D2 /* Scenario.swift */; }; + 6DA18833BC74C96BD4038634FCB636B8 /* SystemPreferencesGeneralScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A2AC58F03DE192BC9986F7F70005C60 /* SystemPreferencesGeneralScreen.swift */; }; + 6DA4E1686871F6E59BCAA924C0668E87 /* Scrollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B95B6E9FBADB3E4746E8709F9261BD3 /* Scrollable.swift */; }; + 6FEB7C55E1D1D64DD813EF3BF2BFFC8C /* TABTestKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F948F57E6E72DBC56EDD37D109BA110B /* TABTestKit-dummy.m */; }; + 7052154ED9D42077DF1726BED0C48BAF /* CellContaining.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF2F5E57EDB77B25913C06A64C65465 /* CellContaining.swift */; }; + 71A67EB78830229D3C70A85882C384A3 /* Springboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6261BD34529E203C86AE451C51562B5 /* Springboard.swift */; }; 72D00E3EC4AC546C8ED0616A85ACA0F3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - 74D0D2FFE04E8F157114F4A66DB38D54 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 480A21749332DE8E5EA766E94E3DF705 /* Cell.swift */; }; 74E2F7EA36D277B32C6F922F069AD086 /* Pods-TABTestKit_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FEFF9CD73B2D6723ED60BBDD46577CD /* Pods-TABTestKit_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C1E963711893F216562DAE8E2B871BC /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F29FD0CF98ED9351CA4E1F517837FD7A /* Attributes.swift */; }; + 7578D6F57158FC72F619DFC47E999FCD /* SystemPreferencesContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2009C7FC8E7E04E8F8860CD852C1E01A /* SystemPreferencesContext.swift */; }; + 765EC1583DA774BEDF3B1AE8341CABC5 /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD498F8C31BAC913FCFE2CA65CCA10A0 /* Then.swift */; }; + 77B3F66EA519E14E10D80A0C389A9AD5 /* XCUIElement+wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0168AF849134D16100C7BFEB80A23C /* XCUIElement+wait.swift */; }; + 7DD7CAB0E73B465227072495B779BCA0 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1ED1716CD49E60E25B156392276E0D /* App.swift */; }; 7E7556B81F678C3A6E6580D9039C676A /* Pods-TABTestKit_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 28061D8B4A5060F09E692D4BC586713B /* Pods-TABTestKit_Example-dummy.m */; }; - 8420D91F60519B1D06D806B058277386 /* BiometricsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1157F417976B95B88578E86BABD1D402 /* BiometricsContext.swift */; }; - 891DD55E25FDDE927D847E418424AE95 /* DatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4DAB7171AB13E8D58EC9C015631FC17 /* DatePicker.swift */; }; + 7F8B3276765C07B62E27BDC6377414A4 /* Slider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEFA603E0C79DEC5284F64B5E074405C /* Slider.swift */; }; + 7FA42C268DA81109FFC693C6D8AB4F28 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; + 7FB0822EA1DDF1DEFE29790A10B1FB67 /* ValueRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 687E6C1C097B8F4536E788A429F084E3 /* ValueRepresentable.swift */; }; + 7FF8BB0E221D6ACD242DB5C250A17A44 /* Array+Safe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873D8C8F533183A9CC0FDB0584A0D3A6 /* Array+Safe.swift */; }; + 854C0E83987379570558D80CFBA790E4 /* XCUIElement+isVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7797BE5699830440539E71C37A1A71 /* XCUIElement+isVisible.swift */; }; 8927BD966BA8175BBCD4A4C1E98EC03C /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C6AFBB671D10E6AEF0786D8E3E16BDE4 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A9BEED3DA74ACEB982ADA965099660A /* Dismissable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A4E2FD9EA293CEA0430ECEF163A494D /* Dismissable.swift */; }; - 8AAE755BC4847DFE8679B48DF2613DC3 /* Tappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954F7DC72FBBE48914CB5651386710A8 /* Tappable.swift */; }; - 8E9C42DADA943F3230EE19C7FFA6B62B /* InteractionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65ED5E70523A93CB6BBE413726DAAACA /* InteractionContext.swift */; }; - 9F8E588302093F36FA01BDACDD590D21 /* Biometrics.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F90C9131D671249054E927E4DDFA458 /* Biometrics.m */; }; - A140807034B1A3CEF1A2CAEEF34D784A /* SystemPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4732CB370809DB01C84C92F67E78EBF3 /* SystemPreferences.swift */; }; - A2273435F8F15115147FE2936A31B0BD /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 149CAC8C0AE1DBCAC92257002D333344 /* View.swift */; }; - A3531B58C2E3980C723BECD1A3755B03 /* StepAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ED8581DAD6ED00A41AE1E536EEAD58B /* StepAction.swift */; }; - A516E615CBF16674CF73A4E540DBFE92 /* SecureTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0E305787E9DB1C4D9481DC5BD801F34 /* SecureTextField.swift */; }; - A720B0DF02AB34732D0109C5125475FE /* NavigationContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44637C436760778449FA5C2D990AD02 /* NavigationContext.swift */; }; - A9BF4ABCDA227FEBF05866D8774E17F7 /* Biometrics-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = B06054F30FE3F234917DE45221C2E54F /* Biometrics-Bridging-Header.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AD88B61462FF92A6ADC617A858778920 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01F16C16CB3E54AB9894D0EBBC49827 /* TextField.swift */; }; - AEDF236E3B3CBB57FFB71AD4F6A8AFFC /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8476933083A60F51BA859B1D618C353C /* Step.swift */; }; - AFF67E5D0FAC2324B4C8E67D07DBCE6E /* TABTestKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AB6E7B255089A991E8E03C689B549DF /* TABTestKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B899CFEA104025B4615C327B9176E0B5 /* NormalizedCoordinate+Locations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65C5769C6582D788F3CF9ED2066A33E3 /* NormalizedCoordinate+Locations.swift */; }; - BA056AE31E8A6D512AC11861D1B92B7F /* Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B0491A64EEB163590B1DFA92FB3428 /* Keyboard.swift */; }; + 8A9E429A8E6D3F3D083D81E603E26B21 /* Biometrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 6890CBB16D74D0A0539454707E9E7452 /* Biometrics.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8AB95AFB351852B2E3B1E791E7DCDD7A /* NavBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DB2A169534C4831C445981DF3A2DA5C /* NavBar.swift */; }; + 9373D3E00D7C52065C4FD60C3502B1F5 /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FBC2649A9FA1E16EB703D8D700AC35 /* Attributes.swift */; }; + 9587A5801FA5C8C9D7E765955787803B /* TABTestKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 896F504662A182450FFE70188319673F /* TABTestKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9E294C5654201DDF5B6A5C8D03DFEFA4 /* TabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD146FCEC24A82B51539C1914173EB08 /* TabBar.swift */; }; + 9E36064C7A8CBC6D79A8142E4B6BBF0A /* Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B3A68D3EFAF29500090F023538224C0 /* Table.swift */; }; + A0DD5C33A1518D280901636B07190871 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0CBB594319A69C908CD4647034A573F /* Label.swift */; }; + A3BF17EAAC4876860E82923FE4027DD3 /* Biometrics-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BA1F3F52CB90CFB17E58972997596A2 /* Biometrics-Bridging-Header.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A481E788ACAD65BDE1C8CEDCDD98EE49 /* String+HumanReadableString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42BDF21DA60D81C5D0CBDD48A018614F /* String+HumanReadableString.swift */; }; + A886C176B7A3725DF58A8B5A7E746CFE /* CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 784BEFDF1C0A68AF930E89DFD2CE7801 /* CollectionView.swift */; }; + A9AAC67E74F09990D6CF534B39D3C1CF /* BaseApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FAC389F16F3ED77B7F785060EE0ED2C /* BaseApp.swift */; }; + B004006E9F166949DF9E0CCAE85B3BCE /* Dismissable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6AAB15D606A9F85EAB57B0AB14DE010 /* Dismissable.swift */; }; + B6D4B7CAB78704F5FFF92A5AE4CB8B2D /* SheetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48891A9E8468981C776864CE194225FB /* SheetContext.swift */; }; BA42C86F6872AC87ADF7110F65920109 /* ShowTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */; }; + BD654CF1E7C40E8B50DE7E674958C475 /* DatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2584308D678C3173C55FBDA44780D982 /* DatePicker.swift */; }; BF6743BA40FE71C7005AEDC847FA3C1D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - C2988975AD302D5FF6488D250CBBB0F2 /* Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = D61CC0670E136F04F89113DD91D6DC40 /* Header.swift */; }; - C486ABB6EB046EC5B2B182ECC9B53377 /* Element+defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6E82BB36605AB8908E94034E0293735 /* Element+defaults.swift */; }; - CB7655F133E06F8C594315502B925A3F /* ScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB63B941375587707DC8120D0A9134BE /* ScrollView.swift */; }; - CF74AD555C2757FBCFD1337D31359BD4 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = F90F79197248FD23EC55A47A83DC7A25 /* Image.swift */; }; - D1CE514D723F1893A5F0D053EEACD0EC /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E5CC0B49220F51093ED600491DAAE7F /* Icon.swift */; }; - D4B4436A4C1DE13329D2BC018F130789 /* SystemPreferencesContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89E7E60D72EC0BF0C6581CC1E18ABFA /* SystemPreferencesContext.swift */; }; - DD6C499E277141B25C2204BE0E8606B8 /* NavBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = E426802ACFF354E34870B280D61C7581 /* NavBar.swift */; }; - DDD4D66E76DAB619C8AA40EA09E387E6 /* AlertContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4455139B69052F6E3B8AA44CFB1E3465 /* AlertContext.swift */; }; - DF694D1140E3C47529532EA7F4E6973A /* CellContaining.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4F9D70E051F67A08946A52D1764859 /* CellContaining.swift */; }; - E04F1DDE23CABCDB73F7E6CD585AD14E /* SegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AB8063DF88FBB359AC5393D7A3E50FF /* SegmentedControl.swift */; }; - E0B42CF1477C3EF4C3F5E84252CA44FC /* XCUIElement+isVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9408FECD535679A486704E71C95C40E /* XCUIElement+isVisible.swift */; }; - E1BBCC2558B99876E705C79EF528C25F /* Editable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AC84AE251E8EFACBA975B2FDAF2809 /* Editable.swift */; }; - E259FA3EB3BA2DEBCFDCD12E940A7777 /* XCUIApplicationState+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE841B85565D4AD0ABA4859EE72F277 /* XCUIApplicationState+String.swift */; }; - E42C90139F7D37C13690F81AB2BAED29 /* SheetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1109E2825435A7F93916269AF224F7E9 /* SheetContext.swift */; }; - E7A207E53E8987DB3DE8A4375EABEC52 /* TABTestKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 16CEE68DCE8D52E323C43627EF5E6E00 /* TABTestKit-dummy.m */; }; - E833729A73AC0BF6A38918EBCB6C0422 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D990AD8F8506816337D3D1C152E974E2 /* WebView.swift */; }; - E8BD5261CF14414715FEA9AFFC3907F6 /* SystemPreferencesResetScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A158B37AFCFE2FC2766ADE400A427C31 /* SystemPreferencesResetScreen.swift */; }; - EA74B561CF68CE12A544F44E8CB78F1A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */; }; - EC5A7C4C42700F9F905362B0556E72DD /* Picker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6C0203464458D138C176CC5DA6DF0EA /* Picker.swift */; }; - ED4440EF16FF71F9973E7B8460AF1CDA /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025917F2EDD3691B3F3C9D8A18E848C1 /* Sheet.swift */; }; - F0FAC3BD38D83EDAB71246342EB204F0 /* Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACDAF0CB25831A21FC773D6FE3823EFD /* Table.swift */; }; - F100E7312A5E11F33DB9340EE9828AA4 /* AppContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1CFD0BE1EA4E03A360F521506F95C77 /* AppContext.swift */; }; - F42B697127DBAFCBA46E352C9F92B569 /* systemPreferencesRootScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C56C15410FDD6C55973202E7BD51AB1 /* systemPreferencesRootScreen.swift */; }; - F65900390EE335BD4760630FE869306A /* KeyboardContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = C335DE8DB3A5121E14AEAA3DD404D8E2 /* KeyboardContext.swift */; }; - F69B96B50FE9B18430A9105FDC86A5AA /* TABTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7CB9979922414135C2E9A8B7CEBC97 /* TABTestCase.swift */; }; + CC9079089E4B03EF8868EC7082F1601C /* And.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EAA3057899DA741026ED4A26702D33 /* And.swift */; }; + D022FB0C193F2A851EE13AC71417E841 /* KeyboardContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50069DD7463E5942E19D94ED59FE3BAD /* KeyboardContext.swift */; }; + D6495DEB4B4A434E32F81B07F52D279C /* Biometrics.m in Sources */ = {isa = PBXBuildFile; fileRef = C0B00A454106FEB64D14290BEAF40AB7 /* Biometrics.m */; }; + D6B0194215C1CAE7D2D53D8C2E6C7C29 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB406E7260FAE4E46684D964E38D4DC /* TextView.swift */; }; + D71743EEB025F2B6982C40DA61381174 /* ActivitySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 956C9338D0BACFE42F4A7C80BAB7BF10 /* ActivitySheet.swift */; }; + D726A088FE90A88DAF6A0D02E9C2D4FC /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 900F03F60D5A8A2C73703876467231AE /* WebView.swift */; }; + DCA0706F287181A4BFFE7C3ACFF2F771 /* Picker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68EFD33DB9DFFDF42708DA8EC71EDC40 /* Picker.swift */; }; + DEF689964A51FCFC78DF20D0528DFE1C /* Adjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9808FCF71303D24381B18A101FDC3CC /* Adjustable.swift */; }; + E9CDAD54EFCD959D611BE38E8ADF5695 /* SecureTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95707DADF9BE89CE3D695011A4671E0F /* SecureTextField.swift */; }; + EF7B6482A60C0483315DCC1BEF93DA45 /* CGVector+Offset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE76A2F5F42B8345F5AA79300B4C164 /* CGVector+Offset.swift */; }; + F201C09543B2162BD76B8E6BCFA328DF /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EE34A033310F7EFE5E689BF8890CE06 /* Step.swift */; }; + F331C365BEE4BB07C246C533A38137FE /* Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE45CE88F3412E3B7E8FD506AEB4D8 /* Header.swift */; }; + F38A3437B54098EBE156D9BF67DFCE64 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF05CD2BFB07549EE236C027EC4E5909 /* Button.swift */; }; + F485B3D5EC28D0C37E210CFCF925FBC8 /* When.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9C40E1DED49E836724F73C2EEA5C23 /* When.swift */; }; + F9A5663C59B03A551620E61FFEC40923 /* Screen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041FF9A72E7259D2B37725303A855CB8 /* Screen.swift */; }; + FB123A2F6843ABA4138D3099F8D29681 /* SegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C5E286DDA6206AFA3772DF7364D32FA /* SegmentedControl.swift */; }; FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - FD1DB014E906D82A36EDC3EA5F4939FC /* XCTFatalFail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074592D395E1B324B941268A4BDFE494 /* XCTFatalFail.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 13AAF55A02BCEBB06015B6A2309264A3 /* PBXContainerItemProxy */ = { + 0F8450DB407E1A19D2FCA67601069326 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; remoteInfo = ShowTime; }; - D472450F21315A8F71EF32C3F3A7C706 /* PBXContainerItemProxy */ = { + 1EDCAC7E5EF16E9A6743D2D3A370789A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; - remoteInfo = ShowTime; + remoteGlobalIDString = 9C4F771642E79689CC6A0648ABEA808C; + remoteInfo = TABTestKit; }; - EFE9C2A8BD7912D5A43F3ED1A52F157E /* PBXContainerItemProxy */ = { + FD151BA8DFDC8D78FAA8F81F41C3B292 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9C4F771642E79689CC6A0648ABEA808C; - remoteInfo = TABTestKit; + remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; + remoteInfo = ShowTime; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 025917F2EDD3691B3F3C9D8A18E848C1 /* Sheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Sheet.swift; sourceTree = ""; }; - 04EF71556DC643FB444C9FD8A2D2273B /* Scrollable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scrollable.swift; sourceTree = ""; }; - 074592D395E1B324B941268A4BDFE494 /* XCTFatalFail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = XCTFatalFail.swift; sourceTree = ""; }; - 0BAE1DB9682A76CE1F7D25EDF50954B4 /* Alert.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = ""; }; - 1109E2825435A7F93916269AF224F7E9 /* SheetContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SheetContext.swift; sourceTree = ""; }; - 1157F417976B95B88578E86BABD1D402 /* BiometricsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BiometricsContext.swift; sourceTree = ""; }; + 041FF9A72E7259D2B37725303A855CB8 /* Screen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = ""; }; + 0630A033211DB096B3D975C0A8A6D605 /* Icon.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; + 0718F5AABDDB132CECFD6B1F67949777 /* AppContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppContext.swift; sourceTree = ""; }; + 0B3A68D3EFAF29500090F023538224C0 /* Table.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Table.swift; sourceTree = ""; }; + 0B95B6E9FBADB3E4746E8709F9261BD3 /* Scrollable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scrollable.swift; sourceTree = ""; }; + 113B2F6486B7E7BC2CB41EC1FDFDD7F2 /* Given.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Given.swift; sourceTree = ""; }; 14146CA31421B9CAE5A93C48F6E9FFAF /* Pods-TABTestKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example.debug.xcconfig"; sourceTree = ""; }; - 142A5D14FCDDB44F1359E507ADC023E4 /* XCUIElement+hasKeyboardFocus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+hasKeyboardFocus.swift"; sourceTree = ""; }; - 149CAC8C0AE1DBCAC92257002D333344 /* View.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; - 1625121B576A2F260FF03FA15D2F2915 /* TABTestKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TABTestKit.modulemap; sourceTree = ""; }; - 16CEE68DCE8D52E323C43627EF5E6E00 /* TABTestKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TABTestKit-dummy.m"; sourceTree = ""; }; - 16FF8D7D264C777C17EC8E3826E41FC0 /* SystemPreferencesGeneralScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesGeneralScreen.swift; sourceTree = ""; }; 17AE207B2FD67E1096C542744391C322 /* Pods-TABTestKit_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-acknowledgements.plist"; sourceTree = ""; }; - 1C956BC753D42DFFEAB22C6711757FDE /* String+HumanReadableString.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "String+HumanReadableString.swift"; sourceTree = ""; }; + 1C7797BE5699830440539E71C37A1A71 /* XCUIElement+isVisible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+isVisible.swift"; sourceTree = ""; }; 1CB830EB632DA8DED42D4E33C4E59DD9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh"; sourceTree = ""; }; - 1DCACD99A57DD7326886398073E8D0F0 /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Completable.swift; sourceTree = ""; }; - 1F698463C0D1F23C6A08AA0370CACC2C /* Scenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scenario.swift; sourceTree = ""; }; - 246C5312AD287517A78640A4FAF48421 /* ShowTime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ShowTime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1D0168AF849134D16100C7BFEB80A23C /* XCUIElement+wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+wait.swift"; sourceTree = ""; }; + 2009C7FC8E7E04E8F8860CD852C1E01A /* SystemPreferencesContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesContext.swift; sourceTree = ""; }; + 246C5312AD287517A78640A4FAF48421 /* ShowTime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ShowTime.framework; path = ShowTime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2584308D678C3173C55FBDA44780D982 /* DatePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DatePicker.swift; sourceTree = ""; }; + 26AA4B2AF62940849952DF099E1C16D2 /* Scenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Scenario.swift; sourceTree = ""; }; + 2754DC9C52010CAD0BADE97409D9EF8F /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 28061D8B4A5060F09E692D4BC586713B /* Pods-TABTestKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TABTestKit_Example-dummy.m"; sourceTree = ""; }; - 29DD4BF40C3210946B255EA0753A2C50 /* TABTestKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.release.xcconfig; sourceTree = ""; }; - 2A1977697003E1D2D4081EBD3C88A058 /* Label.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; - 2AB8063DF88FBB359AC5393D7A3E50FF /* SegmentedControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; - 2C56C15410FDD6C55973202E7BD51AB1 /* systemPreferencesRootScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = systemPreferencesRootScreen.swift; sourceTree = ""; }; - 2E97F8EAABEDB0295C8BBA3ADB4A81C2 /* Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 2F3F765734217A16E21E8B1C09B7FE80 /* Array+Safe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Array+Safe.swift"; sourceTree = ""; }; - 345673EC98326958FDD832E970FBC0D5 /* Safari.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Safari.swift; sourceTree = ""; }; - 398CBC48FD3DC75735CF21DC994303C1 /* PageIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PageIndicator.swift; sourceTree = ""; }; - 4426932FB43D12FD3B25C45B0D3DB5E3 /* Biometrics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Biometrics.h; sourceTree = ""; }; - 4455139B69052F6E3B8AA44CFB1E3465 /* AlertContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AlertContext.swift; sourceTree = ""; }; - 4732CB370809DB01C84C92F67E78EBF3 /* SystemPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferences.swift; sourceTree = ""; }; - 480A21749332DE8E5EA766E94E3DF705 /* Cell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = ""; }; - 4CE841B85565D4AD0ABA4859EE72F277 /* XCUIApplicationState+String.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIApplicationState+String.swift"; sourceTree = ""; }; - 516836C45DBE97859AF1DD3AC2CD4B01 /* Pods_TABTestKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TABTestKit_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 51B80733D2F02DAC42E2CE0CAC135978 /* App.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; + 2AE76A2F5F42B8345F5AA79300B4C164 /* CGVector+Offset.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGVector+Offset.swift"; sourceTree = ""; }; + 2BEFAF4D17AA36C8FF4F731C1A8CA413 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = ""; }; + 2E97F8EAABEDB0295C8BBA3ADB4A81C2 /* Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TABTestKit_Example_TABTestKit_ExampleUITests.framework; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3041A2EF88AEC543518FA21A2216920A /* NavigationContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavigationContext.swift; sourceTree = ""; }; + 332472DFF22A7E51144EC70EA1E110EB /* TABTestKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TABTestKit.modulemap; sourceTree = ""; }; + 345FC0348148646DBEDE0FBDACE559C2 /* SystemPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferences.swift; sourceTree = ""; }; + 34EAA3057899DA741026ED4A26702D33 /* And.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = And.swift; sourceTree = ""; }; + 380747A33CBA0FF82E8CEB03411E427C /* Cell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = ""; }; + 38AE45CE88F3412E3B7E8FD506AEB4D8 /* Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Header.swift; sourceTree = ""; }; + 3A2AC58F03DE192BC9986F7F70005C60 /* SystemPreferencesGeneralScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesGeneralScreen.swift; sourceTree = ""; }; + 3FAC389F16F3ED77B7F785060EE0ED2C /* BaseApp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseApp.swift; sourceTree = ""; }; + 42BDF21DA60D81C5D0CBDD48A018614F /* String+HumanReadableString.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "String+HumanReadableString.swift"; sourceTree = ""; }; + 466A54469B45DE7D4F8490000DC01CD2 /* TextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; + 4783CAC79F17D1896489A64424F9BD48 /* NormalizedCoordinate+Locations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NormalizedCoordinate+Locations.swift"; sourceTree = ""; }; + 48891A9E8468981C776864CE194225FB /* SheetContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SheetContext.swift; sourceTree = ""; }; + 50069DD7463E5942E19D94ED59FE3BAD /* KeyboardContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardContext.swift; sourceTree = ""; }; + 50C29E65C9C1D4879633ECA14F93BF4F /* InteractionContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionContext.swift; sourceTree = ""; }; + 516836C45DBE97859AF1DD3AC2CD4B01 /* Pods_TABTestKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TABTestKit_Example.framework; path = "Pods-TABTestKit_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 52B50C46CCAEFEE409E73BB0945A1386 /* XCUIElement+hasKeyboardFocus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+hasKeyboardFocus.swift"; sourceTree = ""; }; 549B858328CB2EF8360076242052506E /* Pods-TABTestKit_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TABTestKit_Example.modulemap"; sourceTree = ""; }; - 574CE0D3F84DEB81697CA498206D4AAD /* Stepper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Stepper.swift; sourceTree = ""; }; - 57B0491A64EEB163590B1DFA92FB3428 /* Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Keyboard.swift; sourceTree = ""; }; - 5ABB96D352A83B9EBC717088FEB22046 /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; - 5C817F0E0208382B131E5FFB430F8A17 /* TABTestKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TABTestKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54BDB8F76CB7BFE0C528BEBE724823DE /* BiometricsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BiometricsContext.swift; sourceTree = ""; }; + 58FBC2649A9FA1E16EB703D8D700AC35 /* Attributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Attributes.swift; sourceTree = ""; }; + 5B459502363B50DE1504A1E3E310CEE0 /* XCUIApplicationState+String.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIApplicationState+String.swift"; sourceTree = ""; }; + 5C817F0E0208382B131E5FFB430F8A17 /* TABTestKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TABTestKit.framework; path = TABTestKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 608B1CF229A9CA80D894BDF978BDE92E /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = ""; }; - 65C5769C6582D788F3CF9ED2066A33E3 /* NormalizedCoordinate+Locations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NormalizedCoordinate+Locations.swift"; sourceTree = ""; }; - 65ED5E70523A93CB6BBE413726DAAACA /* InteractionContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionContext.swift; sourceTree = ""; }; - 6722333D3F5D59F34131D31D1D1FE676 /* Element.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Element.swift; sourceTree = ""; }; + 5F854565414111D8828F801C8ED21C89 /* Safari.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Safari.swift; sourceTree = ""; }; + 646A34A102CAF90BBB108BA83A1DFDF4 /* PageIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PageIndicator.swift; sourceTree = ""; }; + 687E6C1C097B8F4536E788A429F084E3 /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; + 6890CBB16D74D0A0539454707E9E7452 /* Biometrics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Biometrics.h; sourceTree = ""; }; + 68EFD33DB9DFFDF42708DA8EC71EDC40 /* Picker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Picker.swift; sourceTree = ""; }; 69152FFA4489AC24B45BCE5208B3B41A /* ShowTime-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ShowTime-umbrella.h"; sourceTree = ""; }; + 6C94641B67764C3DA9DA9C1D38EE6BBC /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Completable.swift; sourceTree = ""; }; 6E79134F82F3A8D58969B44D7F169338 /* Pods-TABTestKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TABTestKit_Example-acknowledgements.markdown"; sourceTree = ""; }; - 70A6CCC96873C0AA1B670BC851D8A52D /* TABTestKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = TABTestKit.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 73619FBD640A527E63538013823ED97D /* BaseApp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BaseApp.swift; sourceTree = ""; }; - 74143AF02ECD026417803851FBC88264 /* XCUIElement+wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+wait.swift"; sourceTree = ""; }; - 7A4E2FD9EA293CEA0430ECEF163A494D /* Dismissable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Dismissable.swift; sourceTree = ""; }; - 7AB6E7B255089A991E8E03C689B549DF /* TABTestKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-umbrella.h"; sourceTree = ""; }; - 7E5CC0B49220F51093ED600491DAAE7F /* Icon.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; - 7F90C9131D671249054E927E4DDFA458 /* Biometrics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Biometrics.m; sourceTree = ""; }; - 83AC84AE251E8EFACBA975B2FDAF2809 /* Editable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Editable.swift; sourceTree = ""; }; - 8476933083A60F51BA859B1D618C353C /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Step.swift; sourceTree = ""; }; - 8E067CAFBFC1166DFBB2271399EC2CFD /* CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionView.swift; sourceTree = ""; }; + 6EE34A033310F7EFE5E689BF8890CE06 /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Step.swift; sourceTree = ""; }; + 70DA71C282A135410F17F6140C2C5012 /* TABTestKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.debug.xcconfig; sourceTree = ""; }; + 730A5800CBEF9A14270AA853398D4322 /* Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Keyboard.swift; sourceTree = ""; }; + 77A2C928606797CDABD2988B90D7B51D /* TABTestKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.release.xcconfig; sourceTree = ""; }; + 784BEFDF1C0A68AF930E89DFD2CE7801 /* CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionView.swift; sourceTree = ""; }; + 7C5E286DDA6206AFA3772DF7364D32FA /* SegmentedControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; + 7F1ED1716CD49E60E25B156392276E0D /* App.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; + 873D8C8F533183A9CC0FDB0584A0D3A6 /* Array+Safe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Array+Safe.swift"; sourceTree = ""; }; + 894BAC331D24350EAB08F83FF6E0BADB /* TABTestKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-prefix.pch"; sourceTree = ""; }; + 896F504662A182450FFE70188319673F /* TABTestKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-umbrella.h"; sourceTree = ""; }; + 89D415A66DE217B3A58DD8458B849955 /* XCUIDevice+frame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIDevice+frame.swift"; sourceTree = ""; }; + 8DB2A169534C4831C445981DF3A2DA5C /* NavBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavBar.swift; sourceTree = ""; }; + 900F03F60D5A8A2C73703876467231AE /* WebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; + 90FC842068CBCA1897B40C5530D71B73 /* Stepper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Stepper.swift; sourceTree = ""; }; 91B1EB1FAB79CE231C85712DE4D31CC0 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.plist"; sourceTree = ""; }; - 93519F3E6A3BA42F4B758A4E518470B7 /* TABTestKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TABTestKit-prefix.pch"; sourceTree = ""; }; - 948AF33A978CC268F1320B0402AFF101 /* TabBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; }; - 953A3688CF885118CDDF66A466CC614B /* Button.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; - 954F7DC72FBBE48914CB5651386710A8 /* Tappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Tappable.swift; sourceTree = ""; }; + 956C9338D0BACFE42F4A7C80BAB7BF10 /* ActivitySheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ActivitySheet.swift; sourceTree = ""; }; + 95707DADF9BE89CE3D695011A4671E0F /* SecureTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SecureTextField.swift; sourceTree = ""; }; 965A292F186CF36A47FF8AB1CADE1B85 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig"; sourceTree = ""; }; 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m"; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9ED8581DAD6ED00A41AE1E536EEAD58B /* StepAction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StepAction.swift; sourceTree = ""; }; + 9BA1F3F52CB90CFB17E58972997596A2 /* Biometrics-Bridging-Header.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Biometrics-Bridging-Header.h"; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9FEFF9CD73B2D6723ED60BBDD46577CD /* Pods-TABTestKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TABTestKit_Example-umbrella.h"; sourceTree = ""; }; - A0E305787E9DB1C4D9481DC5BD801F34 /* SecureTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SecureTextField.swift; sourceTree = ""; }; - A158B37AFCFE2FC2766ADE400A427C31 /* SystemPreferencesResetScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesResetScreen.swift; sourceTree = ""; }; A3F9B3AEE6873539F9B3FD0F64E7DB43 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.markdown"; sourceTree = ""; }; - A89E7E60D72EC0BF0C6581CC1E18ABFA /* SystemPreferencesContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesContext.swift; sourceTree = ""; }; + A6AAB15D606A9F85EAB57B0AB14DE010 /* Dismissable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Dismissable.swift; sourceTree = ""; }; AA47AB426A72CF612E6CDF50B0E91C8F /* ShowTime.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ShowTime.debug.xcconfig; sourceTree = ""; }; AA9FC38AC03409CABA3E4DD246E3CF1C /* ShowTime-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ShowTime-prefix.pch"; sourceTree = ""; }; AB4E151C064820753E3685012C75D924 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist"; sourceTree = ""; }; - ACDAF0CB25831A21FC773D6FE3823EFD /* Table.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Table.swift; sourceTree = ""; }; - AD7CB9979922414135C2E9A8B7CEBC97 /* TABTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TABTestCase.swift; path = TABTestKit/Classes/TABTestCase.swift; sourceTree = ""; }; ADB4763ABC911105EE431BA516439FE1 /* ShowTime.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ShowTime.modulemap; sourceTree = ""; }; - AE4F9D70E051F67A08946A52D1764859 /* CellContaining.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CellContaining.swift; sourceTree = ""; }; + AEFA603E0C79DEC5284F64B5E074405C /* Slider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Slider.swift; sourceTree = ""; }; + AF05CD2BFB07549EE236C027EC4E5909 /* Button.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; AFD57256DAD4C8414BD38FD34982C7B0 /* Pods-TABTestKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example.release.xcconfig"; sourceTree = ""; }; - B06054F30FE3F234917DE45221C2E54F /* Biometrics-Bridging-Header.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Biometrics-Bridging-Header.h"; sourceTree = ""; }; - B3019D829E33FE2E46E5E7929D3EC25E /* TABTestKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TABTestKit.debug.xcconfig; sourceTree = ""; }; - C0788D6F9F3512AE4BDA244B4DCDF26E /* ValueRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ValueRepresentable.swift; sourceTree = ""; }; - C2468B3A27C658D13CF927D2A4C8AD02 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - C335DE8DB3A5121E14AEAA3DD404D8E2 /* KeyboardContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KeyboardContext.swift; sourceTree = ""; }; + B0CBB594319A69C908CD4647034A573F /* Label.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; + B4AC14A4EB99CA218EC114C4CCBF61B5 /* TABTestKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = TABTestKit.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + B54A4D79DB812556238900425435AC6D /* Editable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Editable.swift; sourceTree = ""; }; + B5DFD8B4AD1A37548984761B52E84606 /* ScrollableScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollableScreen.swift; sourceTree = ""; }; + BDC3DE5A05803025992E807A9B620C65 /* Refreshable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Refreshable.swift; sourceTree = ""; }; + BDCA3B772A48D4211760F912E0F520AD /* Alert.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = ""; }; + C0B00A454106FEB64D14290BEAF40AB7 /* Biometrics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Biometrics.m; sourceTree = ""; }; + C15A251953084904192BEF363CC50974 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; C354231844F21D916AF8E0D9E0F587FF /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap"; sourceTree = ""; }; - C4DAB7171AB13E8D58EC9C015631FC17 /* DatePicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DatePicker.swift; sourceTree = ""; }; C6AFBB671D10E6AEF0786D8E3E16BDE4 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h"; sourceTree = ""; }; + C9808FCF71303D24381B18A101FDC3CC /* Adjustable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Adjustable.swift; sourceTree = ""; }; CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - CAE5BB42BB2BF6E722362118945E72AC /* TABTestKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TABTestKit-Info.plist"; sourceTree = ""; }; + CAA0B8A67B63D67838AAAC466C1416DD /* TABTestKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TABTestKit-Info.plist"; sourceTree = ""; }; CBA3199C63C53E992A3F26F5ADCBB639 /* Pods-TABTestKit_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TABTestKit_Example-Info.plist"; sourceTree = ""; }; - D01F16C16CB3E54AB9894D0EBBC49827 /* TextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; - D1725A9931E08FEB9586AAE872DCD810 /* TextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; - D1CFD0BE1EA4E03A360F521506F95C77 /* AppContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppContext.swift; sourceTree = ""; }; - D44637C436760778449FA5C2D990AD02 /* NavigationContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavigationContext.swift; sourceTree = ""; }; - D5A4630312862B2311E0A09F613CCE9C /* CGVector+Offset.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CGVector+Offset.swift"; sourceTree = ""; }; - D61CC0670E136F04F89113DD91D6DC40 /* Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Header.swift; sourceTree = ""; }; - D6C0203464458D138C176CC5DA6DF0EA /* Picker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Picker.swift; sourceTree = ""; }; - D990AD8F8506816337D3D1C152E974E2 /* WebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; - DCDEA02B41E3CFBF3C4F834B67D9C8B1 /* ActivitySheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ActivitySheet.swift; sourceTree = ""; }; + CD498F8C31BAC913FCFE2CA65CCA10A0 /* Then.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = ""; }; + CD6AFCEC547D4081C1DDACB4A91B07FF /* Sheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Sheet.swift; sourceTree = ""; }; + CDB406E7260FAE4E46684D964E38D4DC /* TextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; + D31AB25725A3DF749752F4B423D38992 /* systemPreferencesRootScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = systemPreferencesRootScreen.swift; sourceTree = ""; }; + D55787F6DF817B75F3CAFE58D2C75A03 /* XCTFatalFail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = XCTFatalFail.swift; sourceTree = ""; }; + D788703B37BCD0B9B3485EEF292754C0 /* TABTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TABTestCase.swift; path = TABTestKit/Classes/TABTestCase.swift; sourceTree = ""; }; + DA58C9CF8C3C1E9778E23BB340E830B7 /* Tappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Tappable.swift; sourceTree = ""; }; + DDED6BADF920ACCC2DD498A47F99D3EE /* Element+defaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Element+defaults.swift"; sourceTree = ""; }; DF441583F13AEDF6DF852C5354F264E1 /* ShowTime-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ShowTime-Info.plist"; sourceTree = ""; }; - E426802ACFF354E34870B280D61C7581 /* NavBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NavBar.swift; sourceTree = ""; }; - E5D6DC8DEB8AFE62ED3A44D51A6198C0 /* ScrollableScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollableScreen.swift; sourceTree = ""; }; - E814D75ED12AC6A3033B80BD5B76CA9B /* Screen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = ""; }; - E9408FECD535679A486704E71C95C40E /* XCUIElement+isVisible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+isVisible.swift"; sourceTree = ""; }; + E0E9E5A8C40AE9FA6D056025FD256009 /* AlertContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AlertContext.swift; sourceTree = ""; }; + E68F10F35B448B759B075167F209FF8B /* SystemPreferencesResetScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesResetScreen.swift; sourceTree = ""; }; + E9070B6D58C73B757448186A920E2623 /* StepAction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StepAction.swift; sourceTree = ""; }; + E95305EAAE76580C42BAE10B8BA594A4 /* View.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShowTime.swift; path = Sources/ShowTime/ShowTime.swift; sourceTree = ""; }; - EB63B941375587707DC8120D0A9134BE /* ScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollView.swift; sourceTree = ""; }; + EAF2F5E57EDB77B25913C06A64C65465 /* CellContaining.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CellContaining.swift; sourceTree = ""; }; + EB22A733B5F65AB1DBCD7FAB843A0565 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; EC7677F7A126781D8591BE7C185D48F7 /* Pods-TABTestKit_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TABTestKit_Example-frameworks.sh"; sourceTree = ""; }; - EF232CBC0BB1AA412ED181CA70971C93 /* Slider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Slider.swift; sourceTree = ""; }; + EDC62D7EDE856ADD24BE0C6F22E6A19D /* ScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScrollView.swift; sourceTree = ""; }; + EE9C40E1DED49E836724F73C2EEA5C23 /* When.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = When.swift; sourceTree = ""; }; F094F44DD0301CC76E1365673D3FCF9C /* ShowTime-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ShowTime-dummy.m"; sourceTree = ""; }; - F29FD0CF98ED9351CA4E1F517837FD7A /* Attributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Attributes.swift; sourceTree = ""; }; - F3B14016D4E1EE6F917A37F9A571B4B1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - F6E82BB36605AB8908E94034E0293735 /* Element+defaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Element+defaults.swift"; sourceTree = ""; }; - F6E8DB302D57F50C5B2FAC9D4278B4EA /* XCUIDevice+frame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIDevice+frame.swift"; sourceTree = ""; }; - F90F79197248FD23EC55A47A83DC7A25 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; + F6261BD34529E203C86AE451C51562B5 /* Springboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Springboard.swift; sourceTree = ""; }; + F71C4DC4C2C6BA7086DC35863AD1C5C9 /* Element.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Element.swift; sourceTree = ""; }; + F948F57E6E72DBC56EDD37D109BA110B /* TABTestKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TABTestKit-dummy.m"; sourceTree = ""; }; FD03AA75DD58014781A38E023C12CD42 /* ShowTime.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ShowTime.release.xcconfig; sourceTree = ""; }; - FD3EB838D87679B91E046CA0F6674B73 /* Springboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Springboard.swift; sourceTree = ""; }; + FD146FCEC24A82B51539C1914173EB08 /* TabBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = ""; }; FDC54A8EC562A73143E238094E80179D /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig"; sourceTree = ""; }; - FF456B5F34BD317666B460FD66B3EACE /* Refreshable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Refreshable.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -258,20 +266,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 4F9595A3114B75645FD89BDB2DA0ED56 /* Frameworks */ = { + 85DE561D3E4964DDC1F5E827216CDF49 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E268691E9DB58B1480521F5DA485F6D /* Foundation.framework in Frameworks */, - EA74B561CF68CE12A544F44E8CB78F1A /* XCTest.framework in Frameworks */, + BF6743BA40FE71C7005AEDC847FA3C1D /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 85DE561D3E4964DDC1F5E827216CDF49 /* Frameworks */ = { + C499C033094F22AC6F9F3439B3A78F48 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF6743BA40FE71C7005AEDC847FA3C1D /* Foundation.framework in Frameworks */, + 7FA42C268DA81109FFC693C6D8AB4F28 /* Foundation.framework in Frameworks */, + 402FF89F68EA5737BB680809553A0850 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -284,6 +292,7 @@ EAF2F2B8E583A5D847949453BAC20C6B /* ShowTime.swift */, 3AD53452E6F9B27B718A63F5668EEEAC /* Support Files */, ); + name = ShowTime; path = ShowTime; sourceTree = ""; }; @@ -298,19 +307,19 @@ 18BB3C90BDF1A5F1D336E77B09EBB1F2 /* Development Pods */ = { isa = PBXGroup; children = ( - F0D12E64DC9ED4EE71E47A0286809539 /* TABTestKit */, + 418B47577E603804A3906B1930CEDF43 /* TABTestKit */, ); name = "Development Pods"; sourceTree = ""; }; - 197CAB34DE6E8DF49260A75273320BBE /* Apps */ = { + 25F43879A86F27E75D8212994D0DDF55 /* Apps */ = { isa = PBXGroup; children = ( - 51B80733D2F02DAC42E2CE0CAC135978 /* App.swift */, - 73619FBD640A527E63538013823ED97D /* BaseApp.swift */, - 345673EC98326958FDD832E970FBC0D5 /* Safari.swift */, - FD3EB838D87679B91E046CA0F6674B73 /* Springboard.swift */, - 4732CB370809DB01C84C92F67E78EBF3 /* SystemPreferences.swift */, + 7F1ED1716CD49E60E25B156392276E0D /* App.swift */, + 3FAC389F16F3ED77B7F785060EE0ED2C /* BaseApp.swift */, + 5F854565414111D8828F801C8ED21C89 /* Safari.swift */, + F6261BD34529E203C86AE451C51562B5 /* Springboard.swift */, + 345FC0348148646DBEDE0FBDACE559C2 /* SystemPreferences.swift */, ); name = Apps; path = TABTestKit/Classes/Apps; @@ -344,16 +353,6 @@ path = "Target Support Files/Pods-TABTestKit_Example"; sourceTree = ""; }; - 3017907910E919139755598F963083B2 /* BDD */ = { - isa = PBXGroup; - children = ( - 1F698463C0D1F23C6A08AA0370CACC2C /* Scenario.swift */, - 8476933083A60F51BA859B1D618C353C /* Step.swift */, - ); - name = BDD; - path = TABTestKit/Classes/BDD; - sourceTree = ""; - }; 3AD53452E6F9B27B718A63F5668EEEAC /* Support Files */ = { isa = PBXGroup; children = ( @@ -369,214 +368,220 @@ path = "../Target Support Files/ShowTime"; sourceTree = ""; }; - 420093D9ACA8FFDEE7BE734AD8A668CA /* Extensions */ = { + 3D7477DF53964A1299983B636D659A87 /* include */ = { isa = PBXGroup; children = ( - 2F3F765734217A16E21E8B1C09B7FE80 /* Array+Safe.swift */, - D5A4630312862B2311E0A09F613CCE9C /* CGVector+Offset.swift */, - F6E82BB36605AB8908E94034E0293735 /* Element+defaults.swift */, - 65C5769C6582D788F3CF9ED2066A33E3 /* NormalizedCoordinate+Locations.swift */, - 1C956BC753D42DFFEAB22C6711757FDE /* String+HumanReadableString.swift */, - 074592D395E1B324B941268A4BDFE494 /* XCTFatalFail.swift */, - 4CE841B85565D4AD0ABA4859EE72F277 /* XCUIApplicationState+String.swift */, - F6E8DB302D57F50C5B2FAC9D4278B4EA /* XCUIDevice+frame.swift */, - 142A5D14FCDDB44F1359E507ADC023E4 /* XCUIElement+hasKeyboardFocus.swift */, - E9408FECD535679A486704E71C95C40E /* XCUIElement+isVisible.swift */, - 74143AF02ECD026417803851FBC88264 /* XCUIElement+wait.swift */, + 6890CBB16D74D0A0539454707E9E7452 /* Biometrics.h */, + 9BA1F3F52CB90CFB17E58972997596A2 /* Biometrics-Bridging-Header.h */, ); - name = Extensions; - path = TABTestKit/Classes/Extensions; + name = include; + path = include; sourceTree = ""; }; - 79C96A6B763094E03ACC52E63989705E /* Pod */ = { + 418B47577E603804A3906B1930CEDF43 /* TABTestKit */ = { isa = PBXGroup; children = ( - C2468B3A27C658D13CF927D2A4C8AD02 /* LICENSE */, - F3B14016D4E1EE6F917A37F9A571B4B1 /* README.md */, - 70A6CCC96873C0AA1B670BC851D8A52D /* TABTestKit.podspec */, + D788703B37BCD0B9B3485EEF292754C0 /* TABTestCase.swift */, + 25F43879A86F27E75D8212994D0DDF55 /* Apps */, + 6F91ED33E8158A19D56CDC5E6F2728D6 /* BDD */, + 4FB51A89FDD05F4F958BF7B27CEDA3EB /* Biometrics */, + 6E75D83EB62D21A7B5C12765E7893628 /* Contexts */, + 9102BC572AA227E692D43C6815F85B7F /* Elements */, + 8FD612D0E88F02CF51338D7620D76B23 /* Extensions */, + 68D7A34B13CDB4A0B14CB81493132BFA /* Pod */, + FD80144C5867EA0715CEB75CF6EC532C /* Protocols */, + 8D865C201C3394D153E36106F612A826 /* Screens */, + BE666939CBCE95405776C8EC8CD969EC /* Support Files */, ); - name = Pod; + name = TABTestKit; + path = ../..; sourceTree = ""; }; - 7D6290DA3805378A45F75B754AE5C27A /* Protocols */ = { + 4FB51A89FDD05F4F958BF7B27CEDA3EB /* Biometrics */ = { isa = PBXGroup; children = ( - 5ABB96D352A83B9EBC717088FEB22046 /* Adjustable.swift */, - AE4F9D70E051F67A08946A52D1764859 /* CellContaining.swift */, - 1DCACD99A57DD7326886398073E8D0F0 /* Completable.swift */, - 7A4E2FD9EA293CEA0430ECEF163A494D /* Dismissable.swift */, - 83AC84AE251E8EFACBA975B2FDAF2809 /* Editable.swift */, - 6722333D3F5D59F34131D31D1D1FE676 /* Element.swift */, - FF456B5F34BD317666B460FD66B3EACE /* Refreshable.swift */, - E814D75ED12AC6A3033B80BD5B76CA9B /* Screen.swift */, - 04EF71556DC643FB444C9FD8A2D2273B /* Scrollable.swift */, - E5D6DC8DEB8AFE62ED3A44D51A6198C0 /* ScrollableScreen.swift */, - 954F7DC72FBBE48914CB5651386710A8 /* Tappable.swift */, - C0788D6F9F3512AE4BDA244B4DCDF26E /* ValueRepresentable.swift */, + C0B00A454106FEB64D14290BEAF40AB7 /* Biometrics.m */, + 3D7477DF53964A1299983B636D659A87 /* include */, ); - name = Protocols; - path = TABTestKit/Classes/Protocols; + name = Biometrics; + path = TABTestKit/Classes/Biometrics; sourceTree = ""; }; - 7F9009F1182E3BDED6F366005188C8B5 /* Pods */ = { + 68D7A34B13CDB4A0B14CB81493132BFA /* Pod */ = { isa = PBXGroup; children = ( - 0EAD851B593C7D383A5B9F66278D5202 /* ShowTime */, + 2754DC9C52010CAD0BADE97409D9EF8F /* LICENSE */, + EB22A733B5F65AB1DBCD7FAB843A0565 /* README.md */, + B4AC14A4EB99CA218EC114C4CCBF61B5 /* TABTestKit.podspec */, ); - name = Pods; + name = Pod; sourceTree = ""; }; - 974814B39C0012DECD183BBB91B32103 /* iOS */ = { + 6E75D83EB62D21A7B5C12765E7893628 /* Contexts */ = { isa = PBXGroup; children = ( - CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */, - 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */, + E0E9E5A8C40AE9FA6D056025FD256009 /* AlertContext.swift */, + 0718F5AABDDB132CECFD6B1F67949777 /* AppContext.swift */, + 54BDB8F76CB7BFE0C528BEBE724823DE /* BiometricsContext.swift */, + 50C29E65C9C1D4879633ECA14F93BF4F /* InteractionContext.swift */, + 50069DD7463E5942E19D94ED59FE3BAD /* KeyboardContext.swift */, + 3041A2EF88AEC543518FA21A2216920A /* NavigationContext.swift */, + 48891A9E8468981C776864CE194225FB /* SheetContext.swift */, + 2009C7FC8E7E04E8F8860CD852C1E01A /* SystemPreferencesContext.swift */, + CC9B35B34D79D5AFEBFF974FD686B687 /* Action */, ); - name = iOS; + name = Contexts; + path = TABTestKit/Classes/Contexts; sourceTree = ""; }; - AB2C2DE4B3E4940BA585720CBECFA311 /* Elements */ = { + 6F91ED33E8158A19D56CDC5E6F2728D6 /* BDD */ = { isa = PBXGroup; children = ( - DCDEA02B41E3CFBF3C4F834B67D9C8B1 /* ActivitySheet.swift */, - 0BAE1DB9682A76CE1F7D25EDF50954B4 /* Alert.swift */, - F29FD0CF98ED9351CA4E1F517837FD7A /* Attributes.swift */, - 953A3688CF885118CDDF66A466CC614B /* Button.swift */, - 480A21749332DE8E5EA766E94E3DF705 /* Cell.swift */, - 8E067CAFBFC1166DFBB2271399EC2CFD /* CollectionView.swift */, - C4DAB7171AB13E8D58EC9C015631FC17 /* DatePicker.swift */, - D61CC0670E136F04F89113DD91D6DC40 /* Header.swift */, - 7E5CC0B49220F51093ED600491DAAE7F /* Icon.swift */, - F90F79197248FD23EC55A47A83DC7A25 /* Image.swift */, - 57B0491A64EEB163590B1DFA92FB3428 /* Keyboard.swift */, - 2A1977697003E1D2D4081EBD3C88A058 /* Label.swift */, - E426802ACFF354E34870B280D61C7581 /* NavBar.swift */, - 398CBC48FD3DC75735CF21DC994303C1 /* PageIndicator.swift */, - D6C0203464458D138C176CC5DA6DF0EA /* Picker.swift */, - EB63B941375587707DC8120D0A9134BE /* ScrollView.swift */, - A0E305787E9DB1C4D9481DC5BD801F34 /* SecureTextField.swift */, - 2AB8063DF88FBB359AC5393D7A3E50FF /* SegmentedControl.swift */, - 025917F2EDD3691B3F3C9D8A18E848C1 /* Sheet.swift */, - EF232CBC0BB1AA412ED181CA70971C93 /* Slider.swift */, - 574CE0D3F84DEB81697CA498206D4AAD /* Stepper.swift */, - 608B1CF229A9CA80D894BDF978BDE92E /* Switch.swift */, - 948AF33A978CC268F1320B0402AFF101 /* TabBar.swift */, - ACDAF0CB25831A21FC773D6FE3823EFD /* Table.swift */, - D01F16C16CB3E54AB9894D0EBBC49827 /* TextField.swift */, - D1725A9931E08FEB9586AAE872DCD810 /* TextView.swift */, - 149CAC8C0AE1DBCAC92257002D333344 /* View.swift */, - D990AD8F8506816337D3D1C152E974E2 /* WebView.swift */, + 34EAA3057899DA741026ED4A26702D33 /* And.swift */, + 113B2F6486B7E7BC2CB41EC1FDFDD7F2 /* Given.swift */, + 26AA4B2AF62940849952DF099E1C16D2 /* Scenario.swift */, + 6EE34A033310F7EFE5E689BF8890CE06 /* Step.swift */, + CD498F8C31BAC913FCFE2CA65CCA10A0 /* Then.swift */, + EE9C40E1DED49E836724F73C2EEA5C23 /* When.swift */, ); - name = Elements; - path = TABTestKit/Classes/Elements; + name = BDD; + path = TABTestKit/Classes/BDD; sourceTree = ""; }; - AEAE73BC79500A571690DECAEFC8A418 /* Contexts */ = { + 7F9009F1182E3BDED6F366005188C8B5 /* Pods */ = { isa = PBXGroup; children = ( - 4455139B69052F6E3B8AA44CFB1E3465 /* AlertContext.swift */, - D1CFD0BE1EA4E03A360F521506F95C77 /* AppContext.swift */, - 1157F417976B95B88578E86BABD1D402 /* BiometricsContext.swift */, - 65ED5E70523A93CB6BBE413726DAAACA /* InteractionContext.swift */, - C335DE8DB3A5121E14AEAA3DD404D8E2 /* KeyboardContext.swift */, - D44637C436760778449FA5C2D990AD02 /* NavigationContext.swift */, - 1109E2825435A7F93916269AF224F7E9 /* SheetContext.swift */, - A89E7E60D72EC0BF0C6581CC1E18ABFA /* SystemPreferencesContext.swift */, - EF63F0AB3D126E8F7650F9D277024049 /* Action */, + 0EAD851B593C7D383A5B9F66278D5202 /* ShowTime */, ); - name = Contexts; - path = TABTestKit/Classes/Contexts; + name = Pods; sourceTree = ""; }; - BF4BFAF140349307273B1343616A213B /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests */ = { + 8D865C201C3394D153E36106F612A826 /* Screens */ = { isa = PBXGroup; children = ( - C354231844F21D916AF8E0D9E0F587FF /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap */, - A3F9B3AEE6873539F9B3FD0F64E7DB43 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.markdown */, - 91B1EB1FAB79CE231C85712DE4D31CC0 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.plist */, - 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */, - 1CB830EB632DA8DED42D4E33C4E59DD9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh */, - AB4E151C064820753E3685012C75D924 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist */, - C6AFBB671D10E6AEF0786D8E3E16BDE4 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h */, - FDC54A8EC562A73143E238094E80179D /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig */, - 965A292F186CF36A47FF8AB1CADE1B85 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig */, + 3A2AC58F03DE192BC9986F7F70005C60 /* SystemPreferencesGeneralScreen.swift */, + E68F10F35B448B759B075167F209FF8B /* SystemPreferencesResetScreen.swift */, + D31AB25725A3DF749752F4B423D38992 /* systemPreferencesRootScreen.swift */, ); - name = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; - path = "Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; + name = Screens; + path = TABTestKit/Classes/Screens; sourceTree = ""; }; - CF1408CF629C7361332E53B88F7BD30C = { + 8FD612D0E88F02CF51338D7620D76B23 /* Extensions */ = { isa = PBXGroup; children = ( - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - 18BB3C90BDF1A5F1D336E77B09EBB1F2 /* Development Pods */, - 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, - 7F9009F1182E3BDED6F366005188C8B5 /* Pods */, - 2C065241B34ABECCB0CE7068DB612DD4 /* Products */, - F7FD97F3CC6F18F4AAAE10E5DE0D2076 /* Targets Support Files */, + 873D8C8F533183A9CC0FDB0584A0D3A6 /* Array+Safe.swift */, + 2AE76A2F5F42B8345F5AA79300B4C164 /* CGVector+Offset.swift */, + DDED6BADF920ACCC2DD498A47F99D3EE /* Element+defaults.swift */, + 4783CAC79F17D1896489A64424F9BD48 /* NormalizedCoordinate+Locations.swift */, + 42BDF21DA60D81C5D0CBDD48A018614F /* String+HumanReadableString.swift */, + D55787F6DF817B75F3CAFE58D2C75A03 /* XCTFatalFail.swift */, + 5B459502363B50DE1504A1E3E310CEE0 /* XCUIApplicationState+String.swift */, + 89D415A66DE217B3A58DD8458B849955 /* XCUIDevice+frame.swift */, + 52B50C46CCAEFEE409E73BB0945A1386 /* XCUIElement+hasKeyboardFocus.swift */, + 1C7797BE5699830440539E71C37A1A71 /* XCUIElement+isVisible.swift */, + 1D0168AF849134D16100C7BFEB80A23C /* XCUIElement+wait.swift */, ); + name = Extensions; + path = TABTestKit/Classes/Extensions; sourceTree = ""; }; - D83F39FE2D5E3C95D8638CC5FB81723D /* Screens */ = { + 9102BC572AA227E692D43C6815F85B7F /* Elements */ = { isa = PBXGroup; children = ( - 16FF8D7D264C777C17EC8E3826E41FC0 /* SystemPreferencesGeneralScreen.swift */, - A158B37AFCFE2FC2766ADE400A427C31 /* SystemPreferencesResetScreen.swift */, - 2C56C15410FDD6C55973202E7BD51AB1 /* systemPreferencesRootScreen.swift */, + 956C9338D0BACFE42F4A7C80BAB7BF10 /* ActivitySheet.swift */, + BDCA3B772A48D4211760F912E0F520AD /* Alert.swift */, + 58FBC2649A9FA1E16EB703D8D700AC35 /* Attributes.swift */, + AF05CD2BFB07549EE236C027EC4E5909 /* Button.swift */, + 380747A33CBA0FF82E8CEB03411E427C /* Cell.swift */, + 784BEFDF1C0A68AF930E89DFD2CE7801 /* CollectionView.swift */, + 2584308D678C3173C55FBDA44780D982 /* DatePicker.swift */, + 38AE45CE88F3412E3B7E8FD506AEB4D8 /* Header.swift */, + 0630A033211DB096B3D975C0A8A6D605 /* Icon.swift */, + C15A251953084904192BEF363CC50974 /* Image.swift */, + 730A5800CBEF9A14270AA853398D4322 /* Keyboard.swift */, + B0CBB594319A69C908CD4647034A573F /* Label.swift */, + 8DB2A169534C4831C445981DF3A2DA5C /* NavBar.swift */, + 646A34A102CAF90BBB108BA83A1DFDF4 /* PageIndicator.swift */, + 68EFD33DB9DFFDF42708DA8EC71EDC40 /* Picker.swift */, + EDC62D7EDE856ADD24BE0C6F22E6A19D /* ScrollView.swift */, + 95707DADF9BE89CE3D695011A4671E0F /* SecureTextField.swift */, + 7C5E286DDA6206AFA3772DF7364D32FA /* SegmentedControl.swift */, + CD6AFCEC547D4081C1DDACB4A91B07FF /* Sheet.swift */, + AEFA603E0C79DEC5284F64B5E074405C /* Slider.swift */, + 90FC842068CBCA1897B40C5530D71B73 /* Stepper.swift */, + 2BEFAF4D17AA36C8FF4F731C1A8CA413 /* Switch.swift */, + FD146FCEC24A82B51539C1914173EB08 /* TabBar.swift */, + 0B3A68D3EFAF29500090F023538224C0 /* Table.swift */, + 466A54469B45DE7D4F8490000DC01CD2 /* TextField.swift */, + CDB406E7260FAE4E46684D964E38D4DC /* TextView.swift */, + E95305EAAE76580C42BAE10B8BA594A4 /* View.swift */, + 900F03F60D5A8A2C73703876467231AE /* WebView.swift */, ); - name = Screens; - path = TABTestKit/Classes/Screens; + name = Elements; + path = TABTestKit/Classes/Elements; sourceTree = ""; }; - E72E53D5CEB57A1AC1E19F575171CD45 /* Support Files */ = { + 974814B39C0012DECD183BBB91B32103 /* iOS */ = { isa = PBXGroup; children = ( - 1625121B576A2F260FF03FA15D2F2915 /* TABTestKit.modulemap */, - 16CEE68DCE8D52E323C43627EF5E6E00 /* TABTestKit-dummy.m */, - CAE5BB42BB2BF6E722362118945E72AC /* TABTestKit-Info.plist */, - 93519F3E6A3BA42F4B758A4E518470B7 /* TABTestKit-prefix.pch */, - 7AB6E7B255089A991E8E03C689B549DF /* TABTestKit-umbrella.h */, - B3019D829E33FE2E46E5E7929D3EC25E /* TABTestKit.debug.xcconfig */, - 29DD4BF40C3210946B255EA0753A2C50 /* TABTestKit.release.xcconfig */, + CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */, + 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */, + ); + name = iOS; + sourceTree = ""; + }; + BE666939CBCE95405776C8EC8CD969EC /* Support Files */ = { + isa = PBXGroup; + children = ( + 332472DFF22A7E51144EC70EA1E110EB /* TABTestKit.modulemap */, + F948F57E6E72DBC56EDD37D109BA110B /* TABTestKit-dummy.m */, + CAA0B8A67B63D67838AAAC466C1416DD /* TABTestKit-Info.plist */, + 894BAC331D24350EAB08F83FF6E0BADB /* TABTestKit-prefix.pch */, + 896F504662A182450FFE70188319673F /* TABTestKit-umbrella.h */, + 70DA71C282A135410F17F6140C2C5012 /* TABTestKit.debug.xcconfig */, + 77A2C928606797CDABD2988B90D7B51D /* TABTestKit.release.xcconfig */, ); name = "Support Files"; path = "Example/Pods/Target Support Files/TABTestKit"; sourceTree = ""; }; - EF63F0AB3D126E8F7650F9D277024049 /* Action */ = { + BF4BFAF140349307273B1343616A213B /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests */ = { isa = PBXGroup; children = ( - 9ED8581DAD6ED00A41AE1E536EEAD58B /* StepAction.swift */, + C354231844F21D916AF8E0D9E0F587FF /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.modulemap */, + A3F9B3AEE6873539F9B3FD0F64E7DB43 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.markdown */, + 91B1EB1FAB79CE231C85712DE4D31CC0 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-acknowledgements.plist */, + 99E06D4FF45A3B2605A88BF7D8DDC1C9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-dummy.m */, + 1CB830EB632DA8DED42D4E33C4E59DD9 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-frameworks.sh */, + AB4E151C064820753E3685012C75D924 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-Info.plist */, + C6AFBB671D10E6AEF0786D8E3E16BDE4 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h */, + FDC54A8EC562A73143E238094E80179D /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.debug.xcconfig */, + 965A292F186CF36A47FF8AB1CADE1B85 /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests.release.xcconfig */, ); - path = Action; + name = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; + path = "Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; sourceTree = ""; }; - F0D12E64DC9ED4EE71E47A0286809539 /* TABTestKit */ = { + CC9B35B34D79D5AFEBFF974FD686B687 /* Action */ = { isa = PBXGroup; children = ( - AD7CB9979922414135C2E9A8B7CEBC97 /* TABTestCase.swift */, - 197CAB34DE6E8DF49260A75273320BBE /* Apps */, - 3017907910E919139755598F963083B2 /* BDD */, - F9864E8815A306C53E9C03A1E94E317C /* Biometrics */, - AEAE73BC79500A571690DECAEFC8A418 /* Contexts */, - AB2C2DE4B3E4940BA585720CBECFA311 /* Elements */, - 420093D9ACA8FFDEE7BE734AD8A668CA /* Extensions */, - 79C96A6B763094E03ACC52E63989705E /* Pod */, - 7D6290DA3805378A45F75B754AE5C27A /* Protocols */, - D83F39FE2D5E3C95D8638CC5FB81723D /* Screens */, - E72E53D5CEB57A1AC1E19F575171CD45 /* Support Files */, + E9070B6D58C73B757448186A920E2623 /* StepAction.swift */, ); - name = TABTestKit; - path = ../..; + name = Action; + path = Action; sourceTree = ""; }; - F20A8F7964ADAEF4BABA5668C0D8CE80 /* include */ = { + CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( - 4426932FB43D12FD3B25C45B0D3DB5E3 /* Biometrics.h */, - B06054F30FE3F234917DE45221C2E54F /* Biometrics-Bridging-Header.h */, + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + 18BB3C90BDF1A5F1D336E77B09EBB1F2 /* Development Pods */, + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, + 7F9009F1182E3BDED6F366005188C8B5 /* Pods */, + 2C065241B34ABECCB0CE7068DB612DD4 /* Products */, + F7FD97F3CC6F18F4AAAE10E5DE0D2076 /* Targets Support Files */, ); - path = include; sourceTree = ""; }; F7FD97F3CC6F18F4AAAE10E5DE0D2076 /* Targets Support Files */ = { @@ -588,14 +593,24 @@ name = "Targets Support Files"; sourceTree = ""; }; - F9864E8815A306C53E9C03A1E94E317C /* Biometrics */ = { + FD80144C5867EA0715CEB75CF6EC532C /* Protocols */ = { isa = PBXGroup; children = ( - 7F90C9131D671249054E927E4DDFA458 /* Biometrics.m */, - F20A8F7964ADAEF4BABA5668C0D8CE80 /* include */, + C9808FCF71303D24381B18A101FDC3CC /* Adjustable.swift */, + EAF2F5E57EDB77B25913C06A64C65465 /* CellContaining.swift */, + 6C94641B67764C3DA9DA9C1D38EE6BBC /* Completable.swift */, + A6AAB15D606A9F85EAB57B0AB14DE010 /* Dismissable.swift */, + B54A4D79DB812556238900425435AC6D /* Editable.swift */, + F71C4DC4C2C6BA7086DC35863AD1C5C9 /* Element.swift */, + BDC3DE5A05803025992E807A9B620C65 /* Refreshable.swift */, + 041FF9A72E7259D2B37725303A855CB8 /* Screen.swift */, + 0B95B6E9FBADB3E4746E8709F9261BD3 /* Scrollable.swift */, + B5DFD8B4AD1A37548984761B52E84606 /* ScrollableScreen.swift */, + DA58C9CF8C3C1E9778E23BB340E830B7 /* Tappable.swift */, + 687E6C1C097B8F4536E788A429F084E3 /* ValueRepresentable.swift */, ); - name = Biometrics; - path = TABTestKit/Classes/Biometrics; + name = Protocols; + path = TABTestKit/Classes/Protocols; sourceTree = ""; }; /* End PBXGroup section */ @@ -609,13 +624,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 7BB2632F625D641EEBE9197E2AD1CB75 /* Headers */ = { + A2069D98AF6E9E288D15318A7F23B27C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - A9BF4ABCDA227FEBF05866D8774E17F7 /* Biometrics-Bridging-Header.h in Headers */, - 221E6E8B9F1CF89B139F1D7D1735A7D0 /* Biometrics.h in Headers */, - AFF67E5D0FAC2324B4C8E67D07DBCE6E /* TABTestKit-umbrella.h in Headers */, + A3BF17EAAC4876860E82923FE4027DD3 /* Biometrics-Bridging-Header.h in Headers */, + 8A9E429A8E6D3F3D083D81E603E26B21 /* Biometrics.h in Headers */, + 9587A5801FA5C8C9D7E765955787803B /* TABTestKit-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -650,8 +665,8 @@ buildRules = ( ); dependencies = ( - C13441B545CB63D4F314043EBF65EAE4 /* PBXTargetDependency */, - DD63C705109AD2B54BB4EF1B0DC9FC9E /* PBXTargetDependency */, + 69EF6E26A3AEC1BAA8F602CF83844C5D /* PBXTargetDependency */, + AEF5656F4BAB82CC7D13570173516EFE /* PBXTargetDependency */, ); name = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; productName = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; @@ -670,7 +685,7 @@ buildRules = ( ); dependencies = ( - 8FD43C89AE4A8AA4FEA63FD10641528E /* PBXTargetDependency */, + E4575A9A35D19DFAFEA13C4E964C246C /* PBXTargetDependency */, ); name = "Pods-TABTestKit_Example"; productName = "Pods-TABTestKit_Example"; @@ -697,12 +712,12 @@ }; 9C4F771642E79689CC6A0648ABEA808C /* TABTestKit */ = { isa = PBXNativeTarget; - buildConfigurationList = 985DDBCB21CD4421AD0C5A8034578044 /* Build configuration list for PBXNativeTarget "TABTestKit" */; + buildConfigurationList = 730A9AF96F02D29D815853088EEFB69C /* Build configuration list for PBXNativeTarget "TABTestKit" */; buildPhases = ( - 7BB2632F625D641EEBE9197E2AD1CB75 /* Headers */, - DAEE1357CA2409902C9202B807D5EB7C /* Sources */, - 4F9595A3114B75645FD89BDB2DA0ED56 /* Frameworks */, - 46796FE3552579A8261F1C459A257073 /* Resources */, + A2069D98AF6E9E288D15318A7F23B27C /* Headers */, + C182BCD800E39049385947E46F88B758 /* Sources */, + C499C033094F22AC6F9F3439B3A78F48 /* Frameworks */, + DC562F9A6CDEFAA17DF8950C332C03BD /* Resources */, ); buildRules = ( ); @@ -751,14 +766,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 46796FE3552579A8261F1C459A257073 /* Resources */ = { + C8330D05E85EB6ADF3D4902BF4389D40 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - C8330D05E85EB6ADF3D4902BF4389D40 /* Resources */ = { + DC562F9A6CDEFAA17DF8950C332C03BD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -800,113 +815,117 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DAEE1357CA2409902C9202B807D5EB7C /* Sources */ = { + C182BCD800E39049385947E46F88B758 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2054DC424509138E34F3848CE8B90938 /* ActivitySheet.swift in Sources */, - 6D9D36D49B55D8CE03B7D06588648409 /* Adjustable.swift in Sources */, - 1EA6F865BCAC4ED83ECD404BE5297A3D /* Alert.swift in Sources */, - DDD4D66E76DAB619C8AA40EA09E387E6 /* AlertContext.swift in Sources */, - 548A49289E50CD23CB54221FFCFE5588 /* App.swift in Sources */, - F100E7312A5E11F33DB9340EE9828AA4 /* AppContext.swift in Sources */, - 11B3B9F1A8AD84A46B5BA22D8F181F38 /* Array+Safe.swift in Sources */, - 7C1E963711893F216562DAE8E2B871BC /* Attributes.swift in Sources */, - 1D9712C21C9B75BB08F99297D2FEC7C4 /* BaseApp.swift in Sources */, - 9F8E588302093F36FA01BDACDD590D21 /* Biometrics.m in Sources */, - 8420D91F60519B1D06D806B058277386 /* BiometricsContext.swift in Sources */, - 0E3E25AD0D3DC97BE8A0B6FD2F16D38B /* Button.swift in Sources */, - 74D0D2FFE04E8F157114F4A66DB38D54 /* Cell.swift in Sources */, - DF694D1140E3C47529532EA7F4E6973A /* CellContaining.swift in Sources */, - 454D0D551339A4CA30290742AB4F250B /* CGVector+Offset.swift in Sources */, - 663913458AA3C18DB93BDE7BE67BE7C2 /* CollectionView.swift in Sources */, - 03B4DA52DF96E031859A0DF2A8C9EB0C /* Completable.swift in Sources */, - 891DD55E25FDDE927D847E418424AE95 /* DatePicker.swift in Sources */, - 8A9BEED3DA74ACEB982ADA965099660A /* Dismissable.swift in Sources */, - E1BBCC2558B99876E705C79EF528C25F /* Editable.swift in Sources */, - C486ABB6EB046EC5B2B182ECC9B53377 /* Element+defaults.swift in Sources */, - 2BA7894BCF3EF54F0A70FCD936A11E94 /* Element.swift in Sources */, - C2988975AD302D5FF6488D250CBBB0F2 /* Header.swift in Sources */, - D1CE514D723F1893A5F0D053EEACD0EC /* Icon.swift in Sources */, - CF74AD555C2757FBCFD1337D31359BD4 /* Image.swift in Sources */, - 8E9C42DADA943F3230EE19C7FFA6B62B /* InteractionContext.swift in Sources */, - BA056AE31E8A6D512AC11861D1B92B7F /* Keyboard.swift in Sources */, - F65900390EE335BD4760630FE869306A /* KeyboardContext.swift in Sources */, - 17D0CB638D3EF5133B62008560DF1327 /* Label.swift in Sources */, - DD6C499E277141B25C2204BE0E8606B8 /* NavBar.swift in Sources */, - A720B0DF02AB34732D0109C5125475FE /* NavigationContext.swift in Sources */, - B899CFEA104025B4615C327B9176E0B5 /* NormalizedCoordinate+Locations.swift in Sources */, - 0A0A553EC080DE1A5DF339060A9038C5 /* PageIndicator.swift in Sources */, - EC5A7C4C42700F9F905362B0556E72DD /* Picker.swift in Sources */, - 669E062C3F2DEBC7EB29919240C53163 /* Refreshable.swift in Sources */, - 4C7355396E8080F4A3530993D59BDAB5 /* Safari.swift in Sources */, - 3160F0FA460C86C549927823A13EFB06 /* Scenario.swift in Sources */, - 55E7A8DCE73E6FD0B40C3E8F40E83A04 /* Screen.swift in Sources */, - 2C161F124CED23888E0E4216479CA126 /* Scrollable.swift in Sources */, - 082157A0B221EBFA65F068F8029B05E6 /* ScrollableScreen.swift in Sources */, - CB7655F133E06F8C594315502B925A3F /* ScrollView.swift in Sources */, - A516E615CBF16674CF73A4E540DBFE92 /* SecureTextField.swift in Sources */, - E04F1DDE23CABCDB73F7E6CD585AD14E /* SegmentedControl.swift in Sources */, - ED4440EF16FF71F9973E7B8460AF1CDA /* Sheet.swift in Sources */, - E42C90139F7D37C13690F81AB2BAED29 /* SheetContext.swift in Sources */, - 26E893A3DFD1E0F22CEF0D67ACA330EB /* Slider.swift in Sources */, - 3119966FB6F159933D2133A2187A9AA0 /* Springboard.swift in Sources */, - AEDF236E3B3CBB57FFB71AD4F6A8AFFC /* Step.swift in Sources */, - A3531B58C2E3980C723BECD1A3755B03 /* StepAction.swift in Sources */, - 1387C6F9EB4523313438D4E580565AC2 /* Stepper.swift in Sources */, - 18144A36394D1224D583A84665FB4B30 /* String+HumanReadableString.swift in Sources */, - 400C878BB853BA340BE7FD1E3A481FD4 /* Switch.swift in Sources */, - A140807034B1A3CEF1A2CAEEF34D784A /* SystemPreferences.swift in Sources */, - D4B4436A4C1DE13329D2BC018F130789 /* SystemPreferencesContext.swift in Sources */, - 185A5E457BB628A20AF9D7BD868EEE7B /* SystemPreferencesGeneralScreen.swift in Sources */, - E8BD5261CF14414715FEA9AFFC3907F6 /* SystemPreferencesResetScreen.swift in Sources */, - F42B697127DBAFCBA46E352C9F92B569 /* systemPreferencesRootScreen.swift in Sources */, - 28A60B4F8F938C00338847F8B1E603FE /* TabBar.swift in Sources */, - F0FAC3BD38D83EDAB71246342EB204F0 /* Table.swift in Sources */, - F69B96B50FE9B18430A9105FDC86A5AA /* TABTestCase.swift in Sources */, - E7A207E53E8987DB3DE8A4375EABEC52 /* TABTestKit-dummy.m in Sources */, - 8AAE755BC4847DFE8679B48DF2613DC3 /* Tappable.swift in Sources */, - AD88B61462FF92A6ADC617A858778920 /* TextField.swift in Sources */, - 6A672915E5FA84B423A6AF955E36575A /* TextView.swift in Sources */, - 0624985093AF3B7709891D5AC42315AE /* ValueRepresentable.swift in Sources */, - A2273435F8F15115147FE2936A31B0BD /* View.swift in Sources */, - E833729A73AC0BF6A38918EBCB6C0422 /* WebView.swift in Sources */, - FD1DB014E906D82A36EDC3EA5F4939FC /* XCTFatalFail.swift in Sources */, - E259FA3EB3BA2DEBCFDCD12E940A7777 /* XCUIApplicationState+String.swift in Sources */, - 3658750D2FB97E6E2938ED9B5737B3A9 /* XCUIDevice+frame.swift in Sources */, - 6823235A229142892436403BB3B69DAD /* XCUIElement+hasKeyboardFocus.swift in Sources */, - E0B42CF1477C3EF4C3F5E84252CA44FC /* XCUIElement+isVisible.swift in Sources */, - 6F2C42402666F28495C08EBE5052E70A /* XCUIElement+wait.swift in Sources */, + D71743EEB025F2B6982C40DA61381174 /* ActivitySheet.swift in Sources */, + DEF689964A51FCFC78DF20D0528DFE1C /* Adjustable.swift in Sources */, + 56D644760585A3D34D1AE036069EC6A3 /* Alert.swift in Sources */, + 06FDCF6B474E049A7B79F20C08A98C1C /* AlertContext.swift in Sources */, + CC9079089E4B03EF8868EC7082F1601C /* And.swift in Sources */, + 7DD7CAB0E73B465227072495B779BCA0 /* App.swift in Sources */, + 0A563A4C9E29C02E6ED3AA6F1B1A6DC6 /* AppContext.swift in Sources */, + 7FF8BB0E221D6ACD242DB5C250A17A44 /* Array+Safe.swift in Sources */, + 9373D3E00D7C52065C4FD60C3502B1F5 /* Attributes.swift in Sources */, + A9AAC67E74F09990D6CF534B39D3C1CF /* BaseApp.swift in Sources */, + D6495DEB4B4A434E32F81B07F52D279C /* Biometrics.m in Sources */, + 5B3274ABF7AB0F6FA03129CA840D457C /* BiometricsContext.swift in Sources */, + F38A3437B54098EBE156D9BF67DFCE64 /* Button.swift in Sources */, + 4EB917867D63259330A8DDAC0E290EB1 /* Cell.swift in Sources */, + 7052154ED9D42077DF1726BED0C48BAF /* CellContaining.swift in Sources */, + EF7B6482A60C0483315DCC1BEF93DA45 /* CGVector+Offset.swift in Sources */, + A886C176B7A3725DF58A8B5A7E746CFE /* CollectionView.swift in Sources */, + 5D2612AC51A0116828886FB1526751B8 /* Completable.swift in Sources */, + BD654CF1E7C40E8B50DE7E674958C475 /* DatePicker.swift in Sources */, + B004006E9F166949DF9E0CCAE85B3BCE /* Dismissable.swift in Sources */, + 084AE09317EB2606D787382C22CE0377 /* Editable.swift in Sources */, + 43E9C61618AE664876822B258D5111C2 /* Element+defaults.swift in Sources */, + 3329F65960EB9D7F9E4886C99CEF7AC2 /* Element.swift in Sources */, + 4E6399D30DA5D5907DC244F670CFEF6F /* Given.swift in Sources */, + F331C365BEE4BB07C246C533A38137FE /* Header.swift in Sources */, + 2A76C6EE089B367A676CAEC1352AF76A /* Icon.swift in Sources */, + 18524E640F190A40CF849180B42D4386 /* Image.swift in Sources */, + 113B7F1532E3CBB60CB6E2231C6CA6E7 /* InteractionContext.swift in Sources */, + 4A04B8D4048231DDDC1033B9B76BE374 /* Keyboard.swift in Sources */, + D022FB0C193F2A851EE13AC71417E841 /* KeyboardContext.swift in Sources */, + A0DD5C33A1518D280901636B07190871 /* Label.swift in Sources */, + 8AB95AFB351852B2E3B1E791E7DCDD7A /* NavBar.swift in Sources */, + 192A4EF78A1E86328ADD0D960C795404 /* NavigationContext.swift in Sources */, + 5FD5D211829AB1894F7B5EE1BE829A3C /* NormalizedCoordinate+Locations.swift in Sources */, + 25B7F8036770E3BAD5AED37B28829CFE /* PageIndicator.swift in Sources */, + DCA0706F287181A4BFFE7C3ACFF2F771 /* Picker.swift in Sources */, + 2BB20D43FDAA7A3824B0918E85EB285E /* Refreshable.swift in Sources */, + 2B949418FA8DC59294FDD6E2F3D8AE8D /* Safari.swift in Sources */, + 6D3083CF5F97B2973DC8330ECAFCF90E /* Scenario.swift in Sources */, + F9A5663C59B03A551620E61FFEC40923 /* Screen.swift in Sources */, + 6DA4E1686871F6E59BCAA924C0668E87 /* Scrollable.swift in Sources */, + 5D0EFF1733E4DDD38ECDDCA8AD3339C9 /* ScrollableScreen.swift in Sources */, + 1BEED53FF31E8DE363B8B7E0FE2386CF /* ScrollView.swift in Sources */, + E9CDAD54EFCD959D611BE38E8ADF5695 /* SecureTextField.swift in Sources */, + FB123A2F6843ABA4138D3099F8D29681 /* SegmentedControl.swift in Sources */, + 5AED8D6EFDC28A63308987AF0C1A35E0 /* Sheet.swift in Sources */, + B6D4B7CAB78704F5FFF92A5AE4CB8B2D /* SheetContext.swift in Sources */, + 7F8B3276765C07B62E27BDC6377414A4 /* Slider.swift in Sources */, + 71A67EB78830229D3C70A85882C384A3 /* Springboard.swift in Sources */, + F201C09543B2162BD76B8E6BCFA328DF /* Step.swift in Sources */, + 23BE47F2C5FACE3435765A4B12045EBB /* StepAction.swift in Sources */, + 38C3C67DD9230FF3415AA1408937B24E /* Stepper.swift in Sources */, + A481E788ACAD65BDE1C8CEDCDD98EE49 /* String+HumanReadableString.swift in Sources */, + 2AB09904E3907BFAF0FCF8457F36C5DD /* Switch.swift in Sources */, + 4EE7462D720FD1FE0B2FD646103DCE83 /* SystemPreferences.swift in Sources */, + 7578D6F57158FC72F619DFC47E999FCD /* SystemPreferencesContext.swift in Sources */, + 6DA18833BC74C96BD4038634FCB636B8 /* SystemPreferencesGeneralScreen.swift in Sources */, + 2D0EDD823E5C39E82E80FF6F0DCE087F /* SystemPreferencesResetScreen.swift in Sources */, + 32AA1FAC78298434EEC5DFC1AEFCD7A5 /* systemPreferencesRootScreen.swift in Sources */, + 9E294C5654201DDF5B6A5C8D03DFEFA4 /* TabBar.swift in Sources */, + 9E36064C7A8CBC6D79A8142E4B6BBF0A /* Table.swift in Sources */, + 2633EBB888D79E4645D5A86DE1E207A8 /* TABTestCase.swift in Sources */, + 6FEB7C55E1D1D64DD813EF3BF2BFFC8C /* TABTestKit-dummy.m in Sources */, + 48162352D9DBE11D17253F20DF940F52 /* Tappable.swift in Sources */, + 117F9D190A92A6523FFFF59FCFC58845 /* TextField.swift in Sources */, + D6B0194215C1CAE7D2D53D8C2E6C7C29 /* TextView.swift in Sources */, + 765EC1583DA774BEDF3B1AE8341CABC5 /* Then.swift in Sources */, + 7FB0822EA1DDF1DEFE29790A10B1FB67 /* ValueRepresentable.swift in Sources */, + 498BAC78410A3326F0D0B6783CF1E1CD /* View.swift in Sources */, + D726A088FE90A88DAF6A0D02E9C2D4FC /* WebView.swift in Sources */, + F485B3D5EC28D0C37E210CFCF925FBC8 /* When.swift in Sources */, + 48B4E1DD9C1B6A6DF048E7FF451721FC /* XCTFatalFail.swift in Sources */, + 6ADF17B20B6EFDCEC55E674308005E2A /* XCUIApplicationState+String.swift in Sources */, + 2BF6460484B4BDD7B811862447E09D44 /* XCUIDevice+frame.swift in Sources */, + 38A02222BFF7CA17255CDF36CC916A92 /* XCUIElement+hasKeyboardFocus.swift in Sources */, + 854C0E83987379570558D80CFBA790E4 /* XCUIElement+isVisible.swift in Sources */, + 77B3F66EA519E14E10D80A0C389A9AD5 /* XCUIElement+wait.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 8FD43C89AE4A8AA4FEA63FD10641528E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ShowTime; - target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; - targetProxy = D472450F21315A8F71EF32C3F3A7C706 /* PBXContainerItemProxy */; - }; - C13441B545CB63D4F314043EBF65EAE4 /* PBXTargetDependency */ = { + 69EF6E26A3AEC1BAA8F602CF83844C5D /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ShowTime; target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; - targetProxy = 13AAF55A02BCEBB06015B6A2309264A3 /* PBXContainerItemProxy */; + targetProxy = 0F8450DB407E1A19D2FCA67601069326 /* PBXContainerItemProxy */; }; - DD63C705109AD2B54BB4EF1B0DC9FC9E /* PBXTargetDependency */ = { + AEF5656F4BAB82CC7D13570173516EFE /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = TABTestKit; target = 9C4F771642E79689CC6A0648ABEA808C /* TABTestKit */; - targetProxy = EFE9C2A8BD7912D5A43F3ED1A52F157E /* PBXContainerItemProxy */; + targetProxy = 1EDCAC7E5EF16E9A6743D2D3A370789A /* PBXContainerItemProxy */; + }; + E4575A9A35D19DFAFEA13C4E964C246C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ShowTime; + target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; + targetProxy = FD151BA8DFDC8D78FAA8F81F41C3B292 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 228121E430D0779D22EEC93CD0E8B19F /* Debug */ = { + 02AD7844F17128D3A9EDAAFA0E53F2F9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B3019D829E33FE2E46E5E7929D3EC25E /* TABTestKit.debug.xcconfig */; + baseConfigurationReference = 70DA71C282A135410F17F6140C2C5012 /* TABTestKit.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; @@ -936,39 +955,6 @@ }; name = Debug; }; - 3BF205385D62D22FC2ACC85FE8A17C89 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 29DD4BF40C3210946B255EA0753A2C50 /* TABTestKit.release.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/TABTestKit/TABTestKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/TABTestKit/TABTestKit-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/TABTestKit/TABTestKit.modulemap"; - PRODUCT_MODULE_NAME = TABTestKit; - PRODUCT_NAME = TABTestKit; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 434AD7DDD7CDC54CD05BBA56068285F5 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = AFD57256DAD4C8414BD38FD34982C7B0 /* Pods-TABTestKit_Example.release.xcconfig */; @@ -1125,7 +1111,8 @@ MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; @@ -1197,6 +1184,39 @@ }; name = Debug; }; + A02A8CAB3C34C051A88999C1D095049A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 77A2C928606797CDABD2988B90D7B51D /* TABTestKit.release.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/TABTestKit/TABTestKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/TABTestKit/TABTestKit-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/TABTestKit/TABTestKit.modulemap"; + PRODUCT_MODULE_NAME = TABTestKit; + PRODUCT_NAME = TABTestKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; BA33D30D021A068EC0F3ABCB9902BD57 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = AA47AB426A72CF612E6CDF50B0E91C8F /* ShowTime.debug.xcconfig */; @@ -1327,11 +1347,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 985DDBCB21CD4421AD0C5A8034578044 /* Build configuration list for PBXNativeTarget "TABTestKit" */ = { + 730A9AF96F02D29D815853088EEFB69C /* Build configuration list for PBXNativeTarget "TABTestKit" */ = { isa = XCConfigurationList; buildConfigurations = ( - 228121E430D0779D22EEC93CD0E8B19F /* Debug */, - 3BF205385D62D22FC2ACC85FE8A17C89 /* Release */, + 02AD7844F17128D3A9EDAAFA0E53F2F9 /* Debug */, + A02A8CAB3C34C051A88999C1D095049A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/TABTestKit/Classes/BDD/And.swift b/TABTestKit/Classes/BDD/And.swift new file mode 100644 index 00000000..08c864e6 --- /dev/null +++ b/TABTestKit/Classes/BDD/And.swift @@ -0,0 +1,36 @@ +// +// And.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import XCTest + +public struct And: Step { + + /// The line in a test function this step is in. + public let line: UInt + /// The test function this step is in. + public let function: StaticString + /// The file this step is defined in. + public let file: StaticString + /// The description of this step. + public let description: String + + public init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { + self.line = line + self.function = function + self.file = file + self.description = description + TABTestCase.current?.step = self + XCTContext.runActivity(named: description) { _ in + + TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) + + handler() + + TABTestCase.current?.createScreenshotIfNeeded(for: .afterStep) + } + } +} diff --git a/TABTestKit/Classes/BDD/Given.swift b/TABTestKit/Classes/BDD/Given.swift new file mode 100644 index 00000000..2b7a02b8 --- /dev/null +++ b/TABTestKit/Classes/BDD/Given.swift @@ -0,0 +1,36 @@ +// +// Given.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import XCTest + +public struct Given: Step { + + /// The line in a test function this step is in. + public let line: UInt + /// The test function this step is in. + public let function: StaticString + /// The file this step is defined in. + public let file: StaticString + /// The description of this step. + public let description: String + + public init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { + self.line = line + self.function = function + self.file = file + self.description = description + TABTestCase.current?.step = self + XCTContext.runActivity(named: description) { _ in + + TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) + + handler() + + TABTestCase.current?.createScreenshotIfNeeded(for: .afterStep) + } + } +} diff --git a/TABTestKit/Classes/BDD/Step.swift b/TABTestKit/Classes/BDD/Step.swift index 11f124fe..e710cd78 100644 --- a/TABTestKit/Classes/BDD/Step.swift +++ b/TABTestKit/Classes/BDD/Step.swift @@ -9,11 +9,6 @@ import XCTest -open class Given: Step {} -open class When: Step {} -open class Then: Step {} -open class And: Step {} - /// Defines an executable step to be used in tests. /// /// Steps that are initialised with a function that doesn't take arguments can omit the parenthesis, @@ -21,89 +16,71 @@ open class And: Step {} /// /// Do not use this Step type directly, instead use one of the typealiases above, like Given, When, Then or And. /// To learn more about how to use a Step read this article: https://medium.com/kinandcartacreated/swifty-gherkins-part-1-28abba7dfd8 -open class Step { - - /// A reference to the most recently created Step, useful if you want to find out what step failed. - public static var current: Step? +public protocol Step { + /// The line in a test function this step is in. - public let line: UInt + var line: UInt { get } /// The test function this step is in. - public let function: StaticString + var function: StaticString { get } /// The file this step is defined in. - public let file: StaticString + var file: StaticString { get } /// The description of this step. - public let description: String + var description: String { get } - init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { - self.line = line - self.function = function - self.file = file - self.description = description - Step.current = self - XCTContext.runActivity(named: description) { _ in + init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) +} - TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) +public extension Step { - handler() + // MARK: - Standard init, i.e. Given(somethingHappens) - TABTestCase.current?.createScreenshotIfNeeded(for: .afterStep) - } + @discardableResult + init(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(action(), line: line, function: function, file: file) } - // MARK: - Standard init, i.e. Given(somethingHappens) - - @discardableResult - public convenience init(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(action(), line: line, function: function, file: file) - } - - @discardableResult - public convenience init(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = [String(describing: Swift.type(of: self)), action.description] - .joined(separator: " ") + @discardableResult + init(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [action.description].joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) + } + + // MARK: - "I" init, i.e. Given(I: doSomething) + + @discardableResult + init(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(I: action(), line: line, function: function, file: file) + } + + @discardableResult + init(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = ["I", action.description].joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) + } + + // MARK: - "the" init, i.e. Given(the: thingIsTrue) + + @discardableResult + init(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(the: action(), line: line, function: function, file: file) + } + + @discardableResult + init(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = ["the", action.description].joined(separator: " ") self.init(handler: action.execute, description: description, line: line, function: function, file: file) - } - - // MARK: - "I" init, i.e. Given(I: doSomething) - - @discardableResult - public convenience init(I action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(I: action(), line: line, function: function, file: file) - } - - @discardableResult - public convenience init(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = [String(describing: Swift.type(of: self)), "I", action.description] - .joined(separator: " ") - self.init(handler: action.execute, description: description, line: line, function: function, file: file) - } - - // MARK: - "the" init, i.e. Given(the: thingIsTrue) - - @discardableResult - public convenience init(the action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(the: action(), line: line, function: function, file: file) - } - - @discardableResult - public convenience init(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = [String(describing: Swift.type(of: self)), "the", action.description] - .joined(separator: " ") - self.init(handler: action.execute, description: description, line: line, function: function, file: file) - } - - // MARK: - "a" init, i.e. Given(a: serverErrorIsReturned) + } + + // MARK: - "a" init, i.e. Given(a: serverErrorIsReturned) @discardableResult - convenience init(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + init(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { self.init(a: action(), line: line, function: function, file: file) } - @discardableResult - convenience init(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = [String(describing: Swift.type(of: self)), "a", action.description] - .joined(separator: " ") - self.init(handler: action.execute, description: description, line: line, function: function, file: file) - } - + @discardableResult + init(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = ["a", action.description].joined(separator: " ") + self.init(handler: action.execute, description: description, line: line, function: function, file: file) + } } diff --git a/TABTestKit/Classes/BDD/Then.swift b/TABTestKit/Classes/BDD/Then.swift new file mode 100644 index 00000000..67520a90 --- /dev/null +++ b/TABTestKit/Classes/BDD/Then.swift @@ -0,0 +1,36 @@ +// +// Then.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import XCTest + +public struct Then: Step { + + /// The line in a test function this step is in. + public let line: UInt + /// The test function this step is in. + public let function: StaticString + /// The file this step is defined in. + public let file: StaticString + /// The description of this step. + public let description: String + + public init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { + self.line = line + self.function = function + self.file = file + self.description = description + TABTestCase.current?.step = self + XCTContext.runActivity(named: description) { _ in + + TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) + + handler() + + TABTestCase.current?.createScreenshotIfNeeded(for: .afterStep) + } + } +} diff --git a/TABTestKit/Classes/BDD/When.swift b/TABTestKit/Classes/BDD/When.swift new file mode 100644 index 00000000..86ff5a87 --- /dev/null +++ b/TABTestKit/Classes/BDD/When.swift @@ -0,0 +1,36 @@ +// +// When.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import XCTest + +public struct When: Step { + + /// The line in a test function this step is in. + public let line: UInt + /// The test function this step is in. + public let function: StaticString + /// The file this step is defined in. + public let file: StaticString + /// The description of this step. + public let description: String + + public init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { + self.line = line + self.function = function + self.file = file + self.description = description + TABTestCase.current?.step = self + XCTContext.runActivity(named: description) { _ in + + TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) + + handler() + + TABTestCase.current?.createScreenshotIfNeeded(for: .afterStep) + } + } +} diff --git a/TABTestKit/Classes/TABTestCase.swift b/TABTestKit/Classes/TABTestCase.swift index 27f5baba..1a860619 100644 --- a/TABTestKit/Classes/TABTestCase.swift +++ b/TABTestKit/Classes/TABTestCase.swift @@ -48,6 +48,7 @@ open class TABTestCase: XCTestCase, DefaultContexts { /// A reference to the most recently created TABTestCase. public static var current: TABTestCase? + public var step: Step? public private(set) var screenshotOption: ScreenshotOption = .none public private(set) var screenshotQuality: XCTAttachment.ImageQuality = .medium @@ -126,8 +127,8 @@ open class TABTestCase: XCTestCase, DefaultContexts { createScreenshotIfNeeded(for: .onFailure) - let filePath = Step.current?.filePath ?? filePath - let lineNumber = Step.current?.lineNumber ?? lineNumber + let filePath = step?.filePath ?? filePath + let lineNumber = step?.lineNumber ?? lineNumber super.recordFailure(withDescription: description, inFile: filePath, atLine: lineNumber, expected: expected) } @@ -136,7 +137,7 @@ open class TABTestCase: XCTestCase, DefaultContexts { Full failure info (scenarios and steps may be in a different file to the actual failure): Failed scenario: \(Scenario.current?.description ?? "No scenario") - Failed step: \(name) on line \(Step.current?.line ?? 0) in file \(Step.current?.file ?? "unknown") + Failed step: \(name) on line \(step?.line ?? 0) in file \(step?.file ?? "unknown") Actual file that failed: \(filePath) Actual line that failed: \(lineNumber) From 8c1ad6d29cca72cd0815f3e4cb73babd26c81403 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 15:04:37 +0100 Subject: [PATCH 12/26] Processed feedback --- TABTestKit/Classes/BDD/And.swift | 2 +- TABTestKit/Classes/BDD/Given.swift | 2 +- TABTestKit/Classes/BDD/Then.swift | 2 +- TABTestKit/Classes/BDD/When.swift | 2 +- TABTestKit/Classes/TABTestCase.swift | 10 ++++++---- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/TABTestKit/Classes/BDD/And.swift b/TABTestKit/Classes/BDD/And.swift index 08c864e6..d5685492 100644 --- a/TABTestKit/Classes/BDD/And.swift +++ b/TABTestKit/Classes/BDD/And.swift @@ -23,7 +23,7 @@ public struct And: Step { self.function = function self.file = file self.description = description - TABTestCase.current?.step = self + TABTestCase.currentStep = self XCTContext.runActivity(named: description) { _ in TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) diff --git a/TABTestKit/Classes/BDD/Given.swift b/TABTestKit/Classes/BDD/Given.swift index 2b7a02b8..61b347b3 100644 --- a/TABTestKit/Classes/BDD/Given.swift +++ b/TABTestKit/Classes/BDD/Given.swift @@ -23,7 +23,7 @@ public struct Given: Step { self.function = function self.file = file self.description = description - TABTestCase.current?.step = self + TABTestCase.currentStep = self XCTContext.runActivity(named: description) { _ in TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) diff --git a/TABTestKit/Classes/BDD/Then.swift b/TABTestKit/Classes/BDD/Then.swift index 67520a90..27713b89 100644 --- a/TABTestKit/Classes/BDD/Then.swift +++ b/TABTestKit/Classes/BDD/Then.swift @@ -23,7 +23,7 @@ public struct Then: Step { self.function = function self.file = file self.description = description - TABTestCase.current?.step = self + TABTestCase.currentStep = self XCTContext.runActivity(named: description) { _ in TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) diff --git a/TABTestKit/Classes/BDD/When.swift b/TABTestKit/Classes/BDD/When.swift index 86ff5a87..878ab789 100644 --- a/TABTestKit/Classes/BDD/When.swift +++ b/TABTestKit/Classes/BDD/When.swift @@ -23,7 +23,7 @@ public struct When: Step { self.function = function self.file = file self.description = description - TABTestCase.current?.step = self + TABTestCase.currentStep = self XCTContext.runActivity(named: description) { _ in TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) diff --git a/TABTestKit/Classes/TABTestCase.swift b/TABTestKit/Classes/TABTestCase.swift index 1a860619..24f7ff3d 100644 --- a/TABTestKit/Classes/TABTestCase.swift +++ b/TABTestKit/Classes/TABTestCase.swift @@ -48,7 +48,9 @@ open class TABTestCase: XCTestCase, DefaultContexts { /// A reference to the most recently created TABTestCase. public static var current: TABTestCase? - public var step: Step? + + /// A reference to the most recently created Step, useful if you want to find out what step failed. + public static var currentStep: Step? public private(set) var screenshotOption: ScreenshotOption = .none public private(set) var screenshotQuality: XCTAttachment.ImageQuality = .medium @@ -127,8 +129,8 @@ open class TABTestCase: XCTestCase, DefaultContexts { createScreenshotIfNeeded(for: .onFailure) - let filePath = step?.filePath ?? filePath - let lineNumber = step?.lineNumber ?? lineNumber + let filePath = TABTestCase.currentStep?.filePath ?? filePath + let lineNumber = TABTestCase.currentStep?.lineNumber ?? lineNumber super.recordFailure(withDescription: description, inFile: filePath, atLine: lineNumber, expected: expected) } @@ -137,7 +139,7 @@ open class TABTestCase: XCTestCase, DefaultContexts { Full failure info (scenarios and steps may be in a different file to the actual failure): Failed scenario: \(Scenario.current?.description ?? "No scenario") - Failed step: \(name) on line \(step?.line ?? 0) in file \(step?.file ?? "unknown") + Failed step: \(name) on line \(TABTestCase.currentStep?.line ?? 0) in file \(TABTestCase.currentStep?.file ?? "unknown") Actual file that failed: \(filePath) Actual line that failed: \(lineNumber) From d51ff5e7525daf440b21ca4a6747d538c3d4f5bc Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 9 Nov 2020 15:16:20 +0100 Subject: [PATCH 13/26] Re-added step keyword --- TABTestKit/Classes/BDD/Step.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TABTestKit/Classes/BDD/Step.swift b/TABTestKit/Classes/BDD/Step.swift index e710cd78..7c324940 100644 --- a/TABTestKit/Classes/BDD/Step.swift +++ b/TABTestKit/Classes/BDD/Step.swift @@ -41,7 +41,7 @@ public extension Step { @discardableResult init(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = [action.description].joined(separator: " ") + let description = [String(describing: Self.self), action.description].joined(separator: " ") self.init(handler: action.execute, description: description, line: line, function: function, file: file) } @@ -54,7 +54,7 @@ public extension Step { @discardableResult init(I action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = ["I", action.description].joined(separator: " ") + let description = [String(describing: Self.self), "I", action.description].joined(separator: " ") self.init(handler: action.execute, description: description, line: line, function: function, file: file) } @@ -67,7 +67,7 @@ public extension Step { @discardableResult init(the action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = ["the", action.description].joined(separator: " ") + let description = [String(describing: Self.self), "the", action.description].joined(separator: " ") self.init(handler: action.execute, description: description, line: line, function: function, file: file) } @@ -80,7 +80,7 @@ public extension Step { @discardableResult init(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - let description = ["a", action.description].joined(separator: " ") + let description = [String(describing: Self.self), "a", action.description].joined(separator: " ") self.init(handler: action.execute, description: description, line: line, function: function, file: file) } } From 3a723be396db8be9a7016b948951c0b09cb89b91 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 23 Nov 2020 10:35:32 +0100 Subject: [PATCH 14/26] Exposed element name --- TABTestKit/Classes/Elements/ActivitySheet.swift | 4 +++- TABTestKit/Classes/Elements/Alert.swift | 4 +++- TABTestKit/Classes/Elements/Button.swift | 4 +++- TABTestKit/Classes/Elements/Cell.swift | 6 ++++-- TABTestKit/Classes/Elements/CollectionView.swift | 4 +++- TABTestKit/Classes/Elements/DatePicker.swift | 4 +++- TABTestKit/Classes/Elements/Header.swift | 4 +++- TABTestKit/Classes/Elements/Icon.swift | 4 +++- TABTestKit/Classes/Elements/Image.swift | 4 +++- TABTestKit/Classes/Elements/Keyboard.swift | 4 +++- TABTestKit/Classes/Elements/Label.swift | 4 +++- TABTestKit/Classes/Elements/NavBar.swift | 4 +++- TABTestKit/Classes/Elements/PageIndicator.swift | 4 +++- TABTestKit/Classes/Elements/Picker.swift | 4 +++- TABTestKit/Classes/Elements/ScrollView.swift | 4 +++- TABTestKit/Classes/Elements/SecureTextField.swift | 4 +++- TABTestKit/Classes/Elements/SegmentedControl.swift | 4 +++- TABTestKit/Classes/Elements/Sheet.swift | 4 +++- TABTestKit/Classes/Elements/Slider.swift | 4 +++- TABTestKit/Classes/Elements/Stepper.swift | 4 +++- TABTestKit/Classes/Elements/Switch.swift | 4 +++- TABTestKit/Classes/Elements/TabBar.swift | 4 +++- TABTestKit/Classes/Elements/Table.swift | 4 +++- TABTestKit/Classes/Elements/TextField.swift | 4 +++- TABTestKit/Classes/Elements/TextView.swift | 4 +++- TABTestKit/Classes/Elements/View.swift | 4 +++- TABTestKit/Classes/Elements/WebView.swift | 4 +++- TABTestKit/Classes/Protocols/Element.swift | 13 +++++++++---- TABTestKit/Classes/Protocols/Screen.swift | 3 +++ 29 files changed, 94 insertions(+), 32 deletions(-) diff --git a/TABTestKit/Classes/Elements/ActivitySheet.swift b/TABTestKit/Classes/Elements/ActivitySheet.swift index 20c36477..839ba757 100644 --- a/TABTestKit/Classes/Elements/ActivitySheet.swift +++ b/TABTestKit/Classes/Elements/ActivitySheet.swift @@ -12,11 +12,13 @@ import XCTest public struct ActivitySheet: Element { public let id: String? = "ActivityListView" + public let name: String? public let type: XCUIElement.ElementType = .other public let parent: Element - public init(parent: Element = App.shared) { + public init(parent: Element = App.shared, name: String? = nil) { self.parent = parent + self.name = name } /// Returns a cancel button that can be tapped to dismiss the sheet. diff --git a/TABTestKit/Classes/Elements/Alert.swift b/TABTestKit/Classes/Elements/Alert.swift index e5596074..b1c6332c 100644 --- a/TABTestKit/Classes/Elements/Alert.swift +++ b/TABTestKit/Classes/Elements/Alert.swift @@ -12,6 +12,7 @@ import XCTest public struct Alert: Element { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .alert public var dismissButton: Button { @@ -20,8 +21,9 @@ public struct Alert: Element { private let dismissButtonID: String - public init(id: String?, parent: Element = App.shared, dismissButtonID: String = "Cancel") { + public init(id: String?, name: String? = nil, parent: Element = App.shared, dismissButtonID: String = "Cancel") { self.id = id + self.name = name self.parent = parent self.dismissButtonID = dismissButtonID } diff --git a/TABTestKit/Classes/Elements/Button.swift b/TABTestKit/Classes/Elements/Button.swift index 83306e7e..48a1348e 100644 --- a/TABTestKit/Classes/Elements/Button.swift +++ b/TABTestKit/Classes/Elements/Button.swift @@ -12,13 +12,15 @@ public struct Button: Element, Tappable, ValueRepresentable { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .button public var value: String { return underlyingXCUIElement.label } - public init(id: String, index: Int = 0, parent: Element = App.shared) { + public init(id: String, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/Cell.swift b/TABTestKit/Classes/Elements/Cell.swift index 341dd67c..7a2cec65 100644 --- a/TABTestKit/Classes/Elements/Cell.swift +++ b/TABTestKit/Classes/Elements/Cell.swift @@ -10,13 +10,15 @@ import XCTest public struct Cell: Element, Tappable { public let id: String? + public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .cell - public let index: Int - public init(id: String? = nil, index: Int = 0, parent: Element) { + public init(id: String? = nil, index: Int = 0, name: String? = nil, parent: Element) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/CollectionView.swift b/TABTestKit/Classes/Elements/CollectionView.swift index 3bc8d5c2..47621a6c 100644 --- a/TABTestKit/Classes/Elements/CollectionView.swift +++ b/TABTestKit/Classes/Elements/CollectionView.swift @@ -11,11 +11,13 @@ import XCTest public struct CollectionView: Element, Scrollable, CellContaining { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .collectionView - public init(id: String? = nil, parent: Element = App.shared) { + public init(id: String? = nil, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/DatePicker.swift b/TABTestKit/Classes/Elements/DatePicker.swift index 057277f6..90917071 100644 --- a/TABTestKit/Classes/Elements/DatePicker.swift +++ b/TABTestKit/Classes/Elements/DatePicker.swift @@ -14,15 +14,17 @@ public struct DatePicker: Element { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .datePicker /// Returns the number of wheels the picker contains. public var numberOfWheels: Int { return underlyingXCUIElement.pickerWheels.count } - public init(id: String, index: Int = 0, parent: Element = App.shared) { + public init(id: String, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/Header.swift b/TABTestKit/Classes/Elements/Header.swift index 80a7348d..453f0ed7 100644 --- a/TABTestKit/Classes/Elements/Header.swift +++ b/TABTestKit/Classes/Elements/Header.swift @@ -17,12 +17,14 @@ import XCTest public struct Header: Element, ValueRepresentable { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .other // This is ignored on iOS 13+ because of silliness with XCTest, see below. public var value: String { return label } - public init(id: String?, parent: Element = App.shared) { + public init(id: String?, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/Icon.swift b/TABTestKit/Classes/Elements/Icon.swift index 9b2d9a7c..f83476a5 100644 --- a/TABTestKit/Classes/Elements/Icon.swift +++ b/TABTestKit/Classes/Elements/Icon.swift @@ -12,12 +12,14 @@ public struct Icon: Element, Tappable { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .icon - init(id: String? = nil, index: Int = 0, parent: Element = App.shared) { + init(id: String? = nil, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/Image.swift b/TABTestKit/Classes/Elements/Image.swift index 2ef24e91..35c5d9a2 100644 --- a/TABTestKit/Classes/Elements/Image.swift +++ b/TABTestKit/Classes/Elements/Image.swift @@ -12,14 +12,16 @@ public struct Image: Element, ValueRepresentable { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .image public var value: String? { return underlyingXCUIElement.label } - public init(id: String? = nil, index: Int = 0, parent: Element = App.shared) { + public init(id: String? = nil, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index self.parent = parent + self.name = name } } diff --git a/TABTestKit/Classes/Elements/Keyboard.swift b/TABTestKit/Classes/Elements/Keyboard.swift index aa888b8c..2aedc93e 100644 --- a/TABTestKit/Classes/Elements/Keyboard.swift +++ b/TABTestKit/Classes/Elements/Keyboard.swift @@ -121,11 +121,13 @@ public extension Keyboard { struct PredicationBar: Element { public let id: String? = "Typing Predictions" + public let name: String? public let type: XCUIElement.ElementType = .other public let parent: Element - init(parent: Element = App.shared) { + init(parent: Element = App.shared, name: String? = nil) { self.parent = parent + self.name = name } } diff --git a/TABTestKit/Classes/Elements/Label.swift b/TABTestKit/Classes/Elements/Label.swift index d4802890..bb4998aa 100644 --- a/TABTestKit/Classes/Elements/Label.swift +++ b/TABTestKit/Classes/Elements/Label.swift @@ -11,12 +11,14 @@ import XCTest public struct Label: Element, ValueRepresentable { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .staticText public var value: String { return label } // TODO: Remove `return`s for Swift 5.1+ - public init(id: String, parent: Element = App.shared) { + public init(id: String, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/NavBar.swift b/TABTestKit/Classes/Elements/NavBar.swift index b7030cf8..db94e197 100644 --- a/TABTestKit/Classes/Elements/NavBar.swift +++ b/TABTestKit/Classes/Elements/NavBar.swift @@ -11,14 +11,16 @@ import XCTest public struct NavBar: Element { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .navigationBar public var header: Header { return Header(id: nil, parent: self) } - public init(id: String? = nil, parent: Element = App.shared) { + public init(id: String? = nil, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/PageIndicator.swift b/TABTestKit/Classes/Elements/PageIndicator.swift index e28223c5..b689d288 100644 --- a/TABTestKit/Classes/Elements/PageIndicator.swift +++ b/TABTestKit/Classes/Elements/PageIndicator.swift @@ -11,13 +11,15 @@ public struct PageIndicator: Element, ValueRepresentable { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .pageIndicator public var value: String { return underlyingXCUIElement.value as? String ?? "" } - public init(id: String? = nil, index: Int = 0, parent: Element = App.shared) { + public init(id: String? = nil, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/Picker.swift b/TABTestKit/Classes/Elements/Picker.swift index 6aeed7aa..df8f446b 100644 --- a/TABTestKit/Classes/Elements/Picker.swift +++ b/TABTestKit/Classes/Elements/Picker.swift @@ -14,15 +14,17 @@ public struct Picker: Element { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .picker /// Returns the number of wheels the picker contains. public var numberOfWheels: Int { return underlyingXCUIElement.pickerWheels.count } - public init(id: String, index: Int = 0, parent: Element = App.shared) { + public init(id: String, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/ScrollView.swift b/TABTestKit/Classes/Elements/ScrollView.swift index f60d4184..52e28b5d 100644 --- a/TABTestKit/Classes/Elements/ScrollView.swift +++ b/TABTestKit/Classes/Elements/ScrollView.swift @@ -12,12 +12,14 @@ public struct ScrollView: Element, Scrollable { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .scrollView - public init(id: String? = nil, index: Int = 0, parent: Element = App.shared) { + public init(id: String? = nil, name: String? = nil, index: Int = 0, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/SecureTextField.swift b/TABTestKit/Classes/Elements/SecureTextField.swift index 8845b245..cb173b85 100644 --- a/TABTestKit/Classes/Elements/SecureTextField.swift +++ b/TABTestKit/Classes/Elements/SecureTextField.swift @@ -11,12 +11,14 @@ import XCTest public struct SecureTextField: Element, Editable, Tappable, ValueRepresentable { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .secureTextField public var value: String { return underlyingXCUIElement.value as? String ?? "" } - public init(id: String, parent: Element = App.shared) { + public init(id: String, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/SegmentedControl.swift b/TABTestKit/Classes/Elements/SegmentedControl.swift index 9b54b923..87fe5f41 100644 --- a/TABTestKit/Classes/Elements/SegmentedControl.swift +++ b/TABTestKit/Classes/Elements/SegmentedControl.swift @@ -11,6 +11,7 @@ public struct SegmentedControl: Element { public let id: String? = nil // Unfortunately you can't set an ID or label on a segmented control, so we'll just have to reference by index in the parent. public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .segmentedControl @@ -24,8 +25,9 @@ public struct SegmentedControl: Element { /// - Parameters: /// - index: The index of the segmented control. Defaults to 0, meaning the first segmented control. /// - parent: The parent element of the SegmentedControl. Defaults to the app. - public init(index: Int = 0, parent: Element = App.shared) { + public init(index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/Sheet.swift b/TABTestKit/Classes/Elements/Sheet.swift index 9a0398b5..6bf12a33 100644 --- a/TABTestKit/Classes/Elements/Sheet.swift +++ b/TABTestKit/Classes/Elements/Sheet.swift @@ -10,6 +10,7 @@ import XCTest public struct Sheet: Element { public let id: String? + public let name: String? public let type: XCUIElement.ElementType = .sheet public let parent: Element public var dismissButton: Button { @@ -18,8 +19,9 @@ public struct Sheet: Element { private let dismissButtonID: String - public init(id: String, parent: Element = App.shared, dismissButtonID: String = "Cancel") { + public init(id: String, name: String? = nil, parent: Element = App.shared, dismissButtonID: String = "Cancel") { self.id = id + self.name = name self.parent = parent self.dismissButtonID = dismissButtonID } diff --git a/TABTestKit/Classes/Elements/Slider.swift b/TABTestKit/Classes/Elements/Slider.swift index a96fd3eb..577c6570 100644 --- a/TABTestKit/Classes/Elements/Slider.swift +++ b/TABTestKit/Classes/Elements/Slider.swift @@ -11,13 +11,15 @@ public struct Slider: Element, ValueRepresentable, Adjustable { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .slider public var value: CGFloat { return underlyingXCUIElement.normalizedSliderPosition } - public init(id: String, index: Int = 0, parent: Element = App.shared) { + public init(id: String, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/Stepper.swift b/TABTestKit/Classes/Elements/Stepper.swift index 0f823fb6..91ce5448 100644 --- a/TABTestKit/Classes/Elements/Stepper.swift +++ b/TABTestKit/Classes/Elements/Stepper.swift @@ -11,6 +11,7 @@ public struct Stepper: Element { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .stepper public var incrementButton: Button { @@ -20,9 +21,10 @@ public struct Stepper: Element { return Button(id: "Decrement", parent: self) } - public init(id: String, index: Int = 0, parent: Element = App.shared) { + public init(id: String, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/Switch.swift b/TABTestKit/Classes/Elements/Switch.swift index 97266919..1b79cb74 100644 --- a/TABTestKit/Classes/Elements/Switch.swift +++ b/TABTestKit/Classes/Elements/Switch.swift @@ -15,6 +15,7 @@ public struct Switch: Element, ValueRepresentable, Adjustable, Tappable { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .switch public var value: State { @@ -22,9 +23,10 @@ public struct Switch: Element, ValueRepresentable, Adjustable, Tappable { return State(rawValue: rawInt)! } - public init(id: String, index: Int = 0, parent: Element = App.shared) { + public init(id: String, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/TabBar.swift b/TABTestKit/Classes/Elements/TabBar.swift index c887f592..863f90ff 100644 --- a/TABTestKit/Classes/Elements/TabBar.swift +++ b/TABTestKit/Classes/Elements/TabBar.swift @@ -14,6 +14,7 @@ import XCTest public struct TabBar: Element { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .tabBar @@ -23,8 +24,9 @@ public struct TabBar: Element { /// if you need to. /// /// - Parameter id: The ID of the tab bar. Defaults to nil. - public init(id: String? = nil, parent: Element = App.shared) { + public init(id: String? = nil, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/Table.swift b/TABTestKit/Classes/Elements/Table.swift index 3aa41100..677c28f1 100644 --- a/TABTestKit/Classes/Elements/Table.swift +++ b/TABTestKit/Classes/Elements/Table.swift @@ -11,11 +11,13 @@ import XCTest public struct Table: Element, Scrollable, CellContaining { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .table - public init(id: String? = nil, parent: Element = App.shared) { + public init(id: String? = nil, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/TextField.swift b/TABTestKit/Classes/Elements/TextField.swift index 9ce53771..ebe6785e 100644 --- a/TABTestKit/Classes/Elements/TextField.swift +++ b/TABTestKit/Classes/Elements/TextField.swift @@ -11,13 +11,15 @@ import XCTest public struct TextField: Element, Editable, Tappable, ValueRepresentable { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .textField public var value: String { return underlyingXCUIElement.value as? String ?? "" } public var placeholder: String? { return underlyingXCUIElement.placeholderValue } - public init(id: String, parent: Element = App.shared) { + public init(id: String, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/TextView.swift b/TABTestKit/Classes/Elements/TextView.swift index b0bde4c4..41f623df 100644 --- a/TABTestKit/Classes/Elements/TextView.swift +++ b/TABTestKit/Classes/Elements/TextView.swift @@ -11,12 +11,14 @@ import XCTest public struct TextView: Element, Editable, Tappable, Scrollable, ValueRepresentable { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .textView public var value: String { return underlyingXCUIElement.value as? String ?? "" } - public init(id: String, parent: Element = App.shared) { + public init(id: String, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/View.swift b/TABTestKit/Classes/Elements/View.swift index 3f8c72d7..f87dd913 100644 --- a/TABTestKit/Classes/Elements/View.swift +++ b/TABTestKit/Classes/Elements/View.swift @@ -13,12 +13,14 @@ public struct View: Element { public let id: String? public let index: Int + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .other - public init(id: String, index: Int = 0, parent: Element = App.shared) { + public init(id: String, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Elements/WebView.swift b/TABTestKit/Classes/Elements/WebView.swift index 578cabb2..2ccc9715 100644 --- a/TABTestKit/Classes/Elements/WebView.swift +++ b/TABTestKit/Classes/Elements/WebView.swift @@ -11,11 +11,13 @@ import XCTest public struct WebView: Element, Scrollable { public let id: String? + public let name: String? public let parent: Element public let type: XCUIElement.ElementType = .webView - public init(id: String, parent: Element = App.shared) { + public init(id: String, name: String? = nil, parent: Element = App.shared) { self.id = id + self.name = name self.parent = parent } diff --git a/TABTestKit/Classes/Protocols/Element.swift b/TABTestKit/Classes/Protocols/Element.swift index 05bdddc7..20acbea6 100644 --- a/TABTestKit/Classes/Protocols/Element.swift +++ b/TABTestKit/Classes/Protocols/Element.swift @@ -18,8 +18,8 @@ public protocol Element: CustomStringConvertible { /// app, you don't really need to provide an ID for it. var id: String? { get } - /// The name of the element. Used in the step description - var name: String { get } + /// The name of the element. Used in the step description, if not provided a value will be generated + var name: String? { get } /// The parent element. By default the parent element is the app being tested. var parent: Element { get } @@ -46,7 +46,7 @@ public protocol Element: CustomStringConvertible { public extension Element { - var name: String { return [id].compactMap { $0 }.joined(separator: " ") } + var name: String? { return nil } var parent: Element { return App.shared } @@ -65,13 +65,18 @@ public extension Element { extension Element { public var description: String { + + if let name = name { + return name + } + let indexFormatter = NumberFormatter() indexFormatter.numberStyle = .ordinal indexFormatter.locale = Locale(identifier: "en_GB") let indexString: String? = index > 0 ? indexFormatter.string(for: index) : nil - return [indexString, name, String(describing: Swift.type(of: self))] + return [indexString, id, String(describing: Swift.type(of: self))] .compactMap { $0 } .humanReadableString } diff --git a/TABTestKit/Classes/Protocols/Screen.swift b/TABTestKit/Classes/Protocols/Screen.swift index 635d9dc0..636be0ec 100644 --- a/TABTestKit/Classes/Protocols/Screen.swift +++ b/TABTestKit/Classes/Protocols/Screen.swift @@ -20,6 +20,9 @@ public protocol Screen: CustomStringConvertible { /// The trait of the screen. Typically a ViewController or Header. /// By default, the traits are used to await a screen. var trait: Trait { get } + + /// The name of the screen. Used in the step description + var description: String { get } } extension Screen { From dda181ade5f138c409a54a1de2208540ef594771 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 23 Nov 2020 10:45:43 +0100 Subject: [PATCH 15/26] Extracted number formatter --- .../Extensions/String+HumanReadableString.swift | 10 ++++++++++ TABTestKit/Classes/Protocols/Element.swift | 8 ++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift index bb802f36..3b07b3bc 100644 --- a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift +++ b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift @@ -68,6 +68,16 @@ private extension String { } } +extension Int { + + public var humanReadableNumberString: String { + let indexFormatter = NumberFormatter() + indexFormatter.numberStyle = .ordinal + indexFormatter.locale = Locale(identifier: "en_GB") + return indexFormatter.string(for: self) ?? "" + } +} + private extension CharacterSet { func contains(character: Character?) -> Bool { guard let character = character else { return false } diff --git a/TABTestKit/Classes/Protocols/Element.swift b/TABTestKit/Classes/Protocols/Element.swift index 20acbea6..8ddf8b8a 100644 --- a/TABTestKit/Classes/Protocols/Element.swift +++ b/TABTestKit/Classes/Protocols/Element.swift @@ -70,12 +70,8 @@ extension Element { return name } - let indexFormatter = NumberFormatter() - indexFormatter.numberStyle = .ordinal - indexFormatter.locale = Locale(identifier: "en_GB") - - let indexString: String? = index > 0 ? indexFormatter.string(for: index) : nil - + let indexString: String? = index > 0 ? index.humanReadableNumberString : nil + return [indexString, id, String(describing: Swift.type(of: self))] .compactMap { $0 } .humanReadableString From 2e8d1d8a72a7be7250315a94b7d11a5100f3b29e Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 23 Nov 2020 10:48:34 +0100 Subject: [PATCH 16/26] Update order for index/name --- TABTestKit/Classes/Elements/ScrollView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TABTestKit/Classes/Elements/ScrollView.swift b/TABTestKit/Classes/Elements/ScrollView.swift index 52e28b5d..cd9e98bf 100644 --- a/TABTestKit/Classes/Elements/ScrollView.swift +++ b/TABTestKit/Classes/Elements/ScrollView.swift @@ -16,7 +16,7 @@ public struct ScrollView: Element, Scrollable { public let parent: Element public let type: XCUIElement.ElementType = .scrollView - public init(id: String? = nil, name: String? = nil, index: Int = 0, parent: Element = App.shared) { + public init(id: String? = nil, index: Int = 0, name: String? = nil, parent: Element = App.shared) { self.id = id self.index = index self.name = name From 611bbff63d3ca8f8ded861037412b29879294e05 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 23 Nov 2020 10:53:56 +0100 Subject: [PATCH 17/26] Fixed indexString --- TABTestKit/Classes/Protocols/Element.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TABTestKit/Classes/Protocols/Element.swift b/TABTestKit/Classes/Protocols/Element.swift index 8ddf8b8a..545cdc8f 100644 --- a/TABTestKit/Classes/Protocols/Element.swift +++ b/TABTestKit/Classes/Protocols/Element.swift @@ -70,7 +70,7 @@ extension Element { return name } - let indexString: String? = index > 0 ? index.humanReadableNumberString : nil + let indexString: String? = index > 0 ? (index + 1).humanReadableNumberString : nil return [indexString, id, String(describing: Swift.type(of: self))] .compactMap { $0 } From 86b15cec2c72e0429595fbe96840ec01a6c52aa3 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Mon, 23 Nov 2020 11:08:36 +0100 Subject: [PATCH 18/26] Cleanup --- .../Classes/Extensions/String+HumanReadableString.swift | 4 ++-- TABTestKit/Classes/Protocols/Element.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift index 3b07b3bc..16c38142 100644 --- a/TABTestKit/Classes/Extensions/String+HumanReadableString.swift +++ b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift @@ -70,11 +70,11 @@ private extension String { extension Int { - public var humanReadableNumberString: String { + public var humanReadableIndex: String { let indexFormatter = NumberFormatter() indexFormatter.numberStyle = .ordinal indexFormatter.locale = Locale(identifier: "en_GB") - return indexFormatter.string(for: self) ?? "" + return indexFormatter.string(for: self + 1) ?? "" } } diff --git a/TABTestKit/Classes/Protocols/Element.swift b/TABTestKit/Classes/Protocols/Element.swift index 545cdc8f..32a0ed38 100644 --- a/TABTestKit/Classes/Protocols/Element.swift +++ b/TABTestKit/Classes/Protocols/Element.swift @@ -70,7 +70,7 @@ extension Element { return name } - let indexString: String? = index > 0 ? (index + 1).humanReadableNumberString : nil + let indexString: String? = index > 0 ? index.humanReadableIndex : nil return [indexString, id, String(describing: Swift.type(of: self))] .compactMap { $0 } From 19fc7edc2e9ecaba2d67c3dcfd5a2118b96a55ec Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Tue, 24 Nov 2020 11:13:26 +0100 Subject: [PATCH 19/26] Exposed current XCTActivity --- TABTestKit/Classes/BDD/And.swift | 5 ++++- TABTestKit/Classes/BDD/Given.swift | 5 ++++- TABTestKit/Classes/BDD/Scenario.swift | 5 ++++- TABTestKit/Classes/BDD/Step.swift | 2 ++ TABTestKit/Classes/BDD/Then.swift | 5 ++++- TABTestKit/Classes/BDD/When.swift | 5 ++++- TABTestKit/Classes/TABTestCase.swift | 9 +++++++-- 7 files changed, 29 insertions(+), 7 deletions(-) diff --git a/TABTestKit/Classes/BDD/And.swift b/TABTestKit/Classes/BDD/And.swift index d5685492..a4afbb04 100644 --- a/TABTestKit/Classes/BDD/And.swift +++ b/TABTestKit/Classes/BDD/And.swift @@ -17,6 +17,8 @@ public struct And: Step { public let file: StaticString /// The description of this step. public let description: String + /// The activity of this step. + public var activity: XCTActivity? public init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { self.line = line @@ -24,7 +26,8 @@ public struct And: Step { self.file = file self.description = description TABTestCase.currentStep = self - XCTContext.runActivity(named: description) { _ in + XCTContext.runActivity(named: description) { activity in + self.activity = activity TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) diff --git a/TABTestKit/Classes/BDD/Given.swift b/TABTestKit/Classes/BDD/Given.swift index 61b347b3..21633fb9 100644 --- a/TABTestKit/Classes/BDD/Given.swift +++ b/TABTestKit/Classes/BDD/Given.swift @@ -17,6 +17,8 @@ public struct Given: Step { public let file: StaticString /// The description of this step. public let description: String + /// The activity of this step. + public var activity: XCTActivity? public init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { self.line = line @@ -24,7 +26,8 @@ public struct Given: Step { self.file = file self.description = description TABTestCase.currentStep = self - XCTContext.runActivity(named: description) { _ in + XCTContext.runActivity(named: description) { activity in + self.activity = activity TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) diff --git a/TABTestKit/Classes/BDD/Scenario.swift b/TABTestKit/Classes/BDD/Scenario.swift index 3499d16d..a2378ba5 100644 --- a/TABTestKit/Classes/BDD/Scenario.swift +++ b/TABTestKit/Classes/BDD/Scenario.swift @@ -16,12 +16,15 @@ public struct Scenario { public static var current: Scenario? /// The description of this scenario. public let description: String + /// The activity of this scenario. + public var activity: XCTActivity? @discardableResult public init(_ description: String, _ handler: () -> Void) { self.description = description Scenario.current = self - XCTContext.runActivity(named: description) { _ in + XCTContext.runActivity(named: description) { activity in + self.activity = activity handler() } } diff --git a/TABTestKit/Classes/BDD/Step.swift b/TABTestKit/Classes/BDD/Step.swift index 7c324940..b203e910 100644 --- a/TABTestKit/Classes/BDD/Step.swift +++ b/TABTestKit/Classes/BDD/Step.swift @@ -26,6 +26,8 @@ public protocol Step { var file: StaticString { get } /// The description of this step. var description: String { get } + /// The activity of this step. + var activity: XCTActivity? { get } init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) } diff --git a/TABTestKit/Classes/BDD/Then.swift b/TABTestKit/Classes/BDD/Then.swift index 27713b89..84d4e895 100644 --- a/TABTestKit/Classes/BDD/Then.swift +++ b/TABTestKit/Classes/BDD/Then.swift @@ -17,6 +17,8 @@ public struct Then: Step { public let file: StaticString /// The description of this step. public let description: String + /// The activity of this step. + public var activity: XCTActivity? public init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { self.line = line @@ -24,7 +26,8 @@ public struct Then: Step { self.file = file self.description = description TABTestCase.currentStep = self - XCTContext.runActivity(named: description) { _ in + XCTContext.runActivity(named: description) { activity in + self.activity = activity TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) diff --git a/TABTestKit/Classes/BDD/When.swift b/TABTestKit/Classes/BDD/When.swift index 878ab789..6af02000 100644 --- a/TABTestKit/Classes/BDD/When.swift +++ b/TABTestKit/Classes/BDD/When.swift @@ -17,6 +17,8 @@ public struct When: Step { public let file: StaticString /// The description of this step. public let description: String + /// The activity of this step. + public var activity: XCTActivity? public init(handler: () -> Void, description: String, line: UInt, function: StaticString, file: StaticString) { self.line = line @@ -24,7 +26,8 @@ public struct When: Step { self.file = file self.description = description TABTestCase.currentStep = self - XCTContext.runActivity(named: description) { _ in + XCTContext.runActivity(named: description) { activity in + self.activity = activity TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) diff --git a/TABTestKit/Classes/TABTestCase.swift b/TABTestKit/Classes/TABTestCase.swift index 24f7ff3d..c74a3688 100644 --- a/TABTestKit/Classes/TABTestCase.swift +++ b/TABTestKit/Classes/TABTestCase.swift @@ -112,22 +112,27 @@ open class TABTestCase: XCTestCase, DefaultContexts { screenshotLifetime = lifetime } - public func createScreenshotIfNeeded(for option: ScreenshotOption ) { + public func createScreenshotIfNeeded(for option: ScreenshotOption, in activity: XCTActivity? = nil) { guard screenshotOption.contains(option) else { return } let screenshot = XCUIScreen.main.screenshot() let attachment = XCTAttachment(screenshot: screenshot, quality: screenshotQuality) attachment.lifetime = screenshotLifetime add(attachment) + activity?.add(attachment) } override open func recordFailure(withDescription description: String, inFile filePath: String, atLine lineNumber: Int, expected: Bool) { + + let currentActivity: XCTActivity? = Scenario.current?.activity ?? TABTestCase.currentStep?.activity + // When using Steps and Scenarios it can be really hard to pinpoint where failed, so this attachment saves the info with the last known step and scenario (including the line that failed), to help you. // You can find this attachment in the .xcresult bundle (usually Derived Data). let attachment = createFailureAttachment(description: description, filePath: filePath, lineNumber: lineNumber) add(attachment) + currentActivity?.add(attachment) - createScreenshotIfNeeded(for: .onFailure) + createScreenshotIfNeeded(for: .onFailure, in: currentActivity) let filePath = TABTestCase.currentStep?.filePath ?? filePath let lineNumber = TABTestCase.currentStep?.lineNumber ?? lineNumber From 5b9f85815771508ad8873bdb30a06d6a1c40e6f9 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Thu, 4 Mar 2021 16:54:44 +0100 Subject: [PATCH 20/26] Clear interaction context --- TABTestKit/Classes/Contexts/Action/StepAction.swift | 5 +++++ TABTestKit/Classes/Contexts/InteractionContext.swift | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/TABTestKit/Classes/Contexts/Action/StepAction.swift b/TABTestKit/Classes/Contexts/Action/StepAction.swift index fe64814b..53f01ba9 100644 --- a/TABTestKit/Classes/Contexts/Action/StepAction.swift +++ b/TABTestKit/Classes/Contexts/Action/StepAction.swift @@ -10,4 +10,9 @@ import Foundation public struct StepAction { public let description: String public let execute: () -> Void + + public init(description: String, execute: @escaping () -> Void) { + self.description = description + self.execute = execute + } } diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index e62c107f..c705b0d6 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -39,6 +39,12 @@ public extension InteractionContext { element.type(text) } } + + func clear(_ element: E) -> StepAction { + return StepAction(description: "clear the \(element.description)") { + element.delete(numberOfCharacters: element.value?.count ?? 0) + } + } func delete(_ numberOfCharacters: Int, charactersFrom element: Editable & CustomStringConvertible) -> StepAction { return StepAction(description: "delete \(numberOfCharacters) characters from the \(element.description)") { From b01e03386d0a2ae1925c84e2bd715b0a4b5a6580 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Wed, 31 Mar 2021 08:37:56 +0200 Subject: [PATCH 21/26] Fixed clear --- TABTestKit/Classes/Contexts/InteractionContext.swift | 4 ++-- TABTestKit/Classes/Protocols/Editable.swift | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index c705b0d6..9d1265f8 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -40,9 +40,9 @@ public extension InteractionContext { } } - func clear(_ element: E) -> StepAction { + func clear(_ element: E) -> StepAction { return StepAction(description: "clear the \(element.description)") { - element.delete(numberOfCharacters: element.value?.count ?? 0) + element.clear() } } diff --git a/TABTestKit/Classes/Protocols/Editable.swift b/TABTestKit/Classes/Protocols/Editable.swift index f2d13696..a4da3802 100644 --- a/TABTestKit/Classes/Protocols/Editable.swift +++ b/TABTestKit/Classes/Protocols/Editable.swift @@ -32,3 +32,12 @@ public extension Element where Self: Editable { } } + +public extension Element where Self: Editable & Tappable { + + func clear() { + await(.exists, .hittable) + underlyingXCUIElement.doubleTap() + underlyingXCUIElement.typeText(String(XCUIKeyboardKey.delete.rawValue)) + } +} From db4c9d2b9470b38df8a053c6c41ba10d67862dbd Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Wed, 31 Mar 2021 14:11:49 +0200 Subject: [PATCH 22/26] Fixed clean --- TABTestKit/Classes/Contexts/InteractionContext.swift | 2 +- TABTestKit/Classes/Protocols/Editable.swift | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index 9d1265f8..983934b6 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -40,7 +40,7 @@ public extension InteractionContext { } } - func clear(_ element: E) -> StepAction { + func clear(_ element: E) -> StepAction { return StepAction(description: "clear the \(element.description)") { element.clear() } diff --git a/TABTestKit/Classes/Protocols/Editable.swift b/TABTestKit/Classes/Protocols/Editable.swift index a4da3802..ea692841 100644 --- a/TABTestKit/Classes/Protocols/Editable.swift +++ b/TABTestKit/Classes/Protocols/Editable.swift @@ -33,11 +33,11 @@ public extension Element where Self: Editable { } -public extension Element where Self: Editable & Tappable { +public extension Element where Self: Editable & ValueRepresentable { func clear() { await(.exists, .hittable) - underlyingXCUIElement.doubleTap() - underlyingXCUIElement.typeText(String(XCUIKeyboardKey.delete.rawValue)) + underlyingXCUIElement.coordinate(withNormalizedOffset: CGVector(dx: 0.9, dy: 0.9)).tap() + underlyingXCUIElement.typeText(String(repeating: XCUIKeyboardKey.delete.rawValue, count: value?.count ?? 0)) } } From 3c741cc2f3b648cc153752021664fdaf51026eb8 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Wed, 28 Apr 2021 11:58:06 +0200 Subject: [PATCH 23/26] Updated framework reference --- TABTestKit.podspec | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/TABTestKit.podspec b/TABTestKit.podspec index 05c87dad..cc62959d 100644 --- a/TABTestKit.podspec +++ b/TABTestKit.podspec @@ -15,7 +15,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '12.4' s.swift_version = '5.0' s.source_files = 'TABTestKit/Classes/**/*' - s.frameworks = 'XCTest' + s.weak_framework = "XCTest" s.subspec 'Biometrics' do |b| b.source_files = 'TABTestKit/Classes/Biometrics/**/*' @@ -24,5 +24,11 @@ Pod::Spec.new do |s| b.source_files = 'TABTestKit/Classes/BDD/**/*' end - s.pod_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' } + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + 'ENABLE_BITCODE' => 'NO', + 'ENABLE_TESTING_SEARCH_PATHS' => 'YES', + 'OTHER_LDFLAGS' => '$(inherited) -weak-lXCTestSwiftSupport', + 'OTHER_SWIFT_FLAGS' => '$(inherited) -suppress-warnings', + } end From 929ba76d77c5f5c71cb3545e30c433a372fc6bb2 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Wed, 22 Sep 2021 17:42:48 +0200 Subject: [PATCH 24/26] renamed await to support swift 5.5 --- .../package.xcworkspace/contents.xcworkspacedata | 7 +++++++ TABTestKit.xcodeproj/project.pbxproj | 8 +++++--- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ TABTestKit/Classes/Contexts/InteractionContext.swift | 4 ++-- TABTestKit/Classes/Contexts/NavigationContext.swift | 12 ++++++------ TABTestKit/Classes/Elements/Attributes.swift | 2 +- TABTestKit/Classes/Elements/Keyboard.swift | 2 +- TABTestKit/Classes/Protocols/Completable.swift | 2 +- TABTestKit/Classes/Protocols/Dismissable.swift | 6 +++--- TABTestKit/Classes/Protocols/Editable.swift | 6 +++--- TABTestKit/Classes/Protocols/Element.swift | 12 ++++++------ TABTestKit/Classes/Protocols/Screen.swift | 4 ++-- TABTestKit/Classes/Protocols/Scrollable.swift | 2 +- TABTestKit/Classes/Protocols/Tappable.swift | 8 ++++---- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ 15 files changed, 58 insertions(+), 33 deletions(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata create mode 100644 TABTestKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TABTestKit.xcodeproj/project.pbxproj b/TABTestKit.xcodeproj/project.pbxproj index 576485cc..b07a27b4 100644 --- a/TABTestKit.xcodeproj/project.pbxproj +++ b/TABTestKit.xcodeproj/project.pbxproj @@ -391,7 +391,7 @@ 95D4713D2397C1A9002BEFCA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1250; ORGANIZATIONNAME = "The App Business"; TargetAttributes = { 95D471452397C1A9002BEFCA = { @@ -533,6 +533,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -558,7 +559,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -596,6 +597,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -615,7 +617,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; diff --git a/TABTestKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TABTestKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/TABTestKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index 983934b6..6b4ddd54 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -59,7 +59,7 @@ public extension InteractionContext { .joined(separator: " and ") return StepAction(description: "state of the \(element) \(stateDescription)") { - states.forEach { element.await($0) } + states.forEach { element.wait($0) } } } @@ -70,7 +70,7 @@ public extension InteractionContext { .joined(separator: " or ") return StepAction(description: "state of the \(element) \(stateDescription)") { - states.forEach { element.await(not: $0) } + states.forEach { element.wait(not: $0) } } } diff --git a/TABTestKit/Classes/Contexts/NavigationContext.swift b/TABTestKit/Classes/Contexts/NavigationContext.swift index 4a731ced..02e204db 100644 --- a/TABTestKit/Classes/Contexts/NavigationContext.swift +++ b/TABTestKit/Classes/Contexts/NavigationContext.swift @@ -15,7 +15,7 @@ public extension NavigationContext { /// - Parameter screen: The screen to await. func see(_ screen: ScreenType) -> StepAction { return StepAction(description: "see the \(screen.description)") { - screen.trait.await(.exists, .visible) + screen.trait.wait(.exists, .visible) } } @@ -24,7 +24,7 @@ public extension NavigationContext { /// - Parameter screen: The screen to await. func doNotSee(_ screen: ScreenType) -> StepAction { return StepAction(description: "do not see the \(screen.description)") { - screen.trait.await(not: .exists) + screen.trait.wait(not: .exists) } } @@ -33,7 +33,7 @@ public extension NavigationContext { /// - Parameter element: The element to await. func see(_ element: Element) -> StepAction { return StepAction(description: "see the \(element.description)") { - element.await(.exists, .visible) + element.wait(.exists, .visible) } } @@ -42,7 +42,7 @@ public extension NavigationContext { /// - Parameter element: The element to await. func doNotSee(_ element: Element) -> StepAction { return StepAction(description: "do not see the \(element.description)") { - element.await(not: .exists) + element.wait(not: .exists) } } @@ -59,7 +59,7 @@ public extension NavigationContext { return StepAction(description: "complete the \(completableDescription)") { completableThings.forEach { - $0.await() + $0.wait() $0.complete() } } @@ -78,7 +78,7 @@ public extension NavigationContext { return StepAction(description: "dismiss the \(dismissableDescription)") { dismissableThings.forEach { - $0.await() + $0.wait() $0.dismiss() } } diff --git a/TABTestKit/Classes/Elements/Attributes.swift b/TABTestKit/Classes/Elements/Attributes.swift index 61c509e2..098b78b9 100644 --- a/TABTestKit/Classes/Elements/Attributes.swift +++ b/TABTestKit/Classes/Elements/Attributes.swift @@ -29,7 +29,7 @@ public enum ElementAttributes { case selected case enabled case hasKeyboardFocus - + } /// Represents a direction. diff --git a/TABTestKit/Classes/Elements/Keyboard.swift b/TABTestKit/Classes/Elements/Keyboard.swift index 2aedc93e..b84109fc 100644 --- a/TABTestKit/Classes/Elements/Keyboard.swift +++ b/TABTestKit/Classes/Elements/Keyboard.swift @@ -34,7 +34,7 @@ public struct Keyboard: Element { /// The current keyboard type. /// Attempting to access this before the keyboard is visible will fail the test. public var keyboardType: KeyboardType { - await(.exists, .visible) + wait(.exists, .visible) guard let type = KeyboardType.allCases.first(where: expectedKeysExist) else { XCTFatalFail("Unable to determine keyboard type") } return type } diff --git a/TABTestKit/Classes/Protocols/Completable.swift b/TABTestKit/Classes/Protocols/Completable.swift index 8897d4e8..5f39c0b2 100644 --- a/TABTestKit/Classes/Protocols/Completable.swift +++ b/TABTestKit/Classes/Protocols/Completable.swift @@ -14,7 +14,7 @@ import Foundation /// This works particularly well with NavigationContext. public protocol Completable { - func await() + func wait() func complete() } diff --git a/TABTestKit/Classes/Protocols/Dismissable.swift b/TABTestKit/Classes/Protocols/Dismissable.swift index 3e4d2cea..e326b856 100644 --- a/TABTestKit/Classes/Protocols/Dismissable.swift +++ b/TABTestKit/Classes/Protocols/Dismissable.swift @@ -14,15 +14,15 @@ import Foundation /// This works particularly well with NavigationContext. public protocol Dismissable { - func await() + func wait() func dismiss() } public extension Element where Self: Dismissable { - func await() { - await(.exists, .hittable) + func wait() { + wait(.exists, .hittable) } } diff --git a/TABTestKit/Classes/Protocols/Editable.swift b/TABTestKit/Classes/Protocols/Editable.swift index ea692841..1ed5bf5d 100644 --- a/TABTestKit/Classes/Protocols/Editable.swift +++ b/TABTestKit/Classes/Protocols/Editable.swift @@ -21,12 +21,12 @@ public protocol Editable { public extension Element where Self: Editable { func type(_ text: String) { - await(.exists, .hittable) + wait(.exists, .hittable) underlyingXCUIElement.typeText(text) } func delete(numberOfCharacters: Int) { - await(.exists, .hittable) + wait(.exists, .hittable) let deletionCharacters = String(repeating: XCUIKeyboardKey.delete.rawValue, count: numberOfCharacters) underlyingXCUIElement.typeText(deletionCharacters) } @@ -36,7 +36,7 @@ public extension Element where Self: Editable { public extension Element where Self: Editable & ValueRepresentable { func clear() { - await(.exists, .hittable) + wait(.exists, .hittable) underlyingXCUIElement.coordinate(withNormalizedOffset: CGVector(dx: 0.9, dy: 0.9)).tap() underlyingXCUIElement.typeText(String(repeating: XCUIKeyboardKey.delete.rawValue, count: value?.count ?? 0)) } diff --git a/TABTestKit/Classes/Protocols/Element.swift b/TABTestKit/Classes/Protocols/Element.swift index 32a0ed38..9dcefe84 100644 --- a/TABTestKit/Classes/Protocols/Element.swift +++ b/TABTestKit/Classes/Protocols/Element.swift @@ -83,26 +83,26 @@ public extension Element { /// Awaits for the provided states to be true with a max timeout. /// Unlike the standard `determine` function which returns the state after a max duration, this function will fail the test if any of the states do not become true before the timeout. /// - /// You can provide multiple states, like `await(.exists, .hittable)` + /// You can provide multiple states, like `wait(.exists, .hittable)` /// /// - Parameter states: The states to wait for. /// - Parameter timeout: The timeout. Defaults to 30 seconds. - func await(_ states: ElementAttributes.State..., timeout: TimeInterval = 30) { + func wait(_ states: ElementAttributes.State..., timeout: TimeInterval = 30) { guard !states.isEmpty else { XCTFatalFail("You must provide at least one state!") } states.forEach { state in XCTAssertTrue(determine(state, timeout: timeout), "Failed awaiting element to be \(state) with timeout \(timeout)") } } - /// Converse to the `await(_ states...` function, this waits for the element to _not_ be in the states + /// Converse to the `wait(_ states...` function, this waits for the element to _not_ be in the states /// provided. /// For example, you could use this to wait for an element that you're expecting to become not hittable: - /// `await(not: .hittable)` + /// `wait(not: .hittable)` /// /// - Parameters: /// - states: The states to wait for the element to _not_ be in. /// - timeout: The timout. Defaults to 30 seconds. - func await(not states: ElementAttributes.State..., timeout: TimeInterval = 30) { + func wait(not states: ElementAttributes.State..., timeout: TimeInterval = 30) { guard !states.isEmpty else { XCTFatalFail("You must provide at least one state!") } states.forEach { state in XCTAssertTrue(determine(not: state, timeout: timeout), "Failed awaiting element to not be \(state) with timeout \(timeout)") @@ -113,7 +113,7 @@ public extension Element { /// If the element becomes (or already is) in the correct state this function will exit early, /// otherwise it will keep trying until the timeout and eventually return `false`. /// - /// You can provide multiple states, like `await(.exists, .hittable)` + /// You can provide multiple states, like `wait(.exists, .hittable)` /// /// - Parameters: /// - states: The states to determine the element is in. diff --git a/TABTestKit/Classes/Protocols/Screen.swift b/TABTestKit/Classes/Protocols/Screen.swift index 636be0ec..a57732b3 100644 --- a/TABTestKit/Classes/Protocols/Screen.swift +++ b/TABTestKit/Classes/Protocols/Screen.swift @@ -34,7 +34,7 @@ extension Screen { public extension Screen { - func await() { - trait.await(.exists, .hittable, .visible) + func wait() { + trait.wait(.exists, .hittable, .visible) } } diff --git a/TABTestKit/Classes/Protocols/Scrollable.swift b/TABTestKit/Classes/Protocols/Scrollable.swift index 92de7fb9..fcca271c 100644 --- a/TABTestKit/Classes/Protocols/Scrollable.swift +++ b/TABTestKit/Classes/Protocols/Scrollable.swift @@ -21,7 +21,7 @@ public protocol Scrollable { public extension Element where Self: Scrollable { func scroll(_ direction: ElementAttributes.Direction) { - await(.exists, .hittable) + wait(.exists, .hittable) switch direction { case .upwards: scroll(from: .topThird, to: .middle) diff --git a/TABTestKit/Classes/Protocols/Tappable.swift b/TABTestKit/Classes/Protocols/Tappable.swift index 9e58db80..e818d80c 100644 --- a/TABTestKit/Classes/Protocols/Tappable.swift +++ b/TABTestKit/Classes/Protocols/Tappable.swift @@ -21,22 +21,22 @@ public protocol Tappable { public extension Element where Self: Tappable { func tap() { - await(.exists) + wait(.exists) underlyingXCUIElement.tap() } func doubleTap() { - await(.exists) + wait(.exists) underlyingXCUIElement.doubleTap() } func twoFingerTap() { - await(.exists) + wait(.exists) underlyingXCUIElement.twoFingerTap() } func longPress(duration: TimeInterval) { - await(.exists) + wait(.exists) underlyingXCUIElement.press(forDuration: duration) } diff --git a/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + From 3e85629e3d504e1c0e2a8dd36023350b5455f4bf Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Tue, 22 Mar 2022 16:55:32 +0100 Subject: [PATCH 25/26] setTextAccessibilitySizeToXXXL --- TABTestKit.xcodeproj/project.pbxproj | 4 ++++ .../Contexts/AccessibilityContext.swift | 19 +++++++++++++++++++ TABTestKit/Classes/Contexts/AppContext.swift | 8 +------- TABTestKit/Classes/TABTestCase.swift | 10 ++-------- 4 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 TABTestKit/Classes/Contexts/AccessibilityContext.swift diff --git a/TABTestKit.xcodeproj/project.pbxproj b/TABTestKit.xcodeproj/project.pbxproj index b07a27b4..f5900e26 100644 --- a/TABTestKit.xcodeproj/project.pbxproj +++ b/TABTestKit.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 20C8AD0627EA285F00A6D8B4 /* AccessibilityContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20C8AD0527EA285F00A6D8B4 /* AccessibilityContext.swift */; }; 2DEC7C4924D0822D00545C45 /* Refreshable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DEC7C4824D0822D00545C45 /* Refreshable.swift */; }; 70D1C4DD24BDEFE70047A2EB /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70D1C4DC24BDEFE70047A2EB /* Image.swift */; }; 9536C80D2412A7D100D4B362 /* ActivitySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9536C80C2412A7D100D4B362 /* ActivitySheet.swift */; }; @@ -83,6 +84,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 20C8AD0527EA285F00A6D8B4 /* AccessibilityContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityContext.swift; sourceTree = ""; }; 2DEC7C4824D0822D00545C45 /* Refreshable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Refreshable.swift; sourceTree = ""; }; 70D1C4DC24BDEFE70047A2EB /* Image.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; 9536C80C2412A7D100D4B362 /* ActivitySheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivitySheet.swift; sourceTree = ""; }; @@ -228,6 +230,7 @@ 95D4716D2397C8C1002BEFCA /* NavigationContext.swift */, 95D4716B2397C8C1002BEFCA /* SheetContext.swift */, 95D471702397C8C1002BEFCA /* SystemPreferencesContext.swift */, + 20C8AD0527EA285F00A6D8B4 /* AccessibilityContext.swift */, ); path = Contexts; sourceTree = ""; @@ -482,6 +485,7 @@ 95D471D92397C8C1002BEFCA /* Sheet.swift in Sources */, 95D471C62397C8C1002BEFCA /* KeyboardContext.swift in Sources */, 95D471C22397C8C1002BEFCA /* SheetContext.swift in Sources */, + 20C8AD0627EA285F00A6D8B4 /* AccessibilityContext.swift in Sources */, 95D472032397C8C1002BEFCA /* ValueRepresentable.swift in Sources */, 95D471E22397C8C1002BEFCA /* ScrollView.swift in Sources */, 95D471D62397C8C1002BEFCA /* systemPreferencesRootScreen.swift in Sources */, diff --git a/TABTestKit/Classes/Contexts/AccessibilityContext.swift b/TABTestKit/Classes/Contexts/AccessibilityContext.swift new file mode 100644 index 00000000..394d5661 --- /dev/null +++ b/TABTestKit/Classes/Contexts/AccessibilityContext.swift @@ -0,0 +1,19 @@ +// +// AccessibilityContext.swift +// TABTestKit +// +// Created by Stefan Renne on 22/03/2022. +// + +import XCTest + +public protocol AccessibilityContext {} +public extension AccessibilityContext { + + func setTextAccessibilitySizeToXXXL() -> StepAction { + return StepAction(description: "set text accessibility size to XXXL") { + App.shared.launchArguments.append("-UIPreferredContentSizeCategoryName") + App.shared.launchArguments.append("UICTContentSizeCategoryAccessibilityXXXL") + } + } +} diff --git a/TABTestKit/Classes/Contexts/AppContext.swift b/TABTestKit/Classes/Contexts/AppContext.swift index a4559d7f..939e8a60 100644 --- a/TABTestKit/Classes/Contexts/AppContext.swift +++ b/TABTestKit/Classes/Contexts/AppContext.swift @@ -29,7 +29,7 @@ public extension AppContext { } } - func launchTheApp(clean: Bool) -> StepAction { + func launchTheApp(clean: Bool = true) -> StepAction { return StepAction(description: "launch the app") { App.shared.launch(clean: clean) } @@ -49,12 +49,6 @@ public extension AppContext { } } - func goBackToTABTestKitExampleApp() -> StepAction { - return StepAction(description: "go back to the TABTestKit Example app") { - XCTAssertEqual(App.shared.name, "TABTestKit_Example") - } - } - func openSafari() -> StepAction { // TODO: Move to Safari context return StepAction(description: "open safari") { Safari().activate() diff --git a/TABTestKit/Classes/TABTestCase.swift b/TABTestKit/Classes/TABTestCase.swift index c74a3688..62cf0a6f 100644 --- a/TABTestKit/Classes/TABTestCase.swift +++ b/TABTestKit/Classes/TABTestCase.swift @@ -68,9 +68,7 @@ open class TABTestCase: XCTestCase, DefaultContexts { continueAfterFailure = false Biometrics.unenrolled() App.shared.launchEnvironment["TABTestKit.UUID"] = ProcessInfo.processInfo.environment["SIMULATOR_UDID"] - preLaunchSetup { - App.shared.launch(clean: true) - } + preLaunchSetup() } /// Provides the tear down for the application and each XCTestCase. @@ -89,11 +87,7 @@ open class TABTestCase: XCTestCase, DefaultContexts { /// For example you could use this to reset a mock server's state or collected analytics. /// By default this function does nothing except call the launch handler, so calling the super implementation /// is not required, so long as you call the launch handler in your own implementation. - /// - /// - Parameter launch: The handler to call when your prelaunch setup is complete to launch the app. - open func preLaunchSetup(_ launch: @escaping () -> Void) { - launch() - } + open func preLaunchSetup() { } /// Called automatically as part of tearDown to allow you to provide your own preTermination tear down. /// For example you could use this to unregister a custom UUID on a mock server. From 8fdfba3acaa33f855540763ade3ce3d177f64911 Mon Sep 17 00:00:00 2001 From: Stefan Renne Date: Wed, 23 Mar 2022 08:13:05 +0100 Subject: [PATCH 26/26] Cleanup --- TABTestKit/Classes/Contexts/AccessibilityContext.swift | 3 +-- TABTestKit/Classes/Contexts/AlertContext.swift | 3 +-- TABTestKit/Classes/Contexts/AppContext.swift | 3 +-- TABTestKit/Classes/Contexts/BiometricsContext.swift | 4 +--- TABTestKit/Classes/Contexts/InteractionContext.swift | 3 +-- TABTestKit/Classes/Contexts/KeyboardContext.swift | 6 ++---- TABTestKit/Classes/Contexts/NavigationContext.swift | 5 ++--- TABTestKit/Classes/Contexts/SheetContext.swift | 5 ++--- TABTestKit/Classes/Contexts/SystemPreferencesContext.swift | 5 ++--- TABTestKit/Classes/TABTestCase.swift | 4 +--- 10 files changed, 14 insertions(+), 27 deletions(-) diff --git a/TABTestKit/Classes/Contexts/AccessibilityContext.swift b/TABTestKit/Classes/Contexts/AccessibilityContext.swift index 394d5661..5813ad3f 100644 --- a/TABTestKit/Classes/Contexts/AccessibilityContext.swift +++ b/TABTestKit/Classes/Contexts/AccessibilityContext.swift @@ -7,8 +7,7 @@ import XCTest -public protocol AccessibilityContext {} -public extension AccessibilityContext { +public extension TABTestCase { func setTextAccessibilitySizeToXXXL() -> StepAction { return StepAction(description: "set text accessibility size to XXXL") { diff --git a/TABTestKit/Classes/Contexts/AlertContext.swift b/TABTestKit/Classes/Contexts/AlertContext.swift index ce53f4a7..8a499ad3 100644 --- a/TABTestKit/Classes/Contexts/AlertContext.swift +++ b/TABTestKit/Classes/Contexts/AlertContext.swift @@ -7,8 +7,7 @@ import XCTest -public protocol AlertContext {} -public extension AlertContext { +public extension TABTestCase { func tap(_ actionButtonID: String, in alert: Alert) -> StepAction { return StepAction(description: "tap on the \(actionButtonID) button in the alert") { diff --git a/TABTestKit/Classes/Contexts/AppContext.swift b/TABTestKit/Classes/Contexts/AppContext.swift index 939e8a60..ba9ad072 100644 --- a/TABTestKit/Classes/Contexts/AppContext.swift +++ b/TABTestKit/Classes/Contexts/AppContext.swift @@ -8,8 +8,7 @@ import Foundation import XCTest -public protocol AppContext {} -public extension AppContext { +public extension TABTestCase { func backgroundTheApp() -> StepAction { return StepAction(description: "background the app") { diff --git a/TABTestKit/Classes/Contexts/BiometricsContext.swift b/TABTestKit/Classes/Contexts/BiometricsContext.swift index 7b811813..2c1d4f41 100644 --- a/TABTestKit/Classes/Contexts/BiometricsContext.swift +++ b/TABTestKit/Classes/Contexts/BiometricsContext.swift @@ -10,8 +10,7 @@ import Foundation import Biometrics #endif -public protocol BiometricsContext {} -public extension BiometricsContext { +public extension TABTestCase { func deviceBiometricsAreEnabled() -> StepAction { return StepAction(description: "device biometrics are enabled") { @@ -36,5 +35,4 @@ public extension BiometricsContext { Biometrics.unsuccessfulAuthentication() } } - } diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index 6b4ddd54..14ebec01 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -7,8 +7,7 @@ import XCTest -public protocol InteractionContext {} -public extension InteractionContext { +public extension TABTestCase { func tap(_ element: Tappable & CustomStringConvertible) -> StepAction { return StepAction(description: "tap on the \(element.description)") { diff --git a/TABTestKit/Classes/Contexts/KeyboardContext.swift b/TABTestKit/Classes/Contexts/KeyboardContext.swift index 62b35083..042de69c 100644 --- a/TABTestKit/Classes/Contexts/KeyboardContext.swift +++ b/TABTestKit/Classes/Contexts/KeyboardContext.swift @@ -8,14 +8,12 @@ import XCTest /// KeyboardContext contains functions for interacting and verifying the keyboard on-screen. -public protocol KeyboardContext {} -public extension KeyboardContext { - +public extension TABTestCase { + func keyboardType(is type: Keyboard.KeyboardType) -> StepAction { let actual = keyboard.keyboardType return StepAction(description: "keyboard is \(type.description)") { XCTAssertEqual(type, actual, "Actual keyboard type (\(actual)) does not match expected keyboard type (\(type))") } } - } diff --git a/TABTestKit/Classes/Contexts/NavigationContext.swift b/TABTestKit/Classes/Contexts/NavigationContext.swift index 02e204db..07052a14 100644 --- a/TABTestKit/Classes/Contexts/NavigationContext.swift +++ b/TABTestKit/Classes/Contexts/NavigationContext.swift @@ -7,9 +7,8 @@ import XCTest -public protocol NavigationContext {} -public extension NavigationContext { - +public extension TABTestCase { + /// Asserts that a screen can be seen, by awaiting on its trait. /// /// - Parameter screen: The screen to await. diff --git a/TABTestKit/Classes/Contexts/SheetContext.swift b/TABTestKit/Classes/Contexts/SheetContext.swift index 1ebb3b06..e9e385da 100644 --- a/TABTestKit/Classes/Contexts/SheetContext.swift +++ b/TABTestKit/Classes/Contexts/SheetContext.swift @@ -7,9 +7,8 @@ import Foundation -public protocol SheetContext {} -public extension SheetContext { - +public extension TABTestCase { + func tap(_ actionButtonID: String, in sheet: Sheet) -> StepAction { return StepAction(description: "tap on the \(actionButtonID) button in the sheet") { sheet.actionButton(withID: actionButtonID).tap() diff --git a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift index 51685aa9..3737b5a2 100644 --- a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift +++ b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift @@ -7,8 +7,7 @@ import Foundation -public protocol SystemPreferencesContext {} -public extension SystemPreferencesContext { +public extension TABTestCase { func resetAllPrivacyPrompts() -> StepAction { return StepAction(description: "reset all privacy prompts") { @@ -30,7 +29,7 @@ public extension SystemPreferencesContext { } } - func terminateSystemPreferences() -> StepAction{ + func terminateSystemPreferences() -> StepAction { return StepAction(description: "terminate system preferences") { SystemPreferences().terminate() } diff --git a/TABTestKit/Classes/TABTestCase.swift b/TABTestKit/Classes/TABTestCase.swift index 62cf0a6f..5c4e103a 100644 --- a/TABTestKit/Classes/TABTestCase.swift +++ b/TABTestKit/Classes/TABTestCase.swift @@ -14,8 +14,6 @@ import Biometrics #endif /// The default contexts that TABTestCase conforms to, to provide lots of helpful functions to make it highly possible -/// you don't have to write any extra test functions for your tests. -public typealias DefaultContexts = InteractionContext & NavigationContext & AppContext & BiometricsContext & AlertContext & SheetContext & KeyboardContext /// All tests should inherit from this class. /// By inheriting from this class, you'll automatically get all the functions available in the contexts this class @@ -30,7 +28,7 @@ public typealias DefaultContexts = InteractionContext & NavigationContext & AppC /// /// Finally, TABTestCase will help you by creating attachments when tests failed, with the last known Scenario and Step /// which are found in the xcresult bundle created as part of the test run (usually in Derived Data). -open class TABTestCase: XCTestCase, DefaultContexts { +open class TABTestCase: XCTestCase { public struct ScreenshotOption: OptionSet { public let rawValue: Int