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/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/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..e27db790 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,109 +7,116 @@ 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 */; }; + 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 */; }; - 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 */; }; + 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, ); }; }; - 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 */; }; + 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 */; }; - 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 */; }; + 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 */; }; 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 */; }; + 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 */; }; - 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 */; }; + 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, ); }; }; - 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 */; }; + 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 */; }; - 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 */; }; + BD654CF1E7C40E8B50DE7E674958C475 /* DatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2584308D678C3173C55FBDA44780D982 /* DatePicker.swift */; }; + BF6743BA40FE71C7005AEDC847FA3C1D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; + 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 */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 459B20C91CD2950F24B4BC4D74B43491 /* PBXContainerItemProxy */ = { + 0F8450DB407E1A19D2FCA67601069326 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9C4F771642E79689CC6A0648ABEA808C; - remoteInfo = TABTestKit; + remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; + remoteInfo = ShowTime; }; - A5E99FC687310BF5C8B3315D4816D50E /* PBXContainerItemProxy */ = { + 1EDCAC7E5EF16E9A6743D2D3A370789A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9C1FEFBBC00DBFB4EC56C99126E8E9B0; - remoteInfo = ShowTime; + remoteGlobalIDString = 9C4F771642E79689CC6A0648ABEA808C; + remoteInfo = TABTestKit; }; - C5E51B0AE3854C7BCA159A65A87A74D4 /* PBXContainerItemProxy */ = { + FD151BA8DFDC8D78FAA8F81F41C3B292 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; @@ -119,119 +126,126 @@ /* 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 = ""; }; + 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 = ""; }; 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 = ""; }; + 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 = ""; }; - 21A5843633E4D75EE8E1556F939DB746 /* SystemPreferencesResetScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SystemPreferencesResetScreen.swift; sourceTree = ""; }; + 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; }; - 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 = ""; }; + 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 = ""; }; - 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 = ""; }; + 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; }; - 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; }; + 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; }; - 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 = ""; }; + 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 = ""; }; - 58185D0DA6046583EA0F3992B136C18F /* XCUIElement+wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIElement+wait.swift"; sourceTree = ""; }; + 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; }; - 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 = ""; }; + 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; }; + 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 = ""; }; - 6B82B2F93A1BE5B4C63A8A4CB66E2BE9 /* SegmentedControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; 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 = ""; }; - 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 = ""; }; + 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 = ""; }; - 9636ED3E95A98C45C798682289AABB5A /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; 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 = ""; }; - 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 = ""; }; 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 = ""; }; + 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; }; - 9DB84493C64353132E6F27571A43A3F6 /* CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionView.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 = ""; }; + 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 = ""; }; ADB4763ABC911105EE431BA516439FE1 /* ShowTime.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ShowTime.modulemap; 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 = ""; }; - 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 = ""; }; + 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 = ""; }; 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 = ""; }; + 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; }; + 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 = ""; }; - 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 = ""; }; + 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 = ""; }; - 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 = ""; }; + 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 = ""; }; + 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 = ""; }; - 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 = ""; }; + 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 = ""; }; - 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 = ""; }; + 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 = ""; }; + 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 = ""; }; /* End PBXFileReference section */ @@ -240,7 +254,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 267805C828A9D1D94D9CACAE5C603CDD /* Foundation.framework in Frameworks */, + 72D00E3EC4AC546C8ED0616A85ACA0F3 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -248,46 +262,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A3D01C0F1E1F3BD46CBE767C7A2BD535 /* Foundation.framework in Frameworks */, + FB1B39CE798DC9997F8C176503A4B5C8 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4898BC30FDFD419F968119FDEDDF05A7 /* Frameworks */ = { + 85DE561D3E4964DDC1F5E827216CDF49 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4DF904622DBED25D617FB92185ACCAF7 /* Foundation.framework in Frameworks */, - 33A0126A9943D162EDCC4DE493D8A168 /* XCTest.framework in Frameworks */, + BF6743BA40FE71C7005AEDC847FA3C1D /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 85DE561D3E4964DDC1F5E827216CDF49 /* Frameworks */ = { + C499C033094F22AC6F9F3439B3A78F48 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28C2F366D4A968DBCF276D13CF9EF6CF /* Foundation.framework in Frameworks */, + 7FA42C268DA81109FFC693C6D8AB4F28 /* Foundation.framework in Frameworks */, + 402FF89F68EA5737BB680809553A0850 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 09D33B2E9C4207D5883730B1CC953ACA /* Contexts */ = { - 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 */, - ); - name = Contexts; - path = TABTestKit/Classes/Contexts; - sourceTree = ""; - }; 0EAD851B593C7D383A5B9F66278D5202 /* ShowTime */ = { isa = PBXGroup; children = ( @@ -301,7 +299,7 @@ 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E285571EF144F8DACCF451128B351DD /* iOS */, + 974814B39C0012DECD183BBB91B32103 /* iOS */, ); name = Frameworks; sourceTree = ""; @@ -309,11 +307,24 @@ 18BB3C90BDF1A5F1D336E77B09EBB1F2 /* Development Pods */ = { isa = PBXGroup; children = ( - F6B926016CF4E01F84A53067AEAFC3D1 /* TABTestKit */, + 418B47577E603804A3906B1930CEDF43 /* TABTestKit */, ); name = "Development Pods"; sourceTree = ""; }; + 25F43879A86F27E75D8212994D0DDF55 /* Apps */ = { + isa = PBXGroup; + children = ( + 7F1ED1716CD49E60E25B156392276E0D /* App.swift */, + 3FAC389F16F3ED77B7F785060EE0ED2C /* BaseApp.swift */, + 5F854565414111D8828F801C8ED21C89 /* Safari.swift */, + F6261BD34529E203C86AE451C51562B5 /* Springboard.swift */, + 345FC0348148646DBEDE0FBDACE559C2 /* SystemPreferences.swift */, + ); + name = Apps; + path = TABTestKit/Classes/Apps; + sourceTree = ""; + }; 2C065241B34ABECCB0CE7068DB612DD4 /* Products */ = { isa = PBXGroup; children = ( @@ -342,33 +353,6 @@ path = "Target Support Files/Pods-TABTestKit_Example"; sourceTree = ""; }; - 2FA8FCAA9775EF55974403A605D05230 /* Extensions */ = { - 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 */, - ); - name = Extensions; - path = TABTestKit/Classes/Extensions; - sourceTree = ""; - }; - 351F0940FBB3A7248B16461D572961DD /* BDD */ = { - isa = PBXGroup; - children = ( - D1AB2E805D93F75BF37BD873B9BF6585 /* Scenario.swift */, - B16CB0412D2D22CA01914F6BAE91169D /* Step.swift */, - ); - name = BDD; - path = TABTestKit/Classes/BDD; - sourceTree = ""; - }; 3AD53452E6F9B27B718A63F5668EEEAC /* Support Files */ = { isa = PBXGroup; children = ( @@ -384,92 +368,84 @@ path = "../Target Support Files/ShowTime"; sourceTree = ""; }; - 3E285571EF144F8DACCF451128B351DD /* iOS */ = { + 3D7477DF53964A1299983B636D659A87 /* include */ = { isa = PBXGroup; children = ( - 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */, - 2C061463250766C9C05995AB8EE63E66 /* XCTest.framework */, + 6890CBB16D74D0A0539454707E9E7452 /* Biometrics.h */, + 9BA1F3F52CB90CFB17E58972997596A2 /* Biometrics-Bridging-Header.h */, ); - name = iOS; + name = include; + path = include; sourceTree = ""; }; - 456C8615377475D12A602BADDD74F8AC /* Elements */ = { + 418B47577E603804A3906B1930CEDF43 /* 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 */, + 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 = Elements; - path = TABTestKit/Classes/Elements; + name = TABTestKit; + path = ../..; sourceTree = ""; }; - 6A7EBFBEC7844CA8D6AD72301695BC6E /* Apps */ = { + 4FB51A89FDD05F4F958BF7B27CEDA3EB /* Biometrics */ = { isa = PBXGroup; children = ( - D633AFB6915D96D516CD0872E60E2415 /* App.swift */, - 063860976CBFED0CEABD0E3213F93A8E /* BaseApp.swift */, - 378BEB1C3B86DE939F26118388E95363 /* Safari.swift */, - 4A9E2EEC134947F1BCADD81AFCF32A5B /* Springboard.swift */, - E4508197147D357E5AC5F92B14089EC1 /* SystemPreferences.swift */, + C0B00A454106FEB64D14290BEAF40AB7 /* Biometrics.m */, + 3D7477DF53964A1299983B636D659A87 /* include */, ); - name = Apps; - path = TABTestKit/Classes/Apps; + name = Biometrics; + path = TABTestKit/Classes/Biometrics; sourceTree = ""; }; - 7828C064F857E3C1EAE7C9B73201E07C /* Pod */ = { + 68D7A34B13CDB4A0B14CB81493132BFA /* Pod */ = { isa = PBXGroup; children = ( - E97F64AF467C08D1FB58F73CF59C7EB4 /* LICENSE */, - 9636ED3E95A98C45C798682289AABB5A /* README.md */, - 5029125F64A9A19889E338765CD0299E /* TABTestKit.podspec */, + 2754DC9C52010CAD0BADE97409D9EF8F /* LICENSE */, + EB22A733B5F65AB1DBCD7FAB843A0565 /* README.md */, + B4AC14A4EB99CA218EC114C4CCBF61B5 /* TABTestKit.podspec */, ); name = Pod; sourceTree = ""; }; - 7983087C3129CCABC779E3D0EC3D3BFE /* include */ = { + 6E75D83EB62D21A7B5C12765E7893628 /* Contexts */ = { isa = PBXGroup; children = ( - FBA47936DBE7936C98F0EC94B9E8CEAC /* Biometrics.h */, - 76351B41B9C4CCADF915B35D11C74EAC /* Biometrics-Bridging-Header.h */, + 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 = include; - path = include; + name = Contexts; + path = TABTestKit/Classes/Contexts; sourceTree = ""; }; - 7BBFEA5590048061B9C0E421C6913A22 /* Biometrics */ = { + 6F91ED33E8158A19D56CDC5E6F2728D6 /* BDD */ = { isa = PBXGroup; children = ( - 516FEC36F601143A1A7D9C4483043E02 /* Biometrics.m */, - 7983087C3129CCABC779E3D0EC3D3BFE /* include */, + 34EAA3057899DA741026ED4A26702D33 /* And.swift */, + 113B2F6486B7E7BC2CB41EC1FDFDD7F2 /* Given.swift */, + 26AA4B2AF62940849952DF099E1C16D2 /* Scenario.swift */, + 6EE34A033310F7EFE5E689BF8890CE06 /* Step.swift */, + CD498F8C31BAC913FCFE2CA65CCA10A0 /* Then.swift */, + EE9C40E1DED49E836724F73C2EEA5C23 /* When.swift */, ); - name = Biometrics; - path = TABTestKit/Classes/Biometrics; + name = BDD; + path = TABTestKit/Classes/BDD; sourceTree = ""; }; 7F9009F1182E3BDED6F366005188C8B5 /* Pods */ = { @@ -480,24 +456,94 @@ name = Pods; sourceTree = ""; }; - A0704CDE6B94E4F4482FBC2CDDF1C733 /* Protocols */ = { + 8D865C201C3394D153E36106F612A826 /* Screens */ = { 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 */, + 3A2AC58F03DE192BC9986F7F70005C60 /* SystemPreferencesGeneralScreen.swift */, + E68F10F35B448B759B075167F209FF8B /* SystemPreferencesResetScreen.swift */, + D31AB25725A3DF749752F4B423D38992 /* systemPreferencesRootScreen.swift */, ); - name = Protocols; - path = TABTestKit/Classes/Protocols; + name = Screens; + path = TABTestKit/Classes/Screens; + sourceTree = ""; + }; + 8FD612D0E88F02CF51338D7620D76B23 /* Extensions */ = { + isa = PBXGroup; + children = ( + 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 = ""; + }; + 9102BC572AA227E692D43C6815F85B7F /* Elements */ = { + isa = PBXGroup; + children = ( + 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 = Elements; + path = TABTestKit/Classes/Elements; + sourceTree = ""; + }; + 974814B39C0012DECD183BBB91B32103 /* iOS */ = { + isa = PBXGroup; + children = ( + 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 = ""; }; BF4BFAF140349307273B1343616A213B /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests */ = { @@ -517,19 +563,13 @@ path = "Target Support Files/Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; sourceTree = ""; }; - C5A671305C6457E83B366DFDC513209E /* Support Files */ = { + CC9B35B34D79D5AFEBFF974FD686B687 /* Action */ = { 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 */, + E9070B6D58C73B757448186A920E2623 /* StepAction.swift */, ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/TABTestKit"; + name = Action; + path = Action; sourceTree = ""; }; CF1408CF629C7361332E53B88F7BD30C = { @@ -544,63 +584,53 @@ ); sourceTree = ""; }; - D76E1F2CA7E4E47763301BE5EBF14D5C /* Screens */ = { - isa = PBXGroup; - children = ( - EFE83F853FC56745500A916FBFE0BD09 /* SystemPreferencesGeneralScreen.swift */, - 21A5843633E4D75EE8E1556F939DB746 /* SystemPreferencesResetScreen.swift */, - E8D0C69508B528128406927836573B67 /* systemPreferencesRootScreen.swift */, - ); - name = Screens; - path = TABTestKit/Classes/Screens; - sourceTree = ""; - }; - F6B926016CF4E01F84A53067AEAFC3D1 /* TABTestKit */ = { + F7FD97F3CC6F18F4AAAE10E5DE0D2076 /* Targets Support Files */ = { 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 */, + 2F366F56986BC5DDC447A015305D29D9 /* Pods-TABTestKit_Example */, + BF4BFAF140349307273B1343616A213B /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests */, ); - name = TABTestKit; - path = ../..; + name = "Targets Support Files"; sourceTree = ""; }; - F7FD97F3CC6F18F4AAAE10E5DE0D2076 /* Targets Support Files */ = { + FD80144C5867EA0715CEB75CF6EC532C /* Protocols */ = { isa = PBXGroup; children = ( - 2F366F56986BC5DDC447A015305D29D9 /* Pods-TABTestKit_Example */, - BF4BFAF140349307273B1343616A213B /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests */, + 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 = "Targets Support Files"; + name = Protocols; + path = TABTestKit/Classes/Protocols; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0C0F97697811C405610881996CE9A656 /* Headers */ = { + 1546A71728D546C8D2A345948964F954 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 06F0BA93FE06A8B562D3D88F82D1FF43 /* Biometrics-Bridging-Header.h in Headers */, - 22AB496E63075EE106F9BA6B4D5CA93A /* Biometrics.h in Headers */, - 3DDA18D51471D4B5A53CA30FB7A4800E /* TABTestKit-umbrella.h in Headers */, + 8927BD966BA8175BBCD4A4C1E98EC03C /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1546A71728D546C8D2A345948964F954 /* Headers */ = { + A2069D98AF6E9E288D15318A7F23B27C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 8927BD966BA8175BBCD4A4C1E98EC03C /* Pods-TABTestKit_Example-TABTestKit_ExampleUITests-umbrella.h in Headers */, + A3BF17EAAC4876860E82923FE4027DD3 /* Biometrics-Bridging-Header.h in Headers */, + 8A9E429A8E6D3F3D083D81E603E26B21 /* Biometrics.h in Headers */, + 9587A5801FA5C8C9D7E765955787803B /* TABTestKit-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -635,8 +665,8 @@ buildRules = ( ); dependencies = ( - 6ABED8E8798787021313E7A6A34C5822 /* PBXTargetDependency */, - D2C0AE78D1A7C3188C075C052FB16CB6 /* PBXTargetDependency */, + 69EF6E26A3AEC1BAA8F602CF83844C5D /* PBXTargetDependency */, + AEF5656F4BAB82CC7D13570173516EFE /* PBXTargetDependency */, ); name = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; productName = "Pods-TABTestKit_Example-TABTestKit_ExampleUITests"; @@ -655,7 +685,7 @@ buildRules = ( ); dependencies = ( - 6B4FC25B4CF187B3889A0C4A44770FBA /* PBXTargetDependency */, + E4575A9A35D19DFAFEA13C4E964C246C /* PBXTargetDependency */, ); name = "Pods-TABTestKit_Example"; productName = "Pods-TABTestKit_Example"; @@ -682,12 +712,12 @@ }; 9C4F771642E79689CC6A0648ABEA808C /* TABTestKit */ = { isa = PBXNativeTarget; - buildConfigurationList = 46ECDB4027B6A2823CE01521E3099989 /* Build configuration list for PBXNativeTarget "TABTestKit" */; + buildConfigurationList = 730A9AF96F02D29D815853088EEFB69C /* Build configuration list for PBXNativeTarget "TABTestKit" */; buildPhases = ( - 0C0F97697811C405610881996CE9A656 /* Headers */, - EA289E9666BF0769FC14C34FFE0689C0 /* Sources */, - 4898BC30FDFD419F968119FDEDDF05A7 /* Frameworks */, - 625FBD6C7BFFC36DD292F6F3A64839A9 /* Resources */, + A2069D98AF6E9E288D15318A7F23B27C /* Headers */, + C182BCD800E39049385947E46F88B758 /* Sources */, + C499C033094F22AC6F9F3439B3A78F48 /* Frameworks */, + DC562F9A6CDEFAA17DF8950C332C03BD /* Resources */, ); buildRules = ( ); @@ -736,14 +766,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 625FBD6C7BFFC36DD292F6F3A64839A9 /* Resources */ = { + C8330D05E85EB6ADF3D4902BF4389D40 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - C8330D05E85EB6ADF3D4902BF4389D40 /* Resources */ = { + DC562F9A6CDEFAA17DF8950C332C03BD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -785,113 +815,120 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EA289E9666BF0769FC14C34FFE0689C0 /* Sources */ = { + C182BCD800E39049385947E46F88B758 /* 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 */, + 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 */ - 6ABED8E8798787021313E7A6A34C5822 /* PBXTargetDependency */ = { + 69EF6E26A3AEC1BAA8F602CF83844C5D /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ShowTime; target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; - targetProxy = A5E99FC687310BF5C8B3315D4816D50E /* PBXContainerItemProxy */; + targetProxy = 0F8450DB407E1A19D2FCA67601069326 /* PBXContainerItemProxy */; }; - 6B4FC25B4CF187B3889A0C4A44770FBA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ShowTime; - target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; - targetProxy = C5E51B0AE3854C7BCA159A65A87A74D4 /* PBXContainerItemProxy */; - }; - D2C0AE78D1A7C3188C075C052FB16CB6 /* PBXTargetDependency */ = { + AEF5656F4BAB82CC7D13570173516EFE /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = TABTestKit; target = 9C4F771642E79689CC6A0648ABEA808C /* TABTestKit */; - targetProxy = 459B20C91CD2950F24B4BC4D74B43491 /* PBXContainerItemProxy */; + targetProxy = 1EDCAC7E5EF16E9A6743D2D3A370789A /* PBXContainerItemProxy */; + }; + E4575A9A35D19DFAFEA13C4E964C246C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ShowTime; + target = 9C1FEFBBC00DBFB4EC56C99126E8E9B0 /* ShowTime */; + targetProxy = FD151BA8DFDC8D78FAA8F81F41C3B292 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 040B3C23F3536587D5A4EB91C89D63A1 /* Debug */ = { + 02AD7844F17128D3A9EDAAFA0E53F2F9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA47AB426A72CF612E6CDF50B0E91C8F /* ShowTime.debug.xcconfig */; + baseConfigurationReference = 70DA71C282A135410F17F6140C2C5012 /* 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 +937,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 +955,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 +970,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 +990,11 @@ }; name = Release; }; - 5461FC43C9BCAC3590847BBEA1352C97 /* Release */ = { + 5407334CEC971382882AB78E99C30C7D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F3F8FE35B25F667403E340317EA9F9FD /* TABTestKit.release.xcconfig */; + baseConfigurationReference = FD03AA75DD58014781A38E023C12CD42 /* ShowTime.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*]" = ""; @@ -969,14 +1003,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) "; @@ -988,10 +1022,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 +1083,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 +1091,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 +1107,22 @@ 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_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; 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 +1145,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 +1153,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 +1172,24 @@ 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 */ = { + A02A8CAB3C34C051A88999C1D095049A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 10B1611A1B50B1DA5565DB251CBF81F4 /* TABTestKit.debug.xcconfig */; + baseConfigurationReference = 77A2C928606797CDABD2988B90D7B51D /* 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*]" = ""; @@ -1209,19 +1211,50 @@ 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 */; + 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"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; 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 +1263,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 +1282,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 +1311,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 +1323,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 +1332,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" */ = { + 730A9AF96F02D29D815853088EEFB69C /* Build configuration list for PBXNativeTarget "TABTestKit" */ = { isa = XCConfigurationList; buildConfigurations = ( - 6410F571BA8C1AEC6A19403F1B61B0B5 /* Debug */, - A27713CB74E99AF202AADC23200A32F4 /* Release */, + 02AD7844F17128D3A9EDAAFA0E53F2F9 /* Debug */, + A02A8CAB3C34C051A88999C1D095049A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1326,8 +1359,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/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 @@ 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.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 diff --git a/TABTestKit.xcodeproj/project.pbxproj b/TABTestKit.xcodeproj/project.pbxproj index 576485cc..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 = ""; @@ -391,7 +394,7 @@ 95D4713D2397C1A9002BEFCA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1250; ORGANIZATIONNAME = "The App Business"; TargetAttributes = { 95D471452397C1A9002BEFCA = { @@ -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 */, @@ -533,6 +537,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 +563,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 +601,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 +621,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/Apps/App.swift b/TABTestKit/Classes/Apps/App.swift index d842be8d..d1b42157 100644 --- a/TABTestKit/Classes/Apps/App.swift +++ b/TABTestKit/Classes/Apps/App.swift @@ -14,7 +14,7 @@ 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 { - + /// The shared App instance. Using a shared instance ensure consistency with launch arguments. public static let shared = App() @@ -31,5 +31,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..a4afbb04 --- /dev/null +++ b/TABTestKit/Classes/BDD/And.swift @@ -0,0 +1,39 @@ +// +// 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 + /// The activity of this step. + public var activity: XCTActivity? + + 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.currentStep = self + XCTContext.runActivity(named: description) { activity in + self.activity = activity + + 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..21633fb9 --- /dev/null +++ b/TABTestKit/Classes/BDD/Given.swift @@ -0,0 +1,39 @@ +// +// 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 + /// The activity of this step. + public var activity: XCTActivity? + + 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.currentStep = self + XCTContext.runActivity(named: description) { activity in + self.activity = activity + + TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) + + handler() + + TABTestCase.current?.createScreenshotIfNeeded(for: .afterStep) + } + } +} 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 d644224f..b203e910 100644 --- a/TABTestKit/Classes/BDD/Step.swift +++ b/TABTestKit/Classes/BDD/Step.swift @@ -7,12 +7,7 @@ // Created by Kane Cheshire on 25/07/2018. // -import Foundation - -public typealias Given = Step -public typealias When = Step -public typealias Then = Step -public typealias And = Step +import XCTest /// Defines an executable step to be used in tests. /// @@ -21,83 +16,73 @@ 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 { - - /// 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 - - // MARK: - Standard init, i.e. Given(somethingHappens) - - @discardableResult - public init(_ handler: () -> Void, 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) { - 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) { - 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) { - 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) { - 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) { - 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) { - self.init(handler: handler, line: line, function: function, file: file) - } - - @discardableResult - init(a handler: () -> Void, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { - self.init(handler: handler, line: line, function: function, file: file) - } - + 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) } -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() - } - +public extension Step { + + // MARK: - Standard init, i.e. Given(somethingHappens) + + @discardableResult + init(_ action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(action(), line: line, function: function, file: file) + } + + @discardableResult + init(_ action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Self.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 + 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 = [String(describing: Self.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 + 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 = [String(describing: Self.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 + init(a action: () -> StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + self.init(a: action(), line: line, function: function, file: file) + } + + @discardableResult + init(a action: StepAction, line: UInt = #line, function: StaticString = #function, file: StaticString = #file) { + let description = [String(describing: Self.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 new file mode 100644 index 00000000..84d4e895 --- /dev/null +++ b/TABTestKit/Classes/BDD/Then.swift @@ -0,0 +1,39 @@ +// +// 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 + /// The activity of this step. + public var activity: XCTActivity? + + 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.currentStep = self + XCTContext.runActivity(named: description) { activity in + self.activity = activity + + 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..6af02000 --- /dev/null +++ b/TABTestKit/Classes/BDD/When.swift @@ -0,0 +1,39 @@ +// +// 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 + /// The activity of this step. + public var activity: XCTActivity? + + 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.currentStep = self + XCTContext.runActivity(named: description) { activity in + self.activity = activity + + TABTestCase.current?.createScreenshotIfNeeded(for: .beforeStep) + + handler() + + TABTestCase.current?.createScreenshotIfNeeded(for: .afterStep) + } + } +} diff --git a/TABTestKit/Classes/Contexts/AccessibilityContext.swift b/TABTestKit/Classes/Contexts/AccessibilityContext.swift new file mode 100644 index 00000000..5813ad3f --- /dev/null +++ b/TABTestKit/Classes/Contexts/AccessibilityContext.swift @@ -0,0 +1,18 @@ +// +// AccessibilityContext.swift +// TABTestKit +// +// Created by Stefan Renne on 22/03/2022. +// + +import XCTest + +public extension TABTestCase { + + 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/Action/StepAction.swift b/TABTestKit/Classes/Contexts/Action/StepAction.swift new file mode 100644 index 00000000..53f01ba9 --- /dev/null +++ b/TABTestKit/Classes/Contexts/Action/StepAction.swift @@ -0,0 +1,18 @@ +// +// StepAction.swift +// TABTestKit +// +// Created by Stefan Renne on 05/11/2020. +// + +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/AlertContext.swift b/TABTestKit/Classes/Contexts/AlertContext.swift index dbb82044..8a499ad3 100644 --- a/TABTestKit/Classes/Contexts/AlertContext.swift +++ b/TABTestKit/Classes/Contexts/AlertContext.swift @@ -7,11 +7,12 @@ import XCTest -public protocol AlertContext {} -public extension AlertContext { +public extension TABTestCase { - func tap(_ actionButtonID: String, in alert: Alert) { - alert.actionButton(withID: actionButtonID).tap() + func tap(_ actionButtonID: String, in alert: Alert) -> StepAction { + 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 2334fbf2..ba9ad072 100644 --- a/TABTestKit/Classes/Contexts/AppContext.swift +++ b/TABTestKit/Classes/Contexts/AppContext.swift @@ -8,41 +8,50 @@ import Foundation import XCTest -public protocol AppContext {} -public extension AppContext { +public extension TABTestCase { - func backgroundTheApp() { - App.shared.background() + func backgroundTheApp() -> StepAction { + return StepAction(description: "background the app") { + App.shared.background() + } } - func foregroundTheApp() { - App.shared.activate() + func foregroundTheApp() -> StepAction { + return StepAction(description: "foreground the app") { + App.shared.activate() + } } - func terminateTheApp() { - App.shared.terminate() + func terminateTheApp() -> StepAction { + return StepAction(description: "terminate the app") { + App.shared.terminate() + } } - func launchTheApp(clean: Bool) { - App.shared.launch(clean: clean) + func launchTheApp(clean: Bool = true) -> StepAction { + return StepAction(description: "launch the app") { + 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 { + 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() { - backgroundTheApp() - terminateTheApp() - launchTheApp(clean: false) + func relaunchTheApp() -> StepAction { + return StepAction(description: "relaunch the app") { + self.backgroundTheApp().execute() + self.terminateTheApp().execute() + self.launchTheApp(clean: false).execute() + } } - func goBackToTABTestKitExampleApp() { - XCTAssertEqual(App.shared.name, "TABTestKit_Example") - } - - func openSafari() { // TODO: Move to Safari context - Safari().activate() + func openSafari() -> StepAction { // TODO: Move to Safari context + return StepAction(description: "open safari") { + Safari().activate() + } } } diff --git a/TABTestKit/Classes/Contexts/BiometricsContext.swift b/TABTestKit/Classes/Contexts/BiometricsContext.swift index 5f8234ae..2c1d4f41 100644 --- a/TABTestKit/Classes/Contexts/BiometricsContext.swift +++ b/TABTestKit/Classes/Contexts/BiometricsContext.swift @@ -10,23 +10,29 @@ import Foundation import Biometrics #endif -public protocol BiometricsContext {} -public extension BiometricsContext { +public extension TABTestCase { - func deviceBiometricsAreEnabled() { - Biometrics.enrolled() + func deviceBiometricsAreEnabled() -> StepAction { + return StepAction(description: "device biometrics are enabled") { + Biometrics.enrolled() + } } - func deviceBiometricsAreDisabled() { - Biometrics.unenrolled() + func deviceBiometricsAreDisabled() -> StepAction { + return StepAction(description: "device biometrics are disabled") { + Biometrics.unenrolled() + } } - func successfullyAuthenticateBiometrics() { - Biometrics.successfulAuthentication() + func successfullyAuthenticateBiometrics() -> StepAction { + return StepAction(description: "successfully authenticate biometrics") { + Biometrics.successfulAuthentication() + } } - func failToAuthenticateBiometrics() { - Biometrics.unsuccessfulAuthentication() + func failToAuthenticateBiometrics() -> StepAction { + return StepAction(description: "fail to authenticate biometrics") { + Biometrics.unsuccessfulAuthentication() + } } - } diff --git a/TABTestKit/Classes/Contexts/InteractionContext.swift b/TABTestKit/Classes/Contexts/InteractionContext.swift index 5c24414c..14ebec01 100644 --- a/TABTestKit/Classes/Contexts/InteractionContext.swift +++ b/TABTestKit/Classes/Contexts/InteractionContext.swift @@ -7,89 +7,144 @@ import XCTest -public protocol InteractionContext {} -public extension InteractionContext { +public extension TABTestCase { - func tap(_ element: Tappable) { - element.tap() + func tap(_ element: Tappable & CustomStringConvertible) -> StepAction { + return StepAction(description: "tap on the \(element.description)") { + element.tap() + } } - func doubleTap(_ element: Tappable) { - element.doubleTap() + func doubleTap(_ element: Tappable & CustomStringConvertible) -> StepAction { + return StepAction(description: "double tap on the \(element.description)") { + element.doubleTap() + } } - func twoFingerTap(_ element: Tappable) { - element.twoFingerTap() + func twoFingerTap(_ element: Tappable & CustomStringConvertible) -> StepAction { + return StepAction(description: "two finger tap on the \(element.description)") { + element.twoFingerTap() + } } - func longPress(_ element: Tappable, duration: TimeInterval = 0.5) { - element.longPress(duration: duration) + func longPress(_ element: Tappable & CustomStringConvertible, duration: TimeInterval = 0.5) -> StepAction { + return StepAction(description: "long press on the \(element.description)") { + element.longPress(duration: duration) + } } - func type(_ text: String, into element: Editable) { - element.type(text) + func type(_ text: String, into element: Editable & CustomStringConvertible) -> StepAction { + return StepAction(description: "type '\(text)' into the \(element.description)") { + element.type(text) + } } + + func clear(_ element: E) -> StepAction { + return StepAction(description: "clear the \(element.description)") { + element.clear() + } + } - func delete(_ numberOfCharacters: Int, charactersFrom element: Editable) { - element.delete(numberOfCharacters: numberOfCharacters) + func delete(_ numberOfCharacters: Int, charactersFrom element: Editable & CustomStringConvertible) -> StepAction { + return StepAction(description: "delete \(numberOfCharacters) characters from the \(element.description)") { + 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 { + + let stateDescription = states + .map { $0.description } + .joined(separator: " and ") + + return StepAction(description: "state of the \(element) \(stateDescription)") { + states.forEach { element.wait($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 { + + let stateDescription = states + .map { $0.negativeDescription } + .joined(separator: " or ") + + return StepAction(description: "state of the \(element) \(stateDescription)") { + states.forEach { element.wait(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 & CustomStringConvertible, _ direction: ElementAttributes.Direction, until otherElement: Element, is states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { + + let stateDescription = states + .map { $0.description } + .joined(separator: " and ") + + return StepAction(description: "scroll the \(element) \(direction) until the \(otherElement) \(stateDescription)") { + 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 & CustomStringConvertible, _ direction: ElementAttributes.Direction, until otherElement: Element, isNot states: ElementAttributes.State..., maxTries: Int = 10) -> StepAction { + + let stateDescription = states + .map { $0.negativeDescription } + .joined(separator: " or ") + + return StepAction(description: "scroll the \(element) \(direction) until the \(otherElement) \(stateDescription)") { + 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 & CustomStringConvertible, _ direction: ElementAttributes.Direction, until otherElement: Element, valueIs value: String, maxTries: Int = 10) -> StepAction { + return StepAction(description: "scroll the \(element) \(direction) until the \(otherElement)'s value is '\(value)'") { + 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 { + 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) { - 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 { + 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) { - element.adjust(to: newValue) + func adjust(_ element: AdjustableElement, to newValue: AdjustableElement.Value) -> StepAction { + return StepAction(description: "adjust the \(element) to '\(newValue)'") { + element.adjust(to: newValue) + } } - func refresh(_ refreshableThing: Refreshable) { - refreshableThing.refresh() + func refresh(_ refreshableThing: Refreshable & CustomStringConvertible) -> StepAction { + return StepAction(description: "refresh the \(refreshableThing)") { + refreshableThing.refresh() + } } } diff --git a/TABTestKit/Classes/Contexts/KeyboardContext.swift b/TABTestKit/Classes/Contexts/KeyboardContext.swift index f2b983ee..042de69c 100644 --- a/TABTestKit/Classes/Contexts/KeyboardContext.swift +++ b/TABTestKit/Classes/Contexts/KeyboardContext.swift @@ -8,12 +8,12 @@ import XCTest /// KeyboardContext contains functions for interacting and verifying the keyboard on-screen. -public protocol KeyboardContext {} -public extension KeyboardContext { - - func keyboardType(is type: Keyboard.KeyboardType) { +public extension TABTestCase { + + 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(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 71c4d5f3..07052a14 100644 --- a/TABTestKit/Classes/Contexts/NavigationContext.swift +++ b/TABTestKit/Classes/Contexts/NavigationContext.swift @@ -7,57 +7,80 @@ 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. - func see(_ screen: ScreenType) { - see(screen.trait) + func see(_ screen: ScreenType) -> StepAction { + return StepAction(description: "see the \(screen.description)") { + screen.trait.wait(.exists, .visible) + } } /// Asserts that a screen does not exist, by awaiting on its trait. /// /// - Parameter screen: The screen to await. - func doNotSee(_ screen: ScreenType) { - doNotSee(screen.trait) + func doNotSee(_ screen: ScreenType) -> StepAction { + return StepAction(description: "do not see the \(screen.description)") { + screen.trait.wait(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) { - element.await(.exists, .visible) + func see(_ element: Element) -> StepAction { + return StepAction(description: "see the \(element.description)") { + element.wait(.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 { + return StepAction(description: "do not see the \(element.description)") { + element.wait(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: CompletableWithDescription...) -> StepAction { + guard !completableThings.isEmpty else { XCTFatalFail("You must provide at least one Completable thing to complete!") } - completableThings.forEach { - $0.await() - $0.complete() - } + + let completableDescription = completableThings + .map { $0.description } + .joined(separator: " and the ") + + return StepAction(description: "complete the \(completableDescription)") { + completableThings.forEach { + $0.wait() + $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: DismissableWithDescription...) -> StepAction { + guard !dismissableThings.isEmpty else { XCTFatalFail("You must provide at least one Dismissable thing to dismiss!") } - dismissableThings.forEach { - $0.await() - $0.dismiss() - } + + let dismissableDescription = dismissableThings + .map { $0.description } + .joined(separator: " and the ") + + return StepAction(description: "dismiss the \(dismissableDescription)") { + dismissableThings.forEach { + $0.wait() + $0.dismiss() + } + } } /// Opens the specified URL from the test runner app. @@ -78,22 +101,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 { + 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 + 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..e9e385da 100644 --- a/TABTestKit/Classes/Contexts/SheetContext.swift +++ b/TABTestKit/Classes/Contexts/SheetContext.swift @@ -7,11 +7,12 @@ import Foundation -public protocol SheetContext {} -public extension SheetContext { - - func tap(_ actionButtonID: String, in sheet: Sheet) { - sheet.actionButton(withID: actionButtonID).tap() +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 b056bff3..3737b5a2 100644 --- a/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift +++ b/TABTestKit/Classes/Contexts/SystemPreferencesContext.swift @@ -7,27 +7,32 @@ import Foundation -public protocol SystemPreferencesContext {} -public extension SystemPreferencesContext { +public extension TABTestCase { - 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 { + return StepAction(description: "reset all privacy prompts") { + if SystemPreferences().state != .notRunning { + 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. + } + self.terminateSystemPreferences().execute() + self.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 { + return StepAction(description: "open system preferences") { + SystemPreferences().activate() + } } - func terminateSystemPreferences() { - SystemPreferences().terminate() + func terminateSystemPreferences() -> StepAction { + return StepAction(description: "terminate system preferences") { + SystemPreferences().terminate() + } } } 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/Attributes.swift b/TABTestKit/Classes/Elements/Attributes.swift index 3bc1cb02..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. @@ -58,3 +58,61 @@ public enum ElementAttributes { } } + +extension ElementAttributes.State: CustomStringConvertible { + public var description: String { + switch self { + case .exists: + return "exists" + case .hittable: + return "is hittable" + case .visible: + return "is visible" + case let .visibleIn(element): + return "is visible in the \(element.description)" + case .selected: + return "is selected" + case .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" + } + } +} + +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.description) to \(toCoordinate.description)" + + } + } +} 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 5b923e06..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 } @@ -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. @@ -96,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..cd9e98bf 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, 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/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/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/Extensions/String+HumanReadableString.swift b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift new file mode 100644 index 00000000..16c38142 --- /dev/null +++ b/TABTestKit/Classes/Extensions/String+HumanReadableString.swift @@ -0,0 +1,86 @@ +// +// String+HumanReadableString.swift +// TABTestKit +// +// Created by Stefan Renne on 09/11/2020. +// + +import Foundation + +extension String { + public 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: { $0.isLowercase }) else { + return word + } + return word.lcfirst + } + .joined(separator: " ") + } +} + +extension Sequence where Element == String { + public var humanReadableString: String { + return map { $0.humanReadableString } + .filter { !$0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty } + .joined(separator: " ") + } +} + +private extension String { + func occurences(of characterSet: CharacterSet) -> Int { + return 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() + } +} + +extension Int { + + public var humanReadableIndex: String { + let indexFormatter = NumberFormatter() + indexFormatter.numberStyle = .ordinal + indexFormatter.locale = Locale(identifier: "en_GB") + return indexFormatter.string(for: self + 1) ?? "" + } +} + +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/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/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 f2d13696..1ed5bf5d 100644 --- a/TABTestKit/Classes/Protocols/Editable.swift +++ b/TABTestKit/Classes/Protocols/Editable.swift @@ -21,14 +21,23 @@ 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) } } + +public extension Element where Self: Editable & ValueRepresentable { + + func clear() { + 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 6db3342a..9dcefe84 100644 --- a/TABTestKit/Classes/Protocols/Element.swift +++ b/TABTestKit/Classes/Protocols/Element.swift @@ -10,13 +10,16 @@ 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. /// 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, 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 } @@ -42,6 +45,8 @@ public protocol Element { } public extension Element { + + var name: String? { return nil } var parent: Element { return App.shared } @@ -56,7 +61,21 @@ public extension Element { var topCoordinate: CGVector { return defaultTopCoordinate } var underlyingXCUIElement: XCUIElement { return defaultUnderlyingXCUIElement } - +} + +extension Element { + public var description: String { + + if let name = name { + return name + } + + let indexString: String? = index > 0 ? index.humanReadableIndex : nil + + return [indexString, id, String(describing: Swift.type(of: self))] + .compactMap { $0 } + .humanReadableString + } } public extension Element { @@ -64,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)") @@ -94,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 da3f5c59..a57732b3 100644 --- a/TABTestKit/Classes/Protocols/Screen.swift +++ b/TABTestKit/Classes/Protocols/Screen.swift @@ -14,19 +14,27 @@ 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 } + /// The name of the screen. Used in the step description + var description: String { get } +} + +extension Screen { + + public var description: String { + return String(describing: Swift.type(of: self)).humanReadableString + } } 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/TABTestKit/Classes/TABTestCase.swift b/TABTestKit/Classes/TABTestCase.swift index bd7f0eb8..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,36 @@ 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 + + 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? + + /// 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 + public private(set) var screenshotLifetime: XCTAttachment.Lifetime = .deleteOnSuccess + + 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. @@ -39,9 +66,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. @@ -60,11 +85,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. @@ -75,14 +96,38 @@ 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, 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) - let filePath = Step.current?.filePath ?? filePath - let lineNumber = Step.current?.lineNumber ?? lineNumber + currentActivity?.add(attachment) + + createScreenshotIfNeeded(for: .onFailure, in: currentActivity) + + let filePath = TABTestCase.currentStep?.filePath ?? filePath + let lineNumber = TABTestCase.currentStep?.lineNumber ?? lineNumber super.recordFailure(withDescription: description, inFile: filePath, atLine: lineNumber, expected: expected) } @@ -91,7 +136,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 \(TABTestCase.currentStep?.line ?? 0) in file \(TABTestCase.currentStep?.file ?? "unknown") Actual file that failed: \(filePath) Actual line that failed: \(lineNumber) 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 + + +