From c316e3b2f339b8c7453760e6f2a556d96a4ad972 Mon Sep 17 00:00:00 2001 From: Ernesto Rivera Date: Wed, 13 Nov 2019 09:45:18 -0400 Subject: [PATCH 1/6] Fix podspec by excluding newly created Package.swift --- AMPopTip.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AMPopTip.podspec b/AMPopTip.podspec index 0282015b..19d9a181 100644 --- a/AMPopTip.podspec +++ b/AMPopTip.podspec @@ -15,7 +15,7 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/andreamazz/AMPopTip.git", :tag => s.version } s.platform = :ios, '8.0' s.swift_version = '5.0' - s.source_files = 'Source', '*.{swift}' + s.source_files = 'Source/*.swift' s.requires_arc = true s.social_media_url = 'https://twitter.com/theandreamazz' end From 50edf94a7bd1009a404967617a7730f34dc3319a Mon Sep 17 00:00:00 2001 From: Ernesto Rivera Date: Wed, 13 Nov 2019 09:55:08 -0400 Subject: [PATCH 2/6] pod update demo project Updates all dependencies --- Demo/Podfile | 6 +- Demo/Podfile.lock | 51 +- .../Pods/Local Podspecs/AMPopTip.podspec.json | 14 +- Demo/Pods/Manifest.lock | 51 +- .../CurrentTestCaseTracker.swift | 38 + .../DynamicSize/DynamicSizeSnapshot.swift | 217 ++ .../HaveValidDynamicTypeSnapshot.swift | 120 + .../DynamicType/NBSMockedApplication.h | 13 + .../DynamicType/NBSMockedApplication.m | 160 ++ .../DynamicType/PrettyDynamicTypeSyntax.swift | 45 + .../Nimble-Snapshots/HaveValidSnapshot.swift | 234 +- .../NimbleSnapshotsConfiguration.swift | 10 - Demo/Pods/Nimble-Snapshots/PrettySyntax.swift | 26 +- Demo/Pods/Nimble-Snapshots/README.md | 82 +- ...ObservationCenter+CurrentTestCaseTracker.h | 5 + ...ObservationCenter+CurrentTestCaseTracker.m | 10 + .../CwlCatchException/CwlCatchException.swift | 8 +- .../CwlCatchException.m | 2 +- .../include/CwlCatchException.h | 2 +- .../CwlMachBadInstructionHandler.m | 0 .../include/CwlMachBadInstructionHandler.h | 2 +- .../mach_excServer.c | 0 .../mach_excServer.h | 0 .../CwlBadInstructionException.swift | 0 .../CwlCatchBadInstruction.swift | 44 +- .../CwlDarwinDefinitions.swift | 0 .../Mach/CwlPreconditionTesting.h | 2 + Demo/Pods/Nimble/README.md | 710 +++-- .../Nimble/Adapters/AssertionRecorder.swift | 4 +- .../Nimble/Adapters/NMBExpectation.swift | 146 +- .../Nimble/Adapters/NMBObjCMatcher.swift | 40 +- .../Nimble/Adapters/NimbleEnvironment.swift | 11 +- .../Nimble/Adapters/NimbleXCTestHandler.swift | 22 +- .../Pods/Nimble/Sources/Nimble/DSL+Wait.swift | 40 +- Demo/Pods/Nimble/Sources/Nimble/DSL.swift | 2 +- .../Nimble/Sources/Nimble/Expectation.swift | 100 +- .../Sources/Nimble/ExpectationMessage.swift | 264 ++ .../Nimble/Sources/Nimble/Expression.swift | 13 +- .../Sources/Nimble/FailureMessage.swift | 27 + .../Sources/Nimble/Matchers/AllPass.swift | 127 +- .../Sources/Nimble/Matchers/Async.swift | 179 ++ .../Nimble/Matchers/AsyncMatcherWrapper.swift | 141 - .../Sources/Nimble/Matchers/BeAKindOf.swift | 64 +- .../Nimble/Matchers/BeAnInstanceOf.swift | 56 +- .../Sources/Nimble/Matchers/BeCloseTo.swift | 72 +- .../Sources/Nimble/Matchers/BeEmpty.swift | 74 +- .../Nimble/Matchers/BeGreaterThan.swift | 27 +- .../Matchers/BeGreaterThanOrEqualTo.swift | 24 +- .../Nimble/Matchers/BeIdenticalTo.swift | 53 +- .../Sources/Nimble/Matchers/BeLessThan.swift | 24 +- .../Nimble/Matchers/BeLessThanOrEqual.swift | 25 +- .../Sources/Nimble/Matchers/BeLogical.swift | 62 +- .../Sources/Nimble/Matchers/BeNil.swift | 13 +- .../Sources/Nimble/Matchers/BeVoid.swift | 7 +- .../Sources/Nimble/Matchers/BeginWith.swift | 44 +- .../Sources/Nimble/Matchers/Contain.swift | 61 +- .../Matchers/ContainElementSatisfying.swift | 29 +- .../Sources/Nimble/Matchers/EndWith.swift | 44 +- .../Sources/Nimble/Matchers/Equal.swift | 187 +- .../Sources/Nimble/Matchers/HaveCount.swift | 44 +- .../Sources/Nimble/Matchers/Match.swift | 19 +- .../Sources/Nimble/Matchers/MatchError.swift | 70 +- .../Sources/Nimble/Matchers/MatcherFunc.swift | 22 +- .../Nimble/Matchers/MatcherProtocols.swift | 77 +- .../Nimble/Matchers/PostNotification.swift | 50 +- .../Sources/Nimble/Matchers/Predicate.swift | 352 +++ .../Nimble/Matchers/RaisesException.swift | 63 +- .../Nimble/Matchers/SatisfyAllOf.swift | 76 + .../Nimble/Matchers/SatisfyAnyOf.swift | 82 +- .../Nimble/Matchers/ThrowAssertion.swift | 35 +- .../Sources/Nimble/Matchers/ThrowError.swift | 259 +- .../Sources/Nimble/Matchers/ToSucceed.swift | 37 + Demo/Pods/Nimble/Sources/Nimble/Nimble.h | 6 +- .../Nimble/Utils/{Async.swift => Await.swift} | 66 +- .../Nimble/Sources/Nimble/Utils/Errors.swift | 82 +- .../Sources/Nimble/Utils/Stringers.swift | 28 +- .../NimbleObjectiveC/CurrentTestCaseTracker.h | 9 - .../Nimble/Sources/NimbleObjectiveC/DSL.h | 12 +- .../Nimble/Sources/NimbleObjectiveC/DSL.m | 25 +- .../NimbleObjectiveC/NMBExceptionCapture.h | 4 +- .../NimbleObjectiveC/NMBExceptionCapture.m | 6 +- .../Sources/NimbleObjectiveC/NMBStringify.h | 2 +- .../Sources/NimbleObjectiveC/NMBStringify.m | 5 + .../XCTestObservationCenter+Register.m | 7 +- Demo/Pods/Pods.xcodeproj/project.pbxproj | 2480 +++++++++-------- Demo/Pods/Quick/README.md | 5 +- Demo/Pods/Quick/Sources/Quick/Behavior.swift | 21 + Demo/Pods/Quick/Sources/Quick/Callsite.swift | 26 +- .../Quick/Configuration/Configuration.swift | 4 +- .../Configuration/QuickConfiguration.swift | 78 + Demo/Pods/Quick/Sources/Quick/DSL/DSL.swift | 44 +- .../Quick/Sources/Quick/DSL/World+DSL.swift | 59 +- .../Quick/Sources/Quick/ErrorUtility.swift | 2 +- Demo/Pods/Quick/Sources/Quick/Example.swift | 20 +- .../Quick/Sources/Quick/ExampleGroup.swift | 21 +- .../Quick/Sources/Quick/ExampleMetadata.swift | 9 +- Demo/Pods/Quick/Sources/Quick/Filter.swift | 9 +- .../Quick/NSBundle+CurrentTestBundle.swift | 4 +- .../NSString+C99ExtendedIdentifier.swift | 33 - .../Quick/QuickSelectedTestSuiteBuilder.swift | 2 +- .../Quick/Sources/Quick/QuickTestSuite.swift | 12 +- .../Quick/String+C99ExtendedIdentifier.swift | 46 + Demo/Pods/Quick/Sources/Quick/World.swift | 48 +- .../Configuration/QuickConfiguration.m | 50 +- .../Sources/QuickObjectiveC/DSL/QCKDSL.m | 8 +- .../Sources/QuickObjectiveC/DSL/World+DSL.h | 20 - .../Quick/Sources/QuickObjectiveC/QuickSpec.h | 6 + .../Quick/Sources/QuickObjectiveC/QuickSpec.m | 88 +- .../Quick/Sources/QuickObjectiveC/World.h | 18 - .../XCTestSuite+QuickTestSuiteBuilder.m | 5 + .../Sources/QuickSpecBase/QuickSpecBase.m | 27 +- .../QuickSpecBase/include/QuickSpecBase.h | 10 +- .../AMPopTip-Info.plist} | 2 +- .../AMPopTip/AMPopTip.xcconfig | 4 +- .../FBSnapshotTestCase-dummy.m | 5 - .../FBSnapshotTestCase.xcconfig | 12 - .../Nimble-Snapshots-Info.plist | 26 + .../Nimble-Snapshots-umbrella.h | 2 + .../Nimble-Snapshots.xcconfig | 7 +- .../Nimble/Nimble-Info.plist | 26 + .../Nimble/Nimble-umbrella.h | 8 +- .../Nimble/Nimble.xcconfig | 6 +- ...ds-PopTip Demo-PopTip Extension-Info.plist | 26 + ...opTip Demo-PopTip Extension.debug.xcconfig | 6 +- ...Tip Demo-PopTip Extension.release.xcconfig | 6 +- .../Pods-PopTip Demo-Info.plist | 26 + .../Pods-PopTip Demo-frameworks.sh | 38 +- .../Pods-PopTip Demo.debug.xcconfig | 6 +- .../Pods-PopTip Demo.release.xcconfig | 6 +- .../Pods-PopTip DemoTests-Info.plist | 26 + ...PopTip DemoTests-acknowledgements.markdown | 91 +- ...ds-PopTip DemoTests-acknowledgements.plist | 103 +- .../Pods-PopTip DemoTests-frameworks.sh | 42 +- .../Pods-PopTip DemoTests.debug.xcconfig | 10 +- .../Pods-PopTip DemoTests.release.xcconfig | 10 +- .../Quick/Quick-Info.plist | 26 + .../Target Support Files/Quick/Quick.xcconfig | 8 +- .../iOSSnapshotTestCase-Info.plist | 26 + .../iOSSnapshotTestCase-dummy.m | 5 + .../iOSSnapshotTestCase-prefix.pch} | 0 .../iOSSnapshotTestCase-umbrella.h} | 0 .../iOSSnapshotTestCase.modulemap} | 2 +- .../iOSSnapshotTestCase.xcconfig | 13 + .../UIApplication+StrictKeyWindow.h | 0 .../UIApplication+StrictKeyWindow.m | 0 .../Categories/UIImage+Compare.h | 0 .../Categories/UIImage+Compare.m | 0 .../Categories/UIImage+Diff.h | 0 .../Categories/UIImage+Diff.m | 0 .../Categories/UIImage+Snapshot.h | 0 .../Categories/UIImage+Snapshot.m | 11 +- .../FBSnapshotTestCase/FBSnapshotTestCase.h | 17 +- .../FBSnapshotTestCase/FBSnapshotTestCase.m | 14 +- .../FBSnapshotTestCasePlatform.h | 24 + .../FBSnapshotTestCasePlatform.m | 30 +- .../FBSnapshotTestController.h | 22 +- .../FBSnapshotTestController.m | 14 +- .../FBSnapshotTestCase/SwiftSupport.swift | 2 +- .../LICENSE | 29 +- .../README.md | 29 +- Demo/PopTip Demo.xcodeproj/project.pbxproj | 12 +- 161 files changed, 6080 insertions(+), 3125 deletions(-) create mode 100644 Demo/Pods/Nimble-Snapshots/CurrentTestCaseTracker.swift create mode 100644 Demo/Pods/Nimble-Snapshots/DynamicSize/DynamicSizeSnapshot.swift create mode 100644 Demo/Pods/Nimble-Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift create mode 100644 Demo/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.h create mode 100644 Demo/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.m create mode 100644 Demo/Pods/Nimble-Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift delete mode 100644 Demo/Pods/Nimble-Snapshots/NimbleSnapshotsConfiguration.swift create mode 100644 Demo/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.h create mode 100644 Demo/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.m rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlCatchException/Sources}/CwlCatchException/CwlCatchException.swift (76%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlCatchException/Sources}/CwlCatchExceptionSupport/CwlCatchException.m (95%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlCatchException/Sources}/CwlCatchExceptionSupport/include/CwlCatchException.h (95%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlPreconditionTesting/Sources}/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m (100%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlPreconditionTesting/Sources}/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h (98%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlPreconditionTesting/Sources}/CwlMachBadInstructionHandler/mach_excServer.c (100%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlPreconditionTesting/Sources}/CwlMachBadInstructionHandler/mach_excServer.h (100%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlPreconditionTesting/Sources}/CwlPreconditionTesting/CwlBadInstructionException.swift (100%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlPreconditionTesting/Sources}/CwlPreconditionTesting/CwlCatchBadInstruction.swift (77%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlPreconditionTesting/Sources}/CwlPreconditionTesting/CwlDarwinDefinitions.swift (100%) rename Demo/Pods/Nimble/{Sources/Lib/CwlPreconditionTesting => Carthage/Checkouts/CwlPreconditionTesting/Sources}/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h (96%) create mode 100644 Demo/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift create mode 100644 Demo/Pods/Nimble/Sources/Nimble/Matchers/Async.swift delete mode 100644 Demo/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift create mode 100644 Demo/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift create mode 100644 Demo/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift create mode 100644 Demo/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift rename Demo/Pods/Nimble/Sources/Nimble/Utils/{Async.swift => Await.swift} (88%) delete mode 100644 Demo/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h create mode 100644 Demo/Pods/Quick/Sources/Quick/Behavior.swift create mode 100644 Demo/Pods/Quick/Sources/Quick/Configuration/QuickConfiguration.swift delete mode 100644 Demo/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift create mode 100644 Demo/Pods/Quick/Sources/Quick/String+C99ExtendedIdentifier.swift delete mode 100644 Demo/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h delete mode 100644 Demo/Pods/Quick/Sources/QuickObjectiveC/World.h rename Demo/Pods/Target Support Files/{FBSnapshotTestCase/Info.plist => AMPopTip/AMPopTip-Info.plist} (96%) delete mode 100644 Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m delete mode 100644 Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig create mode 100644 Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist create mode 100644 Demo/Pods/Target Support Files/Nimble/Nimble-Info.plist create mode 100644 Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension-Info.plist create mode 100644 Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-Info.plist create mode 100644 Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-Info.plist create mode 100644 Demo/Pods/Target Support Files/Quick/Quick-Info.plist create mode 100644 Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-Info.plist create mode 100644 Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-dummy.m rename Demo/Pods/Target Support Files/{FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch => iOSSnapshotTestCase/iOSSnapshotTestCase-prefix.pch} (100%) rename Demo/Pods/Target Support Files/{FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h => iOSSnapshotTestCase/iOSSnapshotTestCase-umbrella.h} (100%) rename Demo/Pods/Target Support Files/{FBSnapshotTestCase/FBSnapshotTestCase.modulemap => iOSSnapshotTestCase/iOSSnapshotTestCase.modulemap} (59%) create mode 100644 Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase.xcconfig rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h (100%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m (100%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/Categories/UIImage+Compare.h (100%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/Categories/UIImage+Compare.m (100%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/Categories/UIImage+Diff.h (100%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/Categories/UIImage+Diff.m (100%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/Categories/UIImage+Snapshot.h (100%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/Categories/UIImage+Snapshot.m (99%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/FBSnapshotTestCase.h (91%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/FBSnapshotTestCase.m (93%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h (50%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m (55%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/FBSnapshotTestController.h (86%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/FBSnapshotTestController.m (97%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/FBSnapshotTestCase/SwiftSupport.swift (98%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/LICENSE (54%) rename Demo/Pods/{FBSnapshotTestCase => iOSSnapshotTestCase}/README.md (64%) diff --git a/Demo/Podfile b/Demo/Podfile index 07050346..7b9cdd2d 100644 --- a/Demo/Podfile +++ b/Demo/Podfile @@ -11,9 +11,9 @@ target 'PopTip Demo' do target 'PopTip DemoTests' do inherit! :search_paths - pod 'Quick', '1.1.0' - pod 'Nimble', '6.1.0' - pod 'Nimble-Snapshots', '4.4.0' + pod 'Quick' + pod 'Nimble' + pod 'Nimble-Snapshots' end end diff --git a/Demo/Podfile.lock b/Demo/Podfile.lock index 06d78d10..5f4ad05c 100644 --- a/Demo/Podfile.lock +++ b/Demo/Podfile.lock @@ -1,28 +1,27 @@ PODS: - - AMPopTip (3.6.0) - - FBSnapshotTestCase (2.1.4): - - FBSnapshotTestCase/SwiftSupport (= 2.1.4) - - FBSnapshotTestCase/Core (2.1.4) - - FBSnapshotTestCase/SwiftSupport (2.1.4): - - FBSnapshotTestCase/Core - - Nimble (6.1.0) - - Nimble-Snapshots (4.4.0): - - Nimble-Snapshots/Core (= 4.4.0) - - Nimble-Snapshots/Core (4.4.0): - - FBSnapshotTestCase (~> 2.0) - - Nimble - - Quick - - Quick (1.1.0) + - AMPopTip (4.2.0) + - iOSSnapshotTestCase (2.2.0): + - iOSSnapshotTestCase/SwiftSupport (= 2.2.0) + - iOSSnapshotTestCase/Core (2.2.0) + - iOSSnapshotTestCase/SwiftSupport (2.2.0): + - iOSSnapshotTestCase/Core + - Nimble (7.3.4) + - Nimble-Snapshots (6.4.1): + - Nimble-Snapshots/Core (= 6.4.1) + - Nimble-Snapshots/Core (6.4.1): + - iOSSnapshotTestCase (~> 2.0) + - Nimble (~> 7.0) + - Quick (2.2.0) DEPENDENCIES: - AMPopTip (from `../`) - - Nimble (= 6.1.0) - - Nimble-Snapshots (= 4.4.0) - - Quick (= 1.1.0) + - Nimble + - Nimble-Snapshots + - Quick SPEC REPOS: - https://github.com/cocoapods/specs.git: - - FBSnapshotTestCase + trunk: + - iOSSnapshotTestCase - Nimble - Nimble-Snapshots - Quick @@ -32,12 +31,12 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - AMPopTip: ebba6ae1859d3b22a68562e1baf8ea0e159b545e - FBSnapshotTestCase: 094f9f314decbabe373b87cc339bea235a63e07a - Nimble: c53e6903fee94041b90ded74f135820437d8bf59 - Nimble-Snapshots: e743439f26c2fa99d8f7e0d7c01c99bcb40aa6f2 - Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d + AMPopTip: f7d587e42dca04778c86ecceed790a6f72362e36 + iOSSnapshotTestCase: 415bd84f9dbba4ff45fede49d800bc7332fbedac + Nimble: 051e3d8912d40138fa5591c78594f95fb172af37 + Nimble-Snapshots: 438fb1a6fa3c655e246fc9ac375f6cd2964d759a + Quick: 7fb19e13be07b5dfb3b90d4f9824c855a11af40e -PODFILE CHECKSUM: 68d6239712fba8e0da2721828fdb2901c0ef7977 +PODFILE CHECKSUM: 427d9003aa8e98a2af5857ca6737809dc88b2119 -COCOAPODS: 1.5.3 +COCOAPODS: 1.8.4 diff --git a/Demo/Pods/Local Podspecs/AMPopTip.podspec.json b/Demo/Pods/Local Podspecs/AMPopTip.podspec.json index 6712c1ba..7c2c584f 100644 --- a/Demo/Pods/Local Podspecs/AMPopTip.podspec.json +++ b/Demo/Pods/Local Podspecs/AMPopTip.podspec.json @@ -1,6 +1,6 @@ { "name": "AMPopTip", - "version": "3.6.0", + "version": "4.2.0", "summary": "Animated popover, great for subtle UI tips and onboarding.", "description": "Animated popover that pops out of a frame. You can specify the\ndirection of the popover and the arrow that points to its origin.\nColor, border radius and font can be easily customized.\nThis popover can be used to leave subtle hints about your UI and\nprovide fun looking onboarding popups.", "homepage": "https://github.com/andreamazz/AMPopTip", @@ -13,16 +13,14 @@ }, "source": { "git": "https://github.com/andreamazz/AMPopTip.git", - "tag": "3.6.0" + "tag": "4.2.0" }, "platforms": { "ios": "8.0" }, - "swift_version": "5.0", - "source_files": [ - "Source", - "*.{swift}" - ], + "swift_versions": "5.0", + "source_files": "Source/*.swift", "requires_arc": true, - "social_media_url": "https://twitter.com/theandreamazz" + "social_media_url": "https://twitter.com/theandreamazz", + "swift_version": "5.0" } diff --git a/Demo/Pods/Manifest.lock b/Demo/Pods/Manifest.lock index 06d78d10..5f4ad05c 100644 --- a/Demo/Pods/Manifest.lock +++ b/Demo/Pods/Manifest.lock @@ -1,28 +1,27 @@ PODS: - - AMPopTip (3.6.0) - - FBSnapshotTestCase (2.1.4): - - FBSnapshotTestCase/SwiftSupport (= 2.1.4) - - FBSnapshotTestCase/Core (2.1.4) - - FBSnapshotTestCase/SwiftSupport (2.1.4): - - FBSnapshotTestCase/Core - - Nimble (6.1.0) - - Nimble-Snapshots (4.4.0): - - Nimble-Snapshots/Core (= 4.4.0) - - Nimble-Snapshots/Core (4.4.0): - - FBSnapshotTestCase (~> 2.0) - - Nimble - - Quick - - Quick (1.1.0) + - AMPopTip (4.2.0) + - iOSSnapshotTestCase (2.2.0): + - iOSSnapshotTestCase/SwiftSupport (= 2.2.0) + - iOSSnapshotTestCase/Core (2.2.0) + - iOSSnapshotTestCase/SwiftSupport (2.2.0): + - iOSSnapshotTestCase/Core + - Nimble (7.3.4) + - Nimble-Snapshots (6.4.1): + - Nimble-Snapshots/Core (= 6.4.1) + - Nimble-Snapshots/Core (6.4.1): + - iOSSnapshotTestCase (~> 2.0) + - Nimble (~> 7.0) + - Quick (2.2.0) DEPENDENCIES: - AMPopTip (from `../`) - - Nimble (= 6.1.0) - - Nimble-Snapshots (= 4.4.0) - - Quick (= 1.1.0) + - Nimble + - Nimble-Snapshots + - Quick SPEC REPOS: - https://github.com/cocoapods/specs.git: - - FBSnapshotTestCase + trunk: + - iOSSnapshotTestCase - Nimble - Nimble-Snapshots - Quick @@ -32,12 +31,12 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - AMPopTip: ebba6ae1859d3b22a68562e1baf8ea0e159b545e - FBSnapshotTestCase: 094f9f314decbabe373b87cc339bea235a63e07a - Nimble: c53e6903fee94041b90ded74f135820437d8bf59 - Nimble-Snapshots: e743439f26c2fa99d8f7e0d7c01c99bcb40aa6f2 - Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d + AMPopTip: f7d587e42dca04778c86ecceed790a6f72362e36 + iOSSnapshotTestCase: 415bd84f9dbba4ff45fede49d800bc7332fbedac + Nimble: 051e3d8912d40138fa5591c78594f95fb172af37 + Nimble-Snapshots: 438fb1a6fa3c655e246fc9ac375f6cd2964d759a + Quick: 7fb19e13be07b5dfb3b90d4f9824c855a11af40e -PODFILE CHECKSUM: 68d6239712fba8e0da2721828fdb2901c0ef7977 +PODFILE CHECKSUM: 427d9003aa8e98a2af5857ca6737809dc88b2119 -COCOAPODS: 1.5.3 +COCOAPODS: 1.8.4 diff --git a/Demo/Pods/Nimble-Snapshots/CurrentTestCaseTracker.swift b/Demo/Pods/Nimble-Snapshots/CurrentTestCaseTracker.swift new file mode 100644 index 00000000..d5431037 --- /dev/null +++ b/Demo/Pods/Nimble-Snapshots/CurrentTestCaseTracker.swift @@ -0,0 +1,38 @@ +import XCTest + +/// Helper class providing access to the currently executing XCTestCase instance, if any +@objc public final class CurrentTestCaseTracker: NSObject, XCTestObservation { + @objc public static let shared = CurrentTestCaseTracker() + + private(set) var currentTestCase: XCTestCase? + + @objc public func testCaseWillStart(_ testCase: XCTestCase) { + currentTestCase = testCase + } + + @objc public func testCaseDidFinish(_ testCase: XCTestCase) { + currentTestCase = nil + } +} + +extension XCTestCase { + var sanitizedName: String? { + let fullName = self.name + let characterSet = CharacterSet(charactersIn: "[]+-") + #if swift(>=4) + let name = fullName.components(separatedBy: characterSet).joined() + #else + let name = (fullName ?? "").components(separatedBy: characterSet).joined() + #endif + + if let quickClass = NSClassFromString("QuickSpec"), self.isKind(of: quickClass) { + let className = String(describing: type(of: self)) + if let range = name.range(of: className), range.lowerBound == name.startIndex { + return name.replacingCharacters(in: range, with: "") + .trimmingCharacters(in: .whitespacesAndNewlines) + } + } + + return name + } +} diff --git a/Demo/Pods/Nimble-Snapshots/DynamicSize/DynamicSizeSnapshot.swift b/Demo/Pods/Nimble-Snapshots/DynamicSize/DynamicSizeSnapshot.swift new file mode 100644 index 00000000..d1041436 --- /dev/null +++ b/Demo/Pods/Nimble-Snapshots/DynamicSize/DynamicSizeSnapshot.swift @@ -0,0 +1,217 @@ +import Foundation +import Nimble +import QuartzCore +import UIKit + +public enum ResizeMode { + case frame + case constrains + case block(resizeBlock: (UIView, CGSize) -> Void) + case custom(viewResizer: ViewResizer) + + func viewResizer() -> ViewResizer { + switch self { + case .frame: + return FrameViewResizer() + + case .constrains: + return ConstraintViewResizer() + + case .block(resizeBlock: let block): + return BlockViewResizer(block: block) + + case .custom(viewResizer: let resizer): + return resizer + } + } +} + +public protocol ViewResizer { + func resize(view: UIView, for size: CGSize) +} + +struct FrameViewResizer: ViewResizer { + func resize(view: UIView, for size: CGSize) { + view.frame = CGRect(origin: .zero, size: size) + view.layoutIfNeeded() + } +} + +struct BlockViewResizer: ViewResizer { + + let resizeBlock: (UIView, CGSize) -> Void + + init(block: @escaping (UIView, CGSize) -> Void) { + self.resizeBlock = block + } + + func resize(view: UIView, for size: CGSize) { + self.resizeBlock(view, size) + } +} + +class ConstraintViewResizer: ViewResizer { + + typealias SizeConstrainsWrapper = (heightConstrain: NSLayoutConstraint, widthConstrain: NSLayoutConstraint) + + func resize(view: UIView, for size: CGSize) { + let sizesConstrains = findConstrains(of: view) + + sizesConstrains.heightConstrain.constant = size.height + sizesConstrains.widthConstrain.constant = size.width + + NSLayoutConstraint.activate([sizesConstrains.heightConstrain, + sizesConstrains.widthConstrain]) + + view.layoutIfNeeded() + + //iOS 9+ BUG: Before the first draw, iOS will not calculate the layout, + // it add a _UITemporaryLayoutWidth equals to its bounds and create a conflict. + // So to it do all the layout we create a Window and add it as subview + if view.bounds.width != size.width || view.bounds.height != size.height { + let window = UIWindow(frame: CGRect(origin: .zero, size: size)) + let viewController = UIViewController() + viewController.view = UIView() + viewController.view.addSubview(view) + window.rootViewController = viewController + window.makeKeyAndVisible() + view.setNeedsLayout() + view.layoutIfNeeded() + } + } + + func findConstrains(of view: UIView) -> SizeConstrainsWrapper { + var height: NSLayoutConstraint! + var width: NSLayoutConstraint! + + let heightLayout = NSLayoutAttribute.height + let widthLayout = NSLayoutAttribute.width + let equalRelation = NSLayoutRelation.equal + + for constrain in view.constraints { + if constrain.firstAttribute == heightLayout && + constrain.relation == equalRelation && constrain.secondItem == nil { + height = constrain + } + + if constrain.firstAttribute == widthLayout && + constrain.relation == equalRelation && constrain.secondItem == nil { + width = constrain + } + } + + if height == nil { + height = NSLayoutConstraint(item: view, attribute: heightLayout, relatedBy: equalRelation, toItem: nil, + attribute: heightLayout, multiplier: 1, constant: 0) + view.addConstraint(height) + } + + if width == nil { + width = NSLayoutConstraint(item: view, attribute: widthLayout, relatedBy: equalRelation, toItem: nil, + attribute: widthLayout, multiplier: 1, constant: 0) + view.addConstraint(width) + } + + return (height, width) + } +} + +public struct DynamicSizeSnapshot { + let name: String? + let record: Bool + let sizes: [String: CGSize] + let resizeMode: ResizeMode + + init(name: String?, record: Bool, sizes: [String: CGSize], resizeMode: ResizeMode) { + self.name = name + self.record = record + self.sizes = sizes + self.resizeMode = resizeMode + } +} + +public func snapshot(_ name: String? = nil, sizes: [String: CGSize], + resizeMode: ResizeMode = .frame) -> DynamicSizeSnapshot { + return DynamicSizeSnapshot(name: name, record: false, sizes: sizes, resizeMode: resizeMode) +} + +public func haveValidDynamicSizeSnapshot(named name: String? = nil, sizes: [String: CGSize], + isDeviceAgnostic: Bool = false, usesDrawRect: Bool = false, + tolerance: CGFloat? = nil, + resizeMode: ResizeMode = .frame) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + return performDynamicSizeSnapshotTest(name, sizes: sizes, isDeviceAgnostic: isDeviceAgnostic, + usesDrawRect: usesDrawRect, actualExpression: actualExpression, + failureMessage: failureMessage, tolerance: tolerance, + isRecord: false, resizeMode: resizeMode) + } +} + +// swiftlint:disable:next function_parameter_count +func performDynamicSizeSnapshotTest(_ name: String?, sizes: [String: CGSize], isDeviceAgnostic: Bool = false, + usesDrawRect: Bool = false, actualExpression: Expression, + failureMessage: FailureMessage, tolerance: CGFloat? = nil, isRecord: Bool, + resizeMode: ResizeMode) -> Bool { + // swiftlint:disable:next force_try force_unwrapping + let instance = try! actualExpression.evaluate()! + let testFileLocation = actualExpression.location.file + let referenceImageDirectory = getDefaultReferenceDirectory(testFileLocation) + let snapshotName = sanitizedTestName(name) + let tolerance = tolerance ?? getTolerance() + + let resizer = resizeMode.viewResizer() + + let result = sizes.map { (sizeName, size) -> Bool in + // swiftlint:disable:next force_unwrapping + let view = instance.snapshotObject! + + resizer.resize(view: view, for: size) + + return FBSnapshotTest.compareSnapshot(instance, isDeviceAgnostic: isDeviceAgnostic, usesDrawRect: usesDrawRect, + snapshot: "\(snapshotName) - \(sizeName)", record: isRecord, + referenceDirectory: referenceImageDirectory, tolerance: tolerance, + filename: actualExpression.location.file) + } + + if isRecord { + if result.filter({ !$0 }).isEmpty { + let name = name ?? snapshotName + failureMessage.actualValue = "snapshot \(name) successfully recorded, replace recordSnapshot with a check" + } else { + failureMessage.actualValue = "expected to record a snapshot in \(String(describing: name))" + } + + return false + } else { + if !result.filter({ !$0 }).isEmpty { + clearFailureMessage(failureMessage) + failureMessage.actualValue = "expected a matching snapshot in \(snapshotName)" + return false + } + + return true + } +} + +public func recordSnapshot(_ name: String? = nil, sizes: [String: CGSize], + resizeMode: ResizeMode = .frame) -> DynamicSizeSnapshot { + return DynamicSizeSnapshot(name: name, record: true, sizes: sizes, resizeMode: resizeMode) +} + +public func recordDynamicSizeSnapshot(named name: String? = nil, sizes: [String: CGSize], + isDeviceAgnostic: Bool = false, usesDrawRect: Bool = false, + resizeMode: ResizeMode = .frame) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + return performDynamicSizeSnapshotTest(name, sizes: sizes, isDeviceAgnostic: isDeviceAgnostic, + usesDrawRect: usesDrawRect, actualExpression: actualExpression, + failureMessage: failureMessage, isRecord: true, resizeMode: resizeMode) + } +} + +public func == (lhs: Expectation, rhs: DynamicSizeSnapshot) { + if rhs.record { + lhs.to(recordDynamicSizeSnapshot(named: rhs.name, sizes: rhs.sizes, resizeMode: rhs.resizeMode)) + } else { + lhs.to(haveValidDynamicSizeSnapshot(named: rhs.name, sizes: rhs.sizes, resizeMode: rhs.resizeMode)) + } +} diff --git a/Demo/Pods/Nimble-Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift b/Demo/Pods/Nimble-Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift new file mode 100644 index 00000000..5ffcb4ff --- /dev/null +++ b/Demo/Pods/Nimble-Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift @@ -0,0 +1,120 @@ +import Nimble +import UIKit + +public func allContentSizeCategories() -> [UIContentSizeCategory] { + return [ + .extraSmall, .small, .medium, + .large, .extraLarge, .extraExtraLarge, + .extraExtraExtraLarge, .accessibilityMedium, + .accessibilityLarge, .accessibilityExtraLarge, + .accessibilityExtraExtraLarge, .accessibilityExtraExtraExtraLarge + ] +} + +func shortCategoryName(_ category: UIContentSizeCategory) -> String { + return category.rawValue.replacingOccurrences(of: "UICTContentSizeCategory", with: "") +} + +func combinePredicates(_ predicates: [Predicate], ignoreFailures: Bool = false, + deferred: (() -> Void)? = nil) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + defer { + deferred?() + } + + return try predicates.reduce(true) { acc, matcher -> Bool in + guard acc || ignoreFailures else { + return false + } + + let result = try matcher.matches(actualExpression, failureMessage: failureMessage) + return result && acc + } + } +} + +public func haveValidDynamicTypeSnapshot(named name: String? = nil, usesDrawRect: Bool = false, + tolerance: CGFloat? = nil, + sizes: [UIContentSizeCategory] = allContentSizeCategories(), + isDeviceAgnostic: Bool = false) -> Predicate { + let mock = NBSMockedApplication() + + let predicates: [Predicate] = sizes.map { category in + let sanitizedName = sanitizedTestName(name) + let nameWithCategory = "\(sanitizedName)_\(shortCategoryName(category))" + + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + mock.mockPreferredContentSizeCategory(category) + updateTraitCollection(on: actualExpression) + + let predicate: Predicate + if isDeviceAgnostic { + predicate = haveValidDeviceAgnosticSnapshot(named: nameWithCategory, + usesDrawRect: usesDrawRect, tolerance: tolerance) + } else { + predicate = haveValidSnapshot(named: nameWithCategory, usesDrawRect: usesDrawRect, tolerance: tolerance) + } + + return try predicate.matches(actualExpression, failureMessage: failureMessage) + } + } + + return combinePredicates(predicates) { + mock.stopMockingPreferredContentSizeCategory() + } +} + +public func recordDynamicTypeSnapshot(named name: String? = nil, usesDrawRect: Bool = false, + sizes: [UIContentSizeCategory] = allContentSizeCategories(), + isDeviceAgnostic: Bool = false) -> Predicate { + let mock = NBSMockedApplication() + + let predicates: [Predicate] = sizes.map { category in + let sanitizedName = sanitizedTestName(name) + let nameWithCategory = "\(sanitizedName)_\(shortCategoryName(category))" + + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + mock.mockPreferredContentSizeCategory(category) + updateTraitCollection(on: actualExpression) + + let predicate: Predicate + if isDeviceAgnostic { + predicate = recordDeviceAgnosticSnapshot(named: nameWithCategory, usesDrawRect: usesDrawRect) + } else { + predicate = recordSnapshot(named: nameWithCategory, usesDrawRect: usesDrawRect) + } + + return try predicate.matches(actualExpression, failureMessage: failureMessage) + } + } + + return combinePredicates(predicates, ignoreFailures: true) { + mock.stopMockingPreferredContentSizeCategory() + } +} + +private func updateTraitCollection(on expression: Expression) { + // swiftlint:disable:next force_try force_unwrapping + let instance = try! expression.evaluate()! + updateTraitCollection(on: instance) +} + +private func updateTraitCollection(on element: Snapshotable) { + if let environment = element as? UITraitEnvironment { + if let vc = environment as? UIViewController { + vc.beginAppearanceTransition(true, animated: false) + vc.endAppearanceTransition() + } + + environment.traitCollectionDidChange(nil) + + if let view = environment as? UIView { + view.subviews.forEach(updateTraitCollection(on:)) + } else if let vc = environment as? UIViewController { + vc.childViewControllers.forEach(updateTraitCollection(on:)) + if vc.isViewLoaded { + updateTraitCollection(on: vc.view) + } + } + } +} diff --git a/Demo/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.h b/Demo/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.h new file mode 100644 index 00000000..8ab0b7f5 --- /dev/null +++ b/Demo/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.h @@ -0,0 +1,13 @@ +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NBSMockedApplication : NSObject + +- (void)mockPreferredContentSizeCategory:(UIContentSizeCategory)category; +- (void)stopMockingPreferredContentSizeCategory; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Demo/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.m b/Demo/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.m new file mode 100644 index 00000000..2a1d66c6 --- /dev/null +++ b/Demo/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.m @@ -0,0 +1,160 @@ +#import "NBSMockedApplication.h" +#import + +@interface NBSMockedApplication () + +@property (nonatomic) BOOL isSwizzled; + +@end + +@interface UIFont (Swizzling) + ++ (void)nbs_swizzle; + +@end + +@interface UIApplication (Swizzling) + ++ (void)nbs_swizzle; + +@property (nonatomic) UIContentSizeCategory nbs_preferredContentSizeCategory; + +@end + +@interface UITraitCollection (Swizzling) + ++ (void)nbs_swizzle; + +@end + +@implementation NBSMockedApplication + +/* On iOS 9, +[UIFont preferredFontForTextStyle:] uses -[UIApplication preferredContentSizeCategory] + to get the content size category. However, this changed on iOS 10. While I haven't found what UIFont uses to get + the current category, swizzling preferredFontForTextStyle: to use +[UIFont preferredFontForTextStyle: compatibleWithTraitCollection:] + (only available on iOS >= 10), passing an UITraitCollection with the desired contentSizeCategory. + */ + +- (void)mockPreferredContentSizeCategory:(UIContentSizeCategory)category { + UIApplication.sharedApplication.nbs_preferredContentSizeCategory = category; + + if (!self.isSwizzled) { + [UIApplication nbs_swizzle]; + [UIFont nbs_swizzle]; + [UITraitCollection nbs_swizzle]; + self.isSwizzled = YES; + } + + [[NSNotificationCenter defaultCenter] postNotificationName:UIContentSizeCategoryDidChangeNotification + object:[UIApplication sharedApplication] + userInfo:@{UIContentSizeCategoryNewValueKey: category}]; +} + +- (void)stopMockingPreferredContentSizeCategory { + if (self.isSwizzled) { + [UIApplication nbs_swizzle]; + [UIFont nbs_swizzle]; + [UITraitCollection nbs_swizzle]; + self.isSwizzled = NO; + } +} + +- (void)dealloc { + [self stopMockingPreferredContentSizeCategory]; +} + +@end + +@implementation UIFont (Swizzling) + ++ (UIFont *)nbs_preferredFontForTextStyle:(UIFontTextStyle)style { + UIContentSizeCategory category = UIApplication.sharedApplication.preferredContentSizeCategory; + if (@available(iOS 10.0, tvOS 10.0, *)) { + UITraitCollection *categoryTrait = [UITraitCollection traitCollectionWithPreferredContentSizeCategory:category]; + return [UIFont preferredFontForTextStyle:style compatibleWithTraitCollection:categoryTrait]; + } else { + return [UIFont preferredFontForTextStyle:style]; + } +} + ++ (void)nbs_swizzle { + if (![UITraitCollection instancesRespondToSelector:@selector(preferredContentSizeCategory)]) { + return; + } + + SEL selector = @selector(preferredFontForTextStyle:); + SEL replacedSelector = @selector(nbs_preferredFontForTextStyle:); + + Method originalMethod = class_getClassMethod(self, selector); + Method extendedMethod = class_getClassMethod(self, replacedSelector); + method_exchangeImplementations(originalMethod, extendedMethod); +} + +@end + +@implementation UIApplication (Swizzling) + +- (UIContentSizeCategory)nbs_preferredContentSizeCategory { + return objc_getAssociatedObject(self, @selector(nbs_preferredContentSizeCategory)); +} + +- (void)setNbs_preferredContentSizeCategory:(UIContentSizeCategory)category { + objc_setAssociatedObject(self, @selector(nbs_preferredContentSizeCategory), + category, OBJC_ASSOCIATION_COPY_NONATOMIC); +} + ++ (void)nbs_swizzle { + SEL selector = @selector(preferredContentSizeCategory); + SEL replacedSelector = @selector(nbs_preferredContentSizeCategory); + + Method originalMethod = class_getInstanceMethod(self, selector); + Method extendedMethod = class_getInstanceMethod(self, replacedSelector); + method_exchangeImplementations(originalMethod, extendedMethod); +} + +@end + +@implementation UITraitCollection (Swizzling) + +- (UIContentSizeCategory)nbs_preferredContentSizeCategory { + return UIApplication.sharedApplication.preferredContentSizeCategory; +} + +- (BOOL)nbs__changedContentSizeCategoryFromTraitCollection:(id)arg { + return YES; +} + ++ (void)nbs_swizzle { + [self nbs_swizzlePreferredContentSizeCategory]; + [self nbs_swizzleChangedContentSizeCategoryFromTraitCollection]; +} + ++ (void)nbs_swizzlePreferredContentSizeCategory { + SEL selector = @selector(preferredContentSizeCategory); + + if (![self instancesRespondToSelector:selector]) { + return; + } + + SEL replacedSelector = @selector(nbs_preferredContentSizeCategory); + + Method originalMethod = class_getInstanceMethod(self, selector); + Method extendedMethod = class_getInstanceMethod(self, replacedSelector); + method_exchangeImplementations(originalMethod, extendedMethod); +} + ++ (void)nbs_swizzleChangedContentSizeCategoryFromTraitCollection { + SEL selector = sel_registerName("_changedContentSizeCategoryFromTraitCollection:"); + + if (![self instancesRespondToSelector:selector]) { + return; + } + + SEL replacedSelector = @selector(nbs__changedContentSizeCategoryFromTraitCollection:); + + Method originalMethod = class_getInstanceMethod(self, selector); + Method extendedMethod = class_getInstanceMethod(self, replacedSelector); + method_exchangeImplementations(originalMethod, extendedMethod); +} + +@end diff --git a/Demo/Pods/Nimble-Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift b/Demo/Pods/Nimble-Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift new file mode 100644 index 00000000..79eb4fda --- /dev/null +++ b/Demo/Pods/Nimble-Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift @@ -0,0 +1,45 @@ +import Nimble + +// MARK: - Nicer syntax using == operator + +public struct DynamicTypeSnapshot { + let name: String? + let record: Bool + let sizes: [UIContentSizeCategory] + let deviceAgnostic: Bool + + init(name: String?, record: Bool, sizes: [UIContentSizeCategory], deviceAgnostic: Bool) { + self.name = name + self.record = record + self.sizes = sizes + self.deviceAgnostic = deviceAgnostic + } +} + +public func dynamicTypeSnapshot(_ name: String? = nil, sizes: [UIContentSizeCategory] = allContentSizeCategories(), + deviceAgnostic: Bool = false) -> DynamicTypeSnapshot { + return DynamicTypeSnapshot(name: name, record: false, sizes: sizes, deviceAgnostic: deviceAgnostic) +} + +public func recordDynamicTypeSnapshot(_ name: String? = nil, + sizes: [UIContentSizeCategory] = allContentSizeCategories(), + deviceAgnostic: Bool = false) -> DynamicTypeSnapshot { + return DynamicTypeSnapshot(name: name, record: true, sizes: sizes, deviceAgnostic: deviceAgnostic) +} + +public func == (lhs: Expectation, rhs: DynamicTypeSnapshot) { + if let name = rhs.name { + if rhs.record { + lhs.to(recordDynamicTypeSnapshot(named: name, sizes: rhs.sizes, isDeviceAgnostic: rhs.deviceAgnostic)) + } else { + lhs.to(haveValidDynamicTypeSnapshot(named: name, sizes: rhs.sizes, isDeviceAgnostic: rhs.deviceAgnostic)) + } + + } else { + if rhs.record { + lhs.to(recordDynamicTypeSnapshot(sizes: rhs.sizes, isDeviceAgnostic: rhs.deviceAgnostic)) + } else { + lhs.to(haveValidDynamicTypeSnapshot(sizes: rhs.sizes, isDeviceAgnostic: rhs.deviceAgnostic)) + } + } +} diff --git a/Demo/Pods/Nimble-Snapshots/HaveValidSnapshot.swift b/Demo/Pods/Nimble-Snapshots/HaveValidSnapshot.swift index 53535172..66713050 100644 --- a/Demo/Pods/Nimble-Snapshots/HaveValidSnapshot.swift +++ b/Demo/Pods/Nimble-Snapshots/HaveValidSnapshot.swift @@ -1,9 +1,8 @@ -import Foundation import FBSnapshotTestCase -import UIKit +import Foundation import Nimble import QuartzCore -import Quick +import UIKit @objc public protocol Snapshotable { var snapshotObject: UIView? { get } @@ -23,67 +22,56 @@ extension UIView : Snapshotable { } } -@objc class FBSnapshotTest : NSObject { - - var currentExampleMetadata: ExampleMetadata? +@objc public class FBSnapshotTest: NSObject { var referenceImagesDirectory: String? var tolerance: CGFloat = 0 - - class var sharedInstance : FBSnapshotTest { - struct Instance { - static let instance: FBSnapshotTest = FBSnapshotTest() - } - return Instance.instance - } - class func setReferenceImagesDirectory(_ directory: String?) { + static let sharedInstance = FBSnapshotTest() + + public class func setReferenceImagesDirectory(_ directory: String?) { sharedInstance.referenceImagesDirectory = directory } - class func compareSnapshot(_ instance: Snapshotable, isDeviceAgnostic: Bool=false, usesDrawRect: Bool=false, snapshot: String, record: Bool, referenceDirectory: String, tolerance: CGFloat) -> Bool { - let snapshotController: FBSnapshotTestController = FBSnapshotTestController(testName: _testFileName()) - #if swift(>=3.0) - snapshotController.isDeviceAgnostic = isDeviceAgnostic - #else - snapshotController.deviceAgnostic = isDeviceAgnostic - #endif + // swiftlint:disable:next function_parameter_count + class func compareSnapshot(_ instance: Snapshotable, isDeviceAgnostic: Bool = false, + usesDrawRect: Bool = false, snapshot: String, record: Bool, + referenceDirectory: String, tolerance: CGFloat, + filename: String) -> Bool { + + let testName = parseFilename(filename: filename) + let snapshotController: FBSnapshotTestController = FBSnapshotTestController(testName: testName) + snapshotController.isDeviceAgnostic = isDeviceAgnostic snapshotController.recordMode = record snapshotController.referenceImagesDirectory = referenceDirectory snapshotController.usesDrawViewHierarchyInRect = usesDrawRect - - assert(snapshotController.referenceImagesDirectory != nil, "Missing value for referenceImagesDirectory - Call FBSnapshotTest.setReferenceImagesDirectory(FB_REFERENCE_IMAGE_DIR)") + + let reason = "Missing value for referenceImagesDirectory - " + + "Call FBSnapshotTest.setReferenceImagesDirectory(FB_REFERENCE_IMAGE_DIR)" + assert(snapshotController.referenceImagesDirectory != nil, reason) do { - #if swift(>=3.0) - try snapshotController.compareSnapshot(ofViewOrLayer: instance.snapshotObject, selector: Selector(snapshot), identifier: nil, tolerance: tolerance) - #else - try snapshotController.compareSnapshotOfViewOrLayer(instance.snapshotObject, selector: Selector(snapshot), identifier: nil, tolerance: tolerance) - #endif - } - catch { - return false; + try snapshotController.compareSnapshot(ofViewOrLayer: instance.snapshotObject, + selector: Selector(snapshot), identifier: nil, tolerance: tolerance) + } catch { + return false } - return true; + return true } } // Note that these must be lower case. -var testFolderSuffixes = ["tests", "specs"] +private var testFolderSuffixes = ["tests", "specs"] public func setNimbleTestFolder(_ testFolder: String) { - #if swift(>=3.0) - testFolderSuffixes = [testFolder.lowercased()] - #else - testFolderSuffixes = [testFolder.lowercaseString] - #endif + testFolderSuffixes = [testFolder.lowercased()] } public func setNimbleTolerance(_ tolerance: CGFloat) { FBSnapshotTest.sharedInstance.tolerance = tolerance } -func _getDefaultReferenceDirectory(_ sourceFileName: String) -> String { +func getDefaultReferenceDirectory(_ sourceFileName: String) -> String { if let globalReference = FBSnapshotTest.sharedInstance.referenceImagesDirectory { return globalReference } @@ -92,140 +80,160 @@ func _getDefaultReferenceDirectory(_ sourceFileName: String) -> String { // then append "/ReferenceImages" and use that. // Grab the file's path - let pathComponents: NSArray = (sourceFileName as NSString).pathComponents as NSArray + let pathComponents = (sourceFileName as NSString).pathComponents as NSArray // Find the directory in the path that ends with a test suffix. - let testPath = pathComponents.filter { component -> Bool in - #if swift(>=3.0) - return testFolderSuffixes.filter { (component as AnyObject).lowercased.hasSuffix($0) }.count > 0 - #else - return testFolderSuffixes.filter { component.lowercaseString.hasSuffix($0) }.count > 0 - #endif - }.first + let testPath = pathComponents.first { component -> Bool in + return !testFolderSuffixes.filter { + (component as AnyObject).lowercased.hasSuffix($0) + }.isEmpty + } guard let testDirectory = testPath else { - fatalError("Could not infer reference image folder – You should provide a reference dir using FBSnapshotTest.setReferenceImagesDirectory(FB_REFERENCE_IMAGE_DIR)") + fatalError("Could not infer reference image folder – You should provide a reference dir using " + + "FBSnapshotTest.setReferenceImagesDirectory(FB_REFERENCE_IMAGE_DIR)") } // Recombine the path components and append our own image directory. - #if swift(>=3.0) - let currentIndex = pathComponents.index(of: testDirectory) + 1 - let folderPathComponents: NSArray = pathComponents.subarray(with: NSMakeRange(0, currentIndex)) as NSArray - let folderPath = folderPathComponents.componentsJoined(by: "/") - #else - let currentIndex = pathComponents.indexOfObject(testDirectory) + 1 - let folderPathComponents: NSArray = pathComponents.subarrayWithRange(NSMakeRange(0, currentIndex)) - let folderPath = folderPathComponents.componentsJoinedByString("/") - #endif + let currentIndex = pathComponents.index(of: testDirectory) + 1 + let folderPathComponents = pathComponents.subarray(with: NSRange(location: 0, length: currentIndex)) as NSArray + let folderPath = folderPathComponents.componentsJoined(by: "/") return folderPath + "/ReferenceImages" } -func _testFileName() -> String { - let name = FBSnapshotTest.sharedInstance.currentExampleMetadata!.example.callsite.file as NSString - let type = ".\(name.pathExtension)" - #if swift(>=3.0) - let sanitizedName = name.lastPathComponent.replacingOccurrences(of: type, with: "") - #else - let sanitizedName = name.lastPathComponent.stringByReplacingOccurrencesOfString(type, withString: "") - #endif +private func parseFilename(filename: String) -> String { + let nsName = filename as NSString + + let type = ".\(nsName.pathExtension)" + let sanitizedName = nsName.lastPathComponent.replacingOccurrences(of: type, with: "") return sanitizedName } -func _sanitizedTestName(_ name: String?) -> String { - let quickExample = FBSnapshotTest.sharedInstance.currentExampleMetadata - var filename = name ?? quickExample!.example.name - #if swift(>=3.0) - filename = filename.replacingOccurrences(of: "root example group, ", with: "") - let characterSet = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_") - let components = filename.components(separatedBy: characterSet.inverted) - return components.joined(separator: "_") - #else - filename = filename.stringByReplacingOccurrencesOfString("root example group, ", withString: "") - let characterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_") - let components: NSArray = filename.componentsSeparatedByCharactersInSet(characterSet.invertedSet) +func sanitizedTestName(_ name: String?) -> String { + guard let testName = currentTestName() else { + fatalError("Test matchers must be called from inside a test block") + } - return components.componentsJoinedByString("_") - #endif + var filename = name ?? testName + filename = filename.replacingOccurrences(of: "root example group, ", with: "") + let characterSet = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_") + let components = filename.components(separatedBy: characterSet.inverted) + return components.joined(separator: "_") } -func _getTolerance() -> CGFloat { +func getTolerance() -> CGFloat { return FBSnapshotTest.sharedInstance.tolerance } -func _clearFailureMessage(_ failureMessage: FailureMessage) { +func clearFailureMessage(_ failureMessage: FailureMessage) { failureMessage.actualValue = nil failureMessage.expected = "" failureMessage.postfixMessage = "" failureMessage.to = "" } -func _performSnapshotTest(_ name: String?, isDeviceAgnostic: Bool=false, usesDrawRect: Bool=false, actualExpression: Expression, failureMessage: FailureMessage, tolerance: CGFloat?) -> Bool { +private func performSnapshotTest(_ name: String?, isDeviceAgnostic: Bool = false, usesDrawRect: Bool = false, + actualExpression: Expression, failureMessage: FailureMessage, + tolerance: CGFloat?) -> Bool { + // swiftlint:disable:next force_try force_unwrapping let instance = try! actualExpression.evaluate()! let testFileLocation = actualExpression.location.file - let referenceImageDirectory = _getDefaultReferenceDirectory(testFileLocation) - let snapshotName = _sanitizedTestName(name) - let tolerance = tolerance ?? _getTolerance() + let referenceImageDirectory = getDefaultReferenceDirectory(testFileLocation) + let snapshotName = sanitizedTestName(name) + let tolerance = tolerance ?? getTolerance() - let result = FBSnapshotTest.compareSnapshot(instance, isDeviceAgnostic: isDeviceAgnostic, usesDrawRect: usesDrawRect, snapshot: snapshotName, record: false, referenceDirectory: referenceImageDirectory, tolerance: tolerance) + let result = FBSnapshotTest.compareSnapshot(instance, isDeviceAgnostic: isDeviceAgnostic, + usesDrawRect: usesDrawRect, snapshot: snapshotName, record: false, + referenceDirectory: referenceImageDirectory, tolerance: tolerance, + filename: actualExpression.location.file) if !result { - _clearFailureMessage(failureMessage) + clearFailureMessage(failureMessage) failureMessage.expected = "expected a matching snapshot in \(snapshotName)" } return result } -func _recordSnapshot(_ name: String?, isDeviceAgnostic: Bool=false, usesDrawRect: Bool=false, actualExpression: Expression, failureMessage: FailureMessage) -> Bool { +private func recordSnapshot(_ name: String?, isDeviceAgnostic: Bool = false, usesDrawRect: Bool = false, + actualExpression: Expression, failureMessage: FailureMessage) -> Bool { + // swiftlint:disable:next force_try force_unwrapping let instance = try! actualExpression.evaluate()! let testFileLocation = actualExpression.location.file - let referenceImageDirectory = _getDefaultReferenceDirectory(testFileLocation) - let snapshotName = _sanitizedTestName(name) - let tolerance = _getTolerance() - - _clearFailureMessage(failureMessage) - - if FBSnapshotTest.compareSnapshot(instance, isDeviceAgnostic: isDeviceAgnostic, usesDrawRect: usesDrawRect, snapshot: snapshotName, record: true, referenceDirectory: referenceImageDirectory, tolerance: tolerance) { - failureMessage.expected = "snapshot \(name ?? snapshotName) successfully recorded, replace recordSnapshot with a check" + let referenceImageDirectory = getDefaultReferenceDirectory(testFileLocation) + let snapshotName = sanitizedTestName(name) + let tolerance = getTolerance() + + clearFailureMessage(failureMessage) + + if FBSnapshotTest.compareSnapshot(instance, isDeviceAgnostic: isDeviceAgnostic, usesDrawRect: usesDrawRect, + snapshot: snapshotName, record: true, referenceDirectory: referenceImageDirectory, + tolerance: tolerance, filename: actualExpression.location.file) { + let name = name ?? snapshotName + failureMessage.expected = "snapshot \(name) successfully recorded, replace recordSnapshot with a check" } else { - failureMessage.expected = "expected to record a snapshot in \(name)" + let expectedMessage: String + if let name = name { + expectedMessage = "expected to record a snapshot in \(name)" + } else { + expectedMessage = "expected to record a snapshot" + } + failureMessage.expected = expectedMessage } return false } +private func currentTestName() -> String? { + return CurrentTestCaseTracker.shared.currentTestCase?.sanitizedName +} + internal var switchChecksWithRecords = false -public func haveValidSnapshot(named name: String? = nil, usesDrawRect: Bool=false, tolerance: CGFloat? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - if (switchChecksWithRecords) { - return _recordSnapshot(name, usesDrawRect: usesDrawRect, actualExpression: actualExpression, failureMessage: failureMessage) +public func haveValidSnapshot(named name: String? = nil, usesDrawRect: Bool = false, + tolerance: CGFloat? = nil) -> Predicate { + + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + if switchChecksWithRecords { + return recordSnapshot(name, usesDrawRect: usesDrawRect, actualExpression: actualExpression, + failureMessage: failureMessage) } - return _performSnapshotTest(name, usesDrawRect: usesDrawRect, actualExpression: actualExpression, failureMessage: failureMessage, tolerance: tolerance) + return performSnapshotTest(name, usesDrawRect: usesDrawRect, actualExpression: actualExpression, + failureMessage: failureMessage, tolerance: tolerance) } } -public func haveValidDeviceAgnosticSnapshot(named name: String?=nil, usesDrawRect: Bool=false, tolerance: CGFloat? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - if (switchChecksWithRecords) { - return _recordSnapshot(name, isDeviceAgnostic: true, usesDrawRect: usesDrawRect, actualExpression: actualExpression, failureMessage: failureMessage) +public func haveValidDeviceAgnosticSnapshot(named name: String? = nil, usesDrawRect: Bool = false, + tolerance: CGFloat? = nil) -> Predicate { + + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + if switchChecksWithRecords { + return recordSnapshot(name, isDeviceAgnostic: true, usesDrawRect: usesDrawRect, + actualExpression: actualExpression, failureMessage: failureMessage) } - return _performSnapshotTest(name, isDeviceAgnostic: true, usesDrawRect: usesDrawRect, actualExpression: actualExpression, failureMessage: failureMessage, tolerance: tolerance) + return performSnapshotTest(name, isDeviceAgnostic: true, usesDrawRect: usesDrawRect, + actualExpression: actualExpression, + failureMessage: failureMessage, tolerance: tolerance) } } -public func recordSnapshot(named name: String? = nil, usesDrawRect: Bool=false) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - return _recordSnapshot(name, usesDrawRect: usesDrawRect, actualExpression: actualExpression, failureMessage: failureMessage) +public func recordSnapshot(named name: String? = nil, usesDrawRect: Bool = false) -> Predicate { + + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + return recordSnapshot(name, usesDrawRect: usesDrawRect, + actualExpression: actualExpression, failureMessage: failureMessage) } } -public func recordDeviceAgnosticSnapshot(named name: String?=nil, usesDrawRect: Bool=false) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - return _recordSnapshot(name, isDeviceAgnostic: true, usesDrawRect: usesDrawRect, actualExpression: actualExpression, failureMessage: failureMessage) +public func recordDeviceAgnosticSnapshot(named name: String? = nil, + usesDrawRect: Bool = false) -> Predicate { + + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + return recordSnapshot(name, isDeviceAgnostic: true, usesDrawRect: usesDrawRect, + actualExpression: actualExpression, failureMessage: failureMessage) } } diff --git a/Demo/Pods/Nimble-Snapshots/NimbleSnapshotsConfiguration.swift b/Demo/Pods/Nimble-Snapshots/NimbleSnapshotsConfiguration.swift deleted file mode 100644 index afb6eae0..00000000 --- a/Demo/Pods/Nimble-Snapshots/NimbleSnapshotsConfiguration.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Quick - -class FBSnapshotTestConfiguration: QuickConfiguration { - - override class func configure(_ configuration: Configuration) { - configuration.beforeEach { (exampleMetadata: ExampleMetadata) -> () in - FBSnapshotTest.sharedInstance.currentExampleMetadata = exampleMetadata - } - } -} diff --git a/Demo/Pods/Nimble-Snapshots/PrettySyntax.swift b/Demo/Pods/Nimble-Snapshots/PrettySyntax.swift index cb84d336..b4f8c5b1 100644 --- a/Demo/Pods/Nimble-Snapshots/PrettySyntax.swift +++ b/Demo/Pods/Nimble-Snapshots/PrettySyntax.swift @@ -5,44 +5,50 @@ import Nimble public struct Snapshot { let name: String? let record: Bool + let usesDrawRect: Bool - init(name: String?, record: Bool) { + init(name: String?, record: Bool, usesDrawRect: Bool) { self.name = name self.record = record + self.usesDrawRect = usesDrawRect } } -public func snapshot(_ name: String? = nil) -> Snapshot { - return Snapshot(name: name, record: false) +public func snapshot(_ name: String? = nil, + usesDrawRect: Bool = false) -> Snapshot { + return Snapshot(name: name, record: false, usesDrawRect: usesDrawRect) } -public func recordSnapshot(_ name: String? = nil) -> Snapshot { - return Snapshot(name: name, record: true) +public func recordSnapshot(_ name: String? = nil, + usesDrawRect: Bool = false) -> Snapshot { + return Snapshot(name: name, record: true, usesDrawRect: usesDrawRect) } -public func ==(lhs: Expectation, rhs: Snapshot) { +public func == (lhs: Expectation, rhs: Snapshot) { if let name = rhs.name { if rhs.record { - lhs.to(recordSnapshot(named: name)) + lhs.to(recordSnapshot(named: name, usesDrawRect: rhs.usesDrawRect)) } else { - lhs.to(haveValidSnapshot(named: name)) + lhs.to(haveValidSnapshot(named: name, usesDrawRect: rhs.usesDrawRect)) } } else { if rhs.record { - lhs.to(recordSnapshot()) + lhs.to(recordSnapshot(usesDrawRect: rhs.usesDrawRect)) } else { - lhs.to(haveValidSnapshot()) + lhs.to(haveValidSnapshot(usesDrawRect: rhs.usesDrawRect)) } } } // MARK: - Nicer syntax using emoji +// swiftlint:disable:next identifier_name public func 📷(_ snapshottable: Snapshotable, file: FileString = #file, line: UInt = #line) { expect(snapshottable, file: file, line: line).to(recordSnapshot()) } +// swiftlint:disable:next identifier_name public func 📷(_ snapshottable: Snapshotable, named name: String, file: FileString = #file, line: UInt = #line) { expect(snapshottable, file: file, line: line).to(recordSnapshot(named: name)) } diff --git a/Demo/Pods/Nimble-Snapshots/README.md b/Demo/Pods/Nimble-Snapshots/README.md index 4f5dab53..1ba635cc 100644 --- a/Demo/Pods/Nimble-Snapshots/README.md +++ b/Demo/Pods/Nimble-Snapshots/README.md @@ -1,8 +1,8 @@ -Nimble-Snapshots [![Build Status](https://travis-ci.org/ashfurrow/Nimble-Snapshots.svg)](https://travis-ci.org/ashfurrow/Nimble-Snapshots) +[![CircleCI](https://circleci.com/gh/ashfurrow/Nimble-Snapshots/tree/master.svg?style=svg)](https://circleci.com/gh/ashfurrow/Nimble-Snapshots/tree/master) ============================= -[Nimble](https://github.com/Quick/Nimble) matchers for [FBSnapshotTestCase](https://github.com/facebook/ios-snapshot-test-case). -Highly derivative of [Expecta Matchers for FBSnapshotTestCase](https://github.com/dblock/ios-snapshot-test-case-expecta). +[Nimble](https://github.com/Quick/Nimble) matchers for [iOSSnapshotTestCase](https://github.com/uber/ios-snapshot-test-case). +Originally derived from [Expecta Matchers for FBSnapshotTestCase](https://github.com/dblock/ios-snapshot-test-case-expecta).

@@ -11,7 +11,9 @@ Highly derivative of [Expecta Matchers for FBSnapshotTestCase](https://github.co Installing ---------- -You need to be using CocoaPods 0.36 Beta 1 or higher. Your Podfile should look +## CocoaPods + +You need to be using CocoaPods 0.36 Beta 1 or higher. Your `Podfile` should look something like the following. ```rb @@ -23,10 +25,31 @@ source 'https://github.com/CocoaPods/Specs.git' target 'YOUR_APP_NAME_HERE_Tests', :exclusive => true do pod 'Nimble-Snapshots' + pod 'Quick' # if you want to use it with Quick end ``` -Then run `pod install`. +Then run: +``` +$ pod install +``` + +## Carthage + +You need to be using Carthage 0.18 or higher. Your `Cartfile` (or `Cartfile.private`) should look +something like the following. + +```rb +github "Quick/Quick" ~> 1.0 +github "Quick/Nimble" ~> 7.0 +github "uber/ios-snapshot-test-case" "2.2.0" +github "ashfurrow/Nimble-Snapshots" +``` + +Then run: +``` +$ carthage bootstrap --platform iOS --toolchain com.apple.dt.toolchain.Swift_3_0 +``` Use --- @@ -41,12 +64,12 @@ import UIKit class MySpec: QuickSpec { override func spec() { - describe("in some context", { () -> () in + describe("in some context") { it("has valid snapshot") { let view = ... // some view you want to test expect(view).to( haveValidSnapshot() ) } - }) + } } } ``` @@ -65,8 +88,8 @@ expect(view) == snapshot("some custom name") ``` To record snapshots, just replace `haveValidSnapshot()` with `recordSnapshot()` -and `haveValidSnapshot(named:)` with `recordSnapshot(named:)`. We also have a -handy emoji operator. +and `haveValidSnapshot(named:)` with `recordSnapshot(named:)`. We also have a +handy emoji operator. ```swift 📷(view) @@ -75,27 +98,23 @@ handy emoji operator. By default, this pod will put the reference images inside a `ReferenceImages` directory; we try to put this in a place that makes sense (inside your unit -tests directory). If we can't figure it out, or if you want to use your own +tests directory). If we can't figure it out, or if you want to use your own directory instead, call `setNimbleTestFolder()` with the name of the directory -in your unit test's path that we should use. For example, if the tests are in +in your unit test's path that we should use. For example, if the tests are in `App/AppTesting/`, you can call it with `AppTesting`. If you have any questions or run into any trouble, feel free to open an issue -on this repo. +on this repo. ## Dynamic Type -Testing Dynamic Type manually is boring and no one seems to remember doing it -when implementing a view/screen, so you can have snapshot tests according to +Testing Dynamic Type manually is boring and no one seems to remember doing it +when implementing a view/screen, so you can have snapshot tests according to content size categories. -First, you'll need to change you Podfile to import the Dynamic Type subspec: - -```ruby -pod 'Nimble-Snapshots/DynamicType' -``` +In order to use Dynamic Type testing, make sure to provide a valid `Host Application` in your testing target. -Then you can use the `haveValidDynamicTypeSnapshot` and +Then you can use the `haveValidDynamicTypeSnapshot` and `recordDynamicTypeSnapshot` matchers: ```swift @@ -110,26 +129,21 @@ expect(view) == dynamicTypeSnapshot() expect(view) == dynamicTypeSnapshot(sizes: [UIContentSizeCategoryExtraLarge]) ``` -Note that this will post an `UIContentSizeCategoryDidChangeNotification`, +Note that this will post an `UIContentSizeCategoryDidChangeNotification`, so your views/view controllers need to observe that and update themselves. -For more info on usage, check out the +For more info on usage, check out the [dynamic type tests](Bootstrap/BootstrapTests/DynamicTypeTests.swift). ## Dynamic Size -Testing the same view with many sizes is easy but error prone. It easy to fix one test +Testing the same view with many sizes is easy but error prone. It easy to fix one test on change and forget the others. For this we create a easy way to tests all sizes at same time. -First, you'll need to change you Podfile to import the Dynamic Size subspec: - -```ruby -pod 'Nimble-Snapshots/DynamicSize' -``` - -Then you can use the new `haveValidDynamicSizeSnapshot` and `recordDynamicSizeSnapshot` matchers to use it: +You can use the new `haveValidDynamicSizeSnapshot` and `recordDynamicSizeSnapshot` +matchers to test multiple sizes at once: ```swift let sizes = ["SmallSize": CGSize(width: 44, height: 44), @@ -154,13 +168,13 @@ you can use the `ResizeMode` enum: public enum ResizeMode { case frame case constrains - case block(resizeBlock: (UIView, CGSize)->()) - case custom(ViewResizer: ViewResizer) + case block(resizeBlock: (UIView, CGSize) -> Void) + case custom(viewResizer: ViewResizer) } ``` To use the enum you can `expect(view) == dynamicSizeSnapshot(sizes: sizes, resizeMode: newResizeMode)`. -For custom behavior you can use `ResizeMode.block`. The block will be call on every resize. Or you can +For custom behavior you can use `ResizeMode.block`. The block will be call on every resize. Or you can implement the `ViewResizer` protocol and resize yourself. -The custom behavier can be used to record the views too. +The custom behavior can be used to record the views too. For more info on usage, check the [dynamic sizes tests](Bootstrap/BootstrapTests/DynamicSizeTests.swift). diff --git a/Demo/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.h b/Demo/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.h new file mode 100644 index 00000000..8e21c30c --- /dev/null +++ b/Demo/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.h @@ -0,0 +1,5 @@ +#import + +@interface XCTestObservationCenter (CurrentTestCaseTracker) + +@end diff --git a/Demo/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.m b/Demo/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.m new file mode 100644 index 00000000..4a4e2ccc --- /dev/null +++ b/Demo/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.m @@ -0,0 +1,10 @@ +#import "XCTestObservationCenter+CurrentTestCaseTracker.h" +#import "Nimble_Snapshots/Nimble_Snapshots-Swift.h" + +@implementation XCTestObservationCenter (CurrentTestCaseTracker) + ++ (void)load { + [[self sharedTestObservationCenter] addTestObserver:[CurrentTestCaseTracker shared]]; +} + +@end diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift b/Demo/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift similarity index 76% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift index 196ee9a7..3e89e23b 100644 --- a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift +++ b/Demo/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift @@ -24,14 +24,12 @@ import Foundation import CwlCatchExceptionSupport #endif -private func catchReturnTypeConverter(_ instance: T, block: () -> Void) -> T? { - // Get the type from an *instance*, instead of a receiving the type directly - return catchExceptionOfKind(T.self, block) as? T +private func catchReturnTypeConverter(_ type: T.Type, block: () -> Void) -> T? { + return catchExceptionOfKind(type, block) as? T } extension NSException { public static func catchException(in block: () -> Void) -> Self? { - // Use a dummy instance of Self to provide the type - return catchReturnTypeConverter(self.init(), block: block) + return catchReturnTypeConverter(self, block: block) } } diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m b/Demo/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m similarity index 95% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m index 738d43c8..8cf414fd 100644 --- a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m +++ b/Demo/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m @@ -23,7 +23,7 @@ #if !SWIFT_PACKAGE && NON_SWIFT_PACKAGE __attribute__((visibility("hidden"))) #endif -NSException* catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)()) { +NSException* catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)(void)) { @try { inBlock(); } @catch (NSException *exception) { diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h b/Demo/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h similarity index 95% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h index cc4c4fb7..0c8dd878 100644 --- a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h +++ b/Demo/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h @@ -29,4 +29,4 @@ FOUNDATION_EXPORT const unsigned char CwlCatchExceptionVersionString[]; #if !SWIFT_PACKAGE && NON_SWIFT_PACKAGE __attribute__((visibility("hidden"))) #endif -NSException* __nullable catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)()); +NSException* __nullable catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)(void)); diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m similarity index 100% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h similarity index 98% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h index 5755bfc8..aef59c2c 100644 --- a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h +++ b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h @@ -1,5 +1,5 @@ // -// CwlMachBadExceptionHandler.h +// CwlMachBadInstructionHandler.h // CwlPreconditionTesting // // Created by Matt Gallagher on 2016/01/10. diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.c similarity index 100% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.c diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.h similarity index 100% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.h diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift similarity index 100% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift similarity index 77% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift index 98eefb8b..f96ec635 100644 --- a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift +++ b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift @@ -21,7 +21,6 @@ import Foundation #if SWIFT_PACKAGE - import CwlCatchException import CwlMachBadInstructionHandler #endif @@ -38,16 +37,6 @@ import Foundation } } - extension execTypesCountTuple { - mutating func pointer(in block: (UnsafeMutablePointer) -> R) -> R { - return withUnsafeMutablePointer(to: &self) { p -> R in - return p.withMemoryRebound(to: T.self, capacity: EXC_TYPES_COUNT) { ptr -> R in - return block(ptr) - } - } - } - } - extension request_mach_exception_raise_t { mutating func withMsgHeaderPointer(in block: (UnsafeMutablePointer) -> R) -> R { return withUnsafeMutablePointer(to: &self) { p -> R in @@ -78,17 +67,23 @@ import Foundation var currentExceptionPort: mach_port_t = 0 var handlerThread: pthread_t? = nil - mutating func withUnsafeMutablePointers(in block: (UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer) -> R) -> R { - return masks.pointer { masksPtr in - return ports.pointer { portsPtr in - return behaviors.pointer { behaviorsPtr in - return flavors.pointer { flavorsPtr in - return block(masksPtr, portsPtr, behaviorsPtr, flavorsPtr) + static func internalMutablePointers(_ m: UnsafeMutablePointer>, _ c: UnsafeMutablePointer, _ p: UnsafeMutablePointer>, _ b: UnsafeMutablePointer>, _ f: UnsafeMutablePointer>, _ block: (UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer) -> R) -> R { + return m.withMemoryRebound(to: exception_mask_t.self, capacity: 1) { masksPtr in + return c.withMemoryRebound(to: mach_msg_type_number_t.self, capacity: 1) { countPtr in + return p.withMemoryRebound(to: mach_port_t.self, capacity: 1) { portsPtr in + return b.withMemoryRebound(to: exception_behavior_t.self, capacity: 1) { behaviorsPtr in + return f.withMemoryRebound(to: thread_state_flavor_t.self, capacity: 1) { flavorsPtr in + return block(masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr) + } } } } } } + + mutating func withUnsafeMutablePointers(in block: @escaping (UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer) -> R) -> R { + return MachContext.internalMutablePointers(&masks, &count, &ports, &behaviors, &flavors, block) + } } /// A function for receiving mach messages and parsing the first with mach_exc_server (and if any others are received, throwing them away). @@ -102,8 +97,9 @@ import Foundation // Request the next mach message from the port request.Head.msgh_local_port = context.currentExceptionPort request.Head.msgh_size = UInt32(MemoryLayout.size) + let requestSize = request.Head.msgh_size try kernCheck { request.withMsgHeaderPointer { requestPtr in - mach_msg(requestPtr, MACH_RCV_MSG | MACH_RCV_INTERRUPT, 0, request.Head.msgh_size, context.currentExceptionPort, 0, UInt32(MACH_PORT_NULL)) + mach_msg(requestPtr, MACH_RCV_MSG | MACH_RCV_INTERRUPT, 0, requestSize, context.currentExceptionPort, 0, UInt32(MACH_PORT_NULL)) } } // Prepare the reply structure @@ -126,8 +122,9 @@ import Foundation } // Send the reply + let replySize = reply.Head.msgh_size try kernCheck { reply.withMsgHeaderPointer { replyPtr in - mach_msg(replyPtr, MACH_SEND_MSG, reply.Head.msgh_size, 0, UInt32(MACH_PORT_NULL), 0, UInt32(MACH_PORT_NULL)) + mach_msg(replyPtr, MACH_SEND_MSG, replySize, 0, UInt32(MACH_PORT_NULL), 0, UInt32(MACH_PORT_NULL)) } } } catch let error as NSError where (error.domain == NSMachErrorDomain && (error.code == Int(MACH_RCV_PORT_CHANGED) || error.code == Int(MACH_RCV_INVALID_NAME))) { // Port was already closed before we started or closed while we were listening. @@ -170,14 +167,15 @@ import Foundation mach_port_insert_right(mach_task_self_, context.currentExceptionPort, context.currentExceptionPort, MACH_MSG_TYPE_MAKE_SEND) } - try kernCheck { context.withUnsafeMutablePointers { masksPtr, portsPtr, behaviorsPtr, flavorsPtr in + let currentExceptionPtr = context.currentExceptionPort + try kernCheck { context.withUnsafeMutablePointers { masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr in // 3. Apply the mach port as the handler for this thread - thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, context.currentExceptionPort, Int32(bitPattern: UInt32(EXCEPTION_STATE) | MACH_EXCEPTION_CODES), x86_THREAD_STATE64, masksPtr, &context.count, portsPtr, behaviorsPtr, flavorsPtr) + thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, currentExceptionPtr, Int32(bitPattern: UInt32(EXCEPTION_STATE) | MACH_EXCEPTION_CODES), x86_THREAD_STATE64, masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr) } } - defer { context.withUnsafeMutablePointers { masksPtr, portsPtr, behaviorsPtr, flavorsPtr in + defer { context.withUnsafeMutablePointers { masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr in // 6. Unapply the mach port - _ = thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, 0, EXCEPTION_DEFAULT, THREAD_STATE_NONE, masksPtr, &context.count, portsPtr, behaviorsPtr, flavorsPtr) + _ = thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, 0, EXCEPTION_DEFAULT, THREAD_STATE_NONE, masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr) } } try withUnsafeMutablePointer(to: &context) { c throws in diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift similarity index 100% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift diff --git a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h similarity index 96% rename from Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h rename to Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h index f9dbedda..7c50da11 100644 --- a/Demo/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h +++ b/Demo/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h @@ -20,6 +20,8 @@ #import +extern bool _swift_reportFatalErrorsToDebugger; + //! Project version number for CwlUtils. FOUNDATION_EXPORT double CwlPreconditionTestingVersionNumber; diff --git a/Demo/Pods/Nimble/README.md b/Demo/Pods/Nimble/README.md index 04de80b2..647028c8 100644 --- a/Demo/Pods/Nimble/README.md +++ b/Demo/Pods/Nimble/README.md @@ -47,16 +47,25 @@ expect(ocean.isClean).toEventually(beTruthy()) - [Exceptions](#exceptions) - [Collection Membership](#collection-membership) - [Strings](#strings) - - [Checking if all elements of a collection pass a condition](#checking-if-all-elements-of-a-collection-pass-a-condition) - - [Verify collection count](#verify-collection-count) - - [Verify a notification was posted](#verifying-a-notification-was-posted) + - [Collection Elements](#collection-elements) + - [Collection Count](#collection-count) + - [Notifications](#notifications) - [Matching a value to any of a group of matchers](#matching-a-value-to-any-of-a-group-of-matchers) + - [Custom Validation](#custom-validation) - [Writing Your Own Matchers](#writing-your-own-matchers) + - [PredicateResult](#predicateresult) - [Lazy Evaluation](#lazy-evaluation) - [Type Checking via Swift Generics](#type-checking-via-swift-generics) - [Customizing Failure Messages](#customizing-failure-messages) + - [Basic Customization](#basic-customization) + - [Full Customization](#full-customization) - [Supporting Objective-C](#supporting-objective-c) - [Properly Handling `nil` in Objective-C Matchers](#properly-handling-nil-in-objective-c-matchers) + - [Migrating from the Old Matcher API](#migrating-from-the-old-matcher-api) + - [Minimal Step - Use `.predicate`](#minimal-step---use-predicate) + - [Convert to use `Predicate` Type with Old Matcher Constructor](#convert-to-use-predicate-type-with-old-matcher-constructor) + - [Convert to `Predicate` Type with Preferred Constructor](#convert-to-predicate-type-with-preferred-constructor) + - [Deprecation Roadmap](#deprecation-roadmap) - [Installing Nimble](#installing-nimble) - [Installing Nimble as a Submodule](#installing-nimble-as-a-submodule) - [Installing Nimble via CocoaPods](#installing-nimble-via-cocoapods) @@ -217,9 +226,9 @@ exception once evaluated: // that Nimble will catch. // (see https://github.com/Quick/Nimble/issues/220#issuecomment-172667064) let exception = NSException( - name: NSInternalInconsistencyException, - reason: "Not enough fish in the sea.", - userInfo: ["something": "is fishy"]) + name: NSInternalInconsistencyException, + reason: "Not enough fish in the sea.", + userInfo: ["something": "is fishy"]) expect { exception.raise() }.to(raiseException()) // Also, you can customize raiseException to be more specific @@ -287,9 +296,9 @@ expect(1 as CInt).to(equal(1)) make expectations on primitive C values, wrap then in an object literal: - ```objc - expect(@(1 + 1)).to(equal(@2)); - ``` +```objc +expect(@(1 + 1)).to(equal(@2)); +``` ## Asynchronous Expectations @@ -297,11 +306,22 @@ In Nimble, it's easy to make expectations on values that are updated asynchronously. Just use `toEventually` or `toEventuallyNot`: ```swift -// Swift +// Swift 3.0 and later + +DispatchQueue.main.async { + ocean.add("dolphins") + ocean.add("whales") +} +expect(ocean).toEventually(contain("dolphins", "whales")) +``` + + +```swift +// Swift 2.3 and earlier dispatch_async(dispatch_get_main_queue()) { - ocean.add("dolphins") - ocean.add("whales") + ocean.add("dolphins") + ocean.add("whales") } expect(ocean).toEventually(contain("dolphins", "whales")) ``` @@ -309,9 +329,10 @@ expect(ocean).toEventually(contain("dolphins", "whales")) ```objc // Objective-C + dispatch_async(dispatch_get_main_queue(), ^{ - [ocean add:@"dolphins"]; - [ocean add:@"whales"]; + [ocean add:@"dolphins"]; + [ocean add:@"whales"]; }); expect(ocean).toEventually(contain(@"dolphins", @"whales")); ``` @@ -353,9 +374,10 @@ You can also provide a callback by using the `waitUntil` function: // Swift waitUntil { done in - // do some stuff that takes a while... - NSThread.sleepForTimeInterval(0.5) - done() + ocean.goFish { success in + expect(success).to(beTrue()) + done() + } } ``` @@ -363,9 +385,10 @@ waitUntil { done in // Objective-C waitUntil(^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:0.5]; - done(); + [ocean goFishWithHandler:^(BOOL success){ + expect(success).to(beTrue()); + done(); + }]; }); ``` @@ -375,9 +398,10 @@ waitUntil(^(void (^done)(void)){ // Swift waitUntil(timeout: 10) { done in - // do some stuff that takes a while... - NSThread.sleepForTimeInterval(1) - done() + ocean.goFish { success in + expect(success).to(beTrue()) + done() + } } ``` @@ -385,13 +409,14 @@ waitUntil(timeout: 10) { done in // Objective-C waitUntilTimeout(10, ^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:1]; - done(); + [ocean goFishWithHandler:^(BOOL success){ + expect(success).to(beTrue()); + done(); + }]; }); ``` -Note: waitUntil triggers its timeout code on the main thread. Blocking the main +Note: `waitUntil` triggers its timeout code on the main thread. Blocking the main thread will cause Nimble to stop the run loop to continue. This can cause test pollution for whatever incomplete code that was running on the main thread. Blocking the main thread can be caused by blocking IO, calls to sleep(), @@ -501,7 +526,7 @@ Nimble supports checking the type membership of any kind of object, whether Objective-C conformant or not: ```swift -// Swift +// Swift protocol SomeProtocol{} class SomeClassConformingToProtocol: SomeProtocol{} @@ -532,16 +557,17 @@ expect(@1).toNot(beAKindOf([NSNull class])); ``` Objects can be tested for their exact types using the `beAnInstanceOf` matcher: + ```swift -// Swift +// Swift protocol SomeProtocol{} class SomeClassConformingToProtocol: SomeProtocol{} struct SomeStructConformingToProtocol: SomeProtocol{} -// Unlike the 'beKindOf' matcher, the 'beAnInstanceOf' matcher only +// Unlike the 'beKindOf' matcher, the 'beAnInstanceOf' matcher only // passes if the object is the EXACT type requested. The following -// tests pass -- note its behavior when working in an inheritance hierarchy. +// tests pass -- note its behavior when working in an inheritance hierarchy. expect(1).to(beAnInstanceOf(Int.self)) expect("turtle").to(beAnInstanceOf(String.self)) @@ -554,18 +580,18 @@ let structObject = SomeStructConformingToProtocol() expect(structObject).toNot(beAnInstanceOf(SomeProtocol.self)) expect(structObject).to(beAnInstanceOf(SomeStructConformingToProtocol.self)) expect(structObject).toNot(beAnInstanceOf(SomeClassConformingToProtocol.self)) -```` +``` ## Equivalence ```swift // Swift -// Passes if actual is equivalent to expected: +// Passes if 'actual' is equivalent to 'expected': expect(actual).to(equal(expected)) expect(actual) == expected -// Passes if actual is not equivalent to expected: +// Passes if 'actual' is not equivalent to 'expected': expect(actual).toNot(equal(expected)) expect(actual) != expected ``` @@ -573,10 +599,10 @@ expect(actual) != expected ```objc // Objective-C -// Passes if actual is equivalent to expected: +// Passes if 'actual' is equivalent to 'expected': expect(actual).to(equal(expected)) -// Passes if actual is not equivalent to expected: +// Passes if 'actual' is not equivalent to 'expected': expect(actual).toNot(equal(expected)) ``` @@ -588,25 +614,33 @@ Values must be `Equatable`, `Comparable`, or subclasses of `NSObject`. ```swift // Swift -// Passes if actual has the same pointer address as expected: +// Passes if 'actual' has the same pointer address as 'expected': expect(actual).to(beIdenticalTo(expected)) expect(actual) === expected -// Passes if actual does not have the same pointer address as expected: +// Passes if 'actual' does not have the same pointer address as 'expected': expect(actual).toNot(beIdenticalTo(expected)) expect(actual) !== expected ``` -Its important to remember that `beIdenticalTo` only makes sense when comparing types with reference semantics, which have a notion of identity. In Swift, that means a `class`. This matcher will not work with types with value semantics such as `struct` or `enum`. If you need to compare two value types, you can either compare individual properties or if it makes sense to do so, make your type implement `Equatable` and use Nimble's equivalence matchers instead. +It is important to remember that `beIdenticalTo` only makes sense when comparing +types with reference semantics, which have a notion of identity. In Swift, +that means types that are defined as a `class`. + +This matcher will not work when comparing types with value semantics such as +those defined as a `struct` or `enum`. If you need to compare two value types, +consider what it means for instances of your type to be identical. This may mean +comparing individual properties or, if it makes sense to do so, conforming your type +to `Equatable` and using Nimble's equivalence matchers instead. ```objc // Objective-C -// Passes if actual has the same pointer address as expected: +// Passes if 'actual' has the same pointer address as 'expected': expect(actual).to(beIdenticalTo(expected)); -// Passes if actual does not have the same pointer address as expected: +// Passes if 'actual' does not have the same pointer address as 'expected': expect(actual).toNot(beIdenticalTo(expected)); ``` @@ -680,7 +714,7 @@ expect(actual) ≈ expected expect(actual) ≈ (expected, delta) ``` -(Type Option-x to get ≈ on a U.S. keyboard) +(Type option+x to get `≈` on a U.S. keyboard) The former version uses the default delta of 0.0001. Here is yet another way to do this: @@ -691,7 +725,7 @@ expect(actual) ≈ expected ± delta expect(actual) == expected ± delta ``` -(Type Option-Shift-= to get ± on a U.S. keyboard) +(Type option+shift+= to get `±` on a U.S. keyboard) If you are comparing arrays of floating point numbers, you'll find the following useful: @@ -711,20 +745,20 @@ expect([0.0, 2.0]).to(beCloseTo([0.1, 2.1], within: 0.1)) ```swift // Swift -// Passes if instance is an instance of aClass: +// Passes if 'instance' is an instance of 'aClass': expect(instance).to(beAnInstanceOf(aClass)) -// Passes if instance is an instance of aClass or any of its subclasses: +// Passes if 'instance' is an instance of 'aClass' or any of its subclasses: expect(instance).to(beAKindOf(aClass)) ``` ```objc // Objective-C -// Passes if instance is an instance of aClass: +// Passes if 'instance' is an instance of 'aClass': expect(instance).to(beAnInstanceOf(aClass)); -// Passes if instance is an instance of aClass or any of its subclasses: +// Passes if 'instance' is an instance of 'aClass' or any of its subclasses: expect(instance).to(beAKindOf(aClass)); ``` @@ -751,38 +785,38 @@ expect(dolphin).to(beAKindOf([Mammal class])); ## Truthiness ```swift -// Passes if actual is not nil, true, or an object with a boolean value of true: +// Passes if 'actual' is not nil, true, or an object with a boolean value of true: expect(actual).to(beTruthy()) -// Passes if actual is only true (not nil or an object conforming to Boolean true): +// Passes if 'actual' is only true (not nil or an object conforming to Boolean true): expect(actual).to(beTrue()) -// Passes if actual is nil, false, or an object with a boolean value of false: +// Passes if 'actual' is nil, false, or an object with a boolean value of false: expect(actual).to(beFalsy()) -// Passes if actual is only false (not nil or an object conforming to Boolean false): +// Passes if 'actual' is only false (not nil or an object conforming to Boolean false): expect(actual).to(beFalse()) -// Passes if actual is nil: +// Passes if 'actual' is nil: expect(actual).to(beNil()) ``` ```objc // Objective-C -// Passes if actual is not nil, true, or an object with a boolean value of true: +// Passes if 'actual' is not nil, true, or an object with a boolean value of true: expect(actual).to(beTruthy()); -// Passes if actual is only true (not nil or an object conforming to Boolean true): +// Passes if 'actual' is only true (not nil or an object conforming to Boolean true): expect(actual).to(beTrue()); -// Passes if actual is nil, false, or an object with a boolean value of false: +// Passes if 'actual' is nil, false, or an object with a boolean value of false: expect(actual).to(beFalsy()); -// Passes if actual is only false (not nil or an object conforming to Boolean false): +// Passes if 'actual' is only false (not nil or an object conforming to Boolean false): expect(actual).to(beFalse()); -// Passes if actual is nil: +// Passes if 'actual' is nil: expect(actual).to(beNil()); ``` @@ -793,14 +827,16 @@ If you're using Swift, you can use the `throwAssertion` matcher to check if an a ```swift // Swift -// Passes if somethingThatThrows() throws an assertion, such as calling fatalError() or precondition fails: +// Passes if 'somethingThatThrows()' throws an assertion, +// such as by calling 'fatalError()' or if a precondition fails: +expect { try somethingThatThrows() }.to(throwAssertion()) expect { () -> Void in fatalError() }.to(throwAssertion()) expect { precondition(false) }.to(throwAssertion()) -// Passes if throwing a NSError is not equal to throwing an assertion: +// Passes if throwing an NSError is not equal to throwing an assertion: expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion()) -// Passes if the post assertion code is not run: +// Passes if the code after the precondition check is not run: var reachedPoint1 = false var reachedPoint2 = false expect { @@ -821,40 +857,53 @@ Notes: ## Swift Error Handling -If you're using Swift 2.0+, you can use the `throwError` matcher to check if an error is thrown. +If you're using Swift 2.0 or newer, you can use the `throwError` matcher to check if an error is thrown. + +Note: +The following code sample references the `Swift.Error` protocol. +This is `Swift.ErrorProtocol` in versions of Swift prior to version 3.0. ```swift // Swift -// Passes if somethingThatThrows() throws an ErrorProtocol: -expect{ try somethingThatThrows() }.to(throwError()) +// Passes if 'somethingThatThrows()' throws an 'Error': +expect { try somethingThatThrows() }.to(throwError()) -// Passes if somethingThatThrows() throws an error with a given domain: -expect{ try somethingThatThrows() }.to(throwError { (error: ErrorProtocol) in +// Passes if 'somethingThatThrows()' throws an error within a particular domain: +expect { try somethingThatThrows() }.to(throwError { (error: Error) in expect(error._domain).to(equal(NSCocoaErrorDomain)) }) -// Passes if somethingThatThrows() throws an error with a given case: -expect{ try somethingThatThrows() }.to(throwError(NSCocoaError.PropertyListReadCorruptError)) +// Passes if 'somethingThatThrows()' throws a particular error enum case: +expect { try somethingThatThrows() }.to(throwError(NSCocoaError.PropertyListReadCorruptError)) -// Passes if somethingThatThrows() throws an error with a given type: -expect{ try somethingThatThrows() }.to(throwError(errorType: NimbleError.self)) +// Passes if 'somethingThatThrows()' throws an error of a particular type: +expect { try somethingThatThrows() }.to(throwError(errorType: NimbleError.self)) ``` -If you are working directly with `ErrorProtocol` values, as is sometimes the case when using `Result` or `Promise` types, you can use the `matchError` matcher to check if the error is the same error is is supposed to be, without requiring explicit casting. +When working directly with `Error` values, using the `matchError` matcher +allows you to perform certain checks on the error itself without having to +explicitly cast the error. + +The `matchError` matcher allows you to check whether or not the error: + +- is the same _type_ of error you are expecting. +- represents a particular error value that you are expecting. + +This can be useful when using `Result` or `Promise` types, for example. ```swift // Swift -let actual: ErrorProtocol = … +let actual: Error = ... -// Passes if actual contains any error value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum)) +// Passes if 'actual' represents any error value from the NimbleErrorEnum type: +expect(actual).to(matchError(NimbleErrorEnum.self)) -// Passes if actual contains the Timeout value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum.Timeout)) +// Passes if 'actual' represents the case 'timeout' from the NimbleErrorEnum type: +expect(actual).to(matchError(NimbleErrorEnum.timeout)) -// Passes if actual contains an NSError equal to the given one: +// Passes if 'actual' contains an NSError equal to the one provided: expect(actual).to(matchError(NSError(domain: "err", code: 123, userInfo: nil))) ``` @@ -865,17 +914,17 @@ Note: This feature is only available in Swift. ```swift // Swift -// Passes if actual, when evaluated, raises an exception: +// Passes if 'actual', when evaluated, raises an exception: expect(actual).to(raiseException()) -// Passes if actual raises an exception with the given name: +// Passes if 'actual' raises an exception with the given name: expect(actual).to(raiseException(named: name)) -// Passes if actual raises an exception with the given name and reason: +// Passes if 'actual' raises an exception with the given name and reason: expect(actual).to(raiseException(named: name, reason: reason)) -// Passes if actual raises an exception and it passes expectations in the block -// (in this case, if name begins with 'a r') +// Passes if 'actual' raises an exception which passes expectations defined in the given closure: +// (in this case, if the exception's name begins with "a r") expect { exception.raise() }.to(raiseException { (exception: NSException) in expect(exception.name).to(beginWith("a r")) }) @@ -884,44 +933,44 @@ expect { exception.raise() }.to(raiseException { (exception: NSException) in ```objc // Objective-C -// Passes if actual, when evaluated, raises an exception: +// Passes if 'actual', when evaluated, raises an exception: expect(actual).to(raiseException()) -// Passes if actual raises an exception with the given name +// Passes if 'actual' raises an exception with the given name expect(actual).to(raiseException().named(name)) -// Passes if actual raises an exception with the given name and reason: +// Passes if 'actual' raises an exception with the given name and reason: expect(actual).to(raiseException().named(name).reason(reason)) -// Passes if actual raises an exception and it passes expectations in the block -// (in this case, if name begins with 'a r') +// Passes if 'actual' raises an exception and it passes expectations defined in the given block: +// (in this case, if name begins with "a r") expect(actual).to(raiseException().satisfyingBlock(^(NSException *exception) { expect(exception.name).to(beginWith(@"a r")); })); ``` -Note: Swift currently doesn't have exceptions (see [#220](https://github.com/Quick/Nimble/issues/220#issuecomment-172667064)). Only Objective-C code can raise -exceptions that Nimble will catch. +Note: Swift currently doesn't have exceptions (see [#220](https://github.com/Quick/Nimble/issues/220#issuecomment-172667064)). +Only Objective-C code can raise exceptions that Nimble will catch. ## Collection Membership ```swift // Swift -// Passes if all of the expected values are members of actual: +// Passes if all of the expected values are members of 'actual': expect(actual).to(contain(expected...)) -// Passes if actual is an empty collection (it contains no elements): +// Passes if 'actual' is empty (i.e. it contains no elements): expect(actual).to(beEmpty()) ``` ```objc // Objective-C -// Passes if expected is a member of actual: +// Passes if expected is a member of 'actual': expect(actual).to(contain(expected)); -// Passes if actual is an empty collection (it contains no elements): +// Passes if 'actual' is empty (i.e. it contains no elements): expect(actual).to(beEmpty()); ``` @@ -954,20 +1003,20 @@ an ordered collection, use `beginWith` and `endWith`: ```swift // Swift -// Passes if the elements in expected appear at the beginning of actual: +// Passes if the elements in expected appear at the beginning of 'actual': expect(actual).to(beginWith(expected...)) -// Passes if the the elements in expected come at the end of actual: +// Passes if the the elements in expected come at the end of 'actual': expect(actual).to(endWith(expected...)) ``` ```objc // Objective-C -// Passes if the elements in expected appear at the beginning of actual: +// Passes if the elements in expected appear at the beginning of 'actual': expect(actual).to(beginWith(expected)); -// Passes if the the elements in expected come at the end of actual: +// Passes if the the elements in expected come at the end of 'actual': expect(actual).to(endWith(expected)); ``` @@ -982,19 +1031,22 @@ For code that returns collections of complex objects without a strict ordering, there is the `containElementSatisfying` matcher: ```swift +// Swift + struct Turtle { - var color: String! + let color: String } -var turtles = functionThatReturnsSomeTurtlesInAnyOrder() +let turtles: [Turtle] = functionThatReturnsSomeTurtlesInAnyOrder() + +// This set of matchers passes regardless of whether the array is +// [{color: "blue"}, {color: "green"}] or [{color: "green"}, {color: "blue"}]: -// This set of matchers passes whether the array is [{color: "blue"}, {color: "green"}] -// or [{color: "green"}, {color: "blue"}] expect(turtles).to(containElementSatisfying({ turtle in - return turtle.color == "green" + return turtle.color == "green" })) expect(turtles).to(containElementSatisfying({ turtle in - return turtle.color == "blue" + return turtle.color == "blue" }, "that is a turtle with color 'blue'")) // The second matcher will incorporate the provided string in the error message @@ -1002,20 +1054,25 @@ expect(turtles).to(containElementSatisfying({ turtle in ``` ```objc -@interface Turtle: NSObject -@property(nonatomic) NSString *color; +// Objective-C + +@interface Turtle : NSObject +@property (nonatomic, readonly, nonnull) NSString *color; @end -@implementation Turtle @end -NSArray *turtles = functionThatReturnsSomeTurtlesInAnyOrder(); +@implementation Turtle +@end + +NSArray * __nonnull turtles = functionThatReturnsSomeTurtlesInAnyOrder(); + +// This set of matchers passes regardless of whether the array is +// [{color: "blue"}, {color: "green"}] or [{color: "green"}, {color: "blue"}]: -// This set of matchers passes whether the array is [{color: "blue"}, {color: "green"}] -// or [{color: "green"}, {color: "blue"}] -expect(turtles).to(containElementSatisfying(^BOOL(id object) { - return [turtle.color isEqualToString:@"green"]; +expect(turtles).to(containElementSatisfying(^BOOL(id __nonnull object) { + return [[turtle color] isEqualToString:@"green"]; })); -expect(turtles).to(containElementSatisfying(^BOOL(id object) { - return [turtle.color isEqualToString:@"blue"]; +expect(turtles).to(containElementSatisfying(^BOOL(id __nonnull object) { + return [[turtle color] isEqualToString:@"blue"]; })); ``` @@ -1024,93 +1081,108 @@ expect(turtles).to(containElementSatisfying(^BOOL(id object) { ```swift // Swift -// Passes if actual contains substring expected: -expect(actual).to(contain(expected)) +// Passes if 'actual' contains 'substring': +expect(actual).to(contain(substring)) -// Passes if actual begins with substring: -expect(actual).to(beginWith(expected)) +// Passes if 'actual' begins with 'prefix': +expect(actual).to(beginWith(prefix)) -// Passes if actual ends with substring: -expect(actual).to(endWith(expected)) +// Passes if 'actual' ends with 'suffix': +expect(actual).to(endWith(suffix)) -// Passes if actual is an empty string, "": +// Passes if 'actual' represents the empty string, "": expect(actual).to(beEmpty()) -// Passes if actual matches the regular expression defined in expected: +// Passes if 'actual' matches the regular expression defined in 'expected': expect(actual).to(match(expected)) ``` ```objc // Objective-C -// Passes if actual contains substring expected: +// Passes if 'actual' contains 'substring': expect(actual).to(contain(expected)); -// Passes if actual begins with substring: -expect(actual).to(beginWith(expected)); +// Passes if 'actual' begins with 'prefix': +expect(actual).to(beginWith(prefix)); -// Passes if actual ends with substring: -expect(actual).to(endWith(expected)); +// Passes if 'actual' ends with 'suffix': +expect(actual).to(endWith(suffix)); -// Passes if actual is an empty string, "": +// Passes if 'actual' represents the empty string, "": expect(actual).to(beEmpty()); -// Passes if actual matches the regular expression defined in expected: +// Passes if 'actual' matches the regular expression defined in 'expected': expect(actual).to(match(expected)) ``` -## Checking if all elements of a collection pass a condition +## Collection Elements + +Nimble provides a means to check that all elements of a collection pass a given expectation. + +### Swift + +In Swift, the collection must be an instance of a type conforming to +`Sequence`. ```swift // Swift -// with a custom function: -expect([1,2,3,4]).to(allPass({$0 < 5})) +// Providing a custom function: +expect([1, 2, 3, 4]).to(allPass { $0! < 5 }) -// with another matcher: -expect([1,2,3,4]).to(allPass(beLessThan(5))) +// Composing the expectation with another matcher: +expect([1, 2, 3, 4]).to(allPass(beLessThan(5))) ``` +### Objective-C + +In Objective-C, the collection must be an instance of a type which implements +the `NSFastEnumeration` protocol, and whose elements are instances of a type +which subclasses `NSObject`. + +Additionally, unlike in Swift, there is no override to specify a custom +matcher function. + ```objc // Objective-C -expect(@[@1, @2, @3,@4]).to(allPass(beLessThan(@5))); +expect(@[@1, @2, @3, @4]).to(allPass(beLessThan(@5))); ``` -For Swift the actual value has to be a Sequence, e.g. an array, a set or a custom seqence type. - -For Objective-C the actual value has to be a NSFastEnumeration, e.g. NSArray and NSSet, of NSObjects and only the variant which -uses another matcher is available here. - -## Verify collection count +## Collection Count ```swift // Swift -// passes if actual collection's count is equal to expected +// Passes if 'actual' contains the 'expected' number of elements: expect(actual).to(haveCount(expected)) -// passes if actual collection's count is not equal to expected +// Passes if 'actual' does _not_ contain the 'expected' number of elements: expect(actual).notTo(haveCount(expected)) ``` ```objc // Objective-C -// passes if actual collection's count is equal to expected +// Passes if 'actual' contains the 'expected' number of elements: expect(actual).to(haveCount(expected)) -// passes if actual collection's count is not equal to expected +// Passes if 'actual' does _not_ contain the 'expected' number of elements: expect(actual).notTo(haveCount(expected)) ``` -For Swift the actual value must be a `Collection` such as array, dictionary or set. +For Swift, the actual value must be an instance of a type conforming to `Collection`. +For example, instances of `Array`, `Dictionary`, or `Set`. -For Objective-C the actual value has to be one of the following classes `NSArray`, `NSDictionary`, `NSSet`, `NSHashTable` or one of their subclasses. +For Objective-C, the actual value must be one of the following classes, or their subclasses: -## Foundation + - `NSArray`, + - `NSDictionary`, + - `NSSet`, or + - `NSHashTable`. -### Verifying a Notification was posted +## Notifications ```swift // Swift @@ -1135,6 +1207,8 @@ expect { ## Matching a value to any of a group of matchers ```swift +// Swift + // passes if actual is either less than 10 or greater than 20 expect(actual).to(satisfyAnyOf(beLessThan(10), beGreaterThan(20))) @@ -1147,6 +1221,8 @@ expect(82).to(beLessThan(50) || beGreaterThan(80)) ``` ```objc +// Objective-C + // passes if actual is either less than 10 or greater than 20 expect(actual).to(satisfyAnyOf(beLessThan(@10), beGreaterThan(@20))) @@ -1160,33 +1236,70 @@ Note: This matcher allows you to chain any number of matchers together. This pro could instead refactor that single test into multiple, more precisely focused tests for better coverage. +## Custom Validation + +```swift +// Swift + +// passes if .succeeded is returned from the closure +expect({ + guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { + return .failed(reason: "wrong enum case") + } + + return .succeeded +}).to(succeed()) + +// passes if .failed is returned from the closure +expect({ + guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { + return .failed(reason: "wrong enum case") + } + + return .succeeded +}).notTo(succeed()) +``` + +The `String` provided with `.failed()` is shown when the test fails. + +When using `toEventually()` be careful not to make state changes or run process intensive code since this closure will be ran many times. + # Writing Your Own Matchers In Nimble, matchers are Swift functions that take an expected -value and return a `MatcherFunc` closure. Take `equal`, for example: +value and return a `Predicate` closure. Take `equal`, for example: ```swift // Swift -public func equal(expectedValue: T?) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(expectedValue)>" - if let actualValue = try actualExpression.evaluate() { - return actualValue == expectedValue - } else { - return false +public func equal(expectedValue: T?) -> Predicate { + // Can be shortened to: + // Predicate { actual in ... } + // + // But shown with types here for clarity. + return Predicate { (actualExpression: Expression) throws -> PredicateResult in + let msg = ExpectationMessage.expectedActualValueTo("equal <\(expectedValue)>") + if let actualValue = try actualExpression.evaluate() { + return PredicateResult( + bool: actualValue == expectedValue!, + message: msg + ) + } else { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) + } } - } } ``` -The return value of a `MatcherFunc` closure is a `Bool` that indicates -whether the actual value matches the expectation: `true` if it does, or -`false` if it doesn't. +The return value of a `Predicate` closure is a `PredicateResult` that indicates +whether the actual value matches the expectation and what error message to +display on failure. -> The actual `equal` matcher function does not match when either - `actual` or `expected` are nil; the example above has been edited for - brevity. +> The actual `equal` matcher function does not match when + `expected` are nil; the example above has been edited for brevity. Since matchers are just Swift functions, you can define them anywhere: at the top of your test file, in a file shared by all of your tests, or @@ -1201,6 +1314,63 @@ For examples of how to write your own matchers, just check out the to see how Nimble's built-in set of matchers are implemented. You can also check out the tips below. +## PredicateResult + +`PredicateResult` is the return struct that `Predicate` return to indicate +success and failure. A `PredicateResult` is made up of two values: +`PredicateStatus` and `ExpectationMessage`. + +Instead of a boolean, `PredicateStatus` captures a trinary set of values: + +```swift +// Swift + +public enum PredicateStatus { +// The predicate "passes" with the given expression +// eg - expect(1).to(equal(1)) +case matches + +// The predicate "fails" with the given expression +// eg - expect(1).toNot(equal(1)) +case doesNotMatch + +// The predicate never "passes" with the given expression, even if negated +// eg - expect(nil as Int?).toNot(equal(1)) +case fail + +// ... +} +``` + +Meanwhile, `ExpectationMessage` provides messaging semantics for error reporting. + +```swift +// Swift + +public indirect enum ExpectationMessage { +// Emits standard error message: +// eg - "expected to , got " +case expectedActualValueTo(/* message: */ String) + +// Allows any free-form message +// eg - "" +case fail(/* message: */ String) + +// ... +} +``` + +Predicates should usually depend on either `.expectedActualValueTo(..)` or +`.fail(..)` when reporting errors. Special cases can be used for the other enum +cases. + +Finally, if your Predicate utilizes other Predicates, you can utilize +`.appended(details:)` and `.appended(message:)` methods to annotate an existing +error with more details. + +A common message to append is failing on nils. For that, `.appendedBeNilHint()` +can be used. + ## Lazy Evaluation `actualExpression` is a lazy, memoized closure around the value provided to the @@ -1211,22 +1381,24 @@ custom matchers should call `actualExpression.evaluate()`: ```swift // Swift -public func beNil() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be nil" - return actualExpression.evaluate() == nil - } +public func beNil() -> Predicate { + // Predicate.simpleNilable(..) automatically generates ExpectationMessage for + // us based on the string we provide to it. Also, the 'Nilable' postfix indicates + // that this Predicate supports matching against nil actualExpressions, instead of + // always resulting in a PredicateStatus.fail result -- which is true for + // Predicate.simple(..) + return Predicate.simpleNilable("be nil") { actualExpression in + let actualValue = try actualExpression.evaluate() + return PredicateStatus(bool: actualValue == nil) + } } ``` -In the above example, `actualExpression` is not `nil`--it is a closure +In the above example, `actualExpression` is not `nil` -- it is a closure that returns a value. The value it returns, which is accessed via the `evaluate()` method, may be `nil`. If that value is `nil`, the `beNil` matcher function returns `true`, indicating that the expectation passed. -Use `expression.isClosure` to determine if the expression will be invoking -a closure to produce its value. - ## Type Checking via Swift Generics Using Swift's generics, matchers can constrain the type of the actual value @@ -1239,43 +1411,108 @@ against the one provided to the matcher function, and passes if they are the sam ```swift // Swift -public func haveDescription(description: String) -> MatcherFunc { - return MatcherFunc { actual, failureMessage in - return actual.evaluate().description == description - } +public func haveDescription(description: String) -> Predicate { + return Predicate.simple("have description") { actual in + return PredicateStatus(bool: actual.evaluate().description == description) + } } ``` ## Customizing Failure Messages -By default, Nimble outputs the following failure message when an -expectation fails: +When using `Predicate.simple(..)` or `Predicate.simpleNilable(..)`, Nimble +outputs the following failure message when an expectation fails: -``` -expected to match, got <\(actual)> +```swift +// where `message` is the first string argument and +// `actual` is the actual value received in `expect(..)` +"expected to \(message), got <\(actual)>" ``` -You can customize this message by modifying the `failureMessage` struct -from within your `MatcherFunc` closure. To change the verb "match" to -something else, update the `postfixMessage` property: +You can customize this message by modifying the way you create a `Predicate`. + +### Basic Customization + +For slightly more complex error messaging, receive the created failure message +with `Predicate.define(..)`: ```swift // Swift -// Outputs: expected to be under the sea, got <\(actual)> -failureMessage.postfixMessage = "be under the sea" +public func equal(_ expectedValue: T?) -> Predicate { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in + let actualValue = try actualExpression.evaluate() + let matches = actualValue == expectedValue && expectedValue != nil + if expectedValue == nil || actualValue == nil { + if expectedValue == nil && actualValue != nil { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) + } + return PredicateResult(status: .fail, message: msg) + } + return PredicateResult(bool: matches, message: msg) + } +} ``` -You can change how the `actual` value is displayed by updating -`failureMessage.actualValue`. Or, to remove it altogether, set it to -`nil`: +In the example above, `msg` is defined based on the string given to +`Predicate.define`. The code looks akin to: ```swift // Swift -// Outputs: expected to be under the sea -failureMessage.actualValue = nil -failureMessage.postfixMessage = "be under the sea" +let msg = ExpectationMessage.expectedActualValueTo("equal <\(stringify(expectedValue))>") +``` + +### Full Customization + +To fully customize the behavior of the Predicate, use the overload that expects +a `PredicateResult` to be returned. + +Along with `PredicateResult`, there are other `ExpectationMessage` enum values you can use: + +```swift +public indirect enum ExpectationMessage { +// Emits standard error message: +// eg - "expected to , got " +case expectedActualValueTo(/* message: */ String) + +// Allows any free-form message +// eg - "" +case fail(/* message: */ String) + +// Emits standard error message with a custom actual value instead of the default. +// eg - "expected to , got " +case expectedCustomValueTo(/* message: */ String, /* actual: */ String) + +// Emits standard error message without mentioning the actual value +// eg - "expected to " +case expectedTo(/* message: */ String) + +// ... +} +``` + +For matchers that compose other matchers, there are a handful of helper +functions to annotate messages. + +`appended(message: String)` is used to append to the original failure message: + +```swift +// produces "expected to be true, got (use beFalse() for inverse)" +// appended message do show up inline in Xcode. +.expectedActualValueTo("be true").appended(message: " (use beFalse() for inverse)") +``` + +For a more comprehensive message that spans multiple lines, use +`appended(details: String)` instead: + +```swift +// produces "expected to be true, got \n\nuse beFalse() for inverse\nor use beNil()" +// details do not show inline in Xcode, but do show up in test logs. +.expectedActualValueTo("be true").appended(details: "use beFalse() for inverse\nor use beNil()") ``` ## Supporting Objective-C @@ -1289,13 +1526,13 @@ custom matcher. The example below defines the class method // Swift extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualBlock, failureMessage, location in - let block = ({ actualBlock() as NSObject? }) - let expr = Expression(expression: block, location: location) - return beNil().matches(expr, failureMessage: failureMessage) + public class func beNilMatcher() -> NMBObjCMatcher { + return NMBObjCMatcher { actualBlock, failureMessage, location in + let block = ({ actualBlock() as NSObject? }) + let expr = Expression(expression: block, location: location) + return beNil().matches(expr, failureMessage: failureMessage) + } } - } } ``` @@ -1314,7 +1551,7 @@ class method: // Objective-C FOUNDATION_EXPORT id beNil() { - return [NMBObjCMatcher beNilMatcher]; + return [NMBObjCMatcher beNilMatcher]; } ``` @@ -1364,6 +1601,85 @@ extension NMBObjCMatcher { } ``` +## Migrating from the Old Matcher API + +Previously (`<7.0.0`), Nimble supported matchers via the following types: + +- `Matcher` +- `NonNilMatcherFunc` +- `MatcherFunc` + +All of those types have been replaced by `Predicate`. While migrating can be a +lot of work, Nimble currently provides several steps to aid migration of your +custom matchers: + +### Minimal Step - Use `.predicate` + +Nimble provides an extension to the old types that automatically naively +converts those types to the newer `Predicate`. + +```swift +// Swift +public func beginWith(startingElement: T) -> Predicate { + return NonNilMatcherFunc { actualExpression, failureMessage in + failureMessage.postfixMessage = "begin with <\(startingElement)>" + if let actualValue = actualExpression.evaluate() { + var actualGenerator = actualValue.makeIterator() + return actualGenerator.next() == startingElement + } + return false + }.predicate +} +``` + +This is the simpliest way to externally support `Predicate` which allows easier +composition than the old Nimble matcher interface, with minimal effort to change. + +### Convert to use `Predicate` Type with Old Matcher Constructor + +The second most convenient step is to utilize special constructors that +`Predicate` supports that closely align to the constructors of the old Nimble +matcher types. + +```swift +// Swift +public func beginWith(startingElement: T) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + failureMessage.postfixMessage = "begin with <\(startingElement)>" + if let actualValue = actualExpression.evaluate() { + var actualGenerator = actualValue.makeIterator() + return actualGenerator.next() == startingElement + } + return false + } +} +``` + +This allows you to completely drop the old types from your code, although the +intended behavior may alter slightly to what is desired. + +### Convert to `Predicate` Type with Preferred Constructor + +Finally, you can convert to the native `Predicate` format using one of the +constructors not used to assist in the migration. + +### Deprecation Roadmap + +Nimble 7 introduces `Predicate` but will support the old types with warning +deprecations. A couple major releases of Nimble will remain backwards +compatible with the old matcher api, although new features may not be +backported. + +The deprecating plan is a 3 major versions removal. Which is as follows: + + 1. Introduce new `Predicate` API, deprecation warning for old matcher APIs. + (Nimble `v7.x.x`) + 2. Introduce warnings on migration-path features (`.predicate`, + `Predicate`-constructors with similar arguments to old API). (Nimble + `v8.x.x`) + 3. Remove old API. (Nimble `v9.x.x`) + + # Installing Nimble > Nimble can be used on its own, or in conjunction with its sister diff --git a/Demo/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift b/Demo/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift index 740c3923..cc396368 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift @@ -65,7 +65,7 @@ public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler, closu /// assertion handler when this is true. Defaults to false. /// /// @see gatherFailingExpectations -public func gatherExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { +public func gatherExpectations(silently: Bool = false, closure: () -> Void) -> [AssertionRecord] { let previousRecorder = NimbleEnvironment.activeInstance.assertionHandler let recorder = AssertionRecorder() let handlers: [AssertionHandler] @@ -92,7 +92,7 @@ public func gatherExpectations(silently: Bool = false, closure: @escaping () -> /// /// @see gatherExpectations /// @see raiseException source for an example use case. -public func gatherFailingExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { +public func gatherFailingExpectations(silently: Bool = false, closure: () -> Void) -> [AssertionRecord] { let assertions = gatherExpectations(silently: silently, closure: closure) return assertions.filter { assertion in !assertion.success diff --git a/Demo/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift b/Demo/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift index 1c51cd7f..add7d3fb 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift @@ -1,6 +1,14 @@ import Foundation -#if _runtime(_ObjC) +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + +private func from(objcPredicate: NMBPredicate) -> Predicate { + return Predicate { actualExpression in + let result = objcPredicate.satisfies(({ try actualExpression.evaluate() }), + location: actualExpression.location) + return result.toSwift() + } +} internal struct ObjCMatcherWrapper: Matcher { let matcher: NMBMatcher @@ -22,13 +30,13 @@ internal struct ObjCMatcherWrapper: Matcher { // Equivalent to Expectation, but for Nimble's Objective-C interface public class NMBExpectation: NSObject { - internal let _actualBlock: () -> NSObject! + internal let _actualBlock: () -> NSObject? internal var _negative: Bool internal let _file: FileString internal let _line: UInt internal var _timeout: TimeInterval = 1.0 - public init(actualBlock: @escaping () -> NSObject!, negative: Bool, file: FileString, line: UInt) { + @objc public init(actualBlock: @escaping () -> NSObject?, negative: Bool, file: FileString, line: UInt) { self._actualBlock = actualBlock self._negative = negative self._file = file @@ -41,89 +49,137 @@ public class NMBExpectation: NSObject { } } - public var withTimeout: (TimeInterval) -> NMBExpectation { + @objc public var withTimeout: (TimeInterval) -> NMBExpectation { return ({ timeout in self._timeout = timeout return self }) } - public var to: (NMBMatcher) -> Void { + @objc public var to: (NMBMatcher) -> Void { return ({ matcher in - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher)) + if let pred = matcher as? NMBPredicate { + self.expectValue.to(from(objcPredicate: pred)) + } else { + self.expectValue.to(ObjCMatcherWrapper(matcher: matcher)) + } }) } - public var toWithDescription: (NMBMatcher, String) -> Void { + @objc public var toWithDescription: (NMBMatcher, String) -> Void { return ({ matcher, description in - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher), description: description) + if let pred = matcher as? NMBPredicate { + self.expectValue.to(from(objcPredicate: pred), description: description) + } else { + self.expectValue.to(ObjCMatcherWrapper(matcher: matcher), description: description) + } }) } - public var toNot: (NMBMatcher) -> Void { + @objc public var toNot: (NMBMatcher) -> Void { return ({ matcher in - self.expectValue.toNot( - ObjCMatcherWrapper(matcher: matcher) - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toNot(from(objcPredicate: pred)) + } else { + self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher)) + } }) } - public var toNotWithDescription: (NMBMatcher, String) -> Void { + @objc public var toNotWithDescription: (NMBMatcher, String) -> Void { return ({ matcher, description in - self.expectValue.toNot( - ObjCMatcherWrapper(matcher: matcher), description: description - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toNot(from(objcPredicate: pred), description: description) + } else { + self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher), description: description) + } }) } - public var notTo: (NMBMatcher) -> Void { return toNot } + @objc public var notTo: (NMBMatcher) -> Void { return toNot } - public var notToWithDescription: (NMBMatcher, String) -> Void { return toNotWithDescription } + @objc public var notToWithDescription: (NMBMatcher, String) -> Void { return toNotWithDescription } - public var toEventually: (NMBMatcher) -> Void { + @objc public var toEventually: (NMBMatcher) -> Void { return ({ matcher in - self.expectValue.toEventually( - ObjCMatcherWrapper(matcher: matcher), - timeout: self._timeout, - description: nil - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toEventually( + from(objcPredicate: pred), + timeout: self._timeout, + description: nil + ) + } else { + self.expectValue.toEventually( + ObjCMatcherWrapper(matcher: matcher), + timeout: self._timeout, + description: nil + ) + } }) } - public var toEventuallyWithDescription: (NMBMatcher, String) -> Void { + @objc public var toEventuallyWithDescription: (NMBMatcher, String) -> Void { return ({ matcher, description in - self.expectValue.toEventually( - ObjCMatcherWrapper(matcher: matcher), - timeout: self._timeout, - description: description - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toEventually( + from(objcPredicate: pred), + timeout: self._timeout, + description: description + ) + } else { + self.expectValue.toEventually( + ObjCMatcherWrapper(matcher: matcher), + timeout: self._timeout, + description: description + ) + } }) } - public var toEventuallyNot: (NMBMatcher) -> Void { + @objc public var toEventuallyNot: (NMBMatcher) -> Void { return ({ matcher in - self.expectValue.toEventuallyNot( - ObjCMatcherWrapper(matcher: matcher), - timeout: self._timeout, - description: nil - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toEventuallyNot( + from(objcPredicate: pred), + timeout: self._timeout, + description: nil + ) + } else { + self.expectValue.toEventuallyNot( + ObjCMatcherWrapper(matcher: matcher), + timeout: self._timeout, + description: nil + ) + } }) } - public var toEventuallyNotWithDescription: (NMBMatcher, String) -> Void { + @objc public var toEventuallyNotWithDescription: (NMBMatcher, String) -> Void { return ({ matcher, description in - self.expectValue.toEventuallyNot( - ObjCMatcherWrapper(matcher: matcher), - timeout: self._timeout, - description: description - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toEventuallyNot( + from(objcPredicate: pred), + timeout: self._timeout, + description: description + ) + } else { + self.expectValue.toEventuallyNot( + ObjCMatcherWrapper(matcher: matcher), + timeout: self._timeout, + description: description + ) + } }) } - public var toNotEventually: (NMBMatcher) -> Void { return toEventuallyNot } + @objc public var toNotEventually: (NMBMatcher) -> Void { + return toEventuallyNot + } - public var toNotEventuallyWithDescription: (NMBMatcher, String) -> Void { return toEventuallyNotWithDescription } + @objc public var toNotEventuallyWithDescription: (NMBMatcher, String) -> Void { + return toEventuallyNotWithDescription + } - public class func failWithMessage(_ message: String, file: FileString, line: UInt) { + @objc public class func failWithMessage(_ message: String, file: FileString, line: UInt) { fail(message, location: SourceLocation(file: file, line: line)) } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift b/Demo/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift index 19a4567b..a114dfff 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift @@ -1,9 +1,11 @@ import Foundation -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) -> Bool -public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) -> Bool +// swiftlint:disable line_length +public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) throws -> Bool +public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) throws -> Bool +// swiftlint:enable line_length public class NMBObjCMatcher: NSObject, NMBMatcher { let _match: MatcherBlock @@ -22,7 +24,7 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { public convenience init(canMatchNil: Bool, matcher: @escaping MatcherBlock) { self.init(canMatchNil: canMatchNil, matcher: matcher, notMatcher: ({ actualExpression, failureMessage in - return !matcher(actualExpression, failureMessage) + return try !matcher(actualExpression, failureMessage) })) } @@ -32,9 +34,9 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { public convenience init(canMatchNil: Bool, matcher: @escaping FullMatcherBlock) { self.init(canMatchNil: canMatchNil, matcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, false) + return try matcher(actualExpression, failureMessage, false) }), notMatcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, true) + return try matcher(actualExpression, failureMessage, true) })) } @@ -53,11 +55,16 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { return true } - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let expr = Expression(expression: actualBlock, location: location) - let result = _match( - expr, - failureMessage) + let result: Bool + do { + result = try _match(expr, failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } + if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { return result } else { @@ -65,11 +72,16 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { } } - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let expr = Expression(expression: actualBlock, location: location) - let result = _doesNotMatch( - expr, - failureMessage) + let result: Bool + do { + result = try _doesNotMatch(expr, failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } + if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { return result } else { diff --git a/Demo/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift b/Demo/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift index a55cb271..818e4780 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift @@ -2,8 +2,8 @@ import Dispatch import Foundation /// "Global" state of Nimble is stored here. Only DSL functions should access / be aware of this -/// class' existance -internal class NimbleEnvironment { +/// class' existence +internal class NimbleEnvironment: NSObject { static var activeInstance: NimbleEnvironment { get { let env = Thread.current.threadDictionary["NimbleEnvironment"] @@ -29,7 +29,7 @@ internal class NimbleEnvironment { var suppressTVOSAssertionWarning: Bool = false var awaiter: Awaiter - init() { + override init() { let timeoutQueue: DispatchQueue if #available(OSX 10.10, *) { timeoutQueue = DispatchQueue.global(qos: .userInitiated) @@ -40,6 +40,9 @@ internal class NimbleEnvironment { awaiter = Awaiter( waitLock: AssertionWaitLock(), asyncQueue: .main, - timeoutQueue: timeoutQueue) + timeoutQueue: timeoutQueue + ) + + super.init() } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift b/Demo/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift index 78e6dd92..14bb0453 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift @@ -42,18 +42,29 @@ class NimbleXCTestUnavailableHandler: AssertionHandler { private(set) var currentTestCase: XCTestCase? + private var stashed_swift_reportFatalErrorsToDebugger: Bool = false + @objc func testCaseWillStart(_ testCase: XCTestCase) { + #if swift(>=3.2) + stashed_swift_reportFatalErrorsToDebugger = _swift_reportFatalErrorsToDebugger + _swift_reportFatalErrorsToDebugger = false + #endif + currentTestCase = testCase } @objc func testCaseDidFinish(_ testCase: XCTestCase) { currentTestCase = nil + + #if swift(>=3.2) + _swift_reportFatalErrorsToDebugger = stashed_swift_reportFatalErrorsToDebugger + #endif } } #endif func isXCTestAvailable() -> Bool { -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) // XCTest is weakly linked and so may not be present return NSClassFromString("XCTestCase") != nil #else @@ -61,12 +72,17 @@ func isXCTestAvailable() -> Bool { #endif } -private func recordFailure(_ message: String, location: SourceLocation) { +public func recordFailure(_ message: String, location: SourceLocation) { #if SWIFT_PACKAGE XCTFail("\(message)", file: location.file, line: location.line) #else if let testCase = CurrentTestCaseTracker.sharedInstance.currentTestCase { - testCase.recordFailure(withDescription: message, inFile: location.file, atLine: location.line, expected: true) + #if swift(>=4) + let line = Int(location.line) + #else + let line = location.line + #endif + testCase.recordFailure(withDescription: message, inFile: location.file, atLine: line, expected: true) } else { let msg = "Attempted to report a test failure to XCTest while no test case was running. " + "The failure was:\n\"\(message)\"\nIt occurred at: \(location.file):\(location.line)" diff --git a/Demo/Pods/Nimble/Sources/Nimble/DSL+Wait.swift b/Demo/Pods/Nimble/Sources/Nimble/DSL+Wait.swift index 4f0a8a92..ee281edc 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/DSL+Wait.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/DSL+Wait.swift @@ -11,6 +11,11 @@ private enum ErrorResult { /// bridges to Objective-C via the @objc keyword. This class encapsulates callback-style /// asynchronous waiting logic so that it may be called from Objective-C and Swift. internal class NMBWait: NSObject { +// About these kind of lines, `@objc` attributes are only required for Objective-C +// support, so that should be conditional on Darwin platforms and normal Xcode builds +// (non-SwiftPM builds). +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + @objc internal class func until( timeout: TimeInterval, file: FileString = #file, @@ -20,6 +25,17 @@ internal class NMBWait: NSObject { action(done) } } +#else + internal class func until( + timeout: TimeInterval, + file: FileString = #file, + line: UInt = #line, + action: @escaping (@escaping () -> Void) -> Void) { + return throwableUntil(timeout: timeout, file: file, line: line) { done in + action(done) + } + } +#endif // Using a throwable closure makes this method not objc compatible. internal class func throwableUntil( @@ -29,7 +45,8 @@ internal class NMBWait: NSObject { action: @escaping (@escaping () -> Void) throws -> Void) { let awaiter = NimbleEnvironment.activeInstance.awaiter let leeway = timeout / 2.0 - let result = awaiter.performBlock { (done: @escaping (ErrorResult) -> Void) throws -> Void in + // swiftlint:disable:next line_length + let result = awaiter.performBlock(file: file, line: line) { (done: @escaping (ErrorResult) -> Void) throws -> Void in DispatchQueue.main.async { let capture = NMBExceptionCapture( handler: ({ exception in @@ -70,19 +87,26 @@ internal class NMBWait: NSObject { } } - #if SWIFT_PACKAGE - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) { +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + @objc(untilFile:line:action:) + internal class func until( + _ file: FileString = #file, + line: UInt = #line, + action: @escaping (@escaping () -> Void) -> Void) { until(timeout: 1, file: file, line: line, action: action) } - #else - @objc(untilFile:line:action:) - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) { +#else + internal class func until( + _ file: FileString = #file, + line: UInt = #line, + action: @escaping (@escaping () -> Void) -> Void) { until(timeout: 1, file: file, line: line, action: action) } - #endif +#endif } internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterval) -> String { + // swiftlint:disable:next line_length return "\(fnName) timed out but was unable to run the timeout handler because the main thread is unresponsive (\(leeway) seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." } @@ -93,6 +117,6 @@ internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterv /// /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. -public func waitUntil(timeout: TimeInterval = 1, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { +public func waitUntil(timeout: TimeInterval = AsyncDefaults.Timeout, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { NMBWait.until(timeout: timeout, file: file, line: line, action: action) } diff --git a/Demo/Pods/Nimble/Sources/Nimble/DSL.swift b/Demo/Pods/Nimble/Sources/Nimble/DSL.swift index 7ebd6842..e49bb0c3 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/DSL.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/DSL.swift @@ -43,7 +43,7 @@ internal func nimblePrecondition( line: UInt = #line) { let result = expr() if !result { -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) let e = NSException( name: NSExceptionName(name()), reason: message(), diff --git a/Demo/Pods/Nimble/Sources/Nimble/Expectation.swift b/Demo/Pods/Nimble/Sources/Nimble/Expectation.swift index c5978f4f..41625a12 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Expectation.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Expectation.swift @@ -1,63 +1,96 @@ import Foundation -internal func expressionMatches(_ expression: Expression, matcher: U, to: String, description: String?) -> (Bool, FailureMessage) +// Deprecated +internal func expressionDoesNotMatch(_ expression: Expression, matcher: U, toNot: String, description: String?) -> (Bool, FailureMessage) where U: Matcher, U.ValueType == T { let msg = FailureMessage() msg.userDescription = description - msg.to = to + msg.to = toNot do { - let pass = try matcher.matches(expression, failureMessage: msg) + let pass = try matcher.doesNotMatch(expression, failureMessage: msg) if msg.actualValue == "" { msg.actualValue = "<\(stringify(try expression.evaluate()))>" } return (pass, msg) } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" + msg.stringValue = "unexpected error thrown: <\(error)>" return (false, msg) } } -internal func expressionDoesNotMatch(_ expression: Expression, matcher: U, toNot: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T { - let msg = FailureMessage() - msg.userDescription = description - msg.to = toNot - do { - let pass = try matcher.doesNotMatch(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" +internal func execute(_ expression: Expression, _ style: ExpectationStyle, _ predicate: Predicate, to: String, description: String?, captureExceptions: Bool = true) -> (Bool, FailureMessage) { + func run() -> (Bool, FailureMessage) { + let msg = FailureMessage() + msg.userDescription = description + msg.to = to + do { + let result = try predicate.satisfies(expression) + result.message.update(failureMessage: msg) + if msg.actualValue == "" { + msg.actualValue = "<\(stringify(try expression.evaluate()))>" + } + return (result.toBoolean(expectation: style), msg) + } catch let error { + msg.stringValue = "unexpected error thrown: <\(error)>" + return (false, msg) } - return (pass, msg) - } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" - return (false, msg) } + + var result: (Bool, FailureMessage) = (false, FailureMessage()) + if captureExceptions { + let capture = NMBExceptionCapture(handler: ({ exception -> Void in + let msg = FailureMessage() + msg.stringValue = "unexpected exception raised: \(exception)" + result = (false, msg) + }), finally: nil) + capture.tryBlock { + result = run() + } + } else { + result = run() + } + + return result } public struct Expectation { public let expression: Expression + public init(expression: Expression) { + self.expression = expression + } + public func verify(_ pass: Bool, _ message: FailureMessage) { let handler = NimbleEnvironment.activeInstance.assertionHandler handler.assert(pass, message: message, location: expression.location) } - /// Tests the actual value using a matcher to match. + ////////////////// OLD API ///////////////////// + + /// DEPRECATED: Tests the actual value using a matcher to match. public func to(_ matcher: U, description: String? = nil) where U: Matcher, U.ValueType == T { - let (pass, msg) = expressionMatches(expression, matcher: matcher, to: "to", description: description) - verify(pass, msg) + let (pass, msg) = execute( + expression, + .toMatch, + matcher.predicate, + to: "to", + description: description, + captureExceptions: false + ) + verify(pass, msg) } - /// Tests the actual value using a matcher to not match. + /// DEPRECATED: Tests the actual value using a matcher to not match. public func toNot(_ matcher: U, description: String? = nil) where U: Matcher, U.ValueType == T { + // swiftlint:disable:next line_length let (pass, msg) = expressionDoesNotMatch(expression, matcher: matcher, toNot: "to not", description: description) verify(pass, msg) } - /// Tests the actual value using a matcher to not match. + /// DEPRECATED: Tests the actual value using a matcher to not match. /// /// Alias to toNot(). public func notTo(_ matcher: U, description: String? = nil) @@ -65,7 +98,28 @@ public struct Expectation { toNot(matcher, description: description) } + ////////////////// NEW API ///////////////////// + + /// Tests the actual value using a matcher to match. + public func to(_ predicate: Predicate, description: String? = nil) { + let (pass, msg) = execute(expression, .toMatch, predicate, to: "to", description: description) + verify(pass, msg) + } + + /// Tests the actual value using a matcher to not match. + public func toNot(_ predicate: Predicate, description: String? = nil) { + let (pass, msg) = execute(expression, .toNotMatch, predicate, to: "to not", description: description) + verify(pass, msg) + } + + /// Tests the actual value using a matcher to not match. + /// + /// Alias to toNot(). + public func notTo(_ predicate: Predicate, description: String? = nil) { + toNot(predicate, description: description) + } + // see: - // - AsyncMatcherWrapper for extension + // - `async` for extension // - NMBExpectation for Objective-C interface } diff --git a/Demo/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift b/Demo/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift new file mode 100644 index 00000000..7aae3414 --- /dev/null +++ b/Demo/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift @@ -0,0 +1,264 @@ +import Foundation + +public indirect enum ExpectationMessage { + // --- Primary Expectations --- + /// includes actual value in output ("expected to , got ") + case expectedActualValueTo(/* message: */ String) + /// uses a custom actual value string in output ("expected to , got ") + case expectedCustomValueTo(/* message: */ String, /* actual: */ String) + /// excludes actual value in output ("expected to ") + case expectedTo(/* message: */ String) + /// allows any free-form message ("") + case fail(/* message: */ String) + + // --- Composite Expectations --- + // Generally, you'll want the methods, appended(message:) and appended(details:) instead. + + /// Not Fully Implemented Yet. + case prepends(/* Prepended Message */ String, ExpectationMessage) + + /// appends after an existing message (" (use beNil() to match nils)") + case appends(ExpectationMessage, /* Appended Message */ String) + + /// provides long-form multi-line explainations ("\n\n") + case details(ExpectationMessage, String) + + internal var sampleMessage: String { + let asStr = toString(actual: "", expected: "expected", to: "to") + let asFailureMessage = FailureMessage() + update(failureMessage: asFailureMessage) + // swiftlint:disable:next line_length + return "(toString(actual:expected:to:) -> \(asStr) || update(failureMessage:) -> \(asFailureMessage.stringValue))" + } + + /// Returns the smallest message after the "expected to" string that summarizes the error. + /// + /// Returns the message part from ExpectationMessage, ignoring all .appends and .details. + public var expectedMessage: String { + switch self { + case let .fail(msg): + return msg + case let .expectedTo(msg): + return msg + case let .expectedActualValueTo(msg): + return msg + case let .expectedCustomValueTo(msg, _): + return msg + case let .prepends(_, expectation): + return expectation.expectedMessage + case let .appends(expectation, msg): + return "\(expectation.expectedMessage)\(msg)" + case let .details(expectation, _): + return expectation.expectedMessage + } + } + + /// Appends a message after the primary expectation message + public func appended(message: String) -> ExpectationMessage { + switch self { + case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo, .appends, .prepends: + return .appends(self, message) + case let .details(expectation, msg): + return .details(expectation.appended(message: message), msg) + } + } + + /// Appends a message hinting to use beNil() for when the actual value given was nil. + public func appendedBeNilHint() -> ExpectationMessage { + return appended(message: " (use beNil() to match nils)") + } + + /// Appends a detailed (aka - multiline) message after the primary expectation message + /// Detailed messages will be placed after .appended(message:) calls. + public func appended(details: String) -> ExpectationMessage { + return .details(self, details) + } + + internal func visitLeafs(_ f: (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage { + switch self { + case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo: + return f(self) + case let .prepends(msg, expectation): + return .prepends(msg, expectation.visitLeafs(f)) + case let .appends(expectation, msg): + return .appends(expectation.visitLeafs(f), msg) + case let .details(expectation, msg): + return .details(expectation.visitLeafs(f), msg) + } + } + + /// Replaces a primary expectation with one returned by f. Preserves all composite expectations + /// that were built upon it (aka - all appended(message:) and appended(details:). + public func replacedExpectation(_ f: @escaping (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage { + func walk(_ msg: ExpectationMessage) -> ExpectationMessage { + switch msg { + case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo: + return f(msg) + default: + return msg + } + } + return visitLeafs(walk) + } + + /// Wraps a primary expectation with text before and after it. + /// Alias to prepended(message: before).appended(message: after) + public func wrappedExpectation(before: String, after: String) -> ExpectationMessage { + return prepended(expectation: before).appended(message: after) + } + + /// Prepends a message by modifying the primary expectation + public func prepended(expectation message: String) -> ExpectationMessage { + func walk(_ msg: ExpectationMessage) -> ExpectationMessage { + switch msg { + case let .expectedTo(msg): + return .expectedTo(message + msg) + case let .expectedActualValueTo(msg): + return .expectedActualValueTo(message + msg) + case let .expectedCustomValueTo(msg, actual): + return .expectedCustomValueTo(message + msg, actual) + default: + return msg.visitLeafs(walk) + } + } + return visitLeafs(walk) + } + + // TODO: test & verify correct behavior + internal func prepended(message: String) -> ExpectationMessage { + return .prepends(message, self) + } + + /// Converts the tree of ExpectationMessages into a final built string. + public func toString(actual: String, expected: String = "expected", to: String = "to") -> String { + switch self { + case let .fail(msg): + return msg + case let .expectedTo(msg): + return "\(expected) \(to) \(msg)" + case let .expectedActualValueTo(msg): + return "\(expected) \(to) \(msg), got \(actual)" + case let .expectedCustomValueTo(msg, actual): + return "\(expected) \(to) \(msg), got \(actual)" + case let .prepends(msg, expectation): + return "\(msg)\(expectation.toString(actual: actual, expected: expected, to: to))" + case let .appends(expectation, msg): + return "\(expectation.toString(actual: actual, expected: expected, to: to))\(msg)" + case let .details(expectation, msg): + return "\(expectation.toString(actual: actual, expected: expected, to: to))\n\n\(msg)" + } + } + + // Backwards compatibility: converts ExpectationMessage tree to FailureMessage + internal func update(failureMessage: FailureMessage) { + switch self { + case let .fail(msg) where !msg.isEmpty: + failureMessage.stringValue = msg + case .fail: + break + case let .expectedTo(msg): + failureMessage.actualValue = nil + failureMessage.postfixMessage = msg + case let .expectedActualValueTo(msg): + failureMessage.postfixMessage = msg + case let .expectedCustomValueTo(msg, actual): + failureMessage.postfixMessage = msg + failureMessage.actualValue = actual + case let .prepends(msg, expectation): + expectation.update(failureMessage: failureMessage) + if let desc = failureMessage.userDescription { + failureMessage.userDescription = "\(msg)\(desc)" + } else { + failureMessage.userDescription = msg + } + case let .appends(expectation, msg): + expectation.update(failureMessage: failureMessage) + failureMessage.appendMessage(msg) + case let .details(expectation, msg): + expectation.update(failureMessage: failureMessage) + failureMessage.appendDetails(msg) + } + } +} + +extension FailureMessage { + internal func toExpectationMessage() -> ExpectationMessage { + let defaultMsg = FailureMessage() + if expected != defaultMsg.expected || _stringValueOverride != nil { + return .fail(stringValue) + } + + var msg: ExpectationMessage = .fail(userDescription ?? "") + if actualValue != "" && actualValue != nil { + msg = .expectedCustomValueTo(postfixMessage, actualValue ?? "") + } else if postfixMessage != defaultMsg.postfixMessage { + if actualValue == nil { + msg = .expectedTo(postfixMessage) + } else { + msg = .expectedActualValueTo(postfixMessage) + } + } + if postfixActual != defaultMsg.postfixActual { + msg = .appends(msg, postfixActual) + } + if let m = extendedMessage { + msg = .details(msg, m) + } + return msg + } +} + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) + +public class NMBExpectationMessage: NSObject { + private let msg: ExpectationMessage + + internal init(swift msg: ExpectationMessage) { + self.msg = msg + } + + public init(expectedTo message: String) { + self.msg = .expectedTo(message) + } + public init(expectedActualValueTo message: String) { + self.msg = .expectedActualValueTo(message) + } + + public init(expectedActualValueTo message: String, customActualValue actual: String) { + self.msg = .expectedCustomValueTo(message, actual) + } + + public init(fail message: String) { + self.msg = .fail(message) + } + + public init(prepend message: String, child: NMBExpectationMessage) { + self.msg = .prepends(message, child.msg) + } + + public init(appendedMessage message: String, child: NMBExpectationMessage) { + self.msg = .appends(child.msg, message) + } + + public init(prependedMessage message: String, child: NMBExpectationMessage) { + self.msg = .prepends(message, child.msg) + } + + public init(details message: String, child: NMBExpectationMessage) { + self.msg = .details(child.msg, message) + } + + public func appendedBeNilHint() -> NMBExpectationMessage { + return NMBExpectationMessage(swift: msg.appendedBeNilHint()) + } + + public func toSwift() -> ExpectationMessage { return self.msg } +} + +extension ExpectationMessage { + func toObjectiveC() -> NMBExpectationMessage { + return NMBExpectationMessage(swift: self) + } +} + +#endif diff --git a/Demo/Pods/Nimble/Sources/Nimble/Expression.swift b/Demo/Pods/Nimble/Sources/Nimble/Expression.swift index f7afffe7..5a233fd9 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Expression.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Expression.swift @@ -77,7 +77,11 @@ public struct Expression { /// @param block The block that can cast the current Expression value to a /// new type. public func cast(_ block: @escaping (T?) throws -> U?) -> Expression { - return Expression(expression: ({ try block(self.evaluate()) }), location: self.location, isClosure: self.isClosure) + return Expression( + expression: ({ try block(self.evaluate()) }), + location: self.location, + isClosure: self.isClosure + ) } public func evaluate() throws -> T? { @@ -85,6 +89,11 @@ public struct Expression { } public func withoutCaching() -> Expression { - return Expression(memoizedExpression: self._expression, location: location, withoutCaching: true, isClosure: isClosure) + return Expression( + memoizedExpression: self._expression, + location: location, + withoutCaching: true, + isClosure: isClosure + ) } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/FailureMessage.swift b/Demo/Pods/Nimble/Sources/Nimble/FailureMessage.swift index d457bf3f..2bc57ebd 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/FailureMessage.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/FailureMessage.swift @@ -29,6 +29,9 @@ public class FailureMessage: NSObject { } internal var _stringValueOverride: String? + internal var hasOverriddenStringValue: Bool { + return _stringValueOverride != nil + } public override init() { } @@ -62,4 +65,28 @@ public class FailureMessage: NSObject { return value } + + internal func appendMessage(_ msg: String) { + if hasOverriddenStringValue { + stringValue += "\(msg)" + } else if actualValue != nil { + postfixActual += msg + } else { + postfixMessage += msg + } + } + + internal func appendDetails(_ msg: String) { + if hasOverriddenStringValue { + if let desc = userDescription { + stringValue = "\(desc)\n\(stringValue)" + } + stringValue += "\n\(msg)" + } else { + if let desc = userDescription { + userDescription = desc + } + extendedMessage = msg + } + } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift index 73e79d37..cc6c24f0 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift @@ -1,66 +1,79 @@ import Foundation public func allPass - (_ passFunc: @escaping (T?) -> Bool) -> NonNilMatcherFunc - where U: Sequence, U.Iterator.Element == T { - return allPass("pass a condition", passFunc) + (_ passFunc: @escaping (T?) throws -> Bool) -> Predicate + where U: Sequence, T == U.Iterator.Element { + let matcher = Predicate.simpleNilable("pass a condition") { actualExpression in + return PredicateStatus(bool: try passFunc(try actualExpression.evaluate())) + } + return createPredicate(matcher) } public func allPass - (_ passName: String, _ passFunc: @escaping (T?) -> Bool) -> NonNilMatcherFunc - where U: Sequence, U.Iterator.Element == T { - return createAllPassMatcher { expression, failureMessage in - failureMessage.postfixMessage = passName - return passFunc(try expression.evaluate()) - } + (_ passName: String, _ passFunc: @escaping (T?) throws -> Bool) -> Predicate + where U: Sequence, T == U.Iterator.Element { + let matcher = Predicate.simpleNilable(passName) { actualExpression in + return PredicateStatus(bool: try passFunc(try actualExpression.evaluate())) + } + return createPredicate(matcher) } -public func allPass - (_ matcher: V) -> NonNilMatcherFunc - where U: Sequence, V: Matcher, U.Iterator.Element == V.ValueType { - return createAllPassMatcher { - try matcher.matches($0, failureMessage: $1) - } +public func allPass(_ elementMatcher: M) -> Predicate + where S: Sequence, M: Matcher, S.Iterator.Element == M.ValueType { + return createPredicate(elementMatcher.predicate) +} + +public func allPass(_ elementPredicate: Predicate) -> Predicate + where S: Sequence { + return createPredicate(elementPredicate) } -private func createAllPassMatcher - (_ elementEvaluator: @escaping (Expression, FailureMessage) throws -> Bool) -> NonNilMatcherFunc - where U: Sequence, U.Iterator.Element == T { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.actualValue = nil - if let actualValue = try actualExpression.evaluate() { +private func createPredicate(_ elementMatcher: Predicate) -> Predicate + where S: Sequence { + return Predicate { actualExpression in + guard let actualValue = try actualExpression.evaluate() else { + return PredicateResult( + status: .fail, + message: .appends(.expectedTo("all pass"), " (use beNil() to match nils)") + ) + } + + var failure: ExpectationMessage = .expectedTo("all pass") for currentElement in actualValue { let exp = Expression( expression: {currentElement}, location: actualExpression.location) - if try !elementEvaluator(exp, failureMessage) { - failureMessage.postfixMessage = - "all \(failureMessage.postfixMessage)," - + " but failed first at element <\(stringify(currentElement))>" - + " in <\(stringify(actualValue))>" - return false + let predicateResult = try elementMatcher.satisfies(exp) + if predicateResult.status == .matches { + failure = predicateResult.message.prepended(expectation: "all ") + } else { + failure = predicateResult.message + .replacedExpectation({ .expectedTo($0.expectedMessage) }) + .wrappedExpectation( + before: "all ", + after: ", but failed first at element <\(stringify(currentElement))>" + + " in <\(stringify(actualValue))>" + ) + return PredicateResult(status: .doesNotMatch, message: failure) } } - failureMessage.postfixMessage = "all \(failureMessage.postfixMessage)" - } else { - failureMessage.postfixMessage = "all pass (use beNil() to match nils)" - return false + failure = failure.replacedExpectation({ expectation in + return .expectedTo(expectation.expectedMessage) + }) + return PredicateResult(status: .matches, message: failure) } - - return true - } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func allPassMatcher(_ matcher: NMBObjCMatcher) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + @objc public class func allPassMatcher(_ matcher: NMBMatcher) -> NMBPredicate { + return NMBPredicate { actualExpression in let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() + let actualValue = try actualExpression.evaluate() var nsObjects = [NSObject]() var collectionIsUsable = true if let value = actualValue as? NSFastEnumeration { - let generator = NSFastEnumerationIterator(value) + var generator = NSFastEnumerationIterator(value) while let obj = generator.next() { if let nsObject = obj as? NSObject { nsObjects.append(nsObject) @@ -74,20 +87,34 @@ extension NMBObjCMatcher { } if !collectionIsUsable { - failureMessage.postfixMessage = - "allPass only works with NSFastEnumeration (NSArray, NSSet, ...) of NSObjects" - failureMessage.expected = "" - failureMessage.to = "" - return false + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage( + // swiftlint:disable:next line_length + fail: "allPass can only be used with types which implement NSFastEnumeration (NSArray, NSSet, ...), and whose elements subclass NSObject, got <\(actualValue?.description ?? "nil")>" + ) + ) } let expr = Expression(expression: ({ nsObjects }), location: location) - let elementEvaluator: (Expression, FailureMessage) -> Bool = { - expression, failureMessage in - return matcher.matches({try! expression.evaluate()}, failureMessage: failureMessage, location: expr.location) - } - return try! createAllPassMatcher(elementEvaluator).matches( - expr, failureMessage: failureMessage) + let pred: Predicate<[NSObject]> = createPredicate(Predicate { expr in + if let predicate = matcher as? NMBPredicate { + return predicate.satisfies(({ try expr.evaluate() }), location: expr.location).toSwift() + } else { + let failureMessage = FailureMessage() + let result = matcher.matches( + ({ try! expr.evaluate() }), + failureMessage: failureMessage, + location: expr.location + ) + let expectationMsg = failureMessage.toExpectationMessage() + return PredicateResult( + bool: result, + message: expectationMsg + ) + } + }) + return try pred.satisfies(expr).toObjectiveC() } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/Async.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Async.swift new file mode 100644 index 00000000..c70b65e2 --- /dev/null +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Async.swift @@ -0,0 +1,179 @@ +import Foundation + +/// If you are running on a slower machine, it could be useful to increase the default timeout value +/// or slow down poll interval. Default timeout interval is 1, and poll interval is 0.01. +public struct AsyncDefaults { + public static var Timeout: TimeInterval = 1 + public static var PollInterval: TimeInterval = 0.01 +} + +private func async(style: ExpectationStyle, predicate: Predicate, timeout: TimeInterval, poll: TimeInterval, fnName: String) -> Predicate { + return Predicate { actualExpression in + let uncachedExpression = actualExpression.withoutCaching() + let fnName = "expect(...).\(fnName)(...)" + var lastPredicateResult: PredicateResult? + let result = pollBlock( + pollInterval: poll, + timeoutInterval: timeout, + file: actualExpression.location.file, + line: actualExpression.location.line, + fnName: fnName) { + lastPredicateResult = try predicate.satisfies(uncachedExpression) + return lastPredicateResult!.toBoolean(expectation: style) + } + switch result { + case .completed: return lastPredicateResult! + case .timedOut: + let message = lastPredicateResult?.message ?? .fail("timed out before returning a value") + return PredicateResult(status: .fail, message: message) + case let .errorThrown(error): + return PredicateResult(status: .fail, message: .fail("unexpected error thrown: <\(error)>")) + case let .raisedException(exception): + return PredicateResult(status: .fail, message: .fail("unexpected exception raised: \(exception)")) + case .blockedRunLoop: + // swiftlint:disable:next line_length + let message = lastPredicateResult?.message.appended(message: " (timed out, but main run loop was unresponsive).") ?? + .fail("main run loop was unresponsive") + return PredicateResult(status: .fail, message: message) + case .incomplete: + internalError("Reached .incomplete state for \(fnName)(...).") + } + } +} + +private let toEventuallyRequiresClosureError = FailureMessage( + // swiftlint:disable:next line_length + stringValue: "expect(...).toEventually(...) requires an explicit closure (eg - expect { ... }.toEventually(...) )\nSwift 1.2 @autoclosure behavior has changed in an incompatible way for Nimble to function" +) + +extension Expectation { + /// Tests the actual value using a matcher to match by checking continuously + /// at each pollInterval until the timeout is reached. + /// + /// @discussion + /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function + /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. + public func toEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { + nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) + + let (pass, msg) = execute( + expression, + .toMatch, + async(style: .toMatch, predicate: predicate, timeout: timeout, poll: pollInterval, fnName: "toEventually"), + to: "to eventually", + description: description, + captureExceptions: false + ) + verify(pass, msg) + } + + /// Tests the actual value using a matcher to not match by checking + /// continuously at each pollInterval until the timeout is reached. + /// + /// @discussion + /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function + /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. + public func toEventuallyNot(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { + nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) + + let (pass, msg) = execute( + expression, + .toNotMatch, + async( + style: .toNotMatch, + predicate: predicate, + timeout: timeout, + poll: pollInterval, + fnName: "toEventuallyNot" + ), + to: "to eventually not", + description: description, + captureExceptions: false + ) + verify(pass, msg) + } + + /// Tests the actual value using a matcher to not match by checking + /// continuously at each pollInterval until the timeout is reached. + /// + /// Alias of toEventuallyNot() + /// + /// @discussion + /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function + /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. + public func toNotEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { + return toEventuallyNot(predicate, timeout: timeout, pollInterval: pollInterval, description: description) + } +} + +// Deprecated +extension Expectation { + /// Tests the actual value using a matcher to match by checking continuously + /// at each pollInterval until the timeout is reached. + /// + /// @discussion + /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function + /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. + public func toEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) + where U: Matcher, U.ValueType == T { + if expression.isClosure { + let (pass, msg) = execute( + expression, + .toMatch, + async( + style: .toMatch, + predicate: matcher.predicate, + timeout: timeout, + poll: pollInterval, + fnName: "toEventually" + ), + to: "to eventually", + description: description, + captureExceptions: false + ) + verify(pass, msg) + } else { + verify(false, toEventuallyRequiresClosureError) + } + } + + /// Tests the actual value using a matcher to not match by checking + /// continuously at each pollInterval until the timeout is reached. + /// + /// @discussion + /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function + /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. + public func toEventuallyNot(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) + where U: Matcher, U.ValueType == T { + if expression.isClosure { + let (pass, msg) = expressionDoesNotMatch( + expression, + matcher: async( + style: .toNotMatch, + predicate: matcher.predicate, + timeout: timeout, + poll: pollInterval, + fnName: "toEventuallyNot" + ), + toNot: "to eventually not", + description: description + ) + verify(pass, msg) + } else { + verify(false, toEventuallyRequiresClosureError) + } + } + + /// Tests the actual value using a matcher to not match by checking + /// continuously at each pollInterval until the timeout is reached. + /// + /// Alias of toEventuallyNot() + /// + /// @discussion + /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function + /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. + public func toNotEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) + where U: Matcher, U.ValueType == T { + return toEventuallyNot(matcher, timeout: timeout, pollInterval: pollInterval, description: description) + } +} diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift deleted file mode 100644 index b971ccc1..00000000 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift +++ /dev/null @@ -1,141 +0,0 @@ -import Foundation - -/// If you are running on a slower machine, it could be useful to increase the default timeout value -/// or slow down poll interval. Default timeout interval is 1, and poll interval is 0.01. -public struct AsyncDefaults { - public static var Timeout: TimeInterval = 1 - public static var PollInterval: TimeInterval = 0.01 -} - -internal struct AsyncMatcherWrapper: Matcher - where U: Matcher, U.ValueType == T { - let fullMatcher: U - let timeoutInterval: TimeInterval - let pollInterval: TimeInterval - - init(fullMatcher: U, timeoutInterval: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval) { - self.fullMatcher = fullMatcher - self.timeoutInterval = timeoutInterval - self.pollInterval = pollInterval - } - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let fnName = "expect(...).toEventually(...)" - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: fnName) { - try self.fullMatcher.matches(uncachedExpression, failureMessage: failureMessage) - } - switch result { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventually(...).") - } - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: "expect(...).toEventuallyNot(...)") { - try self.fullMatcher.doesNotMatch(uncachedExpression, failureMessage: failureMessage) - } - switch result { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventuallyNot(...).") - } - } -} - -private let toEventuallyRequiresClosureError = FailureMessage(stringValue: "expect(...).toEventually(...) requires an explicit closure (eg - expect { ... }.toEventually(...) )\nSwift 1.2 @autoclosure behavior has changed in an incompatible way for Nimble to function") - -extension Expectation { - /// Tests the actual value using a matcher to match by checking continuously - /// at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T { - if expression.isClosure { - let (pass, msg) = expressionMatches( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - to: "to eventually", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventuallyNot(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T { - if expression.isClosure { - let (pass, msg) = expressionDoesNotMatch( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - toNot: "to eventually not", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// Alias of toEventuallyNot() - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toNotEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T { - return toEventuallyNot(matcher, timeout: timeout, pollInterval: pollInterval, description: description) - } -} diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift index f636a72f..5d0f5a1f 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift @@ -1,46 +1,66 @@ import Foundation +private func matcherMessage(forType expectedType: T.Type) -> String { + return "be a kind of \(String(describing: expectedType))" +} +private func matcherMessage(forClass expectedClass: AnyClass) -> String { + return "be a kind of \(String(describing: expectedClass))" +} + /// A Nimble matcher that succeeds when the actual value is an instance of the given class. -public func beAKindOf(_ expectedType: T.Type) -> NonNilMatcherFunc { - return NonNilMatcherFunc {actualExpression, failureMessage in - failureMessage.postfixMessage = "be a kind of \(String(describing: expectedType))" +public func beAKindOf(_ expectedType: T.Type) -> Predicate { + return Predicate.define { actualExpression in + let message: ExpectationMessage + let instance = try actualExpression.evaluate() guard let validInstance = instance else { - failureMessage.actualValue = "" - return false + message = .expectedCustomValueTo(matcherMessage(forType: expectedType), "") + return PredicateResult(status: .fail, message: message) } + message = .expectedCustomValueTo( + "be a kind of \(String(describing: expectedType))", + "<\(String(describing: type(of: validInstance))) instance>" + ) - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" - - guard validInstance is T else { - return false - } - - return true + return PredicateResult( + bool: validInstance is T, + message: message + ) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) /// A Nimble matcher that succeeds when the actual value is an instance of the given class. /// @see beAnInstanceOf if you want to match against the exact class -public func beAKindOf(_ expectedClass: AnyClass) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beAKindOf(_ expectedClass: AnyClass) -> Predicate { + return Predicate.define { actualExpression in + let message: ExpectationMessage + let status: PredicateStatus + let instance = try actualExpression.evaluate() if let validInstance = instance { - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" + status = PredicateStatus(bool: instance != nil && instance!.isKind(of: expectedClass)) + message = .expectedCustomValueTo( + matcherMessage(forClass: expectedClass), + "<\(String(describing: type(of: validInstance))) instance>" + ) } else { - failureMessage.actualValue = "" + status = .fail + message = .expectedCustomValueTo( + matcherMessage(forClass: expectedClass), + "" + ) } - failureMessage.postfixMessage = "be a kind of \(String(describing: expectedClass))" - return instance != nil && instance!.isKind(of: expectedClass) + + return PredicateResult(status: status, message: message) } } extension NMBObjCMatcher { - public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAKindOf(expected).matches(actualExpression, failureMessage: failureMessage) + @objc public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { + return NMBPredicate { actualExpression in + return try beAKindOf(expected).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift index 07ce3d35..bc1b02c6 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift @@ -1,49 +1,55 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is an _exact_ instance of the given class. -public func beAnInstanceOf(_ expectedType: T.Type) -> NonNilMatcherFunc { - return NonNilMatcherFunc {actualExpression, failureMessage in - failureMessage.postfixMessage = "be an instance of \(String(describing: expectedType))" +public func beAnInstanceOf(_ expectedType: T.Type) -> Predicate { + let errorMessage = "be an instance of \(String(describing: expectedType))" + return Predicate.define { actualExpression in let instance = try actualExpression.evaluate() guard let validInstance = instance else { - failureMessage.actualValue = "" - return false + return PredicateResult( + status: .doesNotMatch, + message: .expectedActualValueTo(errorMessage) + ) } - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" + let actualString = "<\(String(describing: type(of: validInstance))) instance>" - if type(of: validInstance) == expectedType { - return true - } - - return false + return PredicateResult( + status: PredicateStatus(bool: type(of: validInstance) == expectedType), + message: .expectedCustomValueTo(errorMessage, actualString) + ) } } /// A Nimble matcher that succeeds when the actual value is an instance of the given class. /// @see beAKindOf if you want to match against subclasses -public func beAnInstanceOf(_ expectedClass: AnyClass) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beAnInstanceOf(_ expectedClass: AnyClass) -> Predicate { + let errorMessage = "be an instance of \(String(describing: expectedClass))" + return Predicate.define { actualExpression in let instance = try actualExpression.evaluate() + let actualString: String if let validInstance = instance { - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" + actualString = "<\(String(describing: type(of: validInstance))) instance>" } else { - failureMessage.actualValue = "" + actualString = "" } - failureMessage.postfixMessage = "be an instance of \(String(describing: expectedClass))" -#if _runtime(_ObjC) - return instance != nil && instance!.isMember(of: expectedClass) -#else - return instance != nil && type(of: instance!) == expectedClass -#endif + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) + let matches = instance != nil && instance!.isMember(of: expectedClass) + #else + let matches = instance != nil && type(of: instance!) == expectedClass + #endif + return PredicateResult( + status: PredicateStatus(bool: matches), + message: .expectedCustomValueTo(errorMessage, actualString) + ) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAnInstanceOf(expected).matches(actualExpression, failureMessage: failureMessage) + @objc public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { + return NMBPredicate { actualExpression in + return try beAnInstanceOf(expected).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift index 95c52cfe..b1e6f4c5 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift @@ -1,20 +1,26 @@ import Foundation -internal let DefaultDelta = 0.0001 - -internal func isCloseTo(_ actualValue: NMBDoubleConvertible?, expectedValue: NMBDoubleConvertible, delta: Double, failureMessage: FailureMessage) -> Bool { - failureMessage.postfixMessage = "be close to <\(stringify(expectedValue))> (within \(stringify(delta)))" - failureMessage.actualValue = "<\(stringify(actualValue))>" - return actualValue != nil && abs(actualValue!.doubleValue - expectedValue.doubleValue) < delta +public let DefaultDelta = 0.0001 + +internal func isCloseTo(_ actualValue: NMBDoubleConvertible?, + expectedValue: NMBDoubleConvertible, + delta: Double) + -> PredicateResult { + let errorMessage = "be close to <\(stringify(expectedValue))> (within \(stringify(delta)))" + return PredicateResult( + bool: actualValue != nil && + abs(actualValue!.doubleValue - expectedValue.doubleValue) < delta, + message: .expectedCustomValueTo(errorMessage, "<\(stringify(actualValue))>") + ) } /// A Nimble matcher that succeeds when a value is close to another. This is used for floating /// point values which can have imprecise results when doing arithmetic on them. /// /// @see equal -public func beCloseTo(_ expectedValue: Double, within delta: Double = DefaultDelta) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta, failureMessage: failureMessage) +public func beCloseTo(_ expectedValue: Double, within delta: Double = DefaultDelta) -> Predicate { + return Predicate.define { actualExpression in + return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta) } } @@ -22,13 +28,13 @@ public func beCloseTo(_ expectedValue: Double, within delta: Double = DefaultDel /// point values which can have imprecise results when doing arithmetic on them. /// /// @see equal -public func beCloseTo(_ expectedValue: NMBDoubleConvertible, within delta: Double = DefaultDelta) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta, failureMessage: failureMessage) +public func beCloseTo(_ expectedValue: NMBDoubleConvertible, within delta: Double = DefaultDelta) -> Predicate { + return Predicate.define { actualExpression in + return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { var _expected: NSNumber var _delta: CDouble @@ -37,25 +43,37 @@ public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { _delta = within } - public func matches(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func matches(_ actualExpression: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let actualBlock: () -> NMBDoubleConvertible? = ({ return actualExpression() as? NMBDoubleConvertible }) let expr = Expression(expression: actualBlock, location: location) let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.matches(expr, failureMessage: failureMessage) + + do { + return try matcher.matches(expr, failureMessage: failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } } - public func doesNotMatch(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func doesNotMatch(_ actualExpression: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let actualBlock: () -> NMBDoubleConvertible? = ({ return actualExpression() as? NMBDoubleConvertible }) let expr = Expression(expression: actualBlock, location: location) let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.doesNotMatch(expr, failureMessage: failureMessage) + + do { + return try matcher.doesNotMatch(expr, failureMessage: failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } } - public var within: (CDouble) -> NMBObjCBeCloseToMatcher { + @objc public var within: (CDouble) -> NMBObjCBeCloseToMatcher { return ({ delta in return NMBObjCBeCloseToMatcher(expected: self._expected, within: delta) }) @@ -63,30 +81,28 @@ public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { } extension NMBObjCMatcher { - public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToMatcher { + @objc public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToMatcher { return NMBObjCBeCloseToMatcher(expected: expected, within: within) } } #endif -public func beCloseTo(_ expectedValues: [Double], within delta: Double = DefaultDelta) -> NonNilMatcherFunc <[Double]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be close to <\(stringify(expectedValues))> (each within \(stringify(delta)))" +public func beCloseTo(_ expectedValues: [Double], within delta: Double = DefaultDelta) -> Predicate<[Double]> { + let errorMessage = "be close to <\(stringify(expectedValues))> (each within \(stringify(delta)))" + return Predicate.simple(errorMessage) { actualExpression in if let actual = try actualExpression.evaluate() { - failureMessage.actualValue = "<\(stringify(actual))>" - if actual.count != expectedValues.count { - return false + return .doesNotMatch } else { for (index, actualItem) in actual.enumerated() { if fabs(actualItem - expectedValues[index]) > delta { - return false + return .doesNotMatch } } - return true + return .matches } } - return false + return .doesNotMatch } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift index 2ea2cdb0..8d73dcca 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift @@ -2,35 +2,32 @@ import Foundation /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualSeq = try actualExpression.evaluate() if actualSeq == nil { - return true + return .fail } var generator = actualSeq!.makeIterator() - return generator.next() == nil + return PredicateStatus(bool: generator.next() == nil) } } /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualString = try actualExpression.evaluate() - return actualString == nil || NSString(string: actualString!).length == 0 + return PredicateStatus(bool: actualString == nil || NSString(string: actualString!).length == 0) } } /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For NSString instances, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualString = try actualExpression.evaluate() - return actualString == nil || actualString!.length == 0 + return PredicateStatus(bool: actualString == nil || actualString!.length == 0) } } @@ -39,52 +36,59 @@ public func beEmpty() -> NonNilMatcherFunc { /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualDictionary = try actualExpression.evaluate() - return actualDictionary == nil || actualDictionary!.count == 0 + return PredicateStatus(bool: actualDictionary == nil || actualDictionary!.count == 0) } } /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualArray = try actualExpression.evaluate() - return actualArray == nil || actualArray!.count == 0 + return PredicateStatus(bool: actualArray == nil || actualArray!.count == 0) } } /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actual = try actualExpression.evaluate() - return actual == nil || actual!.count == 0 + return PredicateStatus(bool: actual == nil || actual!.count == 0) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beEmptyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + @objc public class func beEmptyMatcher() -> NMBPredicate { + return NMBPredicate { actualExpression in let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - failureMessage.postfixMessage = "be empty" + let actualValue = try actualExpression.evaluate() + if let value = actualValue as? NMBCollection { let expr = Expression(expression: ({ value as NMBCollection }), location: location) - return try! beEmpty().matches(expr, failureMessage: failureMessage) + return try beEmpty().satisfies(expr).toObjectiveC() } else if let value = actualValue as? NSString { let expr = Expression(expression: ({ value as String }), location: location) - return try! beEmpty().matches(expr, failureMessage: failureMessage) + return try beEmpty().satisfies(expr).toObjectiveC() } else if let actualValue = actualValue { - failureMessage.postfixMessage = "be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings)" - failureMessage.actualValue = "\(String(describing: type(of: actualValue))) type" + // swiftlint:disable:next line_length + let badTypeErrorMsg = "be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings)" + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage( + expectedActualValueTo: badTypeErrorMsg, + customActualValue: "\(String(describing: type(of: actualValue))) type" + ) + ) } - return false + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage(expectedActualValueTo: "be empty").appendedBeNilHint() + ) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift index c7eb84cd..b86f25db 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift @@ -1,23 +1,24 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is greater than the expected value. -public func beGreaterThan(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than <\(stringify(expectedValue))>" +public func beGreaterThan(_ expectedValue: T?) -> Predicate { + let errorMessage = "be greater than <\(stringify(expectedValue))>" + return Predicate.simple(errorMessage) { actualExpression in if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual > expected + return PredicateStatus(bool: actual > expected) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual value is greater than the expected value. -public func beGreaterThan(_ expectedValue: NMBComparable?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than <\(stringify(expectedValue))>" +public func beGreaterThan(_ expectedValue: NMBComparable?) -> Predicate { + let errorMessage = "be greater than <\(stringify(expectedValue))>" + return Predicate.simple(errorMessage) { actualExpression in let actualValue = try actualExpression.evaluate() - let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedDescending - return matches + let matches = actualValue != nil + && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedDescending + return PredicateStatus(bool: matches) } } @@ -29,12 +30,12 @@ public func > (lhs: Expectation, rhs: NMBComparable?) { lhs.to(beGreaterThan(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { + @objc public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThan(expected).matches(expr, failureMessage: failureMessage) + return try beGreaterThan(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift index 2949fcea..2a3ca4ae 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift @@ -2,25 +2,25 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is greater than /// or equal to the expected value. -public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" +public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { + let message = "be greater than or equal to <\(stringify(expectedValue))>" + return Predicate.simple(message) { actualExpression in let actualValue = try actualExpression.evaluate() if let actual = actualValue, let expected = expectedValue { - return actual >= expected + return PredicateStatus(bool: actual >= expected) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual value is greater than /// or equal to the expected value. -public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" +public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { + let message = "be greater than or equal to <\(stringify(expectedValue))>" + return Predicate.simple(message) { actualExpression in let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedAscending - return matches + return PredicateStatus(bool: matches) } } @@ -32,12 +32,12 @@ public func >=(lhs: Expectation, rhs: T) { lhs.to(beGreaterThanOrEqualTo(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { + @objc public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) + return try beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift index 8df7e5ff..dfbcb9e8 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift @@ -2,20 +2,51 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is the same instance /// as the expected instance. -public func beIdenticalTo(_ expected: Any?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beIdenticalTo(_ expected: Any?) -> Predicate { + return Predicate.define { actualExpression in #if os(Linux) - let actual = try actualExpression.evaluate() as? AnyObject + #if swift(>=4.0) + #if !swift(>=4.1.50) + let actual = try actualExpression.evaluate() as? AnyObject + #else + let actual = try actualExpression.evaluate() as AnyObject? + #endif + #else + #if !swift(>=3.4) + let actual = try actualExpression.evaluate() as? AnyObject + #else + let actual = try actualExpression.evaluate() as AnyObject? + #endif + #endif #else let actual = try actualExpression.evaluate() as AnyObject? #endif - failureMessage.actualValue = "\(identityAsString(actual))" - failureMessage.postfixMessage = "be identical to \(identityAsString(expected))" + + let bool: Bool #if os(Linux) - return actual === (expected as? AnyObject) && actual !== nil + #if swift(>=4.0) + #if !swift(>=4.1.50) + bool = actual === (expected as? AnyObject) && actual !== nil + #else + bool = actual === (expected as AnyObject?) && actual !== nil + #endif + #else + #if !swift(>=3.4) + bool = actual === (expected as? AnyObject) && actual !== nil + #else + bool = actual === (expected as AnyObject?) && actual !== nil + #endif + #endif #else - return actual === (expected as AnyObject?) && actual !== nil + bool = actual === (expected as AnyObject?) && actual !== nil #endif + return PredicateResult( + bool: bool, + message: .expectedCustomValueTo( + "be identical to \(identityAsString(expected))", + "\(identityAsString(actual))" + ) + ) } } @@ -30,16 +61,16 @@ public func !== (lhs: Expectation, rhs: Any?) { /// as the expected instance. /// /// Alias for "beIdenticalTo". -public func be(_ expected: Any?) -> NonNilMatcherFunc { +public func be(_ expected: Any?) -> Predicate { return beIdenticalTo(expected) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBObjCMatcher { + @objc public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let aExpr = actualExpression.cast { $0 as Any? } - return try! beIdenticalTo(expected).matches(aExpr, failureMessage: failureMessage) + return try beIdenticalTo(expected).matches(aExpr, failureMessage: failureMessage) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift index 5bbbf365..e1fbf1e5 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift @@ -1,23 +1,23 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is less than the expected value. -public func beLessThan(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" +public func beLessThan(_ expectedValue: T?) -> Predicate { + let message = "be less than <\(stringify(expectedValue))>" + return Predicate.simple(message) { actualExpression in if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual < expected + return PredicateStatus(bool: actual < expected) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual value is less than the expected value. -public func beLessThan(_ expectedValue: NMBComparable?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" +public func beLessThan(_ expectedValue: NMBComparable?) -> Predicate { + let message = "be less than <\(stringify(expectedValue))>" + return Predicate.simple(message) { actualExpression in let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedAscending - return matches + return PredicateStatus(bool: matches) } } @@ -29,12 +29,12 @@ public func < (lhs: Expectation, rhs: NMBComparable?) { lhs.to(beLessThan(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { + @objc public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThan(expected).matches(expr, failureMessage: failureMessage) + return try beLessThan(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift index a0cd2f01..c37cb168 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift @@ -2,23 +2,22 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is less than /// or equal to the expected value. -public func beLessThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" +public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.simple("be less than or equal to <\(stringify(expectedValue))>") { actualExpression in if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual <= expected + return PredicateStatus(bool: actual <= expected) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual value is less than /// or equal to the expected value. -public func beLessThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" +public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.simple("be less than or equal to <\(stringify(expectedValue))>") { actualExpression in let actualValue = try actualExpression.evaluate() - return actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedDescending + let matches = actualValue.map { $0.NMB_compare(expectedValue) != .orderedDescending } ?? false + return PredicateStatus(bool: matches) } } @@ -30,12 +29,12 @@ public func <=(lhs: Expectation, rhs: T) { lhs.to(beLessThanOrEqualTo(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil:false) { actualExpression, failureMessage in + @objc public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { + return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) + return try beLessThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift index 49272a37..035500e0 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift @@ -72,37 +72,32 @@ extension UInt: ExpressibleByBooleanLiteral { } } -internal func matcherWithFailureMessage(_ matcher: NonNilMatcherFunc, postprocessor: @escaping (FailureMessage) -> Void) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - defer { postprocessor(failureMessage) } - return try matcher.matcher(actualExpression, failureMessage) - } +internal func rename(_ matcher: Predicate, failureMessage message: ExpectationMessage) -> Predicate { + return Predicate { actualExpression in + let result = try matcher.satisfies(actualExpression) + return PredicateResult(status: result.status, message: message) + }.requireNonNil } // MARK: beTrue() / beFalse() /// A Nimble matcher that succeeds when the actual value is exactly true. /// This matcher will not match against nils. -public func beTrue() -> NonNilMatcherFunc { - return matcherWithFailureMessage(equal(true)) { failureMessage in - failureMessage.postfixMessage = "be true" - } +public func beTrue() -> Predicate { + return rename(equal(true), failureMessage: .expectedActualValueTo("be true")) } /// A Nimble matcher that succeeds when the actual value is exactly false. /// This matcher will not match against nils. -public func beFalse() -> NonNilMatcherFunc { - return matcherWithFailureMessage(equal(false)) { failureMessage in - failureMessage.postfixMessage = "be false" - } +public func beFalse() -> Predicate { + return rename(equal(false), failureMessage: .expectedActualValueTo("be false")) } // MARK: beTruthy() / beFalsy() /// A Nimble matcher that succeeds when the actual value is not logically false. -public func beTruthy() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be truthy" +public func beTruthy() -> Predicate { + return Predicate.simpleNilable("be truthy") { actualExpression in let actualValue = try actualExpression.evaluate() if let actualValue = actualValue { // FIXME: This is a workaround to SR-2290. @@ -110,20 +105,19 @@ public func beTruthy() -> MatcherFun // - https://bugs.swift.org/browse/SR-2290 // - https://github.com/norio-nomura/Nimble/pull/5#issuecomment-237835873 if let number = actualValue as? NSNumber { - return number.boolValue == true + return PredicateStatus(bool: number.boolValue == true) } - return actualValue == (true as T) + return PredicateStatus(bool: actualValue == (true as T)) } - return actualValue != nil + return PredicateStatus(bool: actualValue != nil) } } /// A Nimble matcher that succeeds when the actual value is logically false. /// This matcher will match against nils. -public func beFalsy() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be falsy" +public func beFalsy() -> Predicate { + return Predicate.simpleNilable("be falsy") { actualExpression in let actualValue = try actualExpression.evaluate() if let actualValue = actualValue { // FIXME: This is a workaround to SR-2290. @@ -131,42 +125,42 @@ public func beFalsy() -> MatcherFunc // - https://bugs.swift.org/browse/SR-2290 // - https://github.com/norio-nomura/Nimble/pull/5#issuecomment-237835873 if let number = actualValue as? NSNumber { - return number.boolValue == false + return PredicateStatus(bool: number.boolValue == false) } - return actualValue == (false as T) + return PredicateStatus(bool: actualValue == (false as T)) } - return actualValue == nil + return PredicateStatus(bool: actualValue == nil) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beTruthyMatcher() -> NMBObjCMatcher { + @objc public class func beTruthyMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTruthy().matches(expr, failureMessage: failureMessage) + return try beTruthy().matches(expr, failureMessage: failureMessage) } } - public class func beFalsyMatcher() -> NMBObjCMatcher { + @objc public class func beFalsyMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalsy().matches(expr, failureMessage: failureMessage) + return try beFalsy().matches(expr, failureMessage: failureMessage) } } - public class func beTrueMatcher() -> NMBObjCMatcher { + @objc public class func beTrueMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTrue().matches(expr, failureMessage: failureMessage) + return try beTrue().matches(expr, failureMessage: failureMessage) } } - public class func beFalseMatcher() -> NMBObjCMatcher { + @objc public class func beFalseMatcher() -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalse().matches(expr, failureMessage: failureMessage) + return try beFalse().matches(expr, failureMessage: failureMessage) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift index a6fb31fa..387420bd 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift @@ -1,19 +1,18 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is nil. -public func beNil() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be nil" +public func beNil() -> Predicate { + return Predicate.simpleNilable("be nil") { actualExpression in let actualValue = try actualExpression.evaluate() - return actualValue == nil + return PredicateStatus(bool: actualValue == nil) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { + @objc public class func beNilMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in - return try! beNil().matches(actualExpression, failureMessage: failureMessage) + return try beNil().matches(actualExpression, failureMessage: failureMessage) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift index 92a8d432..a9dbc289 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift @@ -1,11 +1,10 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is Void. -public func beVoid() -> MatcherFunc<()> { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be void" +public func beVoid() -> Predicate<()> { + return Predicate.simpleNilable("be void") { actualExpression in let actualValue: ()? = try actualExpression.evaluate() - return actualValue != nil + return PredicateStatus(bool: actualValue != nil) } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift index 31cbe5df..cb3efe30 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift @@ -2,60 +2,56 @@ import Foundation /// A Nimble matcher that succeeds when the actual sequence's first element /// is equal to the expected value. -public func beginWith(_ startingElement: T) -> NonNilMatcherFunc +public func beginWith(_ startingElement: T) -> Predicate where S.Iterator.Element == T { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "begin with <\(startingElement)>" + return Predicate.simple("begin with <\(startingElement)>") { actualExpression in if let actualValue = try actualExpression.evaluate() { var actualGenerator = actualValue.makeIterator() - return actualGenerator.next() == startingElement + return PredicateStatus(bool: actualGenerator.next() == startingElement) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual collection's first element /// is equal to the expected object. -public func beginWith(_ startingElement: Any) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "begin with <\(startingElement)>" - guard let collection = try actualExpression.evaluate() else { return false } - guard collection.count > 0 else { return false } +public func beginWith(_ startingElement: Any) -> Predicate { + return Predicate.simple("begin with <\(startingElement)>") { actualExpression in + guard let collection = try actualExpression.evaluate() else { return .fail } + guard collection.count > 0 else { return .doesNotMatch } #if os(Linux) guard let collectionValue = collection.object(at: 0) as? NSObject else { - return false + return .fail } #else let collectionValue = collection.object(at: 0) as AnyObject #endif - return collectionValue.isEqual(startingElement) + return PredicateStatus(bool: collectionValue.isEqual(startingElement)) } } /// A Nimble matcher that succeeds when the actual string contains expected substring /// where the expected substring's location is zero. -public func beginWith(_ startingSubstring: String) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "begin with <\(startingSubstring)>" +public func beginWith(_ startingSubstring: String) -> Predicate { + return Predicate.simple("begin with <\(startingSubstring)>") { actualExpression in if let actual = try actualExpression.evaluate() { - let range = actual.range(of: startingSubstring) - return range != nil && range!.lowerBound == actual.startIndex + return PredicateStatus(bool: actual.hasPrefix(startingSubstring)) } - return false + return .fail } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beginWithMatcher(_ expected: Any) -> NMBObjCMatcher { + @objc public class func beginWithMatcher(_ expected: Any) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = try! actualExpression.evaluate() - if let _ = actual as? String { + let actual = try actualExpression.evaluate() + if (actual as? String) != nil { let expr = actualExpression.cast { $0 as? String } - return try! beginWith(expected as! String).matches(expr, failureMessage: failureMessage) + return try beginWith(expected as! String).matches(expr, failureMessage: failureMessage) } else { let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! beginWith(expected).matches(expr, failureMessage: failureMessage) + return try beginWith(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift index 50536422..2c84c5c7 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift @@ -1,88 +1,89 @@ import Foundation /// A Nimble matcher that succeeds when the actual sequence contains the expected value. -public func contain(_ items: T...) -> NonNilMatcherFunc +public func contain(_ items: T...) -> Predicate where S.Iterator.Element == T { return contain(items) } -public func contain(_ items: [T]) -> NonNilMatcherFunc +public func contain(_ items: [T]) -> Predicate where S.Iterator.Element == T { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" + return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in if let actual = try actualExpression.evaluate() { - return items.all { + let matches = items.all { return actual.contains($0) } + return PredicateStatus(bool: matches) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: String...) -> NonNilMatcherFunc { +public func contain(_ substrings: String...) -> Predicate { return contain(substrings) } -public func contain(_ substrings: [String]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" +public func contain(_ substrings: [String]) -> Predicate { + return Predicate.simple("contain <\(arrayAsString(substrings))>") { actualExpression in if let actual = try actualExpression.evaluate() { - return substrings.all { + let matches = substrings.all { let range = actual.range(of: $0) return range != nil && !range!.isEmpty } + return PredicateStatus(bool: matches) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: NSString...) -> NonNilMatcherFunc { +public func contain(_ substrings: NSString...) -> Predicate { return contain(substrings) } -public func contain(_ substrings: [NSString]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" +public func contain(_ substrings: [NSString]) -> Predicate { + return Predicate.simple("contain <\(arrayAsString(substrings))>") { actualExpression in if let actual = try actualExpression.evaluate() { - return substrings.all { actual.range(of: $0.description).length != 0 } + let matches = substrings.all { actual.range(of: $0.description).length != 0 } + return PredicateStatus(bool: matches) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual collection contains the expected object. -public func contain(_ items: Any?...) -> NonNilMatcherFunc { +public func contain(_ items: Any?...) -> Predicate { return contain(items) } -public func contain(_ items: [Any?]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" - guard let actual = try actualExpression.evaluate() else { return false } - return items.all { item in - return item != nil && actual.contains(item!) +public func contain(_ items: [Any?]) -> Predicate { + return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in + guard let actual = try actualExpression.evaluate() else { return .fail } + let matches = items.all { item in + return item.map { actual.contains($0) } ?? false } + return PredicateStatus(bool: matches) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func containMatcher(_ expected: [NSObject]) -> NMBObjCMatcher { + @objc public class func containMatcher(_ expected: [NSObject]) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() + let actualValue = try actualExpression.evaluate() if let value = actualValue as? NMBContainer { let expr = Expression(expression: ({ value as NMBContainer }), location: location) // A straightforward cast on the array causes this to crash, so we have to cast the individual items let expectedOptionals: [Any?] = expected.map({ $0 as Any? }) - return try! contain(expectedOptionals).matches(expr, failureMessage: failureMessage) + return try contain(expectedOptionals).matches(expr, failureMessage: failureMessage) } else if let value = actualValue as? NSString { let expr = Expression(expression: ({ value as String }), location: location) - return try! contain(expected as! [String]).matches(expr, failureMessage: failureMessage) + return try contain(expected as! [String]).matches(expr, failureMessage: failureMessage) } else if actualValue != nil { + // swiftlint:disable:next line_length failureMessage.postfixMessage = "contain <\(arrayAsString(expected))> (only works for NSArrays, NSSets, NSHashTables, and NSStrings)" } else { failureMessage.postfixMessage = "contain <\(arrayAsString(expected))>" diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift index ae8cca22..8a23a6cf 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift @@ -1,36 +1,36 @@ import Foundation -public func containElementSatisfying(_ predicate: @escaping ((T) -> Bool), _ predicateDescription: String = "") -> NonNilMatcherFunc where S.Iterator.Element == T { - - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.actualValue = nil +public func containElementSatisfying(_ predicate: @escaping ((T) -> Bool), _ predicateDescription: String = "") -> Predicate where S.Iterator.Element == T { + return Predicate.define { actualExpression in + let message: ExpectationMessage if predicateDescription == "" { - failureMessage.postfixMessage = "find object in collection that satisfies predicate" + message = .expectedTo("find object in collection that satisfies predicate") } else { - failureMessage.postfixMessage = "find object in collection \(predicateDescription)" + message = .expectedTo("find object in collection \(predicateDescription)") } if let sequence = try actualExpression.evaluate() { for object in sequence { if predicate(object) { - return true + return PredicateResult(bool: true, message: message) } } - return false + return PredicateResult(bool: false, message: message) } - return false + return PredicateResult(status: .fail, message: message) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBObjCMatcher { + @objc public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let value = try! actualExpression.evaluate() + let value = try actualExpression.evaluate() guard let enumeration = value as? NSFastEnumeration else { + // swiftlint:disable:next line_length failureMessage.postfixMessage = "containElementSatisfying must be provided an NSFastEnumeration object" failureMessage.actualValue = nil failureMessage.expected = "" @@ -38,7 +38,7 @@ public func containElementSatisfying(_ predicate: @escaping ((T) return false } - let iterator = NSFastEnumerationIterator(enumeration) + var iterator = NSFastEnumerationIterator(enumeration) while let item = iterator.next() { guard let object = item as? NSObject else { continue @@ -50,8 +50,7 @@ public func containElementSatisfying(_ predicate: @escaping ((T) } failureMessage.actualValue = nil - failureMessage.postfixMessage = "" - failureMessage.to = "to find object in collection that satisfies predicate" + failureMessage.postfixMessage = "find object in collection that satisfies predicate" return false } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift index 00c7e202..80a06ca1 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift @@ -2,11 +2,9 @@ import Foundation /// A Nimble matcher that succeeds when the actual sequence's last element /// is equal to the expected value. -public func endWith(_ endingElement: T) -> NonNilMatcherFunc +public func endWith(_ endingElement: T) -> Predicate where S.Iterator.Element == T { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingElement)>" - + return Predicate.simple("end with <\(endingElement)>") { actualExpression in if let actualValue = try actualExpression.evaluate() { var actualGenerator = actualValue.makeIterator() var lastItem: T? @@ -16,55 +14,53 @@ public func endWith(_ endingElement: T) -> NonNilMatc item = actualGenerator.next() } while(item != nil) - return lastItem == endingElement + return PredicateStatus(bool: lastItem == endingElement) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual collection's last element /// is equal to the expected object. -public func endWith(_ endingElement: Any) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingElement)>" - guard let collection = try actualExpression.evaluate() else { return false } - guard collection.count > 0 else { return false } +public func endWith(_ endingElement: Any) -> Predicate { + return Predicate.simple("end with <\(endingElement)>") { actualExpression in + guard let collection = try actualExpression.evaluate() else { return .fail } + guard collection.count > 0 else { return PredicateStatus(bool: false) } #if os(Linux) guard let collectionValue = collection.object(at: collection.count - 1) as? NSObject else { - return false + return .fail } #else let collectionValue = collection.object(at: collection.count - 1) as AnyObject #endif - return collectionValue.isEqual(endingElement) + return PredicateStatus(bool: collectionValue.isEqual(endingElement)) } } /// A Nimble matcher that succeeds when the actual string contains the expected substring /// where the expected substring's location is the actual string's length minus the /// expected substring's length. -public func endWith(_ endingSubstring: String) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingSubstring)>" +public func endWith(_ endingSubstring: String) -> Predicate { + return Predicate.simple("end with <\(endingSubstring)>") { actualExpression in if let collection = try actualExpression.evaluate() { - return collection.hasSuffix(endingSubstring) + return PredicateStatus(bool: collection.hasSuffix(endingSubstring)) } - return false + return .fail } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func endWithMatcher(_ expected: Any) -> NMBObjCMatcher { + @objc public class func endWithMatcher(_ expected: Any) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = try! actualExpression.evaluate() - if let _ = actual as? String { + let actual = try actualExpression.evaluate() + if (actual as? String) != nil { let expr = actualExpression.cast { $0 as? String } - return try! endWith(expected as! String).matches(expr, failureMessage: failureMessage) + return try endWith(expected as! String).matches(expr, failureMessage: failureMessage) } else { let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! endWith(expected).matches(expr, failureMessage: failureMessage) + return try endWith(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift index 1dccfd02..b8ac2c9d 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift @@ -4,18 +4,18 @@ import Foundation /// Values can support equal by supporting the Equatable protocol. /// /// @see beCloseTo if you want to match imprecise types (eg - floats, doubles). -public func equal(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" +public func equal(_ expectedValue: T?) -> Predicate { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in let actualValue = try actualExpression.evaluate() - let matches = actualValue == expectedValue && expectedValue != nil - if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - return false + switch (expectedValue, actualValue) { + case (nil, _?): + return PredicateResult(status: .fail, message: msg.appendedBeNilHint()) + case (nil, nil), (_, nil): + return PredicateResult(status: .fail, message: msg) + case (let expected?, let actual?): + let matches = expected == actual + return PredicateResult(bool: matches, message: msg) } - return matches } } @@ -23,74 +23,84 @@ public func equal(_ expectedValue: T?) -> NonNilMatcherFunc { /// Values can support equal by supporting the Equatable protocol. /// /// @see beCloseTo if you want to match imprecise types (eg - floats, doubles). -public func equal(_ expectedValue: [T: C]?) -> NonNilMatcherFunc<[T: C]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" +public func equal(_ expectedValue: [T: C]?) -> Predicate<[T: C]> { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in let actualValue = try actualExpression.evaluate() - if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - return false + switch (expectedValue, actualValue) { + case (nil, _?): + return PredicateResult(status: .fail, message: msg.appendedBeNilHint()) + case (nil, nil), (_, nil): + return PredicateResult(status: .fail, message: msg) + case (let expected?, let actual?): + let matches = expected == actual + return PredicateResult(bool: matches, message: msg) } - return expectedValue! == actualValue! } } /// A Nimble matcher that succeeds when the actual collection is equal to the expected collection. /// Items must implement the Equatable protocol. -public func equal(_ expectedValue: [T]?) -> NonNilMatcherFunc<[T]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" +public func equal(_ expectedValue: [T]?) -> Predicate<[T]> { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in let actualValue = try actualExpression.evaluate() - if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - return false + switch (expectedValue, actualValue) { + case (nil, _?): + return PredicateResult(status: .fail, message: msg.appendedBeNilHint()) + case (nil, nil), (_, nil): + return PredicateResult(status: .fail, message: msg) + case (let expected?, let actual?): + let matches = expected == actual + return PredicateResult(bool: matches, message: msg) } - return expectedValue! == actualValue! } } /// A Nimble matcher allowing comparison of collection with optional type -public func equal(_ expectedValue: [T?]) -> NonNilMatcherFunc<[T?]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" - if let actualValue = try actualExpression.evaluate() { - if expectedValue.count != actualValue.count { - return false - } +public func equal(_ expectedValue: [T?]) -> Predicate<[T?]> { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in + guard let actualValue = try actualExpression.evaluate() else { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) + } - for (index, item) in actualValue.enumerated() { - let otherItem = expectedValue[index] - if item == nil && otherItem == nil { - continue - } else if item == nil && otherItem != nil { - return false - } else if item != nil && otherItem == nil { - return false - } else if item! != otherItem! { - return false - } - } + let doesNotMatch = PredicateResult( + status: .doesNotMatch, + message: msg + ) - return true - } else { - failureMessage.postfixActual = " (use beNil() to match nils)" + if expectedValue.count != actualValue.count { + return doesNotMatch } - return false + for (index, item) in actualValue.enumerated() { + let otherItem = expectedValue[index] + if item == nil && otherItem == nil { + continue + } else if item == nil && otherItem != nil { + return doesNotMatch + } else if item != nil && otherItem == nil { + return doesNotMatch + } else if item! != otherItem! { + return doesNotMatch + } + } + + return PredicateResult( + status: .matches, + message: msg + ) } } /// A Nimble matcher that succeeds when the actual set is equal to the expected set. -public func equal(_ expectedValue: Set?) -> NonNilMatcherFunc> { +public func equal(_ expectedValue: Set?) -> Predicate> { return equal(expectedValue, stringify: { stringify($0) }) } /// A Nimble matcher that succeeds when the actual set is equal to the expected set. -public func equal(_ expectedValue: Set?) -> NonNilMatcherFunc> { +public func equal(_ expectedValue: Set?) -> Predicate> { return equal(expectedValue, stringify: { if let set = $0 { return stringify(Array(set).sorted { $0 < $1 }) @@ -100,33 +110,50 @@ public func equal(_ expectedValue: Set?) -> NonNilMatcherFunc< }) } -private func equal(_ expectedValue: Set?, stringify: @escaping (Set?) -> String) -> NonNilMatcherFunc> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" +private func equal(_ expectedValue: Set?, stringify: @escaping (Set?) -> String) -> Predicate> { + return Predicate { actualExpression in + var errorMessage: ExpectationMessage = + .expectedActualValueTo("equal <\(stringify(expectedValue))>") - if let expectedValue = expectedValue { - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "<\(stringify(actualValue))>" + guard let expectedValue = expectedValue else { + return PredicateResult( + status: .fail, + message: errorMessage.appendedBeNilHint() + ) + } - if expectedValue == actualValue { - return true - } + guard let actualValue = try actualExpression.evaluate() else { + return PredicateResult( + status: .fail, + message: errorMessage.appendedBeNilHint() + ) + } - let missing = expectedValue.subtracting(actualValue) - if missing.count > 0 { - failureMessage.postfixActual += ", missing <\(stringify(missing))>" - } + errorMessage = .expectedCustomValueTo( + "equal <\(stringify(expectedValue))>", + "<\(stringify(actualValue))>" + ) - let extra = actualValue.subtracting(expectedValue) - if extra.count > 0 { - failureMessage.postfixActual += ", extra <\(stringify(extra))>" - } - } - } else { - failureMessage.postfixActual = " (use beNil() to match nils)" + if expectedValue == actualValue { + return PredicateResult( + status: .matches, + message: errorMessage + ) + } + + let missing = expectedValue.subtracting(actualValue) + if missing.count > 0 { + errorMessage = errorMessage.appended(message: ", missing <\(stringify(missing))>") } - return false + let extra = actualValue.subtracting(expectedValue) + if extra.count > 0 { + errorMessage = errorMessage.appended(message: ", extra <\(stringify(extra))>") + } + return PredicateResult( + status: .doesNotMatch, + message: errorMessage + ) } } @@ -162,19 +189,19 @@ public func !=(lhs: Expectation>, rhs: Set?) { lhs.toNot(equal(rhs)) } -public func ==(lhs: Expectation<[T: C]>, rhs: [T: C]?) { +public func ==(lhs: Expectation<[T: C]>, rhs: [T: C]?) { lhs.to(equal(rhs)) } -public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { +public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { lhs.toNot(equal(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! equal(expected).matches(actualExpression, failureMessage: failureMessage) + @objc public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { + return NMBPredicate { actualExpression in + return try equal(expected).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift index 5b24af29..3529da84 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift @@ -7,45 +7,53 @@ import Foundation /// A Nimble matcher that succeeds when the actual Collection's count equals /// the expected value -public func haveCount(_ expectedValue: T.IndexDistance) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func haveCount(_ expectedValue: T.IndexDistance) -> Predicate { + return Predicate.define { actualExpression in if let actualValue = try actualExpression.evaluate() { - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" + let message = ExpectationMessage + .expectedCustomValueTo( + "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))", + "\(actualValue.count)" + ) + .appended(details: "Actual Value: \(stringify(actualValue))") + let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result + return PredicateResult(bool: result, message: message) } else { - return false + return PredicateResult(status: .fail, message: .fail("")) } } } /// A Nimble matcher that succeeds when the actual collection's count equals /// the expected value -public func haveCount(_ expectedValue: Int) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in +public func haveCount(_ expectedValue: Int) -> Predicate { + return Predicate { actualExpression in if let actualValue = try actualExpression.evaluate() { - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" + let message = ExpectationMessage + .expectedCustomValueTo( + "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))", + "\(actualValue.count)" + ) + .appended(details: "Actual Value: \(stringify(actualValue))") + let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result + return PredicateResult(bool: result, message: message) } else { - return false + return PredicateResult(status: .fail, message: .fail("")) } } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func haveCountMatcher(_ expected: NSNumber) -> NMBObjCMatcher { + @objc public class func haveCountMatcher(_ expected: NSNumber) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() + let actualValue = try actualExpression.evaluate() if let value = actualValue as? NMBCollection { let expr = Expression(expression: ({ value as NMBCollection}), location: location) - return try! haveCount(expected.intValue).matches(expr, failureMessage: failureMessage) + return try haveCount(expected.intValue).matches(expr, failureMessage: failureMessage) } else if let actualValue = actualValue { failureMessage.postfixMessage = "get type of NSArray, NSSet, NSDictionary, or NSHashTable" failureMessage.actualValue = "\(String(describing: type(of: actualValue)))" diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/Match.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Match.swift index 7e803318..f738daff 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/Match.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Match.swift @@ -2,27 +2,26 @@ import Foundation /// A Nimble matcher that succeeds when the actual string satisfies the regular expression /// described by the expected string. -public func match(_ expectedValue: String?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "match <\(stringify(expectedValue))>" - +public func match(_ expectedValue: String?) -> Predicate { + return Predicate.simple("match <\(stringify(expectedValue))>") { actualExpression in if let actual = try actualExpression.evaluate() { if let regexp = expectedValue { - return actual.range(of: regexp, options: .regularExpression) != nil + let bool = actual.range(of: regexp, options: .regularExpression) != nil + return PredicateStatus(bool: bool) } } - return false + return .fail } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func matchMatcher(_ expected: NSString) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + @objc public class func matchMatcher(_ expected: NSString) -> NMBMatcher { + return NMBPredicate { actualExpression in let actual = actualExpression.cast { $0 as? String } - return try! match(expected.description).matches(actual, failureMessage: failureMessage) + return try match(expected.description).satisfies(actual).toObjectiveC() } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift index 2092cb60..4ad71d4f 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift @@ -1,26 +1,76 @@ import Foundation +/// A Nimble matcher that succeeds when the actual expression evaluates to an +/// error from the specified case. +/// +/// Errors are tried to be compared by their implementation of Equatable, +/// otherwise they fallback to comparison by _domain and _code. +public func matchError(_ error: T) -> Predicate { + return Predicate.define { actualExpression in + let actualError = try actualExpression.evaluate() + + let failureMessage = FailureMessage() + setFailureMessageForError( + failureMessage, + postfixMessageVerb: "match", + actualError: actualError, + error: error + ) + + var matches = false + if let actualError = actualError, errorMatchesExpectedError(actualError, expectedError: error) { + matches = true + } + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + } +} + /// A Nimble matcher that succeeds when the actual expression evaluates to an /// error from the specified case. /// /// Errors are tried to be compared by their implementation of Equatable, /// otherwise they fallback to comparision by _domain and _code. -public func matchError(_ error: T) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() +public func matchError(_ error: T) -> Predicate { + return Predicate.define { actualExpression in + let actualError = try actualExpression.evaluate() + + let failureMessage = FailureMessage() + setFailureMessageForError( + failureMessage, + postfixMessageVerb: "match", + actualError: actualError, + error: error + ) - setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, error: error) - return errorMatchesNonNilFieldsOrClosure(actualError, error: error) + var matches = false + if let actualError = actualError as? T, error == actualError { + matches = true + } + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) } } /// A Nimble matcher that succeeds when the actual expression evaluates to an /// error of the specified type -public func matchError(_ errorType: T.Type) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() +public func matchError(_ errorType: T.Type) -> Predicate { + return Predicate.define { actualExpression in + let actualError = try actualExpression.evaluate() + + let failureMessage = FailureMessage() + setFailureMessageForError( + failureMessage, + postfixMessageVerb: "match", + actualError: actualError, + errorType: errorType + ) + + var matches = false + if actualError as? T != nil { + matches = true + } - setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, errorType: errorType) - return errorMatchesNonNilFieldsOrClosure(actualError, errorType: errorType) + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift index 02d3245c..abcafa99 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift @@ -1,14 +1,15 @@ -/// A convenience API to build matchers that don't need special negation +/// DEPRECATED: A convenience API to build matchers that don't need special negation /// behavior. The toNot() behavior is the negation of to(). /// /// @see NonNilMatcherFunc if you prefer to have this matcher fail when nil -/// values are recieved in an expectation. +/// values are received in an expectation. /// /// You may use this when implementing your own custom matchers. /// /// Use the Matcher protocol instead of this type to accept custom matchers as /// input parameters. /// @see allPass for an example that uses accepts other matchers as input. +@available(*, deprecated, message: "Use to Predicate instead") public struct MatcherFunc: Matcher { public let matcher: (Expression, FailureMessage) throws -> Bool @@ -23,9 +24,16 @@ public struct MatcherFunc: Matcher { public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { return try !matcher(actualExpression, failureMessage) } + + /// Compatibility layer to new Matcher API. Converts an old-style matcher to a new one. + /// Note: You should definitely spend the time to convert to the new api as soon as possible + /// since this struct type is deprecated. + public var predicate: Predicate { + return Predicate.fromDeprecatedMatcher(self) + } } -/// A convenience API to build matchers that don't need special negation +/// DEPRECATED: A convenience API to build matchers that don't need special negation /// behavior. The toNot() behavior is the negation of to(). /// /// Unlike MatcherFunc, this will always fail if an expectation contains nil. @@ -36,6 +44,7 @@ public struct MatcherFunc: Matcher { /// Use the Matcher protocol instead of this type to accept custom matchers as /// input parameters. /// @see allPass for an example that uses accepts other matchers as input. +@available(*, deprecated, message: "Use to Predicate instead") public struct NonNilMatcherFunc: Matcher { public let matcher: (Expression, FailureMessage) throws -> Bool @@ -66,4 +75,11 @@ public struct NonNilMatcherFunc: Matcher { } return false } + + /// Compatibility layer to new Matcher API. Converts an old-style matcher to a new one. + /// Note: You should definitely spend the time to convert to the new api as soon as possible + /// since this struct type is deprecated. + public var predicate: Predicate { + return Predicate.fromDeprecatedMatcher(self) + } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift index 3f27ec1e..6f8f103d 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift @@ -1,85 +1,86 @@ import Foundation // `CGFloat` is in Foundation (swift-corelibs-foundation) on Linux. -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) import CoreGraphics #endif /// Implement this protocol to implement a custom matcher for Swift +@available(*, deprecated, message: "Use Predicate instead") public protocol Matcher { associatedtype ValueType func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool } -#if _runtime(_ObjC) +extension Matcher { + var predicate: Predicate { + return Predicate.fromDeprecatedMatcher(self) + } + + var toClosure: (Expression, FailureMessage, Bool) throws -> Bool { + return ({ expr, msg, expectedResult in + if expectedResult { + return try self.matches(expr, failureMessage: msg) + } else { + return try self.doesNotMatch(expr, failureMessage: msg) + } + }) + } +} + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) /// Objective-C interface to the Swift variant of Matcher. @objc public protocol NMBMatcher { - func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool - func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool + func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool + func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool } #endif -#if _runtime(_ObjC) /// Protocol for types that support contain() matcher. -@objc public protocol NMBContainer { - @objc(containsObject:) +public protocol NMBContainer { func contains(_ anObject: Any) -> Bool } +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) // FIXME: NSHashTable can not conform to NMBContainer since swift-DEVELOPMENT-SNAPSHOT-2016-04-25-a //extension NSHashTable : NMBContainer {} // Corelibs Foundation does not include this class yet -#else -public protocol NMBContainer { - func contains(_ anObject: Any) -> Bool -} #endif -extension NSArray : NMBContainer {} -extension NSSet : NMBContainer {} +extension NSArray: NMBContainer {} +extension NSSet: NMBContainer {} -#if _runtime(_ObjC) /// Protocol for types that support only beEmpty(), haveCount() matchers -@objc public protocol NMBCollection { - var count: Int { get } -} - -extension NSHashTable : NMBCollection {} // Corelibs Foundation does not include these classes yet -extension NSMapTable : NMBCollection {} -#else public protocol NMBCollection { var count: Int { get } } + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) +extension NSHashTable: NMBCollection {} // Corelibs Foundation does not include these classes yet +extension NSMapTable: NMBCollection {} #endif -extension NSSet : NMBCollection {} -extension NSIndexSet : NMBCollection {} -extension NSDictionary : NMBCollection {} +extension NSSet: NMBCollection {} +extension NSIndexSet: NMBCollection {} +extension NSDictionary: NMBCollection {} -#if _runtime(_ObjC) /// Protocol for types that support beginWith(), endWith(), beEmpty() matchers -@objc public protocol NMBOrderedCollection: NMBCollection { - @objc(objectAtIndex:) - func object(at index: Int) -> Any -} -#else public protocol NMBOrderedCollection: NMBCollection { func object(at index: Int) -> Any } -#endif -extension NSArray : NMBOrderedCollection {} +extension NSArray: NMBOrderedCollection {} public protocol NMBDoubleConvertible { var doubleValue: CDouble { get } } -extension Double : NMBDoubleConvertible { +extension Double: NMBDoubleConvertible { public var doubleValue: CDouble { return self } } -extension Float : NMBDoubleConvertible { +extension Float: NMBDoubleConvertible { public var doubleValue: CDouble { return CDouble(self) } @@ -91,7 +92,7 @@ extension CGFloat: NMBDoubleConvertible { } } -extension NSNumber : NMBDoubleConvertible { +extension NSNumber: NMBDoubleConvertible { } private let dateFormatter: DateFormatter = { @@ -130,7 +131,7 @@ extension NSDate: TestOutputStringConvertible { /// beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers. /// /// Types that conform to Swift's Comparable protocol will work implicitly too -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @objc public protocol NMBComparable { func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult } @@ -141,12 +142,12 @@ public protocol NMBComparable { } #endif -extension NSNumber : NMBComparable { +extension NSNumber: NMBComparable { public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { return compare(otherObject as! NSNumber) } } -extension NSString : NMBComparable { +extension NSString: NMBComparable { public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { return compare(otherObject as! String) } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift index ac8ee5aa..16af0115 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift @@ -1,9 +1,36 @@ import Foundation +// A workaround to SR-6419. +extension NotificationCenter { +#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) + #if swift(>=4.0) + #if swift(>=4.0.2) + #else + func addObserver(forName name: Notification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { + return addObserver(forName: name, object: obj, queue: queue, usingBlock: block) + } + #endif + #elseif swift(>=3.2) + #if swift(>=3.2.2) + #else + // swiftlint:disable:next line_length + func addObserver(forName name: Notification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { + return addObserver(forName: name, object: obj, queue: queue, usingBlock: block) + } + #endif + #else + // swiftlint:disable:next line_length + func addObserver(forName name: Notification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { + return addObserver(forName: name, object: obj, queue: queue, usingBlock: block) + } + #endif +#endif +} + internal class NotificationCollector { private(set) var observedNotifications: [Notification] private let notificationCenter: NotificationCenter - #if _runtime(_ObjC) + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) private var token: AnyObject? #else private var token: NSObjectProtocol? @@ -15,14 +42,15 @@ internal class NotificationCollector { } func startObserving() { - self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil) { [weak self] n in + // swiftlint:disable:next line_length + self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil, using: { [weak self] n in // linux-swift gets confused by .append(n) self?.observedNotifications.append(n) - } + }) } deinit { - #if _runtime(_ObjC) + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) if let token = self.token { self.notificationCenter.removeObserver(token) } @@ -36,19 +64,18 @@ internal class NotificationCollector { private let mainThread = pthread_self() -let notificationCenterDefault = NotificationCenter.default - public func postNotifications( _ notificationsMatcher: T, - fromNotificationCenter center: NotificationCenter = notificationCenterDefault) - -> MatcherFunc + fromNotificationCenter center: NotificationCenter = .default) + -> Predicate where T: Matcher, T.ValueType == [Notification] { - let _ = mainThread // Force lazy-loading of this value + _ = mainThread // Force lazy-loading of this value let collector = NotificationCollector(notificationCenter: center) collector.startObserving() var once: Bool = false - return MatcherFunc { actualExpression, failureMessage in + + return Predicate { actualExpression in let collectorNotificationsExpression = Expression(memoizedExpression: { _ in return collector.observedNotifications }, location: actualExpression.location, withoutCaching: true) @@ -59,12 +86,13 @@ public func postNotifications( _ = try actualExpression.evaluate() } + let failureMessage = FailureMessage() let match = try notificationsMatcher.matches(collectorNotificationsExpression, failureMessage: failureMessage) if collector.observedNotifications.isEmpty { failureMessage.actualValue = "no notifications" } else { failureMessage.actualValue = "<\(stringify(collector.observedNotifications))>" } - return match + return PredicateResult(bool: match, message: failureMessage.toExpectationMessage()) } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift new file mode 100644 index 00000000..4810b9b1 --- /dev/null +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift @@ -0,0 +1,352 @@ +// New Matcher API +// +import Foundation + +/// A Predicate is part of the new matcher API that provides assertions to expectations. +/// +/// Given a code snippet: +/// +/// expect(1).to(equal(2)) +/// ^^^^^^^^ +/// Called a "matcher" +/// +/// A matcher consists of two parts a constructor function and the Predicate. The term Predicate +/// is used as a separate name from Matcher to help transition custom matchers to the new Nimble +/// matcher API. +/// +/// The Predicate provide the heavy lifting on how to assert against a given value. Internally, +/// predicates are simple wrappers around closures to provide static type information and +/// allow composition and wrapping of existing behaviors. +public struct Predicate { + fileprivate var matcher: (Expression) throws -> PredicateResult + + /// Constructs a predicate that knows how take a given value + public init(_ matcher: @escaping (Expression) throws -> PredicateResult) { + self.matcher = matcher + } + + /// Uses a predicate on a given value to see if it passes the predicate. + /// + /// @param expression The value to run the predicate's logic against + /// @returns A predicate result indicate passing or failing and an associated error message. + public func satisfies(_ expression: Expression) throws -> PredicateResult { + return try matcher(expression) + } +} + +/// Provides convenience helpers to defining predicates +extension Predicate { + /// Like Predicate() constructor, but automatically guard against nil (actual) values + public static func define(matcher: @escaping (Expression) throws -> PredicateResult) -> Predicate { + return Predicate { actual in + return try matcher(actual) + }.requireNonNil + } + + /// Defines a predicate with a default message that can be returned in the closure + /// Also ensures the predicate's actual value cannot pass with `nil` given. + public static func define(_ msg: String, matcher: @escaping (Expression, ExpectationMessage) throws -> PredicateResult) -> Predicate { + return Predicate { actual in + return try matcher(actual, .expectedActualValueTo(msg)) + }.requireNonNil + } + + /// Defines a predicate with a default message that can be returned in the closure + /// Unlike `define`, this allows nil values to succeed if the given closure chooses to. + public static func defineNilable(_ msg: String, matcher: @escaping (Expression, ExpectationMessage) throws -> PredicateResult) -> Predicate { + return Predicate { actual in + return try matcher(actual, .expectedActualValueTo(msg)) + } + } +} + +extension Predicate { + /// Provides a simple predicate definition that provides no control over the predefined + /// error message. + /// + /// Also ensures the predicate's actual value cannot pass with `nil` given. + public static func simple(_ msg: String, matcher: @escaping (Expression) throws -> PredicateStatus) -> Predicate { + return Predicate { actual in + return PredicateResult(status: try matcher(actual), message: .expectedActualValueTo(msg)) + }.requireNonNil + } + + /// Provides a simple predicate definition that provides no control over the predefined + /// error message. + /// + /// Unlike `simple`, this allows nil values to succeed if the given closure chooses to. + public static func simpleNilable(_ msg: String, matcher: @escaping (Expression) throws -> PredicateStatus) -> Predicate { + return Predicate { actual in + return PredicateResult(status: try matcher(actual), message: .expectedActualValueTo(msg)) + } + } +} + +// The Expectation style intended for comparison to a PredicateStatus. +public enum ExpectationStyle { + case toMatch, toNotMatch +} + +/// The value that a Predicates return to describe if the given (actual) value matches the +/// predicate. +public struct PredicateResult { + /// Status indicates if the predicate matches, does not match, or fails. + public var status: PredicateStatus + /// The error message that can be displayed if it does not match + public var message: ExpectationMessage + + /// Constructs a new PredicateResult with a given status and error message + public init(status: PredicateStatus, message: ExpectationMessage) { + self.status = status + self.message = message + } + + /// Shorthand to PredicateResult(status: PredicateStatus(bool: bool), message: message) + public init(bool: Bool, message: ExpectationMessage) { + self.status = PredicateStatus(bool: bool) + self.message = message + } + + /// Converts the result to a boolean based on what the expectation intended + public func toBoolean(expectation style: ExpectationStyle) -> Bool { + return status.toBoolean(expectation: style) + } +} + +/// PredicateStatus is a trinary that indicates if a Predicate matches a given value or not +public enum PredicateStatus { + /// Matches indicates if the predicate / matcher passes with the given value + /// + /// For example, `equals(1)` returns `.matches` for `expect(1).to(equal(1))`. + case matches + /// DoesNotMatch indicates if the predicate / matcher fails with the given value, but *would* + /// succeed if the expectation was inverted. + /// + /// For example, `equals(2)` returns `.doesNotMatch` for `expect(1).toNot(equal(2))`. + case doesNotMatch + /// Fail indicates the predicate will never satisfy with the given value in any case. + /// A perfect example is that most matchers fail whenever given `nil`. + /// + /// Using `equal(1)` fails both `expect(nil).to(equal(1))` and `expect(nil).toNot(equal(1))`. + /// Note: Predicate's `requireNonNil` property will also provide this feature mostly for free. + /// Your predicate will still need to guard against nils, but error messaging will be + /// handled for you. + case fail + + /// Converts a boolean to either .matches (if true) or .doesNotMatch (if false). + public init(bool matches: Bool) { + if matches { + self = .matches + } else { + self = .doesNotMatch + } + } + + private func shouldMatch() -> Bool { + switch self { + case .matches: return true + case .doesNotMatch, .fail: return false + } + } + + private func shouldNotMatch() -> Bool { + switch self { + case .doesNotMatch: return true + case .matches, .fail: return false + } + } + + /// Converts the PredicateStatus result to a boolean based on what the expectation intended + internal func toBoolean(expectation style: ExpectationStyle) -> Bool { + if style == .toMatch { + return shouldMatch() + } else { + return shouldNotMatch() + } + } +} + +// Backwards compatibility until Old Matcher API removal +extension Predicate: Matcher { + /// Compatibility layer for old Matcher API, deprecated + public static func fromDeprecatedFullClosure(_ matcher: @escaping (Expression, FailureMessage, Bool) throws -> Bool) -> Predicate { + return Predicate { actual in + let failureMessage = FailureMessage() + let result = try matcher(actual, failureMessage, true) + return PredicateResult( + status: PredicateStatus(bool: result), + message: failureMessage.toExpectationMessage() + ) + } + } + + /// Compatibility layer for old Matcher API, deprecated. + /// Emulates the MatcherFunc API + public static func fromDeprecatedClosure(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) -> Predicate { + return Predicate { actual in + let failureMessage = FailureMessage() + let result = try matcher(actual, failureMessage) + return PredicateResult( + status: PredicateStatus(bool: result), + message: failureMessage.toExpectationMessage() + ) + } + + } + + /// Compatibility layer for old Matcher API, deprecated. + /// Same as calling .predicate on a MatcherFunc or NonNilMatcherFunc type. + public static func fromDeprecatedMatcher(_ matcher: M) -> Predicate where M: Matcher, M.ValueType == T { + return self.fromDeprecatedFullClosure(matcher.toClosure) + } + + /// Deprecated Matcher API, use satisfies(_:_) instead + public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { + let result = try satisfies(actualExpression) + result.message.update(failureMessage: failureMessage) + return result.toBoolean(expectation: .toMatch) + } + + /// Deprecated Matcher API, use satisfies(_:_) instead + public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { + let result = try satisfies(actualExpression) + result.message.update(failureMessage: failureMessage) + return result.toBoolean(expectation: .toNotMatch) + } +} + +extension Predicate { + // Someday, make this public? Needs documentation + internal func after(f: @escaping (Expression, PredicateResult) throws -> PredicateResult) -> Predicate { + return Predicate { actual -> PredicateResult in + let result = try self.satisfies(actual) + return try f(actual, result) + } + } + + /// Returns a new Predicate based on the current one that always fails if nil is given as + /// the actual value. + /// + /// This replaces `NonNilMatcherFunc`. + public var requireNonNil: Predicate { + return after { actual, result in + if try actual.evaluate() == nil { + return PredicateResult( + status: .fail, + message: result.message.appendedBeNilHint() + ) + } + return result + } + } +} + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) +public typealias PredicateBlock = (_ actualExpression: Expression) throws -> NMBPredicateResult + +public class NMBPredicate: NSObject { + private let predicate: PredicateBlock + + public init(predicate: @escaping PredicateBlock) { + self.predicate = predicate + } + + func satisfies(_ expression: @escaping () throws -> NSObject?, location: SourceLocation) -> NMBPredicateResult { + let expr = Expression(expression: expression, location: location) + do { + return try self.predicate(expr) + } catch let error { + return PredicateResult(status: .fail, message: .fail("unexpected error thrown: <\(error)>")).toObjectiveC() + } + } +} + +extension NMBPredicate: NMBMatcher { + public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + let result = satisfies(actualBlock, location: location).toSwift() + result.message.update(failureMessage: failureMessage) + return result.status.toBoolean(expectation: .toMatch) + } + + public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + let result = satisfies(actualBlock, location: location).toSwift() + result.message.update(failureMessage: failureMessage) + return result.status.toBoolean(expectation: .toNotMatch) + } +} + +final public class NMBPredicateResult: NSObject { + public var status: NMBPredicateStatus + public var message: NMBExpectationMessage + + public init(status: NMBPredicateStatus, message: NMBExpectationMessage) { + self.status = status + self.message = message + } + + public init(bool success: Bool, message: NMBExpectationMessage) { + self.status = NMBPredicateStatus.from(bool: success) + self.message = message + } + + public func toSwift() -> PredicateResult { + return PredicateResult(status: status.toSwift(), + message: message.toSwift()) + } +} + +extension PredicateResult { + public func toObjectiveC() -> NMBPredicateResult { + return NMBPredicateResult(status: status.toObjectiveC(), message: message.toObjectiveC()) + } +} + +final public class NMBPredicateStatus: NSObject { + private let status: Int + private init(status: Int) { + self.status = status + } + + public static let matches: NMBPredicateStatus = NMBPredicateStatus(status: 0) + public static let doesNotMatch: NMBPredicateStatus = NMBPredicateStatus(status: 1) + public static let fail: NMBPredicateStatus = NMBPredicateStatus(status: 2) + + public override var hash: Int { return self.status.hashValue } + + public override func isEqual(_ object: Any?) -> Bool { + guard let otherPredicate = object as? NMBPredicateStatus else { + return false + } + return self.status == otherPredicate.status + } + + public static func from(status: PredicateStatus) -> NMBPredicateStatus { + switch status { + case .matches: return self.matches + case .doesNotMatch: return self.doesNotMatch + case .fail: return self.fail + } + } + + public static func from(bool success: Bool) -> NMBPredicateStatus { + return self.from(status: PredicateStatus(bool: success)) + } + + public func toSwift() -> PredicateStatus { + switch status { + case NMBPredicateStatus.matches.status: return .matches + case NMBPredicateStatus.doesNotMatch.status: return .doesNotMatch + case NMBPredicateStatus.fail.status: return .fail + default: + internalError("Unhandle status for NMBPredicateStatus") + } + } +} + +extension PredicateStatus { + public func toObjectiveC() -> NMBPredicateStatus { + return NMBPredicateStatus.from(status: self) + } +} + +#endif diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift index 2867a1b1..459d2cd4 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift @@ -1,7 +1,7 @@ import Foundation // This matcher requires the Objective-C, and being built by Xcode rather than the Swift Package Manager -#if _runtime(_ObjC) && !SWIFT_PACKAGE +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE /// A Nimble matcher that succeeds when the actual expression raises an /// exception with the specified name, reason, and/or userInfo. @@ -16,9 +16,8 @@ public func raiseException( named: String? = nil, reason: String? = nil, userInfo: NSDictionary? = nil, - closure: ((NSException) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - + closure: ((NSException) -> Void)? = nil) -> Predicate { + return Predicate { actualExpression in var exception: NSException? let capture = NMBExceptionCapture(handler: ({ e in exception = e @@ -26,14 +25,30 @@ public func raiseException( capture.tryBlock { _ = try! actualExpression.evaluate() - return } - setFailureMessageForException(failureMessage, exception: exception, named: named, reason: reason, userInfo: userInfo, closure: closure) - return exceptionMatchesNonNilFieldsOrClosure(exception, named: named, reason: reason, userInfo: userInfo, closure: closure) + let failureMessage = FailureMessage() + setFailureMessageForException( + failureMessage, + exception: exception, + named: named, + reason: reason, + userInfo: userInfo, + closure: closure + ) + + let matches = exceptionMatchesNonNilFieldsOrClosure( + exception, + named: named, + reason: reason, + userInfo: userInfo, + closure: closure + ) + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) } } +// swiftlint:disable:next function_parameter_count internal func setFailureMessageForException( _ failureMessage: FailureMessage, exception: NSException?, @@ -52,7 +67,7 @@ internal func setFailureMessageForException( if let userInfo = userInfo { failureMessage.postfixMessage += " with userInfo <\(userInfo)>" } - if let _ = closure { + if closure != nil { failureMessage.postfixMessage += " that satisfies block" } if named == nil && reason == nil && userInfo == nil && closure == nil { @@ -60,6 +75,7 @@ internal func setFailureMessageForException( } if let exception = exception { + // swiftlint:disable:next line_length failureMessage.actualValue = "\(String(describing: type(of: exception))) { name=\(exception.name), reason='\(stringify(exception.reason))', userInfo=\(stringify(exception.userInfo)) }" } else { failureMessage.actualValue = "no exception" @@ -114,23 +130,28 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { _block = block } - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let block: () -> Any? = ({ _ = actualBlock(); return nil }) let expr = Expression(expression: block, location: location) - return try! raiseException( - named: _name, - reason: _reason, - userInfo: _userInfo, - closure: _block - ).matches(expr, failureMessage: failureMessage) + do { + return try raiseException( + named: _name, + reason: _reason, + userInfo: _userInfo, + closure: _block + ).matches(expr, failureMessage: failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } } - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { return !matches(actualBlock, failureMessage: failureMessage, location: location) } - public var named: (_ name: String) -> NMBObjCRaiseExceptionMatcher { + @objc public var named: (_ name: String) -> NMBObjCRaiseExceptionMatcher { return ({ name in return NMBObjCRaiseExceptionMatcher( name: name, @@ -141,7 +162,7 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { }) } - public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionMatcher { + @objc public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionMatcher { return ({ reason in return NMBObjCRaiseExceptionMatcher( name: self._name, @@ -152,7 +173,7 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { }) } - public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionMatcher { + @objc public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionMatcher { return ({ userInfo in return NMBObjCRaiseExceptionMatcher( name: self._name, @@ -163,7 +184,7 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { }) } - public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionMatcher { + @objc public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionMatcher { return ({ block in return NMBObjCRaiseExceptionMatcher( name: self._name, @@ -176,7 +197,7 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { } extension NMBObjCMatcher { - public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionMatcher { + @objc public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionMatcher { return NMBObjCRaiseExceptionMatcher(name: nil, reason: nil, userInfo: nil, block: nil) } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift new file mode 100644 index 00000000..2b9eb218 --- /dev/null +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift @@ -0,0 +1,76 @@ +import Foundation + +/// A Nimble matcher that succeeds when the actual value matches with all of the matchers +/// provided in the variable list of matchers. +public func satisfyAllOf(_ matchers: U...) -> Predicate + where U: Matcher, U.ValueType == T { + return satisfyAllOf(matchers.map { $0.predicate }) +} + +internal func satisfyAllOf(_ predicates: [Predicate]) -> Predicate { + return Predicate.define { actualExpression in + var postfixMessages = [String]() + var matches = true + for predicate in predicates { + let result = try predicate.satisfies(actualExpression) + if result.toBoolean(expectation: .toNotMatch) { + matches = false + } + postfixMessages.append("{\(result.message.expectedMessage)}") + } + + var msg: ExpectationMessage + if let actualValue = try actualExpression.evaluate() { + msg = .expectedCustomValueTo( + "match all of: " + postfixMessages.joined(separator: ", and "), + "\(actualValue)" + ) + } else { + msg = .expectedActualValueTo( + "match all of: " + postfixMessages.joined(separator: ", and ") + ) + } + + return PredicateResult(bool: matches, message: msg) + } +} + +public func && (left: Predicate, right: Predicate) -> Predicate { + return satisfyAllOf(left, right) +} + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) +extension NMBObjCMatcher { + @objc public class func satisfyAllOfMatcher(_ matchers: [NMBMatcher]) -> NMBPredicate { + return NMBPredicate { actualExpression in + if matchers.isEmpty { + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage( + fail: "satisfyAllOf must be called with at least one matcher" + ) + ) + } + + var elementEvaluators = [Predicate]() + for matcher in matchers { + let elementEvaluator = Predicate { expression in + if let predicate = matcher as? NMBPredicate { + // swiftlint:disable:next line_length + return predicate.satisfies({ try expression.evaluate() }, location: actualExpression.location).toSwift() + } else { + let failureMessage = FailureMessage() + // swiftlint:disable:next line_length + let success = matcher.matches({ try! expression.evaluate() }, failureMessage: failureMessage, location: actualExpression.location) + return PredicateResult(bool: success, message: failureMessage.toExpectationMessage()) + } + } + + elementEvaluators.append(elementEvaluator) + } + + return try satisfyAllOf(elementEvaluators).satisfies(actualExpression).toObjectiveC() + } + } +} +#endif diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift index 6cef4c27..57b15fd3 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift @@ -2,60 +2,82 @@ import Foundation /// A Nimble matcher that succeeds when the actual value matches with any of the matchers /// provided in the variable list of matchers. -public func satisfyAnyOf(_ matchers: U...) -> NonNilMatcherFunc +public func satisfyAnyOf(_ matchers: U...) -> Predicate where U: Matcher, U.ValueType == T { - return satisfyAnyOf(matchers) + return satisfyAnyOf(matchers.map { $0.predicate }) } -internal func satisfyAnyOf(_ matchers: [U]) -> NonNilMatcherFunc - where U: Matcher, U.ValueType == T { - return NonNilMatcherFunc { actualExpression, failureMessage in - let postfixMessages = NSMutableArray() - var matches = false - for matcher in matchers { - if try matcher.matches(actualExpression, failureMessage: failureMessage) { - matches = true +internal func satisfyAnyOf(_ predicates: [Predicate]) -> Predicate { + return Predicate.define { actualExpression in + var postfixMessages = [String]() + var matches = false + for predicate in predicates { + let result = try predicate.satisfies(actualExpression) + if result.toBoolean(expectation: .toMatch) { + matches = true + } + postfixMessages.append("{\(result.message.expectedMessage)}") } - postfixMessages.add(NSString(string: "{\(failureMessage.postfixMessage)}")) - } - failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "\(actualValue)" + var msg: ExpectationMessage + if let actualValue = try actualExpression.evaluate() { + msg = .expectedCustomValueTo( + "match one of: " + postfixMessages.joined(separator: ", or "), + "\(actualValue)" + ) + } else { + msg = .expectedActualValueTo( + "match one of: " + postfixMessages.joined(separator: ", or ") + ) + } + + return PredicateResult(bool: matches, message: msg) } +} - return matches - } +public func || (left: Predicate, right: Predicate) -> Predicate { + return satisfyAnyOf(left, right) } -public func || (left: NonNilMatcherFunc, right: NonNilMatcherFunc) -> NonNilMatcherFunc { +public func || (left: NonNilMatcherFunc, right: NonNilMatcherFunc) -> Predicate { return satisfyAnyOf(left, right) } -public func || (left: MatcherFunc, right: MatcherFunc) -> NonNilMatcherFunc { +public func || (left: MatcherFunc, right: MatcherFunc) -> Predicate { return satisfyAnyOf(left, right) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func satisfyAnyOfMatcher(_ matchers: [NMBObjCMatcher]) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + @objc public class func satisfyAnyOfMatcher(_ matchers: [NMBMatcher]) -> NMBPredicate { + return NMBPredicate { actualExpression in if matchers.isEmpty { - failureMessage.stringValue = "satisfyAnyOf must be called with at least one matcher" - return false + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage( + fail: "satisfyAnyOf must be called with at least one matcher" + ) + ) } - var elementEvaluators = [NonNilMatcherFunc]() + var elementEvaluators = [Predicate]() for matcher in matchers { - let elementEvaluator: (Expression, FailureMessage) -> Bool = { - expression, failureMessage in - return matcher.matches({try! expression.evaluate()}, failureMessage: failureMessage, location: actualExpression.location) + let elementEvaluator = Predicate { expression in + if let predicate = matcher as? NMBPredicate { + // swiftlint:disable:next line_length + return predicate.satisfies({ try expression.evaluate() }, location: actualExpression.location).toSwift() + } else { + let failureMessage = FailureMessage() + // swiftlint:disable:next line_length + let success = matcher.matches({ try! expression.evaluate() }, failureMessage: failureMessage, location: actualExpression.location) + return PredicateResult(bool: success, message: failureMessage.toExpectationMessage()) + } } - elementEvaluators.append(NonNilMatcherFunc(elementEvaluator)) + elementEvaluators.append(elementEvaluator) } - return try! satisfyAnyOf(elementEvaluators).matches(actualExpression, failureMessage: failureMessage) + return try satisfyAnyOf(elementEvaluators).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift index c847a1a6..035c744f 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift @@ -1,13 +1,11 @@ import Foundation -public func throwAssertion() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - #if arch(x86_64) && _runtime(_ObjC) && !SWIFT_PACKAGE - failureMessage.postfixMessage = "throw an assertion" - failureMessage.actualValue = nil - - var succeeded = true +public func throwAssertion() -> Predicate { + return Predicate { actualExpression in + #if arch(x86_64) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + let message = ExpectationMessage.expectedTo("throw an assertion") + var actualError: Error? let caughtException: BadInstructionException? = catchBadInstruction { #if os(tvOS) if !NimbleEnvironment.activeInstance.suppressTVOSAssertionWarning { @@ -27,21 +25,19 @@ public func throwAssertion() -> MatcherFunc { #endif do { try actualExpression.evaluate() - } catch let error { - succeeded = false - failureMessage.postfixMessage += "; threw error instead <\(error)>" + } catch { + actualError = error } } - if !succeeded { - return false - } - - if caughtException == nil { - return false + if let actualError = actualError { + return PredicateResult( + bool: false, + message: message.appended(message: "; threw error instead <\(actualError)>") + ) + } else { + return PredicateResult(bool: caughtException != nil, message: message) } - - return true #elseif SWIFT_PACKAGE fatalError("The throwAssertion Nimble matcher does not currently support Swift CLI." + " You can silence this error by placing the test case inside an #if !SWIFT_PACKAGE" + @@ -49,7 +45,8 @@ public func throwAssertion() -> MatcherFunc { #else fatalError("The throwAssertion Nimble matcher can only run on x86_64 platforms with " + "Objective-C (e.g. Mac, iPhone 5s or later simulators). You can silence this error " + - "by placing the test case inside an #if arch(x86_64) or _runtime(_ObjC) conditional statement") + "by placing the test case inside an #if arch(x86_64) or (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) conditional statement") + // swiftlint:disable:previous line_length #endif } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift index 151eb9ad..d294ba39 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift @@ -1,5 +1,33 @@ import Foundation +/// A Nimble matcher that succeeds when the actual expression throws an +/// error of the specified type or from the specified case. +/// +/// Errors are tried to be compared by their implementation of Equatable, +/// otherwise they fallback to comparison by _domain and _code. +/// +/// Alternatively, you can pass a closure to do any arbitrary custom matching +/// to the thrown error. The closure only gets called when an error was thrown. +/// +/// nil arguments indicates that the matcher should not attempt to match against +/// that parameter. +public func throwError() -> Predicate { + return Predicate { actualExpression in + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch { + actualError = error + } + + if let actualError = actualError { + return PredicateResult(bool: true, message: .expectedCustomValueTo("throw any error", "<\(actualError)>")) + } else { + return PredicateResult(bool: false, message: .expectedCustomValueTo("throw any error", "no error")) + } + } +} + /// A Nimble matcher that succeeds when the actual expression throws an /// error of the specified type or from the specified case. /// @@ -11,22 +39,156 @@ import Foundation /// /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. -public func throwError( - _ error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - - var actualError: Error? - do { - _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError +public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) -> Predicate { + return Predicate { actualExpression in + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch { + actualError = error + } + + let failureMessage = FailureMessage() + setFailureMessageForError( + failureMessage, + actualError: actualError, + error: error, + errorType: nil, + closure: closure + ) + + var matches = false + if let actualError = actualError, errorMatchesExpectedError(actualError, expectedError: error) { + matches = true + + if let closure = closure { + let assertions = gatherFailingExpectations { + closure(actualError) + } + let messages = assertions.map { $0.message } + if !messages.isEmpty { + matches = false + } } + } - setFailureMessageForError(failureMessage, actualError: actualError, error: error, errorType: errorType, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, error: error, errorType: errorType, closure: closure) + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + } +} + +/// A Nimble matcher that succeeds when the actual expression throws an +/// error of the specified type or from the specified case. +/// +/// Errors are tried to be compared by their implementation of Equatable, +/// otherwise they fallback to comparision by _domain and _code. +/// +/// Alternatively, you can pass a closure to do any arbitrary custom matching +/// to the thrown error. The closure only gets called when an error was thrown. +/// +/// nil arguments indicates that the matcher should not attempt to match against +/// that parameter. +public func throwError(_ error: T, closure: ((T) -> Void)? = nil) -> Predicate { + return Predicate { actualExpression in + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch { + actualError = error + } + + let failureMessage = FailureMessage() + setFailureMessageForError( + failureMessage, + actualError: actualError, + error: error, + errorType: nil, + closure: closure + ) + + var matches = false + if let actualError = actualError as? T, error == actualError { + matches = true + + if let closure = closure { + let assertions = gatherFailingExpectations { + closure(actualError) + } + let messages = assertions.map { $0.message } + if !messages.isEmpty { + matches = false + } + } } + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + } +} + +/// A Nimble matcher that succeeds when the actual expression throws an +/// error of the specified type or from the specified case. +/// +/// Errors are tried to be compared by their implementation of Equatable, +/// otherwise they fallback to comparision by _domain and _code. +/// +/// Alternatively, you can pass a closure to do any arbitrary custom matching +/// to the thrown error. The closure only gets called when an error was thrown. +/// +/// nil arguments indicates that the matcher should not attempt to match against +/// that parameter. +public func throwError( + errorType: T.Type, + closure: ((T) -> Void)? = nil) -> Predicate { + return Predicate { actualExpression in + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch { + actualError = error + } + + let failureMessage = FailureMessage() + setFailureMessageForError( + failureMessage, + actualError: actualError, + error: nil, + errorType: errorType, + closure: closure + ) + + var matches = false + if let actualError = actualError { + matches = true + + if let actualError = actualError as? T { + if let closure = closure { + let assertions = gatherFailingExpectations { + closure(actualError) + } + let messages = assertions.map { $0.message } + if !messages.isEmpty { + matches = false + } + } + } else { + matches = (actualError is T) + // The closure expects another ErrorProtocol as argument, so this + // is _supposed_ to fail, so that it becomes more obvious. + if let closure = closure { + let assertions = gatherExpectations { + if let actual = actualError as? T { + closure(actual) + } + } + let messages = assertions.map { $0.message } + if !messages.isEmpty { + matches = false + } + } + } + } + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + } } /// A Nimble matcher that succeeds when the actual expression throws any @@ -36,18 +198,67 @@ public func throwError( /// values of the existential type `Error` in the closure. /// /// The closure only gets called when an error was thrown. -public func throwError( - closure: ((Error) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - - var actualError: Error? - do { - _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError +public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { + return Predicate { actualExpression in + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch { + actualError = error + } + + let failureMessage = FailureMessage() + setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) + + var matches = false + if let actualError = actualError { + matches = true + + let assertions = gatherFailingExpectations { + closure(actualError) + } + let messages = assertions.map { $0.message } + if !messages.isEmpty { + matches = false } + } + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + } +} + +/// A Nimble matcher that succeeds when the actual expression throws any +/// error or when the passed closures' arbitrary custom matching succeeds. +/// +/// This duplication to it's generic adequate is required to allow to receive +/// values of the existential type `Error` in the closure. +/// +/// The closure only gets called when an error was thrown. +public func throwError(closure: @escaping ((T) -> Void)) -> Predicate { + return Predicate { actualExpression in + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch { + actualError = error + } - setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, closure: closure) + let failureMessage = FailureMessage() + setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) + + var matches = false + if let actualError = actualError as? T { + matches = true + + let assertions = gatherFailingExpectations { + closure(actualError) + } + let messages = assertions.map { $0.message } + if !messages.isEmpty { + matches = false + } } + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + } } diff --git a/Demo/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift b/Demo/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift new file mode 100644 index 00000000..01369bb3 --- /dev/null +++ b/Demo/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift @@ -0,0 +1,37 @@ +/** + Used by the `toSucceed` matcher. + + This is the return type for the closure. + */ +public enum ToSucceedResult { + case succeeded + case failed(reason: String) +} + +/** + A Nimble matcher that takes in a closure for validation. + + Return `.succeeded` when the validation succeeds. + Return `.failed` with a failure reason when the validation fails. + */ +public func succeed() -> Predicate<() -> ToSucceedResult> { + return Predicate.define { actualExpression in + let optActual = try actualExpression.evaluate() + guard let actual = optActual else { + return PredicateResult(status: .fail, message: .fail("expected a closure, got ")) + } + + switch actual() { + case .succeeded: + return PredicateResult( + bool: true, + message: .expectedCustomValueTo("succeed", "") + ) + case .failed(let reason): + return PredicateResult( + bool: false, + message: .expectedCustomValueTo("succeed", " because <\(reason)>") + ) + } + } +} diff --git a/Demo/Pods/Nimble/Sources/Nimble/Nimble.h b/Demo/Pods/Nimble/Sources/Nimble/Nimble.h index bd45c5dd..2bbc6936 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Nimble.h +++ b/Demo/Pods/Nimble/Sources/Nimble/Nimble.h @@ -3,7 +3,11 @@ #import "NMBStringify.h" #import "DSL.h" -#import "CwlPreconditionTesting.h" +#if TARGET_OS_TV + #import "CwlPreconditionTesting_POSIX.h" +#else + #import "CwlPreconditionTesting.h" +#endif FOUNDATION_EXPORT double NimbleVersionNumber; FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Demo/Pods/Nimble/Sources/Nimble/Utils/Async.swift b/Demo/Pods/Nimble/Sources/Nimble/Utils/Await.swift similarity index 88% rename from Demo/Pods/Nimble/Sources/Nimble/Utils/Async.swift rename to Demo/Pods/Nimble/Sources/Nimble/Utils/Await.swift index 89b3710d..ad7a6eb1 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Utils/Async.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Utils/Await.swift @@ -2,7 +2,7 @@ import CoreFoundation import Dispatch import Foundation -#if !_runtime(_ObjC) +#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) import CDispatch #endif @@ -32,7 +32,7 @@ internal class AssertionWaitLock: WaitLock { func acquireWaitingLock(_ fnName: String, file: FileString, line: UInt) { let info = WaitingInfo(name: fnName, file: file, lineNumber: line) - #if _runtime(_ObjC) + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) let isMainThread = Thread.isMainThread #else let isMainThread = _CFIsMainThread() @@ -89,7 +89,7 @@ internal enum AwaitResult { func isCompleted() -> Bool { switch self { - case .completed(_): return true + case .completed: return true default: return false } } @@ -105,11 +105,15 @@ internal class AwaitPromise { signal = DispatchSemaphore(value: 1) } + deinit { + signal.signal() + } + /// Resolves the promise with the given result if it has not been resolved. Repeated calls to /// this method will resolve in a no-op. /// /// @returns a Bool that indicates if the async result was accepted or rejected because another - /// value was recieved first. + /// value was received first. func resolveResult(_ result: AwaitResult) -> Bool { if signal.wait(timeout: .now()) == .success { self.asyncResult = result @@ -176,16 +180,25 @@ internal class AwaitPromiseBuilder { // checked. // // In addition, stopping the run loop is used to halt code executed on the main run loop. + #if swift(>=4.0) + trigger.timeoutSource.schedule( + deadline: DispatchTime.now() + timeoutInterval, + repeating: .never, + leeway: timeoutLeeway + ) + #else trigger.timeoutSource.scheduleOneshot( deadline: DispatchTime.now() + timeoutInterval, - leeway: timeoutLeeway) + leeway: timeoutLeeway + ) + #endif trigger.timeoutSource.setEventHandler { guard self.promise.asyncResult.isIncomplete() else { return } let timedOutSem = DispatchSemaphore(value: 0) let semTimedOutOrBlocked = DispatchSemaphore(value: 0) semTimedOutOrBlocked.signal() let runLoop = CFRunLoopGetMain() - #if _runtime(_ObjC) + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) let runLoopMode = CFRunLoopMode.defaultMode.rawValue #else let runLoopMode = kCFRunLoopDefaultMode @@ -218,7 +231,7 @@ internal class AwaitPromiseBuilder { /// @discussion /// This function must be executed on the main thread and cannot be nested. This is because /// this function (and it's related methods) coordinate through the main run loop. Tampering - /// with the run loop can cause undesireable behavior. + /// with the run loop can cause undesirable behavior. /// /// This method will return an AwaitResult in the following cases: /// @@ -250,9 +263,13 @@ internal class AwaitPromiseBuilder { self.trigger.timeoutSource.resume() while self.promise.asyncResult.isIncomplete() { // Stopping the run loop does not work unless we run only 1 mode + #if swift(>=4.2) && (os(macOS) || os(iOS) || os(tvOS)) + _ = RunLoop.current.run(mode: .default, before: .distantFuture) + #else _ = RunLoop.current.run(mode: .defaultRunLoopMode, before: .distantFuture) + #endif } - self.trigger.timeoutSource.suspend() + self.trigger.timeoutSource.cancel() if let asyncSource = self.trigger.actionSource { asyncSource.cancel() @@ -282,20 +299,23 @@ internal class Awaiter { } func performBlock( - _ closure: @escaping (@escaping (T) -> Void) throws -> Void) -> AwaitPromiseBuilder { + file: FileString, + line: UInt, + _ closure: @escaping (@escaping (T) -> Void) throws -> Void + ) -> AwaitPromiseBuilder { let promise = AwaitPromise() let timeoutSource = createTimerSource(timeoutQueue) var completionCount = 0 let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: nil) { try closure { completionCount += 1 - nimblePrecondition( - completionCount < 2, - "InvalidNimbleAPIUsage", - "Done closure's was called multiple times. waitUntil(..) expects its " + - "completion closure to only be called once.") - if promise.resolveResult(.completed($0)) { - CFRunLoopStop(CFRunLoopGetMain()) + if completionCount < 2 { + if promise.resolveResult(.completed($0)) { + CFRunLoopStop(CFRunLoopGetMain()) + } + } else { + fail("waitUntil(..) expects its completion closure to be only called once", + file: file, line: line) } } } @@ -313,7 +333,11 @@ internal class Awaiter { let asyncSource = createTimerSource(asyncQueue) let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: asyncSource) { let interval = DispatchTimeInterval.nanoseconds(Int(pollInterval * TimeInterval(NSEC_PER_SEC))) + #if swift(>=4.0) + asyncSource.schedule(deadline: .now(), repeating: interval, leeway: pollLeeway) + #else asyncSource.scheduleRepeating(deadline: .now(), interval: interval, leeway: pollLeeway) + #endif asyncSource.setEventHandler { do { if let result = try closure() { @@ -347,14 +371,10 @@ internal func pollBlock( expression: @escaping () throws -> Bool) -> AwaitResult { let awaiter = NimbleEnvironment.activeInstance.awaiter let result = awaiter.poll(pollInterval) { () throws -> Bool? in - do { - if try expression() { - return true - } - return nil - } catch let error { - throw error + if try expression() { + return true } + return nil }.timeout(timeoutInterval, forcefullyAbortTimeout: timeoutInterval / 2.0).wait(fnName, file: file, line: line) return result diff --git a/Demo/Pods/Nimble/Sources/Nimble/Utils/Errors.swift b/Demo/Pods/Nimble/Sources/Nimble/Utils/Errors.swift index 6caab9e6..074cb203 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Utils/Errors.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Utils/Errors.swift @@ -16,7 +16,7 @@ internal func setFailureMessageForError( } else if errorType != nil || closure != nil { failureMessage.postfixMessage += " from type <\(T.self)>" } - if let _ = closure { + if closure != nil { failureMessage.postfixMessage += " that satisfies block" } if error == nil && errorType == nil && closure == nil { @@ -37,62 +37,6 @@ internal func errorMatchesExpectedError( && actualError._code == expectedError._code } -internal func errorMatchesExpectedError( - _ actualError: Error, - expectedError: T) -> Bool - where T: Equatable { - if let actualError = actualError as? T { - return actualError == expectedError - } - return false -} - -internal func errorMatchesNonNilFieldsOrClosure( - _ actualError: Error?, - error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) -> Bool { - var matches = false - - if let actualError = actualError { - matches = true - - if let error = error { - if !errorMatchesExpectedError(actualError, expectedError: error) { - matches = false - } - } - if let actualError = actualError as? T { - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(actualError as T) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } else if errorType != nil { - matches = (actualError is T) - // The closure expects another ErrorProtocol as argument, so this - // is _supposed_ to fail, so that it becomes more obvious. - if let closure = closure { - let assertions = gatherExpectations { - if let actual = actualError as? T { - closure(actual) - } - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - } - - return matches -} - // Non-generic internal func setFailureMessageForError( @@ -101,7 +45,7 @@ internal func setFailureMessageForError( closure: ((Error) -> Void)?) { failureMessage.postfixMessage = "throw error" - if let _ = closure { + if closure != nil { failureMessage.postfixMessage += " that satisfies block" } else { failureMessage.postfixMessage = "throw any error" @@ -113,25 +57,3 @@ internal func setFailureMessageForError( failureMessage.actualValue = "no error" } } - -internal func errorMatchesNonNilFieldsOrClosure( - _ actualError: Error?, - closure: ((Error) -> Void)?) -> Bool { - var matches = false - - if let actualError = actualError { - matches = true - - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(actualError) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - - return matches -} diff --git a/Demo/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift b/Demo/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift index 8a15c4cf..ce21eeab 100644 --- a/Demo/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift +++ b/Demo/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift @@ -3,7 +3,19 @@ import Foundation internal func identityAsString(_ value: Any?) -> String { let anyObject: AnyObject? #if os(Linux) - anyObject = value as? AnyObject + #if swift(>=4.0) + #if !swift(>=4.1.50) + anyObject = value as? AnyObject + #else + anyObject = value as AnyObject? + #endif + #else + #if !swift(>=3.4) + anyObject = value as? AnyObject + #else + anyObject = value as AnyObject? + #endif + #endif #else anyObject = value as AnyObject? #endif @@ -144,7 +156,9 @@ extension Data: TestOutputStringConvertible { /// will return the result of constructing a string from the value. /// /// - SeeAlso: `TestOutputStringConvertible` -public func stringify(_ value: T) -> String { +public func stringify(_ value: T?) -> String { + guard let value = value else { return "nil" } + if let value = value as? TestOutputStringConvertible { return value.testDescription } @@ -156,15 +170,7 @@ public func stringify(_ value: T) -> String { return String(describing: value) } -/// -SeeAlso: `stringify(value: T)` -public func stringify(_ value: T?) -> String { - if let unboxed = value { - return stringify(unboxed) - } - return "nil" -} - -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @objc public class NMBStringer: NSObject { @objc public class func stringify(_ obj: Any?) -> String { return Nimble.stringify(obj) diff --git a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h deleted file mode 100644 index 5d416e47..00000000 --- a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble22CurrentTestCaseTracker") -@interface CurrentTestCaseTracker : NSObject -+ (CurrentTestCaseTracker *)sharedInstance; -@end - -@interface CurrentTestCaseTracker (Register) @end diff --git a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h index 4538fb47..9170541b 100644 --- a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h +++ b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h @@ -30,12 +30,12 @@ NS_ASSUME_NONNULL_BEGIN #define DEFINE_NMB_EXPECT_OVERLOAD(TYPE, EXPR) \ NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - NMBExpectation *NMB_expect(TYPE(^actualBlock)(), NSString *file, NSUInteger line) { \ + NMBExpectation *NMB_expect(TYPE(^actualBlock)(void), NSString *file, NSUInteger line) { \ return NMB_expect(^id { return EXPR; }, file, line); \ } NIMBLE_EXPORT NIMBLE_OVERLOADABLE - NMBExpectation *NMB_expect(id(^actualBlock)(), NSString *file, NSUInteger line); + NMBExpectation *NMB_expect(id(^actualBlock)(void), NSString *file, NSUInteger line); // overloaded dispatch for nils - expect(nil) DEFINE_NMB_EXPECT_OVERLOAD(void*, nil) @@ -60,7 +60,7 @@ NS_ASSUME_NONNULL_BEGIN -NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(), NSString *file, NSUInteger line); +NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSString *file, NSUInteger line); @@ -350,6 +350,12 @@ NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers); #define satisfyAnyOf(...) NMB_satisfyAnyOf(__VA_ARGS__) #endif +NIMBLE_EXPORT id NMB_satisfyAllOfWithMatchers(id matchers); +#define NMB_satisfyAllOf(...) NMB_satisfyAllOfWithMatchers(@[__VA_ARGS__]) +#ifndef NIMBLE_DISABLE_SHORT_SYNTAX +#define satisfyAllOf(...) NMB_satisfyAllOf(__VA_ARGS__) +#endif + // In order to preserve breakpoint behavior despite using macros to fill in __FILE__ and __LINE__, // define a builder that populates __FILE__ and __LINE__, and returns a block that takes timeout // and action arguments. See https://github.com/Quick/Quick/pull/185 for details. diff --git a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m index 31ff8100..670415b4 100644 --- a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m +++ b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m @@ -1,26 +1,23 @@ #import -#import - -SWIFT_CLASS("_TtC6Nimble7NMBWait") -@interface NMBWait : NSObject - -+ (void)untilTimeout:(NSTimeInterval)timeout file:(NSString *)file line:(NSUInteger)line action:(void(^)())action; -+ (void)untilFile:(NSString *)file line:(NSUInteger)line action:(void(^)())action; -@end +#if __has_include("Nimble-Swift.h") +#import "Nimble-Swift.h" +#else +#import +#endif NS_ASSUME_NONNULL_BEGIN -NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBExpectation *__nonnull NMB_expect(id __nullable(^actualBlock)(), NSString *__nonnull file, NSUInteger line) { +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBExpectation *__nonnull NMB_expect(id __nullable(^actualBlock)(void), NSString *__nonnull file, NSUInteger line) { return [[NMBExpectation alloc] initWithActualBlock:actualBlock negative:NO file:file line:line]; } -NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(), NSString *file, NSUInteger line) { +NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSString *file, NSUInteger line) { return NMB_expect(^id{ actualBlock(); return nil; @@ -141,18 +138,22 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger return [NMBObjCMatcher satisfyAnyOfMatcher:matchers]; } +NIMBLE_EXPORT id NMB_satisfyAllOfWithMatchers(id matchers) { + return [NMBObjCMatcher satisfyAllOfMatcher:matchers]; +} + NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException() { return [NMBObjCMatcher raiseExceptionMatcher]; } NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line) { - return ^(NSTimeInterval timeout, void (^action)(void (^)(void))) { + return ^(NSTimeInterval timeout, void (^ _Nonnull action)(void (^ _Nonnull)(void))) { [NMBWait untilTimeout:timeout file:file line:line action:action]; }; } NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line) { - return ^(void (^action)(void (^)(void))) { + return ^(void (^ _Nonnull action)(void (^ _Nonnull)(void))) { [NMBWait untilFile:file line:line action:action]; }; } diff --git a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h index d2a54d2f..e6e0272a 100644 --- a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h +++ b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h @@ -3,8 +3,8 @@ @interface NMBExceptionCapture : NSObject -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)())finally; -- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)())unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); +- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)(void))finally; +- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)(void))unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); @end diff --git a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m index 0a882b7c..52684b70 100644 --- a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m +++ b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m @@ -2,12 +2,12 @@ @interface NMBExceptionCapture () @property (nonatomic, copy) void(^ _Nullable handler)(NSException * _Nullable); -@property (nonatomic, copy) void(^ _Nullable finally)(); +@property (nonatomic, copy) void(^ _Nullable finally)(void); @end @implementation NMBExceptionCapture -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)())finally { +- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)(void))finally { self = [super init]; if (self) { self.handler = handler; @@ -16,7 +16,7 @@ - (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnul return self; } -- (void)tryBlock:(void(^ _Nonnull)())unsafeBlock { +- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)(void))unsafeBlock { @try { unsafeBlock(); } diff --git a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h index e5d5ddd2..7938bcac 100644 --- a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h +++ b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h @@ -4,7 +4,7 @@ * Returns a string appropriate for displaying in test output * from the provided value. * - * @param value A value that will show up in a test's output. + * @param anyObject A value that will show up in a test's output. * * @return The string that is returned can be * customized per type by conforming a type to the `TestOutputStringConvertible` diff --git a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m index 329d39a0..31a80d6f 100644 --- a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m +++ b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m @@ -1,5 +1,10 @@ #import "NMBStringify.h" + +#if __has_include("Nimble-Swift.h") +#import "Nimble-Swift.h" +#else #import +#endif NSString *_Nonnull NMBStringify(id _Nullable anyObject) { return [NMBStringer stringify:anyObject]; diff --git a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m index 35f26fd0..fa5030a7 100644 --- a/Demo/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m +++ b/Demo/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m @@ -1,7 +1,12 @@ -#import "CurrentTestCaseTracker.h" #import #import +#if __has_include("Nimble-Swift.h") +#import "Nimble-Swift.h" +#else +#import +#endif + #pragma mark - Method Swizzling /// Swaps the implementations between two instance methods. diff --git a/Demo/Pods/Pods.xcodeproj/project.pbxproj b/Demo/Pods/Pods.xcodeproj/project.pbxproj index bb58e39d..37228292 100644 --- a/Demo/Pods/Pods.xcodeproj/project.pbxproj +++ b/Demo/Pods/Pods.xcodeproj/project.pbxproj @@ -7,1233 +7,1249 @@ objects = { /* Begin PBXBuildFile section */ - 0441E82476A9178178DF00C2AEE41E9A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9FBA954D16459F058707875128D6601 /* QuartzCore.framework */; }; - 0459A2E1B1CA3402DABEEDBF4D618179 /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = 00371EAA62F5CDBA4F2F3B7FE6EA1954 /* UIImage+Diff.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 050C3DB9D8A0618E27E6CDCBBC4D0751 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C36DB6F05615EC71278526272A72BAD /* Quick.framework */; }; - 08CFF1FB935A7D5B6E4B6BE3A5303B40 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B612CBD6B1DCE869E3E864DD4C746E0 /* RaisesException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0A81E80717516C4A0E8EE7E46501BD80 /* CurrentTestCaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BC57C06516856D246896E71D5450FAB /* CurrentTestCaseTracker.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 0B57A9A9759EC0CB624AC0A2A6BCD00C /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DCD10C39A3DCEC60FDAB6D2B52B78B /* MatchError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0BD4F5BB58926E327C131FEAA14632FE /* Nimble-Snapshots-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 99E06DECECD216DE63EE31ADA380903B /* Nimble-Snapshots-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0D5E847B5619856E1C22A74EC898F69C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */; }; - 0E32C83F0E31A2E3939BC11E194E5BCC /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1537CABFA7CEF20511B1C1F8385A75C /* HooksPhase.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0EDC36C0490643ED502433D2D90ABFAC /* FBSnapshotTestCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9823197EA5904A9150FB0AD8B09841E6 /* FBSnapshotTestCase.framework */; }; - 101B861950D7E07F56BFE4B79BE597E2 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3B838AC76D5E506BFDA889E980FE2AB /* BeGreaterThanOrEqualTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 117A7BFD0C59A06E904080394A034DF8 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DA5701134923CC5E1C6403C97180F1B /* BeNil.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 15316826E3F51F71EC97A57380595BB8 /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A70C8ACE77A4DE8820D382354A95A3D /* FBSnapshotTestCase.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 15FDA0CC0F97F9C8F32EB61405949CFE /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA73C8DE0047A6F0C33E8B9E31D7D32 /* Contain.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 16150805BA21482D4C88B48423B9466D /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 7314E345CDDA857F026C10E7A0E2F26D /* mach_excServer.c */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 170E8B2CE5102F5A9BAB2CDC6848214C /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF1750A48622E83D1CEA0E34EE618053 /* Async.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 180011DBF469747F564C026BA8DDE0A9 /* Pods-PopTip Demo-PopTip Extension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2011FB3697519F1D325E7467EB8F483A /* Pods-PopTip Demo-PopTip Extension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 191F4182463FAA121084697641C76F70 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000EC5893307C23211A055512D3D1FBE /* AsyncMatcherWrapper.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1B35C9F068B61FDF5183167D72C0CFA3 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F656190067B4123AAB05AFB34BCD067 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 22DF5C275C5D4AC896AA71EB884ED564 /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 77059410500B57F54164B561A764935F /* Nimble-dummy.m */; }; - 23E8FBD696707D21A21F6274EDE60CF1 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A029B109DFAD196290AC600F3AA9664 /* Equal.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 25D531159D14566B75654834D6B7595A /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 80541CEDAAD3A65218E748DC407CEDAD /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 261454E4ED4756CDAF7EEC69A5D60227 /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF87AEA5D2A37E5F1C31F0160A9FA48 /* ContainElementSatisfying.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2618F3CA0BE6250B5FE0C44A06C0175C /* AMPopTip-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D55C59E01DA87D94B05AE79BEBC939D2 /* AMPopTip-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 26BA9CEEA0E0CA245423427FB922F01F /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10A97A5152B8B08DA2593DB7E7F2BF8C /* NimbleXCTestHandler.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 354EE6DD5A8187E83119518587489E3D /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A09D412804C0CAB727FDE6A72825199 /* BeAnInstanceOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 35ED0A616A745E2BCF2A434A30284CB7 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B3C571CC55850FA7E29E97B57BC5231 /* QuickSelectedTestSuiteBuilder.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3666925BB9AB1204DB13904E48687D1D /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82BA7297EAB5660016666FF7A03370CF /* URL+FileName.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3792E5108E28B372D0BBC283CFC79804 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF1B5A6E8026DC5C016F99942BD39FA /* BeIdenticalTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 37E103190AE632BF5CE65122D45C80FD /* QuickSpecBase.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B9975DF83C84505121A1CD3DA9F45D /* QuickSpecBase.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 387D066A1A34ED7DF0F716CB3A8B746D /* UIImage+Snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = 78DCDF95C290E70D266A9870B3A19F29 /* UIImage+Snapshot.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 3B554908E902EB2A1DA8BD776507A11C /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16328B9BB5F9C4DB60F030CEF21B6133 /* SatisfyAnyOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3BA0FA446E2F931B2FFA742A7D670CFB /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AD55F3974939097556240403DEE2DFF /* Nimble.framework */; }; - 41F25E62F8C884DEAF3920EDD5061709 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = F44D21F1FC08553D16C5D37F4729730F /* QuickConfiguration.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 41FFAAF0860C00C7B0CAC223DE3ED7EA /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A3BF40A7ED69D857B7BDD61EF24BF22 /* UIImage+Snapshot.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 42268E34CB8825DD5C2068A93A0CF45A /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B7E861353E659B6021E85C530F91C2 /* AssertionRecorder.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 428606A406891BEE03840D98DF5790E4 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7126A781AB6AA8DA6907B4765E2E0FB /* ThrowAssertion.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 42C229CE887152ABD4CCEDE724A8D42D /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = F3F23422A0F51F156EBF4622FFBCF81E /* NMBExceptionCapture.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 433396CB963D73E4EEE8C088BD1846ED /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F5144EB7A5CE1319BA01732015410A0 /* XCTest.framework */; }; - 45A19473822535A1720F3B9A16B8FAE9 /* HaveValidSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88C6038794B3821939584B738A098EBE /* HaveValidSnapshot.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 45C27E193B46FEFA41EF71059007FB0F /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81E1ECB3B441D9D282F39FEC896C1BE /* Configuration.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 45F6BCA02C320428899D955D91E8DB0C /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F9185AE463B4996A6D6043A895F6F0F /* FailureMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 46FBD24AD2F0C1A621F85EA729A601D3 /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 398C043CB9E40FBD0071B6F8C4F6951F /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 47B24101FE19A3F463172E99B8533BB2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */; }; - 4812D70E9D35223BA3D19CE315CB3FD9 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DABEB6F91C2A288FB01D7ED1D6AB79A /* MatcherProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4BCE0B38FB90EFA05CC9C832E63DCE3E /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = B697B826EDE789764F74D31B9E9B8763 /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4CF5865BAF828AB9A7C56F3A1B1C856F /* FBSnapshotTestCase-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 88485691E194EC0CB12DDA71F1D587AE /* FBSnapshotTestCase-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4D600539FC2E29EA7E28A2DA8A8B328C /* FBSnapshotTestCasePlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = CB1527E8CB7F741D568FBEAA8108BC53 /* FBSnapshotTestCasePlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4E213F2DDBAD591E0CC30C26F5C21857 /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53288771433CE1791CBCE71970E1B1EB /* SuiteHooks.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 50C6CDF9ED61F6B7E94F4087193D157F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */; }; - 54743D40FDAE45F4C3E462715B8AFCA8 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D8FB3C007FF51398B1FF1AB99933CF /* BeLessThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 56479EFE12C2A25D3EEF13B0F02E0D7A /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CBFE8BA23F8564FFA49DC6751815607 /* Match.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 57A739B91AEF886BDD4DB7CA6EEEAFAD /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 7260E6AF38FF6C8415EEDB8855D12C20 /* NMBStringify.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 58AEA9BCE0F7530DC471FC82154E70A3 /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2388D29F6D6FACB1D3AF6ABBE2193D8A /* CwlBadInstructionException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 58AF924B0EAFE2360DA9024AA38CECD7 /* PrettySyntax.swift in Sources */ = {isa = PBXBuildFile; fileRef = 521F32F8A5C3B6651C823E3B4A81584E /* PrettySyntax.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 59FD5FAEFCF13CD39358A6F36C50BED8 /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = E16B4E89964E172F923C92277C7C3F94 /* FBSnapshotTestController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5B3F70D6F1496A70D355A034029CCCBE /* PopTip.swift in Sources */ = {isa = PBXBuildFile; fileRef = F325EEC08B0EFB2F8EA30FB7FB04D743 /* PopTip.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5C5A1529C139A5212E8179407725889A /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E7AD2AE34AE812483A022D18B124AED /* Callsite.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5CBD03CF7E7F4A79CDFAE242B443358D /* AMPopTip-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 25008CFC844419E328CDA5DD64931476 /* AMPopTip-dummy.m */; }; - 5E080BF9BC1C0EB4CED89E21B8AEE061 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B9C73C31A47AC34988D93E51766E22 /* Filter.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5E85BECFB0DE9C35131856B4D4CFF457 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508EB2AB180CFF39238E48F1FF826B52 /* BeVoid.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5FAC95453EFBBEDBD3F827A4F4917C17 /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0688711AC934F1236CED088ED1176986 /* ExampleHooks.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 611AD23ED1A4928A6574CDCC8830DE0D /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40130C8BF8439668448A1C5982C2A772 /* Stringers.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6128B6CDC70A52B0797D353DB399BB72 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8425F7341EB3C18241CF62214FF30B /* BeginWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 620002D55F8D093DFB3E88E2CF8DCC60 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F5144EB7A5CE1319BA01732015410A0 /* XCTest.framework */; }; - 630FF6D1F5CFCD997DA71AA06BB34B04 /* Pods-PopTip Demo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EB0DE31AD3CD393B3D20940778E3357A /* Pods-PopTip Demo-dummy.m */; }; - 63EA4B9CBBAB30A69C2D73693019FDC5 /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = CE3435AF1CA511348ADF52843427B033 /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 6668E44F5445AFFE68C01F9835CDE51B /* NSString+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = B220CFB2490D8F060775C3FE087AC5A0 /* NSString+C99ExtendedIdentifier.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 669A244BF1400D8242783CC7580AADCB /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = EAB27F2DB24A4BC55C39BD4385F08254 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 66E4D4D09CF8D682D85B8A2E179A37E7 /* PopTip+Draw.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B2BE79DBE11927C81DC00BBDF150918 /* PopTip+Draw.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 674FAA16DA069C0086E7997510103124 /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = 57672C442DECEE3C7C6AD31E1A9A4B3F /* FBSnapshotTestController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6750EAEBF4498DD4F2A4AA83545E1DB8 /* NimbleSnapshotsConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C80E4AD2A6C17931ACD5D5F6A3E954 /* NimbleSnapshotsConfiguration.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 68785778F8DA5774DDCDD5E67ADE758C /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8585F17754851E90DC1D1DB1CB6DE93C /* BeCloseTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6960BD73C375AA5CDEDF6DA52F4366BB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */; }; - 6EBCA43A2103FE9D48D994DFA1EAF767 /* Pods-PopTip Demo-PopTip Extension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8ED116EB547AEE6848BC5D842850572D /* Pods-PopTip Demo-PopTip Extension-dummy.m */; }; - 6FB2777AF67C6343F78ED581DAB44DBF /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = F89FE56BE29FCF13CD530BB7857A9F8B /* World+DSL.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 73247510D7AD93E5FDBA474B353BF919 /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = C8DBE700D98C786924B11D2A9E6A452B /* UIImage+Diff.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 7630A86E65E6195378671F9DD7D51AD3 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = EDA6F49F8488C158FD29AE788109D50F /* QCKDSL.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 774A7B4B3A8DDB52EF1018A0F6CDE6B8 /* UIApplication+StrictKeyWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 554594319929579AF96B93868FC5ED1A /* UIApplication+StrictKeyWindow.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 79CB9D3789D5095928376F3198480F63 /* Pods-PopTip DemoTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7835543ABDBBC32D2DB9BA54061037DA /* Pods-PopTip DemoTests-dummy.m */; }; - 7D02CBD8968D3D0F039171E8882904E2 /* Pods-PopTip DemoTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BFFA714E533A2B7E96D638D62CCCD811 /* Pods-PopTip DemoTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7E42E8EE356FD84409CF069C3D142B92 /* Pods-PopTip Demo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 944113E34DBD9E144377D74B77B8AFA5 /* Pods-PopTip Demo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7FC3C9AFFB27796CEDC86D87DC512CFB /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B996E4162BC193E0DD2B8C725BDFA68 /* HaveCount.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 801F90943FABF6AD12FF491324671EE3 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9EB60CDF6FBD3A935035A2E52FED76F /* AssertionDispatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 81ABB1819639E6616DDEE39F4BCEECAC /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A7EE2FD22F2BE050A8EFB0891513773 /* BeEmpty.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 82C4D927F810B2EA1E8A5322C41C2CFD /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BEAC000BE3EAC0C924E6C8C663143AC /* ExampleMetadata.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 82CE6AB7801CEEB918D3F044AA3A72FF /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = D6CE37C84E822C06D3EAE1CA92E762C2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 861D9711DF0D956143E77525C49C90F5 /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 8082845FB2A294546D1AC61717AF95FC /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 874FE1141F13A38531F4697BE979F5CF /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CB0A735FDAE7BD83BBB31B32C83114F /* PostNotification.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 87FFB2C2BA93ED5B29B8F7BCA9484B16 /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = B8198D261EC670B50430A9D49F6F4FDB /* FBSnapshotTestCasePlatform.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 88955A85C280C5359D5A0813CAAC7AF5 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F5144EB7A5CE1319BA01732015410A0 /* XCTest.framework */; }; - 89BC82A3635A165AECCE5B4454215CB1 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0DCA163B4EB5D1132C5C3D63368B51C /* World.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8C3E21E703870F14FBB89C252A3CF066 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC9F7D19D9AB69565F1F7ECD8458DCDD /* AllPass.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8CA260F33A0019F407AC85DC29F4CEBF /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ADE9C483A61CC15888045D4FE084096 /* Expression.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8CAC3B81FFAB2342335164D30A3ACCD1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1239435489E90E8C7AFE533CC73B9FFC /* UIKit.framework */; }; - 8D0C560EA9206B54904F4D0886716CAB /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9F09B1A2A8947414AEE7635FE2AF3D /* AdapterProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 933575268947BA83E51846F0EBFBD2EE /* PopTip+Transitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D713AD0D33E876DA52C4A43114BEA2F5 /* PopTip+Transitions.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 93BD47E3FB491835CDA76380B3013CF5 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = AD326AD83F5B1368B5404707B2BCF947 /* XCTestObservationCenter+Register.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 96A5C27C4FB6EADC9C006B3EAD1D1F56 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = DC0C06CE7A19AACBEE88451BCD88EC99 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 97FFD110FB3C3C37390A890BC4CC1B0E /* Quick-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 337D4C77FBC9661BA25F39DBC66F7608 /* Quick-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9A602F671A3FE663E4541D93E29481DC /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569471778265F83A9030DC56D344BC73 /* BeLogical.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9C55455F527B637EA9A0D8D563C2FC10 /* QuickSpecBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 144ED82EE3E760AF98A0542F41D25F92 /* QuickSpecBase.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9DB41107B2F8DDB155AFFBBF546E1369 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27BE76A1B90D72907826E6915E88965 /* DSL+Wait.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A076AC596A5DA559484044CE11908E9B /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F13EEE7BAC88FA2565C4521C5E9840 /* CwlDarwinDefinitions.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A14877FB5DB6F9537AAA79BACDB9C34F /* Nimble-Snapshots-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E1E6D2530699EF2C37E3EFD8BE5375A /* Nimble-Snapshots-dummy.m */; }; - A71DE0157C73E51655C6BE1CF8DD61CE /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C7BB1D397E98B72565F15A5DEF76 /* SourceLocation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A96CCAB2382DE9B319FE95A717824393 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535A83511A8433BEEBA6E57054A163AA /* Example.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AA999CC4B511B81070CF52A82ABE8D64 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */; }; - AB3EAAD41DE965BCF5053A54418478F2 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = B6555C2A3818A08604EF2BEF7284D464 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AC7BE39EF11283FEB3DA3720143BA08D /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = C78BBE614BE09B3FA1DE90C2BD567454 /* BeGreaterThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - ACC2E8C5179C95F16187CCB57FFC695C /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C8FF475D58630E8C2A0595D443C18B5 /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B08725BB938AA3AACCA3C8C818FA4CF6 /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F57D29CC561709561C5B466F04B15CC /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B44D1B1F2A44DC52FB8BB28722C5E5C6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */; }; - B7136FACCBF508177CB6C63509F23AC5 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95EBD62D9D26F216798D0CCCD0D73B54 /* Functional.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B8B334C2DEA4675C19F720004E5D6F08 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = A3B7F0A99A34AC96E5161F32A63BCE71 /* QuickSpec.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B8D8E3673B312B94C7EAE484C2E4FFDA /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01E727C551EB89E89BAF714364E7344A /* NimbleEnvironment.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BA1EE5C0810F86B84A1CE110D5B2495F /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BEF9D55E911EB99B76113E7D6AEE2E /* QuickTestSuite.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BC727F1A54B7D12439B51C0CF2FB0937 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = D03DEAB3E506BFAC1C417675C3AE11F6 /* DSL.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BCDA265400AF5BCF21074C5AF1FD09A8 /* UIApplication+StrictKeyWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = B81A3A23EEEABC7D1B53CCB09BC12C50 /* UIApplication+StrictKeyWindow.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BE71D2E3D4FFBA123536C731884E4FFA /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BD6ED7F74955AA2A1667C7F922F67A5 /* Closures.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BECC57EBF427A7B4DD86557878E1E087 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB251A0E85DAFF3D17A0179B92119BD0 /* EndWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C08F98B31495947A7EC2E7EDF0086B94 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA424F89E640E3E3F0ECCF68DF1C182F /* NMBObjCMatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C0FB327F7F936918F6F02D170DBE35E4 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = C11FBA75ABE36B0A2461A907BBBCE024 /* XCTestSuite+QuickTestSuiteBuilder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C426C651860B7E67026299FFA150A9E1 /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = C5358F9ADB2619DD5BA1C503F0B0C917 /* World.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C56275DC06C898FD40BE6D4A6D3F87DC /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CB91F60767353B0B06353F0628A808F /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C9417AF6D2B31AA9938E523909D00EB4 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = D069F8A81995EFAF54A694E1E366DFD7 /* BeAKindOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C9E4AC0655BF4A2E7CB61692E3473A95 /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E879E28879F79A7809D5FF5DEAC23ADE /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CDC427433709B9DCC0F453ACC0420ED7 /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = D66D7E36DC250FB25AAFB8038EF0A0E7 /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - CDC51D3D34E62ED7C534CDF7474EF6FB /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BBCD32E1077F416A54ADB0FACF9D843 /* BeLessThanOrEqual.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D79CDFD9B84A6DAB9DA1DBAD0CEB9303 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F682E7FB820C006AF44AE022AE2A2F5 /* NSBundle+CurrentTestBundle.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D7F8383722DFF7BF7B1E0F52C0BA47A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */; }; - D7F9ABA0EEDFE7BF6C868300DDCD0EA9 /* FBSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 55FABD10E6037E17B665DAC595804BE3 /* FBSnapshotTestCase-dummy.m */; }; - DE53E3EFB231CB5931AAB80181DE203E /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05910E12F46EF0B617858CC2A21AED01 /* CwlCatchBadInstruction.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E2BB642CBD39E9DEC5159598156D6D1F /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8FF14E9A22B5E7095C215CFE0540ED9 /* MatcherFunc.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E6E9BF397832B3D0BCB180DE0908CD22 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */; }; - E9710C4851E51DE5F0D3DF744BAF5576 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF7D02DBD2B4E16208F9BDD8CD97AD77 /* ThrowError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E98AA469F96E5674888D4E845AB81F8F /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9CDBB351E5FC8781764576D91F6A6E /* DSL.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EBDC2270A85B3EF52AE1BAFDE3112E9D /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 98BFF7495C0F5214AA51A31AD8FAFF69 /* CwlMachBadInstructionHandler.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EE49B509C881B9ADFA007BC10A25D1A0 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2BF93484E2412D94F340BD5ADC0FAE6 /* NMBExpectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EFB9A27A708781B839036C72BCCD125A /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B275C4EB8C358C9513F847FCFC712C2 /* UIImage+Compare.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F0D3742DB0881E9D0929A737F6A203B8 /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29CA84126A02C4C94D71A3D72B473A0F /* CwlCatchException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F2BD2E308A244A2D1189D4DC5092BD2E /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B56DD589B21DEF741224D84B159A7CC /* ErrorUtility.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F42C2790CF7AA038A2C98F9C151A564B /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 4864958417C3B0AD2DBF07A97B02FE49 /* World+DSL.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F45A2B6D1A6A79BC90F2835AD3F24EC0 /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = F22868ACC1D92164D31C6011179A8FD5 /* ExampleGroup.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F5CDA94B21A008202EE634C6A68E478D /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A511C66A233B0B2C500639FC91121813 /* Expectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F819EBECA137E16FE436D11EC52118F5 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E39576527CC20A56E4D667936A118E0 /* Errors.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F911171A7357B8F64E27DB3832F0C713 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E4B7F9647618B6A870B748EA12D2A3F /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FA70140FBD119E3A722AEAEEBD4991FF /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E833841B8DB00F41BBBF9C824578368 /* DSL.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - FE8F08750027E8A4A90B64F2E4F0C354 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B996EBBCBEEB9CA80D1E7C807D65FEE /* SwiftSupport.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - FFB5C46EDA99CB6D118E8E0BB3785069 /* Quick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B72658AAC63485EC8389B0CE3CC50073 /* Quick-dummy.m */; }; + 0160091B65F78655415EF69FA9525B9F /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 259D1E0C519F51448A0385DDD2262885 /* DSL.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 01904B0245AC2031E9ADD586BE7224C0 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C3E007B7FA8AF37AEC180AB0D6EF435 /* EndWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 01DAA6DD1809A39129FF7C72DDF93054 /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = C06EDBC72F62E7C014B818EDF4DD7185 /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04E1104FF1409C80A30C88127DB8B00A /* FBSnapshotTestCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45544E7DC8BC621B5141430C9031836E /* FBSnapshotTestCase.framework */; }; + 0725A6F6AF5A97F9D46B3188E135D5B2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = B15935D99DADF2B82D7FBA4580A3AB48 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0834E167066BF3659E39621F58F440A6 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF9B12D157D3309DCA2370D6A3CA016 /* BeVoid.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 0837CAE176AE66736FE457DDAAF5E01D /* Quick-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 043F561B21C1039AF1BDA1CBD58D2CC5 /* Quick-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 083A75C30AFB7EF0C51EC28566B05F0A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E906E59597539202C0610CB360AA2AC /* XCTest.framework */; }; + 08CF38FAB9CFF343D7DD1E0A81DAA3F3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 148E9B9B88A6C299608B94017E20CF78 /* Foundation.framework */; }; + 0A2A042AE9BD5C00BB8C68FE889FE700 /* String+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = C92902D7AFAA229368DB418AA6E41C19 /* String+C99ExtendedIdentifier.swift */; }; + 0C0397B2FF0E3A2651B6C2E83AFABE77 /* Nimble-Snapshots-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 86552199BD8C16AD15523853E138CDB8 /* Nimble-Snapshots-dummy.m */; }; + 12884A23B3D5CC0808DEA9CCC8B3CE0B /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E906E59597539202C0610CB360AA2AC /* XCTest.framework */; }; + 1662BEDD868AF1CD729C4269E69A3580 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFB02D05A3119C76380A1DE5E57855AD /* MatcherFunc.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 25B8696FF6F4BC3F90101C2B4A0BFFBE /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D8C0A8C96756D8AE5F9FD95C6E3AFDA /* CwlDarwinDefinitions.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 29203A2F0FE323638DFA6F3F7C8C8DE4 /* PrettySyntax.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51505ACCBF45D68A8F196B8AD6FC5AB2 /* PrettySyntax.swift */; }; + 2B5277644A91CF18B97BDA2ED5CF2701 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 9910AD9D05F97196F120DA9DB1EEB561 /* NMBStringify.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2D57849BBE4DB509C70D6DC48E6E21B3 /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C0CE47FA06598072C3124E86D80CD2 /* ToSucceed.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 2F7C7B2317A3AAEF16465F3C2DC4B1C6 /* iOSSnapshotTestCase-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EFB34B3CBFE55697AF334ABD46862046 /* iOSSnapshotTestCase-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 306E679C628318FE60D603D13B4FFBA1 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB928B3942DD336F5FDA58A94B7DDF0E /* Filter.swift */; }; + 308780D4872A85FE37009D76771B4763 /* Nimble-Snapshots-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 617C957328EDAB079A8AA3A90A105817 /* Nimble-Snapshots-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30A4DC4FB0FB4A31EBB87BAB40772899 /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = 03CA0C62250B57FC794F3F4EC9C7E78B /* UIImage+Diff.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 31A28ED184C9E499BF5938BA28421EC5 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E906E59597539202C0610CB360AA2AC /* XCTest.framework */; }; + 32E11C68B7E380DAF57756919DFC2BB0 /* PopTip+Transitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DC1B6418BD47D3A9BBC4480611102C6 /* PopTip+Transitions.swift */; }; + 3715872AE6D47358024DFE600FB7577C /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4847F6833DFA9EA7E30295B3E090E914 /* HooksPhase.swift */; }; + 3B324746542B5868C6AA793F2EF93FEB /* Await.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEA2D10C8A8DD85BB7F4FE21E2AFCEE4 /* Await.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3BFC633B022F34844416263062FF09E8 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842619618535AF2FB52CC59D12438F25 /* World.swift */; }; + 3CEC9666E164E56F28AD3EC5F71624CD /* Pods-PopTip DemoTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8ADB745749F0984CF18AAD70767AE6BB /* Pods-PopTip DemoTests-dummy.m */; }; + 3CFD5091F02F30ADE4EEC622C7F487C8 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72562FF8AB2C0306DEC949BE3EC92DFA /* Async.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3D59AD64A81F07665EAFC1702926D7FD /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = C0F5452E9ACE24C3CCDD5AD0E1DC54D3 /* UIImage+Diff.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 3EC1BA2A68CB73133A8AF47477F9C73C /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = A4112965F20575018ABFB75F3DC568E5 /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3FF5F51EE684B5AB78BE233E6520B27C /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 35FF880C9AC47A0BE67D71B6C1F6D23E /* UIImage+Snapshot.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 405AB644E5E32AB19AE8697B4C0CE124 /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = AE050D71F3F50D4CEF04E268ED579593 /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4660867D6E616474D6B62FAF476CCAAD /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90147AA8A30685521367F0954EEDEF77 /* BeginWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 46A1B0195C7D04DAE31D04C5F573C383 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 722471BD3E66A547D4DACA48CBA0D377 /* SwiftSupport.swift */; }; + 48140F7D929CF6250944012AFB7948E4 /* DynamicSizeSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C7214E6F94E32716417A8B6A0C84450 /* DynamicSizeSnapshot.swift */; }; + 48BF60116173CA26B2A55721C84E3577 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 148E9B9B88A6C299608B94017E20CF78 /* Foundation.framework */; }; + 4A1B85AEDC3DB75FC35A3F5438B0AD81 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DDC2BC2F135191F3B2B5979756FF2F /* BeLessThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 4A79C6E050492F6B4B72518F2AF143FF /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58614353D118D3A6F78C499633F1A6D8 /* ExampleMetadata.swift */; }; + 4B97BD308458A93E1F03EF7A7D5D4DCE /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1860B709EB99D6F17F6724DEEDCB1361 /* RaisesException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 4CBB32046E3B8844FFA021ACFC57702F /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED70F012F628E1EE40BB18340BC6AE5 /* ExpectationMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 5221433E6847800B0533CAADF9BABA04 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F31BFA1E2AF673395696D728BF67DD /* BeCloseTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 53B30596B1EA5F0845A886843FB9E859 /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = E64E3AC67B5FBEFF5A6E40CEF2B0CE1C /* CwlCatchException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 543967CB633CDE86DFD53581EAE1A35D /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6C7980DFBFA31EF29A37B7F3239F24A /* BeEmpty.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 54A61062B9FB72C6BA0054B2A685ED0E /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B8F71B06EB98731EC5EC55E16D1B254 /* Equal.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 56C63D2A478C6B43D30C3F5F8D1C17CF /* HaveValidSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9517383C4FF0E07EE470E4B8027609D /* HaveValidSnapshot.swift */; }; + 57EB1F068BA7C8AFEAE02983DB17CFAD /* CurrentTestCaseTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 026D97C2FA7EEB539B0EFBF49198FFC0 /* CurrentTestCaseTracker.swift */; }; + 58906F0519B886C86E75EFDF9B19E583 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 148E9B9B88A6C299608B94017E20CF78 /* Foundation.framework */; }; + 5A2624E5A86B04603605C3BCCD73DE7F /* NBSMockedApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = D2CB7D4CE909C3C30C1AE0026F24F4D4 /* NBSMockedApplication.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5AE2ED77BA86597A13D0AAADABE223DA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 148E9B9B88A6C299608B94017E20CF78 /* Foundation.framework */; }; + 5B8DC6716BDD04AF78AC8048F5BACF38 /* SatisfyAllOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = C922B693EF054A359253A2DCD002659B /* SatisfyAllOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 5BDB0BB5F464064DF78D998FB490324F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 148E9B9B88A6C299608B94017E20CF78 /* Foundation.framework */; }; + 5CE5E8EA75E0B3DC5BE140B61DF37EFD /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 31ADFA7C467BD79B9720CB46BE91E237 /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5CE944B24E92F75283808185B053CA33 /* PopTip+Draw.swift in Sources */ = {isa = PBXBuildFile; fileRef = F07F75DDE011945316BC63B51F7DC0E4 /* PopTip+Draw.swift */; }; + 6140A77EACAD0FC8E751229EFF69A2ED /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD03F98CAA30F2774995685916D56CCC /* World+DSL.swift */; }; + 61931EFCD4854516AD3DA75101231785 /* QuickSpecBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B5AEF2409826FEC0790DCF2689EBAA /* QuickSpecBase.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 61C17A2EEE8CEB079EBD74691B315748 /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = CF4CEEC5B35DEC042C282CE171C3C3A5 /* FBSnapshotTestController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 62DFF94A7A777939C861EDA13627999B /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 0056A074A7AD864E82CE7AA959554704 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63B6EE789529A220E576A10E3356FBEE /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 794DD0D675B9627F71B46EDA54C7690B /* NimbleEnvironment.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 641ADF187D575C30FF16C890DD38496A /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = ACEFE6092716EB9D9919CCCC080BA096 /* CwlMachBadInstructionHandler.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 652BF47B1A51DBF7AC5BFE0CECB6676B /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EA27625EF08D49B80BCF45CF50DE0A0 /* QuickSpec.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 67D16958DA7E0257BECE6ACD1EF0A176 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DFA468D22FC91521E9F1E1EDE6B81E1 /* MatcherProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 683798C6164A47491876EF6076F27CB9 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84FBD80DD035600356849790FADF19DD /* Functional.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 68E91926C879D6865E92A324D90D75C5 /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEECC02B14151DF89285DD48A0423C0 /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6B711829635DE0124AAD400294679DA4 /* AMPopTip-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9391798D983F425114DD4CF2BE4B7019 /* AMPopTip-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6BEA7B617028CECFCCF7E73DE1EFBC00 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = F888E5F770D6CF353FD1959B01A6691C /* BeIdenticalTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6C49A3B6785E4180BB5DFCE3C6DF4EC5 /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27FF8D3E80A764A169804FE073D27CA1 /* ExampleHooks.swift */; }; + 6CF8C877AF611E2E0C67EDD06618E63C /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F68FEE6E54A62DF21C1EF04027B707B /* NimbleXCTestHandler.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6DAD0721434AA5E307A6CDC647AFFB93 /* Pods-PopTip Demo-PopTip Extension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F488A4760800EF84AD10500DC1EDBF9F /* Pods-PopTip Demo-PopTip Extension-dummy.m */; }; + 7460C7CD0497AAE90DA55B895F47DEC4 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 549566E54D67BEE641217B82B24372AD /* DSL.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 75FA9B86128B755B52CB43776F957AF6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 148E9B9B88A6C299608B94017E20CF78 /* Foundation.framework */; }; + 77C44DB624CB1B7F521F66F1E02624FD /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A8CDEB6B067ACC3C1460EBB6A38355 /* QuickTestSuite.swift */; }; + 79B501D0BC7B0EC7F32607CA53DC3B6F /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = 75C667F49551B841433528B76D871AD6 /* UIImage+Compare.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7ACF7943A939837532BB53A73F01CE63 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = 801CD80B8C9E02A17D94365EFC44CC05 /* Match.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 7C2671EB4E95CC40521B48E4FBA9DB58 /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 340BDA70E7B2E5733010B16F6D0C2DE2 /* FBSnapshotTestCase.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 80945DB751F5043C4D2BE37C4ADD99D9 /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = 08177DB2A000D757F77F1C62A460062D /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 80BED9B23AAC740E9A8DA675AA34B404 /* UIImage+Snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = FDA6F2ABC91EC5DE29B60B94872BB799 /* UIImage+Snapshot.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 81211C1910CF04C5936511C397A3F841 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = E267DB7A1382D87C9F398D09239F499D /* DSL.swift */; }; + 8155518C6A8781F6B128E3B3FE7B1147 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = D9DBB4EB9D90A8E2417A2E49615E4C84 /* XCTestSuite+QuickTestSuiteBuilder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 81B1434E6E2716DCE0E798628023D731 /* FBSnapshotTestCasePlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 22885CF8C3E6C6FFF0B6C93CAE1FFABD /* FBSnapshotTestCasePlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85D5C597E5A1C66586CE08A4BFC7F885 /* PopTip.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3F79D151D1359340CD9C43B7F5E37E /* PopTip.swift */; }; + 88F193B38F98F0065DA84B9067903635 /* XCTestObservationCenter+CurrentTestCaseTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = C944F04F2681BC2B774FE1515F995C7E /* XCTestObservationCenter+CurrentTestCaseTracker.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8911DDD5910AA1C6E099EBF768AFC8F7 /* QuickSpecBase.h in Headers */ = {isa = PBXBuildFile; fileRef = AA93B0819FA713215D0F70FC26BAF9A1 /* QuickSpecBase.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8A63B9526F71A89D8B1A65F7C06575E5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A69EB16895D0FDA9699EED91A3CFB841 /* QuartzCore.framework */; }; + 8B32C823A5263884ACC364067EFADA22 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05996CE84D591AEC1343BE4B69AC894E /* MatchError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 8B729C7257E0E5C7F86E3597D460E212 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E4461403C6166F02030AF7696A2202B /* BeGreaterThanOrEqualTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 8CB9325284A6E8E782D34AF833480CA3 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F46CD48E3D7F22C92FE0F2AE7C406E /* BeGreaterThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 8CF3F268D917EA23E973C26928D9F4B8 /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = 78EF2544CBA242DCEDFA0FD3A8550F77 /* FBSnapshotTestCasePlatform.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8FC94352BAAA1B77653B34EC5985CF52 /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AE28B019064889B4A4ECA189A044049 /* Closures.swift */; }; + 9547CB19FDE142845886215F8292743C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 148E9B9B88A6C299608B94017E20CF78 /* Foundation.framework */; }; + 96C4F7349BB0B624490075CB4F37F2B4 /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E1C3D489386B7006942DE8E0FC44A33 /* CwlCatchBadInstruction.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 981D9FBF09890E4E20DF889B2AD514F0 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16539750D9EFF0E955E181605ADB6D9B /* BeLessThanOrEqual.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 99B2BFD67568B9953B86113CF7D1290C /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AA2BECE95F2A026271D50BA77BB5BC3 /* ThrowAssertion.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 9BA4E7F68AE9967DE324C686E6DDF1A9 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DB2549C63F8F8E4DDEA345919EA2532 /* Predicate.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 9EA62F9768963210444DF2449807EDBA /* XCTestObservationCenter+CurrentTestCaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 18646BF9FBC76BD2DBAD4C04BF49EB56 /* XCTestObservationCenter+CurrentTestCaseTracker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A02F4AB85BBBEBA608F33B3EA07C0CF9 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9607F80FE9EAA3750F804148C4E47DD9 /* BeNil.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + A38A1BAB9DC7FB158426F2791D2BDB9B /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = C738934C04B06690799FACDD903F02FD /* BeAKindOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + A3A25739D8FCB7A4FE17C8C5A6C7BE72 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 57DA5CB443284A053CD9C52DCC7CD824 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A5436D327EE3F9E435C533FA9314382E /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = C21E0AC194284CF8B648DA4B64F3317C /* ExampleGroup.swift */; }; + A6B3BD3449B75E0EEE19302454659458 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = ABA0EEBD3AB68FDBD49236B6BCA09C0E /* NMBExceptionCapture.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A79BC369F4B85216A5CFFAE710C93689 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E34D6C3EA22B9AF4C04DE0182E4AC9 /* XCTestObservationCenter+Register.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A93913B4BC536EB83801121CCB016316 /* UIApplication+StrictKeyWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F2E0D315F2410613BA14A38CA2ED88B /* UIApplication+StrictKeyWindow.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AB2F79D3BF6F4CB33383BDBA189AA12B /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D64AECBC6C07B9747CCF0BB77B617D94 /* AssertionDispatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + AD1ABD5ADD73F47E6DF31F91EA4A0FF8 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14F6C3D7E8E075ADF356F1346EDA2701 /* NMBObjCMatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + AE99DE37027335451FFD42AD0017BF12 /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 771D70A5A8C057A08E4D24F470C30343 /* SatisfyAnyOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B2B1939F38FA0F9D4DA8A0F712596FD2 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 776372E9EDA056B7122D3C5A92F75DD3 /* Example.swift */; }; + B63AD4D9B71DF38F2A350B47D859289F /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8EA8C0AF2541D4E516150CB57EC366C /* QuickSelectedTestSuiteBuilder.swift */; }; + B6607A673440A83CE99361A08D82C734 /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = FC11BE14883923B38508DBD6CC6FB80D /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B662FB934B08450530A1A521489732B3 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16034379DA29A9DD32F21E3F5DED879D /* FailureMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B7A0119D88C1DF43AFD25FB3A0B6E842 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF981A059B70258424AF4D29AEBC9454 /* Expectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B8A381670CA0CF6BDED298016F1D0ADB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FC4B74774AC1644D1B62CBDC0CCBF /* UIKit.framework */; }; + BAEAB2ADD34955EE77CBA4B43994B6F7 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079F56E0FACD5432FA7CB970FD2BEAC1 /* NMBExpectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + BB12015B95C941DBA7EF46FA3DD44880 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7A924813A1B64057DA6B84FC76E929 /* Callsite.swift */; }; + BB1619BCE35A078A932C56B2519CCB6C /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F5504AB8ABB40327EDED6FF1F758ECB /* BeLogical.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + BB998ED871BF1D0143368EAE88BF663F /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F92116778B602CBECF30F63EF2A398 /* NSBundle+CurrentTestBundle.swift */; }; + BE2E0A9AC5E2019BFD31452E96ED83D9 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3676AE16C181911D9CF291CFFAC641F /* AssertionRecorder.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + BF162FE488440AC9824E22EF6BD760FC /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 458EB16A2ACD11BB7A37EBF15862B673 /* DSL+Wait.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + C098C153F2988A344EAD8EE4C0CDF882 /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CC17704266653F292C052BD95FB8CC7 /* PostNotification.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + C42E25AEAE4758760D9239D25E88FEAF /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = C0A4655992E2B7FDF67D71B50A72BE98 /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C971A8D42C7C043DC4970A69B81546A7 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 98DC850735213DD8DC39BDF03726C02D /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C98FF48F8CAC5F4FB6AFFCB33BE40AF7 /* PrettyDynamicTypeSyntax.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DD70AF183E230D3FBD85D324D0C889 /* PrettyDynamicTypeSyntax.swift */; }; + CA47F9860D035A879E222C366B807340 /* HaveValidDynamicTypeSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = DACB4178AED23E9AC3057071D3DFB1B1 /* HaveValidDynamicTypeSnapshot.swift */; }; + CA9A2D74A41B640925B521CEC8BBEACE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 148E9B9B88A6C299608B94017E20CF78 /* Foundation.framework */; }; + CCA41EC992E6CFEC5367FE79E843240D /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EDB01CB3502491A3E14C5F1F6372A4 /* AllPass.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + CD53A1407E7C67C3B0D07293D1E81B89 /* Pods-PopTip Demo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0879EADE7D4ACAC1DA006E2CD538C89C /* Pods-PopTip Demo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CF1351463BEB454D279DF2B292841488 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 66191B95C8CF1D7DEA5B877F203CEE8A /* QCKDSL.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CFA0DCDED2CCF981775D7CBE5A838D7A /* NBSMockedApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = D713B9E524F483EE11FC3AE462E8096B /* NBSMockedApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D01B8CB271F18C9B70586679F0C2E747 /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 66B56FE6C05BC5F71C59AA94B38A7E18 /* Nimble-dummy.m */; }; + D11ADB0D3FA4022060B79BED74421F62 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39F185BDDF6C39C4F6D3DAE81F1FC747 /* ErrorUtility.swift */; }; + D3A8D20BEDC46C80A42D6F7BDA32AAE9 /* Behavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 204CE1772733F482EFE5EE7602FCEA16 /* Behavior.swift */; }; + D74DC22C55ADE37571E7E7EEC2D64E54 /* QuickConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31679B4F7F4666D343CDB06557DADDD9 /* QuickConfiguration.swift */; }; + D85D4FFD5907D396E00171768C1523E4 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA809B4503458EBD9232CEC162A187BB /* URL+FileName.swift */; }; + D8F8A71B4AA04AC5C72087E6007EA971 /* iOSSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 816630637C31E2DE523DAF4887E09104 /* iOSSnapshotTestCase-dummy.m */; }; + DA0DA6C2D7C6235862E9A6929144EBA5 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5446A240CA8FCE9A13EA84D5D52D557B /* SourceLocation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DCC243D2AEC18F6FD827742DCBCC4D1E /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 070EAFBFFD05CF9A629B33C086F8C044 /* ContainElementSatisfying.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DED813943ABF7ACBD1C38B2D8024DA9C /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = 037A99F0A6902D6FA27E6700BC806AFB /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DEF6305C7FCCD86B037E3811551D16E6 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DF17887D5A01ECD951295F8FCE8B5A7 /* Errors.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DFAAEF3440DDBCA8719DD048DAE27FDF /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = CBF934CBEFF2DB148CE79145218C4D8C /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DFE607CA56BECABAFF108C6E606847A6 /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 427DE31D87258521F073799B7866B429 /* mach_excServer.c */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E0EA0EF4015AD59A70ED23C979A6A0C0 /* UIApplication+StrictKeyWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = D6761FE3D3B7DC161EB60F661BFDA3E4 /* UIApplication+StrictKeyWindow.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E1216911C249E3FC383CE5EE1E1066F3 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16AA411713E3824B112BDF63A25A3366 /* Contain.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + E1FACE293D2216BF2ABA1DE31874351F /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82679AE3C180B90F7539DA5CBFD6EC65 /* Configuration.swift */; }; + E2BA3851285ADED1721B51CA11E5F423 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FC4B74774AC1644D1B62CBDC0CCBF /* UIKit.framework */; }; + E309E8330485C49C065B38E52C41A299 /* Pods-PopTip Demo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 74D05D5BE1D85D6F300242441A3281AD /* Pods-PopTip Demo-dummy.m */; }; + E594306BF52C899BCE23A4BA56CD0DD0 /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = B98247D2A5CDAC2BBB5AAB8F2169B5B2 /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E64F9D4663DEE92C3C928CB72598E6C9 /* Pods-PopTip DemoTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AB2961242DB55DD72A6674047C3DE2B /* Pods-PopTip DemoTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E68FCDC3550B6EE493A15BE22237576D /* AMPopTip-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 53674FC635783FCD6E4031030EB2C49D /* AMPopTip-dummy.m */; }; + E6C11C009FC4EEB972E5175E3D2EDCA5 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 165C552C9468203078EF29F66A4CA1EF /* ThrowError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + E84A4ED0B63C48CC6E4571784BF070F9 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 457FF1E51B0643AC5CA1CDC126F8B7E7 /* HaveCount.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + EB13561E71736E81399CB85419419570 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5660F8345FF229BC549B6BE87739A0E /* AdapterProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + EDD6F0CB0C4A0FBF470FF1FA37E28FCC /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F54BC0EDEDFF2EC643E6396C5BBC5E4 /* BeAnInstanceOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + EE157DBCE1F197BC50B908D77778B508 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 914EC005836744BC81C1E6806DE590E4 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EFB91FC0832DD7B3B5B05D4AF85A2BDF /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = FF67788B345263FB9CF1BD20D29E5616 /* QuickConfiguration.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F1216169A31BD69E23A7CF3EA91B966D /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9060C38D29BFD361123C95FF5C6A1EBE /* SuiteHooks.swift */; }; + F162AB513DDE6A7FE9C4716F1EE94D8E /* Quick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 20A146A87341E07DD77AAD75275D2E4D /* Quick-dummy.m */; }; + F630B376ABE2B76BD06716E25EC25606 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98A26F8B175EB5DB136F0C98A8DF2CE /* Expression.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F796E637335D81BEE579B0C55EF4740A /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D35F92A6BFBF9579DAFE842BFF03D7D /* Nimble.framework */; }; + F8EA3B6B23173D51461F920F77B3C6BE /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757CCA4A47F729BEE8C049B092500B0F /* Stringers.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + FA5A1BA48BC7F11F18E7EB2C61FB2054 /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2C1A51547E7FC5A1A44CC5D0D33ECF8 /* CwlBadInstructionException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + FBC1632F885E2BC7693ACF80FA6E45BF /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA11BB65626CB452ECA194818128ADE8 /* FBSnapshotTestController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + FF31A3B5441894A2F13997C0FE237C4C /* Pods-PopTip Demo-PopTip Extension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BED3906A4660DD61D0D46DC3CE1C209 /* Pods-PopTip Demo-PopTip Extension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 0C2F04C6E18F8D853570EFAE95569A72 /* PBXContainerItemProxy */ = { + 19782C6F7E071339C046AFA8EA84CDF1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9208F82521C84CC962FB475DC38D3371; - remoteInfo = FBSnapshotTestCase; + remoteGlobalIDString = EE19095A8C98E0BC5774005673495238; + remoteInfo = "Nimble-Snapshots"; }; - 1D2029BE7FFE69AB705642C58A288C98 /* PBXContainerItemProxy */ = { + 19C40B2FA371C5E993378C3756C33FB6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9A8D48230A8E5F0BF70C6620B093246E; + remoteGlobalIDString = 6F13695E06195A78EA8A95F8C7ED0D2F; remoteInfo = Nimble; }; - 401F1886085D5BF5E71653E4F1D56307 /* PBXContainerItemProxy */ = { + 32F7CCA5A6EDAF0F68081AC36ECD8305 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = F59D37792BA4734F625CB674BDC6F9FA; - remoteInfo = "Nimble-Snapshots"; + remoteGlobalIDString = 0B974B55B3C5F71E53DF6070DC0CF6CF; + remoteInfo = AMPopTip; }; - 894C5D1EEC8975E6AFB549D61D7725AE /* PBXContainerItemProxy */ = { + 50231BF5191324F1721C406B843616A9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9208F82521C84CC962FB475DC38D3371; - remoteInfo = FBSnapshotTestCase; + remoteGlobalIDString = 760D0F5B72491D747935D786BA1AA8A9; + remoteInfo = "Pods-PopTip Demo"; }; - 95D57D5567F8A2C2682213988BDCA3CE /* PBXContainerItemProxy */ = { + 5E335AD694F18D35CA55B1B54BF09B9D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 8DB3BB93AB209436276723C938FEA5F0; - remoteInfo = "Pods-PopTip Demo"; + remoteGlobalIDString = 6F13695E06195A78EA8A95F8C7ED0D2F; + remoteInfo = Nimble; }; - AA4F758CCCB30FA4972D78D5A8274D4F /* PBXContainerItemProxy */ = { + 887F3F68013861B9D59935CA5378709B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = F745D6D8CF6D4183FE335DA396B04733; + remoteGlobalIDString = C82891EAB7293DBEE916B21F57E8474D; remoteInfo = Quick; }; - C75226A043CC723E06469070D4A89E31 /* PBXContainerItemProxy */ = { + A9C36414AB2E9CF0DB9F409C8D24F26F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 57A6BD4F68D1BFFFDCE47B0F400E13B5; + remoteGlobalIDString = 0B974B55B3C5F71E53DF6070DC0CF6CF; remoteInfo = AMPopTip; }; - D5D00B951CBC347927E89E6DCCFB9ABA /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = F745D6D8CF6D4183FE335DA396B04733; - remoteInfo = Quick; - }; - EC47A1129CA623B876CC40136E9A8459 /* PBXContainerItemProxy */ = { + BA889852E7D13709E4E63BCE2040EF31 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9A8D48230A8E5F0BF70C6620B093246E; - remoteInfo = Nimble; + remoteGlobalIDString = C393038B0BEF088C1B93E6528005862D; + remoteInfo = iOSSnapshotTestCase; }; - EF2EBD82D0C09CA2404B01D8B4EE990B /* PBXContainerItemProxy */ = { + D4DB503013938EC819356AE854D92D78 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 57A6BD4F68D1BFFFDCE47B0F400E13B5; - remoteInfo = AMPopTip; + remoteGlobalIDString = C393038B0BEF088C1B93E6528005862D; + remoteInfo = iOSSnapshotTestCase; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 000EC5893307C23211A055512D3D1FBE /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncMatcherWrapper.swift; path = Sources/Nimble/Matchers/AsyncMatcherWrapper.swift; sourceTree = ""; }; - 00371EAA62F5CDBA4F2F3B7FE6EA1954 /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.m"; sourceTree = ""; }; - 01E727C551EB89E89BAF714364E7344A /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; - 0215C89FEA308568EF39F024112B16C1 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 04BEF9D55E911EB99B76113E7D6AEE2E /* QuickTestSuite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickTestSuite.swift; path = Sources/Quick/QuickTestSuite.swift; sourceTree = ""; }; - 05910E12F46EF0B617858CC2A21AED01 /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = ""; }; - 0688711AC934F1236CED088ED1176986 /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = ""; }; - 08ECA601D4CC2D8DD7310AAA2D6B04E8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 0A70C8ACE77A4DE8820D382354A95A3D /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = ""; }; - 0B56DD589B21DEF741224D84B159A7CC /* ErrorUtility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtility.swift; path = Sources/Quick/ErrorUtility.swift; sourceTree = ""; }; - 0BD6ED7F74955AA2A1667C7F922F67A5 /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = ""; }; - 0CBFE8BA23F8564FFA49DC6751815607 /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; - 0DF1B5A6E8026DC5C016F99942BD39FA /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; - 10A97A5152B8B08DA2593DB7E7F2BF8C /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; - 1239435489E90E8C7AFE533CC73B9FFC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 12A30BF535E32FD741E10F451317E48C /* Pods-PopTip Demo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PopTip Demo-frameworks.sh"; sourceTree = ""; }; - 144ED82EE3E760AF98A0542F41D25F92 /* QuickSpecBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpecBase.h; path = Sources/QuickSpecBase/include/QuickSpecBase.h; sourceTree = ""; }; - 16328B9BB5F9C4DB60F030CEF21B6133 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; - 1B612CBD6B1DCE869E3E864DD4C746E0 /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; - 1E72823BE5F9FD1C8A234CB9D1F96A57 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Nimble.modulemap; sourceTree = ""; }; - 1E833841B8DB00F41BBBF9C824578368 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; - 1F9185AE463B4996A6D6043A895F6F0F /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; - 2011FB3697519F1D325E7467EB8F483A /* Pods-PopTip Demo-PopTip Extension-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PopTip Demo-PopTip Extension-umbrella.h"; sourceTree = ""; }; - 235C388FD38AF5655B2496AB1B39654C /* AMPopTip.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AMPopTip.modulemap; sourceTree = ""; }; - 2388D29F6D6FACB1D3AF6ABBE2193D8A /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; - 25008CFC844419E328CDA5DD64931476 /* AMPopTip-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AMPopTip-dummy.m"; sourceTree = ""; }; - 28D958A84B171436F15EEF9EA8349130 /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 29CA84126A02C4C94D71A3D72B473A0F /* CwlCatchException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchException.swift; path = Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift; sourceTree = ""; }; - 2E4B7F9647618B6A870B748EA12D2A3F /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/NimbleObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; - 2F57D29CC561709561C5B466F04B15CC /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = ""; }; - 2F7352A30F6E4F910978CE37A04AD75A /* Pods-PopTip Demo-PopTip Extension-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PopTip Demo-PopTip Extension-acknowledgements.markdown"; sourceTree = ""; }; - 30CE76E7592F8C76C93476F7F3C10CF1 /* Nimble_Snapshots.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble_Snapshots.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 30D8FB3C007FF51398B1FF1AB99933CF /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; - 337D4C77FBC9661BA25F39DBC66F7608 /* Quick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-umbrella.h"; sourceTree = ""; }; - 358056853B23BC31B163CD395B599989 /* Quick.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Quick.xcconfig; sourceTree = ""; }; - 37C2B84135CCB66ADD70DE89AC49470C /* Nimble-Snapshots-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-Snapshots-prefix.pch"; sourceTree = ""; }; - 398079E2EA6C6447D1A785CEF5E73F4D /* AMPopTip.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; path = AMPopTip.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 398C043CB9E40FBD0071B6F8C4F6951F /* mach_excServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h; sourceTree = ""; }; - 3A09D412804C0CAB727FDE6A72825199 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; - 3B2BE79DBE11927C81DC00BBDF150918 /* PopTip+Draw.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PopTip+Draw.swift"; path = "Source/PopTip+Draw.swift"; sourceTree = ""; }; - 3C8FF475D58630E8C2A0595D443C18B5 /* CwlCatchException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlCatchException.h; path = Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h; sourceTree = ""; }; - 3DABEB6F91C2A288FB01D7ED1D6AB79A /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; - 3E994D58A427D7C2DEC199C92F9A29B7 /* Pods-PopTip DemoTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip DemoTests.release.xcconfig"; sourceTree = ""; }; - 3EF04624DD2E36F6DCF48192237D69C0 /* Nimble-Snapshots.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Nimble-Snapshots.xcconfig"; sourceTree = ""; }; - 3F5144EB7A5CE1319BA01732015410A0 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 40130C8BF8439668448A1C5982C2A772 /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; - 43F13EEE7BAC88FA2565C4521C5E9840 /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; - 448CA51987CE6291BE508DA98DE482C2 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 45B9C73C31A47AC34988D93E51766E22 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Quick/Filter.swift; sourceTree = ""; }; - 460098A16AFA3C46A8BF1953286513CD /* Pods-PopTip Demo-PopTip Extension.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PopTip Demo-PopTip Extension.modulemap"; sourceTree = ""; }; - 4864958417C3B0AD2DBF07A97B02FE49 /* World+DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "World+DSL.h"; path = "Sources/QuickObjectiveC/DSL/World+DSL.h"; sourceTree = ""; }; - 48E8F87724B4B0B2B7E068CEC5527F1F /* FBSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-prefix.pch"; sourceTree = ""; }; - 4A029B109DFAD196290AC600F3AA9664 /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; - 4A7EE2FD22F2BE050A8EFB0891513773 /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; - 4B3C571CC55850FA7E29E97B57BC5231 /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickSelectedTestSuiteBuilder.swift; path = Sources/Quick/QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; - 4B996E4162BC193E0DD2B8C725BDFA68 /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; - 4B996EBBCBEEB9CA80D1E7C807D65FEE /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = FBSnapshotTestCase/SwiftSupport.swift; sourceTree = ""; }; - 4BEAC000BE3EAC0C924E6C8C663143AC /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = ""; }; - 4E2725727C45685B0DA4F7CE73B7E087 /* Pods-PopTip DemoTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PopTip DemoTests-frameworks.sh"; sourceTree = ""; }; - 508EB2AB180CFF39238E48F1FF826B52 /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; - 521F32F8A5C3B6651C823E3B4A81584E /* PrettySyntax.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PrettySyntax.swift; sourceTree = ""; }; - 53288771433CE1791CBCE71970E1B1EB /* SuiteHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SuiteHooks.swift; path = Sources/Quick/Hooks/SuiteHooks.swift; sourceTree = ""; }; - 535A83511A8433BEEBA6E57054A163AA /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = ""; }; - 554594319929579AF96B93868FC5ED1A /* UIApplication+StrictKeyWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+StrictKeyWindow.m"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m"; sourceTree = ""; }; - 55FABD10E6037E17B665DAC595804BE3 /* FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSnapshotTestCase-dummy.m"; sourceTree = ""; }; - 569471778265F83A9030DC56D344BC73 /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; - 57672C442DECEE3C7C6AD31E1A9A4B3F /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = ""; }; - 5AD55F3974939097556240403DEE2DFF /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5ADE9C483A61CC15888045D4FE084096 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; - 5BBCD32E1077F416A54ADB0FACF9D843 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; - 5C28FA7274E77A2E5C14E62C3BF4F5E7 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - 5E39576527CC20A56E4D667936A118E0 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; - 5EC130C8726E17D4A7AD48C7AA65E98C /* Pods-PopTip Demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip Demo.debug.xcconfig"; sourceTree = ""; }; - 646E48DE9B5A00D00F0697B7B6BF21A0 /* Pods-PopTip Demo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PopTip Demo-acknowledgements.plist"; sourceTree = ""; }; - 64D0C7BB1D397E98B72565F15A5DEF76 /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; - 65E04B2F5BF1AB6E9F1AA38CE3992D5F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 66A26BD8E774A628DCB63BC14CB128EE /* Pods_PopTip_DemoTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PopTip_DemoTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 699873DB03F1E2B7D2A73208B58CE64E /* Pods-PopTip DemoTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PopTip DemoTests.modulemap"; sourceTree = ""; }; - 6B275C4EB8C358C9513F847FCFC712C2 /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = ""; }; - 6CB0A735FDAE7BD83BBB31B32C83114F /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; - 6E7AD2AE34AE812483A022D18B124AED /* Callsite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Callsite.swift; path = Sources/Quick/Callsite.swift; sourceTree = ""; }; - 7260E6AF38FF6C8415EEDB8855D12C20 /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/NimbleObjectiveC/NMBStringify.m; sourceTree = ""; }; - 72A2234D1D382105CBC1993DEEF8F629 /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; - 7314E345CDDA857F026C10E7A0E2F26D /* mach_excServer.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = mach_excServer.c; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c; sourceTree = ""; }; - 7418799601C5233F8AA944A973038A0E /* FBSnapshotTestCase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSnapshotTestCase.xcconfig; sourceTree = ""; }; - 77059410500B57F54164B561A764935F /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; - 7835543ABDBBC32D2DB9BA54061037DA /* Pods-PopTip DemoTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PopTip DemoTests-dummy.m"; sourceTree = ""; }; - 78DCDF95C290E70D266A9870B3A19F29 /* UIImage+Snapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Snapshot.h"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.h"; sourceTree = ""; }; - 79E287A68710AA7D39DB0CE48C5DB7FE /* Quick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Quick.modulemap; sourceTree = ""; }; - 7A3BF40A7ED69D857B7BDD61EF24BF22 /* UIImage+Snapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Snapshot.m"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.m"; sourceTree = ""; }; - 7BC57C06516856D246896E71D5450FAB /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CurrentTestCaseTracker.h; path = Sources/NimbleObjectiveC/CurrentTestCaseTracker.h; sourceTree = ""; }; - 7C8425F7341EB3C18241CF62214FF30B /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; - 7DA5701134923CC5E1C6403C97180F1B /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; - 80541CEDAAD3A65218E748DC407CEDAD /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/NimbleObjectiveC/DSL.h; sourceTree = ""; }; - 8082845FB2A294546D1AC61717AF95FC /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlMachBadInstructionHandler.h; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h; sourceTree = ""; }; - 827ABD4BCDD133C35C19991F404FB5CB /* Nimble-Snapshots.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Nimble-Snapshots.modulemap"; sourceTree = ""; }; - 82BA7297EAB5660016666FF7A03370CF /* URL+FileName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+FileName.swift"; path = "Sources/Quick/URL+FileName.swift"; sourceTree = ""; }; - 838BDCB41F1D11978C41C12669A7E0DA /* AMPopTip.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AMPopTip.xcconfig; sourceTree = ""; }; - 850E2A73E7078CFFE50FAE1D1CE12D12 /* Pods-PopTip DemoTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip DemoTests.debug.xcconfig"; sourceTree = ""; }; - 8585F17754851E90DC1D1DB1CB6DE93C /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; - 87E88200A32D3F991FBB2EE310648D4D /* Pods-PopTip Demo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PopTip Demo-acknowledgements.markdown"; sourceTree = ""; }; - 88485691E194EC0CB12DDA71F1D587AE /* FBSnapshotTestCase-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-umbrella.h"; sourceTree = ""; }; - 88C6038794B3821939584B738A098EBE /* HaveValidSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HaveValidSnapshot.swift; sourceTree = ""; }; - 8A9CDBB351E5FC8781764576D91F6A6E /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Quick/DSL/DSL.swift; sourceTree = ""; }; - 8C36DB6F05615EC71278526272A72BAD /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8E1E6D2530699EF2C37E3EFD8BE5375A /* Nimble-Snapshots-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-Snapshots-dummy.m"; sourceTree = ""; }; - 8ED116EB547AEE6848BC5D842850572D /* Pods-PopTip Demo-PopTip Extension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PopTip Demo-PopTip Extension-dummy.m"; sourceTree = ""; }; - 8F656190067B4123AAB05AFB34BCD067 /* Quick.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Quick.h; path = Sources/QuickObjectiveC/Quick.h; sourceTree = ""; }; - 902E453308704EFBD9ACCC70EE6479FD /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 90CAC093A7ED70EB38A162E4E486695A /* Pods-PopTip DemoTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PopTip DemoTests-resources.sh"; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9438D3352E59EFE5B037938D52056A5F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 944113E34DBD9E144377D74B77B8AFA5 /* Pods-PopTip Demo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PopTip Demo-umbrella.h"; sourceTree = ""; }; - 95EBD62D9D26F216798D0CCCD0D73B54 /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; - 9823197EA5904A9150FB0AD8B09841E6 /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 98BFF7495C0F5214AA51A31AD8FAFF69 /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlMachBadInstructionHandler.m; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m; sourceTree = ""; }; - 99E06DECECD216DE63EE31ADA380903B /* Nimble-Snapshots-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-Snapshots-umbrella.h"; sourceTree = ""; }; - 9B25630BBD7EDB96ED076A4FCFEBFFCB /* Pods-PopTip Demo-PopTip Extension-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PopTip Demo-PopTip Extension-acknowledgements.plist"; sourceTree = ""; }; - 9CB91F60767353B0B06353F0628A808F /* QCKDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QCKDSL.h; path = Sources/QuickObjectiveC/DSL/QCKDSL.h; sourceTree = ""; }; - 9F682E7FB820C006AF44AE022AE2A2F5 /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+CurrentTestBundle.swift"; path = "Sources/Quick/NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; - A1C80E4AD2A6C17931ACD5D5F6A3E954 /* NimbleSnapshotsConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NimbleSnapshotsConfiguration.swift; sourceTree = ""; }; - A3B7F0A99A34AC96E5161F32A63BCE71 /* QuickSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpec.m; path = Sources/QuickObjectiveC/QuickSpec.m; sourceTree = ""; }; - A41E1817B71B69E1FD38EE7A40CBF4E7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A511C66A233B0B2C500639FC91121813 /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; - A7126A781AB6AA8DA6907B4765E2E0FB /* ThrowAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowAssertion.swift; path = Sources/Nimble/Matchers/ThrowAssertion.swift; sourceTree = ""; }; - A7DCD10C39A3DCEC60FDAB6D2B52B78B /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; - A851C24AE2070B0BB31ABAE36FCB332C /* Pods-PopTip Demo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PopTip Demo-resources.sh"; sourceTree = ""; }; - A9B9975DF83C84505121A1CD3DA9F45D /* QuickSpecBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpecBase.m; path = Sources/QuickSpecBase/QuickSpecBase.m; sourceTree = ""; }; - AC9F7D19D9AB69565F1F7ECD8458DCDD /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; - AD326AD83F5B1368B5404707B2BCF947 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; - AF1750A48622E83D1CEA0E34EE618053 /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Utils/Async.swift; sourceTree = ""; }; - B0B381017AC164824665E20304950FD6 /* Pods_PopTip_Demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PopTip_Demo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B1537CABFA7CEF20511B1C1F8385A75C /* HooksPhase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HooksPhase.swift; path = Sources/Quick/Hooks/HooksPhase.swift; sourceTree = ""; }; - B220CFB2490D8F060775C3FE087AC5A0 /* NSString+C99ExtendedIdentifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSString+C99ExtendedIdentifier.swift"; path = "Sources/Quick/NSString+C99ExtendedIdentifier.swift"; sourceTree = ""; }; - B3B838AC76D5E506BFDA889E980FE2AB /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; - B4943626C517809901F36B4F6CBE5262 /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; - B4D6CF2C609AEBC327DB671A80B15215 /* Pods-PopTip Demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip Demo.release.xcconfig"; sourceTree = ""; }; - B513BE7CD28D176F6935727F460AB97C /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B6555C2A3818A08604EF2BEF7284D464 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; - B697B826EDE789764F74D31B9E9B8763 /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlPreconditionTesting.h; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h; sourceTree = ""; }; - B72658AAC63485EC8389B0CE3CC50073 /* Quick-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Quick-dummy.m"; sourceTree = ""; }; - B8198D261EC670B50430A9D49F6F4FDB /* FBSnapshotTestCasePlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCasePlatform.m; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.m; sourceTree = ""; }; - B81A3A23EEEABC7D1B53CCB09BC12C50 /* UIApplication+StrictKeyWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+StrictKeyWindow.h"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h"; sourceTree = ""; }; - B9EB60CDF6FBD3A935035A2E52FED76F /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; - B9FBA954D16459F058707875128D6601 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - BB9F09B1A2A8947414AEE7635FE2AF3D /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; - BCA73C8DE0047A6F0C33E8B9E31D7D32 /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; - BF173B6C91E02D5EE9058226B8FD986E /* FBSnapshotTestCase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FBSnapshotTestCase.modulemap; sourceTree = ""; }; - BFFA714E533A2B7E96D638D62CCCD811 /* Pods-PopTip DemoTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PopTip DemoTests-umbrella.h"; sourceTree = ""; }; - C11FBA75ABE36B0A2461A907BBBCE024 /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; - C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - C3B7E861353E659B6021E85C530F91C2 /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; - C5358F9ADB2619DD5BA1C503F0B0C917 /* World.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = World.h; path = Sources/QuickObjectiveC/World.h; sourceTree = ""; }; - C78BBE614BE09B3FA1DE90C2BD567454 /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; - C81E1ECB3B441D9D282F39FEC896C1BE /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Quick/Configuration/Configuration.swift; sourceTree = ""; }; - C8DBE700D98C786924B11D2A9E6A452B /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.h"; sourceTree = ""; }; - CA424F89E640E3E3F0ECCF68DF1C182F /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/NMBObjCMatcher.swift; sourceTree = ""; }; - CB1527E8CB7F741D568FBEAA8108BC53 /* FBSnapshotTestCasePlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCasePlatform.h; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.h; sourceTree = ""; }; - CB2DE747AE99E711347498EDEACACD67 /* AMPopTip-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AMPopTip-prefix.pch"; sourceTree = ""; }; - CE3435AF1CA511348ADF52843427B033 /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = ""; }; - D03DEAB3E506BFAC1C417675C3AE11F6 /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/NimbleObjectiveC/DSL.m; sourceTree = ""; }; - D069F8A81995EFAF54A694E1E366DFD7 /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; - D27BE76A1B90D72907826E6915E88965 /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; - D2D880BE84C24A10753CD31B26C18B3C /* Pods_PopTip_Demo_PopTip_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PopTip_Demo_PopTip_Extension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D55C59E01DA87D94B05AE79BEBC939D2 /* AMPopTip-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AMPopTip-umbrella.h"; sourceTree = ""; }; - D57E7C5E617EA68F176FF12C645AB883 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - D66D7E36DC250FB25AAFB8038EF0A0E7 /* CwlCatchException.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m; sourceTree = ""; }; - D6CE37C84E822C06D3EAE1CA92E762C2 /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/NimbleObjectiveC/NMBStringify.h; sourceTree = ""; }; - D713AD0D33E876DA52C4A43114BEA2F5 /* PopTip+Transitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PopTip+Transitions.swift"; path = "Source/PopTip+Transitions.swift"; sourceTree = ""; }; - D732828C4A99ED688AA531932E8D8123 /* Pods-PopTip Demo-PopTip Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip Demo-PopTip Extension.debug.xcconfig"; sourceTree = ""; }; - D8FF14E9A22B5E7095C215CFE0540ED9 /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; - DBF153DE7E37A9C29A2FD465BA1F4259 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DC0C06CE7A19AACBEE88451BCD88EC99 /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = ""; }; - E0899AB45D968B0B698B10CD770B8BF9 /* Pods-PopTip DemoTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PopTip DemoTests-acknowledgements.plist"; sourceTree = ""; }; - E0DCA163B4EB5D1132C5C3D63368B51C /* World.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = World.swift; path = Sources/Quick/World.swift; sourceTree = ""; }; - E16B4E89964E172F923C92277C7C3F94 /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = ""; }; - E23630385A137C80DEF389D0F212AD2D /* Pods-PopTip Demo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PopTip Demo.modulemap"; sourceTree = ""; }; - E4A442AAC6E3C3AA74778A7DBFBC9D12 /* Quick-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-prefix.pch"; sourceTree = ""; }; - E59FBAFAD94001EFAA51D0F80909B568 /* AMPopTip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AMPopTip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E879E28879F79A7809D5FF5DEAC23ADE /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; - EAB27F2DB24A4BC55C39BD4385F08254 /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = ""; }; - EAF87AEA5D2A37E5F1C31F0160A9FA48 /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContainElementSatisfying.swift; path = Sources/Nimble/Matchers/ContainElementSatisfying.swift; sourceTree = ""; }; - EB0DE31AD3CD393B3D20940778E3357A /* Pods-PopTip Demo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PopTip Demo-dummy.m"; sourceTree = ""; }; - EDA6F49F8488C158FD29AE788109D50F /* QCKDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QCKDSL.m; path = Sources/QuickObjectiveC/DSL/QCKDSL.m; sourceTree = ""; }; - EF665C5330F353F5953131CE0BA0E8CC /* Pods-PopTip Demo-PopTip Extension-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PopTip Demo-PopTip Extension-resources.sh"; sourceTree = ""; }; - EFC00E1BCA7ABF73D1FA3D05DBA3E0FD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F22868ACC1D92164D31C6011179A8FD5 /* ExampleGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleGroup.swift; path = Sources/Quick/ExampleGroup.swift; sourceTree = ""; }; - F2BF93484E2412D94F340BD5ADC0FAE6 /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/NMBExpectation.swift; sourceTree = ""; }; - F325EEC08B0EFB2F8EA30FB7FB04D743 /* PopTip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PopTip.swift; path = Source/PopTip.swift; sourceTree = ""; }; - F3F23422A0F51F156EBF4622FFBCF81E /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/NimbleObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; - F44D21F1FC08553D16C5D37F4729730F /* QuickConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickConfiguration.m; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.m; sourceTree = ""; }; - F52683387C103F5EBC11C9323B94A825 /* Pods-PopTip Demo-PopTip Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip Demo-PopTip Extension.release.xcconfig"; sourceTree = ""; }; - F89FE56BE29FCF13CD530BB7857A9F8B /* World+DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "World+DSL.swift"; path = "Sources/Quick/DSL/World+DSL.swift"; sourceTree = ""; }; - FB251A0E85DAFF3D17A0179B92119BD0 /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; - FE4EC793A3500FBBC42334F5F00A0CAA /* Pods-PopTip DemoTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PopTip DemoTests-acknowledgements.markdown"; sourceTree = ""; }; - FF7D02DBD2B4E16208F9BDD8CD97AD77 /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; + 0056A074A7AD864E82CE7AA959554704 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; + 026D97C2FA7EEB539B0EFBF49198FFC0 /* CurrentTestCaseTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CurrentTestCaseTracker.swift; sourceTree = ""; }; + 037A99F0A6902D6FA27E6700BC806AFB /* Quick.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Quick.h; path = Sources/QuickObjectiveC/Quick.h; sourceTree = ""; }; + 03CA0C62250B57FC794F3F4EC9C7E78B /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.m"; sourceTree = ""; }; + 043F561B21C1039AF1BDA1CBD58D2CC5 /* Quick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-umbrella.h"; sourceTree = ""; }; + 05996CE84D591AEC1343BE4B69AC894E /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; + 070EAFBFFD05CF9A629B33C086F8C044 /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContainElementSatisfying.swift; path = Sources/Nimble/Matchers/ContainElementSatisfying.swift; sourceTree = ""; }; + 079F56E0FACD5432FA7CB970FD2BEAC1 /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/NMBExpectation.swift; sourceTree = ""; }; + 08177DB2A000D757F77F1C62A460062D /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = ""; }; + 0879EADE7D4ACAC1DA006E2CD538C89C /* Pods-PopTip Demo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PopTip Demo-umbrella.h"; sourceTree = ""; }; + 0AB2961242DB55DD72A6674047C3DE2B /* Pods-PopTip DemoTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PopTip DemoTests-umbrella.h"; sourceTree = ""; }; + 0B505DF714956B038222FE8B375483F0 /* Pods-PopTip DemoTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PopTip DemoTests-acknowledgements.markdown"; sourceTree = ""; }; + 0B8F71B06EB98731EC5EC55E16D1B254 /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; + 0D35F92A6BFBF9579DAFE842BFF03D7D /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0D631E9908483F9525A6B3F36F16CC61 /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Quick.framework; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0E162ED0F33811A146ACB6060DAF7A20 /* Pods_PopTip_DemoTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_PopTip_DemoTests.framework; path = "Pods-PopTip DemoTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 0E5D10698DAE56D593822E63EE8C6981 /* Pods-PopTip Demo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PopTip Demo-frameworks.sh"; sourceTree = ""; }; + 0E906E59597539202C0610CB360AA2AC /* 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; }; + 0F54BC0EDEDFF2EC643E6396C5BBC5E4 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; + 148E9B9B88A6C299608B94017E20CF78 /* 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; }; + 14F6C3D7E8E075ADF356F1346EDA2701 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/NMBObjCMatcher.swift; sourceTree = ""; }; + 15CD25DD15CFA4234F5A2EB71466605B /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + 15EDB01CB3502491A3E14C5F1F6372A4 /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; + 16034379DA29A9DD32F21E3F5DED879D /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; + 16539750D9EFF0E955E181605ADB6D9B /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; + 165C552C9468203078EF29F66A4CA1EF /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; + 16AA411713E3824B112BDF63A25A3366 /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; + 1860B709EB99D6F17F6724DEEDCB1361 /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; + 18646BF9FBC76BD2DBAD4C04BF49EB56 /* XCTestObservationCenter+CurrentTestCaseTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTestObservationCenter+CurrentTestCaseTracker.h"; sourceTree = ""; }; + 1A15CED75CF25B741E77880BCC8DE726 /* Pods-PopTip Demo-PopTip Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip Demo-PopTip Extension.release.xcconfig"; sourceTree = ""; }; + 204CE1772733F482EFE5EE7602FCEA16 /* Behavior.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Behavior.swift; path = Sources/Quick/Behavior.swift; sourceTree = ""; }; + 20A146A87341E07DD77AAD75275D2E4D /* Quick-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Quick-dummy.m"; sourceTree = ""; }; + 22506383E22217CFB648DCE0EDC92A0F /* AMPopTip-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AMPopTip-prefix.pch"; sourceTree = ""; }; + 2282B8C1CC3D43B3BC491CC708CC6DD8 /* iOSSnapshotTestCase-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "iOSSnapshotTestCase-Info.plist"; sourceTree = ""; }; + 22885CF8C3E6C6FFF0B6C93CAE1FFABD /* FBSnapshotTestCasePlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCasePlatform.h; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.h; sourceTree = ""; }; + 23E34D6C3EA22B9AF4C04DE0182E4AC9 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; + 23ED7CBD4322BE3C6D2CF54E81A02E47 /* Pods-PopTip DemoTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PopTip DemoTests-acknowledgements.plist"; sourceTree = ""; }; + 2567C469A9027D11C5116BACE5DDC493 /* Pods-PopTip DemoTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PopTip DemoTests-frameworks.sh"; sourceTree = ""; }; + 259D1E0C519F51448A0385DDD2262885 /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/NimbleObjectiveC/DSL.m; sourceTree = ""; }; + 25C2AEE6A46162DE157A08064E5AB5C6 /* Pods-PopTip Demo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PopTip Demo.modulemap"; sourceTree = ""; }; + 27FF8D3E80A764A169804FE073D27CA1 /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = ""; }; + 2BB292F6F1FB8257E7CB4D025DED6477 /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; + 2CC17704266653F292C052BD95FB8CC7 /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; + 2DC1B6418BD47D3A9BBC4480611102C6 /* PopTip+Transitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PopTip+Transitions.swift"; path = "Source/PopTip+Transitions.swift"; sourceTree = ""; }; + 2F5504AB8ABB40327EDED6FF1F758ECB /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; + 2FAA5D661524B8F44D090233FEAF538E /* Nimble-Snapshots.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Nimble-Snapshots.modulemap"; sourceTree = ""; }; + 31679B4F7F4666D343CDB06557DADDD9 /* QuickConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickConfiguration.swift; path = Sources/Quick/Configuration/QuickConfiguration.swift; sourceTree = ""; }; + 31ADFA7C467BD79B9720CB46BE91E237 /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; + 31F31BFA1E2AF673395696D728BF67DD /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; + 3357B35F2626A336EA4A6957CF896AD4 /* Pods-PopTip Demo-PopTip Extension-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PopTip Demo-PopTip Extension-acknowledgements.markdown"; sourceTree = ""; }; + 340BDA70E7B2E5733010B16F6D0C2DE2 /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = ""; }; + 35FF880C9AC47A0BE67D71B6C1F6D23E /* UIImage+Snapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Snapshot.m"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.m"; sourceTree = ""; }; + 37EB0E5F21B8DF77682169F98DF4D517 /* Nimble-Snapshots-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Nimble-Snapshots-Info.plist"; sourceTree = ""; }; + 38C0CE47FA06598072C3124E86D80CD2 /* ToSucceed.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToSucceed.swift; path = Sources/Nimble/Matchers/ToSucceed.swift; sourceTree = ""; }; + 39F185BDDF6C39C4F6D3DAE81F1FC747 /* ErrorUtility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtility.swift; path = Sources/Quick/ErrorUtility.swift; sourceTree = ""; }; + 3BEECC02B14151DF89285DD48A0423C0 /* CwlCatchException.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m; sourceTree = ""; }; + 427DE31D87258521F073799B7866B429 /* mach_excServer.c */ = {isa = PBXFileReference; includeInIndex = 1; name = mach_excServer.c; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.c; sourceTree = ""; }; + 44BEC81CF120F8E81EB6AC965FC1AAC5 /* iOSSnapshotTestCase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = iOSSnapshotTestCase.xcconfig; sourceTree = ""; }; + 45544E7DC8BC621B5141430C9031836E /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 457FF1E51B0643AC5CA1CDC126F8B7E7 /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; + 458EB16A2ACD11BB7A37EBF15862B673 /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; + 4820DEAB84B6336402B3DD158B4A675D /* Pods-PopTip Demo-PopTip Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip Demo-PopTip Extension.debug.xcconfig"; sourceTree = ""; }; + 4847F6833DFA9EA7E30295B3E090E914 /* HooksPhase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HooksPhase.swift; path = Sources/Quick/Hooks/HooksPhase.swift; sourceTree = ""; }; + 4B93FEA022F9C354860E8CD479B52F7B /* AMPopTip.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AMPopTip.modulemap; sourceTree = ""; }; + 4CF9B12D157D3309DCA2370D6A3CA016 /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; + 4F2E0D315F2410613BA14A38CA2ED88B /* UIApplication+StrictKeyWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+StrictKeyWindow.h"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h"; sourceTree = ""; }; + 50EF3379B6D43717264C31C21B98F60A /* Pods-PopTip DemoTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PopTip DemoTests.modulemap"; sourceTree = ""; }; + 51505ACCBF45D68A8F196B8AD6FC5AB2 /* PrettySyntax.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PrettySyntax.swift; sourceTree = ""; }; + 52C1B30CC4697E1933141720223103BC /* Nimble_Snapshots.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Nimble_Snapshots.framework; path = "Nimble-Snapshots.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 53674FC635783FCD6E4031030EB2C49D /* AMPopTip-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AMPopTip-dummy.m"; sourceTree = ""; }; + 5446A240CA8FCE9A13EA84D5D52D557B /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; + 549566E54D67BEE641217B82B24372AD /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; + 54B5AEF2409826FEC0790DCF2689EBAA /* QuickSpecBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpecBase.m; path = Sources/QuickSpecBase/QuickSpecBase.m; sourceTree = ""; }; + 57DA5CB443284A053CD9C52DCC7CD824 /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/NimbleObjectiveC/NMBStringify.h; sourceTree = ""; }; + 5832F8BA08F7360333A275742B6F438B /* iOSSnapshotTestCase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = iOSSnapshotTestCase.modulemap; sourceTree = ""; }; + 58614353D118D3A6F78C499633F1A6D8 /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = ""; }; + 5AE28B019064889B4A4ECA189A044049 /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = ""; }; + 5D8C0A8C96756D8AE5F9FD95C6E3AFDA /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; + 617C957328EDAB079A8AA3A90A105817 /* Nimble-Snapshots-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-Snapshots-umbrella.h"; sourceTree = ""; }; + 64DD70AF183E230D3FBD85D324D0C889 /* PrettyDynamicTypeSyntax.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrettyDynamicTypeSyntax.swift; path = DynamicType/PrettyDynamicTypeSyntax.swift; sourceTree = ""; }; + 66191B95C8CF1D7DEA5B877F203CEE8A /* QCKDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QCKDSL.m; path = Sources/QuickObjectiveC/DSL/QCKDSL.m; sourceTree = ""; }; + 66B56FE6C05BC5F71C59AA94B38A7E18 /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; + 6A0F708100BC0B67488C645A10FF4C5A /* Quick-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-prefix.pch"; sourceTree = ""; }; + 6AA2BECE95F2A026271D50BA77BB5BC3 /* ThrowAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowAssertion.swift; path = Sources/Nimble/Matchers/ThrowAssertion.swift; sourceTree = ""; }; + 6DF17887D5A01ECD951295F8FCE8B5A7 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; + 6E4461403C6166F02030AF7696A2202B /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; + 722471BD3E66A547D4DACA48CBA0D377 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = FBSnapshotTestCase/SwiftSupport.swift; sourceTree = ""; }; + 72562FF8AB2C0306DEC949BE3EC92DFA /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Matchers/Async.swift; sourceTree = ""; }; + 74D05D5BE1D85D6F300242441A3281AD /* Pods-PopTip Demo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PopTip Demo-dummy.m"; sourceTree = ""; }; + 757CCA4A47F729BEE8C049B092500B0F /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; + 75C667F49551B841433528B76D871AD6 /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = ""; }; + 771D70A5A8C057A08E4D24F470C30343 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; + 776372E9EDA056B7122D3C5A92F75DD3 /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = ""; }; + 77B4A2C4CA7A7DB659E23CC41DDF4E0F /* Pods-PopTip Demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip Demo.release.xcconfig"; sourceTree = ""; }; + 78EF2544CBA242DCEDFA0FD3A8550F77 /* FBSnapshotTestCasePlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCasePlatform.m; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.m; sourceTree = ""; }; + 794DD0D675B9627F71B46EDA54C7690B /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; + 7AB3A5645D465FD6488E5A06104A9E8E /* iOSSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "iOSSnapshotTestCase-prefix.pch"; sourceTree = ""; }; + 7BED3906A4660DD61D0D46DC3CE1C209 /* Pods-PopTip Demo-PopTip Extension-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PopTip Demo-PopTip Extension-umbrella.h"; sourceTree = ""; }; + 7DB2549C63F8F8E4DDEA345919EA2532 /* Predicate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Predicate.swift; path = Sources/Nimble/Matchers/Predicate.swift; sourceTree = ""; }; + 7F68FEE6E54A62DF21C1EF04027B707B /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; + 801CD80B8C9E02A17D94365EFC44CC05 /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; + 816630637C31E2DE523DAF4887E09104 /* iOSSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "iOSSnapshotTestCase-dummy.m"; sourceTree = ""; }; + 82679AE3C180B90F7539DA5CBFD6EC65 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Quick/Configuration/Configuration.swift; sourceTree = ""; }; + 842619618535AF2FB52CC59D12438F25 /* World.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = World.swift; path = Sources/Quick/World.swift; sourceTree = ""; }; + 84FBD80DD035600356849790FADF19DD /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; + 86552199BD8C16AD15523853E138CDB8 /* Nimble-Snapshots-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-Snapshots-dummy.m"; sourceTree = ""; }; + 8ADB745749F0984CF18AAD70767AE6BB /* Pods-PopTip DemoTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PopTip DemoTests-dummy.m"; sourceTree = ""; }; + 8C7214E6F94E32716417A8B6A0C84450 /* DynamicSizeSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DynamicSizeSnapshot.swift; path = DynamicSize/DynamicSizeSnapshot.swift; sourceTree = ""; }; + 8C95D72193B8B0961AE8D60FA1D3F419 /* AMPopTip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AMPopTip.framework; path = AMPopTip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8DFA468D22FC91521E9F1E1EDE6B81E1 /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; + 8E1C3D489386B7006942DE8E0FC44A33 /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = ""; }; + 8EA27625EF08D49B80BCF45CF50DE0A0 /* QuickSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpec.m; path = Sources/QuickObjectiveC/QuickSpec.m; sourceTree = ""; }; + 8FE64506CA36721A7EC394AF3FE32ECC /* AMPopTip-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AMPopTip-Info.plist"; sourceTree = ""; }; + 90147AA8A30685521367F0954EEDEF77 /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; + 9060C38D29BFD361123C95FF5C6A1EBE /* SuiteHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SuiteHooks.swift; path = Sources/Quick/Hooks/SuiteHooks.swift; sourceTree = ""; }; + 914EC005836744BC81C1E6806DE590E4 /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = ""; }; + 9391798D983F425114DD4CF2BE4B7019 /* AMPopTip-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AMPopTip-umbrella.h"; sourceTree = ""; }; + 93D1F0FD3A520716EAB57C86305C73EA /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; + 95A8CDEB6B067ACC3C1460EBB6A38355 /* QuickTestSuite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickTestSuite.swift; path = Sources/Quick/QuickTestSuite.swift; sourceTree = ""; }; + 9607F80FE9EAA3750F804148C4E47DD9 /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; + 97DDC2BC2F135191F3B2B5979756FF2F /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; + 98DC850735213DD8DC39BDF03726C02D /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/NimbleObjectiveC/DSL.h; sourceTree = ""; }; + 9910AD9D05F97196F120DA9DB1EEB561 /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/NimbleObjectiveC/NMBStringify.m; sourceTree = ""; }; + 9C3E007B7FA8AF37AEC180AB0D6EF435 /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + A4112965F20575018ABFB75F3DC568E5 /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = ""; }; + A42885061107151E73CCC3780CFEDBF8 /* Pods_PopTip_Demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_PopTip_Demo.framework; path = "Pods-PopTip Demo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + A69EB16895D0FDA9699EED91A3CFB841 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + A9425B226A11A028EB75DCF5A3971F7A /* Nimble-Snapshots-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-Snapshots-prefix.pch"; sourceTree = ""; }; + A98A26F8B175EB5DB136F0C98A8DF2CE /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; + AA93B0819FA713215D0F70FC26BAF9A1 /* QuickSpecBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpecBase.h; path = Sources/QuickSpecBase/include/QuickSpecBase.h; sourceTree = ""; }; + ABA0EEBD3AB68FDBD49236B6BCA09C0E /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/NimbleObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; + ACEFE6092716EB9D9919CCCC080BA096 /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlMachBadInstructionHandler.m; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m; sourceTree = ""; }; + AE050D71F3F50D4CEF04E268ED579593 /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlMachBadInstructionHandler.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h; sourceTree = ""; }; + AED70F012F628E1EE40BB18340BC6AE5 /* ExpectationMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpectationMessage.swift; path = Sources/Nimble/ExpectationMessage.swift; sourceTree = ""; }; + AF0FC4B74774AC1644D1B62CBDC0CCBF /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + B15935D99DADF2B82D7FBA4580A3AB48 /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/NimbleObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; + B15F62C6169AD33D7C74A8505BE4A2BC /* Pods-PopTip DemoTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PopTip DemoTests-Info.plist"; sourceTree = ""; }; + B5F92116778B602CBECF30F63EF2A398 /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+CurrentTestBundle.swift"; path = "Sources/Quick/NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; + B63094C132EA561551C42A5D3A28C2A7 /* AMPopTip.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = AMPopTip.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + B91B00F8BE943329D633234BD67AE0AC /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FBSnapshotTestCase.framework; path = iOSSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B98247D2A5CDAC2BBB5AAB8F2169B5B2 /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlPreconditionTesting.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h; sourceTree = ""; }; + BA809B4503458EBD9232CEC162A187BB /* URL+FileName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+FileName.swift"; path = "Sources/Quick/URL+FileName.swift"; sourceTree = ""; }; + BAE263041362D074978BB3B577DF0A05 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Nimble.framework; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BB928B3942DD336F5FDA58A94B7DDF0E /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Quick/Filter.swift; sourceTree = ""; }; + BE83FD1192F49434FF3A9FCFC1A5FBB7 /* Nimble-Snapshots.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Nimble-Snapshots.xcconfig"; sourceTree = ""; }; + BF3912C08A389327C68738040FE8A3FB /* Pods-PopTip Demo-PopTip Extension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PopTip Demo-PopTip Extension-Info.plist"; sourceTree = ""; }; + C06EDBC72F62E7C014B818EDF4DD7185 /* mach_excServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.h; sourceTree = ""; }; + C0A4655992E2B7FDF67D71B50A72BE98 /* CwlCatchException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlCatchException.h; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h; sourceTree = ""; }; + C0F5452E9ACE24C3CCDD5AD0E1DC54D3 /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.h"; sourceTree = ""; }; + C21E0AC194284CF8B648DA4B64F3317C /* ExampleGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleGroup.swift; path = Sources/Quick/ExampleGroup.swift; sourceTree = ""; }; + C2207EF102E3CE591887BD781FF4C3DC /* Pods_PopTip_Demo_PopTip_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_PopTip_Demo_PopTip_Extension.framework; path = "Pods-PopTip Demo-PopTip Extension.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + C2C1A51547E7FC5A1A44CC5D0D33ECF8 /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; + C3F46CD48E3D7F22C92FE0F2AE7C406E /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; + C483427D7E1E89FD0C6B01538703B51C /* Quick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Quick.modulemap; sourceTree = ""; }; + C4AD3E2F112177E28AAE754DA0E1FD47 /* Pods-PopTip Demo-PopTip Extension.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PopTip Demo-PopTip Extension.modulemap"; sourceTree = ""; }; + C738934C04B06690799FACDD903F02FD /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; + C80A29887E8AD6E84D61A7B287DAEC00 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Nimble.modulemap; sourceTree = ""; }; + C889B3F54F41565788AFAC6788A5051D /* Pods-PopTip Demo-PopTip Extension-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PopTip Demo-PopTip Extension-acknowledgements.plist"; sourceTree = ""; }; + C922B693EF054A359253A2DCD002659B /* SatisfyAllOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAllOf.swift; path = Sources/Nimble/Matchers/SatisfyAllOf.swift; sourceTree = ""; }; + C92902D7AFAA229368DB418AA6E41C19 /* String+C99ExtendedIdentifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+C99ExtendedIdentifier.swift"; path = "Sources/Quick/String+C99ExtendedIdentifier.swift"; sourceTree = ""; }; + C944F04F2681BC2B774FE1515F995C7E /* XCTestObservationCenter+CurrentTestCaseTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XCTestObservationCenter+CurrentTestCaseTracker.m"; sourceTree = ""; }; + CBF934CBEFF2DB148CE79145218C4D8C /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = ""; }; + CDA770A5FA56BA994479CA469A112A3C /* Pods-PopTip Demo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PopTip Demo-acknowledgements.plist"; sourceTree = ""; }; + CF4CEEC5B35DEC042C282CE171C3C3A5 /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = ""; }; + CF612393C3D67698960F96C69B12CA78 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + CFB02D05A3119C76380A1DE5E57855AD /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; + D2CB7D4CE909C3C30C1AE0026F24F4D4 /* NBSMockedApplication.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NBSMockedApplication.m; path = DynamicType/NBSMockedApplication.m; sourceTree = ""; }; + D39A40C71DE754453C3B7DA33F478EE2 /* Pods-PopTip DemoTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip DemoTests.debug.xcconfig"; sourceTree = ""; }; + D5660F8345FF229BC549B6BE87739A0E /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; + D64AECBC6C07B9747CCF0BB77B617D94 /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; + D6761FE3D3B7DC161EB60F661BFDA3E4 /* UIApplication+StrictKeyWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+StrictKeyWindow.m"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m"; sourceTree = ""; }; + D713B9E524F483EE11FC3AE462E8096B /* NBSMockedApplication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NBSMockedApplication.h; path = DynamicType/NBSMockedApplication.h; sourceTree = ""; }; + D9DBB4EB9D90A8E2417A2E49615E4C84 /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; + DACB4178AED23E9AC3057071D3DFB1B1 /* HaveValidDynamicTypeSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveValidDynamicTypeSnapshot.swift; path = DynamicType/HaveValidDynamicTypeSnapshot.swift; sourceTree = ""; }; + DC3F79D151D1359340CD9C43B7F5E37E /* PopTip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PopTip.swift; path = Source/PopTip.swift; sourceTree = ""; }; + DD03F98CAA30F2774995685916D56CCC /* World+DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "World+DSL.swift"; path = "Sources/Quick/DSL/World+DSL.swift"; sourceTree = ""; }; + DD8FC6C230837A3526466F7BC977F1A1 /* Pods-PopTip DemoTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip DemoTests.release.xcconfig"; sourceTree = ""; }; + DE4168D8F28E5CBE12B9473C483EDF25 /* Quick-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Quick-Info.plist"; sourceTree = ""; }; + DF981A059B70258424AF4D29AEBC9454 /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; + E267DB7A1382D87C9F398D09239F499D /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Quick/DSL/DSL.swift; sourceTree = ""; }; + E64E3AC67B5FBEFF5A6E40CEF2B0CE1C /* CwlCatchException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchException.swift; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift; sourceTree = ""; }; + E6C7980DFBFA31EF29A37B7F3239F24A /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; + E7D7BE47BE4AF0C626764A4374E285D5 /* Pods-PopTip Demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PopTip Demo.debug.xcconfig"; sourceTree = ""; }; + E8EA8C0AF2541D4E516150CB57EC366C /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickSelectedTestSuiteBuilder.swift; path = Sources/Quick/QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; + EC7A924813A1B64057DA6B84FC76E929 /* Callsite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Callsite.swift; path = Sources/Quick/Callsite.swift; sourceTree = ""; }; + EFB34B3CBFE55697AF334ABD46862046 /* iOSSnapshotTestCase-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "iOSSnapshotTestCase-umbrella.h"; sourceTree = ""; }; + F07F75DDE011945316BC63B51F7DC0E4 /* PopTip+Draw.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PopTip+Draw.swift"; path = "Source/PopTip+Draw.swift"; sourceTree = ""; }; + F1F9266FD7BFF942C677686BAB1B6E8F /* Pods-PopTip Demo-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PopTip Demo-Info.plist"; sourceTree = ""; }; + F2461D3B9700D77CBBB5FC22B35A23C3 /* Quick.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Quick.xcconfig; sourceTree = ""; }; + F3676A422AE53111BF1A243747167EC7 /* Pods-PopTip Demo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PopTip Demo-acknowledgements.markdown"; sourceTree = ""; }; + F3676AE16C181911D9CF291CFFAC641F /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; + F488A4760800EF84AD10500DC1EDBF9F /* Pods-PopTip Demo-PopTip Extension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PopTip Demo-PopTip Extension-dummy.m"; sourceTree = ""; }; + F6E59B66B3386B9937C5E59BA848B7D9 /* Nimble-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Nimble-Info.plist"; sourceTree = ""; }; + F888E5F770D6CF353FD1959B01A6691C /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; + F9517383C4FF0E07EE470E4B8027609D /* HaveValidSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HaveValidSnapshot.swift; sourceTree = ""; }; + FA11BB65626CB452ECA194818128ADE8 /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = ""; }; + FC0AEC1C0265D16A03E08E0941C0BD6D /* AMPopTip.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AMPopTip.xcconfig; sourceTree = ""; }; + FC11BE14883923B38508DBD6CC6FB80D /* QCKDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QCKDSL.h; path = Sources/QuickObjectiveC/DSL/QCKDSL.h; sourceTree = ""; }; + FDA6F2ABC91EC5DE29B60B94872BB799 /* UIImage+Snapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Snapshot.h"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.h"; sourceTree = ""; }; + FEA2D10C8A8DD85BB7F4FE21E2AFCEE4 /* Await.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Await.swift; path = Sources/Nimble/Utils/Await.swift; sourceTree = ""; }; + FF67788B345263FB9CF1BD20D29E5616 /* QuickConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickConfiguration.m; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 06A086085916D88E8F989A2FD78DFDFB /* Frameworks */ = { + 0B8AE404673E2EBB324F285A600856F9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0D5E847B5619856E1C22A74EC898F69C /* Foundation.framework in Frameworks */, - 0441E82476A9178178DF00C2AEE41E9A /* QuartzCore.framework in Frameworks */, - 8CAC3B81FFAB2342335164D30A3ACCD1 /* UIKit.framework in Frameworks */, - 620002D55F8D093DFB3E88E2CF8DCC60 /* XCTest.framework in Frameworks */, + 5BDB0BB5F464064DF78D998FB490324F /* Foundation.framework in Frameworks */, + 083A75C30AFB7EF0C51EC28566B05F0A /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 0DC9B3C2B450E19193F59BECC4A12432 /* Frameworks */ = { + 205EE39304CF46DE87DD2F729DF30EA2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 50C6CDF9ED61F6B7E94F4087193D157F /* Foundation.framework in Frameworks */, + 48BF60116173CA26B2A55721C84E3577 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1BE6CEEEA9148E12469FA47512274026 /* Frameworks */ = { + 3FE930DCE9E026F62620F6474C3DE339 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0EDC36C0490643ED502433D2D90ABFAC /* FBSnapshotTestCase.framework in Frameworks */, - 6960BD73C375AA5CDEDF6DA52F4366BB /* Foundation.framework in Frameworks */, - 3BA0FA446E2F931B2FFA742A7D670CFB /* Nimble.framework in Frameworks */, - 050C3DB9D8A0618E27E6CDCBBC4D0751 /* Quick.framework in Frameworks */, - 88955A85C280C5359D5A0813CAAC7AF5 /* XCTest.framework in Frameworks */, + 5AE2ED77BA86597A13D0AAADABE223DA /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 374A163662675E740DCFC0901FF580C4 /* Frameworks */ = { + 7496AA0F9C0AFCFDB7C9AC94228777FD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AA999CC4B511B81070CF52A82ABE8D64 /* Foundation.framework in Frameworks */, + 9547CB19FDE142845886215F8292743C /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8B2EA19AF3EFC9F90622E3C2759396B2 /* Frameworks */ = { + A461685461BB4315D69973BB36A7B372 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B44D1B1F2A44DC52FB8BB28722C5E5C6 /* Foundation.framework in Frameworks */, - 433396CB963D73E4EEE8C088BD1846ED /* XCTest.framework in Frameworks */, + 04E1104FF1409C80A30C88127DB8B00A /* FBSnapshotTestCase.framework in Frameworks */, + 75FA9B86128B755B52CB43776F957AF6 /* Foundation.framework in Frameworks */, + F796E637335D81BEE579B0C55EF4740A /* Nimble.framework in Frameworks */, + E2BA3851285ADED1721B51CA11E5F423 /* UIKit.framework in Frameworks */, + 31A28ED184C9E499BF5938BA28421EC5 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8BB27AC12ED87E21960A3CE8AA95603A /* Frameworks */ = { + A7EDD7975CD88AD39BAE0D6484C32803 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 47B24101FE19A3F463172E99B8533BB2 /* Foundation.framework in Frameworks */, + CA9A2D74A41B640925B521CEC8BBEACE /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9063E289DDB817B6DCAD6CCEBB603904 /* Frameworks */ = { + C95B465AEBE469905C5C4BF4BC976C9D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D7F8383722DFF7BF7B1E0F52C0BA47A7 /* Foundation.framework in Frameworks */, + 58906F0519B886C86E75EFDF9B19E583 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - EFFCBFA6A6F2B7DB88D3FD0FFB9C71D0 /* Frameworks */ = { + C9BA99C942A9048FBC29B2561ADA7771 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E6E9BF397832B3D0BCB180DE0908CD22 /* Foundation.framework in Frameworks */, + 08CF38FAB9CFF343D7DD1E0A81DAA3F3 /* Foundation.framework in Frameworks */, + 8A63B9526F71A89D8B1A65F7C06575E5 /* QuartzCore.framework in Frameworks */, + B8A381670CA0CF6BDED298016F1D0ADB /* UIKit.framework in Frameworks */, + 12884A23B3D5CC0808DEA9CCC8B3CE0B /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 00AC1B4DD2691E6E3860EE0B17D13589 /* iOS */ = { + 21F57E7B96D1D61D8FA70F6E9634E412 /* Core */ = { isa = PBXGroup; children = ( - C1B63E3F762193D0F5F4885F902901C9 /* Foundation.framework */, - B9FBA954D16459F058707875128D6601 /* QuartzCore.framework */, - 1239435489E90E8C7AFE533CC73B9FFC /* UIKit.framework */, - 3F5144EB7A5CE1319BA01732015410A0 /* XCTest.framework */, + 026D97C2FA7EEB539B0EFBF49198FFC0 /* CurrentTestCaseTracker.swift */, + 8C7214E6F94E32716417A8B6A0C84450 /* DynamicSizeSnapshot.swift */, + DACB4178AED23E9AC3057071D3DFB1B1 /* HaveValidDynamicTypeSnapshot.swift */, + F9517383C4FF0E07EE470E4B8027609D /* HaveValidSnapshot.swift */, + D713B9E524F483EE11FC3AE462E8096B /* NBSMockedApplication.h */, + D2CB7D4CE909C3C30C1AE0026F24F4D4 /* NBSMockedApplication.m */, + 64DD70AF183E230D3FBD85D324D0C889 /* PrettyDynamicTypeSyntax.swift */, + 51505ACCBF45D68A8F196B8AD6FC5AB2 /* PrettySyntax.swift */, + 18646BF9FBC76BD2DBAD4C04BF49EB56 /* XCTestObservationCenter+CurrentTestCaseTracker.h */, + C944F04F2681BC2B774FE1515F995C7E /* XCTestObservationCenter+CurrentTestCaseTracker.m */, ); - name = iOS; + name = Core; sourceTree = ""; }; - 0F4D8CA5E78DCD216B37EE82664ACED7 /* Pods */ = { + 2F439AEC6253322440C73BF9FBADE2AE /* iOS */ = { isa = PBXGroup; children = ( - EFED083876D9A383F7BE275BDD0E791A /* FBSnapshotTestCase */, - D26C2B202766521A3CD518CE118B6EE8 /* Nimble */, - 69B02B731E91889ED475FF20F4661235 /* Nimble-Snapshots */, - DBE709DEA59B46B317ADA773737E0E51 /* Quick */, + 148E9B9B88A6C299608B94017E20CF78 /* Foundation.framework */, + A69EB16895D0FDA9699EED91A3CFB841 /* QuartzCore.framework */, + AF0FC4B74774AC1644D1B62CBDC0CCBF /* UIKit.framework */, + 0E906E59597539202C0610CB360AA2AC /* XCTest.framework */, ); - name = Pods; + name = iOS; sourceTree = ""; }; - 1CA39E46997E3AC5878BC0635D44DBA8 /* Development Pods */ = { + 3594EBEB7BC012D22E7D29E59D934AEA /* Pods-PopTip Demo */ = { isa = PBXGroup; children = ( - CF5C02BB58844DA82982D3E6F1CA0FCA /* AMPopTip */, + 25C2AEE6A46162DE157A08064E5AB5C6 /* Pods-PopTip Demo.modulemap */, + F3676A422AE53111BF1A243747167EC7 /* Pods-PopTip Demo-acknowledgements.markdown */, + CDA770A5FA56BA994479CA469A112A3C /* Pods-PopTip Demo-acknowledgements.plist */, + 74D05D5BE1D85D6F300242441A3281AD /* Pods-PopTip Demo-dummy.m */, + 0E5D10698DAE56D593822E63EE8C6981 /* Pods-PopTip Demo-frameworks.sh */, + F1F9266FD7BFF942C677686BAB1B6E8F /* Pods-PopTip Demo-Info.plist */, + 0879EADE7D4ACAC1DA006E2CD538C89C /* Pods-PopTip Demo-umbrella.h */, + E7D7BE47BE4AF0C626764A4374E285D5 /* Pods-PopTip Demo.debug.xcconfig */, + 77B4A2C4CA7A7DB659E23CC41DDF4E0F /* Pods-PopTip Demo.release.xcconfig */, ); - name = "Development Pods"; + name = "Pods-PopTip Demo"; + path = "Target Support Files/Pods-PopTip Demo"; sourceTree = ""; }; - 2848DDB4A7E9CFD8955AAC8179399CEA /* Support Files */ = { + 40BD6D69F94AE14B83E1E0BF916AD79C /* Support Files */ = { isa = PBXGroup; children = ( - 9438D3352E59EFE5B037938D52056A5F /* Info.plist */, - 827ABD4BCDD133C35C19991F404FB5CB /* Nimble-Snapshots.modulemap */, - 3EF04624DD2E36F6DCF48192237D69C0 /* Nimble-Snapshots.xcconfig */, - 8E1E6D2530699EF2C37E3EFD8BE5375A /* Nimble-Snapshots-dummy.m */, - 37C2B84135CCB66ADD70DE89AC49470C /* Nimble-Snapshots-prefix.pch */, - 99E06DECECD216DE63EE31ADA380903B /* Nimble-Snapshots-umbrella.h */, + 5832F8BA08F7360333A275742B6F438B /* iOSSnapshotTestCase.modulemap */, + 44BEC81CF120F8E81EB6AC965FC1AAC5 /* iOSSnapshotTestCase.xcconfig */, + 816630637C31E2DE523DAF4887E09104 /* iOSSnapshotTestCase-dummy.m */, + 2282B8C1CC3D43B3BC491CC708CC6DD8 /* iOSSnapshotTestCase-Info.plist */, + 7AB3A5645D465FD6488E5A06104A9E8E /* iOSSnapshotTestCase-prefix.pch */, + EFB34B3CBFE55697AF334ABD46862046 /* iOSSnapshotTestCase-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/Nimble-Snapshots"; + path = "../Target Support Files/iOSSnapshotTestCase"; sourceTree = ""; }; - 3012F455BBC5815D619D3B440663BE9A /* Support Files */ = { + 4F83457C021BD1B7DF57BE87A1D1B982 /* Nimble-Snapshots */ = { isa = PBXGroup; children = ( - BF173B6C91E02D5EE9058226B8FD986E /* FBSnapshotTestCase.modulemap */, - 7418799601C5233F8AA944A973038A0E /* FBSnapshotTestCase.xcconfig */, - 55FABD10E6037E17B665DAC595804BE3 /* FBSnapshotTestCase-dummy.m */, - 48E8F87724B4B0B2B7E068CEC5527F1F /* FBSnapshotTestCase-prefix.pch */, - 88485691E194EC0CB12DDA71F1D587AE /* FBSnapshotTestCase-umbrella.h */, - 448CA51987CE6291BE508DA98DE482C2 /* Info.plist */, + 21F57E7B96D1D61D8FA70F6E9634E412 /* Core */, + B16C288D91E17AD216B2BDE399B3B967 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/FBSnapshotTestCase"; + name = "Nimble-Snapshots"; + path = "Nimble-Snapshots"; sourceTree = ""; }; - 39DBCD3F57A94591F718AE388E0EF2B6 /* Support Files */ = { + 501B33CD1B2B54598C1D96174FD67D4A /* Targets Support Files */ = { isa = PBXGroup; children = ( - 65E04B2F5BF1AB6E9F1AA38CE3992D5F /* Info.plist */, - 79E287A68710AA7D39DB0CE48C5DB7FE /* Quick.modulemap */, - 358056853B23BC31B163CD395B599989 /* Quick.xcconfig */, - B72658AAC63485EC8389B0CE3CC50073 /* Quick-dummy.m */, - E4A442AAC6E3C3AA74778A7DBFBC9D12 /* Quick-prefix.pch */, - 337D4C77FBC9661BA25F39DBC66F7608 /* Quick-umbrella.h */, + 3594EBEB7BC012D22E7D29E59D934AEA /* Pods-PopTip Demo */, + A4E6DDBED0762A5EECF83048AAA9BBE7 /* Pods-PopTip Demo-PopTip Extension */, + 601EF0BA5A34C650509E218D7696A26C /* Pods-PopTip DemoTests */, ); - name = "Support Files"; - path = "../Target Support Files/Quick"; + name = "Targets Support Files"; sourceTree = ""; }; - 55E137E8CCD3289FCF33869C63FD3781 /* Pods-PopTip Demo */ = { + 575B627A2257A978DB140A8AAD6374EF /* SwiftSupport */ = { isa = PBXGroup; children = ( - 0215C89FEA308568EF39F024112B16C1 /* Info.plist */, - E23630385A137C80DEF389D0F212AD2D /* Pods-PopTip Demo.modulemap */, - 87E88200A32D3F991FBB2EE310648D4D /* Pods-PopTip Demo-acknowledgements.markdown */, - 646E48DE9B5A00D00F0697B7B6BF21A0 /* Pods-PopTip Demo-acknowledgements.plist */, - EB0DE31AD3CD393B3D20940778E3357A /* Pods-PopTip Demo-dummy.m */, - 12A30BF535E32FD741E10F451317E48C /* Pods-PopTip Demo-frameworks.sh */, - A851C24AE2070B0BB31ABAE36FCB332C /* Pods-PopTip Demo-resources.sh */, - 944113E34DBD9E144377D74B77B8AFA5 /* Pods-PopTip Demo-umbrella.h */, - 5EC130C8726E17D4A7AD48C7AA65E98C /* Pods-PopTip Demo.debug.xcconfig */, - B4D6CF2C609AEBC327DB671A80B15215 /* Pods-PopTip Demo.release.xcconfig */, + 722471BD3E66A547D4DACA48CBA0D377 /* SwiftSupport.swift */, ); - name = "Pods-PopTip Demo"; - path = "Target Support Files/Pods-PopTip Demo"; + name = SwiftSupport; sourceTree = ""; }; - 69B02B731E91889ED475FF20F4661235 /* Nimble-Snapshots */ = { + 5EFB8390A95380058F951CFE8F64F38E /* Support Files */ = { isa = PBXGroup; children = ( - A833B199BAF880845CB0161924B164FB /* Core */, - 2848DDB4A7E9CFD8955AAC8179399CEA /* Support Files */, + C80A29887E8AD6E84D61A7B287DAEC00 /* Nimble.modulemap */, + 2BB292F6F1FB8257E7CB4D025DED6477 /* Nimble.xcconfig */, + 66B56FE6C05BC5F71C59AA94B38A7E18 /* Nimble-dummy.m */, + F6E59B66B3386B9937C5E59BA848B7D9 /* Nimble-Info.plist */, + 93D1F0FD3A520716EAB57C86305C73EA /* Nimble-prefix.pch */, + 31ADFA7C467BD79B9720CB46BE91E237 /* Nimble-umbrella.h */, ); - path = "Nimble-Snapshots"; + name = "Support Files"; + path = "../Target Support Files/Nimble"; sourceTree = ""; }; - 722473FBEA3446DE6363D4528C4A17B5 /* Support Files */ = { + 5F95AC285B387E63316800145FE1C84E /* Nimble */ = { isa = PBXGroup; children = ( - 235C388FD38AF5655B2496AB1B39654C /* AMPopTip.modulemap */, - 838BDCB41F1D11978C41C12669A7E0DA /* AMPopTip.xcconfig */, - 25008CFC844419E328CDA5DD64931476 /* AMPopTip-dummy.m */, - CB2DE747AE99E711347498EDEACACD67 /* AMPopTip-prefix.pch */, - D55C59E01DA87D94B05AE79BEBC939D2 /* AMPopTip-umbrella.h */, - DBF153DE7E37A9C29A2FD465BA1F4259 /* Info.plist */, + D5660F8345FF229BC549B6BE87739A0E /* AdapterProtocols.swift */, + 15EDB01CB3502491A3E14C5F1F6372A4 /* AllPass.swift */, + D64AECBC6C07B9747CCF0BB77B617D94 /* AssertionDispatcher.swift */, + F3676AE16C181911D9CF291CFFAC641F /* AssertionRecorder.swift */, + 72562FF8AB2C0306DEC949BE3EC92DFA /* Async.swift */, + FEA2D10C8A8DD85BB7F4FE21E2AFCEE4 /* Await.swift */, + C738934C04B06690799FACDD903F02FD /* BeAKindOf.swift */, + 0F54BC0EDEDFF2EC643E6396C5BBC5E4 /* BeAnInstanceOf.swift */, + 31F31BFA1E2AF673395696D728BF67DD /* BeCloseTo.swift */, + E6C7980DFBFA31EF29A37B7F3239F24A /* BeEmpty.swift */, + 90147AA8A30685521367F0954EEDEF77 /* BeginWith.swift */, + C3F46CD48E3D7F22C92FE0F2AE7C406E /* BeGreaterThan.swift */, + 6E4461403C6166F02030AF7696A2202B /* BeGreaterThanOrEqualTo.swift */, + F888E5F770D6CF353FD1959B01A6691C /* BeIdenticalTo.swift */, + 97DDC2BC2F135191F3B2B5979756FF2F /* BeLessThan.swift */, + 16539750D9EFF0E955E181605ADB6D9B /* BeLessThanOrEqual.swift */, + 2F5504AB8ABB40327EDED6FF1F758ECB /* BeLogical.swift */, + 9607F80FE9EAA3750F804148C4E47DD9 /* BeNil.swift */, + 4CF9B12D157D3309DCA2370D6A3CA016 /* BeVoid.swift */, + 16AA411713E3824B112BDF63A25A3366 /* Contain.swift */, + 070EAFBFFD05CF9A629B33C086F8C044 /* ContainElementSatisfying.swift */, + C2C1A51547E7FC5A1A44CC5D0D33ECF8 /* CwlBadInstructionException.swift */, + 8E1C3D489386B7006942DE8E0FC44A33 /* CwlCatchBadInstruction.swift */, + C0A4655992E2B7FDF67D71B50A72BE98 /* CwlCatchException.h */, + 3BEECC02B14151DF89285DD48A0423C0 /* CwlCatchException.m */, + E64E3AC67B5FBEFF5A6E40CEF2B0CE1C /* CwlCatchException.swift */, + 5D8C0A8C96756D8AE5F9FD95C6E3AFDA /* CwlDarwinDefinitions.swift */, + AE050D71F3F50D4CEF04E268ED579593 /* CwlMachBadInstructionHandler.h */, + ACEFE6092716EB9D9919CCCC080BA096 /* CwlMachBadInstructionHandler.m */, + B98247D2A5CDAC2BBB5AAB8F2169B5B2 /* CwlPreconditionTesting.h */, + 98DC850735213DD8DC39BDF03726C02D /* DSL.h */, + 259D1E0C519F51448A0385DDD2262885 /* DSL.m */, + 549566E54D67BEE641217B82B24372AD /* DSL.swift */, + 458EB16A2ACD11BB7A37EBF15862B673 /* DSL+Wait.swift */, + 9C3E007B7FA8AF37AEC180AB0D6EF435 /* EndWith.swift */, + 0B8F71B06EB98731EC5EC55E16D1B254 /* Equal.swift */, + 6DF17887D5A01ECD951295F8FCE8B5A7 /* Errors.swift */, + DF981A059B70258424AF4D29AEBC9454 /* Expectation.swift */, + AED70F012F628E1EE40BB18340BC6AE5 /* ExpectationMessage.swift */, + A98A26F8B175EB5DB136F0C98A8DF2CE /* Expression.swift */, + 16034379DA29A9DD32F21E3F5DED879D /* FailureMessage.swift */, + 84FBD80DD035600356849790FADF19DD /* Functional.swift */, + 457FF1E51B0643AC5CA1CDC126F8B7E7 /* HaveCount.swift */, + 427DE31D87258521F073799B7866B429 /* mach_excServer.c */, + C06EDBC72F62E7C014B818EDF4DD7185 /* mach_excServer.h */, + 801CD80B8C9E02A17D94365EFC44CC05 /* Match.swift */, + CFB02D05A3119C76380A1DE5E57855AD /* MatcherFunc.swift */, + 8DFA468D22FC91521E9F1E1EDE6B81E1 /* MatcherProtocols.swift */, + 05996CE84D591AEC1343BE4B69AC894E /* MatchError.swift */, + 0056A074A7AD864E82CE7AA959554704 /* Nimble.h */, + 794DD0D675B9627F71B46EDA54C7690B /* NimbleEnvironment.swift */, + 7F68FEE6E54A62DF21C1EF04027B707B /* NimbleXCTestHandler.swift */, + B15935D99DADF2B82D7FBA4580A3AB48 /* NMBExceptionCapture.h */, + ABA0EEBD3AB68FDBD49236B6BCA09C0E /* NMBExceptionCapture.m */, + 079F56E0FACD5432FA7CB970FD2BEAC1 /* NMBExpectation.swift */, + 14F6C3D7E8E075ADF356F1346EDA2701 /* NMBObjCMatcher.swift */, + 57DA5CB443284A053CD9C52DCC7CD824 /* NMBStringify.h */, + 9910AD9D05F97196F120DA9DB1EEB561 /* NMBStringify.m */, + 2CC17704266653F292C052BD95FB8CC7 /* PostNotification.swift */, + 7DB2549C63F8F8E4DDEA345919EA2532 /* Predicate.swift */, + 1860B709EB99D6F17F6724DEEDCB1361 /* RaisesException.swift */, + C922B693EF054A359253A2DCD002659B /* SatisfyAllOf.swift */, + 771D70A5A8C057A08E4D24F470C30343 /* SatisfyAnyOf.swift */, + 5446A240CA8FCE9A13EA84D5D52D557B /* SourceLocation.swift */, + 757CCA4A47F729BEE8C049B092500B0F /* Stringers.swift */, + 6AA2BECE95F2A026271D50BA77BB5BC3 /* ThrowAssertion.swift */, + 165C552C9468203078EF29F66A4CA1EF /* ThrowError.swift */, + 38C0CE47FA06598072C3124E86D80CD2 /* ToSucceed.swift */, + 23E34D6C3EA22B9AF4C04DE0182E4AC9 /* XCTestObservationCenter+Register.m */, + 5EFB8390A95380058F951CFE8F64F38E /* Support Files */, ); - name = "Support Files"; - path = "Demo/Pods/Target Support Files/AMPopTip"; + name = Nimble; + path = Nimble; sourceTree = ""; }; - 7B2DE399FAF5CED16EC4E6E5A0E1DE07 /* Pod */ = { + 601EF0BA5A34C650509E218D7696A26C /* Pods-PopTip DemoTests */ = { isa = PBXGroup; children = ( - 398079E2EA6C6447D1A785CEF5E73F4D /* AMPopTip.podspec */, - 5C28FA7274E77A2E5C14E62C3BF4F5E7 /* LICENSE */, - D57E7C5E617EA68F176FF12C645AB883 /* README.md */, + 50EF3379B6D43717264C31C21B98F60A /* Pods-PopTip DemoTests.modulemap */, + 0B505DF714956B038222FE8B375483F0 /* Pods-PopTip DemoTests-acknowledgements.markdown */, + 23ED7CBD4322BE3C6D2CF54E81A02E47 /* Pods-PopTip DemoTests-acknowledgements.plist */, + 8ADB745749F0984CF18AAD70767AE6BB /* Pods-PopTip DemoTests-dummy.m */, + 2567C469A9027D11C5116BACE5DDC493 /* Pods-PopTip DemoTests-frameworks.sh */, + B15F62C6169AD33D7C74A8505BE4A2BC /* Pods-PopTip DemoTests-Info.plist */, + 0AB2961242DB55DD72A6674047C3DE2B /* Pods-PopTip DemoTests-umbrella.h */, + D39A40C71DE754453C3B7DA33F478EE2 /* Pods-PopTip DemoTests.debug.xcconfig */, + DD8FC6C230837A3526466F7BC977F1A1 /* Pods-PopTip DemoTests.release.xcconfig */, ); - name = Pod; + name = "Pods-PopTip DemoTests"; + path = "Target Support Files/Pods-PopTip DemoTests"; sourceTree = ""; }; - 7DB346D0F39D3F0E887471402A8071AB = { + 70A8A94A93AE527D3FAD56B5047CBF1C /* Quick */ = { isa = PBXGroup; children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 1CA39E46997E3AC5878BC0635D44DBA8 /* Development Pods */, - AF3FA1139EC69E065B1C1095C25B2636 /* Frameworks */, - 0F4D8CA5E78DCD216B37EE82664ACED7 /* Pods */, - AF5FED0A4DBBE171EC64B8E2E4512BDB /* Products */, - F3973F835EFFE829496236E5C1A5E88D /* Targets Support Files */, + 204CE1772733F482EFE5EE7602FCEA16 /* Behavior.swift */, + EC7A924813A1B64057DA6B84FC76E929 /* Callsite.swift */, + 5AE28B019064889B4A4ECA189A044049 /* Closures.swift */, + 82679AE3C180B90F7539DA5CBFD6EC65 /* Configuration.swift */, + E267DB7A1382D87C9F398D09239F499D /* DSL.swift */, + 39F185BDDF6C39C4F6D3DAE81F1FC747 /* ErrorUtility.swift */, + 776372E9EDA056B7122D3C5A92F75DD3 /* Example.swift */, + C21E0AC194284CF8B648DA4B64F3317C /* ExampleGroup.swift */, + 27FF8D3E80A764A169804FE073D27CA1 /* ExampleHooks.swift */, + 58614353D118D3A6F78C499633F1A6D8 /* ExampleMetadata.swift */, + BB928B3942DD336F5FDA58A94B7DDF0E /* Filter.swift */, + 4847F6833DFA9EA7E30295B3E090E914 /* HooksPhase.swift */, + B5F92116778B602CBECF30F63EF2A398 /* NSBundle+CurrentTestBundle.swift */, + FC11BE14883923B38508DBD6CC6FB80D /* QCKDSL.h */, + 66191B95C8CF1D7DEA5B877F203CEE8A /* QCKDSL.m */, + 037A99F0A6902D6FA27E6700BC806AFB /* Quick.h */, + CBF934CBEFF2DB148CE79145218C4D8C /* QuickConfiguration.h */, + FF67788B345263FB9CF1BD20D29E5616 /* QuickConfiguration.m */, + 31679B4F7F4666D343CDB06557DADDD9 /* QuickConfiguration.swift */, + E8EA8C0AF2541D4E516150CB57EC366C /* QuickSelectedTestSuiteBuilder.swift */, + 914EC005836744BC81C1E6806DE590E4 /* QuickSpec.h */, + 8EA27625EF08D49B80BCF45CF50DE0A0 /* QuickSpec.m */, + AA93B0819FA713215D0F70FC26BAF9A1 /* QuickSpecBase.h */, + 54B5AEF2409826FEC0790DCF2689EBAA /* QuickSpecBase.m */, + 95A8CDEB6B067ACC3C1460EBB6A38355 /* QuickTestSuite.swift */, + C92902D7AFAA229368DB418AA6E41C19 /* String+C99ExtendedIdentifier.swift */, + 9060C38D29BFD361123C95FF5C6A1EBE /* SuiteHooks.swift */, + BA809B4503458EBD9232CEC162A187BB /* URL+FileName.swift */, + 842619618535AF2FB52CC59D12438F25 /* World.swift */, + DD03F98CAA30F2774995685916D56CCC /* World+DSL.swift */, + D9DBB4EB9D90A8E2417A2E49615E4C84 /* XCTestSuite+QuickTestSuiteBuilder.m */, + 8BF2CDBFFBB80F31281E42DF829FBA89 /* Support Files */, ); + name = Quick; + path = Quick; sourceTree = ""; }; - 801931B1F64063DE613A3B56E03D5047 /* Pods-PopTip Demo-PopTip Extension */ = { + 7EFD8E20820233997D59675793DF738B /* AMPopTip */ = { isa = PBXGroup; children = ( - EFC00E1BCA7ABF73D1FA3D05DBA3E0FD /* Info.plist */, - 460098A16AFA3C46A8BF1953286513CD /* Pods-PopTip Demo-PopTip Extension.modulemap */, - 2F7352A30F6E4F910978CE37A04AD75A /* Pods-PopTip Demo-PopTip Extension-acknowledgements.markdown */, - 9B25630BBD7EDB96ED076A4FCFEBFFCB /* Pods-PopTip Demo-PopTip Extension-acknowledgements.plist */, - 8ED116EB547AEE6848BC5D842850572D /* Pods-PopTip Demo-PopTip Extension-dummy.m */, - EF665C5330F353F5953131CE0BA0E8CC /* Pods-PopTip Demo-PopTip Extension-resources.sh */, - 2011FB3697519F1D325E7467EB8F483A /* Pods-PopTip Demo-PopTip Extension-umbrella.h */, - D732828C4A99ED688AA531932E8D8123 /* Pods-PopTip Demo-PopTip Extension.debug.xcconfig */, - F52683387C103F5EBC11C9323B94A825 /* Pods-PopTip Demo-PopTip Extension.release.xcconfig */, + DC3F79D151D1359340CD9C43B7F5E37E /* PopTip.swift */, + F07F75DDE011945316BC63B51F7DC0E4 /* PopTip+Draw.swift */, + 2DC1B6418BD47D3A9BBC4480611102C6 /* PopTip+Transitions.swift */, + D7F4923F5A5C49B458433E63E4E2EBDF /* Pod */, + A77EC58A7C2A1B5DEC11B1FBE1436D4A /* Support Files */, ); - name = "Pods-PopTip Demo-PopTip Extension"; - path = "Target Support Files/Pods-PopTip Demo-PopTip Extension"; + name = AMPopTip; + path = ../..; sourceTree = ""; }; - 8A0D9E10DA01189EB63C1FA0F4C81EEC /* SwiftSupport */ = { + 8654CD07505C70C4F047B71210AFEE82 /* Core */ = { isa = PBXGroup; children = ( - 4B996EBBCBEEB9CA80D1E7C807D65FEE /* SwiftSupport.swift */, + A4112965F20575018ABFB75F3DC568E5 /* FBSnapshotTestCase.h */, + 340BDA70E7B2E5733010B16F6D0C2DE2 /* FBSnapshotTestCase.m */, + 22885CF8C3E6C6FFF0B6C93CAE1FFABD /* FBSnapshotTestCasePlatform.h */, + 78EF2544CBA242DCEDFA0FD3A8550F77 /* FBSnapshotTestCasePlatform.m */, + CF4CEEC5B35DEC042C282CE171C3C3A5 /* FBSnapshotTestController.h */, + FA11BB65626CB452ECA194818128ADE8 /* FBSnapshotTestController.m */, + 4F2E0D315F2410613BA14A38CA2ED88B /* UIApplication+StrictKeyWindow.h */, + D6761FE3D3B7DC161EB60F661BFDA3E4 /* UIApplication+StrictKeyWindow.m */, + 08177DB2A000D757F77F1C62A460062D /* UIImage+Compare.h */, + 75C667F49551B841433528B76D871AD6 /* UIImage+Compare.m */, + C0F5452E9ACE24C3CCDD5AD0E1DC54D3 /* UIImage+Diff.h */, + 03CA0C62250B57FC794F3F4EC9C7E78B /* UIImage+Diff.m */, + FDA6F2ABC91EC5DE29B60B94872BB799 /* UIImage+Snapshot.h */, + 35FF880C9AC47A0BE67D71B6C1F6D23E /* UIImage+Snapshot.m */, ); - name = SwiftSupport; + name = Core; sourceTree = ""; }; - 8E82A31346079D4AAAC842254F33BF95 /* Pods-PopTip DemoTests */ = { + 8BF2CDBFFBB80F31281E42DF829FBA89 /* Support Files */ = { isa = PBXGroup; children = ( - A41E1817B71B69E1FD38EE7A40CBF4E7 /* Info.plist */, - 699873DB03F1E2B7D2A73208B58CE64E /* Pods-PopTip DemoTests.modulemap */, - FE4EC793A3500FBBC42334F5F00A0CAA /* Pods-PopTip DemoTests-acknowledgements.markdown */, - E0899AB45D968B0B698B10CD770B8BF9 /* Pods-PopTip DemoTests-acknowledgements.plist */, - 7835543ABDBBC32D2DB9BA54061037DA /* Pods-PopTip DemoTests-dummy.m */, - 4E2725727C45685B0DA4F7CE73B7E087 /* Pods-PopTip DemoTests-frameworks.sh */, - 90CAC093A7ED70EB38A162E4E486695A /* Pods-PopTip DemoTests-resources.sh */, - BFFA714E533A2B7E96D638D62CCCD811 /* Pods-PopTip DemoTests-umbrella.h */, - 850E2A73E7078CFFE50FAE1D1CE12D12 /* Pods-PopTip DemoTests.debug.xcconfig */, - 3E994D58A427D7C2DEC199C92F9A29B7 /* Pods-PopTip DemoTests.release.xcconfig */, + C483427D7E1E89FD0C6B01538703B51C /* Quick.modulemap */, + F2461D3B9700D77CBBB5FC22B35A23C3 /* Quick.xcconfig */, + 20A146A87341E07DD77AAD75275D2E4D /* Quick-dummy.m */, + DE4168D8F28E5CBE12B9473C483EDF25 /* Quick-Info.plist */, + 6A0F708100BC0B67488C645A10FF4C5A /* Quick-prefix.pch */, + 043F561B21C1039AF1BDA1CBD58D2CC5 /* Quick-umbrella.h */, ); - name = "Pods-PopTip DemoTests"; - path = "Target Support Files/Pods-PopTip DemoTests"; + name = "Support Files"; + path = "../Target Support Files/Quick"; sourceTree = ""; }; - A833B199BAF880845CB0161924B164FB /* Core */ = { + 8C5952B53C36D22C1828EA4C153A4891 /* Products */ = { isa = PBXGroup; children = ( - 88C6038794B3821939584B738A098EBE /* HaveValidSnapshot.swift */, - A1C80E4AD2A6C17931ACD5D5F6A3E954 /* NimbleSnapshotsConfiguration.swift */, - 521F32F8A5C3B6651C823E3B4A81584E /* PrettySyntax.swift */, + 8C95D72193B8B0961AE8D60FA1D3F419 /* AMPopTip.framework */, + B91B00F8BE943329D633234BD67AE0AC /* FBSnapshotTestCase.framework */, + BAE263041362D074978BB3B577DF0A05 /* Nimble.framework */, + 52C1B30CC4697E1933141720223103BC /* Nimble_Snapshots.framework */, + A42885061107151E73CCC3780CFEDBF8 /* Pods_PopTip_Demo.framework */, + C2207EF102E3CE591887BD781FF4C3DC /* Pods_PopTip_Demo_PopTip_Extension.framework */, + 0E162ED0F33811A146ACB6060DAF7A20 /* Pods_PopTip_DemoTests.framework */, + 0D631E9908483F9525A6B3F36F16CC61 /* Quick.framework */, ); - name = Core; + name = Products; sourceTree = ""; }; - A863E41FC5A76B95A08A31ACAAFBEC68 /* Support Files */ = { + 970503587F8BA5FDDBC0C3CEA76C8866 /* iOSSnapshotTestCase */ = { isa = PBXGroup; children = ( - 08ECA601D4CC2D8DD7310AAA2D6B04E8 /* Info.plist */, - 1E72823BE5F9FD1C8A234CB9D1F96A57 /* Nimble.modulemap */, - 72A2234D1D382105CBC1993DEEF8F629 /* Nimble.xcconfig */, - 77059410500B57F54164B561A764935F /* Nimble-dummy.m */, - B4943626C517809901F36B4F6CBE5262 /* Nimble-prefix.pch */, - E879E28879F79A7809D5FF5DEAC23ADE /* Nimble-umbrella.h */, + 8654CD07505C70C4F047B71210AFEE82 /* Core */, + 40BD6D69F94AE14B83E1E0BF916AD79C /* Support Files */, + 575B627A2257A978DB140A8AAD6374EF /* SwiftSupport */, ); - name = "Support Files"; - path = "../Target Support Files/Nimble"; + name = iOSSnapshotTestCase; + path = iOSSnapshotTestCase; sourceTree = ""; }; - AF3FA1139EC69E065B1C1095C25B2636 /* Frameworks */ = { + A4E6DDBED0762A5EECF83048AAA9BBE7 /* Pods-PopTip Demo-PopTip Extension */ = { isa = PBXGroup; children = ( - 9823197EA5904A9150FB0AD8B09841E6 /* FBSnapshotTestCase.framework */, - 5AD55F3974939097556240403DEE2DFF /* Nimble.framework */, - 8C36DB6F05615EC71278526272A72BAD /* Quick.framework */, - 00AC1B4DD2691E6E3860EE0B17D13589 /* iOS */, + C4AD3E2F112177E28AAE754DA0E1FD47 /* Pods-PopTip Demo-PopTip Extension.modulemap */, + 3357B35F2626A336EA4A6957CF896AD4 /* Pods-PopTip Demo-PopTip Extension-acknowledgements.markdown */, + C889B3F54F41565788AFAC6788A5051D /* Pods-PopTip Demo-PopTip Extension-acknowledgements.plist */, + F488A4760800EF84AD10500DC1EDBF9F /* Pods-PopTip Demo-PopTip Extension-dummy.m */, + BF3912C08A389327C68738040FE8A3FB /* Pods-PopTip Demo-PopTip Extension-Info.plist */, + 7BED3906A4660DD61D0D46DC3CE1C209 /* Pods-PopTip Demo-PopTip Extension-umbrella.h */, + 4820DEAB84B6336402B3DD158B4A675D /* Pods-PopTip Demo-PopTip Extension.debug.xcconfig */, + 1A15CED75CF25B741E77880BCC8DE726 /* Pods-PopTip Demo-PopTip Extension.release.xcconfig */, ); - name = Frameworks; + name = "Pods-PopTip Demo-PopTip Extension"; + path = "Target Support Files/Pods-PopTip Demo-PopTip Extension"; sourceTree = ""; }; - AF5FED0A4DBBE171EC64B8E2E4512BDB /* Products */ = { + A77EC58A7C2A1B5DEC11B1FBE1436D4A /* Support Files */ = { isa = PBXGroup; children = ( - E59FBAFAD94001EFAA51D0F80909B568 /* AMPopTip.framework */, - 902E453308704EFBD9ACCC70EE6479FD /* FBSnapshotTestCase.framework */, - B513BE7CD28D176F6935727F460AB97C /* Nimble.framework */, - 30CE76E7592F8C76C93476F7F3C10CF1 /* Nimble_Snapshots.framework */, - B0B381017AC164824665E20304950FD6 /* Pods_PopTip_Demo.framework */, - D2D880BE84C24A10753CD31B26C18B3C /* Pods_PopTip_Demo_PopTip_Extension.framework */, - 66A26BD8E774A628DCB63BC14CB128EE /* Pods_PopTip_DemoTests.framework */, - 28D958A84B171436F15EEF9EA8349130 /* Quick.framework */, + 4B93FEA022F9C354860E8CD479B52F7B /* AMPopTip.modulemap */, + FC0AEC1C0265D16A03E08E0941C0BD6D /* AMPopTip.xcconfig */, + 53674FC635783FCD6E4031030EB2C49D /* AMPopTip-dummy.m */, + 8FE64506CA36721A7EC394AF3FE32ECC /* AMPopTip-Info.plist */, + 22506383E22217CFB648DCE0EDC92A0F /* AMPopTip-prefix.pch */, + 9391798D983F425114DD4CF2BE4B7019 /* AMPopTip-umbrella.h */, ); - name = Products; + name = "Support Files"; + path = "Demo/Pods/Target Support Files/AMPopTip"; sourceTree = ""; }; - CF5C02BB58844DA82982D3E6F1CA0FCA /* AMPopTip */ = { + ADD5E3B1AC2C4BD9BA837DBC9D6D6FCA /* Pods */ = { isa = PBXGroup; children = ( - F325EEC08B0EFB2F8EA30FB7FB04D743 /* PopTip.swift */, - 3B2BE79DBE11927C81DC00BBDF150918 /* PopTip+Draw.swift */, - D713AD0D33E876DA52C4A43114BEA2F5 /* PopTip+Transitions.swift */, - 7B2DE399FAF5CED16EC4E6E5A0E1DE07 /* Pod */, - 722473FBEA3446DE6363D4528C4A17B5 /* Support Files */, + 970503587F8BA5FDDBC0C3CEA76C8866 /* iOSSnapshotTestCase */, + 5F95AC285B387E63316800145FE1C84E /* Nimble */, + 4F83457C021BD1B7DF57BE87A1D1B982 /* Nimble-Snapshots */, + 70A8A94A93AE527D3FAD56B5047CBF1C /* Quick */, ); - name = AMPopTip; - path = ../..; + name = Pods; sourceTree = ""; }; - D26C2B202766521A3CD518CE118B6EE8 /* Nimble */ = { + B16C288D91E17AD216B2BDE399B3B967 /* Support Files */ = { isa = PBXGroup; children = ( - BB9F09B1A2A8947414AEE7635FE2AF3D /* AdapterProtocols.swift */, - AC9F7D19D9AB69565F1F7ECD8458DCDD /* AllPass.swift */, - B9EB60CDF6FBD3A935035A2E52FED76F /* AssertionDispatcher.swift */, - C3B7E861353E659B6021E85C530F91C2 /* AssertionRecorder.swift */, - AF1750A48622E83D1CEA0E34EE618053 /* Async.swift */, - 000EC5893307C23211A055512D3D1FBE /* AsyncMatcherWrapper.swift */, - D069F8A81995EFAF54A694E1E366DFD7 /* BeAKindOf.swift */, - 3A09D412804C0CAB727FDE6A72825199 /* BeAnInstanceOf.swift */, - 8585F17754851E90DC1D1DB1CB6DE93C /* BeCloseTo.swift */, - 4A7EE2FD22F2BE050A8EFB0891513773 /* BeEmpty.swift */, - 7C8425F7341EB3C18241CF62214FF30B /* BeginWith.swift */, - C78BBE614BE09B3FA1DE90C2BD567454 /* BeGreaterThan.swift */, - B3B838AC76D5E506BFDA889E980FE2AB /* BeGreaterThanOrEqualTo.swift */, - 0DF1B5A6E8026DC5C016F99942BD39FA /* BeIdenticalTo.swift */, - 30D8FB3C007FF51398B1FF1AB99933CF /* BeLessThan.swift */, - 5BBCD32E1077F416A54ADB0FACF9D843 /* BeLessThanOrEqual.swift */, - 569471778265F83A9030DC56D344BC73 /* BeLogical.swift */, - 7DA5701134923CC5E1C6403C97180F1B /* BeNil.swift */, - 508EB2AB180CFF39238E48F1FF826B52 /* BeVoid.swift */, - BCA73C8DE0047A6F0C33E8B9E31D7D32 /* Contain.swift */, - EAF87AEA5D2A37E5F1C31F0160A9FA48 /* ContainElementSatisfying.swift */, - 7BC57C06516856D246896E71D5450FAB /* CurrentTestCaseTracker.h */, - 2388D29F6D6FACB1D3AF6ABBE2193D8A /* CwlBadInstructionException.swift */, - 05910E12F46EF0B617858CC2A21AED01 /* CwlCatchBadInstruction.swift */, - 3C8FF475D58630E8C2A0595D443C18B5 /* CwlCatchException.h */, - D66D7E36DC250FB25AAFB8038EF0A0E7 /* CwlCatchException.m */, - 29CA84126A02C4C94D71A3D72B473A0F /* CwlCatchException.swift */, - 43F13EEE7BAC88FA2565C4521C5E9840 /* CwlDarwinDefinitions.swift */, - 8082845FB2A294546D1AC61717AF95FC /* CwlMachBadInstructionHandler.h */, - 98BFF7495C0F5214AA51A31AD8FAFF69 /* CwlMachBadInstructionHandler.m */, - B697B826EDE789764F74D31B9E9B8763 /* CwlPreconditionTesting.h */, - 80541CEDAAD3A65218E748DC407CEDAD /* DSL.h */, - D03DEAB3E506BFAC1C417675C3AE11F6 /* DSL.m */, - 1E833841B8DB00F41BBBF9C824578368 /* DSL.swift */, - D27BE76A1B90D72907826E6915E88965 /* DSL+Wait.swift */, - FB251A0E85DAFF3D17A0179B92119BD0 /* EndWith.swift */, - 4A029B109DFAD196290AC600F3AA9664 /* Equal.swift */, - 5E39576527CC20A56E4D667936A118E0 /* Errors.swift */, - A511C66A233B0B2C500639FC91121813 /* Expectation.swift */, - 5ADE9C483A61CC15888045D4FE084096 /* Expression.swift */, - 1F9185AE463B4996A6D6043A895F6F0F /* FailureMessage.swift */, - 95EBD62D9D26F216798D0CCCD0D73B54 /* Functional.swift */, - 4B996E4162BC193E0DD2B8C725BDFA68 /* HaveCount.swift */, - 7314E345CDDA857F026C10E7A0E2F26D /* mach_excServer.c */, - 398C043CB9E40FBD0071B6F8C4F6951F /* mach_excServer.h */, - 0CBFE8BA23F8564FFA49DC6751815607 /* Match.swift */, - D8FF14E9A22B5E7095C215CFE0540ED9 /* MatcherFunc.swift */, - 3DABEB6F91C2A288FB01D7ED1D6AB79A /* MatcherProtocols.swift */, - A7DCD10C39A3DCEC60FDAB6D2B52B78B /* MatchError.swift */, - B6555C2A3818A08604EF2BEF7284D464 /* Nimble.h */, - 01E727C551EB89E89BAF714364E7344A /* NimbleEnvironment.swift */, - 10A97A5152B8B08DA2593DB7E7F2BF8C /* NimbleXCTestHandler.swift */, - 2E4B7F9647618B6A870B748EA12D2A3F /* NMBExceptionCapture.h */, - F3F23422A0F51F156EBF4622FFBCF81E /* NMBExceptionCapture.m */, - F2BF93484E2412D94F340BD5ADC0FAE6 /* NMBExpectation.swift */, - CA424F89E640E3E3F0ECCF68DF1C182F /* NMBObjCMatcher.swift */, - D6CE37C84E822C06D3EAE1CA92E762C2 /* NMBStringify.h */, - 7260E6AF38FF6C8415EEDB8855D12C20 /* NMBStringify.m */, - 6CB0A735FDAE7BD83BBB31B32C83114F /* PostNotification.swift */, - 1B612CBD6B1DCE869E3E864DD4C746E0 /* RaisesException.swift */, - 16328B9BB5F9C4DB60F030CEF21B6133 /* SatisfyAnyOf.swift */, - 64D0C7BB1D397E98B72565F15A5DEF76 /* SourceLocation.swift */, - 40130C8BF8439668448A1C5982C2A772 /* Stringers.swift */, - A7126A781AB6AA8DA6907B4765E2E0FB /* ThrowAssertion.swift */, - FF7D02DBD2B4E16208F9BDD8CD97AD77 /* ThrowError.swift */, - AD326AD83F5B1368B5404707B2BCF947 /* XCTestObservationCenter+Register.m */, - A863E41FC5A76B95A08A31ACAAFBEC68 /* Support Files */, + 2FAA5D661524B8F44D090233FEAF538E /* Nimble-Snapshots.modulemap */, + BE83FD1192F49434FF3A9FCFC1A5FBB7 /* Nimble-Snapshots.xcconfig */, + 86552199BD8C16AD15523853E138CDB8 /* Nimble-Snapshots-dummy.m */, + 37EB0E5F21B8DF77682169F98DF4D517 /* Nimble-Snapshots-Info.plist */, + A9425B226A11A028EB75DCF5A3971F7A /* Nimble-Snapshots-prefix.pch */, + 617C957328EDAB079A8AA3A90A105817 /* Nimble-Snapshots-umbrella.h */, ); - path = Nimble; + name = "Support Files"; + path = "../Target Support Files/Nimble-Snapshots"; sourceTree = ""; }; - DBE709DEA59B46B317ADA773737E0E51 /* Quick */ = { + CBCADAC55956C76F0B767C2F56A1B758 /* Frameworks */ = { isa = PBXGroup; children = ( - 6E7AD2AE34AE812483A022D18B124AED /* Callsite.swift */, - 0BD6ED7F74955AA2A1667C7F922F67A5 /* Closures.swift */, - C81E1ECB3B441D9D282F39FEC896C1BE /* Configuration.swift */, - 8A9CDBB351E5FC8781764576D91F6A6E /* DSL.swift */, - 0B56DD589B21DEF741224D84B159A7CC /* ErrorUtility.swift */, - 535A83511A8433BEEBA6E57054A163AA /* Example.swift */, - F22868ACC1D92164D31C6011179A8FD5 /* ExampleGroup.swift */, - 0688711AC934F1236CED088ED1176986 /* ExampleHooks.swift */, - 4BEAC000BE3EAC0C924E6C8C663143AC /* ExampleMetadata.swift */, - 45B9C73C31A47AC34988D93E51766E22 /* Filter.swift */, - B1537CABFA7CEF20511B1C1F8385A75C /* HooksPhase.swift */, - 9F682E7FB820C006AF44AE022AE2A2F5 /* NSBundle+CurrentTestBundle.swift */, - B220CFB2490D8F060775C3FE087AC5A0 /* NSString+C99ExtendedIdentifier.swift */, - 9CB91F60767353B0B06353F0628A808F /* QCKDSL.h */, - EDA6F49F8488C158FD29AE788109D50F /* QCKDSL.m */, - 8F656190067B4123AAB05AFB34BCD067 /* Quick.h */, - EAB27F2DB24A4BC55C39BD4385F08254 /* QuickConfiguration.h */, - F44D21F1FC08553D16C5D37F4729730F /* QuickConfiguration.m */, - 4B3C571CC55850FA7E29E97B57BC5231 /* QuickSelectedTestSuiteBuilder.swift */, - DC0C06CE7A19AACBEE88451BCD88EC99 /* QuickSpec.h */, - A3B7F0A99A34AC96E5161F32A63BCE71 /* QuickSpec.m */, - 144ED82EE3E760AF98A0542F41D25F92 /* QuickSpecBase.h */, - A9B9975DF83C84505121A1CD3DA9F45D /* QuickSpecBase.m */, - 04BEF9D55E911EB99B76113E7D6AEE2E /* QuickTestSuite.swift */, - 53288771433CE1791CBCE71970E1B1EB /* SuiteHooks.swift */, - 82BA7297EAB5660016666FF7A03370CF /* URL+FileName.swift */, - C5358F9ADB2619DD5BA1C503F0B0C917 /* World.h */, - E0DCA163B4EB5D1132C5C3D63368B51C /* World.swift */, - 4864958417C3B0AD2DBF07A97B02FE49 /* World+DSL.h */, - F89FE56BE29FCF13CD530BB7857A9F8B /* World+DSL.swift */, - C11FBA75ABE36B0A2461A907BBBCE024 /* XCTestSuite+QuickTestSuiteBuilder.m */, - 39DBCD3F57A94591F718AE388E0EF2B6 /* Support Files */, + 45544E7DC8BC621B5141430C9031836E /* FBSnapshotTestCase.framework */, + 0D35F92A6BFBF9579DAFE842BFF03D7D /* Nimble.framework */, + 2F439AEC6253322440C73BF9FBADE2AE /* iOS */, ); - path = Quick; + name = Frameworks; sourceTree = ""; }; - DD74A88B70D2E8BCB09D531CC157DA14 /* Core */ = { + CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( - 2F57D29CC561709561C5B466F04B15CC /* FBSnapshotTestCase.h */, - 0A70C8ACE77A4DE8820D382354A95A3D /* FBSnapshotTestCase.m */, - CB1527E8CB7F741D568FBEAA8108BC53 /* FBSnapshotTestCasePlatform.h */, - B8198D261EC670B50430A9D49F6F4FDB /* FBSnapshotTestCasePlatform.m */, - E16B4E89964E172F923C92277C7C3F94 /* FBSnapshotTestController.h */, - 57672C442DECEE3C7C6AD31E1A9A4B3F /* FBSnapshotTestController.m */, - B81A3A23EEEABC7D1B53CCB09BC12C50 /* UIApplication+StrictKeyWindow.h */, - 554594319929579AF96B93868FC5ED1A /* UIApplication+StrictKeyWindow.m */, - CE3435AF1CA511348ADF52843427B033 /* UIImage+Compare.h */, - 6B275C4EB8C358C9513F847FCFC712C2 /* UIImage+Compare.m */, - C8DBE700D98C786924B11D2A9E6A452B /* UIImage+Diff.h */, - 00371EAA62F5CDBA4F2F3B7FE6EA1954 /* UIImage+Diff.m */, - 78DCDF95C290E70D266A9870B3A19F29 /* UIImage+Snapshot.h */, - 7A3BF40A7ED69D857B7BDD61EF24BF22 /* UIImage+Snapshot.m */, + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + F289CBF2ADBD90C9A0660F5617EAE9E3 /* Development Pods */, + CBCADAC55956C76F0B767C2F56A1B758 /* Frameworks */, + ADD5E3B1AC2C4BD9BA837DBC9D6D6FCA /* Pods */, + 8C5952B53C36D22C1828EA4C153A4891 /* Products */, + 501B33CD1B2B54598C1D96174FD67D4A /* Targets Support Files */, ); - name = Core; sourceTree = ""; }; - EFED083876D9A383F7BE275BDD0E791A /* FBSnapshotTestCase */ = { + D7F4923F5A5C49B458433E63E4E2EBDF /* Pod */ = { isa = PBXGroup; children = ( - DD74A88B70D2E8BCB09D531CC157DA14 /* Core */, - 3012F455BBC5815D619D3B440663BE9A /* Support Files */, - 8A0D9E10DA01189EB63C1FA0F4C81EEC /* SwiftSupport */, + B63094C132EA561551C42A5D3A28C2A7 /* AMPopTip.podspec */, + 15CD25DD15CFA4234F5A2EB71466605B /* LICENSE */, + CF612393C3D67698960F96C69B12CA78 /* README.md */, ); - path = FBSnapshotTestCase; + name = Pod; sourceTree = ""; }; - F3973F835EFFE829496236E5C1A5E88D /* Targets Support Files */ = { + F289CBF2ADBD90C9A0660F5617EAE9E3 /* Development Pods */ = { isa = PBXGroup; children = ( - 55E137E8CCD3289FCF33869C63FD3781 /* Pods-PopTip Demo */, - 801931B1F64063DE613A3B56E03D5047 /* Pods-PopTip Demo-PopTip Extension */, - 8E82A31346079D4AAAC842254F33BF95 /* Pods-PopTip DemoTests */, + 7EFD8E20820233997D59675793DF738B /* AMPopTip */, ); - name = "Targets Support Files"; + name = "Development Pods"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 17C7D221F175E9B8D35B7A1BA52FDFFB /* Headers */ = { + 0BE34C059AC0229E82A1F59367CBA512 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2618F3CA0BE6250B5FE0C44A06C0175C /* AMPopTip-umbrella.h in Headers */, + E64F9D4663DEE92C3C928CB72598E6C9 /* Pods-PopTip DemoTests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 58F127A3969DC02D6E1513CC9A59CD26 /* Headers */ = { + 222AC9A0004F142037506904FF61E931 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 0A81E80717516C4A0E8EE7E46501BD80 /* CurrentTestCaseTracker.h in Headers */, - ACC2E8C5179C95F16187CCB57FFC695C /* CwlCatchException.h in Headers */, - 861D9711DF0D956143E77525C49C90F5 /* CwlMachBadInstructionHandler.h in Headers */, - 4BCE0B38FB90EFA05CC9C832E63DCE3E /* CwlPreconditionTesting.h in Headers */, - 25D531159D14566B75654834D6B7595A /* DSL.h in Headers */, - 46FBD24AD2F0C1A621F85EA729A601D3 /* mach_excServer.h in Headers */, - C9E4AC0655BF4A2E7CB61692E3473A95 /* Nimble-umbrella.h in Headers */, - AB3EAAD41DE965BCF5053A54418478F2 /* Nimble.h in Headers */, - F911171A7357B8F64E27DB3832F0C713 /* NMBExceptionCapture.h in Headers */, - 82CE6AB7801CEEB918D3F044AA3A72FF /* NMBStringify.h in Headers */, + B6607A673440A83CE99361A08D82C734 /* QCKDSL.h in Headers */, + 0837CAE176AE66736FE457DDAAF5E01D /* Quick-umbrella.h in Headers */, + DED813943ABF7ACBD1C38B2D8024DA9C /* Quick.h in Headers */, + DFAAEF3440DDBCA8719DD048DAE27FDF /* QuickConfiguration.h in Headers */, + EE157DBCE1F197BC50B908D77778B508 /* QuickSpec.h in Headers */, + 8911DDD5910AA1C6E099EBF768AFC8F7 /* QuickSpecBase.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5B763B3FEEEFD547C1E6C34C50E9EF2F /* Headers */ = { + 374F07EA1942679546AB2B657C60C1AD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 7D02CBD8968D3D0F039171E8882904E2 /* Pods-PopTip DemoTests-umbrella.h in Headers */, + C42E25AEAE4758760D9239D25E88FEAF /* CwlCatchException.h in Headers */, + 405AB644E5E32AB19AE8697B4C0CE124 /* CwlMachBadInstructionHandler.h in Headers */, + E594306BF52C899BCE23A4BA56CD0DD0 /* CwlPreconditionTesting.h in Headers */, + C971A8D42C7C043DC4970A69B81546A7 /* DSL.h in Headers */, + 01DAA6DD1809A39129FF7C72DDF93054 /* mach_excServer.h in Headers */, + 5CE5E8EA75E0B3DC5BE140B61DF37EFD /* Nimble-umbrella.h in Headers */, + 62DFF94A7A777939C861EDA13627999B /* Nimble.h in Headers */, + 0725A6F6AF5A97F9D46B3188E135D5B2 /* NMBExceptionCapture.h in Headers */, + A3A25739D8FCB7A4FE17C8C5A6C7BE72 /* NMBStringify.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7DCE9FB6BEE81515EEF58EFFFE479871 /* Headers */ = { + 3A6DA6412F355CF15F2964F1C625FE97 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 180011DBF469747F564C026BA8DDE0A9 /* Pods-PopTip Demo-PopTip Extension-umbrella.h in Headers */, + CD53A1407E7C67C3B0D07293D1E81B89 /* Pods-PopTip Demo-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8CD60E5FAF4A420335154D697C20CAA9 /* Headers */ = { + 3DFC75B2FDBE15AAC8DF48F4F9CAF476 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - C56275DC06C898FD40BE6D4A6D3F87DC /* QCKDSL.h in Headers */, - 97FFD110FB3C3C37390A890BC4CC1B0E /* Quick-umbrella.h in Headers */, - 1B35C9F068B61FDF5183167D72C0CFA3 /* Quick.h in Headers */, - 669A244BF1400D8242783CC7580AADCB /* QuickConfiguration.h in Headers */, - 96A5C27C4FB6EADC9C006B3EAD1D1F56 /* QuickSpec.h in Headers */, - 9C55455F527B637EA9A0D8D563C2FC10 /* QuickSpecBase.h in Headers */, - F42C2790CF7AA038A2C98F9C151A564B /* World+DSL.h in Headers */, - C426C651860B7E67026299FFA150A9E1 /* World.h in Headers */, + 6B711829635DE0124AAD400294679DA4 /* AMPopTip-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8F0D2B8F675F8B99EEC31EDD668A8FAF /* Headers */ = { + 65EF4E144CA2B66787A30269E16C9AAA /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 4CF5865BAF828AB9A7C56F3A1B1C856F /* FBSnapshotTestCase-umbrella.h in Headers */, - B08725BB938AA3AACCA3C8C818FA4CF6 /* FBSnapshotTestCase.h in Headers */, - 4D600539FC2E29EA7E28A2DA8A8B328C /* FBSnapshotTestCasePlatform.h in Headers */, - 59FD5FAEFCF13CD39358A6F36C50BED8 /* FBSnapshotTestController.h in Headers */, - BCDA265400AF5BCF21074C5AF1FD09A8 /* UIApplication+StrictKeyWindow.h in Headers */, - 63EA4B9CBBAB30A69C2D73693019FDC5 /* UIImage+Compare.h in Headers */, - 73247510D7AD93E5FDBA474B353BF919 /* UIImage+Diff.h in Headers */, - 387D066A1A34ED7DF0F716CB3A8B746D /* UIImage+Snapshot.h in Headers */, + CFA0DCDED2CCF981775D7CBE5A838D7A /* NBSMockedApplication.h in Headers */, + 308780D4872A85FE37009D76771B4763 /* Nimble-Snapshots-umbrella.h in Headers */, + 9EA62F9768963210444DF2449807EDBA /* XCTestObservationCenter+CurrentTestCaseTracker.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - E842B4F32EB1FAAA886EC4E63319EAD8 /* Headers */ = { + 7B7B10431DF1A34B4982222AECDF460E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 0BD4F5BB58926E327C131FEAA14632FE /* Nimble-Snapshots-umbrella.h in Headers */, + 3EC1BA2A68CB73133A8AF47477F9C73C /* FBSnapshotTestCase.h in Headers */, + 81B1434E6E2716DCE0E798628023D731 /* FBSnapshotTestCasePlatform.h in Headers */, + 61C17A2EEE8CEB079EBD74691B315748 /* FBSnapshotTestController.h in Headers */, + 2F7C7B2317A3AAEF16465F3C2DC4B1C6 /* iOSSnapshotTestCase-umbrella.h in Headers */, + A93913B4BC536EB83801121CCB016316 /* UIApplication+StrictKeyWindow.h in Headers */, + 80945DB751F5043C4D2BE37C4ADD99D9 /* UIImage+Compare.h in Headers */, + 3D59AD64A81F07665EAFC1702926D7FD /* UIImage+Diff.h in Headers */, + 80BED9B23AAC740E9A8DA675AA34B404 /* UIImage+Snapshot.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - ECB0D491669A9411D8163458546D1C72 /* Headers */ = { + D1071A4A45A8C795BE76CC76FA868AB7 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 7E42E8EE356FD84409CF069C3D142B92 /* Pods-PopTip Demo-umbrella.h in Headers */, + FF31A3B5441894A2F13997C0FE237C4C /* Pods-PopTip Demo-PopTip Extension-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 2E81D80A51100BE774F7701C607EF28A /* Pods-PopTip Demo-PopTip Extension */ = { + 0B974B55B3C5F71E53DF6070DC0CF6CF /* AMPopTip */ = { isa = PBXNativeTarget; - buildConfigurationList = 209A9393231BB4B40F8445CC63B05D72 /* Build configuration list for PBXNativeTarget "Pods-PopTip Demo-PopTip Extension" */; + buildConfigurationList = C6A879FE025A74D62A8577AB2E59ADF0 /* Build configuration list for PBXNativeTarget "AMPopTip" */; buildPhases = ( - 7DCE9FB6BEE81515EEF58EFFFE479871 /* Headers */, - A4E3B8AE32A0A4149CF1169E4305D9AF /* Sources */, - 374A163662675E740DCFC0901FF580C4 /* Frameworks */, - 65BB98532A010A129F5C523C5CBDB09C /* Resources */, + 3DFC75B2FDBE15AAC8DF48F4F9CAF476 /* Headers */, + 6478C237A8BADB27997BC15995B3507E /* Sources */, + 7496AA0F9C0AFCFDB7C9AC94228777FD /* Frameworks */, + 4D0FBE764F63D49C4492EED3F2537384 /* Resources */, ); buildRules = ( ); dependencies = ( - 4DF6FEF86F86BF2D469B6B98674E51AF /* PBXTargetDependency */, ); - name = "Pods-PopTip Demo-PopTip Extension"; - productName = "Pods-PopTip Demo-PopTip Extension"; - productReference = D2D880BE84C24A10753CD31B26C18B3C /* Pods_PopTip_Demo_PopTip_Extension.framework */; + name = AMPopTip; + productName = AMPopTip; + productReference = 8C95D72193B8B0961AE8D60FA1D3F419 /* AMPopTip.framework */; productType = "com.apple.product-type.framework"; }; - 57A6BD4F68D1BFFFDCE47B0F400E13B5 /* AMPopTip */ = { + 6F13695E06195A78EA8A95F8C7ED0D2F /* Nimble */ = { isa = PBXNativeTarget; - buildConfigurationList = E0AB037F8039ECB951F4AC822D73663C /* Build configuration list for PBXNativeTarget "AMPopTip" */; + buildConfigurationList = 0EDE00A0AE7F2ACDA112F853133A5D2F /* Build configuration list for PBXNativeTarget "Nimble" */; buildPhases = ( - 17C7D221F175E9B8D35B7A1BA52FDFFB /* Headers */, - EFD3A400F43794D1B62F81BBAE84FAD1 /* Sources */, - 9063E289DDB817B6DCAD6CCEBB603904 /* Frameworks */, - 5ADD4FC57C3316775C52E02F8E0299A2 /* Resources */, + 374F07EA1942679546AB2B657C60C1AD /* Headers */, + D0F25952859BD2ED17A7177A46922A25 /* Sources */, + A7EDD7975CD88AD39BAE0D6484C32803 /* Frameworks */, + C937BE3138C5339919754BC30CA46DE7 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = AMPopTip; - productName = AMPopTip; - productReference = E59FBAFAD94001EFAA51D0F80909B568 /* AMPopTip.framework */; + name = Nimble; + productName = Nimble; + productReference = BAE263041362D074978BB3B577DF0A05 /* Nimble.framework */; productType = "com.apple.product-type.framework"; }; - 8DB3BB93AB209436276723C938FEA5F0 /* Pods-PopTip Demo */ = { + 760D0F5B72491D747935D786BA1AA8A9 /* Pods-PopTip Demo */ = { isa = PBXNativeTarget; - buildConfigurationList = A321740DBE8999B677D180FB0B17279C /* Build configuration list for PBXNativeTarget "Pods-PopTip Demo" */; + buildConfigurationList = 0DE161C5B6AE3EC912A75AE081D69530 /* Build configuration list for PBXNativeTarget "Pods-PopTip Demo" */; buildPhases = ( - ECB0D491669A9411D8163458546D1C72 /* Headers */, - 8D3D438059E63734073B45AFFF9CE503 /* Sources */, - 0DC9B3C2B450E19193F59BECC4A12432 /* Frameworks */, - AA68E37B0A0E62A6DAF8C71AA293E218 /* Resources */, + 3A6DA6412F355CF15F2964F1C625FE97 /* Headers */, + 6A262387B911EDEA1B98F89360B763B6 /* Sources */, + 205EE39304CF46DE87DD2F729DF30EA2 /* Frameworks */, + 1680B365DB9A0880EEC5387FE6E0D4DC /* Resources */, ); buildRules = ( ); dependencies = ( - 97D80685D5BD31E37C16B95A43DF42A7 /* PBXTargetDependency */, + 920CB51A0D4C1E888D3F47C8933BA60C /* PBXTargetDependency */, ); name = "Pods-PopTip Demo"; productName = "Pods-PopTip Demo"; - productReference = B0B381017AC164824665E20304950FD6 /* Pods_PopTip_Demo.framework */; + productReference = A42885061107151E73CCC3780CFEDBF8 /* Pods_PopTip_Demo.framework */; productType = "com.apple.product-type.framework"; }; - 9208F82521C84CC962FB475DC38D3371 /* FBSnapshotTestCase */ = { + A86738CB7CBEED6822BFD10F31370438 /* Pods-PopTip DemoTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 8DE36427AE56C81503352C1A9AF63448 /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */; + buildConfigurationList = 55625FAA6B0118492EDF8C60EB484917 /* Build configuration list for PBXNativeTarget "Pods-PopTip DemoTests" */; buildPhases = ( - 8F0D2B8F675F8B99EEC31EDD668A8FAF /* Headers */, - F25432B685885C92BAB41B2E94A4E8A0 /* Sources */, - 06A086085916D88E8F989A2FD78DFDFB /* Frameworks */, - AD4E4321B395852DC07143FDAF5069AF /* Resources */, + 0BE34C059AC0229E82A1F59367CBA512 /* Headers */, + BE701993DBD8B2622A84E53A8E00C2F1 /* Sources */, + C95B465AEBE469905C5C4BF4BC976C9D /* Frameworks */, + 1CA4BD28B0A0EA4DBFEDE612923C4F18 /* Resources */, ); buildRules = ( ); dependencies = ( + 5DC7C32C4D3BBD58F9CE5E211FB7AD85 /* PBXTargetDependency */, + CBA33F06B48FAED68A6F45A9DB368BBE /* PBXTargetDependency */, + B8A3C703786B4FB985958B45CA678FE6 /* PBXTargetDependency */, + F5D15CECEF7B5AECF5ADB5E0DCDD61BA /* PBXTargetDependency */, + 639F6122A2E7CB60B8F63F0411BE0F8C /* PBXTargetDependency */, ); - name = FBSnapshotTestCase; - productName = FBSnapshotTestCase; - productReference = 902E453308704EFBD9ACCC70EE6479FD /* FBSnapshotTestCase.framework */; + name = "Pods-PopTip DemoTests"; + productName = "Pods-PopTip DemoTests"; + productReference = 0E162ED0F33811A146ACB6060DAF7A20 /* Pods_PopTip_DemoTests.framework */; productType = "com.apple.product-type.framework"; }; - 9A8D48230A8E5F0BF70C6620B093246E /* Nimble */ = { + BFD8534BC7E3F6030085A1923AB0F962 /* Pods-PopTip Demo-PopTip Extension */ = { isa = PBXNativeTarget; - buildConfigurationList = 248AC8DC26ABFE36B8A2380C27791D68 /* Build configuration list for PBXNativeTarget "Nimble" */; + buildConfigurationList = 262491F8F88C78C3956E89D40908C6DC /* Build configuration list for PBXNativeTarget "Pods-PopTip Demo-PopTip Extension" */; buildPhases = ( - 58F127A3969DC02D6E1513CC9A59CD26 /* Headers */, - A48D3F24FD295009E56794408662E208 /* Sources */, - 8BB27AC12ED87E21960A3CE8AA95603A /* Frameworks */, - 6C4E226D6904ADD63A3DAA2E4A5A4CCC /* Resources */, + D1071A4A45A8C795BE76CC76FA868AB7 /* Headers */, + EB4F83CD8D2B7B80CA4E8837AEA1D1D3 /* Sources */, + 3FE930DCE9E026F62620F6474C3DE339 /* Frameworks */, + D08545962BE03A6B5E493BA6741281A2 /* Resources */, ); buildRules = ( ); dependencies = ( + D11E3541A70F2CC6853B248765C6DA2D /* PBXTargetDependency */, ); - name = Nimble; - productName = Nimble; - productReference = B513BE7CD28D176F6935727F460AB97C /* Nimble.framework */; + name = "Pods-PopTip Demo-PopTip Extension"; + productName = "Pods-PopTip Demo-PopTip Extension"; + productReference = C2207EF102E3CE591887BD781FF4C3DC /* Pods_PopTip_Demo_PopTip_Extension.framework */; productType = "com.apple.product-type.framework"; }; - EC4C1C8BF227C6725EEB4B361545BEE2 /* Pods-PopTip DemoTests */ = { + C393038B0BEF088C1B93E6528005862D /* iOSSnapshotTestCase */ = { isa = PBXNativeTarget; - buildConfigurationList = A75D1E8CB344A29354E4736B594CE93C /* Build configuration list for PBXNativeTarget "Pods-PopTip DemoTests" */; + buildConfigurationList = 3288AB80519022CF68F678DDAE77269F /* Build configuration list for PBXNativeTarget "iOSSnapshotTestCase" */; buildPhases = ( - 5B763B3FEEEFD547C1E6C34C50E9EF2F /* Headers */, - BEA5C5ACEA7D28BFBB4A6A2A821035BA /* Sources */, - EFFCBFA6A6F2B7DB88D3FD0FFB9C71D0 /* Frameworks */, - AFB00B42FC769894A74BE763725C3E49 /* Resources */, + 7B7B10431DF1A34B4982222AECDF460E /* Headers */, + 011F0D416CB308E399EF77BD318F5E79 /* Sources */, + C9BA99C942A9048FBC29B2561ADA7771 /* Frameworks */, + D196E924D6B97AD770E28A5768D32D84 /* Resources */, ); buildRules = ( ); dependencies = ( - 1B21561041C1B0F456A86AA9F83825FC /* PBXTargetDependency */, - FA77CB5B2ED692429445FFFE5372F0BC /* PBXTargetDependency */, - 40978AF5DC54EB98C79E46ADC5747F97 /* PBXTargetDependency */, - AE95D0CD638823928F6F8E257C39BD9D /* PBXTargetDependency */, - B5B7E3923CD880EE6C8A822E0FCE7008 /* PBXTargetDependency */, ); - name = "Pods-PopTip DemoTests"; - productName = "Pods-PopTip DemoTests"; - productReference = 66A26BD8E774A628DCB63BC14CB128EE /* Pods_PopTip_DemoTests.framework */; + name = iOSSnapshotTestCase; + productName = iOSSnapshotTestCase; + productReference = B91B00F8BE943329D633234BD67AE0AC /* FBSnapshotTestCase.framework */; productType = "com.apple.product-type.framework"; }; - F59D37792BA4734F625CB674BDC6F9FA /* Nimble-Snapshots */ = { + C82891EAB7293DBEE916B21F57E8474D /* Quick */ = { isa = PBXNativeTarget; - buildConfigurationList = A9B421BBDC7462A77385FB2FA9EBD8AC /* Build configuration list for PBXNativeTarget "Nimble-Snapshots" */; + buildConfigurationList = 53945ADFA8D79915C0D0011CB37313D8 /* Build configuration list for PBXNativeTarget "Quick" */; buildPhases = ( - E842B4F32EB1FAAA886EC4E63319EAD8 /* Headers */, - C630F17150E1EAEA2A37676C0A408610 /* Sources */, - 1BE6CEEEA9148E12469FA47512274026 /* Frameworks */, - 7A096BE5F926B74139B9A71339036D9D /* Resources */, + 222AC9A0004F142037506904FF61E931 /* Headers */, + CCCC87107A438DDAE261813DDEB8A446 /* Sources */, + 0B8AE404673E2EBB324F285A600856F9 /* Frameworks */, + 13D971888606E36632CFC3485CE8B169 /* Resources */, ); buildRules = ( ); dependencies = ( - 4F467DB94547D90083727504F7443F86 /* PBXTargetDependency */, - 3FD1FFF769C705EF2E3973239E769FFA /* PBXTargetDependency */, - 09F13E35D83B674BBC0AE9D534B68B42 /* PBXTargetDependency */, ); - name = "Nimble-Snapshots"; - productName = "Nimble-Snapshots"; - productReference = 30CE76E7592F8C76C93476F7F3C10CF1 /* Nimble_Snapshots.framework */; + name = Quick; + productName = Quick; + productReference = 0D631E9908483F9525A6B3F36F16CC61 /* Quick.framework */; productType = "com.apple.product-type.framework"; }; - F745D6D8CF6D4183FE335DA396B04733 /* Quick */ = { + EE19095A8C98E0BC5774005673495238 /* Nimble-Snapshots */ = { isa = PBXNativeTarget; - buildConfigurationList = 8FDA07790B4B634BB2D8065B00C0990B /* Build configuration list for PBXNativeTarget "Quick" */; + buildConfigurationList = 295B7D799D337D141BAECB64ABF9146E /* Build configuration list for PBXNativeTarget "Nimble-Snapshots" */; buildPhases = ( - 8CD60E5FAF4A420335154D697C20CAA9 /* Headers */, - 8C750616AC311E3E59C0CC7A2978DF5B /* Sources */, - 8B2EA19AF3EFC9F90622E3C2759396B2 /* Frameworks */, - E5E6461300F71607B2EDC87C83E40AB1 /* Resources */, + 65EF4E144CA2B66787A30269E16C9AAA /* Headers */, + 402BD56A849903B58E6787DD7FDC2510 /* Sources */, + A461685461BB4315D69973BB36A7B372 /* Frameworks */, + C03552E4B2BB30458FE276273F605112 /* Resources */, ); buildRules = ( ); dependencies = ( + 52D0DD48AAAB6C339F4DC4E4EB3B489E /* PBXTargetDependency */, + 54521910668B4E46AF3D6DEE6A4F8F2D /* PBXTargetDependency */, ); - name = Quick; - productName = Quick; - productReference = 28D958A84B171436F15EEF9EA8349130 /* Quick.framework */; + name = "Nimble-Snapshots"; + productName = "Nimble-Snapshots"; + productReference = 52C1B30CC4697E1933141720223103BC /* Nimble_Snapshots.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0930; - LastUpgradeCheck = 0930; + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; }; - buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, - Base, ); - mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = AF5FED0A4DBBE171EC64B8E2E4512BDB /* Products */; + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = 8C5952B53C36D22C1828EA4C153A4891 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 57A6BD4F68D1BFFFDCE47B0F400E13B5 /* AMPopTip */, - 9208F82521C84CC962FB475DC38D3371 /* FBSnapshotTestCase */, - 9A8D48230A8E5F0BF70C6620B093246E /* Nimble */, - F59D37792BA4734F625CB674BDC6F9FA /* Nimble-Snapshots */, - 8DB3BB93AB209436276723C938FEA5F0 /* Pods-PopTip Demo */, - 2E81D80A51100BE774F7701C607EF28A /* Pods-PopTip Demo-PopTip Extension */, - EC4C1C8BF227C6725EEB4B361545BEE2 /* Pods-PopTip DemoTests */, - F745D6D8CF6D4183FE335DA396B04733 /* Quick */, + 0B974B55B3C5F71E53DF6070DC0CF6CF /* AMPopTip */, + C393038B0BEF088C1B93E6528005862D /* iOSSnapshotTestCase */, + 6F13695E06195A78EA8A95F8C7ED0D2F /* Nimble */, + EE19095A8C98E0BC5774005673495238 /* Nimble-Snapshots */, + 760D0F5B72491D747935D786BA1AA8A9 /* Pods-PopTip Demo */, + BFD8534BC7E3F6030085A1923AB0F962 /* Pods-PopTip Demo-PopTip Extension */, + A86738CB7CBEED6822BFD10F31370438 /* Pods-PopTip DemoTests */, + C82891EAB7293DBEE916B21F57E8474D /* Quick */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 5ADD4FC57C3316775C52E02F8E0299A2 /* Resources */ = { + 13D971888606E36632CFC3485CE8B169 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 65BB98532A010A129F5C523C5CBDB09C /* Resources */ = { + 1680B365DB9A0880EEC5387FE6E0D4DC /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 6C4E226D6904ADD63A3DAA2E4A5A4CCC /* Resources */ = { + 1CA4BD28B0A0EA4DBFEDE612923C4F18 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 7A096BE5F926B74139B9A71339036D9D /* Resources */ = { + 4D0FBE764F63D49C4492EED3F2537384 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - AA68E37B0A0E62A6DAF8C71AA293E218 /* Resources */ = { + C03552E4B2BB30458FE276273F605112 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - AD4E4321B395852DC07143FDAF5069AF /* Resources */ = { + C937BE3138C5339919754BC30CA46DE7 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - AFB00B42FC769894A74BE763725C3E49 /* Resources */ = { + D08545962BE03A6B5E493BA6741281A2 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - E5E6461300F71607B2EDC87C83E40AB1 /* Resources */ = { + D196E924D6B97AD770E28A5768D32D84 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -1243,236 +1259,240 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 8C750616AC311E3E59C0CC7A2978DF5B /* Sources */ = { + 011F0D416CB308E399EF77BD318F5E79 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5C5A1529C139A5212E8179407725889A /* Callsite.swift in Sources */, - BE71D2E3D4FFBA123536C731884E4FFA /* Closures.swift in Sources */, - 45C27E193B46FEFA41EF71059007FB0F /* Configuration.swift in Sources */, - E98AA469F96E5674888D4E845AB81F8F /* DSL.swift in Sources */, - F2BD2E308A244A2D1189D4DC5092BD2E /* ErrorUtility.swift in Sources */, - A96CCAB2382DE9B319FE95A717824393 /* Example.swift in Sources */, - F45A2B6D1A6A79BC90F2835AD3F24EC0 /* ExampleGroup.swift in Sources */, - 5FAC95453EFBBEDBD3F827A4F4917C17 /* ExampleHooks.swift in Sources */, - 82C4D927F810B2EA1E8A5322C41C2CFD /* ExampleMetadata.swift in Sources */, - 5E080BF9BC1C0EB4CED89E21B8AEE061 /* Filter.swift in Sources */, - 0E32C83F0E31A2E3939BC11E194E5BCC /* HooksPhase.swift in Sources */, - D79CDFD9B84A6DAB9DA1DBAD0CEB9303 /* NSBundle+CurrentTestBundle.swift in Sources */, - 6668E44F5445AFFE68C01F9835CDE51B /* NSString+C99ExtendedIdentifier.swift in Sources */, - 7630A86E65E6195378671F9DD7D51AD3 /* QCKDSL.m in Sources */, - FFB5C46EDA99CB6D118E8E0BB3785069 /* Quick-dummy.m in Sources */, - 41F25E62F8C884DEAF3920EDD5061709 /* QuickConfiguration.m in Sources */, - 35ED0A616A745E2BCF2A434A30284CB7 /* QuickSelectedTestSuiteBuilder.swift in Sources */, - B8B334C2DEA4675C19F720004E5D6F08 /* QuickSpec.m in Sources */, - 37E103190AE632BF5CE65122D45C80FD /* QuickSpecBase.m in Sources */, - BA1EE5C0810F86B84A1CE110D5B2495F /* QuickTestSuite.swift in Sources */, - 4E213F2DDBAD591E0CC30C26F5C21857 /* SuiteHooks.swift in Sources */, - 3666925BB9AB1204DB13904E48687D1D /* URL+FileName.swift in Sources */, - 6FB2777AF67C6343F78ED581DAB44DBF /* World+DSL.swift in Sources */, - 89BC82A3635A165AECCE5B4454215CB1 /* World.swift in Sources */, - C0FB327F7F936918F6F02D170DBE35E4 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, + 7C2671EB4E95CC40521B48E4FBA9DB58 /* FBSnapshotTestCase.m in Sources */, + 8CF3F268D917EA23E973C26928D9F4B8 /* FBSnapshotTestCasePlatform.m in Sources */, + FBC1632F885E2BC7693ACF80FA6E45BF /* FBSnapshotTestController.m in Sources */, + D8F8A71B4AA04AC5C72087E6007EA971 /* iOSSnapshotTestCase-dummy.m in Sources */, + 46A1B0195C7D04DAE31D04C5F573C383 /* SwiftSupport.swift in Sources */, + E0EA0EF4015AD59A70ED23C979A6A0C0 /* UIApplication+StrictKeyWindow.m in Sources */, + 79B501D0BC7B0EC7F32607CA53DC3B6F /* UIImage+Compare.m in Sources */, + 30A4DC4FB0FB4A31EBB87BAB40772899 /* UIImage+Diff.m in Sources */, + 3FF5F51EE684B5AB78BE233E6520B27C /* UIImage+Snapshot.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8D3D438059E63734073B45AFFF9CE503 /* Sources */ = { + 402BD56A849903B58E6787DD7FDC2510 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 630FF6D1F5CFCD997DA71AA06BB34B04 /* Pods-PopTip Demo-dummy.m in Sources */, + 57EB1F068BA7C8AFEAE02983DB17CFAD /* CurrentTestCaseTracker.swift in Sources */, + 48140F7D929CF6250944012AFB7948E4 /* DynamicSizeSnapshot.swift in Sources */, + CA47F9860D035A879E222C366B807340 /* HaveValidDynamicTypeSnapshot.swift in Sources */, + 56C63D2A478C6B43D30C3F5F8D1C17CF /* HaveValidSnapshot.swift in Sources */, + 5A2624E5A86B04603605C3BCCD73DE7F /* NBSMockedApplication.m in Sources */, + 0C0397B2FF0E3A2651B6C2E83AFABE77 /* Nimble-Snapshots-dummy.m in Sources */, + C98FF48F8CAC5F4FB6AFFCB33BE40AF7 /* PrettyDynamicTypeSyntax.swift in Sources */, + 29203A2F0FE323638DFA6F3F7C8C8DE4 /* PrettySyntax.swift in Sources */, + 88F193B38F98F0065DA84B9067903635 /* XCTestObservationCenter+CurrentTestCaseTracker.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A48D3F24FD295009E56794408662E208 /* Sources */ = { + 6478C237A8BADB27997BC15995B3507E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8D0C560EA9206B54904F4D0886716CAB /* AdapterProtocols.swift in Sources */, - 8C3E21E703870F14FBB89C252A3CF066 /* AllPass.swift in Sources */, - 801F90943FABF6AD12FF491324671EE3 /* AssertionDispatcher.swift in Sources */, - 42268E34CB8825DD5C2068A93A0CF45A /* AssertionRecorder.swift in Sources */, - 170E8B2CE5102F5A9BAB2CDC6848214C /* Async.swift in Sources */, - 191F4182463FAA121084697641C76F70 /* AsyncMatcherWrapper.swift in Sources */, - C9417AF6D2B31AA9938E523909D00EB4 /* BeAKindOf.swift in Sources */, - 354EE6DD5A8187E83119518587489E3D /* BeAnInstanceOf.swift in Sources */, - 68785778F8DA5774DDCDD5E67ADE758C /* BeCloseTo.swift in Sources */, - 81ABB1819639E6616DDEE39F4BCEECAC /* BeEmpty.swift in Sources */, - 6128B6CDC70A52B0797D353DB399BB72 /* BeginWith.swift in Sources */, - AC7BE39EF11283FEB3DA3720143BA08D /* BeGreaterThan.swift in Sources */, - 101B861950D7E07F56BFE4B79BE597E2 /* BeGreaterThanOrEqualTo.swift in Sources */, - 3792E5108E28B372D0BBC283CFC79804 /* BeIdenticalTo.swift in Sources */, - 54743D40FDAE45F4C3E462715B8AFCA8 /* BeLessThan.swift in Sources */, - CDC51D3D34E62ED7C534CDF7474EF6FB /* BeLessThanOrEqual.swift in Sources */, - 9A602F671A3FE663E4541D93E29481DC /* BeLogical.swift in Sources */, - 117A7BFD0C59A06E904080394A034DF8 /* BeNil.swift in Sources */, - 5E85BECFB0DE9C35131856B4D4CFF457 /* BeVoid.swift in Sources */, - 15FDA0CC0F97F9C8F32EB61405949CFE /* Contain.swift in Sources */, - 261454E4ED4756CDAF7EEC69A5D60227 /* ContainElementSatisfying.swift in Sources */, - 58AEA9BCE0F7530DC471FC82154E70A3 /* CwlBadInstructionException.swift in Sources */, - DE53E3EFB231CB5931AAB80181DE203E /* CwlCatchBadInstruction.swift in Sources */, - CDC427433709B9DCC0F453ACC0420ED7 /* CwlCatchException.m in Sources */, - F0D3742DB0881E9D0929A737F6A203B8 /* CwlCatchException.swift in Sources */, - A076AC596A5DA559484044CE11908E9B /* CwlDarwinDefinitions.swift in Sources */, - EBDC2270A85B3EF52AE1BAFDE3112E9D /* CwlMachBadInstructionHandler.m in Sources */, - 9DB41107B2F8DDB155AFFBBF546E1369 /* DSL+Wait.swift in Sources */, - BC727F1A54B7D12439B51C0CF2FB0937 /* DSL.m in Sources */, - FA70140FBD119E3A722AEAEEBD4991FF /* DSL.swift in Sources */, - BECC57EBF427A7B4DD86557878E1E087 /* EndWith.swift in Sources */, - 23E8FBD696707D21A21F6274EDE60CF1 /* Equal.swift in Sources */, - F819EBECA137E16FE436D11EC52118F5 /* Errors.swift in Sources */, - F5CDA94B21A008202EE634C6A68E478D /* Expectation.swift in Sources */, - 8CA260F33A0019F407AC85DC29F4CEBF /* Expression.swift in Sources */, - 45F6BCA02C320428899D955D91E8DB0C /* FailureMessage.swift in Sources */, - B7136FACCBF508177CB6C63509F23AC5 /* Functional.swift in Sources */, - 7FC3C9AFFB27796CEDC86D87DC512CFB /* HaveCount.swift in Sources */, - 16150805BA21482D4C88B48423B9466D /* mach_excServer.c in Sources */, - 56479EFE12C2A25D3EEF13B0F02E0D7A /* Match.swift in Sources */, - E2BB642CBD39E9DEC5159598156D6D1F /* MatcherFunc.swift in Sources */, - 4812D70E9D35223BA3D19CE315CB3FD9 /* MatcherProtocols.swift in Sources */, - 0B57A9A9759EC0CB624AC0A2A6BCD00C /* MatchError.swift in Sources */, - 22DF5C275C5D4AC896AA71EB884ED564 /* Nimble-dummy.m in Sources */, - B8D8E3673B312B94C7EAE484C2E4FFDA /* NimbleEnvironment.swift in Sources */, - 26BA9CEEA0E0CA245423427FB922F01F /* NimbleXCTestHandler.swift in Sources */, - 42C229CE887152ABD4CCEDE724A8D42D /* NMBExceptionCapture.m in Sources */, - EE49B509C881B9ADFA007BC10A25D1A0 /* NMBExpectation.swift in Sources */, - C08F98B31495947A7EC2E7EDF0086B94 /* NMBObjCMatcher.swift in Sources */, - 57A739B91AEF886BDD4DB7CA6EEEAFAD /* NMBStringify.m in Sources */, - 874FE1141F13A38531F4697BE979F5CF /* PostNotification.swift in Sources */, - 08CFF1FB935A7D5B6E4B6BE3A5303B40 /* RaisesException.swift in Sources */, - 3B554908E902EB2A1DA8BD776507A11C /* SatisfyAnyOf.swift in Sources */, - A71DE0157C73E51655C6BE1CF8DD61CE /* SourceLocation.swift in Sources */, - 611AD23ED1A4928A6574CDCC8830DE0D /* Stringers.swift in Sources */, - 428606A406891BEE03840D98DF5790E4 /* ThrowAssertion.swift in Sources */, - E9710C4851E51DE5F0D3DF744BAF5576 /* ThrowError.swift in Sources */, - 93BD47E3FB491835CDA76380B3013CF5 /* XCTestObservationCenter+Register.m in Sources */, + E68FCDC3550B6EE493A15BE22237576D /* AMPopTip-dummy.m in Sources */, + 5CE944B24E92F75283808185B053CA33 /* PopTip+Draw.swift in Sources */, + 32E11C68B7E380DAF57756919DFC2BB0 /* PopTip+Transitions.swift in Sources */, + 85D5C597E5A1C66586CE08A4BFC7F885 /* PopTip.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A4E3B8AE32A0A4149CF1169E4305D9AF /* Sources */ = { + 6A262387B911EDEA1B98F89360B763B6 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6EBCA43A2103FE9D48D994DFA1EAF767 /* Pods-PopTip Demo-PopTip Extension-dummy.m in Sources */, + E309E8330485C49C065B38E52C41A299 /* Pods-PopTip Demo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - BEA5C5ACEA7D28BFBB4A6A2A821035BA /* Sources */ = { + BE701993DBD8B2622A84E53A8E00C2F1 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 79CB9D3789D5095928376F3198480F63 /* Pods-PopTip DemoTests-dummy.m in Sources */, + 3CEC9666E164E56F28AD3EC5F71624CD /* Pods-PopTip DemoTests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C630F17150E1EAEA2A37676C0A408610 /* Sources */ = { + CCCC87107A438DDAE261813DDEB8A446 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 45A19473822535A1720F3B9A16B8FAE9 /* HaveValidSnapshot.swift in Sources */, - A14877FB5DB6F9537AAA79BACDB9C34F /* Nimble-Snapshots-dummy.m in Sources */, - 6750EAEBF4498DD4F2A4AA83545E1DB8 /* NimbleSnapshotsConfiguration.swift in Sources */, - 58AF924B0EAFE2360DA9024AA38CECD7 /* PrettySyntax.swift in Sources */, + D3A8D20BEDC46C80A42D6F7BDA32AAE9 /* Behavior.swift in Sources */, + BB12015B95C941DBA7EF46FA3DD44880 /* Callsite.swift in Sources */, + 8FC94352BAAA1B77653B34EC5985CF52 /* Closures.swift in Sources */, + E1FACE293D2216BF2ABA1DE31874351F /* Configuration.swift in Sources */, + 81211C1910CF04C5936511C397A3F841 /* DSL.swift in Sources */, + D11ADB0D3FA4022060B79BED74421F62 /* ErrorUtility.swift in Sources */, + B2B1939F38FA0F9D4DA8A0F712596FD2 /* Example.swift in Sources */, + A5436D327EE3F9E435C533FA9314382E /* ExampleGroup.swift in Sources */, + 6C49A3B6785E4180BB5DFCE3C6DF4EC5 /* ExampleHooks.swift in Sources */, + 4A79C6E050492F6B4B72518F2AF143FF /* ExampleMetadata.swift in Sources */, + 306E679C628318FE60D603D13B4FFBA1 /* Filter.swift in Sources */, + 3715872AE6D47358024DFE600FB7577C /* HooksPhase.swift in Sources */, + BB998ED871BF1D0143368EAE88BF663F /* NSBundle+CurrentTestBundle.swift in Sources */, + CF1351463BEB454D279DF2B292841488 /* QCKDSL.m in Sources */, + F162AB513DDE6A7FE9C4716F1EE94D8E /* Quick-dummy.m in Sources */, + EFB91FC0832DD7B3B5B05D4AF85A2BDF /* QuickConfiguration.m in Sources */, + D74DC22C55ADE37571E7E7EEC2D64E54 /* QuickConfiguration.swift in Sources */, + B63AD4D9B71DF38F2A350B47D859289F /* QuickSelectedTestSuiteBuilder.swift in Sources */, + 652BF47B1A51DBF7AC5BFE0CECB6676B /* QuickSpec.m in Sources */, + 61931EFCD4854516AD3DA75101231785 /* QuickSpecBase.m in Sources */, + 77C44DB624CB1B7F521F66F1E02624FD /* QuickTestSuite.swift in Sources */, + 0A2A042AE9BD5C00BB8C68FE889FE700 /* String+C99ExtendedIdentifier.swift in Sources */, + F1216169A31BD69E23A7CF3EA91B966D /* SuiteHooks.swift in Sources */, + D85D4FFD5907D396E00171768C1523E4 /* URL+FileName.swift in Sources */, + 6140A77EACAD0FC8E751229EFF69A2ED /* World+DSL.swift in Sources */, + 3BFC633B022F34844416263062FF09E8 /* World.swift in Sources */, + 8155518C6A8781F6B128E3B3FE7B1147 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - EFD3A400F43794D1B62F81BBAE84FAD1 /* Sources */ = { + D0F25952859BD2ED17A7177A46922A25 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5CBD03CF7E7F4A79CDFAE242B443358D /* AMPopTip-dummy.m in Sources */, - 66E4D4D09CF8D682D85B8A2E179A37E7 /* PopTip+Draw.swift in Sources */, - 933575268947BA83E51846F0EBFBD2EE /* PopTip+Transitions.swift in Sources */, - 5B3F70D6F1496A70D355A034029CCCBE /* PopTip.swift in Sources */, + EB13561E71736E81399CB85419419570 /* AdapterProtocols.swift in Sources */, + CCA41EC992E6CFEC5367FE79E843240D /* AllPass.swift in Sources */, + AB2F79D3BF6F4CB33383BDBA189AA12B /* AssertionDispatcher.swift in Sources */, + BE2E0A9AC5E2019BFD31452E96ED83D9 /* AssertionRecorder.swift in Sources */, + 3CFD5091F02F30ADE4EEC622C7F487C8 /* Async.swift in Sources */, + 3B324746542B5868C6AA793F2EF93FEB /* Await.swift in Sources */, + A38A1BAB9DC7FB158426F2791D2BDB9B /* BeAKindOf.swift in Sources */, + EDD6F0CB0C4A0FBF470FF1FA37E28FCC /* BeAnInstanceOf.swift in Sources */, + 5221433E6847800B0533CAADF9BABA04 /* BeCloseTo.swift in Sources */, + 543967CB633CDE86DFD53581EAE1A35D /* BeEmpty.swift in Sources */, + 4660867D6E616474D6B62FAF476CCAAD /* BeginWith.swift in Sources */, + 8CB9325284A6E8E782D34AF833480CA3 /* BeGreaterThan.swift in Sources */, + 8B729C7257E0E5C7F86E3597D460E212 /* BeGreaterThanOrEqualTo.swift in Sources */, + 6BEA7B617028CECFCCF7E73DE1EFBC00 /* BeIdenticalTo.swift in Sources */, + 4A1B85AEDC3DB75FC35A3F5438B0AD81 /* BeLessThan.swift in Sources */, + 981D9FBF09890E4E20DF889B2AD514F0 /* BeLessThanOrEqual.swift in Sources */, + BB1619BCE35A078A932C56B2519CCB6C /* BeLogical.swift in Sources */, + A02F4AB85BBBEBA608F33B3EA07C0CF9 /* BeNil.swift in Sources */, + 0834E167066BF3659E39621F58F440A6 /* BeVoid.swift in Sources */, + E1216911C249E3FC383CE5EE1E1066F3 /* Contain.swift in Sources */, + DCC243D2AEC18F6FD827742DCBCC4D1E /* ContainElementSatisfying.swift in Sources */, + FA5A1BA48BC7F11F18E7EB2C61FB2054 /* CwlBadInstructionException.swift in Sources */, + 96C4F7349BB0B624490075CB4F37F2B4 /* CwlCatchBadInstruction.swift in Sources */, + 68E91926C879D6865E92A324D90D75C5 /* CwlCatchException.m in Sources */, + 53B30596B1EA5F0845A886843FB9E859 /* CwlCatchException.swift in Sources */, + 25B8696FF6F4BC3F90101C2B4A0BFFBE /* CwlDarwinDefinitions.swift in Sources */, + 641ADF187D575C30FF16C890DD38496A /* CwlMachBadInstructionHandler.m in Sources */, + BF162FE488440AC9824E22EF6BD760FC /* DSL+Wait.swift in Sources */, + 0160091B65F78655415EF69FA9525B9F /* DSL.m in Sources */, + 7460C7CD0497AAE90DA55B895F47DEC4 /* DSL.swift in Sources */, + 01904B0245AC2031E9ADD586BE7224C0 /* EndWith.swift in Sources */, + 54A61062B9FB72C6BA0054B2A685ED0E /* Equal.swift in Sources */, + DEF6305C7FCCD86B037E3811551D16E6 /* Errors.swift in Sources */, + B7A0119D88C1DF43AFD25FB3A0B6E842 /* Expectation.swift in Sources */, + 4CBB32046E3B8844FFA021ACFC57702F /* ExpectationMessage.swift in Sources */, + F630B376ABE2B76BD06716E25EC25606 /* Expression.swift in Sources */, + B662FB934B08450530A1A521489732B3 /* FailureMessage.swift in Sources */, + 683798C6164A47491876EF6076F27CB9 /* Functional.swift in Sources */, + E84A4ED0B63C48CC6E4571784BF070F9 /* HaveCount.swift in Sources */, + DFE607CA56BECABAFF108C6E606847A6 /* mach_excServer.c in Sources */, + 7ACF7943A939837532BB53A73F01CE63 /* Match.swift in Sources */, + 1662BEDD868AF1CD729C4269E69A3580 /* MatcherFunc.swift in Sources */, + 67D16958DA7E0257BECE6ACD1EF0A176 /* MatcherProtocols.swift in Sources */, + 8B32C823A5263884ACC364067EFADA22 /* MatchError.swift in Sources */, + D01B8CB271F18C9B70586679F0C2E747 /* Nimble-dummy.m in Sources */, + 63B6EE789529A220E576A10E3356FBEE /* NimbleEnvironment.swift in Sources */, + 6CF8C877AF611E2E0C67EDD06618E63C /* NimbleXCTestHandler.swift in Sources */, + A6B3BD3449B75E0EEE19302454659458 /* NMBExceptionCapture.m in Sources */, + BAEAB2ADD34955EE77CBA4B43994B6F7 /* NMBExpectation.swift in Sources */, + AD1ABD5ADD73F47E6DF31F91EA4A0FF8 /* NMBObjCMatcher.swift in Sources */, + 2B5277644A91CF18B97BDA2ED5CF2701 /* NMBStringify.m in Sources */, + C098C153F2988A344EAD8EE4C0CDF882 /* PostNotification.swift in Sources */, + 9BA4E7F68AE9967DE324C686E6DDF1A9 /* Predicate.swift in Sources */, + 4B97BD308458A93E1F03EF7A7D5D4DCE /* RaisesException.swift in Sources */, + 5B8DC6716BDD04AF78AC8048F5BACF38 /* SatisfyAllOf.swift in Sources */, + AE99DE37027335451FFD42AD0017BF12 /* SatisfyAnyOf.swift in Sources */, + DA0DA6C2D7C6235862E9A6929144EBA5 /* SourceLocation.swift in Sources */, + F8EA3B6B23173D51461F920F77B3C6BE /* Stringers.swift in Sources */, + 99B2BFD67568B9953B86113CF7D1290C /* ThrowAssertion.swift in Sources */, + E6C11C009FC4EEB972E5175E3D2EDCA5 /* ThrowError.swift in Sources */, + 2D57849BBE4DB509C70D6DC48E6E21B3 /* ToSucceed.swift in Sources */, + A79BC369F4B85216A5CFFAE710C93689 /* XCTestObservationCenter+Register.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - F25432B685885C92BAB41B2E94A4E8A0 /* Sources */ = { + EB4F83CD8D2B7B80CA4E8837AEA1D1D3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D7F9ABA0EEDFE7BF6C868300DDCD0EA9 /* FBSnapshotTestCase-dummy.m in Sources */, - 15316826E3F51F71EC97A57380595BB8 /* FBSnapshotTestCase.m in Sources */, - 87FFB2C2BA93ED5B29B8F7BCA9484B16 /* FBSnapshotTestCasePlatform.m in Sources */, - 674FAA16DA069C0086E7997510103124 /* FBSnapshotTestController.m in Sources */, - FE8F08750027E8A4A90B64F2E4F0C354 /* SwiftSupport.swift in Sources */, - 774A7B4B3A8DDB52EF1018A0F6CDE6B8 /* UIApplication+StrictKeyWindow.m in Sources */, - EFB9A27A708781B839036C72BCCD125A /* UIImage+Compare.m in Sources */, - 0459A2E1B1CA3402DABEEDBF4D618179 /* UIImage+Diff.m in Sources */, - 41FFAAF0860C00C7B0CAC223DE3ED7EA /* UIImage+Snapshot.m in Sources */, + 6DAD0721434AA5E307A6CDC647AFFB93 /* Pods-PopTip Demo-PopTip Extension-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 09F13E35D83B674BBC0AE9D534B68B42 /* PBXTargetDependency */ = { + 52D0DD48AAAB6C339F4DC4E4EB3B489E /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Quick; - target = F745D6D8CF6D4183FE335DA396B04733 /* Quick */; - targetProxy = AA4F758CCCB30FA4972D78D5A8274D4F /* PBXContainerItemProxy */; + name = Nimble; + target = 6F13695E06195A78EA8A95F8C7ED0D2F /* Nimble */; + targetProxy = 19C40B2FA371C5E993378C3756C33FB6 /* PBXContainerItemProxy */; }; - 1B21561041C1B0F456A86AA9F83825FC /* PBXTargetDependency */ = { + 54521910668B4E46AF3D6DEE6A4F8F2D /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBSnapshotTestCase; - target = 9208F82521C84CC962FB475DC38D3371 /* FBSnapshotTestCase */; - targetProxy = 0C2F04C6E18F8D853570EFAE95569A72 /* PBXContainerItemProxy */; + name = iOSSnapshotTestCase; + target = C393038B0BEF088C1B93E6528005862D /* iOSSnapshotTestCase */; + targetProxy = D4DB503013938EC819356AE854D92D78 /* PBXContainerItemProxy */; }; - 3FD1FFF769C705EF2E3973239E769FFA /* PBXTargetDependency */ = { + 5DC7C32C4D3BBD58F9CE5E211FB7AD85 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Nimble; - target = 9A8D48230A8E5F0BF70C6620B093246E /* Nimble */; - targetProxy = EC47A1129CA623B876CC40136E9A8459 /* PBXContainerItemProxy */; + target = 6F13695E06195A78EA8A95F8C7ED0D2F /* Nimble */; + targetProxy = 5E335AD694F18D35CA55B1B54BF09B9D /* PBXContainerItemProxy */; }; - 40978AF5DC54EB98C79E46ADC5747F97 /* PBXTargetDependency */ = { + 639F6122A2E7CB60B8F63F0411BE0F8C /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Nimble-Snapshots"; - target = F59D37792BA4734F625CB674BDC6F9FA /* Nimble-Snapshots */; - targetProxy = 401F1886085D5BF5E71653E4F1D56307 /* PBXContainerItemProxy */; + name = iOSSnapshotTestCase; + target = C393038B0BEF088C1B93E6528005862D /* iOSSnapshotTestCase */; + targetProxy = BA889852E7D13709E4E63BCE2040EF31 /* PBXContainerItemProxy */; }; - 4DF6FEF86F86BF2D469B6B98674E51AF /* PBXTargetDependency */ = { + 920CB51A0D4C1E888D3F47C8933BA60C /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = AMPopTip; - target = 57A6BD4F68D1BFFFDCE47B0F400E13B5 /* AMPopTip */; - targetProxy = EF2EBD82D0C09CA2404B01D8B4EE990B /* PBXContainerItemProxy */; + target = 0B974B55B3C5F71E53DF6070DC0CF6CF /* AMPopTip */; + targetProxy = 32F7CCA5A6EDAF0F68081AC36ECD8305 /* PBXContainerItemProxy */; }; - 4F467DB94547D90083727504F7443F86 /* PBXTargetDependency */ = { + B8A3C703786B4FB985958B45CA678FE6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBSnapshotTestCase; - target = 9208F82521C84CC962FB475DC38D3371 /* FBSnapshotTestCase */; - targetProxy = 894C5D1EEC8975E6AFB549D61D7725AE /* PBXContainerItemProxy */; + name = "Pods-PopTip Demo"; + target = 760D0F5B72491D747935D786BA1AA8A9 /* Pods-PopTip Demo */; + targetProxy = 50231BF5191324F1721C406B843616A9 /* PBXContainerItemProxy */; }; - 97D80685D5BD31E37C16B95A43DF42A7 /* PBXTargetDependency */ = { + CBA33F06B48FAED68A6F45A9DB368BBE /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = AMPopTip; - target = 57A6BD4F68D1BFFFDCE47B0F400E13B5 /* AMPopTip */; - targetProxy = C75226A043CC723E06469070D4A89E31 /* PBXContainerItemProxy */; + name = "Nimble-Snapshots"; + target = EE19095A8C98E0BC5774005673495238 /* Nimble-Snapshots */; + targetProxy = 19782C6F7E071339C046AFA8EA84CDF1 /* PBXContainerItemProxy */; }; - AE95D0CD638823928F6F8E257C39BD9D /* PBXTargetDependency */ = { + D11E3541A70F2CC6853B248765C6DA2D /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Pods-PopTip Demo"; - target = 8DB3BB93AB209436276723C938FEA5F0 /* Pods-PopTip Demo */; - targetProxy = 95D57D5567F8A2C2682213988BDCA3CE /* PBXContainerItemProxy */; + name = AMPopTip; + target = 0B974B55B3C5F71E53DF6070DC0CF6CF /* AMPopTip */; + targetProxy = A9C36414AB2E9CF0DB9F409C8D24F26F /* PBXContainerItemProxy */; }; - B5B7E3923CD880EE6C8A822E0FCE7008 /* PBXTargetDependency */ = { + F5D15CECEF7B5AECF5ADB5E0DCDD61BA /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Quick; - target = F745D6D8CF6D4183FE335DA396B04733 /* Quick */; - targetProxy = D5D00B951CBC347927E89E6DCCFB9ABA /* PBXContainerItemProxy */; - }; - FA77CB5B2ED692429445FFFE5372F0BC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Nimble; - target = 9A8D48230A8E5F0BF70C6620B093246E /* Nimble */; - targetProxy = 1D2029BE7FFE69AB705642C58A288C98 /* PBXContainerItemProxy */; + target = C82891EAB7293DBEE916B21F57E8474D /* Quick */; + targetProxy = 887F3F68013861B9D59935CA5378709B /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 0C770A1E50B7C0877B15426FD2D1155D /* Release */ = { + 0C0EE8E65E0D3BC892366DBBE309590C /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3E994D58A427D7C2DEC199C92F9A29B7 /* Pods-PopTip DemoTests.release.xcconfig */; + baseConfigurationReference = F2461D3B9700D77CBBB5FC22B35A23C3 /* Quick.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1482,19 +1502,18 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-PopTip DemoTests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Quick/Quick-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; + PRODUCT_MODULE_NAME = Quick; + PRODUCT_NAME = Quick; 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"; @@ -1502,12 +1521,10 @@ }; name = Release; }; - 13438274B89D355A21B645B047555E5A /* Debug */ = { + 0C2DBC61DADE5BCA7B2938335A5E6D1D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D732828C4A99ED688AA531932E8D8123 /* Pods-PopTip Demo-PopTip Extension.debug.xcconfig */; + baseConfigurationReference = 44BEC81CF120F8E81EB6AC965FC1AAC5 /* iOSSnapshotTestCase.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1517,29 +1534,29 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-PopTip Demo-PopTip Extension/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase.modulemap"; + PRODUCT_MODULE_NAME = FBSnapshotTestCase; + PRODUCT_NAME = FBSnapshotTestCase; 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; }; - 18E2CA1B73511AEF4908712615DFFA0E /* Debug */ = { + 2A996243DAD197F77F627CE6529A4F83 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 72A2234D1D382105CBC1993DEEF8F629 /* Nimble.xcconfig */; + baseConfigurationReference = D39A40C71DE754453C3B7DA33F478EE2 /* Pods-PopTip DemoTests.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1549,27 +1566,28 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 457AE667846512684CEAFAB1FE8B9143 /* Release */ = { + 2D77D006AED2658BB601F18A1CD234CB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 72A2234D1D382105CBC1993DEEF8F629 /* Nimble.xcconfig */; + baseConfigurationReference = 2BB292F6F1FB8257E7CB4D025DED6477 /* Nimble.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1581,7 +1599,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Nimble/Nimble-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -1599,42 +1617,69 @@ }; name = Release; }; - 53B02E2D202F50B5777A49976ED7B7C8 /* Release */ = { + 4BE66A09A74FD25164AAB3C2645B9B93 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 838BDCB41F1D11978C41C12669A7E0DA /* AMPopTip.xcconfig */; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - 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/AMPopTip/AMPopTip-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/AMPopTip/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + 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; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/AMPopTip/AMPopTip.modulemap"; - PRODUCT_MODULE_NAME = AMPopTip; - PRODUCT_NAME = AMPopTip; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + SYMROOT = "${SRCROOT}/../build"; }; name = Release; }; - 7044423465A25F2FA6F821B0DEE23A91 /* Debug */ = { + 52D1FCFBC24D5D16CF710035910D8260 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 358056853B23BC31B163CD395B599989 /* Quick.xcconfig */; + baseConfigurationReference = F2461D3B9700D77CBBB5FC22B35A23C3 /* Quick.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1646,7 +1691,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Quick/Quick-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -1663,10 +1708,11 @@ }; name = Debug; }; - 77E024BDE468D9A81A61A0D710FFC7B2 /* Release */ = { + 531E6CF993B362E92D6BB2B91749FF9D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3EF04624DD2E36F6DCF48192237D69C0 /* Nimble-Snapshots.xcconfig */; + baseConfigurationReference = DD8FC6C230837A3526466F7BC977F1A1 /* Pods-PopTip DemoTests.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1676,18 +1722,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble-Snapshots/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots.modulemap"; - PRODUCT_MODULE_NAME = Nimble_Snapshots; - PRODUCT_NAME = Nimble_Snapshots; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1695,9 +1742,9 @@ }; name = Release; }; - 78364BED52BBDD8CA62CDF1E5EF60070 /* Debug */ = { + 60580C825184B855609C145A83032E6B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 850E2A73E7078CFFE50FAE1D1CE12D12 /* Pods-PopTip DemoTests.debug.xcconfig */; + baseConfigurationReference = 77B4A2C4CA7A7DB659E23CC41DDF4E0F /* Pods-PopTip Demo.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; @@ -1709,12 +1756,12 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-PopTip DemoTests/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1723,14 +1770,15 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 7EA57589282A2C23A7945AC2DBE39152 /* Debug */ = { + 6243A2DC6F6F0BF0C7D7782F81636DF1 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3EF04624DD2E36F6DCF48192237D69C0 /* Nimble-Snapshots.xcconfig */; + baseConfigurationReference = BE83FD1192F49434FF3A9FCFC1A5FBB7 /* Nimble-Snapshots.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1742,7 +1790,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_PREFIX_HEADER = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble-Snapshots/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -1754,12 +1802,46 @@ 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; + }; + 6F8A41F75A87E2347BCA821461F4B405 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E7D7BE47BE4AF0C626764A4374E285D5 /* Pods-PopTip Demo.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = 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-PopTip Demo/Pods-PopTip Demo-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.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; }; - 85B95B1234E227C814CCC2C7902D0916 /* Release */ = { + 7EF7227D9B20A1D549000096ACCB23D7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1791,16 +1873,17 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_ALLOWED = NO; - CODE_SIGNING_REQUIRED = NO; 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; @@ -1810,20 +1893,23 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - 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_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.2; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; - name = Release; + name = Debug; }; - 87BBED34A39281A2F248879874936A74 /* Debug */ = { + 801050568A52EA149EE1FC8CFED73676 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7418799601C5233F8AA944A973038A0E /* FBSnapshotTestCase.xcconfig */; + baseConfigurationReference = 4820DEAB84B6336402B3DD158B4A675D /* Pods-PopTip Demo-PopTip Extension.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1833,28 +1919,30 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; - PRODUCT_MODULE_NAME = FBSnapshotTestCase; - PRODUCT_NAME = FBSnapshotTestCase; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - A6CBA1C92C52CA422FDD21652B8348C1 /* Release */ = { + 90B60DCA900DC2212570C9479ECBF8FF /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7418799601C5233F8AA944A973038A0E /* FBSnapshotTestCase.xcconfig */; + baseConfigurationReference = 1A15CED75CF25B741E77880BCC8DE726 /* Pods-PopTip Demo-PopTip Extension.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1864,18 +1952,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; - PRODUCT_MODULE_NAME = FBSnapshotTestCase; - PRODUCT_NAME = FBSnapshotTestCase; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1883,75 +1972,9 @@ }; name = Release; }; - A73625DEBD810B78234FA1958C191C8C /* Debug */ = { + A7552D89A0633450D00D572B760EF241 /* Release */ = { isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_ALLOWED = NO; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = 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_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - 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_VERSION = 4.2; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; - AE0D1F48A36DC0D278B723C542ED6A0D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 358056853B23BC31B163CD395B599989 /* Quick.xcconfig */; + baseConfigurationReference = FC0AEC1C0265D16A03E08E0941C0BD6D /* AMPopTip.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1962,14 +1985,14 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/AMPopTip/AMPopTip-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AMPopTip/AMPopTip-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; - PRODUCT_MODULE_NAME = Quick; - PRODUCT_NAME = Quick; + MODULEMAP_FILE = "Target Support Files/AMPopTip/AMPopTip.modulemap"; + PRODUCT_MODULE_NAME = AMPopTip; + PRODUCT_NAME = AMPopTip; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -1981,11 +2004,10 @@ }; name = Release; }; - C09FFE1CF2F3D8A77B2EB071E118784B /* Debug */ = { + B5C512ACD86885AD1CE8AA8884968FE7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5EC130C8726E17D4A7AD48C7AA65E98C /* Pods-PopTip Demo.debug.xcconfig */; + baseConfigurationReference = 44BEC81CF120F8E81EB6AC965FC1AAC5 /* iOSSnapshotTestCase.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1995,30 +2017,29 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-PopTip Demo/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase.modulemap"; + PRODUCT_MODULE_NAME = FBSnapshotTestCase; + PRODUCT_NAME = FBSnapshotTestCase; 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 = Debug; + name = Release; }; - C9CB5827FA7477700084C8F19456B5CD /* Debug */ = { + C1ABACEE1B85B31CF0E76B35A6E3707C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 838BDCB41F1D11978C41C12669A7E0DA /* AMPopTip.xcconfig */; + baseConfigurationReference = BE83FD1192F49434FF3A9FCFC1A5FBB7 /* Nimble-Snapshots.xcconfig */; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2028,14 +2049,14 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/AMPopTip/AMPopTip-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/AMPopTip/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/AMPopTip/AMPopTip.modulemap"; - PRODUCT_MODULE_NAME = AMPopTip; - PRODUCT_NAME = AMPopTip; + MODULEMAP_FILE = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots.modulemap"; + PRODUCT_MODULE_NAME = Nimble_Snapshots; + PRODUCT_NAME = Nimble_Snapshots; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -2046,11 +2067,10 @@ }; name = Debug; }; - CA2E97D9CDA29F1BD77695CCD4B2B5EF /* Release */ = { + C72172F776153836816AF515B673DE9B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B4D6CF2C609AEBC327DB671A80B15215 /* Pods-PopTip Demo.release.xcconfig */; + baseConfigurationReference = FC0AEC1C0265D16A03E08E0941C0BD6D /* AMPopTip.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2060,32 +2080,28 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-PopTip Demo/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/AMPopTip/AMPopTip-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AMPopTip/AMPopTip-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/AMPopTip/AMPopTip.modulemap"; + PRODUCT_MODULE_NAME = AMPopTip; + PRODUCT_NAME = AMPopTip; 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; + name = Debug; }; - CB132A42073FCFF0EDB2356B3CC96F61 /* Release */ = { + ECE6611DCE4AA8E772B23D7DD3B0CD21 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F52683387C103F5EBC11C9323B94A825 /* Pods-PopTip Demo-PopTip Extension.release.xcconfig */; + baseConfigurationReference = 2BB292F6F1FB8257E7CB4D025DED6477 /* Nimble.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2095,111 +2111,109 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-PopTip Demo-PopTip Extension/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Nimble/Nimble-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; + PRODUCT_MODULE_NAME = Nimble; + PRODUCT_NAME = Nimble; 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; + name = Debug; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 209A9393231BB4B40F8445CC63B05D72 /* Build configuration list for PBXNativeTarget "Pods-PopTip Demo-PopTip Extension" */ = { + 0DE161C5B6AE3EC912A75AE081D69530 /* Build configuration list for PBXNativeTarget "Pods-PopTip Demo" */ = { isa = XCConfigurationList; buildConfigurations = ( - 13438274B89D355A21B645B047555E5A /* Debug */, - CB132A42073FCFF0EDB2356B3CC96F61 /* Release */, + 6F8A41F75A87E2347BCA821461F4B405 /* Debug */, + 60580C825184B855609C145A83032E6B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 248AC8DC26ABFE36B8A2380C27791D68 /* Build configuration list for PBXNativeTarget "Nimble" */ = { + 0EDE00A0AE7F2ACDA112F853133A5D2F /* Build configuration list for PBXNativeTarget "Nimble" */ = { isa = XCConfigurationList; buildConfigurations = ( - 18E2CA1B73511AEF4908712615DFFA0E /* Debug */, - 457AE667846512684CEAFAB1FE8B9143 /* Release */, + ECE6611DCE4AA8E772B23D7DD3B0CD21 /* Debug */, + 2D77D006AED2658BB601F18A1CD234CB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + 262491F8F88C78C3956E89D40908C6DC /* Build configuration list for PBXNativeTarget "Pods-PopTip Demo-PopTip Extension" */ = { isa = XCConfigurationList; buildConfigurations = ( - A73625DEBD810B78234FA1958C191C8C /* Debug */, - 85B95B1234E227C814CCC2C7902D0916 /* Release */, + 801050568A52EA149EE1FC8CFED73676 /* Debug */, + 90B60DCA900DC2212570C9479ECBF8FF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 8DE36427AE56C81503352C1A9AF63448 /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */ = { + 295B7D799D337D141BAECB64ABF9146E /* Build configuration list for PBXNativeTarget "Nimble-Snapshots" */ = { isa = XCConfigurationList; buildConfigurations = ( - 87BBED34A39281A2F248879874936A74 /* Debug */, - A6CBA1C92C52CA422FDD21652B8348C1 /* Release */, + C1ABACEE1B85B31CF0E76B35A6E3707C /* Debug */, + 6243A2DC6F6F0BF0C7D7782F81636DF1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 8FDA07790B4B634BB2D8065B00C0990B /* Build configuration list for PBXNativeTarget "Quick" */ = { + 3288AB80519022CF68F678DDAE77269F /* Build configuration list for PBXNativeTarget "iOSSnapshotTestCase" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7044423465A25F2FA6F821B0DEE23A91 /* Debug */, - AE0D1F48A36DC0D278B723C542ED6A0D /* Release */, + 0C2DBC61DADE5BCA7B2938335A5E6D1D /* Debug */, + B5C512ACD86885AD1CE8AA8884968FE7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A321740DBE8999B677D180FB0B17279C /* Build configuration list for PBXNativeTarget "Pods-PopTip Demo" */ = { + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - C09FFE1CF2F3D8A77B2EB071E118784B /* Debug */, - CA2E97D9CDA29F1BD77695CCD4B2B5EF /* Release */, + 7EF7227D9B20A1D549000096ACCB23D7 /* Debug */, + 4BE66A09A74FD25164AAB3C2645B9B93 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A75D1E8CB344A29354E4736B594CE93C /* Build configuration list for PBXNativeTarget "Pods-PopTip DemoTests" */ = { + 53945ADFA8D79915C0D0011CB37313D8 /* Build configuration list for PBXNativeTarget "Quick" */ = { isa = XCConfigurationList; buildConfigurations = ( - 78364BED52BBDD8CA62CDF1E5EF60070 /* Debug */, - 0C770A1E50B7C0877B15426FD2D1155D /* Release */, + 52D1FCFBC24D5D16CF710035910D8260 /* Debug */, + 0C0EE8E65E0D3BC892366DBBE309590C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A9B421BBDC7462A77385FB2FA9EBD8AC /* Build configuration list for PBXNativeTarget "Nimble-Snapshots" */ = { + 55625FAA6B0118492EDF8C60EB484917 /* Build configuration list for PBXNativeTarget "Pods-PopTip DemoTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7EA57589282A2C23A7945AC2DBE39152 /* Debug */, - 77E024BDE468D9A81A61A0D710FFC7B2 /* Release */, + 2A996243DAD197F77F627CE6529A4F83 /* Debug */, + 531E6CF993B362E92D6BB2B91749FF9D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E0AB037F8039ECB951F4AC822D73663C /* Build configuration list for PBXNativeTarget "AMPopTip" */ = { + C6A879FE025A74D62A8577AB2E59ADF0 /* Build configuration list for PBXNativeTarget "AMPopTip" */ = { isa = XCConfigurationList; buildConfigurations = ( - C9CB5827FA7477700084C8F19456B5CD /* Debug */, - 53B02E2D202F50B5777A49976ED7B7C8 /* Release */, + C72172F776153836816AF515B673DE9B /* Debug */, + A7552D89A0633450D00D572B760EF241 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; } diff --git a/Demo/Pods/Quick/README.md b/Demo/Pods/Quick/README.md index e6dc0ad3..4e6931ed 100644 --- a/Demo/Pods/Quick/README.md +++ b/Demo/Pods/Quick/README.md @@ -3,7 +3,9 @@ [![Build Status](https://travis-ci.org/Quick/Quick.svg?branch=master)](https://travis-ci.org/Quick/Quick) [![CocoaPods](https://img.shields.io/cocoapods/v/Quick.svg)](https://cocoapods.org/pods/Quick) [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Accio supported](https://img.shields.io/badge/Accio-supported-0A7CF5.svg?style=flat)](https://github.com/JamitLabs/Accio) [![Platforms](https://img.shields.io/cocoapods/p/Quick.svg)](https://cocoapods.org/pods/Quick) +[![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com) Quick is a behavior-driven development framework for Swift and Objective-C. Inspired by [RSpec](https://github.com/rspec/rspec), [Specta](https://github.com/specta/specta), and [Ginkgo](https://github.com/onsi/ginkgo). @@ -44,7 +46,8 @@ Certain versions of Quick and Nimble only support certain versions of Swift. Dep |Swift version |Quick version |Nimble version | |:--------------------|:---------------|:--------------| -|Swift 3 |v1.0.0 or later |v5.0.0 or later| +|Swift 4.2 |v1.3.2 or later |v7.3.2 or later| +|Swift 3 / Swift 4 |v1.0.0 or later |v5.0.0 or later| |Swift 2.2 / Swift 2.3|v0.9.3 |v4.1.0 | ## Documentation diff --git a/Demo/Pods/Quick/Sources/Quick/Behavior.swift b/Demo/Pods/Quick/Sources/Quick/Behavior.swift new file mode 100644 index 00000000..da301a1d --- /dev/null +++ b/Demo/Pods/Quick/Sources/Quick/Behavior.swift @@ -0,0 +1,21 @@ +/** + A `Behavior` encapsulates a set of examples that can be re-used in several locations using the `itBehavesLike` function with a context instance of the generic type. + */ + +open class Behavior { + + /** + Override this variable if you want to provide custom name for this example group. + */ + open class var name: String { return String(describing: self) } + + /** + Override this method in your behavior to define a set of reusable examples. + + This behaves just like an example group defines using `describe` or `context`--it may contain any number of `beforeEach` + and `afterEach` closures, as well as any number of examples (defined using `it`). + + - parameter aContext: A closure that, when evaluated, returns a `Context` instance that provide the information on the subject. + */ + open class func spec(_ aContext: @escaping () -> Context) {} +} diff --git a/Demo/Pods/Quick/Sources/Quick/Callsite.swift b/Demo/Pods/Quick/Sources/Quick/Callsite.swift index bb5cc0c5..9250a177 100644 --- a/Demo/Pods/Quick/Sources/Quick/Callsite.swift +++ b/Demo/Pods/Quick/Sources/Quick/Callsite.swift @@ -1,21 +1,39 @@ import Foundation +#if canImport(Darwin) +@objcMembers +public class _CallsiteBase: NSObject {} +#else +public class _CallsiteBase: NSObject {} +#endif + +// Ideally we would always use `StaticString` as the type for tracking the file name +// in which an example is defined, for consistency with `assert` etc. from the +// stdlib, and because recent versions of the XCTest overlay require `StaticString` +// when calling `XCTFail`. Under the Objective-C runtime (i.e. building on macOS), we +// have to use `String` instead because StaticString can't be generated from Objective-C +#if SWIFT_PACKAGE +public typealias FileString = StaticString +#else +public typealias FileString = String +#endif + /** An object encapsulating the file and line number at which a particular example is defined. */ -final public class Callsite: NSObject { +final public class Callsite: _CallsiteBase { /** The absolute path of the file in which an example is defined. */ - public let file: String + public let file: FileString /** The line number on which an example is defined. */ public let line: UInt - internal init(file: String, line: UInt) { + internal init(file: FileString, line: UInt) { self.file = file self.line = line } @@ -27,6 +45,6 @@ extension Callsite { If two callsites are in the same file and on the same line, they must be equal. */ @nonobjc public static func == (lhs: Callsite, rhs: Callsite) -> Bool { - return lhs.file == rhs.file && lhs.line == rhs.line + return String(describing: lhs.file) == String(describing: rhs.file) && lhs.line == rhs.line } } diff --git a/Demo/Pods/Quick/Sources/Quick/Configuration/Configuration.swift b/Demo/Pods/Quick/Sources/Quick/Configuration/Configuration.swift index 583651bc..fe339973 100644 --- a/Demo/Pods/Quick/Sources/Quick/Configuration/Configuration.swift +++ b/Demo/Pods/Quick/Sources/Quick/Configuration/Configuration.swift @@ -72,7 +72,7 @@ final public class Configuration: NSObject { provided with metadata on the example that the closure is being run prior to. */ -#if _runtime(_ObjC) +#if canImport(Darwin) @objc(beforeEachWithMetadata:) public func beforeEach(_ closure: @escaping BeforeExampleWithMetadataClosure) { exampleHooks.appendBefore(closure) @@ -109,7 +109,7 @@ final public class Configuration: NSObject { is provided with metadata on the example that the closure is being run after. */ -#if _runtime(_ObjC) +#if canImport(Darwin) @objc(afterEachWithMetadata:) public func afterEach(_ closure: @escaping AfterExampleWithMetadataClosure) { exampleHooks.appendAfter(closure) diff --git a/Demo/Pods/Quick/Sources/Quick/Configuration/QuickConfiguration.swift b/Demo/Pods/Quick/Sources/Quick/Configuration/QuickConfiguration.swift new file mode 100644 index 00000000..661df2e7 --- /dev/null +++ b/Demo/Pods/Quick/Sources/Quick/Configuration/QuickConfiguration.swift @@ -0,0 +1,78 @@ +import Foundation +import XCTest + +#if SWIFT_PACKAGE + +open class QuickConfiguration: NSObject { + open class func configure(_ configuration: Configuration) {} +} + +#endif + +extension QuickConfiguration { + #if !canImport(Darwin) + private static var configurationSubclasses: [QuickConfiguration.Type] = [] + #endif + + /// Finds all direct subclasses of QuickConfiguration and passes them to the block provided. + /// The classes are iterated over in the order that objc_getClassList returns them. + /// + /// - parameter block: A block that takes a QuickConfiguration.Type. + /// This block will be executed once for each subclass of QuickConfiguration. + private static func enumerateSubclasses(_ block: (QuickConfiguration.Type) -> Void) { + #if canImport(Darwin) + var classesCount = objc_getClassList(nil, 0) + + guard classesCount > 0 else { + return + } + + let classes = UnsafeMutablePointer.allocate(capacity: Int(classesCount)) + defer { free(classes) } + + classesCount = objc_getClassList(AutoreleasingUnsafeMutablePointer(classes), classesCount) + + var configurationSubclasses: [QuickConfiguration.Type] = [] + for i in 0.. Void) { +public func it(_ description: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, closure: @escaping () -> Void) { World.sharedWorld.it(description, flags: flags, file: file, line: line, closure: closure) } @@ -143,7 +143,7 @@ public func it(_ description: String, flags: FilterFlags = [:], file: String = # - parameter file: The absolute path to the file containing the current example group. A sensible default is provided. - parameter line: The line containing the current example group. A sensible default is provided. */ -public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line) { +public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line) { itBehavesLike(name, flags: flags, file: file, line: line, sharedExampleContext: { return [:] }) } @@ -163,10 +163,26 @@ public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: String - parameter file: The absolute path to the file containing the current example group. A sensible default is provided. - parameter line: The line containing the current example group. A sensible default is provided. */ -public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, sharedExampleContext: @escaping SharedExampleContext) { +public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, sharedExampleContext: @escaping SharedExampleContext) { World.sharedWorld.itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) } +/** + Inserts the examples defined using a `Behavior` into the current example group. + The shared examples are executed at this location, as if they were written out manually. + This function also passes a strongly-typed context that can be evaluated to give the shared examples extra information on the subject of the example. + + - parameter behavior: The type of `Behavior` class defining the example group to be executed. + - parameter context: A closure that, when evaluated, returns an instance of `Behavior`'s context type to provide its example group with extra information on the subject of the example. + - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. + Empty by default. + - parameter file: The absolute path to the file containing the current example group. A sensible default is provided. + - parameter line: The line containing the current example group. A sensible default is provided. + */ +public func itBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, context: @escaping () -> C) { + World.sharedWorld.itBehavesLike(behavior, context: context, flags: flags, file: file, line: line) +} + /** Defines an example or example group that should not be executed. Use `pending` to temporarily disable examples or groups that should not be run yet. @@ -198,10 +214,17 @@ public func xcontext(_ description: String, flags: FilterFlags, closure: () -> V Use this to quickly mark an `it` closure as pending. This disables the example and ensures the code within the closure is never run. */ -public func xit(_ description: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, closure: @escaping () -> Void) { +public func xit(_ description: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, closure: @escaping () -> Void) { World.sharedWorld.xit(description, flags: flags, file: file, line: line, closure: closure) } +/** + Use this to quicklu mark an `itBehavesLike` closure as pending. + This disables the example group defined by this behavior and ensures the code within is never run. +*/ +public func xitBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, context: @escaping () -> C) { + World.sharedWorld.xitBehavesLike(behavior, context: context, flags: flags, file: file, line: line) +} /** Use this to quickly focus a `describe` closure, focusing the examples in the closure. If any examples in the test suite are focused, only those examples are executed. @@ -222,20 +245,27 @@ public func fcontext(_ description: String, flags: FilterFlags = [:], closure: ( Use this to quickly focus an `it` closure, focusing the example. If any examples in the test suite are focused, only those examples are executed. */ -public func fit(_ description: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, closure: @escaping () -> Void) { +public func fit(_ description: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, closure: @escaping () -> Void) { World.sharedWorld.fit(description, flags: flags, file: file, line: line, closure: closure) } /** Use this to quickly focus an `itBehavesLike` closure. */ -public func fitBehavesLike(_ name: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line) { +public func fitBehavesLike(_ name: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line) { fitBehavesLike(name, flags: flags, file: file, line: line, sharedExampleContext: { return [:] }) } /** Use this to quickly focus an `itBehavesLike` closure. */ -public func fitBehavesLike(_ name: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, sharedExampleContext: @escaping SharedExampleContext) { +public func fitBehavesLike(_ name: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, sharedExampleContext: @escaping SharedExampleContext) { World.sharedWorld.fitBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) } + +/** + Use this to quickly focus on `itBehavesLike` closure. + */ +public func fitBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, context: @escaping () -> C) { + World.sharedWorld.fitBehavesLike(behavior, context: context, flags: flags, file: file, line: line) +} diff --git a/Demo/Pods/Quick/Sources/Quick/DSL/World+DSL.swift b/Demo/Pods/Quick/Sources/Quick/DSL/World+DSL.swift index 127ca540..14dcdbf4 100644 --- a/Demo/Pods/Quick/Sources/Quick/DSL/World+DSL.swift +++ b/Demo/Pods/Quick/Sources/Quick/DSL/World+DSL.swift @@ -56,7 +56,7 @@ extension World { currentExampleGroup.hooks.appendBefore(closure) } -#if _runtime(_ObjC) +#if canImport(Darwin) @objc(beforeEachWithMetadata:) internal func beforeEach(closure: @escaping BeforeExampleWithMetadataClosure) { currentExampleGroup.hooks.appendBefore(closure) @@ -74,7 +74,7 @@ extension World { currentExampleGroup.hooks.appendAfter(closure) } -#if _runtime(_ObjC) +#if canImport(Darwin) @objc(afterEachWithMetadata:) internal func afterEach(closure: @escaping AfterExampleWithMetadataClosure) { currentExampleGroup.hooks.appendAfter(closure) @@ -85,7 +85,8 @@ extension World { } #endif - internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + @nonobjc + internal func it(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () -> Void) { if beforesCurrentlyExecuting { raiseError("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'. ") } @@ -100,19 +101,22 @@ extension World { currentExampleGroup.appendExample(example) } - internal func fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + @nonobjc + internal func fit(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () -> Void) { var focusedFlags = flags focusedFlags[Filter.focused] = true self.it(description, flags: focusedFlags, file: file, line: line, closure: closure) } - internal func xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + @nonobjc + internal func xit(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () -> Void) { var pendingFlags = flags pendingFlags[Filter.pending] = true self.it(description, flags: pendingFlags, file: file, line: line, closure: closure) } - internal func itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { + @nonobjc + internal func itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: FileString, line: UInt) { guard currentExampleMetadata == nil else { raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") } @@ -131,30 +135,61 @@ extension World { } } - internal func fitBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { + @nonobjc + internal func fitBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: FileString, line: UInt) { var focusedFlags = flags focusedFlags[Filter.focused] = true self.itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: focusedFlags, file: file, line: line) } -#if _runtime(_ObjC) + internal func itBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: FileString, line: UInt) { + guard currentExampleMetadata == nil else { + raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") + } + let callsite = Callsite(file: file, line: line) + let closure = behavior.spec + let group = ExampleGroup(description: behavior.name, flags: flags) + currentExampleGroup.appendExampleGroup(group) + performWithCurrentExampleGroup(group) { + closure(context) + } + + group.walkDownExamples { (example: Example) in + example.isSharedExample = true + example.callsite = callsite + } + } + + internal func fitBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: FileString, line: UInt) { + var focusedFlags = flags + focusedFlags[Filter.focused] = true + self.itBehavesLike(behavior, context: context, flags: focusedFlags, file: file, line: line) + } + + internal func xitBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: FileString, line: UInt) { + var pendingFlags = flags + pendingFlags[Filter.pending] = true + self.itBehavesLike(behavior, context: context, flags: pendingFlags, file: file, line: line) + } + +#if canImport(Darwin) && !SWIFT_PACKAGE @objc(itWithDescription:flags:file:line:closure:) - private func objc_it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + internal func objc_it(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () -> Void) { it(description, flags: flags, file: file, line: line, closure: closure) } @objc(fitWithDescription:flags:file:line:closure:) - private func objc_fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + internal func objc_fit(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () -> Void) { fit(description, flags: flags, file: file, line: line, closure: closure) } @objc(xitWithDescription:flags:file:line:closure:) - private func objc_xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + internal func objc_xit(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () -> Void) { xit(description, flags: flags, file: file, line: line, closure: closure) } @objc(itBehavesLikeSharedExampleNamed:sharedExampleContext:flags:file:line:) - private func objc_itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { + internal func objc_itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: FileString, line: UInt) { itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) } #endif diff --git a/Demo/Pods/Quick/Sources/Quick/ErrorUtility.swift b/Demo/Pods/Quick/Sources/Quick/ErrorUtility.swift index 8405a81e..f13f43aa 100644 --- a/Demo/Pods/Quick/Sources/Quick/ErrorUtility.swift +++ b/Demo/Pods/Quick/Sources/Quick/ErrorUtility.swift @@ -1,7 +1,7 @@ import Foundation internal func raiseError(_ message: String) -> Never { -#if _runtime(_ObjC) +#if canImport(Darwin) NSException(name: .internalInconsistencyException, reason: message, userInfo: nil).raise() #endif diff --git a/Demo/Pods/Quick/Sources/Quick/Example.swift b/Demo/Pods/Quick/Sources/Quick/Example.swift index 56b33036..036aa3ad 100644 --- a/Demo/Pods/Quick/Sources/Quick/Example.swift +++ b/Demo/Pods/Quick/Sources/Quick/Example.swift @@ -1,12 +1,17 @@ import Foundation -private var numberOfExamplesRun = 0 +#if canImport(Darwin) +@objcMembers +public class _ExampleBase: NSObject {} +#else +public class _ExampleBase: NSObject {} +#endif /** Examples, defined with the `it` function, use assertions to demonstrate how code should behave. These are like "tests" in XCTest. */ -final public class Example: NSObject { +final public class Example: _ExampleBase { /** A boolean indicating whether the example is a shared example; i.e.: whether it is an example defined with `itBehavesLike`. @@ -57,12 +62,15 @@ final public class Example: NSObject { public func run() { let world = World.sharedWorld - if numberOfExamplesRun == 0 { + if world.numberOfExamplesRun == 0 { world.suiteHooks.executeBefores() } - let exampleMetadata = ExampleMetadata(example: self, exampleIndex: numberOfExamplesRun) + let exampleMetadata = ExampleMetadata(example: self, exampleIndex: world.numberOfExamplesRun) world.currentExampleMetadata = exampleMetadata + defer { + world.currentExampleMetadata = nil + } world.exampleHooks.executeBefores(exampleMetadata) group!.phase = .beforesExecuting @@ -80,9 +88,9 @@ final public class Example: NSObject { group!.phase = .aftersFinished world.exampleHooks.executeAfters(exampleMetadata) - numberOfExamplesRun += 1 + world.numberOfExamplesRun += 1 - if !world.isRunningAdditionalSuites && numberOfExamplesRun >= world.includedExampleCount { + if !world.isRunningAdditionalSuites && world.numberOfExamplesRun >= world.cachedIncludedExampleCount { world.suiteHooks.executeAfters() } } diff --git a/Demo/Pods/Quick/Sources/Quick/ExampleGroup.swift b/Demo/Pods/Quick/Sources/Quick/ExampleGroup.swift index ca383562..5fbfadb4 100644 --- a/Demo/Pods/Quick/Sources/Quick/ExampleGroup.swift +++ b/Demo/Pods/Quick/Sources/Quick/ExampleGroup.swift @@ -31,21 +31,24 @@ final public class ExampleGroup: NSObject { Returns a list of examples that belong to this example group, or to any of its descendant example groups. */ + #if canImport(Darwin) + @objc public var examples: [Example] { - var examples = childExamples - for group in childGroups { - examples.append(contentsOf: group.examples) - } - return examples + return childExamples + childGroups.flatMap { $0.examples } } + #else + public var examples: [Example] { + return childExamples + childGroups.flatMap { $0.examples } + } + #endif internal var name: String? { - if let parent = parent { - guard let name = parent.name else { return description } - return "\(name), \(description)" - } else { + guard let parent = parent else { return isInternalRootExampleGroup ? nil : description } + + guard let name = parent.name else { return description } + return "\(name), \(description)" } internal var filterFlags: FilterFlags { diff --git a/Demo/Pods/Quick/Sources/Quick/ExampleMetadata.swift b/Demo/Pods/Quick/Sources/Quick/ExampleMetadata.swift index e7510f71..2cdd10fa 100644 --- a/Demo/Pods/Quick/Sources/Quick/ExampleMetadata.swift +++ b/Demo/Pods/Quick/Sources/Quick/ExampleMetadata.swift @@ -1,11 +1,18 @@ import Foundation +#if canImport(Darwin) +@objcMembers +public class _ExampleMetadataBase: NSObject {} +#else +public class _ExampleMetadataBase: NSObject {} +#endif + /** A class that encapsulates information about an example, including the index at which the example was executed, as well as the example itself. */ -final public class ExampleMetadata: NSObject { +final public class ExampleMetadata: _ExampleMetadataBase { /** The example for which this metadata was collected. */ diff --git a/Demo/Pods/Quick/Sources/Quick/Filter.swift b/Demo/Pods/Quick/Sources/Quick/Filter.swift index d452efec..3382d38f 100644 --- a/Demo/Pods/Quick/Sources/Quick/Filter.swift +++ b/Demo/Pods/Quick/Sources/Quick/Filter.swift @@ -1,5 +1,12 @@ import Foundation +#if canImport(Darwin) +@objcMembers +public class _FilterBase: NSObject {} +#else +public class _FilterBase: NSObject {} +#endif + /** A mapping of string keys to booleans that can be used to filter examples or example groups. For example, a "focused" @@ -11,7 +18,7 @@ public typealias FilterFlags = [String: Bool] A namespace for filter flag keys, defined primarily to make the keys available in Objective-C. */ -final public class Filter: NSObject { +final public class Filter: _FilterBase { /** Example and example groups with [Focused: true] are included in test runs, excluding all other examples without this flag. Use this to only run one or diff --git a/Demo/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift b/Demo/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift index 994dd720..f5596cc0 100644 --- a/Demo/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift +++ b/Demo/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift @@ -1,4 +1,4 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) +#if canImport(Darwin) import Foundation @@ -17,7 +17,7 @@ extension Bundle { Module name has to be a valid "C99 extended identifier". */ internal var moduleName: String { - let fileName = bundleURL.fileName as NSString + let fileName = bundleURL.fileName return fileName.c99ExtendedIdentifier } } diff --git a/Demo/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift b/Demo/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift deleted file mode 100644 index 45148632..00000000 --- a/Demo/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift +++ /dev/null @@ -1,33 +0,0 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) -import Foundation - -public extension NSString { - - private static var invalidCharacters: CharacterSet = { - var invalidCharacters = CharacterSet() - - let invalidCharacterSets: [CharacterSet] = [ - .whitespacesAndNewlines, - .illegalCharacters, - .controlCharacters, - .punctuationCharacters, - .nonBaseCharacters, - .symbols, - ] - - for invalidSet in invalidCharacterSets { - invalidCharacters.formUnion(invalidSet) - } - - return invalidCharacters - }() - - @objc(qck_c99ExtendedIdentifier) - var c99ExtendedIdentifier: String { - let validComponents = components(separatedBy: NSString.invalidCharacters) - let result = validComponents.joined(separator: "_") - - return result.isEmpty ? "_" : result - } -} -#endif diff --git a/Demo/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift b/Demo/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift index d49e8594..865c3ae1 100644 --- a/Demo/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift +++ b/Demo/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift @@ -1,4 +1,4 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) +#if canImport(Darwin) import Foundation /** diff --git a/Demo/Pods/Quick/Sources/Quick/QuickTestSuite.swift b/Demo/Pods/Quick/Sources/Quick/QuickTestSuite.swift index 0cb51879..5cdc6d89 100644 --- a/Demo/Pods/Quick/Sources/Quick/QuickTestSuite.swift +++ b/Demo/Pods/Quick/Sources/Quick/QuickTestSuite.swift @@ -1,4 +1,4 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) +#if canImport(Darwin) import XCTest @@ -36,17 +36,17 @@ public class QuickTestSuite: XCTestSuite { It is expected that the first call should return a valid test suite, and all subsequent calls should return `nil`. */ + @objc public static func selectedTestSuite(forTestCaseWithName name: String) -> QuickTestSuite? { guard let builder = QuickSelectedTestSuiteBuilder(forTestCaseWithName: name) else { return nil } - if builtTestSuites.contains(builder.testSuiteClassName) { - return nil - } else { - builtTestSuites.insert(builder.testSuiteClassName) + let (inserted, _) = builtTestSuites.insert(builder.testSuiteClassName) + if inserted { return builder.buildTestSuite() + } else { + return nil } } - } #endif diff --git a/Demo/Pods/Quick/Sources/Quick/String+C99ExtendedIdentifier.swift b/Demo/Pods/Quick/Sources/Quick/String+C99ExtendedIdentifier.swift new file mode 100644 index 00000000..2dcd6063 --- /dev/null +++ b/Demo/Pods/Quick/Sources/Quick/String+C99ExtendedIdentifier.swift @@ -0,0 +1,46 @@ +#if canImport(Darwin) +import Foundation + +extension String { + private static var invalidCharacters: CharacterSet = { + var invalidCharacters = CharacterSet() + + let invalidCharacterSets: [CharacterSet] = [ + .whitespacesAndNewlines, + .illegalCharacters, + .controlCharacters, + .punctuationCharacters, + .nonBaseCharacters, + .symbols + ] + + for invalidSet in invalidCharacterSets { + invalidCharacters.formUnion(invalidSet) + } + + return invalidCharacters + }() + + internal var c99ExtendedIdentifier: String { + let validComponents = components(separatedBy: String.invalidCharacters) + let result = validComponents.joined(separator: "_") + + return result.isEmpty ? "_" : result + } +} + +/// Extension methods or properties for NSObject subclasses are invisible from +/// the Objective-C runtime on static linking unless the consumers add `-ObjC` +/// linker flag, so let's make a wrapper class to mitigate that situation. +/// +/// See: https://github.com/Quick/Quick/issues/785 and https://github.com/Quick/Quick/pull/803 +@objc +class QCKObjCStringUtils: NSObject { + override private init() {} + + @objc + static func c99ExtendedIdentifier(from string: String) -> String { + return string.c99ExtendedIdentifier + } +} +#endif diff --git a/Demo/Pods/Quick/Sources/Quick/World.swift b/Demo/Pods/Quick/Sources/Quick/World.swift index fb5ec251..86990ac0 100644 --- a/Demo/Pods/Quick/Sources/Quick/World.swift +++ b/Demo/Pods/Quick/Sources/Quick/World.swift @@ -12,6 +12,13 @@ public typealias SharedExampleContext = () -> [String: Any] */ public typealias SharedExampleClosure = (@escaping SharedExampleContext) -> Void +#if canImport(Darwin) +@objcMembers +internal class _WorldBase: NSObject {} +#else +internal class _WorldBase: NSObject {} +#endif + /** A collection of state Quick builds up in order to work its magic. World is primarily responsible for maintaining a mapping of QuickSpec @@ -23,7 +30,7 @@ public typealias SharedExampleClosure = (@escaping SharedExampleContext) -> Void You may configure how Quick behaves by calling the -[World configure:] method from within an overridden +[QuickConfiguration configure:] method. */ -final internal class World: NSObject { +final internal class World: _WorldBase { /** The example group that is currently being run. The DSL requires that this group is correctly set in order to build a @@ -39,12 +46,14 @@ final internal class World: NSObject { internal var currentExampleMetadata: ExampleMetadata? + internal var numberOfExamplesRun = 0 + /** A flag that indicates whether additional test suites are being run within this test suite. This is only true within the context of Quick functional tests. */ -#if _runtime(_ObjC) +#if canImport(Darwin) // Convention of generating Objective-C selector has been changed on Swift 3 @objc(isRunningAdditionalSuites) internal var isRunningAdditionalSuites = false @@ -64,7 +73,17 @@ final internal class World: NSObject { // MARK: Singleton Constructor private override init() {} - static let sharedWorld = World() + + static private(set) var sharedWorld = World() + + static func anotherWorld(block: (World) -> T) -> T { + let previous = sharedWorld + defer { sharedWorld = previous } + + let newWorld = World() + sharedWorld = newWorld + return block(newWorld) + } // MARK: Public Interface @@ -105,11 +124,11 @@ final internal class World: NSObject { it("is at the top level") {} } - - parameter cls: The QuickSpec class for which to retrieve the root example group. + - parameter specClass: The QuickSpec class for which to retrieve the root example group. - returns: The root example group for the class. */ - internal func rootExampleGroupForSpecClass(_ cls: AnyClass) -> ExampleGroup { - let name = String(describing: cls) + internal func rootExampleGroup(forSpecClass specClass: QuickSpec.Type) -> ExampleGroup { + let name = String(describing: specClass) if let group = specs[name] { return group @@ -133,24 +152,17 @@ final internal class World: NSObject { - parameter specClass: The QuickSpec subclass for which examples are to be returned. - returns: A list of examples to be run as test invocations. */ - internal func examples(_ specClass: AnyClass) -> [Example] { + internal func examples(forSpecClass specClass: QuickSpec.Type) -> [Example] { // 1. Grab all included examples. let included = includedExamples // 2. Grab the intersection of (a) examples for this spec, and (b) included examples. - let spec = rootExampleGroupForSpecClass(specClass).examples.filter { included.contains($0) } + let spec = rootExampleGroup(forSpecClass: specClass).examples.filter { included.contains($0) } // 3. Remove all excluded examples. return spec.filter { example in - !self.configuration.exclusionFilters.reduce(false) { $0 || $1(example) } + !self.configuration.exclusionFilters.contains { $0(example) } } } -#if _runtime(_ObjC) - @objc(examplesForSpecClass:) - private func objc_examples(_ specClass: AnyClass) -> [Example] { - return examples(specClass) - } -#endif - // MARK: Internal internal func registerSharedExample(_ name: String, closure: @escaping SharedExampleClosure) { @@ -167,6 +179,8 @@ final internal class World: NSObject { return includedExamples.count } + internal lazy var cachedIncludedExampleCount: Int = self.includedExampleCount + internal var beforesCurrentlyExecuting: Bool { let suiteBeforesExecuting = suiteHooks.phase == .beforesExecuting let exampleBeforesExecuting = exampleHooks.phase == .beforesExecuting @@ -209,7 +223,7 @@ final internal class World: NSObject { private var includedExamples: [Example] { let all = allExamples let included = all.filter { example in - return self.configuration.inclusionFilters.reduce(false) { $0 || $1(example) } + return self.configuration.inclusionFilters.contains { $0(example) } } if included.isEmpty && configuration.runAllWhenEverythingFiltered { diff --git a/Demo/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m b/Demo/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m index 937b818c..a51a8bd0 100644 --- a/Demo/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m +++ b/Demo/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m @@ -1,36 +1,11 @@ #import "QuickConfiguration.h" -#import "World.h" #import -typedef void (^QCKClassEnumerationBlock)(Class klass); - -/** - Finds all direct subclasses of the given class and passes them to the block provided. - The classes are iterated over in the order that objc_getClassList returns them. - - @param klass The base class to find subclasses of. - @param block A block that takes a Class. This block will be executed once for each subclass of klass. - */ -void qck_enumerateSubclasses(Class klass, QCKClassEnumerationBlock block) { - Class *classes = NULL; - int classesCount = objc_getClassList(NULL, 0); - - if (classesCount > 0) { - classes = (Class *)calloc(sizeof(Class), classesCount); - classesCount = objc_getClassList(classes, classesCount); - - Class subclass, superclass; - for(int i = 0; i < classesCount; i++) { - subclass = classes[i]; - superclass = class_getSuperclass(subclass); - if (superclass == klass && block) { - block(subclass); - } - } - - free(classes); - } -} +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else +#import +#endif @implementation QuickConfiguration @@ -60,19 +35,8 @@ - (instancetype)init { + (void)initialize { // Only enumerate over the subclasses of QuickConfiguration, not any of its subclasses. if ([self class] == [QuickConfiguration class]) { - - // Only enumerate over subclasses once, even if +[QuickConfiguration initialize] - // were to be called several times. This is necessary because +[QuickSpec initialize] - // manually calls +[QuickConfiguration initialize]. - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - qck_enumerateSubclasses([QuickConfiguration class], ^(__unsafe_unretained Class klass) { - [[World sharedWorld] configure:^(Configuration *configuration) { - [klass configure:configuration]; - }]; - }); - [[World sharedWorld] finalizeConfiguration]; - }); + World *world = [World sharedWorld]; + [self configureSubclassesIfNeededWithWorld:world]; } } diff --git a/Demo/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m b/Demo/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m index 10e8a3d4..624832e9 100644 --- a/Demo/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m +++ b/Demo/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m @@ -1,6 +1,10 @@ #import "QCKDSL.h" -#import "World.h" -#import "World+DSL.h" + +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else +#import +#endif void qck_beforeSuite(QCKDSLEmptyBlock closure) { [[World sharedWorld] beforeSuite:closure]; diff --git a/Demo/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h b/Demo/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h deleted file mode 100644 index a3b85245..00000000 --- a/Demo/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -@interface World (SWIFT_EXTENSION(Quick)) -- (void)beforeSuite:(void (^ __nonnull)(void))closure; -- (void)afterSuite:(void (^ __nonnull)(void))closure; -- (void)sharedExamples:(NSString * __nonnull)name closure:(void (^ __nonnull)(NSDictionary * __nonnull (^ __nonnull)(void)))closure; -- (void)describe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)context:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)fdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)xdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)beforeEach:(void (^ __nonnull)(void))closure; -- (void)beforeEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)afterEach:(void (^ __nonnull)(void))closure; -- (void)afterEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)itWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)fitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)xitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)itBehavesLikeSharedExampleNamed:(NSString * __nonnull)name sharedExampleContext:(NSDictionary * __nonnull (^ __nonnull)(void))sharedExampleContext flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line; -- (void)pending:(NSString * __nonnull)description closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Demo/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h b/Demo/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h index 105a97e2..ccf006e9 100644 --- a/Demo/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h +++ b/Demo/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h @@ -47,4 +47,10 @@ */ - (void)spec; +/** + Returns the currently executing spec. Use in specs that require XCTestCase + methods, e.g. expectationWithDescription. +*/ +@property (class, nonatomic, readonly) QuickSpec *current; + @end diff --git a/Demo/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m b/Demo/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m index 48916797..3e817c77 100644 --- a/Demo/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m +++ b/Demo/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m @@ -1,7 +1,11 @@ #import "QuickSpec.h" #import "QuickConfiguration.h" -#import "World.h" + +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else #import +#endif static QuickSpec *currentSpec = nil; @@ -14,36 +18,23 @@ @implementation QuickSpec #pragma mark - XCTestCase Overrides /** - The runtime sends initialize to each class in a program just before the class, or any class - that inherits from it, is sent its first message from within the program. QuickSpec hooks into - this event to compile the example groups for this spec subclass. + QuickSpec hooks into this event to compile the example groups for this spec subclass. If an exception occurs when compiling the examples, report it to the user. Chances are they included an expectation outside of a "it", "describe", or "context" block. */ -+ (void)initialize { - [QuickConfiguration initialize]; ++ (XCTestSuite *)defaultTestSuite { + [self buildExamplesIfNeeded]; - World *world = [World sharedWorld]; - [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ - QuickSpec *spec = [self new]; + // Add instance methods for this class' examples. + NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; + NSMutableSet *selectorNames = [NSMutableSet set]; - @try { - [spec spec]; - } - @catch (NSException *exception) { - [NSException raise:NSInternalInconsistencyException - format:@"An exception occurred when building Quick's example groups.\n" - @"Some possible reasons this might happen include:\n\n" - @"- An 'expect(...).to' expectation was evaluated outside of " - @"an 'it', 'context', or 'describe' block\n" - @"- 'sharedExamples' was called twice with the same name\n" - @"- 'itBehavesLike' was called with a name that is not registered as a shared example\n\n" - @"Here's the original exception: '%@', reason: '%@', userInfo: '%@'", - exception.name, exception.reason, exception.userInfo]; - } - [self testInvocations]; - }]; + for (Example *example in examples) { + [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; + } + + return [super defaultTestSuite]; } /** @@ -53,6 +44,8 @@ + (void)initialize { @return An array of invocations that execute the newly defined example methods. */ + (NSArray *)testInvocations { + [self buildExamplesIfNeeded]; + NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; @@ -75,8 +68,49 @@ + (NSArray *)testInvocations { - (void)spec { } ++ (QuickSpec*) current { + return currentSpec; +} + #pragma mark - Internal Methods +/** + Runs the `spec` method and builds the examples for this class. + + It's safe to call this method multiple times. If the examples for the class have been built, invocation + of this method has no effect. + */ ++ (void)buildExamplesIfNeeded { + [QuickConfiguration class]; + World *world = [World sharedWorld]; + + ExampleGroup *rootExampleGroup = [world rootExampleGroupForSpecClass:self]; + + if ([rootExampleGroup examples].count > 0) { + // The examples fot this subclass have been already built. Skipping. + return; + } + + [world performWithCurrentExampleGroup:rootExampleGroup closure:^{ + QuickSpec *spec = [self new]; + + @try { + [spec spec]; + } + @catch (NSException *exception) { + [NSException raise:NSInternalInconsistencyException + format:@"An exception occurred when building Quick's example groups.\n" + @"Some possible reasons this might happen include:\n\n" + @"- An 'expect(...).to' expectation was evaluated outside of " + @"an 'it', 'context', or 'describe' block\n" + @"- 'sharedExamples' was called twice with the same name\n" + @"- 'itBehavesLike' was called with a name that is not registered as a shared example\n\n" + @"Here's the original exception: '%@', reason: '%@', userInfo: '%@'", + exception.name, exception.reason, exception.userInfo]; + } + }]; +} + /** QuickSpec uses this method to dynamically define a new instance method for the given example. The instance method runs the example, catching any exceptions. @@ -101,8 +135,8 @@ + (SEL)addInstanceMethodForExample:(Example *)example classSelectorNames:(NSMuta }); const char *types = [[NSString stringWithFormat:@"%s%s%s", @encode(void), @encode(id), @encode(SEL)] UTF8String]; - - NSString *originalName = example.name.qck_c99ExtendedIdentifier; + + NSString *originalName = [QCKObjCStringUtils c99ExtendedIdentifierFrom:example.name]; NSString *selectorName = originalName; NSUInteger i = 2; diff --git a/Demo/Pods/Quick/Sources/QuickObjectiveC/World.h b/Demo/Pods/Quick/Sources/QuickObjectiveC/World.h deleted file mode 100644 index e638cf6c..00000000 --- a/Demo/Pods/Quick/Sources/QuickObjectiveC/World.h +++ /dev/null @@ -1,18 +0,0 @@ -#import - -@class ExampleGroup; -@class ExampleMetadata; - -SWIFT_CLASS("_TtC5Quick5World") -@interface World - -@property (nonatomic) ExampleGroup * __nullable currentExampleGroup; -@property (nonatomic) ExampleMetadata * __nullable currentExampleMetadata; -@property (nonatomic) BOOL isRunningAdditionalSuites; -+ (World * __nonnull)sharedWorld; -- (void)configure:(void (^ __nonnull)(Configuration * __nonnull))closure; -- (void)finalizeConfiguration; -- (ExampleGroup * __nonnull)rootExampleGroupForSpecClass:(Class __nonnull)cls; -- (NSArray * __nonnull)examplesForSpecClass:(Class __nonnull)specClass; -- (void)performWithCurrentExampleGroup:(ExampleGroup * __nonnull)group closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Demo/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m b/Demo/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m index e49939e9..ae63036d 100644 --- a/Demo/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m +++ b/Demo/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m @@ -1,6 +1,11 @@ #import #import + +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else #import +#endif @interface XCTestSuite (QuickTestSuiteBuilder) @end diff --git a/Demo/Pods/Quick/Sources/QuickSpecBase/QuickSpecBase.m b/Demo/Pods/Quick/Sources/QuickSpecBase/QuickSpecBase.m index 10b6f7ea..e452e658 100644 --- a/Demo/Pods/Quick/Sources/QuickSpecBase/QuickSpecBase.m +++ b/Demo/Pods/Quick/Sources/QuickSpecBase/QuickSpecBase.m @@ -1,22 +1,5 @@ #import "QuickSpecBase.h" -#pragma mark - _QuickSelectorWrapper - -@interface _QuickSelectorWrapper () -@property(nonatomic, assign) SEL selector; -@end - -@implementation _QuickSelectorWrapper - -- (instancetype)initWithSelector:(SEL)selector { - self = [super init]; - _selector = selector; - return self; -} - -@end - - #pragma mark - _QuickSpecBase @implementation _QuickSpecBase @@ -33,11 +16,11 @@ - (instancetype)init { @return An array of invocations that execute the newly defined example methods. */ + (NSArray *)testInvocations { - NSArray<_QuickSelectorWrapper *> *wrappers = [self _qck_testMethodSelectors]; - NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:wrappers.count]; + NSArray *selectors = [self _qck_testMethodSelectors]; + NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:selectors.count]; - for (_QuickSelectorWrapper *wrapper in wrappers) { - SEL selector = wrapper.selector; + for (NSString *selectorString in selectors) { + SEL selector = NSSelectorFromString(selectorString); NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; @@ -48,7 +31,7 @@ - (instancetype)init { return invocations; } -+ (NSArray<_QuickSelectorWrapper *> *)_qck_testMethodSelectors { ++ (NSArray *)_qck_testMethodSelectors { return @[]; } diff --git a/Demo/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h b/Demo/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h index 69e96ccc..2ee00e73 100644 --- a/Demo/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h +++ b/Demo/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h @@ -1,11 +1,7 @@ -@import Foundation; -@import XCTest; - -@interface _QuickSelectorWrapper : NSObject -- (instancetype)initWithSelector:(SEL)selector; -@end +#import +#import @interface _QuickSpecBase : XCTestCase -+ (NSArray<_QuickSelectorWrapper *> *)_qck_testMethodSelectors; ++ (NSArray *)_qck_testMethodSelectors; - (instancetype)init NS_DESIGNATED_INITIALIZER; @end diff --git a/Demo/Pods/Target Support Files/FBSnapshotTestCase/Info.plist b/Demo/Pods/Target Support Files/AMPopTip/AMPopTip-Info.plist similarity index 96% rename from Demo/Pods/Target Support Files/FBSnapshotTestCase/Info.plist rename to Demo/Pods/Target Support Files/AMPopTip/AMPopTip-Info.plist index 57b76a5d..6631be71 100644 --- a/Demo/Pods/Target Support Files/FBSnapshotTestCase/Info.plist +++ b/Demo/Pods/Target Support Files/AMPopTip/AMPopTip-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.1.4 + 4.2.0 CFBundleSignature ???? CFBundleVersion diff --git a/Demo/Pods/Target Support Files/AMPopTip/AMPopTip.xcconfig b/Demo/Pods/Target Support Files/AMPopTip/AMPopTip.xcconfig index a43e0da6..354b0b43 100644 --- a/Demo/Pods/Target Support Files/AMPopTip/AMPopTip.xcconfig +++ b/Demo/Pods/Target Support Files/AMPopTip/AMPopTip.xcconfig @@ -1,9 +1,11 @@ +APPLICATION_EXTENSION_API_ONLY = YES CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m b/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m deleted file mode 100644 index fb0c8fe9..00000000 --- a/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_FBSnapshotTestCase : NSObject -@end -@implementation PodsDummy_FBSnapshotTestCase -@end diff --git a/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig b/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig deleted file mode 100644 index 25e5afce..00000000 --- a/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase -ENABLE_BITCODE = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/FBSnapshotTestCase -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist b/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist new file mode 100644 index 00000000..b51e629f --- /dev/null +++ b/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 6.4.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-umbrella.h b/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-umbrella.h index fbda032e..f37d6db2 100644 --- a/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-umbrella.h +++ b/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-umbrella.h @@ -10,6 +10,8 @@ #endif #endif +#import "XCTestObservationCenter+CurrentTestCaseTracker.h" +#import "NBSMockedApplication.h" FOUNDATION_EXPORT double Nimble_SnapshotsVersionNumber; FOUNDATION_EXPORT const unsigned char Nimble_SnapshotsVersionString[]; diff --git a/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots.xcconfig b/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots.xcconfig index 4c01d24d..960d1aa2 100644 --- a/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots.xcconfig +++ b/Demo/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots.xcconfig @@ -1,12 +1,13 @@ CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots ENABLE_BITCODE = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" +FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = -framework "Foundation" -framework "XCTest" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings" +OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "UIKit" -framework "XCTest" -weak_framework "XCTest" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/Nimble-Snapshots PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/Nimble/Nimble-Info.plist b/Demo/Pods/Target Support Files/Nimble/Nimble-Info.plist new file mode 100644 index 00000000..5e150f81 --- /dev/null +++ b/Demo/Pods/Target Support Files/Nimble/Nimble-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 7.3.4 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Demo/Pods/Target Support Files/Nimble/Nimble-umbrella.h b/Demo/Pods/Target Support Files/Nimble/Nimble-umbrella.h index 9aac00a5..3a2c2c8f 100644 --- a/Demo/Pods/Target Support Files/Nimble/Nimble-umbrella.h +++ b/Demo/Pods/Target Support Files/Nimble/Nimble-umbrella.h @@ -10,14 +10,14 @@ #endif #endif -#import "CwlCatchException.h" -#import "CwlMachBadInstructionHandler.h" -#import "mach_excServer.h" -#import "CwlPreconditionTesting.h" #import "Nimble.h" #import "DSL.h" #import "NMBExceptionCapture.h" #import "NMBStringify.h" +#import "CwlCatchException.h" +#import "CwlMachBadInstructionHandler.h" +#import "mach_excServer.h" +#import "CwlPreconditionTesting.h" FOUNDATION_EXPORT double NimbleVersionNumber; FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Demo/Pods/Target Support Files/Nimble/Nimble.xcconfig b/Demo/Pods/Target Support Files/Nimble/Nimble.xcconfig index 927b05a0..d13335f4 100644 --- a/Demo/Pods/Target Support Files/Nimble/Nimble.xcconfig +++ b/Demo/Pods/Target Support Files/Nimble/Nimble.xcconfig @@ -1,12 +1,14 @@ +APPLICATION_EXTENSION_API_ONLY = YES CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Nimble ENABLE_BITCODE = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = -weak-lswiftXCTest -weak_framework "XCTest" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings" +OTHER_LDFLAGS = $(inherited) -Xlinker -no_application_extension -weak-lswiftXCTest -weak_framework "XCTest" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/Nimble PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension-Info.plist b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension-Info.plist new file mode 100644 index 00000000..2243fe6e --- /dev/null +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.debug.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.debug.xcconfig index a60d1f29..1e586901 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.debug.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.debug.xcconfig @@ -1,10 +1,12 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.release.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.release.xcconfig index a60d1f29..1e586901 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.release.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.release.xcconfig @@ -1,10 +1,12 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-Info.plist b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-Info.plist new file mode 100644 index 00000000..2243fe6e --- /dev/null +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-frameworks.sh b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-frameworks.sh index 87aa1db4..bee0aacb 100755 --- a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-frameworks.sh +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-frameworks.sh @@ -3,10 +3,15 @@ set -e set -u set -o pipefail +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then - # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy - # frameworks to, so exit 0 (signalling the script phase was successful). - exit 0 + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 fi echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" @@ -36,8 +41,8 @@ install_framework() local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" + echo "Symlinked..." + source="$(readlink "${source}")" fi # Use filter instead of exclude so missing patterns don't throw errors. @@ -47,8 +52,13 @@ install_framework() local basename basename="$(basename -s .framework "$1")" binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" fi # Strip invalid architectures so "fat" simulator / device frameworks work on device @@ -62,7 +72,7 @@ install_framework() # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) for lib in $swift_runtime_libs; do echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" @@ -84,7 +94,7 @@ install_dsym() { binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then strip_invalid_archs "$binary" fi @@ -99,10 +109,18 @@ install_dsym() { fi } +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + # Signs a framework with the provided identity code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" @@ -131,7 +149,7 @@ strip_invalid_archs() { for arch in $binary_archs; do if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + lipo -remove "$arch" -output "$binary" "$binary" stripped="$stripped $arch" fi done diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.debug.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.debug.xcconfig index 97b4ea1f..bbcaaf84 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.debug.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.debug.xcconfig @@ -1,11 +1,13 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.release.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.release.xcconfig index 97b4ea1f..bbcaaf84 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.release.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.release.xcconfig @@ -1,11 +1,13 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-Info.plist b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-Info.plist new file mode 100644 index 00000000..2243fe6e --- /dev/null +++ b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-acknowledgements.markdown b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-acknowledgements.markdown index 4f0aa61f..27a65a46 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-acknowledgements.markdown +++ b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-acknowledgements.markdown @@ -1,39 +1,6 @@ # Acknowledgements This application makes use of the following third party libraries: -## FBSnapshotTestCase - -BSD License - -For the FBSnapshotTestCase software - -Copyright (c) 2013, Facebook, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ## Nimble Apache License @@ -468,4 +435,62 @@ Apache License See the License for the specific language governing permissions and limitations under the License. + +## iOSSnapshotTestCase + +iOSSnapshotTestCase + +Copyright (c) 2017 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== + +iOSSnapshotTestCase depends on the following code: + + +FBSnapshotTestCase + +Copyright (c) 2013, Facebook, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Generated by CocoaPods - https://cocoapods.org diff --git a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-acknowledgements.plist b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-acknowledgements.plist index b8bc0e98..f6990209 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-acknowledgements.plist +++ b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-acknowledgements.plist @@ -12,45 +12,6 @@ Type PSGroupSpecifier - - FooterText - BSD License - -For the FBSnapshotTestCase software - -Copyright (c) 2013, Facebook, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - License - BSD - Title - FBSnapshotTestCase - Type - PSGroupSpecifier - FooterText Apache License @@ -504,6 +465,70 @@ SOFTWARE. Type PSGroupSpecifier + + FooterText + iOSSnapshotTestCase + +Copyright (c) 2017 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== + +iOSSnapshotTestCase depends on the following code: + + +FBSnapshotTestCase + +Copyright (c) 2013, Facebook, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + License + MIT + Title + iOSSnapshotTestCase + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-frameworks.sh b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-frameworks.sh index fff113c0..35fd4dfe 100755 --- a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-frameworks.sh +++ b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-frameworks.sh @@ -3,10 +3,15 @@ set -e set -u set -o pipefail +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then - # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy - # frameworks to, so exit 0 (signalling the script phase was successful). - exit 0 + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 fi echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" @@ -36,8 +41,8 @@ install_framework() local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" + echo "Symlinked..." + source="$(readlink "${source}")" fi # Use filter instead of exclude so missing patterns don't throw errors. @@ -47,8 +52,13 @@ install_framework() local basename basename="$(basename -s .framework "$1")" binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" fi # Strip invalid architectures so "fat" simulator / device frameworks work on device @@ -62,7 +72,7 @@ install_framework() # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) for lib in $swift_runtime_libs; do echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" @@ -84,7 +94,7 @@ install_dsym() { binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then strip_invalid_archs "$binary" fi @@ -99,10 +109,18 @@ install_dsym() { fi } +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + # Signs a framework with the provided identity code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" @@ -131,7 +149,7 @@ strip_invalid_archs() { for arch in $binary_archs; do if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + lipo -remove "$arch" -output "$binary" "$binary" stripped="$stripped $arch" fi done @@ -143,16 +161,16 @@ strip_invalid_archs() { if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework" install_framework "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework" install_framework "${BUILT_PRODUCTS_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework" install_framework "${BUILT_PRODUCTS_DIR}/Quick/Quick.framework" + install_framework "${BUILT_PRODUCTS_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework" install_framework "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework" install_framework "${BUILT_PRODUCTS_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework" install_framework "${BUILT_PRODUCTS_DIR}/Quick/Quick.framework" + install_framework "${BUILT_PRODUCTS_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.debug.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.debug.xcconfig index 609a2302..0ce2ff1e 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.debug.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.debug.xcconfig @@ -1,11 +1,13 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" +FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Nimble" -framework "Nimble_Snapshots" -framework "Quick" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" -iframework "$(PLATFORM_DIR)/Developer/Library/Frameworks" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Quick" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase" +OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -framework "FBSnapshotTestCase" -framework "Foundation" -framework "Nimble" -framework "Nimble_Snapshots" -framework "QuartzCore" -framework "Quick" -framework "UIKit" -framework "XCTest" -weak_framework "XCTest" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.release.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.release.xcconfig index 609a2302..0ce2ff1e 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.release.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.release.xcconfig @@ -1,11 +1,13 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" +FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Nimble" -framework "Nimble_Snapshots" -framework "Quick" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" -iframework "$(PLATFORM_DIR)/Developer/Library/Frameworks" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Quick" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase" +OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -framework "FBSnapshotTestCase" -framework "Foundation" -framework "Nimble" -framework "Nimble_Snapshots" -framework "QuartzCore" -framework "Quick" -framework "UIKit" -framework "XCTest" -weak_framework "XCTest" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/Quick/Quick-Info.plist b/Demo/Pods/Target Support Files/Quick/Quick-Info.plist new file mode 100644 index 00000000..c054f9c1 --- /dev/null +++ b/Demo/Pods/Target Support Files/Quick/Quick-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.2.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Demo/Pods/Target Support Files/Quick/Quick.xcconfig b/Demo/Pods/Target Support Files/Quick/Quick.xcconfig index da8712fc..a9a0bb06 100644 --- a/Demo/Pods/Target Support Files/Quick/Quick.xcconfig +++ b/Demo/Pods/Target Support Files/Quick/Quick.xcconfig @@ -1,12 +1,14 @@ +APPLICATION_EXTENSION_API_ONLY = YES CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Quick ENABLE_BITCODE = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" +FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = -framework "XCTest" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings" +OTHER_LDFLAGS = $(inherited) -Xlinker -no_application_extension -framework "XCTest" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/Quick PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-Info.plist b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-Info.plist new file mode 100644 index 00000000..c054f9c1 --- /dev/null +++ b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.2.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-dummy.m b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-dummy.m new file mode 100644 index 00000000..9967d3eb --- /dev/null +++ b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_iOSSnapshotTestCase : NSObject +@end +@implementation PodsDummy_iOSSnapshotTestCase +@end diff --git a/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-prefix.pch similarity index 100% rename from Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch rename to Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-prefix.pch diff --git a/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-umbrella.h similarity index 100% rename from Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h rename to Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase-umbrella.h diff --git a/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase.modulemap similarity index 59% rename from Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap rename to Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase.modulemap index 45b74ece..d2c2777f 100644 --- a/Demo/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap +++ b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase.modulemap @@ -1,5 +1,5 @@ framework module FBSnapshotTestCase { - umbrella header "FBSnapshotTestCase-umbrella.h" + umbrella header "iOSSnapshotTestCase-umbrella.h" export * module * { export * } diff --git a/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase.xcconfig b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase.xcconfig new file mode 100644 index 00000000..b436b53f --- /dev/null +++ b/Demo/Pods/Target Support Files/iOSSnapshotTestCase/iOSSnapshotTestCase.xcconfig @@ -0,0 +1,13 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase +ENABLE_BITCODE = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/iOSSnapshotTestCase +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h similarity index 100% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m similarity index 100% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h similarity index 100% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m similarity index 100% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h similarity index 100% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m similarity index 100% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h similarity index 100% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m similarity index 99% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m index 968091b9..2f3a4c3e 100644 --- a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m +++ b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m @@ -40,10 +40,6 @@ + (UIImage *)fb_imageForViewLayer:(UIView *)view + (UIImage *)fb_imageForView:(UIView *)view { - CGRect bounds = view.bounds; - NSAssert1(CGRectGetWidth(bounds), @"Zero width for view %@", view); - NSAssert1(CGRectGetHeight(bounds), @"Zero height for view %@", view); - // If the input view is already a UIWindow, then just use that. Otherwise wrap in a window. UIWindow *window = [view isKindOfClass:[UIWindow class]] ? (UIWindow *)view : view.window; BOOL removeFromSuperview = NO; @@ -55,9 +51,14 @@ + (UIImage *)fb_imageForView:(UIView *)view [window addSubview:view]; removeFromSuperview = YES; } + + [view layoutIfNeeded]; + CGRect bounds = view.bounds; + NSAssert1(CGRectGetWidth(bounds), @"Zero width for view %@", view); + NSAssert1(CGRectGetHeight(bounds), @"Zero height for view %@", view); + UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0); - [view layoutIfNeeded]; [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h similarity index 91% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h index 72abc3c0..e78762c7 100644 --- a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h +++ b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h @@ -62,7 +62,7 @@ #define FBSnapshotVerifyViewOrLayerWithOptions(what__, viewOrLayer__, identifier__, suffixes__, tolerance__) \ { \ - NSString *errorDescription = [self snapshotVerifyViewOrLayer:viewOrLayer__ identifier:identifier__ suffixes:suffixes__ tolerance:tolerance__]; \ + NSString *errorDescription = [self snapshotVerifyViewOrLayer:viewOrLayer__ identifier:identifier__ suffixes:suffixes__ tolerance:tolerance__ defaultReferenceDirectory:(@ FB_REFERENCE_IMAGE_DIR)]; \ BOOL noErrors = (errorDescription == nil); \ XCTAssertTrue(noErrors, @"%@", errorDescription); \ } @@ -100,6 +100,17 @@ */ @property (readwrite, nonatomic, assign, getter=isDeviceAgnostic) BOOL deviceAgnostic; +/** + When set, allows fine-grained control over how agnostic you want the file names to be. + + Allows you to combine which agnostic options you want in your snapshot file names. + + The default value is FBSnapshotTestCaseAgnosticOptionNone. + + @attention If deviceAgnostic is YES, this bitmask is ignored. deviceAgnostic will be deprecated in a future version of FBSnapshotTestCase. + */ +@property (readwrite, nonatomic, assign) FBSnapshotTestCaseAgnosticOption agnosticOptions; + /** When YES, renders a snapshot of the complete view hierarchy as visible onscreen. There are several things that do not work if renderInContext: is used. @@ -120,12 +131,14 @@ @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. @param suffixes An NSOrderedSet of strings for the different suffixes @param tolerance The percentage difference to still count as identical - 0 mean pixel perfect, 1 means I don't care + @param defaultReferenceDirectory The directory to default to for reference images. @returns nil if the comparison (or saving of the reference image) succeeded. Otherwise it contains an error description. */ - (NSString *)snapshotVerifyViewOrLayer:(id)viewOrLayer identifier:(NSString *)identifier suffixes:(NSOrderedSet *)suffixes - tolerance:(CGFloat)tolerance; + tolerance:(CGFloat)tolerance + defaultReferenceDirectory:(NSString *)defaultReferenceDirectory; /** Performs the comparison or records a snapshot of the layer if recordMode is YES. diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m similarity index 93% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m index f44458ce..abd54fbf 100644 --- a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m +++ b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m @@ -52,6 +52,17 @@ - (void)setDeviceAgnostic:(BOOL)deviceAgnostic _snapshotController.deviceAgnostic = deviceAgnostic; } +- (FBSnapshotTestCaseAgnosticOption)agnosticOptions +{ + return _snapshotController.agnosticOptions; +} + +- (void)setAgnosticOptions:(FBSnapshotTestCaseAgnosticOption)agnosticOptions +{ + NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); + _snapshotController.agnosticOptions = agnosticOptions; +} + - (BOOL)usesDrawViewHierarchyInRect { return _snapshotController.usesDrawViewHierarchyInRect; @@ -69,11 +80,12 @@ - (NSString *)snapshotVerifyViewOrLayer:(id)viewOrLayer identifier:(NSString *)identifier suffixes:(NSOrderedSet *)suffixes tolerance:(CGFloat)tolerance + defaultReferenceDirectory:(NSString *)defaultReferenceDirectory { if (nil == viewOrLayer) { return @"Object to be snapshotted must not be nil"; } - NSString *referenceImageDirectory = [self getReferenceImageDirectoryWithDefault:(@ FB_REFERENCE_IMAGE_DIR)]; + NSString *referenceImageDirectory = [self getReferenceImageDirectoryWithDefault:defaultReferenceDirectory]; if (referenceImageDirectory == nil) { return @"Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme."; } diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h similarity index 50% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h index e04acf2f..bd315614 100644 --- a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h +++ b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h @@ -14,6 +14,21 @@ extern "C" { #endif +/** + An option mask that allows you to cherry pick which parts you want to 'be agnostic' in the snapshot file name. + + - FBSnapshotTestCaseAgnosticOptionNone: Don't make the file name agnostic at all. + - FBSnapshotTestCaseAgnosticOptionDevice: The file name should be agnostic on the device name, as returned by UIDevice.currentDevice.model. + - FBSnapshotTestCaseAgnosticOptionOS: The file name should be agnostic on the OS version, as returned by UIDevice.currentDevice.systemVersion. + - FBSnapshotTestCaseAgnosticOptionScreenSize: The file name should be agnostic on the screen size of the current keyWindow, as returned by UIApplication.sharedApplication.keyWindow.bounds.size. + */ +typedef NS_OPTIONS(NSUInteger, FBSnapshotTestCaseAgnosticOption) { + FBSnapshotTestCaseAgnosticOptionNone = 1 << 0, + FBSnapshotTestCaseAgnosticOptionDevice = 1 << 1, + FBSnapshotTestCaseAgnosticOptionOS = 1 << 2, + FBSnapshotTestCaseAgnosticOptionScreenSize = 1 << 3 +}; + /** Returns a Boolean value that indicates whether the snapshot test is running in 64Bit. This method is a convenience for creating the suffixes set based on the architecture @@ -39,6 +54,15 @@ NSOrderedSet *FBSnapshotTestCaseDefaultSuffixes(void); */ NSString *FBDeviceAgnosticNormalizedFileName(NSString *fileName); +/** + Returns a fully normalized file name as per the provided option mask. Strips punctuation and spaces and replaces them with @c _. + + @param fileName The file name to normalize. + @param option Agnostic options to use before normalization. + @return An @c NSString object containing the passed @c fileName and optionally, with the device model and/or OS and/or screen size appended at the end. + */ +NSString *FBDeviceAgnosticNormalizedFileNameFromOption(NSString *fileName, FBSnapshotTestCaseAgnosticOption option); + #ifdef __cplusplus } #endif diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m similarity index 55% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m index d8709d8b..ecdb011d 100644 --- a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m +++ b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m @@ -48,4 +48,32 @@ BOOL FBSnapshotTestCaseIs64Bit(void) fileName = [validComponents componentsJoinedByString:@"_"]; return fileName; -} \ No newline at end of file +} + +NSString *FBDeviceAgnosticNormalizedFileNameFromOption(NSString *fileName, FBSnapshotTestCaseAgnosticOption option) +{ + if ((option & FBSnapshotTestCaseAgnosticOptionDevice) == FBSnapshotTestCaseAgnosticOptionDevice) { + UIDevice *device = [UIDevice currentDevice]; + fileName = [fileName stringByAppendingFormat:@"_%@", device.model]; + } + + if ((option & FBSnapshotTestCaseAgnosticOptionOS) == FBSnapshotTestCaseAgnosticOptionOS) { + UIDevice *device = [UIDevice currentDevice]; + NSString *os = device.systemVersion; + fileName = [fileName stringByAppendingFormat:@"_%@", os]; + } + + if ((option & FBSnapshotTestCaseAgnosticOptionScreenSize) == FBSnapshotTestCaseAgnosticOptionScreenSize) { + UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; + CGSize screenSize = keyWindow.bounds.size; + fileName = [fileName stringByAppendingFormat:@"_%.0fx%.0f", screenSize.width, screenSize.height]; + } + + NSMutableCharacterSet *invalidCharacters = [NSMutableCharacterSet new]; + [invalidCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; + [invalidCharacters formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; + NSArray *validComponents = [fileName componentsSeparatedByCharactersInSet:invalidCharacters]; + fileName = [validComponents componentsJoinedByString:@"_"]; + + return fileName; +} diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h similarity index 86% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h index a0285ad8..daccacf7 100644 --- a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h +++ b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h @@ -11,6 +11,8 @@ #import #import +#import + typedef NS_ENUM(NSInteger, FBSnapshotTestControllerErrorCode) { FBSnapshotTestControllerErrorCodeUnknown, FBSnapshotTestControllerErrorCodeNeedsRecord, @@ -18,6 +20,7 @@ typedef NS_ENUM(NSInteger, FBSnapshotTestControllerErrorCode) { FBSnapshotTestControllerErrorCodeImagesDifferentSizes, FBSnapshotTestControllerErrorCodeImagesDifferent, }; + /** Errors returned by the methods of FBSnapshotTestController use this domain. */ @@ -61,6 +64,17 @@ extern NSString *const FBDiffedImageKey; */ @property (readwrite, nonatomic, assign, getter=isDeviceAgnostic) BOOL deviceAgnostic; +/** + When set, allows fine-grained control over how agnostic you want the file names to be. + + Allows you to combine which agnostic options you want in your snapshot file names. + + The default value is FBSnapshotTestCaseAgnosticOptionNone. + + @attention If deviceAgnostic is YES, this bitmask is ignored. deviceAgnostic will be deprecated in a future version of FBSnapshotTestCase. + */ +@property (readwrite, nonatomic, assign) FBSnapshotTestCaseAgnosticOption agnosticOptions; + /** Uses drawViewHierarchyInRect:afterScreenUpdates: to draw the image instead of renderInContext: */ @@ -89,7 +103,7 @@ extern NSString *const FBDiffedImageKey; @param layer The Layer to snapshot. @param selector The test method being run. @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. - @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). @returns YES if the comparison (or saving of the reference image) succeeded. */ - (BOOL)compareSnapshotOfLayer:(CALayer *)layer @@ -102,7 +116,7 @@ extern NSString *const FBDiffedImageKey; @param view The view to snapshot. @param selector The test method being run. @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. - @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). @returns YES if the comparison (or saving of the reference image) succeeded. */ - (BOOL)compareSnapshotOfView:(UIView *)view @@ -112,11 +126,11 @@ extern NSString *const FBDiffedImageKey; /** Performs the comparison of a view or layer. - @param view The view or layer to snapshot. + @param viewOrLayer The view or layer to snapshot. @param selector The test method being run. @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. @param tolerance The percentage of pixels that can differ and still be considered 'identical' - @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). @returns YES if the comparison (or saving of the reference image) succeeded. */ - (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m similarity index 97% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m index 74c5a0a6..3e53c7d2 100644 --- a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m +++ b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m @@ -47,7 +47,8 @@ - (instancetype)initWithTestName:(NSString *)testName if (self = [super init]) { _testName = [testName copy]; _deviceAgnostic = NO; - + _agnosticOptions = FBSnapshotTestCaseAgnosticOptionNone; + _fileManager = [[NSFileManager alloc] init]; } return self; @@ -133,13 +134,13 @@ - (BOOL)compareReferenceImage:(UIImage *)referenceImage if (sameImageDimensions && [referenceImage fb_compareWithImage:image tolerance:tolerance]) { return YES; } - + if (NULL != errorPtr) { NSString *errorDescription = sameImageDimensions ? @"Images different" : @"Images different sizes"; NSString *errorReason = sameImageDimensions ? [NSString stringWithFormat:@"image pixels differed by more than %.2f%% from the reference image", tolerance * 100] : [NSString stringWithFormat:@"referenceImage:%@, image:%@", NSStringFromCGSize(referenceImage.size), NSStringFromCGSize(image.size)]; FBSnapshotTestControllerErrorCode errorCode = sameImageDimensions ? FBSnapshotTestControllerErrorCodeImagesDifferent : FBSnapshotTestControllerErrorCodeImagesDifferentSizes; - + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain code:errorCode userInfo:@{ @@ -232,11 +233,14 @@ - (NSString *)_fileNameForSelector:(SEL)selector if (0 < identifier.length) { fileName = [fileName stringByAppendingFormat:@"_%@", identifier]; } - + + BOOL noAgnosticOption = (self.agnosticOptions & FBSnapshotTestCaseAgnosticOptionNone) == FBSnapshotTestCaseAgnosticOptionNone; if (self.isDeviceAgnostic) { fileName = FBDeviceAgnosticNormalizedFileName(fileName); + } else if (!noAgnosticOption) { + fileName = FBDeviceAgnosticNormalizedFileNameFromOption(fileName, self.agnosticOptions); } - + if ([[UIScreen mainScreen] scale] > 1) { fileName = [fileName stringByAppendingFormat:@"@%.fx", [[UIScreen mainScreen] scale]]; } diff --git a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift similarity index 98% rename from Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift rename to Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift index 471bb0df..1bce175b 100644 --- a/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift +++ b/Demo/Pods/iOSSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift @@ -52,7 +52,7 @@ break } - assert(comparisonSuccess, message: "Snapshot comparison failed: \(error)", file: file, line: line) + assert(comparisonSuccess, message: "Snapshot comparison failed: \(String(describing: error))", file: file, line: line) } } else { XCTFail("Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.") diff --git a/Demo/Pods/FBSnapshotTestCase/LICENSE b/Demo/Pods/iOSSnapshotTestCase/LICENSE similarity index 54% rename from Demo/Pods/FBSnapshotTestCase/LICENSE rename to Demo/Pods/iOSSnapshotTestCase/LICENSE index 2dd780cb..08e8be93 100644 --- a/Demo/Pods/FBSnapshotTestCase/LICENSE +++ b/Demo/Pods/iOSSnapshotTestCase/LICENSE @@ -1,6 +1,31 @@ -BSD License +iOSSnapshotTestCase -For the FBSnapshotTestCase software +Copyright (c) 2017 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== + +iOSSnapshotTestCase depends on the following code: + + +FBSnapshotTestCase Copyright (c) 2013, Facebook, Inc. All rights reserved. diff --git a/Demo/Pods/FBSnapshotTestCase/README.md b/Demo/Pods/iOSSnapshotTestCase/README.md similarity index 64% rename from Demo/Pods/FBSnapshotTestCase/README.md rename to Demo/Pods/iOSSnapshotTestCase/README.md index bc23b837..89da232b 100644 --- a/Demo/Pods/FBSnapshotTestCase/README.md +++ b/Demo/Pods/iOSSnapshotTestCase/README.md @@ -1,7 +1,8 @@ -FBSnapshotTestCase +iOSSnapshotTestCase (previously named FBSnapshotTestCase) ====================== -[![Build Status](https://travis-ci.org/facebook/ios-snapshot-test-case.svg)](https://travis-ci.org/facebook/ios-snapshot-test-case) [![Cocoa Pod Version](https://cocoapod-badges.herokuapp.com/v/FBSnapshotTestCase/badge.svg)](http://cocoadocs.org/docsets/FBSnapshotTestCase/) +[![Build Status](https://travis-ci.org/uber/ios-snapshot-test-case.svg)](https://travis-ci.org/uber/ios-snapshot-test-case) +[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/iOSSnapshotTestCase.svg)](https://img.shields.io/cocoapods/v/iOSSnapshotTestCase.svg) What it does ------------ @@ -14,9 +15,8 @@ repository and fails the test if the two images don't match. Why? ---- -At Facebook we write a lot of UI code. As you might imagine, each type of -feed story is rendered using a subclass of `UIView`. There are a lot of edge -cases that we want to handle correctly: +We write a lot of UI code. There are a lot of edge +cases that we want to handle correctly when you are creating `UIView` instances: - What if there is more text than can fit in the space available? - What if an image doesn't match the size of an image view? @@ -27,7 +27,7 @@ views. You can do a lot of rectangle asserts, but these are hard to understand or visualize. Looking at an image diff shows you exactly what changed and how it will look to users. -We developed `FBSnapshotTestCase` to make snapshot tests easy. +`iOSSnapshotTestCase` was developed to make snapshot tests easy. Installation with CocoaPods --------------------------- @@ -36,20 +36,23 @@ Installation with CocoaPods ``` target "Tests" do - pod 'FBSnapshotTestCase' + use_frameworks! + pod 'iOSSnapshotTestCase' end ``` - If you support iOS 7 use `FBSnapshotTestCase/Core` instead, which doesn't contain Swift support. + If you support iOS 7 use `iOSSnapshotTestCase/Core` instead, which doesn't contain Swift support. Replace "Tests" with the name of your test project. -2. There are [three ways](https://github.com/facebook/ios-snapshot-test-case/blob/master/FBSnapshotTestCase/FBSnapshotTestCase.h#L19-L29) of setting reference image directories, the recommended one is to define `FB_REFERENCE_IMAGE_DIR` in your scheme. This should point to the directory where you want reference images to be stored. At Facebook, we normally use this: +2. There are [three ways](https://github.com/uber/ios-snapshot-test-case/blob/master/FBSnapshotTestCase/FBSnapshotTestCase.h#L19-L29) of setting reference image directories, the recommended one is to define `FB_REFERENCE_IMAGE_DIR` in your scheme. This should point to the directory where you want reference images to be stored. We normally use this: |Name|Value| |:---|:----| |`FB_REFERENCE_IMAGE_DIR`|`$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages`| +|`IMAGE_DIFF_DIR`|`$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/FailureDiffs`| +Define the `IMAGE_DIFF_DIR` to the directory where you want to store diffs of failed snapshots. ![](FBSnapshotTestCaseDemo/Scheme_FB_REFERENCE_IMAGE_DIR.png) @@ -87,11 +90,15 @@ have separate targets for the two types. Authors ------- -`FBSnapshotTestCase` was written at Facebook by +`iOSSnapshotTestCase` was written at Facebook by [Jonathan Dann](https://facebook.com/j.p.dann) with significant contributions by [Todd Krabach](https://facebook.com/toddkrabach). +Today it is maintained by [Uber](https://github.com/uber). + License ------- -`FBSnapshotTestCase` is BSD-licensed. See `LICENSE`. +Portions of `iOSSnapshotTestCase` written while under Facebook's ownership are BSD-licensed. See `LICENSE`. + +Subsequent contributions to `iOSSnapshotTestCase` are MIT–licensed. See `LICENSE`. diff --git a/Demo/PopTip Demo.xcodeproj/project.pbxproj b/Demo/PopTip Demo.xcodeproj/project.pbxproj index 8cc4205c..bd9b0811 100644 --- a/Demo/PopTip Demo.xcodeproj/project.pbxproj +++ b/Demo/PopTip Demo.xcodeproj/project.pbxproj @@ -387,7 +387,7 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-frameworks.sh", + "${PODS_ROOT}/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-frameworks.sh", "${BUILT_PRODUCTS_DIR}/AMPopTip/AMPopTip.framework", ); name = "[CP] Embed Pods Frameworks"; @@ -396,7 +396,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 887F82599A48E0558A60AB6B /* [CP] Check Pods Manifest.lock */ = { @@ -423,22 +423,22 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework", + "${PODS_ROOT}/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-frameworks.sh", "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework", "${BUILT_PRODUCTS_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework", "${BUILT_PRODUCTS_DIR}/Quick/Quick.framework", + "${BUILT_PRODUCTS_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSnapshotTestCase.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nimble.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nimble_Snapshots.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Quick.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSnapshotTestCase.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ From 6f124033b93d6d58aaf5abe1c94865f9cb64d4cd Mon Sep 17 00:00:00 2001 From: Ernesto Rivera Date: Wed, 13 Nov 2019 10:40:58 -0400 Subject: [PATCH 3/6] New show method to allow using custom SwiftUI views embed in a UIHostingController --- Source/PopTip.swift | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Source/PopTip.swift b/Source/PopTip.swift index 5b858100..ee2e87a7 100644 --- a/Source/PopTip.swift +++ b/Source/PopTip.swift @@ -7,6 +7,7 @@ // import UIKit +import SwiftUI /// Enum that specifies the direction of the poptip public enum PopTipDirection { @@ -226,6 +227,7 @@ open class PopTip: UIView { fileprivate var textBounds = CGRect.zero fileprivate var maxWidth = CGFloat(0) fileprivate var customView: UIView? + fileprivate var hostingController: UIViewController? fileprivate var isApplicationInBackground: Bool? fileprivate var label: UILabel = { let label = UILabel() @@ -603,6 +605,39 @@ open class PopTip: UIView { show(duration: duration) } + + /// Shows an animated poptip in a given view, from a given rectangle. The property `isVisible` will be `true` as soon as the poptip is added to the given view. + /// + /// - Parameters: + /// - rootView: A SwiftUI view + /// - direction: The direction of the poptip in relation to the element that generates it + /// - view: The view that will hold the poptip as a subview. + /// - frame: The originating frame. The poptip's arrow will point to the center of this frame. + /// - parent: The controller that holds the view that will hold the poptip. Needed as SwiftUI views have to be embed in a child UIHostingController. + /// - duration: Optional time interval that determines when the poptip will self-dismiss. + @available(iOS 13.0, *) + open func show(rootView: V, direction: PopTipDirection, in view: UIView, from frame: CGRect, parent: UIViewController, duration: TimeInterval? = nil) { + resetView() + + text = nil + attributedText = nil + self.direction = direction + containerView = view + let controller = UIHostingController(rootView: rootView) + controller.view.backgroundColor = .clear + controller.view.frame.size = controller.view.intrinsicContentSize + maxWidth = controller.view.frame.size.width + self.customView?.removeFromSuperview() + self.customView = controller.view + parent.addChild(controller) + addSubview(controller.view) + controller.didMove(toParent: parent) + controller.view.layoutIfNeeded() + from = frame + hostingController = controller + + show(duration: duration) + } /// Update the current text /// @@ -649,7 +684,9 @@ open class PopTip: UIView { } let completion = { + self.hostingController?.willMove(toParent: nil) self.customView?.removeFromSuperview() + self.hostingController?.removeFromParent() self.customView = nil self.dismissActionAnimation() self.backgroundMask?.removeFromSuperview() From b013d2f3f5693ac703c7c46f7c0eaa28d5e9ca0d Mon Sep 17 00:00:00 2001 From: Ernesto Rivera Date: Thu, 14 Nov 2019 09:37:02 -0400 Subject: [PATCH 4/6] Add SwiftUI as weak_framework to podspec --- AMPopTip.podspec | 1 + 1 file changed, 1 insertion(+) diff --git a/AMPopTip.podspec b/AMPopTip.podspec index 19d9a181..5711c766 100644 --- a/AMPopTip.podspec +++ b/AMPopTip.podspec @@ -17,5 +17,6 @@ Pod::Spec.new do |s| s.swift_version = '5.0' s.source_files = 'Source/*.swift' s.requires_arc = true + s.weak_framework = 'SwiftUI' s.social_media_url = 'https://twitter.com/theandreamazz' end From 221b73ed9492f333990dc4c4e27e2529c4483fd3 Mon Sep 17 00:00:00 2001 From: Ernesto Rivera Date: Thu, 14 Nov 2019 09:37:24 -0400 Subject: [PATCH 5/6] Only compile SwiftUI code #if canImport(SwiftUI) && canImport(Combine) --- Source/PopTip.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/PopTip.swift b/Source/PopTip.swift index ee2e87a7..a4931887 100644 --- a/Source/PopTip.swift +++ b/Source/PopTip.swift @@ -7,7 +7,9 @@ // import UIKit +#if canImport(SwiftUI) && canImport(Combine) import SwiftUI +#endif /// Enum that specifies the direction of the poptip public enum PopTipDirection { @@ -606,6 +608,7 @@ open class PopTip: UIView { show(duration: duration) } +#if canImport(SwiftUI) && canImport(Combine) /// Shows an animated poptip in a given view, from a given rectangle. The property `isVisible` will be `true` as soon as the poptip is added to the given view. /// /// - Parameters: @@ -638,6 +641,7 @@ open class PopTip: UIView { show(duration: duration) } +#endif /// Update the current text /// From 66c95598795299056a0be5daabc9db89cb2072f4 Mon Sep 17 00:00:00 2001 From: Ernesto Rivera Date: Thu, 14 Nov 2019 09:37:32 -0400 Subject: [PATCH 6/6] Update Demo project --- Demo/Podfile.lock | 2 +- .../Pods/Local Podspecs/AMPopTip.podspec.json | 1 + Demo/Pods/Manifest.lock | 2 +- .../AMPopTip/AMPopTip.xcconfig | 1 + ...opTip Demo-PopTip Extension.debug.xcconfig | 2 +- ...Tip Demo-PopTip Extension.release.xcconfig | 2 +- .../Pods-PopTip Demo.debug.xcconfig | 2 +- .../Pods-PopTip Demo.release.xcconfig | 2 +- .../Pods-PopTip DemoTests.debug.xcconfig | 2 +- .../Pods-PopTip DemoTests.release.xcconfig | 2 +- Demo/PopTip Demo.xcodeproj/project.pbxproj | 4 ++ Demo/PopTip Demo/SwiftUIView.swift | 52 +++++++++++++++++++ Demo/PopTip Demo/ViewController.swift | 46 +++++++++++----- 13 files changed, 98 insertions(+), 22 deletions(-) create mode 100644 Demo/PopTip Demo/SwiftUIView.swift diff --git a/Demo/Podfile.lock b/Demo/Podfile.lock index 5f4ad05c..796120c5 100644 --- a/Demo/Podfile.lock +++ b/Demo/Podfile.lock @@ -31,7 +31,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - AMPopTip: f7d587e42dca04778c86ecceed790a6f72362e36 + AMPopTip: 43444807604e7d38713fc15b93fa65fbe369227c iOSSnapshotTestCase: 415bd84f9dbba4ff45fede49d800bc7332fbedac Nimble: 051e3d8912d40138fa5591c78594f95fb172af37 Nimble-Snapshots: 438fb1a6fa3c655e246fc9ac375f6cd2964d759a diff --git a/Demo/Pods/Local Podspecs/AMPopTip.podspec.json b/Demo/Pods/Local Podspecs/AMPopTip.podspec.json index 7c2c584f..e808aaa9 100644 --- a/Demo/Pods/Local Podspecs/AMPopTip.podspec.json +++ b/Demo/Pods/Local Podspecs/AMPopTip.podspec.json @@ -21,6 +21,7 @@ "swift_versions": "5.0", "source_files": "Source/*.swift", "requires_arc": true, + "weak_frameworks": "SwiftUI", "social_media_url": "https://twitter.com/theandreamazz", "swift_version": "5.0" } diff --git a/Demo/Pods/Manifest.lock b/Demo/Pods/Manifest.lock index 5f4ad05c..796120c5 100644 --- a/Demo/Pods/Manifest.lock +++ b/Demo/Pods/Manifest.lock @@ -31,7 +31,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - AMPopTip: f7d587e42dca04778c86ecceed790a6f72362e36 + AMPopTip: 43444807604e7d38713fc15b93fa65fbe369227c iOSSnapshotTestCase: 415bd84f9dbba4ff45fede49d800bc7332fbedac Nimble: 051e3d8912d40138fa5591c78594f95fb172af37 Nimble-Snapshots: 438fb1a6fa3c655e246fc9ac375f6cd2964d759a diff --git a/Demo/Pods/Target Support Files/AMPopTip/AMPopTip.xcconfig b/Demo/Pods/Target Support Files/AMPopTip/AMPopTip.xcconfig index 354b0b43..84d4f2bc 100644 --- a/Demo/Pods/Target Support Files/AMPopTip/AMPopTip.xcconfig +++ b/Demo/Pods/Target Support Files/AMPopTip/AMPopTip.xcconfig @@ -1,6 +1,7 @@ APPLICATION_EXTENSION_API_ONLY = YES CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -weak_framework "SwiftUI" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.debug.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.debug.xcconfig index 1e586901..e80e7875 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.debug.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.debug.xcconfig @@ -3,7 +3,7 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" -OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" +OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -weak_framework "SwiftUI" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.release.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.release.xcconfig index 1e586901..e80e7875 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.release.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.release.xcconfig @@ -3,7 +3,7 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" -OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" +OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -weak_framework "SwiftUI" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.debug.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.debug.xcconfig index bbcaaf84..1ad65696 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.debug.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.debug.xcconfig @@ -4,7 +4,7 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" -OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" +OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -weak_framework "SwiftUI" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.release.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.release.xcconfig index bbcaaf84..1ad65696 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.release.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.release.xcconfig @@ -4,7 +4,7 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip" -OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" +OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -weak_framework "SwiftUI" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.debug.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.debug.xcconfig index 0ce2ff1e..53d15ac2 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.debug.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.debug.xcconfig @@ -4,7 +4,7 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" -iframework "$(PLATFORM_DIR)/Developer/Library/Frameworks" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Quick" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase" -OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -framework "FBSnapshotTestCase" -framework "Foundation" -framework "Nimble" -framework "Nimble_Snapshots" -framework "QuartzCore" -framework "Quick" -framework "UIKit" -framework "XCTest" -weak_framework "XCTest" +OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -framework "FBSnapshotTestCase" -framework "Foundation" -framework "Nimble" -framework "Nimble_Snapshots" -framework "QuartzCore" -framework "Quick" -framework "UIKit" -framework "XCTest" -weak_framework "SwiftUI" -weak_framework "XCTest" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.release.xcconfig b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.release.xcconfig index 0ce2ff1e..53d15ac2 100644 --- a/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.release.xcconfig +++ b/Demo/Pods/Target Support Files/Pods-PopTip DemoTests/Pods-PopTip DemoTests.release.xcconfig @@ -4,7 +4,7 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMPopTip/AMPopTip.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots/Nimble_Snapshots.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase/FBSnapshotTestCase.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" -iframework "$(PLATFORM_DIR)/Developer/Library/Frameworks" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Nimble-Snapshots" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Quick" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/iOSSnapshotTestCase" -OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -framework "FBSnapshotTestCase" -framework "Foundation" -framework "Nimble" -framework "Nimble_Snapshots" -framework "QuartzCore" -framework "Quick" -framework "UIKit" -framework "XCTest" -weak_framework "XCTest" +OTHER_LDFLAGS = $(inherited) -framework "AMPopTip" -framework "FBSnapshotTestCase" -framework "Foundation" -framework "Nimble" -framework "Nimble_Snapshots" -framework "QuartzCore" -framework "Quick" -framework "UIKit" -framework "XCTest" -weak_framework "SwiftUI" -weak_framework "XCTest" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Demo/PopTip Demo.xcodeproj/project.pbxproj b/Demo/PopTip Demo.xcodeproj/project.pbxproj index bd9b0811..bb759928 100644 --- a/Demo/PopTip Demo.xcodeproj/project.pbxproj +++ b/Demo/PopTip Demo.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 65FAEDCB1ECAED0600F5681E /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 65FAEDC91ECAED0600F5681E /* MainInterface.storyboard */; }; 65FAEDCF1ECAED0600F5681E /* PopTip Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 65FAEDC31ECAED0600F5681E /* PopTip Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 94178E90A7FECC3842CC852D /* Pods_PopTip_DemoTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 16769670F46D31DE64BD65FD /* Pods_PopTip_DemoTests.framework */; }; + 94A7C1BF237D8D1A0057E047 /* SwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A7C1BE237D8D190057E047 /* SwiftUIView.swift */; }; CC7B379E0562CFF5318FA3F3 /* Pods_PopTip_Demo_PopTip_Extension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17A0968287A7268EA4723232 /* Pods_PopTip_Demo_PopTip_Extension.framework */; }; /* End PBXBuildFile section */ @@ -75,6 +76,7 @@ 65FAEDC71ECAED0600F5681E /* TodayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayViewController.swift; sourceTree = ""; }; 65FAEDCA1ECAED0600F5681E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; 65FAEDCC1ECAED0600F5681E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 94A7C1BE237D8D190057E047 /* SwiftUIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftUIView.swift; sourceTree = ""; }; 9C691B16BC4B538EB258C6A2 /* Pods-PopTip Demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PopTip Demo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-PopTip Demo/Pods-PopTip Demo.debug.xcconfig"; sourceTree = ""; }; A1C9EDB2CED7C68DC4FC9991 /* Pods-PopTip Demo-PopTip Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PopTip Demo-PopTip Extension.release.xcconfig"; path = "Pods/Target Support Files/Pods-PopTip Demo-PopTip Extension/Pods-PopTip Demo-PopTip Extension.release.xcconfig"; sourceTree = ""; }; AB67F6130915DD986BE56F57 /* Pods_PopTip_DemoUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PopTip_DemoUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -157,6 +159,7 @@ 65E698341EC0C39F002F1E3C /* Resources */, 653472381EB7B89C002DA5DA /* AppDelegate.swift */, 6534723A1EB7B89C002DA5DA /* ViewController.swift */, + 94A7C1BE237D8D190057E047 /* SwiftUIView.swift */, ); path = "PopTip Demo"; sourceTree = ""; @@ -450,6 +453,7 @@ files = ( 6534723B1EB7B89C002DA5DA /* ViewController.swift in Sources */, 653472391EB7B89C002DA5DA /* AppDelegate.swift in Sources */, + 94A7C1BF237D8D1A0057E047 /* SwiftUIView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Demo/PopTip Demo/SwiftUIView.swift b/Demo/PopTip Demo/SwiftUIView.swift new file mode 100644 index 00000000..2a4024bc --- /dev/null +++ b/Demo/PopTip Demo/SwiftUIView.swift @@ -0,0 +1,52 @@ +// +// SwiftUIView.swift +// PopTip Demo +// +// Created by Ernesto Rivera on 11/13/19. +// Copyright © 2017 Andrea Mazzini. All rights reserved. +// + +#if canImport(SwiftUI) && canImport(Combine) +import SwiftUI + +@available(iOS 13.0, *) +struct SwiftUIView: View { + + var items = [Item(string: "First"), + Item(string: "Second"), + Item(string: "Third"), + Item(string: "Fourth"), + Item(string: "Fifth")] + + var body: some View { + ScrollView { + Text("Custom SwiftUI view") + ForEach(items) { item in + HStack { + Image(systemName: "person.circle") + Text(item.string) + Spacer() + } + .foregroundColor(.secondary) + } + } + } +} + +class Item: Identifiable { + let id = UUID() + + var string: String + + init(string: String) { + self.string = string + } +} + +@available(iOS 13.0, *) +struct SwiftUIView_Previews: PreviewProvider { + static var previews: some View { + SwiftUIView() + } +} +#endif diff --git a/Demo/PopTip Demo/ViewController.swift b/Demo/PopTip Demo/ViewController.swift index 03fa9650..e9509db1 100644 --- a/Demo/PopTip Demo/ViewController.swift +++ b/Demo/PopTip Demo/ViewController.swift @@ -71,6 +71,8 @@ class ViewController: UIViewController { print("dismiss") } } + + var showSwiftUIView = false @IBAction func action(sender: UIButton) { guard let button = ButtonType(rawValue: sender.tag) else { return } @@ -81,30 +83,43 @@ class ViewController: UIViewController { switch button { case .topLeft: - let customView = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 120)) - let imageView = UIImageView(image: UIImage(named: "comment")) - imageView.frame = CGRect(x: (80 - imageView.frame.width) / 2, y: 0, width: imageView.frame.width, height: imageView.frame.height) - customView.addSubview(imageView) - let label = UILabel(frame: CGRect(x: 0, y: imageView.frame.height, width: 80, height: 120 - imageView.frame.height)) - label.numberOfLines = 0 - label.text = "This is a custom view" - label.textAlignment = .center - label.textColor = .white - label.font = UIFont.systemFont(ofSize: 12) - customView.addSubview(label) popTip.bubbleColor = UIColor(red: 0.95, green: 0.65, blue: 0.21, alpha: 1) popTip.cornerRadius = 10 - popTip.show(customView: customView, direction: .down, in: view, from: sender.frame) - + if !showSwiftUIView + { + let customView = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 120)) + let imageView = UIImageView(image: UIImage(named: "comment")) + imageView.frame = CGRect(x: (80 - imageView.frame.width) / 2, y: 0, width: imageView.frame.width, height: imageView.frame.height) + customView.addSubview(imageView) + let label = UILabel(frame: CGRect(x: 0, y: imageView.frame.height, width: 80, height: 120 - imageView.frame.height)) + label.numberOfLines = 0 + label.text = "This is a custom view" + label.textAlignment = .center + label.textColor = .white + label.font = UIFont.systemFont(ofSize: 12) + customView.addSubview(label) + + popTip.show(customView: customView, direction: .down, in: view, from: sender.frame) + } + else if #available(iOS 13.0.0, *) + { + #if canImport(SwiftUI) && canImport(Combine) + popTip.show(rootView: SwiftUIView(), direction: .down, in: view, from: sender.frame, parent: self) + #endif + } popTip.entranceAnimationHandler = { [weak self] completion in guard let `self` = self else { return } self.popTip.transform = CGAffineTransform(rotationAngle: 0.3) - UIView.animate(withDuration: 0.5, animations: { + UIView.animate(withDuration: 0.5, animations: { self.popTip.transform = .identity }, completion: { (_) in completion() }) } + if #available(iOS 13.0.0, *) + { + self.showSwiftUIView.toggle() + } case .topRight: popTip.bubbleColor = UIColor(red: 0.97, green: 0.9, blue: 0.23, alpha: 1) @@ -114,6 +129,7 @@ class ViewController: UIViewController { topRightDirection = .left } popTip.show(text: "I have a offset to move the bubble down or left side.", direction: topRightDirection, maxWidth: 150, in: view, from: sender.frame) + case .bottomLeft: popTip.bubbleColor = UIColor(red: 0.73, green: 0.91, blue: 0.55, alpha: 1) let attributes: [NSAttributedString.Key: Any] = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 12), NSAttributedString.Key.foregroundColor: UIColor.white] @@ -121,9 +137,11 @@ class ViewController: UIViewController { let attributedText = NSMutableAttributedString(string: "I'm presenting a string ", attributes: attributes) attributedText.append(NSAttributedString(string: "with attributes!", attributes: underline)) popTip.show(attributedText: attributedText, direction: .up, maxWidth: 200, in: view, from: sender.frame) + case .bottomRight: popTip.bubbleColor = UIColor(red: 0.81, green: 0.04, blue: 0.14, alpha: 1) popTip.show(text: "Animated popover, great for subtle UI tips and onboarding", direction: .left, maxWidth: 200, in: view, from: sender.frame) + case .center: popTip.arrowRadius = 2 popTip.bubbleColor = UIColor(red: 0.31, green: 0.57, blue: 0.87, alpha: 1)