From 5ce4aa0f19db6411d13c3f74b366634758ead20d Mon Sep 17 00:00:00 2001 From: Adam Modzelewski Date: Thu, 29 Jun 2017 20:37:58 +0200 Subject: [PATCH] Update pods --- .swift-version | 2 +- Podfile | 15 +- Podfile.lock | 37 +- Pods/Manifest.lock | 37 +- .../CurrentTestCaseTracker.swift | 37 + .../DynamicSize/DynamicSizeSnapshot.swift | 217 ++ .../HaveValidDynamicTypeSnapshot.swift | 92 + .../DynamicType/NBSMockedApplication.h | 13 + .../DynamicType/NBSMockedApplication.m | 103 + .../DynamicType/PrettyDynamicTypeSyntax.swift | 45 + Pods/Nimble-Snapshots/HaveValidSnapshot.swift | 238 ++- .../NimbleSnapshotsConfiguration.swift | 10 - Pods/Nimble-Snapshots/PrettySyntax.swift | 26 +- Pods/Nimble-Snapshots/README.md | 116 +- ...ObservationCenter+CurrentTestCaseTracker.h | 5 + ...ObservationCenter+CurrentTestCaseTracker.m | 10 + Pods/Nimble/{LICENSE.md => LICENSE} | 2 +- Pods/Nimble/README.md | 820 ++++++-- .../CwlCatchException/CwlCatchException.swift | 37 + .../CwlCatchException.m | 37 + .../include/CwlCatchException.h | 32 + .../CwlMachBadInstructionHandler.m | 50 + .../include/CwlMachBadInstructionHandler.h | 70 + .../mach_excServer.c | 537 +++++ .../mach_excServer.h | 321 +++ .../CwlBadInstructionException.swift | 89 + .../CwlCatchBadInstruction.swift | 199 ++ .../CwlDarwinDefinitions.swift | 55 + .../Mach/CwlPreconditionTesting.h | 30 + .../Nimble/Adapters/AssertionDispatcher.swift | 1 - .../Nimble/Adapters/AssertionRecorder.swift | 4 +- .../Nimble/Adapters/NMBExpectation.swift | 114 +- .../Nimble/Adapters/NMBObjCMatcher.swift | 2 +- .../Nimble/Adapters/NimbleEnvironment.swift | 6 +- .../Nimble/Adapters/NimbleXCTestHandler.swift | 15 +- Pods/Nimble/Sources/Nimble/DSL+Wait.swift | 21 +- Pods/Nimble/Sources/Nimble/Expectation.swift | 85 +- .../Sources/Nimble/ExpectationMessage.swift | 261 +++ Pods/Nimble/Sources/Nimble/Expression.swift | 2 +- .../Sources/Nimble/FailureMessage.swift | 33 +- .../Sources/Nimble/Matchers/AllPass.swift | 138 +- .../Nimble/Matchers/AsyncMatcherWrapper.swift | 116 +- .../Sources/Nimble/Matchers/BeAKindOf.swift | 58 +- .../Nimble/Matchers/BeAnInstanceOf.swift | 50 +- .../Sources/Nimble/Matchers/BeCloseTo.swift | 46 +- .../Sources/Nimble/Matchers/BeEmpty.swift | 68 +- .../Nimble/Matchers/BeGreaterThan.swift | 19 +- .../Matchers/BeGreaterThanOrEqualTo.swift | 12 +- .../Nimble/Matchers/BeIdenticalTo.swift | 13 +- .../Sources/Nimble/Matchers/BeLessThan.swift | 16 +- .../Nimble/Matchers/BeLessThanOrEqual.swift | 12 +- .../Sources/Nimble/Matchers/BeLogical.swift | 52 +- .../Sources/Nimble/Matchers/BeNil.swift | 7 +- .../Sources/Nimble/Matchers/BeVoid.swift | 10 +- .../Sources/Nimble/Matchers/BeginWith.swift | 37 +- .../Sources/Nimble/Matchers/Contain.swift | 38 +- .../Matchers/ContainElementSatisfying.swift | 59 + .../Sources/Nimble/Matchers/EndWith.swift | 27 +- .../Sources/Nimble/Matchers/Equal.swift | 135 +- .../Sources/Nimble/Matchers/HaveCount.swift | 10 +- .../Sources/Nimble/Matchers/Match.swift | 12 +- .../Sources/Nimble/Matchers/MatchError.swift | 43 +- .../Sources/Nimble/Matchers/MatcherFunc.swift | 22 +- .../Nimble/Matchers/MatcherProtocols.swift | 21 +- .../Nimble/Matchers/PostNotification.swift | 10 +- .../Sources/Nimble/Matchers/Predicate.swift | 348 ++++ .../Nimble/Matchers/RaisesException.swift | 10 +- .../Nimble/Matchers/SatisfyAnyOf.swift | 114 +- .../Nimble/Matchers/ThrowAssertion.swift | 55 + .../Sources/Nimble/Matchers/ThrowError.swift | 235 ++- .../Sources/Nimble/Matchers/ToSucceed.swift | 37 + Pods/Nimble/Sources/Nimble/Nimble.h | 2 + Pods/Nimble/Sources/Nimble/Utils/Async.swift | 70 +- Pods/Nimble/Sources/Nimble/Utils/Errors.swift | 82 +- .../Sources/Nimble/Utils/SourceLocation.swift | 8 +- .../Sources/Nimble/Utils/Stringers.swift | 11 +- Pods/Nimble/Sources/NimbleObjectiveC/DSL.h | 300 ++- Pods/Nimble/Sources/NimbleObjectiveC/DSL.m | 26 +- .../NimbleObjectiveC/NMBExceptionCapture.h | 2 +- .../Sources/NimbleObjectiveC/NMBStringify.h | 2 +- Pods/Pods.xcodeproj/project.pbxproj | 1847 +++++++++-------- Pods/Quick/README.md | 32 +- Pods/Quick/Sources/Quick/Callsite.swift | 14 +- .../Quick/Configuration/Configuration.swift | 6 +- Pods/Quick/Sources/Quick/DSL/DSL.swift | 38 +- Pods/Quick/Sources/Quick/DSL/World+DSL.swift | 28 +- Pods/Quick/Sources/Quick/Example.swift | 20 +- Pods/Quick/Sources/Quick/ExampleGroup.swift | 12 +- Pods/Quick/Sources/Quick/Hooks/Closures.swift | 6 +- .../Sources/Quick/Hooks/ExampleHooks.swift | 6 +- .../Quick/NSBundle+CurrentTestBundle.swift | 9 + .../NSString+C99ExtendedIdentifier.swift | 33 + .../Quick/QuickSelectedTestSuiteBuilder.swift | 2 +- .../Quick/Sources/Quick/String+FileName.swift | 12 - Pods/Quick/Sources/Quick/URL+FileName.swift | 12 + Pods/Quick/Sources/Quick/World.swift | 17 +- .../NSString+QCKSelectorName.h | 17 - .../NSString+QCKSelectorName.m | 37 - .../Quick/Sources/QuickObjectiveC/QuickSpec.m | 47 +- .../Sources/QuickSpecBase/QuickSpecBase.m | 55 + .../QuickSpecBase/include/QuickSpecBase.h | 11 + .../FBSnapshotTestCase-prefix.pch | 8 + .../FBSnapshotTestCase-umbrella.h | 8 + .../FBSnapshotTestCase.xcconfig | 1 + .../FBSnapshotTestCase/Info.plist | 2 +- .../Nimble-Snapshots/Info.plist | 2 +- .../Nimble-Snapshots-prefix.pch | 8 + .../Nimble-Snapshots-umbrella.h | 10 + .../Nimble-Snapshots.xcconfig | 5 +- Pods/Target Support Files/Nimble/Info.plist | 2 +- .../Nimble/Nimble-prefix.pch | 8 + .../Nimble/Nimble-umbrella.h | 12 + .../Nimble/Nimble.xcconfig | 1 + .../Pods-TRXTests-acknowledgements.markdown | 2 +- .../Pods-TRXTests-acknowledgements.plist | 2 +- .../Pods-TRXTests/Pods-TRXTests-frameworks.sh | 12 +- .../Pods-TRXTests/Pods-TRXTests-resources.sh | 6 + .../Pods-TRXTests/Pods-TRXTests-umbrella.h | 8 + .../Pods-TRXTests.debug.xcconfig | 2 +- .../Pods-TRXTests.release.xcconfig | 2 +- Pods/Target Support Files/Quick/Info.plist | 2 +- .../Quick/Quick-prefix.pch | 8 + .../Quick/Quick-umbrella.h | 8 + .../Target Support Files/Quick/Quick.xcconfig | 1 + TRX.xcodeproj/project.pbxproj | 2 +- 125 files changed, 6447 insertions(+), 2095 deletions(-) create mode 100644 Pods/Nimble-Snapshots/CurrentTestCaseTracker.swift create mode 100644 Pods/Nimble-Snapshots/DynamicSize/DynamicSizeSnapshot.swift create mode 100644 Pods/Nimble-Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift create mode 100644 Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.h create mode 100644 Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.m create mode 100644 Pods/Nimble-Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift delete mode 100644 Pods/Nimble-Snapshots/NimbleSnapshotsConfiguration.swift create mode 100644 Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.h create mode 100644 Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.m rename Pods/Nimble/{LICENSE.md => LICENSE} (99%) create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift create mode 100644 Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h create mode 100644 Pods/Nimble/Sources/Nimble/ExpectationMessage.swift create mode 100644 Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift create mode 100644 Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift create mode 100644 Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift create mode 100644 Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift create mode 100644 Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift delete mode 100644 Pods/Quick/Sources/Quick/String+FileName.swift create mode 100644 Pods/Quick/Sources/Quick/URL+FileName.swift delete mode 100644 Pods/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.h delete mode 100644 Pods/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.m create mode 100644 Pods/Quick/Sources/QuickSpecBase/QuickSpecBase.m create mode 100644 Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h diff --git a/.swift-version b/.swift-version index 9f55b2c..5186d07 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -3.0 +4.0 diff --git a/Podfile b/Podfile index 670cc41..83e47d0 100644 --- a/Podfile +++ b/Podfile @@ -1,16 +1,7 @@ use_frameworks! target 'TRXTests' do - pod 'Quick', '~> 0.10.0' - pod 'Nimble', '~> 5.0.0' - pod 'Nimble-Snapshots', '~> 4.2.0' -end - -post_install do |installer| - installer.pods_project.build_configurations.each do |config| - # Configure Pod targets for Xcode 8 compatibility - config.build_settings['SWIFT_VERSION'] = '3.0' - config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = 'ABCDEFGHIJ/' - config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO' - end + pod 'Quick', '~> 1.1.0' + pod 'Nimble', '~> 7.0.1' + pod 'Nimble-Snapshots', '~> 6.1.0' end \ No newline at end of file diff --git a/Podfile.lock b/Podfile.lock index 7291853..e3ece38 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,27 +1,28 @@ PODS: - - FBSnapshotTestCase (2.1.3): - - FBSnapshotTestCase/SwiftSupport (= 2.1.3) - - FBSnapshotTestCase/Core (2.1.3) - - FBSnapshotTestCase/SwiftSupport (2.1.3): + - FBSnapshotTestCase (2.1.4): + - FBSnapshotTestCase/SwiftSupport (= 2.1.4) + - FBSnapshotTestCase/Core (2.1.4) + - FBSnapshotTestCase/SwiftSupport (2.1.4): - FBSnapshotTestCase/Core - - Nimble (5.0.0) - - Nimble-Snapshots (4.2.0): + - Nimble (7.0.1) + - Nimble-Snapshots (6.1.0): + - Nimble-Snapshots/Core (= 6.1.0) + - Nimble-Snapshots/Core (6.1.0): - FBSnapshotTestCase (~> 2.0) - - Nimble - - Quick - - Quick (0.10.0) + - Nimble (~> 7.0) + - Quick (1.1.0) DEPENDENCIES: - - Nimble (~> 5.0.0) - - Nimble-Snapshots (~> 4.2.0) - - Quick (~> 0.10.0) + - Nimble (~> 7.0.1) + - Nimble-Snapshots (~> 6.1.0) + - Quick (~> 1.1.0) SPEC CHECKSUMS: - FBSnapshotTestCase: 4607968e0dfa1e2772ec0d0098354f8b870c5753 - Nimble: 56fc9f5020effa2206de22c3dd910f4fb011b92f - Nimble-Snapshots: 4826e3ee211d2c7af27645e35d68b9e9917882e7 - Quick: 5d290df1c69d5ee2f0729956dcf0fd9a30447eaa + FBSnapshotTestCase: 094f9f314decbabe373b87cc339bea235a63e07a + Nimble: 657d000e11df8aebe27cdaf9d244de7f30ed87f7 + Nimble-Snapshots: 63e2d58d161861ab15a74fbfc6b55e6164e7ccee + Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d -PODFILE CHECKSUM: f746eaae94bebbb82137146ebf3b472939b797b8 +PODFILE CHECKSUM: 8dbdaf7fb38a94547c9d6ceab72217555adc8312 -COCOAPODS: 1.1.1 +COCOAPODS: 1.2.1 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 7291853..e3ece38 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,27 +1,28 @@ PODS: - - FBSnapshotTestCase (2.1.3): - - FBSnapshotTestCase/SwiftSupport (= 2.1.3) - - FBSnapshotTestCase/Core (2.1.3) - - FBSnapshotTestCase/SwiftSupport (2.1.3): + - FBSnapshotTestCase (2.1.4): + - FBSnapshotTestCase/SwiftSupport (= 2.1.4) + - FBSnapshotTestCase/Core (2.1.4) + - FBSnapshotTestCase/SwiftSupport (2.1.4): - FBSnapshotTestCase/Core - - Nimble (5.0.0) - - Nimble-Snapshots (4.2.0): + - Nimble (7.0.1) + - Nimble-Snapshots (6.1.0): + - Nimble-Snapshots/Core (= 6.1.0) + - Nimble-Snapshots/Core (6.1.0): - FBSnapshotTestCase (~> 2.0) - - Nimble - - Quick - - Quick (0.10.0) + - Nimble (~> 7.0) + - Quick (1.1.0) DEPENDENCIES: - - Nimble (~> 5.0.0) - - Nimble-Snapshots (~> 4.2.0) - - Quick (~> 0.10.0) + - Nimble (~> 7.0.1) + - Nimble-Snapshots (~> 6.1.0) + - Quick (~> 1.1.0) SPEC CHECKSUMS: - FBSnapshotTestCase: 4607968e0dfa1e2772ec0d0098354f8b870c5753 - Nimble: 56fc9f5020effa2206de22c3dd910f4fb011b92f - Nimble-Snapshots: 4826e3ee211d2c7af27645e35d68b9e9917882e7 - Quick: 5d290df1c69d5ee2f0729956dcf0fd9a30447eaa + FBSnapshotTestCase: 094f9f314decbabe373b87cc339bea235a63e07a + Nimble: 657d000e11df8aebe27cdaf9d244de7f30ed87f7 + Nimble-Snapshots: 63e2d58d161861ab15a74fbfc6b55e6164e7ccee + Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d -PODFILE CHECKSUM: f746eaae94bebbb82137146ebf3b472939b797b8 +PODFILE CHECKSUM: 8dbdaf7fb38a94547c9d6ceab72217555adc8312 -COCOAPODS: 1.1.1 +COCOAPODS: 1.2.1 diff --git a/Pods/Nimble-Snapshots/CurrentTestCaseTracker.swift b/Pods/Nimble-Snapshots/CurrentTestCaseTracker.swift new file mode 100644 index 0000000..16455b4 --- /dev/null +++ b/Pods/Nimble-Snapshots/CurrentTestCaseTracker.swift @@ -0,0 +1,37 @@ +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? { + guard let fullName = self.name else { + return nil + } + + let characterSet = CharacterSet(charactersIn: "[]+-") + let name = fullName.components(separatedBy: characterSet).joined() + + 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/Pods/Nimble-Snapshots/DynamicSize/DynamicSizeSnapshot.swift b/Pods/Nimble-Snapshots/DynamicSize/DynamicSizeSnapshot.swift new file mode 100644 index 0000000..bb10258 --- /dev/null +++ b/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.width != size.width { + 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/Pods/Nimble-Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift b/Pods/Nimble-Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift new file mode 100644 index 0000000..a8d4fa9 --- /dev/null +++ b/Pods/Nimble-Snapshots/DynamicType/HaveValidDynamicTypeSnapshot.swift @@ -0,0 +1,92 @@ +import Nimble +import UIKit + +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) + + 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) + + 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() + } +} diff --git a/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.h b/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.h new file mode 100644 index 0000000..8ab0b7f --- /dev/null +++ b/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/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.m b/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.m new file mode 100644 index 0000000..5344eb5 --- /dev/null +++ b/Pods/Nimble-Snapshots/DynamicType/NBSMockedApplication.m @@ -0,0 +1,103 @@ +#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 + +@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]; + self.isSwizzled = YES; + } + + [[NSNotificationCenter defaultCenter] postNotificationName:UIContentSizeCategoryDidChangeNotification + object:[UIApplication sharedApplication] + userInfo:@{UIContentSizeCategoryNewValueKey: category}]; +} + +- (void)stopMockingPreferredContentSizeCategory { + if (self.isSwizzled) { + [UIApplication nbs_swizzle]; + [UIFont nbs_swizzle]; + self.isSwizzled = NO; + } +} + +- (void)dealloc { + [self stopMockingPreferredContentSizeCategory]; +} + +@end + +@implementation UIFont (Swizzling) + ++ (UIFont *)nbs_preferredFontForTextStyle:(UIFontTextStyle)style { + UIContentSizeCategory category = UIApplication.sharedApplication.preferredContentSizeCategory; + UITraitCollection *categoryTrait = [UITraitCollection traitCollectionWithPreferredContentSizeCategory:category]; + return [UIFont preferredFontForTextStyle:style compatibleWithTraitCollection:categoryTrait]; +} + ++ (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 diff --git a/Pods/Nimble-Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift b/Pods/Nimble-Snapshots/DynamicType/PrettyDynamicTypeSyntax.swift new file mode 100644 index 0000000..79eb4fd --- /dev/null +++ b/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/Pods/Nimble-Snapshots/HaveValidSnapshot.swift b/Pods/Nimble-Snapshots/HaveValidSnapshot.swift index 07376c2..6671305 100644 --- a/Pods/Nimble-Snapshots/HaveValidSnapshot.swift +++ b/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) { - failureMessage.actualValue = "" +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) - failureMessage.actualValue = "expected a matching snapshot in \(snapshotName)" + 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.actualValue = "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.actualValue = "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/Pods/Nimble-Snapshots/NimbleSnapshotsConfiguration.swift b/Pods/Nimble-Snapshots/NimbleSnapshotsConfiguration.swift deleted file mode 100644 index afb6eae..0000000 --- a/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/Pods/Nimble-Snapshots/PrettySyntax.swift b/Pods/Nimble-Snapshots/PrettySyntax.swift index cb84d33..b4f8c5b 100644 --- a/Pods/Nimble-Snapshots/PrettySyntax.swift +++ b/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/Pods/Nimble-Snapshots/README.md b/Pods/Nimble-Snapshots/README.md index d0be498..9af754b 100644 --- a/Pods/Nimble-Snapshots/README.md +++ b/Pods/Nimble-Snapshots/README.md @@ -2,7 +2,7 @@ Nimble-Snapshots [![Build Status](https://travis-ci.org/ashfurrow/Nimble-Snapsho ============================= [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). +Highly derivative of [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 "facebook/ios-snapshot-test-case" "2.1.4" +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,10 +98,83 @@ 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 +content size categories. + +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 +`recordDynamicTypeSnapshot` matchers: + +```swift +// expect(view).to(recordDynamicTypeSnapshot() +expect(view).to(haveValidDynamicTypeSnapshot()) + +// You can also just test some sizes: +expect(view).to(haveValidDynamicTypeSnapshot(sizes: [UIContentSizeCategoryExtraLarge])) + +// If you prefer the == syntax, we got you covered too: +expect(view) == dynamicTypeSnapshot() +expect(view) == dynamicTypeSnapshot(sizes: [UIContentSizeCategoryExtraLarge]) +``` + +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 +[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 +on change and forget the others. For this we create a easy way to tests all sizes at same time. + +You can use the new `haveValidDynamicSizeSnapshot` and `recordDynamicSizeSnapshot` +matchers to test multiple sizes at once: + +```swift +let sizes = ["SmallSize": CGSize(width: 44, height: 44), +"MediumSize": CGSize(width: 88, height: 88), +"LargeSize": CGSize(width: 132, height: 132)] + +// expect(view).to(recordDynamicSizeSnapshot(sizes: sizes)) +expect(view).to(haveValidDynamicSizeSnapshot(sizes: sizes)) + +// You can also just test some sizes: +expect(view).to(haveValidDynamicSizeSnapshot(sizes: sizes)) + +// If you prefer the == syntax, we got you covered too: +expect(view) == dynamicSizeSnapshot(sizes: sizes) +expect(view) == dynamicSizeSnapshot(sizes: sizes) +``` + +By default, the size will be set on the view using the frame property. To change this behavior +you can use the `ResizeMode` enum: + +```swift +public enum ResizeMode { + case frame + case constrains + 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 +implement the `ViewResizer` protocol and resize yourself. +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/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.h b/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.h new file mode 100644 index 0000000..8e21c30 --- /dev/null +++ b/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.h @@ -0,0 +1,5 @@ +#import + +@interface XCTestObservationCenter (CurrentTestCaseTracker) + +@end diff --git a/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.m b/Pods/Nimble-Snapshots/XCTestObservationCenter+CurrentTestCaseTracker.m new file mode 100644 index 0000000..4a4e2cc --- /dev/null +++ b/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/Pods/Nimble/LICENSE.md b/Pods/Nimble/LICENSE similarity index 99% rename from Pods/Nimble/LICENSE.md rename to Pods/Nimble/LICENSE index 0f3eb71..82b84bf 100644 --- a/Pods/Nimble/LICENSE.md +++ b/Pods/Nimble/LICENSE @@ -186,7 +186,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2014 Quick Team + Copyright 2016 Quick Team Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Pods/Nimble/README.md b/Pods/Nimble/README.md index e816baf..2be02f4 100644 --- a/Pods/Nimble/README.md +++ b/Pods/Nimble/README.md @@ -1,5 +1,10 @@ # Nimble +[![Build Status](https://travis-ci.org/Quick/Nimble.svg?branch=master)](https://travis-ci.org/Quick/Nimble) +[![CocoaPods](https://img.shields.io/cocoapods/v/Nimble.svg)](https://cocoapods.org/pods/Nimble) +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Platforms](https://img.shields.io/cocoapods/p/Nimble.svg)](https://cocoapods.org/pods/Nimble) + Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by [Cedar](https://github.com/pivotal/cedar). @@ -23,7 +28,7 @@ expect(ocean.isClean).toEventually(beTruthy()) - [Some Background: Expressing Outcomes Using Assertions in XCTest](#some-background-expressing-outcomes-using-assertions-in-xctest) - [Nimble: Expectations Using `expect(...).to`](#nimble-expectations-using-expectto) - [Custom Failure Messages](#custom-failure-messages) - - [Type Checking](#type-checking) + - [Type Safety](#type-safety) - [Operator Overloads](#operator-overloads) - [Lazily Computed Values](#lazily-computed-values) - [C Primitives](#c-primitives) @@ -31,24 +36,36 @@ expect(ocean.isClean).toEventually(beTruthy()) - [Objective-C Support](#objective-c-support) - [Disabling Objective-C Shorthand](#disabling-objective-c-shorthand) - [Built-in Matcher Functions](#built-in-matcher-functions) + - [Type Checking](#type-checking) - [Equivalence](#equivalence) - [Identity](#identity) - [Comparisons](#comparisons) - [Types/Classes](#typesclasses) - [Truthiness](#truthiness) + - [Swift Assertions](#swift-assertions) - [Swift Error Handling](#swift-error-handling) - [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) + - [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) @@ -162,7 +179,7 @@ expect(@(1+1)).toWithDescription(equal(@3), @"Make sure libKindergartenMath is l // expected to equal <3.0000>, got <2.0000> ``` -## Type Checking +## Type Safety Nimble makes sure you don't compare two types that don't match: @@ -279,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 @@ -289,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")) ``` @@ -301,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")); ``` @@ -327,6 +356,9 @@ cases, use the `timeout` parameter: // Waits three seconds for ocean to contain "starfish": expect(ocean).toEventually(contain("starfish"), timeout: 3) + +// Evaluate someValue every 0.2 seconds repeatedly until it equals 100, or fails if it timeouts after 5.5 seconds. +expect(someValue).toEventually(equal(100), timeout: 5.5, pollInterval: 0.2) ``` ```objc @@ -342,9 +374,9 @@ 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() + // do some stuff that takes a while... + NSThread.sleepForTimeInterval(0.5) + done() } ``` @@ -352,9 +384,9 @@ waitUntil { done in // Objective-C waitUntil(^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:0.5]; - done(); + // do some stuff that takes a while... + [NSThread sleepForTimeInterval:0.5]; + done(); }); ``` @@ -364,9 +396,9 @@ waitUntil(^(void (^done)(void)){ // Swift waitUntil(timeout: 10) { done in - // do some stuff that takes a while... - NSThread.sleepForTimeInterval(1) - done() + // do some stuff that takes a while... + NSThread.sleepForTimeInterval(1) + done() } ``` @@ -374,9 +406,9 @@ waitUntil(timeout: 10) { done in // Objective-C waitUntilTimeout(10, ^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:1]; - done(); + // do some stuff that takes a while... + [NSThread sleepForTimeInterval:1]; + done(); }); ``` @@ -405,7 +437,8 @@ Nimble has full support for Objective-C. However, there are two things to keep in mind when using Nimble in Objective-C: 1. All parameters passed to the `expect` function, as well as matcher - functions like `equal`, must be Objective-C objects: + functions like `equal`, must be Objective-C objects or can be converted into + an `NSObject` equivalent: ```objc // Objective-C @@ -414,6 +447,17 @@ to keep in mind when using Nimble in Objective-C: expect(@(1 + 1)).to(equal(@2)); expect(@"Hello world").to(contain(@"world")); + + // Boxed as NSNumber * + expect(2).to(equal(2)); + expect(1.2).to(beLessThan(2.0)); + expect(true).to(beTruthy()); + + // Boxed as NSString * + expect("Hello world").to(equal("Hello world")); + + // Boxed as NSRange + expect(NSMakeRange(1, 10)).to(equal(NSMakeRange(1, 10))); ``` 2. To make an expectation on an expression that does not return a value, @@ -426,6 +470,28 @@ to keep in mind when using Nimble in Objective-C: expectAction(^{ [exception raise]; }).to(raiseException()); ``` +The following types are currently converted to an `NSObject` type: + + - **C Numeric types** are converted to `NSNumber *` + - `NSRange` is converted to `NSValue *` + - `char *` is converted to `NSString *` + +For the following matchers: + +- `equal` +- `beGreaterThan` +- `beGreaterThanOrEqual` +- `beLessThan` +- `beLessThanOrEqual` +- `beCloseTo` +- `beTrue` +- `beFalse` +- `beTruthy` +- `beFalsy` +- `haveCount` + +If you would like to see more, [file an issue](https://github.com/Quick/Nimble/issues). + ## Disabling Objective-C Shorthand Nimble provides a shorthand for expressing expectations using the @@ -450,16 +516,78 @@ NMB_expect(^{ return seagull.squawk; }, __FILE__, __LINE__).to(NMB_equal(@"Squee Nimble includes a wide variety of matcher functions. +## Type Checking + +Nimble supports checking the type membership of any kind of object, whether +Objective-C conformant or not: + +```swift +// Swift + +protocol SomeProtocol{} +class SomeClassConformingToProtocol: SomeProtocol{} +struct SomeStructConformingToProtocol: SomeProtocol{} + +// The following tests pass +expect(1).to(beAKindOf(Int.self)) +expect("turtle").to(beAKindOf(String.self)) + +let classObject = SomeClassConformingToProtocol() +expect(classObject).to(beAKindOf(SomeProtocol.self)) +expect(classObject).to(beAKindOf(SomeClassConformingToProtocol.self)) +expect(classObject).toNot(beAKindOf(SomeStructConformingToProtocol.self)) + +let structObject = SomeStructConformingToProtocol() +expect(structObject).to(beAKindOf(SomeProtocol.self)) +expect(structObject).to(beAKindOf(SomeStructConformingToProtocol.self)) +expect(structObject).toNot(beAKindOf(SomeClassConformingToProtocol.self)) +``` + +```objc +// Objective-C + +// The following tests pass +NSMutableArray *array = [NSMutableArray array]; +expect(array).to(beAKindOf([NSArray class])); +expect(@1).toNot(beAKindOf([NSNull class])); +``` + +Objects can be tested for their exact types using the `beAnInstanceOf` matcher: + +```swift +// Swift + +protocol SomeProtocol{} +class SomeClassConformingToProtocol: SomeProtocol{} +struct SomeStructConformingToProtocol: SomeProtocol{} + +// 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. +expect(1).to(beAnInstanceOf(Int.self)) +expect("turtle").to(beAnInstanceOf(String.self)) + +let classObject = SomeClassConformingToProtocol() +expect(classObject).toNot(beAnInstanceOf(SomeProtocol.self)) +expect(classObject).to(beAnInstanceOf(SomeClassConformingToProtocol.self)) +expect(classObject).toNot(beAnInstanceOf(SomeStructConformingToProtocol.self)) + +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 ``` @@ -467,10 +595,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)) ``` @@ -482,25 +610,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)); ``` @@ -605,20 +741,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)); ``` @@ -645,77 +781,125 @@ 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()); ``` +## Swift Assertions + +If you're using Swift, you can use the `throwAssertion` matcher to check if an assertion is thrown (e.g. `fatalError()`). This is made possible by [@mattgallagher](https://github.com/mattgallagher)'s [CwlPreconditionTesting](https://github.com/mattgallagher/CwlPreconditionTesting) library. + +```swift +// Swift + +// 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 an NSError is not equal to throwing an assertion: +expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion()) + +// Passes if the code after the precondition check is not run: +var reachedPoint1 = false +var reachedPoint2 = false +expect { + reachedPoint1 = true + precondition(false, "condition message") + reachedPoint2 = true +}.to(throwAssertion()) + +expect(reachedPoint1) == true +expect(reachedPoint2) == false +``` + +Notes: + +* This feature is only available in Swift. +* It is only supported for `x86_64` binaries, meaning _you cannot run this matcher on iOS devices, only simulators_. +* The tvOS simulator is supported, but using a different mechanism, requiring you to turn off the `Debug executable` scheme setting for your tvOS scheme's Test configuration. + ## 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))) ``` @@ -726,17 +910,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")) }) @@ -745,44 +929,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()); ``` @@ -815,20 +999,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)); ``` @@ -839,98 +1023,162 @@ expect(actual).to(endWith(expected)); Like `contain`, in Objective-C `beginWith` and `endWith` only support a single argument [for now](https://github.com/Quick/Nimble/issues/27). +For code that returns collections of complex objects without a strict +ordering, there is the `containElementSatisfying` matcher: + +```swift +// Swift + +struct Turtle { + let color: String +} + +let turtles: [Turtle] = functionThatReturnsSomeTurtlesInAnyOrder() + +// This set of matchers passes regardless of whether the array is +// [{color: "blue"}, {color: "green"}] or [{color: "green"}, {color: "blue"}]: + +expect(turtles).to(containElementSatisfying({ turtle in + return turtle.color == "green" +})) +expect(turtles).to(containElementSatisfying({ turtle in + return turtle.color == "blue" +}, "that is a turtle with color 'blue'")) + +// The second matcher will incorporate the provided string in the error message +// should it fail +``` + +```objc +// Objective-C + +@interface Turtle : NSObject +@property (nonatomic, readonly, nonnull) NSString *color; +@end + +@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"}]: + +expect(turtles).to(containElementSatisfying(^BOOL(id __nonnull object) { + return [[turtle color] isEqualToString:@"green"]; +})); +expect(turtles).to(containElementSatisfying(^BOOL(id __nonnull object) { + return [[turtle color] isEqualToString:@"blue"]; +})); +``` + ## Strings ```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 @@ -955,6 +1203,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))) @@ -967,6 +1217,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))) @@ -975,38 +1227,75 @@ expect(actual).to(satisfyAnyOf(beLessThan(@10), beGreaterThan(@20))) expect(@6).to(satisfyAnyOf(equal(@2), equal(@3), equal(@4), equal(@5), equal(@6), equal(@7))) ``` -Note: This matcher allows you to chain any number of matchers together. This provides flexibility, - but if you find yourself chaining many matchers together in one test, consider whether you - could instead refactor that single test into multiple, more precisely focused tests for - better coverage. +Note: This matcher allows you to chain any number of matchers together. This provides flexibility, + but if you find yourself chaining many matchers together in one test, consider whether you + could instead refactor that single test into multiple, more precisely focused tests for + better coverage. + +## Custom Validation + +```swift +// Swift + +// passes if .succeed is returned from the closure +expect({ + guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { + return .failed("wrong enum case") + } + + return .succeeded +}).to(succeed()) + +// passes if .failed is returned from the closure +expect({ + guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { + return .failed("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)>" +public func equal(expectedValue: T?) -> Predicate { + // Can be shortened to: + // Predicate { actual in ... } + // + // But shown with types here for clarity. + return Predicate { (actual: Expression) throws -> PredicateResult in + let msg = ExpectationMessage.expectedActualValueTo("equal <\(expectedValue)>") if let actualValue = try actualExpression.evaluate() { - return actualValue == expectedValue + return PredicateResult( + bool: actualValue == expectedValue!, + message: msg + ) } else { - return false + 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 @@ -1021,6 +1310,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 @@ -1031,22 +1377,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 @@ -1059,43 +1407,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: +```swift +// where `message` is the first string argument and +// `actual` is the actual value received in `expect(..)` +"expected to \(message), got <\(actual)>" ``` -expected to match, 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, /* actual: */ 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 @@ -1184,12 +1597,91 @@ 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 project, [Quick](https://github.com/Quick/Quick). To install both Quick and Nimble, follow [the installation instructions in the Quick - README](https://github.com/Quick/Quick#how-to-install-quick). + Documentation](https://github.com/Quick/Quick/blob/master/Documentation/en-us/InstallingQuick.md). Nimble can currently be installed in one of two ways: using CocoaPods, or with git submodules. @@ -1224,7 +1716,7 @@ source 'https://github.com/CocoaPods/Specs.git' target 'YOUR_APP_NAME_HERE_Tests', :exclusive => true do use_frameworks! - pod 'Nimble', '~> 4.0.0' + pod 'Nimble', '~> 6.0.0' end ``` diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift new file mode 100644 index 0000000..196ee9a --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift @@ -0,0 +1,37 @@ +// +// CwlCatchException.swift +// CwlAssertionTesting +// +// Created by Matt Gallagher on 2016/01/10. +// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +import Foundation + +#if SWIFT_PACKAGE +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 +} + +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) + } +} diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m new file mode 100644 index 0000000..738d43c --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m @@ -0,0 +1,37 @@ +// +// CwlCatchException.m +// CwlAssertionTesting +// +// Created by Matt Gallagher on 2016/01/10. +// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +#import "CwlCatchException.h" + +#if !SWIFT_PACKAGE && NON_SWIFT_PACKAGE +__attribute__((visibility("hidden"))) +#endif +NSException* catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)()) { + @try { + inBlock(); + } @catch (NSException *exception) { + if ([exception isKindOfClass:type]) { + return exception; + } else { + @throw; + } + } + return nil; +} diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h new file mode 100644 index 0000000..cc4c4fb --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h @@ -0,0 +1,32 @@ +// +// CwlCatchException.h +// CwlCatchException +// +// Created by Matt Gallagher on 2016/01/10. +// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +#import + +//! Project version number for CwlCatchException. +FOUNDATION_EXPORT double CwlCatchExceptionVersionNumber; + +//! Project version string for CwlCatchException. +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)()); diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m new file mode 100644 index 0000000..8183196 --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m @@ -0,0 +1,50 @@ +// +// CwlMachBadExceptionHandler.m +// CwlPreconditionTesting +// +// Created by Matt Gallagher on 2016/01/10. +// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +#if defined(__x86_64__) + + #import "mach_excServer.h" + #import "CwlMachBadInstructionHandler.h" + + @protocol BadInstructionReply + +(NSNumber *)receiveReply:(NSValue *)value; + @end + + /// A basic function that receives callbacks from mach_exc_server and relays them to the Swift implemented BadInstructionException.catch_mach_exception_raise_state. + kern_return_t catch_mach_exception_raise_state(mach_port_t exception_port, exception_type_t exception, const mach_exception_data_t code, mach_msg_type_number_t codeCnt, int *flavor, const thread_state_t old_state, mach_msg_type_number_t old_stateCnt, thread_state_t new_state, mach_msg_type_number_t *new_stateCnt) { + bad_instruction_exception_reply_t reply = { exception_port, exception, code, codeCnt, flavor, old_state, old_stateCnt, new_state, new_stateCnt }; + Class badInstructionClass = NSClassFromString(@"BadInstructionException"); + NSValue *value = [NSValue valueWithBytes: &reply objCType: @encode(bad_instruction_exception_reply_t)]; + return [[badInstructionClass performSelector: @selector(receiveReply:) withObject: value] intValue]; + } + + // The mach port should be configured so that this function is never used. + kern_return_t catch_mach_exception_raise(mach_port_t exception_port, mach_port_t thread, mach_port_t task, exception_type_t exception, mach_exception_data_t code, mach_msg_type_number_t codeCnt) { + assert(false); + return KERN_FAILURE; + } + + // The mach port should be configured so that this function is never used. + kern_return_t catch_mach_exception_raise_state_identity(mach_port_t exception_port, mach_port_t thread, mach_port_t task, exception_type_t exception, mach_exception_data_t code, mach_msg_type_number_t codeCnt, int *flavor, thread_state_t old_state, mach_msg_type_number_t old_stateCnt, thread_state_t new_state, mach_msg_type_number_t *new_stateCnt) { + assert(false); + return KERN_FAILURE; + } + +#endif diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h new file mode 100644 index 0000000..5755bfc --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h @@ -0,0 +1,70 @@ +// +// CwlMachBadExceptionHandler.h +// CwlPreconditionTesting +// +// Created by Matt Gallagher on 2016/01/10. +// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +extern boolean_t mach_exc_server(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); + +// The request_mach_exception_raise_t struct is passed to mach_msg which assumes its exact layout. To avoid problems with different layouts, we keep the definition in C rather than Swift. +typedef struct +{ + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + int64_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[224]; +} request_mach_exception_raise_t; + +// The reply_mach_exception_raise_state_t struct is passed to mach_msg which assumes its exact layout. To avoid problems with different layouts, we keep the definition in C rather than Swift. +typedef struct +{ + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[224]; +} reply_mach_exception_raise_state_t; + +typedef struct +{ + mach_port_t exception_port; + exception_type_t exception; + mach_exception_data_type_t const * _Nullable code; + mach_msg_type_number_t codeCnt; + int32_t * _Nullable flavor; + natural_t const * _Nullable old_state; + mach_msg_type_number_t old_stateCnt; + thread_state_t _Nullable new_state; + mach_msg_type_number_t * _Nullable new_stateCnt; +} bad_instruction_exception_reply_t; + +NS_ASSUME_NONNULL_END diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c new file mode 100644 index 0000000..733c564 --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c @@ -0,0 +1,537 @@ +/* + * IDENTIFICATION: + * stub generated Sun Jan 29 19:05:29 2017 + * with a MiG generated by bootstrap_cmds-96.20.2 + * OPTIONS: + */ + +#if defined(__x86_64__) + +/* Module mach_exc */ + +#define __MIG_check__Request__mach_exc_subsystem__ 1 + +#include "mach_excServer.h" + +#ifndef mig_internal +#define mig_internal static __inline__ +#endif /* mig_internal */ + +#ifndef mig_external +#define mig_external +#endif /* mig_external */ + +#if !defined(__MigTypeCheck) && defined(TypeCheck) +#define __MigTypeCheck TypeCheck /* Legacy setting */ +#endif /* !defined(__MigTypeCheck) */ + +#if !defined(__MigKernelSpecificCode) && defined(_MIG_KERNEL_SPECIFIC_CODE_) +#define __MigKernelSpecificCode _MIG_KERNEL_SPECIFIC_CODE_ /* Legacy setting */ +#endif /* !defined(__MigKernelSpecificCode) */ + +#ifndef LimitCheck +#define LimitCheck 0 +#endif /* LimitCheck */ + +#ifndef min +#define min(a,b) ( ((a) < (b))? (a): (b) ) +#endif /* min */ + +#if !defined(_WALIGN_) +#define _WALIGN_(x) (((x) + 3) & ~3) +#endif /* !defined(_WALIGN_) */ + +#if !defined(_WALIGNSZ_) +#define _WALIGNSZ_(x) _WALIGN_(sizeof(x)) +#endif /* !defined(_WALIGNSZ_) */ + +#ifndef UseStaticTemplates +#define UseStaticTemplates 0 +#endif /* UseStaticTemplates */ + +#ifndef __DeclareRcvRpc +#define __DeclareRcvRpc(_NUM_, _NAME_) +#endif /* __DeclareRcvRpc */ + +#ifndef __BeforeRcvRpc +#define __BeforeRcvRpc(_NUM_, _NAME_) +#endif /* __BeforeRcvRpc */ + +#ifndef __AfterRcvRpc +#define __AfterRcvRpc(_NUM_, _NAME_) +#endif /* __AfterRcvRpc */ + +#ifndef __DeclareRcvSimple +#define __DeclareRcvSimple(_NUM_, _NAME_) +#endif /* __DeclareRcvSimple */ + +#ifndef __BeforeRcvSimple +#define __BeforeRcvSimple(_NUM_, _NAME_) +#endif /* __BeforeRcvSimple */ + +#ifndef __AfterRcvSimple +#define __AfterRcvSimple(_NUM_, _NAME_) +#endif /* __AfterRcvSimple */ + +#define novalue void + +#define msgh_request_port msgh_local_port +#define MACH_MSGH_BITS_REQUEST(bits) MACH_MSGH_BITS_LOCAL(bits) +#define msgh_reply_port msgh_remote_port +#define MACH_MSGH_BITS_REPLY(bits) MACH_MSGH_BITS_REMOTE(bits) + +#define MIG_RETURN_ERROR(X, code) {\ + ((mig_reply_error_t *)X)->RetCode = code;\ + ((mig_reply_error_t *)X)->NDR = NDR_record;\ + return;\ + } + +/* Forward Declarations */ + + +mig_internal novalue _Xmach_exception_raise + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); + +mig_internal novalue _Xmach_exception_raise_state + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); + +mig_internal novalue _Xmach_exception_raise_state_identity + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); + + +#if ( __MigTypeCheck ) +#if __MIG_check__Request__mach_exc_subsystem__ +#if !defined(__MIG_check__Request__mach_exception_raise_t__defined) +#define __MIG_check__Request__mach_exception_raise_t__defined + +mig_internal kern_return_t __MIG_check__Request__mach_exception_raise_t(__attribute__((__unused__)) __Request__mach_exception_raise_t *In0P) +{ + + typedef __Request__mach_exception_raise_t __Request; +#if __MigTypeCheck + unsigned int msgh_size; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + msgh_size = In0P->Head.msgh_size; + if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || + (In0P->msgh_body.msgh_descriptor_count != 2) || + (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 16)) || (msgh_size > (mach_msg_size_t)sizeof(__Request))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR || + In0P->thread.disposition != 17) + return MIG_TYPE_ERROR; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR || + In0P->task.disposition != 17) + return MIG_TYPE_ERROR; +#endif /* __MigTypeCheck */ + +#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined */ +#if __MigTypeCheck + if ( In0P->codeCnt > 2 ) + return MIG_BAD_ARGUMENTS; + if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 16)) / 8 < In0P->codeCnt) || + (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 16) + (8 * In0P->codeCnt))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + + return MACH_MSG_SUCCESS; +} +#endif /* !defined(__MIG_check__Request__mach_exception_raise_t__defined) */ +#endif /* __MIG_check__Request__mach_exc_subsystem__ */ +#endif /* ( __MigTypeCheck ) */ + + +/* Routine mach_exception_raise */ +mig_internal novalue _Xmach_exception_raise + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) +{ + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + int64_t code[2]; + mach_msg_trailer_t trailer; + } Request __attribute__((unused)); +#ifdef __MigPackStructs +#pragma pack() +#endif + typedef __Request__mach_exception_raise_t __Request; + typedef __Reply__mach_exception_raise_t Reply __attribute__((unused)); + + /* + * typedef struct { + * mach_msg_header_t Head; + * NDR_record_t NDR; + * kern_return_t RetCode; + * } mig_reply_error_t; + */ + + Request *In0P = (Request *) InHeadP; + Reply *OutP = (Reply *) OutHeadP; +#ifdef __MIG_check__Request__mach_exception_raise_t__defined + kern_return_t check_result; +#endif /* __MIG_check__Request__mach_exception_raise_t__defined */ + + __DeclareRcvRpc(2405, "mach_exception_raise") + __BeforeRcvRpc(2405, "mach_exception_raise") + +#if defined(__MIG_check__Request__mach_exception_raise_t__defined) + check_result = __MIG_check__Request__mach_exception_raise_t((__Request *)In0P); + if (check_result != MACH_MSG_SUCCESS) + { MIG_RETURN_ERROR(OutP, check_result); } +#endif /* defined(__MIG_check__Request__mach_exception_raise_t__defined) */ + + OutP->RetCode = catch_mach_exception_raise(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt); + + OutP->NDR = NDR_record; + + + __AfterRcvRpc(2405, "mach_exception_raise") +} + +#if ( __MigTypeCheck ) +#if __MIG_check__Request__mach_exc_subsystem__ +#if !defined(__MIG_check__Request__mach_exception_raise_state_t__defined) +#define __MIG_check__Request__mach_exception_raise_state_t__defined + +mig_internal kern_return_t __MIG_check__Request__mach_exception_raise_state_t(__attribute__((__unused__)) __Request__mach_exception_raise_state_t *In0P, __attribute__((__unused__)) __Request__mach_exception_raise_state_t **In1PP) +{ + + typedef __Request__mach_exception_raise_state_t __Request; + __Request *In1P; +#if __MigTypeCheck + unsigned int msgh_size; +#endif /* __MigTypeCheck */ + unsigned int msgh_size_delta; + +#if __MigTypeCheck + msgh_size = In0P->Head.msgh_size; + if ((In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || + (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912)) || (msgh_size > (mach_msg_size_t)sizeof(__Request))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + +#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined */ + msgh_size_delta = (8 * In0P->codeCnt); +#if __MigTypeCheck + if ( In0P->codeCnt > 2 ) + return MIG_BAD_ARGUMENTS; + if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 8 < In0P->codeCnt) || + (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912) + (8 * In0P->codeCnt))) + return MIG_BAD_ARGUMENTS; + msgh_size -= msgh_size_delta; +#endif /* __MigTypeCheck */ + + *In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 16); + +#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined */ +#if __MigTypeCheck + if ( In1P->old_stateCnt > 224 ) + return MIG_BAD_ARGUMENTS; + if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 4 < In1P->old_stateCnt) || + (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 912) + (4 * In1P->old_stateCnt))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + + return MACH_MSG_SUCCESS; +} +#endif /* !defined(__MIG_check__Request__mach_exception_raise_state_t__defined) */ +#endif /* __MIG_check__Request__mach_exc_subsystem__ */ +#endif /* ( __MigTypeCheck ) */ + + +/* Routine mach_exception_raise_state */ +mig_internal novalue _Xmach_exception_raise_state + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) +{ + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + int64_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[224]; + mach_msg_trailer_t trailer; + } Request __attribute__((unused)); +#ifdef __MigPackStructs +#pragma pack() +#endif + typedef __Request__mach_exception_raise_state_t __Request; + typedef __Reply__mach_exception_raise_state_t Reply __attribute__((unused)); + + /* + * typedef struct { + * mach_msg_header_t Head; + * NDR_record_t NDR; + * kern_return_t RetCode; + * } mig_reply_error_t; + */ + + Request *In0P = (Request *) InHeadP; + Request *In1P; + Reply *OutP = (Reply *) OutHeadP; +#ifdef __MIG_check__Request__mach_exception_raise_state_t__defined + kern_return_t check_result; +#endif /* __MIG_check__Request__mach_exception_raise_state_t__defined */ + + __DeclareRcvRpc(2406, "mach_exception_raise_state") + __BeforeRcvRpc(2406, "mach_exception_raise_state") + +#if defined(__MIG_check__Request__mach_exception_raise_state_t__defined) + check_result = __MIG_check__Request__mach_exception_raise_state_t((__Request *)In0P, (__Request **)&In1P); + if (check_result != MACH_MSG_SUCCESS) + { MIG_RETURN_ERROR(OutP, check_result); } +#endif /* defined(__MIG_check__Request__mach_exception_raise_state_t__defined) */ + + OutP->new_stateCnt = 224; + + OutP->RetCode = catch_mach_exception_raise_state(In0P->Head.msgh_request_port, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt); + if (OutP->RetCode != KERN_SUCCESS) { + MIG_RETURN_ERROR(OutP, OutP->RetCode); + } + + OutP->NDR = NDR_record; + + + OutP->flavor = In1P->flavor; + OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 896) + (((4 * OutP->new_stateCnt))); + + __AfterRcvRpc(2406, "mach_exception_raise_state") +} + +#if ( __MigTypeCheck ) +#if __MIG_check__Request__mach_exc_subsystem__ +#if !defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) +#define __MIG_check__Request__mach_exception_raise_state_identity_t__defined + +mig_internal kern_return_t __MIG_check__Request__mach_exception_raise_state_identity_t(__attribute__((__unused__)) __Request__mach_exception_raise_state_identity_t *In0P, __attribute__((__unused__)) __Request__mach_exception_raise_state_identity_t **In1PP) +{ + + typedef __Request__mach_exception_raise_state_identity_t __Request; + __Request *In1P; +#if __MigTypeCheck + unsigned int msgh_size; +#endif /* __MigTypeCheck */ + unsigned int msgh_size_delta; + +#if __MigTypeCheck + msgh_size = In0P->Head.msgh_size; + if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || + (In0P->msgh_body.msgh_descriptor_count != 2) || + (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912)) || (msgh_size > (mach_msg_size_t)sizeof(__Request))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR || + In0P->thread.disposition != 17) + return MIG_TYPE_ERROR; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR || + In0P->task.disposition != 17) + return MIG_TYPE_ERROR; +#endif /* __MigTypeCheck */ + +#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined */ + msgh_size_delta = (8 * In0P->codeCnt); +#if __MigTypeCheck + if ( In0P->codeCnt > 2 ) + return MIG_BAD_ARGUMENTS; + if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 8 < In0P->codeCnt) || + (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912) + (8 * In0P->codeCnt))) + return MIG_BAD_ARGUMENTS; + msgh_size -= msgh_size_delta; +#endif /* __MigTypeCheck */ + + *In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 16); + +#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined */ +#if __MigTypeCheck + if ( In1P->old_stateCnt > 224 ) + return MIG_BAD_ARGUMENTS; + if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 4 < In1P->old_stateCnt) || + (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 912) + (4 * In1P->old_stateCnt))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + + return MACH_MSG_SUCCESS; +} +#endif /* !defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) */ +#endif /* __MIG_check__Request__mach_exc_subsystem__ */ +#endif /* ( __MigTypeCheck ) */ + + +/* Routine mach_exception_raise_state_identity */ +mig_internal novalue _Xmach_exception_raise_state_identity + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) +{ + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + int64_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[224]; + mach_msg_trailer_t trailer; + } Request __attribute__((unused)); +#ifdef __MigPackStructs +#pragma pack() +#endif + typedef __Request__mach_exception_raise_state_identity_t __Request; + typedef __Reply__mach_exception_raise_state_identity_t Reply __attribute__((unused)); + + /* + * typedef struct { + * mach_msg_header_t Head; + * NDR_record_t NDR; + * kern_return_t RetCode; + * } mig_reply_error_t; + */ + + Request *In0P = (Request *) InHeadP; + Request *In1P; + Reply *OutP = (Reply *) OutHeadP; +#ifdef __MIG_check__Request__mach_exception_raise_state_identity_t__defined + kern_return_t check_result; +#endif /* __MIG_check__Request__mach_exception_raise_state_identity_t__defined */ + + __DeclareRcvRpc(2407, "mach_exception_raise_state_identity") + __BeforeRcvRpc(2407, "mach_exception_raise_state_identity") + +#if defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) + check_result = __MIG_check__Request__mach_exception_raise_state_identity_t((__Request *)In0P, (__Request **)&In1P); + if (check_result != MACH_MSG_SUCCESS) + { MIG_RETURN_ERROR(OutP, check_result); } +#endif /* defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) */ + + OutP->new_stateCnt = 224; + + OutP->RetCode = catch_mach_exception_raise_state_identity(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt); + if (OutP->RetCode != KERN_SUCCESS) { + MIG_RETURN_ERROR(OutP, OutP->RetCode); + } + + OutP->NDR = NDR_record; + + + OutP->flavor = In1P->flavor; + OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 896) + (((4 * OutP->new_stateCnt))); + + __AfterRcvRpc(2407, "mach_exception_raise_state_identity") +} + + + +/* Description of this subsystem, for use in direct RPC */ +const struct catch_mach_exc_subsystem catch_mach_exc_subsystem = { + mach_exc_server_routine, + 2405, + 2408, + (mach_msg_size_t)sizeof(union __ReplyUnion__catch_mach_exc_subsystem), + (vm_address_t)0, + { + { (mig_impl_routine_t) 0, + (mig_stub_routine_t) _Xmach_exception_raise, 6, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_t)}, + { (mig_impl_routine_t) 0, + (mig_stub_routine_t) _Xmach_exception_raise_state, 9, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_state_t)}, + { (mig_impl_routine_t) 0, + (mig_stub_routine_t) _Xmach_exception_raise_state_identity, 11, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_state_identity_t)}, + } +}; + +mig_external boolean_t mach_exc_server + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) +{ + /* + * typedef struct { + * mach_msg_header_t Head; + * NDR_record_t NDR; + * kern_return_t RetCode; + * } mig_reply_error_t; + */ + + register mig_routine_t routine; + + OutHeadP->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InHeadP->msgh_bits), 0); + OutHeadP->msgh_remote_port = InHeadP->msgh_reply_port; + /* Minimal size: routine() will update it if different */ + OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t); + OutHeadP->msgh_local_port = MACH_PORT_NULL; + OutHeadP->msgh_id = InHeadP->msgh_id + 100; + OutHeadP->msgh_reserved = 0; + + if ((InHeadP->msgh_id > 2407) || (InHeadP->msgh_id < 2405) || + ((routine = catch_mach_exc_subsystem.routine[InHeadP->msgh_id - 2405].stub_routine) == 0)) { + ((mig_reply_error_t *)OutHeadP)->NDR = NDR_record; + ((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID; + return FALSE; + } + (*routine) (InHeadP, OutHeadP); + return TRUE; +} + +mig_external mig_routine_t mach_exc_server_routine + (mach_msg_header_t *InHeadP) +{ + register int msgh_id; + + msgh_id = InHeadP->msgh_id - 2405; + + if ((msgh_id > 2) || (msgh_id < 0)) + return 0; + + return catch_mach_exc_subsystem.routine[msgh_id].stub_routine; +} + +#endif diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h new file mode 100644 index 0000000..52e53ae --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h @@ -0,0 +1,321 @@ +#ifndef _mach_exc_server_ +#define _mach_exc_server_ + +/* Module mach_exc */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* BEGIN VOUCHER CODE */ + +#ifndef KERNEL +#if defined(__has_include) +#if __has_include() +#ifndef USING_VOUCHERS +#define USING_VOUCHERS +#endif +#ifndef __VOUCHER_FORWARD_TYPE_DECLS__ +#define __VOUCHER_FORWARD_TYPE_DECLS__ +#ifdef __cplusplus +extern "C" { +#endif + extern boolean_t voucher_mach_msg_set(mach_msg_header_t *msg) __attribute__((weak_import)); +#ifdef __cplusplus +} +#endif +#endif // __VOUCHER_FORWARD_TYPE_DECLS__ +#endif // __has_include() +#endif // __has_include +#endif // !KERNEL + +/* END VOUCHER CODE */ + + +/* BEGIN MIG_STRNCPY_ZEROFILL CODE */ + +#if defined(__has_include) +#if __has_include() +#ifndef USING_MIG_STRNCPY_ZEROFILL +#define USING_MIG_STRNCPY_ZEROFILL +#endif +#ifndef __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ +#define __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ +#ifdef __cplusplus +extern "C" { +#endif + extern int mig_strncpy_zerofill(char *dest, const char *src, int len) __attribute__((weak_import)); +#ifdef __cplusplus +} +#endif +#endif /* __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ */ +#endif /* __has_include() */ +#endif /* __has_include */ + +/* END MIG_STRNCPY_ZEROFILL CODE */ + + +#ifdef AUTOTEST +#ifndef FUNCTION_PTR_T +#define FUNCTION_PTR_T +typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t); +typedef struct { + char *name; + function_ptr_t function; +} function_table_entry; +typedef function_table_entry *function_table_t; +#endif /* FUNCTION_PTR_T */ +#endif /* AUTOTEST */ + +#ifndef mach_exc_MSG_COUNT +#define mach_exc_MSG_COUNT 3 +#endif /* mach_exc_MSG_COUNT */ + +#include +#include +#include +#include + +#ifdef __BeforeMigServerHeader +__BeforeMigServerHeader +#endif /* __BeforeMigServerHeader */ + + +/* Routine mach_exception_raise */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t catch_mach_exception_raise +( + mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + mach_exception_data_t code, + mach_msg_type_number_t codeCnt +); + +/* Routine mach_exception_raise_state */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t catch_mach_exception_raise_state +( + mach_port_t exception_port, + exception_type_t exception, + const mach_exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + const thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt +); + +/* Routine mach_exception_raise_state_identity */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t catch_mach_exception_raise_state_identity +( + mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + mach_exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt +); + +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +boolean_t mach_exc_server( + mach_msg_header_t *InHeadP, + mach_msg_header_t *OutHeadP); + +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +mig_routine_t mach_exc_server_routine( + mach_msg_header_t *InHeadP); + + +/* Description of this subsystem, for use in direct RPC */ +extern const struct catch_mach_exc_subsystem { + mig_server_routine_t server; /* Server routine */ + mach_msg_id_t start; /* Min routine number */ + mach_msg_id_t end; /* Max routine number + 1 */ + unsigned int maxsize; /* Max msg size */ + vm_address_t reserved; /* Reserved */ + struct routine_descriptor /*Array of routine descriptors */ + routine[3]; +} catch_mach_exc_subsystem; + +/* typedefs for all requests */ + +#ifndef __Request__mach_exc_subsystem__defined +#define __Request__mach_exc_subsystem__defined + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + int64_t code[2]; + } __Request__mach_exception_raise_t __attribute__((unused)); +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + int64_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[224]; + } __Request__mach_exception_raise_state_t __attribute__((unused)); +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + int64_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[224]; + } __Request__mach_exception_raise_state_identity_t __attribute__((unused)); +#ifdef __MigPackStructs +#pragma pack() +#endif +#endif /* !__Request__mach_exc_subsystem__defined */ + + +/* union of all requests */ + +#ifndef __RequestUnion__catch_mach_exc_subsystem__defined +#define __RequestUnion__catch_mach_exc_subsystem__defined +union __RequestUnion__catch_mach_exc_subsystem { + __Request__mach_exception_raise_t Request_mach_exception_raise; + __Request__mach_exception_raise_state_t Request_mach_exception_raise_state; + __Request__mach_exception_raise_state_identity_t Request_mach_exception_raise_state_identity; +}; +#endif /* __RequestUnion__catch_mach_exc_subsystem__defined */ +/* typedefs for all replies */ + +#ifndef __Reply__mach_exc_subsystem__defined +#define __Reply__mach_exc_subsystem__defined + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + } __Reply__mach_exception_raise_t __attribute__((unused)); +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[224]; + } __Reply__mach_exception_raise_state_t __attribute__((unused)); +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[224]; + } __Reply__mach_exception_raise_state_identity_t __attribute__((unused)); +#ifdef __MigPackStructs +#pragma pack() +#endif +#endif /* !__Reply__mach_exc_subsystem__defined */ + + +/* union of all replies */ + +#ifndef __ReplyUnion__catch_mach_exc_subsystem__defined +#define __ReplyUnion__catch_mach_exc_subsystem__defined +union __ReplyUnion__catch_mach_exc_subsystem { + __Reply__mach_exception_raise_t Reply_mach_exception_raise; + __Reply__mach_exception_raise_state_t Reply_mach_exception_raise_state; + __Reply__mach_exception_raise_state_identity_t Reply_mach_exception_raise_state_identity; +}; +#endif /* __RequestUnion__catch_mach_exc_subsystem__defined */ + +#ifndef subsystem_to_name_map_mach_exc +#define subsystem_to_name_map_mach_exc \ + { "mach_exception_raise", 2405 },\ + { "mach_exception_raise_state", 2406 },\ + { "mach_exception_raise_state_identity", 2407 } +#endif + +#ifdef __AfterMigServerHeader +__AfterMigServerHeader +#endif /* __AfterMigServerHeader */ + +#endif /* _mach_exc_server_ */ diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift new file mode 100644 index 0000000..91e5d4d --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift @@ -0,0 +1,89 @@ +// +// CwlBadInstructionException.swift +// CwlPreconditionTesting +// +// Created by Matt Gallagher on 2016/01/10. +// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +import Foundation + +#if SWIFT_PACKAGE + import CwlMachBadInstructionHandler +#endif + +private func raiseBadInstructionException() { + BadInstructionException().raise() +} + +/// A simple NSException subclass. It's not required to subclass NSException (since the exception type is represented in the name) but this helps for identifying the exception through runtime type. +@objc(BadInstructionException) +public class BadInstructionException: NSException { + static var name: String = "com.cocoawithlove.BadInstruction" + + init() { + super.init(name: NSExceptionName(rawValue: BadInstructionException.name), reason: nil, userInfo: nil) + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + /// An Objective-C callable function, invoked from the `mach_exc_server` callback function `catch_mach_exception_raise_state` to push the `raiseBadInstructionException` function onto the stack. + @objc(receiveReply:) + public class func receiveReply(_ value: NSValue) -> NSNumber { + #if arch(x86_64) + var reply = bad_instruction_exception_reply_t(exception_port: 0, exception: 0, code: nil, codeCnt: 0, flavor: nil, old_state: nil, old_stateCnt: 0, new_state: nil, new_stateCnt: nil) + withUnsafeMutablePointer(to: &reply) { value.getValue(UnsafeMutableRawPointer($0)) } + + let old_state: UnsafePointer = reply.old_state! + let old_stateCnt: mach_msg_type_number_t = reply.old_stateCnt + let new_state: thread_state_t = reply.new_state! + let new_stateCnt: UnsafeMutablePointer = reply.new_stateCnt! + + // Make sure we've been given enough memory + if old_stateCnt != x86_THREAD_STATE64_COUNT || new_stateCnt.pointee < x86_THREAD_STATE64_COUNT { + return NSNumber(value: KERN_INVALID_ARGUMENT) + } + + // Read the old thread state + var state = old_state.withMemoryRebound(to: x86_thread_state64_t.self, capacity: 1) { return $0.pointee } + + // 1. Decrement the stack pointer + state.__rsp -= __uint64_t(MemoryLayout.size) + + // 2. Save the old Instruction Pointer to the stack. + if let pointer = UnsafeMutablePointer<__uint64_t>(bitPattern: UInt(state.__rsp)) { + pointer.pointee = state.__rip + } else { + return NSNumber(value: KERN_INVALID_ARGUMENT) + } + + // 3. Set the Instruction Pointer to the new function's address + var f: @convention(c) () -> Void = raiseBadInstructionException + withUnsafePointer(to: &f) { + state.__rip = $0.withMemoryRebound(to: __uint64_t.self, capacity: 1) { return $0.pointee } + } + + // Write the new thread state + new_state.withMemoryRebound(to: x86_thread_state64_t.self, capacity: 1) { $0.pointee = state } + new_stateCnt.pointee = x86_THREAD_STATE64_COUNT + + return NSNumber(value: KERN_SUCCESS) + #else + fatalError("Unavailable for this CPU architecture") + #endif + } +} diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift new file mode 100644 index 0000000..6e84115 --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift @@ -0,0 +1,199 @@ +// +// CwlCatchBadInstruction.swift +// CwlPreconditionTesting +// +// Created by Matt Gallagher on 2016/01/10. +// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +import Foundation + +#if SWIFT_PACKAGE + import CwlCatchException + import CwlMachBadInstructionHandler +#endif + +#if arch(x86_64) + + private enum PthreadError: Error { case code(Int32) } + private enum MachExcServer: Error { case code(kern_return_t) } + + /// A quick function for converting Mach error results into Swift errors + private func kernCheck(_ f: () -> Int32) throws { + let r = f() + guard r == KERN_SUCCESS else { + throw NSError(domain: NSMachErrorDomain, code: Int(r), userInfo: nil) + } + } + + 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 + return p.withMemoryRebound(to: mach_msg_header_t.self, capacity: 1) { ptr -> R in + return block(ptr) + } + } + } + } + + extension reply_mach_exception_raise_state_t { + mutating func withMsgHeaderPointer(in block: (UnsafeMutablePointer) -> R) -> R { + return withUnsafeMutablePointer(to: &self) { p -> R in + return p.withMemoryRebound(to: mach_msg_header_t.self, capacity: 1) { ptr -> R in + return block(ptr) + } + } + } + } + + /// A structure used to store context associated with the Mach message port + private struct MachContext { + var masks = execTypesCountTuple() + var count: mach_msg_type_number_t = 0 + var ports = execTypesCountTuple() + var behaviors = execTypesCountTuple() + var flavors = execTypesCountTuple() + 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) + } + } + } + } + } + } + + /// A function for receiving mach messages and parsing the first with mach_exc_server (and if any others are received, throwing them away). + private func machMessageHandler(_ arg: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer? { + let context = arg.assumingMemoryBound(to: MachContext.self).pointee + var request = request_mach_exception_raise_t() + var reply = reply_mach_exception_raise_state_t() + + var handledfirstException = false + repeat { do { + // Request the next mach message from the port + request.Head.msgh_local_port = context.currentExceptionPort + request.Head.msgh_size = UInt32(MemoryLayout.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)) + } } + + // Prepare the reply structure + reply.Head.msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(request.Head.msgh_bits), 0) + reply.Head.msgh_local_port = UInt32(MACH_PORT_NULL) + reply.Head.msgh_remote_port = request.Head.msgh_remote_port + reply.Head.msgh_size = UInt32(MemoryLayout.size) + reply.NDR = NDR_record + + if !handledfirstException { + // Use the MiG generated server to invoke our handler for the request and fill in the rest of the reply structure + guard request.withMsgHeaderPointer(in: { requestPtr in reply.withMsgHeaderPointer { replyPtr in + mach_exc_server(requestPtr, replyPtr) + } }) != 0 else { throw MachExcServer.code(reply.RetCode) } + + handledfirstException = true + } else { + // If multiple fatal errors occur, don't handle subsequent errors (let the program crash) + reply.RetCode = KERN_FAILURE + } + + // Send the reply + 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)) + } } + } 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. + // This means the controlling thread shut down. + return nil + } catch { + // Should never be reached but this is testing code, don't try to recover, just abort + fatalError("Mach message error: \(error)") + } } while true + } + + /// Run the provided block. If a mach "BAD_INSTRUCTION" exception is raised, catch it and return a BadInstructionException (which captures stack information about the throw site, if desired). Otherwise return nil. + /// NOTE: This function is only intended for use in test harnesses – use in a distributed build is almost certainly a bad choice. If a "BAD_INSTRUCTION" exception is raised, the block will be exited before completion via Objective-C exception. The risks associated with an Objective-C exception apply here: most Swift/Objective-C functions are *not* exception-safe. Memory may be leaked and the program will not necessarily be left in a safe state. + /// - parameter block: a function without parameters that will be run + /// - returns: if an EXC_BAD_INSTRUCTION is raised during the execution of `block` then a BadInstructionException will be returned, otherwise `nil`. + public func catchBadInstruction(in block: () -> Void) -> BadInstructionException? { + var context = MachContext() + var result: BadInstructionException? = nil + do { + var handlerThread: pthread_t? = nil + defer { + // 8. Wait for the thread to terminate *if* we actually made it to the creation point + // The mach port should be destroyed *before* calling pthread_join to avoid a deadlock. + if handlerThread != nil { + pthread_join(handlerThread!, nil) + } + } + + try kernCheck { + // 1. Create the mach port + mach_port_allocate(mach_task_self_, MACH_PORT_RIGHT_RECEIVE, &context.currentExceptionPort) + } + defer { + // 7. Cleanup the mach port + mach_port_destroy(mach_task_self_, context.currentExceptionPort) + } + + try kernCheck { + // 2. Configure the mach port + 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 + // 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) + } } + + defer { context.withUnsafeMutablePointers { masksPtr, 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) + } } + + try withUnsafeMutablePointer(to: &context) { c throws in + // 4. Create the thread + let e = pthread_create(&handlerThread, nil, machMessageHandler, c) + guard e == 0 else { throw PthreadError.code(e) } + + // 5. Run the block + result = BadInstructionException.catchException(in: block) + } + } catch { + // Should never be reached but this is testing code, don't try to recover, just abort + fatalError("Mach port error: \(error)") + } + return result + } + +#endif + diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift new file mode 100644 index 0000000..8d99d5e --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift @@ -0,0 +1,55 @@ +// +// CwlDarwinDefinitions.swift +// CwlPreconditionTesting +// +// Created by Matt Gallagher on 2016/01/10. +// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +import Darwin + +#if arch(x86_64) + + // From /usr/include/mach/message.h + // #define MACH_MSG_TYPE_MAKE_SEND 20 /* Must hold receive right */ + // #define MACH_MSGH_BITS_REMOTE(bits) \ + // ((bits) & MACH_MSGH_BITS_REMOTE_MASK) + // #define MACH_MSGH_BITS(remote, local) /* legacy */ \ + // ((remote) | ((local) << 8)) + public let MACH_MSG_TYPE_MAKE_SEND: UInt32 = 20 + public func MACH_MSGH_BITS_REMOTE(_ bits: UInt32) -> UInt32 { return bits & UInt32(MACH_MSGH_BITS_REMOTE_MASK) } + public func MACH_MSGH_BITS(_ remote: UInt32, _ local: UInt32) -> UInt32 { return ((remote) | ((local) << 8)) } + + // From /usr/include/mach/exception_types.h + // #define EXC_BAD_INSTRUCTION 2 /* Instruction failed */ + // #define EXC_MASK_BAD_INSTRUCTION (1 << EXC_BAD_INSTRUCTION) + public let EXC_BAD_INSTRUCTION: UInt32 = 2 + public let EXC_MASK_BAD_INSTRUCTION: UInt32 = 1 << EXC_BAD_INSTRUCTION + + // From /usr/include/mach/i386/thread_status.h + // #define x86_THREAD_STATE64_COUNT ((mach_msg_type_number_t) \ + // ( sizeof (x86_thread_state64_t) / sizeof (int) )) + public let x86_THREAD_STATE64_COUNT = UInt32(MemoryLayout.size / MemoryLayout.size) + + public let EXC_TYPES_COUNT = 14 + public struct execTypesCountTuple { + // From /usr/include/mach/i386/exception.h + // #define EXC_TYPES_COUNT 14 /* incl. illegal exception 0 */ + public var value: (T, T, T, T, T, T, T, T, T, T, T, T, T, T) = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + public init() { + } + } + +#endif diff --git a/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h new file mode 100644 index 0000000..f9dbedd --- /dev/null +++ b/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h @@ -0,0 +1,30 @@ +// +// CwlPreconditionTesting.h +// CwlPreconditionTesting +// +// Created by Matt Gallagher on 2016/01/10. +// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +#import + +//! Project version number for CwlUtils. +FOUNDATION_EXPORT double CwlPreconditionTestingVersionNumber; + +//! Project version string for CwlUtils. +FOUNDATION_EXPORT const unsigned char CwlAssertingTestingVersionString[]; + +#include "CwlMachBadInstructionHandler.h" +#include "CwlCatchException.h" diff --git a/Pods/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift b/Pods/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift index 2e30f61..94a9030 100644 --- a/Pods/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift +++ b/Pods/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift @@ -1,4 +1,3 @@ - /// AssertionDispatcher allows multiple AssertionHandlers to receive /// assertion messages. /// diff --git a/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift b/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift index 7d0bab2..740c392 100644 --- a/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift +++ b/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift @@ -22,7 +22,7 @@ public struct AssertionRecord: CustomStringConvertible { /// This is useful for testing failure messages for matchers. /// /// @see AssertionHandler -public class AssertionRecorder : AssertionHandler { +public class AssertionRecorder: AssertionHandler { /// All the assertions that were captured by this recorder public var assertions = [AssertionRecord]() @@ -43,7 +43,7 @@ public class AssertionRecorder : AssertionHandler { /// Once the closure finishes, then the original Nimble assertion handler is restored. /// /// @see AssertionHandler -public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler, closure: @escaping () throws -> Void) { +public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler, closure: () throws -> Void) { let environment = NimbleEnvironment.activeInstance let oldRecorder = environment.assertionHandler let capturer = NMBExceptionCapture(handler: nil, finally: ({ diff --git a/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift b/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift index 47d4eed..93f97d2 100644 --- a/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift +++ b/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift @@ -2,7 +2,15 @@ import Foundation #if _runtime(_ObjC) -internal struct ObjCMatcherWrapper : Matcher { +fileprivate 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 func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { @@ -21,7 +29,7 @@ internal struct ObjCMatcherWrapper : Matcher { } // Equivalent to Expectation, but for Nimble's Objective-C interface -public class NMBExpectation : NSObject { +public class NMBExpectation: NSObject { internal let _actualBlock: () -> NSObject! internal var _negative: Bool internal let _file: FileString @@ -36,7 +44,7 @@ public class NMBExpectation : NSObject { } private var expectValue: Expectation { - return expect(_file, line: _line){ + return expect(_file, line: _line) { self._actualBlock() as NSObject? } } @@ -49,29 +57,41 @@ public class NMBExpectation : NSObject { 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 { 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 { 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 { 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) + } }) } @@ -81,41 +101,73 @@ public class NMBExpectation : NSObject { 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 { 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 { 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 { 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 + ) + } }) } diff --git a/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift b/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift index c609f69..19a4567 100644 --- a/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift +++ b/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift @@ -5,7 +5,7 @@ import Foundation public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) -> Bool public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) -> Bool -public class NMBObjCMatcher : NSObject, NMBMatcher { +public class NMBObjCMatcher: NSObject, NMBMatcher { let _match: MatcherBlock let _doesNotMatch: MatcherBlock let canMatchNil: Bool diff --git a/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift b/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift index 5434aaf..e1b5432 100644 --- a/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift +++ b/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift @@ -1,7 +1,8 @@ +import Dispatch import Foundation /// "Global" state of Nimble is stored here. Only DSL functions should access / be aware of this -/// class' existance +/// class' existence internal class NimbleEnvironment { static var activeInstance: NimbleEnvironment { get { @@ -25,7 +26,7 @@ internal class NimbleEnvironment { set { NimbleAssertionHandler = newValue } } -#if _runtime(_ObjC) + var suppressTVOSAssertionWarning: Bool = false var awaiter: Awaiter init() { @@ -41,5 +42,4 @@ internal class NimbleEnvironment { asyncQueue: .main, timeoutQueue: timeoutQueue) } -#endif } diff --git a/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift b/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift index 1aba8bc..78e6dd9 100644 --- a/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift +++ b/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift @@ -3,7 +3,7 @@ import XCTest /// Default handler for Nimble. This assertion handler passes failures along to /// XCTest. -public class NimbleXCTestHandler : AssertionHandler { +public class NimbleXCTestHandler: AssertionHandler { public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { if !assertion { recordFailure("\(message.stringValue)\n", location: location) @@ -29,14 +29,14 @@ public class NimbleShortXCTestHandler: AssertionHandler { /// Fallback handler in case XCTest is unavailable. This assertion handler will abort /// the program if it is invoked. -class NimbleXCTestUnavailableHandler : AssertionHandler { +class NimbleXCTestUnavailableHandler: AssertionHandler { func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { fatalError("XCTest is not available and no custom assertion handler was configured. Aborting.") } } -#if _runtime(_ObjC) - /// Helper class providing access to the currently executing XCTestCase instance, if any +#if !SWIFT_PACKAGE +/// Helper class providing access to the currently executing XCTestCase instance, if any @objc final internal class CurrentTestCaseTracker: NSObject, XCTestObservation { @objc static let sharedInstance = CurrentTestCaseTracker() @@ -52,7 +52,6 @@ class NimbleXCTestUnavailableHandler : AssertionHandler { } #endif - func isXCTestAvailable() -> Bool { #if _runtime(_ObjC) // XCTest is weakly linked and so may not be present @@ -63,7 +62,9 @@ func isXCTestAvailable() -> Bool { } private func recordFailure(_ message: String, location: SourceLocation) { -#if _runtime(_ObjC) +#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) } else { @@ -71,7 +72,5 @@ private func recordFailure(_ message: String, location: SourceLocation) { "The failure was:\n\"\(message)\"\nIt occurred at: \(location.file):\(location.line)" NSException(name: .internalInconsistencyException, reason: msg, userInfo: nil).raise() } -#else - XCTFail("\(message)\n", file: location.file, line: location.line) #endif } diff --git a/Pods/Nimble/Sources/Nimble/DSL+Wait.swift b/Pods/Nimble/Sources/Nimble/DSL+Wait.swift index fa5a10f..fdf4508 100644 --- a/Pods/Nimble/Sources/Nimble/DSL+Wait.swift +++ b/Pods/Nimble/Sources/Nimble/DSL+Wait.swift @@ -1,6 +1,6 @@ +import Dispatch import Foundation -#if _runtime(_ObjC) private enum ErrorResult { case exception(NSException) case error(Error) @@ -15,7 +15,7 @@ internal class NMBWait: NSObject { timeout: TimeInterval, file: FileString = #file, line: UInt = #line, - action: @escaping (@escaping () -> Void) -> Void) -> Void { + action: @escaping (@escaping () -> Void) -> Void) { return throwableUntil(timeout: timeout, file: file, line: line) { done in action(done) } @@ -26,10 +26,10 @@ internal class NMBWait: NSObject { timeout: TimeInterval, file: FileString = #file, line: UInt = #line, - action: @escaping (@escaping () -> Void) throws -> Void) -> Void { + 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 + let result = awaiter.performBlock(file: file, line: line) { (done: @escaping (ErrorResult) -> Void) throws -> Void in DispatchQueue.main.async { let capture = NMBExceptionCapture( handler: ({ exception in @@ -39,7 +39,7 @@ internal class NMBWait: NSObject { ) capture.tryBlock { do { - try action() { + try action { done(.none) } } catch let e { @@ -70,10 +70,16 @@ internal class NMBWait: NSObject { } } + #if SWIFT_PACKAGE + internal class func until(_ file: FileString = #file, line: UInt = #line, action: @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) -> Void { + internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) { until(timeout: 1, file: file, line: line, action: action) } + #endif } internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterval) -> String { @@ -87,7 +93,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) -> Void { +public func waitUntil(timeout: TimeInterval = 1, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { NMBWait.until(timeout: timeout, file: file, line: line, action: action) } -#endif diff --git a/Pods/Nimble/Sources/Nimble/Expectation.swift b/Pods/Nimble/Sources/Nimble/Expectation.swift index 16d7c3b..5f8ebe1 100644 --- a/Pods/Nimble/Sources/Nimble/Expectation.swift +++ b/Pods/Nimble/Sources/Nimble/Expectation.swift @@ -1,8 +1,8 @@ import Foundation +// Deprecated internal func expressionMatches(_ expression: Expression, matcher: U, to: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T -{ + where U: Matcher, U.ValueType == T { let msg = FailureMessage() msg.userDescription = description msg.to = to @@ -13,14 +13,14 @@ internal func expressionMatches(_ expression: Expression, matcher: U, t } return (pass, msg) } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" + msg.stringValue = "unexpected error thrown: <\(error)>" return (false, msg) } } +// Deprecated internal func expressionDoesNotMatch(_ expression: Expression, matcher: U, toNot: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T -{ + where U: Matcher, U.ValueType == T { let msg = FailureMessage() msg.userDescription = description msg.to = toNot @@ -31,11 +31,46 @@ internal func expressionDoesNotMatch(_ expression: Expression, matcher: } return (pass, msg) } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" + msg.stringValue = "unexpected error thrown: <\(error)>" return (false, msg) } } +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) + } + } + + 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 @@ -45,31 +80,51 @@ public struct Expectation { 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 - { + where U: Matcher, U.ValueType == T { let (pass, msg) = expressionMatches(expression, matcher: matcher, to: "to", 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. public func toNot(_ matcher: U, description: String? = nil) - where U: Matcher, U.ValueType == T - { + where U: Matcher, U.ValueType == T { 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) - where U: Matcher, U.ValueType == T - { + where U: Matcher, U.ValueType == T { 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 // - NMBExpectation for Objective-C interface diff --git a/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift b/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift new file mode 100644 index 0000000..0d3d6af --- /dev/null +++ b/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift @@ -0,0 +1,261 @@ +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) + 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): + failureMessage.stringValue = msg + 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 _runtime(_ObjC) + +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/Pods/Nimble/Sources/Nimble/Expression.swift b/Pods/Nimble/Sources/Nimble/Expression.swift index 8ba53e4..f7afffe 100644 --- a/Pods/Nimble/Sources/Nimble/Expression.swift +++ b/Pods/Nimble/Sources/Nimble/Expression.swift @@ -5,7 +5,7 @@ import Foundation internal func memoizedClosure(_ closure: @escaping () throws -> T) -> (Bool) throws -> T { var cache: T? return ({ withoutCaching in - if (withoutCaching || cache == nil) { + if withoutCaching || cache == nil { cache = try closure() } return cache! diff --git a/Pods/Nimble/Sources/Nimble/FailureMessage.swift b/Pods/Nimble/Sources/Nimble/FailureMessage.swift index 2d245e5..2bc57eb 100644 --- a/Pods/Nimble/Sources/Nimble/FailureMessage.swift +++ b/Pods/Nimble/Sources/Nimble/FailureMessage.swift @@ -12,8 +12,8 @@ public class FailureMessage: NSObject { /// An optional message that will be appended as a new line and provides additional details /// about the failure. This message will only be visible in the issue navigator / in logs but /// not directly in the source editor since only a single line is presented there. - public var extendedMessage: String? = nil - public var userDescription: String? = nil + public var extendedMessage: String? + public var userDescription: String? public var stringValue: String { get { @@ -29,6 +29,9 @@ public class FailureMessage: NSObject { } internal var _stringValueOverride: String? + internal var hasOverriddenStringValue: Bool { + return _stringValueOverride != nil + } public override init() { } @@ -59,7 +62,31 @@ public class FailureMessage: NSObject { if let userDescription = userDescription { return "\(userDescription)\n\(value)" } - + 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/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift b/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift index 3a9258d..0250add 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift @@ -1,71 +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) +public func allPass + (_ 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()) - } +public func allPass + (_ 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) } -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() { +public func allPass(_ elementPredicate: Predicate) -> Predicate + where S: Sequence { + return createPredicate(elementPredicate) +} + +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) extension NMBObjCMatcher { - public class func allPassMatcher(_ matcher: NMBObjCMatcher) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + public class func allPassMatcher(_ matcher: NMBMatcher) -> NMBPredicate { + return NMBPredicate { actualExpression in let location = actualExpression.location 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) @@ -77,23 +85,35 @@ extension NMBObjCMatcher { } else { collectionIsUsable = false } - + 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( + 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/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift b/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift index c028f5a..d2196f8 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift @@ -1,15 +1,44 @@ import Foundation -#if _runtime(_ObjC) - +/// 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 } +fileprivate 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: return PredicateResult(status: .fail, message: lastPredicateResult!.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: + return PredicateResult(status: .fail, message: lastPredicateResult!.message.appended(message: " (timed out, but main thread was unresponsive).")) + case .incomplete: + internalError("Reached .incomplete state for toEventually(...).") + } + } +} + +// Deprecated internal struct AsyncMatcherWrapper: Matcher - where U: Matcher, U.ValueType == T -{ + where U: Matcher, U.ValueType == T { let fullMatcher: U let timeoutInterval: TimeInterval let pollInterval: TimeInterval @@ -31,14 +60,14 @@ internal struct AsyncMatcherWrapper: Matcher fnName: fnName) { try self.fullMatcher.matches(uncachedExpression, failureMessage: failureMessage) } - switch (result) { + switch result { case let .completed(isSuccessful): return isSuccessful case .timedOut: return false case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" + failureMessage.stringValue = "an unexpected error thrown: <\(error)>" return false case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" + failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" return false case .blockedRunLoop: failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." @@ -48,7 +77,7 @@ internal struct AsyncMatcherWrapper: Matcher } } - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { + func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { let uncachedExpression = actualExpression.withoutCaching() let result = pollBlock( pollInterval: pollInterval, @@ -58,14 +87,14 @@ internal struct AsyncMatcherWrapper: Matcher fnName: "expect(...).toEventuallyNot(...)") { try self.fullMatcher.doesNotMatch(uncachedExpression, failureMessage: failureMessage) } - switch (result) { + switch result { case let .completed(isSuccessful): return isSuccessful case .timedOut: return false case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" + failureMessage.stringValue = "an unexpected error thrown: <\(error)>" return false case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" + failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" return false case .blockedRunLoop: failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." @@ -78,7 +107,61 @@ internal struct AsyncMatcherWrapper: Matcher 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(_ 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. @@ -87,8 +170,7 @@ extension Expectation { /// 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 - { + where U: Matcher, U.ValueType == T { if expression.isClosure { let (pass, msg) = expressionMatches( expression, @@ -112,8 +194,7 @@ extension Expectation { /// 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 - { + where U: Matcher, U.ValueType == T { if expression.isClosure { let (pass, msg) = expressionDoesNotMatch( expression, @@ -139,10 +220,7 @@ extension Expectation { /// 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 - { + where U: Matcher, U.ValueType == T { return toEventuallyNot(matcher, timeout: timeout, pollInterval: pollInterval, description: description) } } - -#endif diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift index 99b8f8f..4ae4d11 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift @@ -1,29 +1,59 @@ import Foundation -#if _runtime(_ObjC) +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) -> Predicate { + return Predicate.define { actualExpression in + let message: ExpectationMessage + + let instance = try actualExpression.evaluate() + guard let validInstance = instance else { + 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>" + ) -// A Nimble matcher that catches attempts to use beAKindOf with non Objective-C types -public func beAKindOf(_ expectedClass: Any) -> NonNilMatcherFunc { - return NonNilMatcherFunc {actualExpression, failureMessage in - failureMessage.stringValue = "beAKindOf only works on Objective-C types since" - + " the Swift compiler will automatically type check Swift-only types." - + " This expectation is redundant." - return false + return PredicateResult( + bool: validInstance is T, + message: message + ) } } +#if _runtime(_ObjC) + /// 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) } } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift index 2298c78..24fd5fa 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift @@ -1,31 +1,47 @@ import Foundation -// A Nimble matcher that catches attempts to use beAnInstanceOf with non Objective-C types -public func beAnInstanceOf(_ expectedClass: Any) -> NonNilMatcherFunc { - return NonNilMatcherFunc {actualExpression, failureMessage in - failureMessage.stringValue = "beAnInstanceOf only works on Objective-C types since" - + " the Swift compiler will automatically type check Swift-only types." - + " This expectation is redundant." - return false +/// A Nimble matcher that succeeds when the actual value is an _exact_ instance of the given class. +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 { + return PredicateResult( + status: .doesNotMatch, + message: .expectedActualValueTo(errorMessage) + ) + } + + let actualString = "<\(String(describing: type(of: validInstance))) instance>" + + 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 _runtime(_ObjC) + 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) + ) } } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift index 48e9895..2b0ccd6 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift @@ -2,19 +2,25 @@ 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 +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,14 +28,14 @@ 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) -public class NMBObjCBeCloseToMatcher : NSObject, NMBMatcher { +public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { var _expected: NSNumber var _delta: CDouble init(expected: NSNumber, within: CDouble) { @@ -69,24 +75,22 @@ extension NMBObjCMatcher { } #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 } } @@ -106,7 +110,7 @@ public func ≈(lhs: Expectation, rhs: (expected: NMBDoubl lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) } -public func ==(lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { +public func == (lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift index 19df0d2..4a4dd82 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift @@ -1,37 +1,33 @@ 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) } } @@ -40,52 +36,56 @@ 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) extension NMBObjCMatcher { - public class func beEmptyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + public class func beEmptyMatcher() -> NMBPredicate { + return NMBPredicate { actualExpression in let location = actualExpression.location let actualValue = try! actualExpression.evaluate() - failureMessage.postfixMessage = "be empty" + 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" + 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/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift index 1345199..98c6f2e 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift @@ -1,32 +1,31 @@ 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 +public func beGreaterThan(_ expectedValue: NMBComparable?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be greater than <\(stringify(expectedValue))>" let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedDescending return matches - } + }.requireNonNil } public func >(lhs: Expectation, rhs: T) { lhs.to(beGreaterThan(rhs)) } -public func >(lhs: Expectation, rhs: NMBComparable?) { +public func > (lhs: Expectation, rhs: NMBComparable?) { lhs.to(beGreaterThan(rhs)) } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift index 2949fce..8f370d4 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift @@ -2,26 +2,26 @@ 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 +public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" let actualValue = try actualExpression.evaluate() if let actual = actualValue, let expected = expectedValue { return actual >= expected } return false - } + }.requireNonNil } /// 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 +public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedAscending return matches - } + }.requireNonNil } public func >=(lhs: Expectation, rhs: T) { diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift index ca3357b..250bed7 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift @@ -1,10 +1,9 @@ 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.fromDeprecatedClosure { actualExpression, failureMessage in #if os(Linux) let actual = try actualExpression.evaluate() as? AnyObject #else @@ -17,13 +16,13 @@ public func beIdenticalTo(_ expected: Any?) -> NonNilMatcherFunc { #else return actual === (expected as AnyObject?) && actual !== nil #endif - } + }.requireNonNil } -public func ===(lhs: Expectation, rhs: Any?) { +public func === (lhs: Expectation, rhs: Any?) { lhs.to(beIdenticalTo(rhs)) } -public func !==(lhs: Expectation, rhs: Any?) { +public func !== (lhs: Expectation, rhs: Any?) { lhs.toNot(beIdenticalTo(rhs)) } @@ -31,7 +30,7 @@ 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) } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift index 4cd1a05..66c01d3 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift @@ -1,31 +1,31 @@ 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 +public func beLessThan(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" if let actual = try actualExpression.evaluate(), let expected = expectedValue { return actual < expected } return false - } + }.requireNonNil } /// 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 +public func beLessThan(_ expectedValue: NMBComparable?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedAscending return matches - } + }.requireNonNil } public func <(lhs: Expectation, rhs: T) { lhs.to(beLessThan(rhs)) } -public func <(lhs: Expectation, rhs: NMBComparable?) { +public func < (lhs: Expectation, rhs: NMBComparable?) { lhs.to(beLessThan(rhs)) } @@ -33,7 +33,7 @@ public func <(lhs: Expectation, rhs: NMBComparable?) { extension NMBObjCMatcher { public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as! NMBComparable? } + let expr = actualExpression.cast { $0 as? NMBComparable } return try! beLessThan(expected).matches(expr, failureMessage: failureMessage) } } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift index a0cd2f0..28b36c1 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift @@ -2,24 +2,24 @@ 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 +public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" if let actual = try actualExpression.evaluate(), let expected = expectedValue { return actual <= expected } return false - } + }.requireNonNil } /// 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 +public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" let actualValue = try actualExpression.evaluate() return actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedDescending - } + }.requireNonNil } public func <=(lhs: Expectation, rhs: T) { diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift index ee62928..4086da9 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift +++ b/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,12 +125,12 @@ 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) } } @@ -144,28 +138,28 @@ public func beFalsy() -> MatcherFunc extension NMBObjCMatcher { public class func beTruthyMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false as Bool? } + let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try! beTruthy().matches(expr, failureMessage: failureMessage) } } public class func beFalsyMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false as Bool? } + let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try! beFalsy().matches(expr, failureMessage: failureMessage) } } public class func beTrueMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false as Bool? } + let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try! beTrue().matches(expr, failureMessage: failureMessage) } } public class func beFalseMatcher() -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false as Bool? } + let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try! beFalse().matches(expr, failureMessage: failureMessage) } } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift index a6fb31f..de79938 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift @@ -1,11 +1,10 @@ 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) } } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift index 8f86265..f5bf22a 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift @@ -1,18 +1,18 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is Void. -public func beVoid() -> MatcherFunc<()> { - return MatcherFunc { actualExpression, failureMessage in +public func beVoid() -> Predicate<()> { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be void" let actualValue: ()? = try actualExpression.evaluate() return actualValue != nil } } -public func ==(lhs: Expectation<()>, rhs: ()) { +public func == (lhs: Expectation<()>, rhs: ()) { lhs.to(beVoid()) } -public func !=(lhs: Expectation<()>, rhs: ()) { +public func != (lhs: Expectation<()>, rhs: ()) { lhs.toNot(beVoid()) -} \ No newline at end of file +} diff --git a/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift b/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift index ef6c603..e6cc9d8 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift @@ -1,49 +1,44 @@ 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 - where S.Iterator.Element == T -{ - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "begin with <\(startingElement)>" +public func beginWith(_ startingElement: T) -> Predicate + where S.Iterator.Element == T { + 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: range != nil && range!.lowerBound == actual.startIndex) } - return false + return .fail } } @@ -52,7 +47,7 @@ extension NMBObjCMatcher { public class func beginWithMatcher(_ expected: Any) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let actual = try! actualExpression.evaluate() - if let _ = actual as? String { + if (actual as? String) != nil { let expr = actualExpression.cast { $0 as? String } return try! beginWith(expected as! String).matches(expr, failureMessage: failureMessage) } else { diff --git a/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift b/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift index 4400d30..d2f8cd2 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift @@ -1,16 +1,14 @@ import Foundation /// A Nimble matcher that succeeds when the actual sequence contains the expected value. -public func contain(_ items: T...) -> NonNilMatcherFunc - where S.Iterator.Element == T -{ +public func contain(_ items: T...) -> Predicate + where S.Iterator.Element == T { return contain(items) } -public func contain(_ items: [T]) -> NonNilMatcherFunc - where S.Iterator.Element == T -{ - return NonNilMatcherFunc { actualExpression, failureMessage in +public func contain(_ items: [T]) -> Predicate + where S.Iterator.Element == T { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" if let actual = try actualExpression.evaluate() { return items.all { @@ -18,16 +16,16 @@ public func contain(_ items: [T]) -> NonNilMatcherFun } } return false - } + }.requireNonNil } /// 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 +public func contain(_ substrings: [String]) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" if let actual = try actualExpression.evaluate() { return substrings.all { @@ -36,37 +34,37 @@ public func contain(_ substrings: [String]) -> NonNilMatcherFunc { } } return false - } + }.requireNonNil } /// 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 +public func contain(_ substrings: [NSString]) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" if let actual = try actualExpression.evaluate() { return substrings.all { actual.range(of: $0.description).length != 0 } } return false - } + }.requireNonNil } /// 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 +public func contain(_ items: [Any?]) -> Predicate { + return Predicate.fromDeprecatedClosure { 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!) } - } + }.requireNonNil } #if _runtime(_ObjC) diff --git a/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift b/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift new file mode 100644 index 0000000..e71c97e --- /dev/null +++ b/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift @@ -0,0 +1,59 @@ +import Foundation + +public func containElementSatisfying(_ predicate: @escaping ((T) -> Bool), _ predicateDescription: String = "") -> Predicate where S.Iterator.Element == T { + + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + failureMessage.actualValue = nil + + if predicateDescription == "" { + failureMessage.postfixMessage = "find object in collection that satisfies predicate" + } else { + failureMessage.postfixMessage = "find object in collection \(predicateDescription)" + } + + if let sequence = try actualExpression.evaluate() { + for object in sequence { + if predicate(object) { + return true + } + } + + return false + } + + return false + }.requireNonNil +} + +#if _runtime(_ObjC) + extension NMBObjCMatcher { + public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBObjCMatcher { + return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + let value = try! actualExpression.evaluate() + guard let enumeration = value as? NSFastEnumeration else { + failureMessage.postfixMessage = "containElementSatisfying must be provided an NSFastEnumeration object" + failureMessage.actualValue = nil + failureMessage.expected = "" + failureMessage.to = "" + return false + } + + var iterator = NSFastEnumerationIterator(enumeration) + while let item = iterator.next() { + guard let object = item as? NSObject else { + continue + } + + if predicate(object) { + return true + } + } + + failureMessage.actualValue = nil + failureMessage.postfixMessage = "" + failureMessage.to = "to find object in collection that satisfies predicate" + return false + } + } + } +#endif diff --git a/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift b/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift index b96e96c..ebb87e0 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift @@ -1,12 +1,10 @@ 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 - where S.Iterator.Element == T -{ - return NonNilMatcherFunc { actualExpression, failureMessage in +public func endWith(_ endingElement: T) -> Predicate + where S.Iterator.Element == T { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "end with <\(endingElement)>" if let actualValue = try actualExpression.evaluate() { @@ -17,17 +15,17 @@ public func endWith(_ endingElement: T) -> NonNilMatc lastItem = item item = actualGenerator.next() } while(item != nil) - + return lastItem == endingElement } return false - } + }.requireNonNil } /// 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 +public func endWith(_ endingElement: Any) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "end with <\(endingElement)>" guard let collection = try actualExpression.evaluate() else { return false } guard collection.count > 0 else { return false } @@ -40,21 +38,20 @@ public func endWith(_ endingElement: Any) -> NonNilMatcherFunc NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func endWith(_ endingSubstring: String) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "end with <\(endingSubstring)>" if let collection = try actualExpression.evaluate() { return collection.hasSuffix(endingSubstring) } return false - } + }.requireNonNil } #if _runtime(_ObjC) @@ -62,7 +59,7 @@ extension NMBObjCMatcher { public class func endWithMatcher(_ expected: Any) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let actual = try! actualExpression.evaluate() - if let _ = actual as? String { + if (actual as? String) != nil { let expr = actualExpression.cast { $0 as? String } return try! endWith(expected as! String).matches(expr, failureMessage: failureMessage) } else { diff --git a/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift b/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift index 53579e0..d9f68fa 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift @@ -4,18 +4,20 @@ 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)" + if expectedValue == nil && actualValue != nil { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) } - return false + return PredicateResult(status: .fail, message: msg) } - return matches + return PredicateResult(status: PredicateStatus(bool: matches), message: msg) } } @@ -23,74 +25,95 @@ 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)" + if expectedValue == nil && actualValue != nil { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) } - return false + return PredicateResult(status: .fail, message: msg) } - return expectedValue! == actualValue! + return PredicateResult( + status: PredicateStatus(bool: expectedValue! == actualValue!), + message: msg + ) } } /// 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)" + if expectedValue == nil && actualValue != nil { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) } - return false + return PredicateResult( + status: .fail, + message: msg + ) } - return expectedValue! == actualValue! + return PredicateResult( + bool: expectedValue! == actualValue!, + message: msg + ) } } /// 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))>" +public func equal(_ expectedValue: [T?]) -> Predicate<[T?]> { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in if let actualValue = try actualExpression.evaluate() { + let doesNotMatch = PredicateResult( + status: .doesNotMatch, + message: msg + ) + if expectedValue.count != actualValue.count { - return false + return doesNotMatch } - + for (index, item) in actualValue.enumerated() { let otherItem = expectedValue[index] if item == nil && otherItem == nil { continue } else if item == nil && otherItem != nil { - return false + return doesNotMatch } else if item != nil && otherItem == nil { - return false + return doesNotMatch } else if item! != otherItem! { - return false + return doesNotMatch } } - - return true + + return PredicateResult( + status: .matches, + message: msg + ) } else { - failureMessage.postfixActual = " (use beNil() to match nils)" + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) } - - return false } } /// 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 +123,49 @@ 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))>" + errorMessage = .expectedCustomValueTo( + "equal <\(stringify(expectedValue))>", + "<\(stringify(actualValue))>" + ) if expectedValue == actualValue { - return true + return PredicateResult( + status: .matches, + message: errorMessage + ) } let missing = expectedValue.subtracting(actualValue) if missing.count > 0 { - failureMessage.postfixActual += ", missing <\(stringify(missing))>" + errorMessage = errorMessage.appended(message: ", missing <\(stringify(missing))>") } let extra = actualValue.subtracting(expectedValue) if extra.count > 0 { - failureMessage.postfixActual += ", extra <\(stringify(extra))>" + errorMessage = errorMessage.appended(message: ", extra <\(stringify(extra))>") } + return PredicateResult( + status: .doesNotMatch, + message: errorMessage + ) } + return PredicateResult( + status: .fail, + message: errorMessage.appendedBeNilHint() + ) } else { - failureMessage.postfixActual = " (use beNil() to match nils)" + return PredicateResult( + status: .fail, + message: errorMessage.appendedBeNilHint() + ) } - - return false } } @@ -146,11 +185,11 @@ public func !=(lhs: Expectation<[T]>, rhs: [T]?) { lhs.toNot(equal(rhs)) } -public func ==(lhs: Expectation>, rhs: Set?) { +public func == (lhs: Expectation>, rhs: Set?) { lhs.to(equal(rhs)) } -public func !=(lhs: Expectation>, rhs: Set?) { +public func != (lhs: Expectation>, rhs: Set?) { lhs.toNot(equal(rhs)) } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift b/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift index 5b24af2..379616d 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift @@ -7,8 +7,8 @@ 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.fromDeprecatedClosure { actualExpression, failureMessage in if let actualValue = try actualExpression.evaluate() { failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" let result = expectedValue == actualValue.count @@ -18,13 +18,13 @@ public func haveCount(_ expectedValue: T.IndexDistance) -> NonNil } else { return false } - } + }.requireNonNil } /// 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.fromDeprecatedClosure { actualExpression, failureMessage in if let actualValue = try actualExpression.evaluate() { failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" let result = expectedValue == actualValue.count diff --git a/Pods/Nimble/Sources/Nimble/Matchers/Match.swift b/Pods/Nimble/Sources/Nimble/Matchers/Match.swift index c225f88..165600f 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/Match.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/Match.swift @@ -1,13 +1,11 @@ import Foundation -#if _runtime(_ObjC) - /// 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 +public func match(_ expectedValue: String?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "match <\(stringify(expectedValue))>" - + if let actual = try actualExpression.evaluate() { if let regexp = expectedValue { return actual.range(of: regexp, options: .regularExpression) != nil @@ -15,9 +13,11 @@ public func match(_ expectedValue: String?) -> NonNilMatcherFunc { } return false - } + }.requireNonNil } +#if _runtime(_ObjC) + extension NMBObjCMatcher { public class func matchMatcher(_ expected: NSString) -> NMBMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in diff --git a/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift b/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift index 2092cb6..2fdfb25 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift @@ -1,26 +1,53 @@ 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.fromDeprecatedClosure { actualExpression, failureMessage in + let actualError: Error? = try actualExpression.evaluate() + + setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, error: error) + var matches = false + if let actualError = actualError, errorMatchesExpectedError(actualError, expectedError: error) { + matches = true + } + return matches + }.requireNonNil +} + /// 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 +public func matchError(_ error: T) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in let actualError: Error? = try actualExpression.evaluate() 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 matches + }.requireNonNil } /// 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 +public func matchError(_ errorType: T.Type) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in let actualError: Error? = try actualExpression.evaluate() setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, errorType: errorType) - return errorMatchesNonNilFieldsOrClosure(actualError, errorType: errorType) - } + var matches = false + if actualError as? T != nil { + matches = true + } + return matches + }.requireNonNil } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift b/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift index 02d3245..abcafa9 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift +++ b/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/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift b/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift index ac1eb9d..3528e3f 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift @@ -5,12 +5,29 @@ import Foundation #endif /// Implement this protocol to implement a custom matcher for Swift +@available(*, deprecated, message: "Use to Predicate instead") public protocol Matcher { associatedtype ValueType func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool } +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 _runtime(_ObjC) /// Objective-C interface to the Swift variant of Matcher. @objc public protocol NMBMatcher { @@ -57,12 +74,12 @@ extension NSDictionary : NMBCollection {} #if _runtime(_ObjC) /// Protocol for types that support beginWith(), endWith(), beEmpty() matchers -@objc public protocol NMBOrderedCollection : NMBCollection { +@objc public protocol NMBOrderedCollection: NMBCollection { @objc(objectAtIndex:) func object(at index: Int) -> Any } #else -public protocol NMBOrderedCollection : NMBCollection { +public protocol NMBOrderedCollection: NMBCollection { func object(at index: Int) -> Any } #endif diff --git a/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift index 84b9d49..dcd7676 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift @@ -15,9 +15,9 @@ internal class NotificationCollector { } func startObserving() { - self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil) { + self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil) { [weak self] n in // linux-swift gets confused by .append(n) - [weak self] n in self?.observedNotifications.append(n) + self?.observedNotifications.append(n) } } @@ -41,14 +41,14 @@ let notificationCenterDefault = NotificationCenter.default public func postNotifications( _ notificationsMatcher: T, fromNotificationCenter center: NotificationCenter = notificationCenterDefault) - -> MatcherFunc + -> 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.fromDeprecatedClosure { actualExpression, failureMessage in let collectorNotificationsExpression = Expression(memoizedExpression: { _ in return collector.observedNotifications }, location: actualExpression.location, withoutCaching: true) diff --git a/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift b/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift new file mode 100644 index 0000000..8080f6c --- /dev/null +++ b/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift @@ -0,0 +1,348 @@ +// 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)) + } + } +} + +// Question: Should this be exposed? It's safer to not for now and decide later. +internal 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. + var status: PredicateStatus + /// The error message that can be displayed if it does not match + 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 + internal 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 _runtime(_ObjC) +public typealias PredicateBlock = (_ actualExpression: Expression) -> NMBPredicateResult + +public class NMBPredicate: NSObject { + private let predicate: PredicateBlock + + public init(predicate: @escaping PredicateBlock) { + self.predicate = predicate + } + + func satisfies(_ expression: @escaping () -> NSObject!, location: SourceLocation) -> NMBPredicateResult { + let expr = Expression(expression: expression, location: location) + return self.predicate(expr) + } +} + +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 hashValue: 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/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift b/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift index 09e28c7..a4599cb 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift @@ -16,8 +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.fromDeprecatedClosure { actualExpression, failureMessage in var exception: NSException? let capture = NMBExceptionCapture(handler: ({ e in @@ -52,7 +52,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 { @@ -97,11 +97,11 @@ internal func exceptionMatchesNonNilFieldsOrClosure( } } } - + return matches } -public class NMBObjCRaiseExceptionMatcher : NSObject, NMBMatcher { +public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { internal var _name: String? internal var _reason: String? internal var _userInfo: NSDictionary? diff --git a/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift b/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift index b24b3ec..9d19b10 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift @@ -2,63 +2,105 @@ 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 - where U: Matcher, U.ValueType == T -{ +public func satisfyAnyOf(_ matchers: U...) -> Predicate + where U: Matcher, U.ValueType == T { return satisfyAnyOf(matchers) } -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 +/// Deprecated. Please use `satisfyAnyOf(_) -> Predicate` instead. +internal func satisfyAnyOf(_ matchers: [U]) -> Predicate + 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 + } + postfixMessages.add(NSString(string: "{\(failureMessage.postfixMessage)}")) } - postfixMessages.add(NSString(string: "{\(failureMessage.postfixMessage)}")) - } - failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "\(actualValue)" - } + failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") + if let actualValue = try actualExpression.evaluate() { + failureMessage.actualValue = "\(actualValue)" + } - return matches - } + return matches + }.predicate +} + +internal func satisfyAnyOf(_ predicates: [Predicate]) -> Predicate { + return Predicate { 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)}") + } + + 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( + status: PredicateStatus(bool: matches), + message: msg + ) + }.requireNonNil } -public func ||(left: NonNilMatcherFunc, right: NonNilMatcherFunc) -> NonNilMatcherFunc { +public func || (left: Predicate, right: Predicate) -> Predicate { + return satisfyAnyOf(left, right) +} + +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) extension NMBObjCMatcher { - public class func satisfyAnyOfMatcher(_ matchers: [NMBObjCMatcher]) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + 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 { + return predicate.satisfies({ try! expression.evaluate() }, location: actualExpression.location).toSwift() + } else { + let failureMessage = FailureMessage() + 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/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift b/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift new file mode 100644 index 0000000..cad53f4 --- /dev/null +++ b/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift @@ -0,0 +1,55 @@ +import Foundation + +public func throwAssertion() -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + #if arch(x86_64) && _runtime(_ObjC) && !SWIFT_PACKAGE + failureMessage.postfixMessage = "throw an assertion" + failureMessage.actualValue = nil + + var succeeded = true + + let caughtException: BadInstructionException? = catchBadInstruction { + #if os(tvOS) + if !NimbleEnvironment.activeInstance.suppressTVOSAssertionWarning { + print() + print("[Nimble Warning]: If you're getting stuck on a debugger breakpoint for a " + + "fatal error while using throwAssertion(), please disable 'Debug Executable' " + + "in your scheme. Go to 'Edit Scheme > Test > Info' and uncheck " + + "'Debug Executable'. If you've already done that, suppress this warning " + + "by setting `NimbleEnvironment.activeInstance.suppressTVOSAssertionWarning = true`. " + + "This is required because the standard methods of catching assertions " + + "(mach APIs) are unavailable for tvOS. Instead, the same mechanism the " + + "debugger uses is the fallback method for tvOS." + ) + print() + NimbleEnvironment.activeInstance.suppressTVOSAssertionWarning = true + } + #endif + do { + try actualExpression.evaluate() + } catch let error { + succeeded = false + failureMessage.postfixMessage += "; threw error instead <\(error)>" + } + } + + if !succeeded { + return false + } + + if caughtException == nil { + return false + } + + 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" + + " conditional statement") + #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") + #endif + } +} diff --git a/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift b/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift index 8c9b91b..923f52e 100644 --- a/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift +++ b/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift @@ -1,5 +1,115 @@ 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.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + failureMessage.postfixMessage = "throw any error" + if let actualError = actualError { + failureMessage.actualValue = "<\(actualError)>" + } else { + failureMessage.actualValue = "no error" + } + return actualError != nil + } +} + +/// 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: ((Error) -> Void)? = nil) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + 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.count > 0 { + matches = false + } + } + } + return matches + } +} + +/// 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.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + 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.count > 0 { + matches = false + } + } + } + return matches + } +} + /// A Nimble matcher that succeeds when the actual expression throws an /// error of the specified type or from the specified case. /// @@ -12,21 +122,86 @@ 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 + errorType: T.Type, + closure: ((T) -> Void)? = nil) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + 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.count > 0 { + 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.count > 0 { + matches = false + } + } } + } - setFailureMessageForError(failureMessage, actualError: actualError, error: error, errorType: errorType, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, error: error, errorType: errorType, closure: closure) + return matches + } +} + +/// 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 ((Error) -> Void)) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError } + + 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.count > 0 { + matches = false + } + } + return matches + } } /// A Nimble matcher that succeeds when the actual expression throws any @@ -36,18 +211,30 @@ 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 ((T) -> Void)) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + 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.count > 0 { + matches = false } - - setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, closure: closure) } + return matches + } } diff --git a/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift b/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift new file mode 100644 index 0000000..01369bb --- /dev/null +++ b/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/Pods/Nimble/Sources/Nimble/Nimble.h b/Pods/Nimble/Sources/Nimble/Nimble.h index 1eab61a..bd45c5d 100644 --- a/Pods/Nimble/Sources/Nimble/Nimble.h +++ b/Pods/Nimble/Sources/Nimble/Nimble.h @@ -3,5 +3,7 @@ #import "NMBStringify.h" #import "DSL.h" +#import "CwlPreconditionTesting.h" + FOUNDATION_EXPORT double NimbleVersionNumber; FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Pods/Nimble/Sources/Nimble/Utils/Async.swift b/Pods/Nimble/Sources/Nimble/Utils/Async.swift index a78a147..776b861 100644 --- a/Pods/Nimble/Sources/Nimble/Utils/Async.swift +++ b/Pods/Nimble/Sources/Nimble/Utils/Async.swift @@ -1,10 +1,13 @@ +import CoreFoundation +import Dispatch import Foundation -#if _runtime(_ObjC) -import Dispatch +#if !_runtime(_ObjC) + import CDispatch +#endif -private let timeoutLeeway = DispatchTimeInterval.nanoseconds(Int(NSEC_PER_MSEC)) -private let pollLeeway = DispatchTimeInterval.nanoseconds(Int(NSEC_PER_MSEC)) +private let timeoutLeeway = DispatchTimeInterval.milliseconds(1) +private let pollLeeway = DispatchTimeInterval.milliseconds(1) /// Stores debugging information about callers internal struct WaitingInfo: CustomStringConvertible { @@ -24,13 +27,18 @@ internal protocol WaitLock { } internal class AssertionWaitLock: WaitLock { - private var currentWaiter: WaitingInfo? = nil + private var currentWaiter: WaitingInfo? init() { } func acquireWaitingLock(_ fnName: String, file: FileString, line: UInt) { let info = WaitingInfo(name: fnName, file: file, lineNumber: line) + #if _runtime(_ObjC) + let isMainThread = Thread.isMainThread + #else + let isMainThread = _CFIsMainThread() + #endif nimblePrecondition( - Thread.isMainThread, + isMainThread, "InvalidNimbleAPIUsage", "\(fnName) can only run on the main thread." ) @@ -101,7 +109,7 @@ internal class AwaitPromise { /// 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 @@ -171,13 +179,18 @@ internal class AwaitPromiseBuilder { trigger.timeoutSource.scheduleOneshot( deadline: DispatchTime.now() + timeoutInterval, leeway: timeoutLeeway) - trigger.timeoutSource.setEventHandler() { + 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() - CFRunLoopPerformBlock(runLoop, CFRunLoopMode.defaultMode.rawValue) { + #if _runtime(_ObjC) + let runLoopMode = CFRunLoopMode.defaultMode.rawValue + #else + let runLoopMode = kCFRunLoopDefaultMode + #endif + CFRunLoopPerformBlock(runLoop, runLoopMode) { if semTimedOutOrBlocked.wait(timeout: .now()) == .success { timedOutSem.signal() semTimedOutOrBlocked.signal() @@ -205,7 +218,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: /// @@ -237,7 +250,7 @@ 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 - RunLoop.current.run(mode: .defaultRunLoopMode, before: .distantFuture) + _ = RunLoop.current.run(mode: .defaultRunLoopMode, before: .distantFuture) } self.trigger.timeoutSource.suspend() self.trigger.timeoutSource.cancel() @@ -269,20 +282,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() { + 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) } } } @@ -301,7 +317,7 @@ internal class Awaiter { let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: asyncSource) { let interval = DispatchTimeInterval.nanoseconds(Int(pollInterval * TimeInterval(NSEC_PER_SEC))) asyncSource.scheduleRepeating(deadline: .now(), interval: interval, leeway: pollLeeway) - asyncSource.setEventHandler() { + asyncSource.setEventHandler { do { if let result = try closure() { if promise.resolveResult(.completed(result)) { @@ -334,17 +350,11 @@ 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 } - -#endif diff --git a/Pods/Nimble/Sources/Nimble/Utils/Errors.swift b/Pods/Nimble/Sources/Nimble/Utils/Errors.swift index 54bed92..074cb20 100644 --- a/Pods/Nimble/Sources/Nimble/Utils/Errors.swift +++ b/Pods/Nimble/Sources/Nimble/Utils/Errors.swift @@ -12,15 +12,11 @@ internal func setFailureMessageForError( failureMessage.postfixMessage = "\(postfixMessageVerb) error" if let error = error { - if let error = error as? CustomDebugStringConvertible { - failureMessage.postfixMessage += " <\(error.debugDescription)>" - } else { - failureMessage.postfixMessage += " <\(error)>" - } + failureMessage.postfixMessage += " <\(error)>" } 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 { @@ -41,56 +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 && closure != nil { - // The closure expects another ErrorProtocol as argument, so this - // is _supposed_ to fail, so that it becomes more obvious. - let assertions = gatherExpectations { - expect(actualError is T).to(equal(true)) - } - precondition(assertions.map { $0.message }.count > 0) - matches = false - } - } - - return matches -} - // Non-generic internal func setFailureMessageForError( @@ -99,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" @@ -111,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/Pods/Nimble/Sources/Nimble/Utils/SourceLocation.swift b/Pods/Nimble/Sources/Nimble/Utils/SourceLocation.swift index a7279aa..4e37aef 100644 --- a/Pods/Nimble/Sources/Nimble/Utils/SourceLocation.swift +++ b/Pods/Nimble/Sources/Nimble/Utils/SourceLocation.swift @@ -5,13 +5,13 @@ import Foundation // stdlib, and because recent versions of the XCTest overlay require `StaticString` // when calling `XCTFail`. Under the Objective-C runtime (i.e. building on Mac), we // have to use `String` instead because StaticString can't be generated from Objective-C -#if _runtime(_ObjC) -public typealias FileString = String -#else +#if SWIFT_PACKAGE public typealias FileString = StaticString +#else +public typealias FileString = String #endif -public final class SourceLocation : NSObject { +public final class SourceLocation: NSObject { public let file: FileString public let line: UInt diff --git a/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift b/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift index 012e1e3..8a15c4c 100644 --- a/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift +++ b/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift @@ -1,6 +1,5 @@ import Foundation - internal func identityAsString(_ value: Any?) -> String { let anyObject: AnyObject? #if os(Linux) @@ -51,7 +50,7 @@ extension NSNumber: TestOutputStringConvertible { // the travis CI build on linux. public var testDescription: String { let description = self.description - + if description.contains(".") { // Travis linux swiftpm build doesn't like casting String to NSString, // which is why this annoying nested initializer thing is here. @@ -87,14 +86,14 @@ extension AnySequence: TestOutputStringConvertible { let generator = self.makeIterator() var strings = [String]() var value: AnySequence.Iterator.Element? - + repeat { value = generator.next() if let value = value { strings.append(stringify(value)) } } while value != nil - + let list = strings.joined(separator: ", ") return "[\(list)]" } @@ -149,11 +148,11 @@ public func stringify(_ value: T) -> String { if let value = value as? TestOutputStringConvertible { return value.testDescription } - + if let value = value as? CustomDebugStringConvertible { return value.debugDescription } - + return String(describing: value) } diff --git a/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h b/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h index a499059..4538fb4 100644 --- a/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h +++ b/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h @@ -6,48 +6,224 @@ @protocol NMBMatcher; +NS_ASSUME_NONNULL_BEGIN + + +#define NIMBLE_OVERLOADABLE __attribute__((overloadable)) #define NIMBLE_EXPORT FOUNDATION_EXPORT +#define NIMBLE_EXPORT_INLINE FOUNDATION_STATIC_INLINE + +#define NIMBLE_VALUE_OF(VAL) ({ \ + __typeof__((VAL)) val = (VAL); \ + [NSValue valueWithBytes:&val objCType:@encode(__typeof__((VAL)))]; \ +}) #ifdef NIMBLE_DISABLE_SHORT_SYNTAX #define NIMBLE_SHORT(PROTO, ORIGINAL) +#define NIMBLE_SHORT_OVERLOADED(PROTO, ORIGINAL) #else #define NIMBLE_SHORT(PROTO, ORIGINAL) FOUNDATION_STATIC_INLINE PROTO { return (ORIGINAL); } +#define NIMBLE_SHORT_OVERLOADED(PROTO, ORIGINAL) FOUNDATION_STATIC_INLINE NIMBLE_OVERLOADABLE PROTO { return (ORIGINAL); } #endif -NIMBLE_EXPORT NMBExpectation *NMB_expect(id(^actualBlock)(), NSString *file, NSUInteger line); + + +#define DEFINE_NMB_EXPECT_OVERLOAD(TYPE, EXPR) \ + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ + NMBExpectation *NMB_expect(TYPE(^actualBlock)(), 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); + + // overloaded dispatch for nils - expect(nil) + DEFINE_NMB_EXPECT_OVERLOAD(void*, nil) + DEFINE_NMB_EXPECT_OVERLOAD(NSRange, NIMBLE_VALUE_OF(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(long, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(unsigned long, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(int, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(unsigned int, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(float, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(double, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(long long, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(unsigned long long, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(char, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(unsigned char, @(actualBlock())) + // bool doesn't get the compiler to dispatch to BOOL types, but using BOOL here seems to allow + // the compiler to dispatch to bool. + DEFINE_NMB_EXPECT_OVERLOAD(BOOL, @(actualBlock())) + DEFINE_NMB_EXPECT_OVERLOAD(char *, @(actualBlock())) + + +#undef DEFINE_NMB_EXPECT_OVERLOAD + + + NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(), NSString *file, NSUInteger line); -NIMBLE_EXPORT id NMB_equal(id expectedValue); -NIMBLE_SHORT(id equal(id expectedValue), - NMB_equal(expectedValue)); -NIMBLE_EXPORT id NMB_haveCount(id expectedValue); -NIMBLE_SHORT(id haveCount(id expectedValue), - NMB_haveCount(expectedValue)); -NIMBLE_EXPORT NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue); -NIMBLE_SHORT(NMBObjCBeCloseToMatcher *beCloseTo(id expectedValue), - NMB_beCloseTo(expectedValue)); +#define DEFINE_OVERLOAD(TYPE, EXPR) \ + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ + id NMB_equal(TYPE expectedValue) { \ + return NMB_equal((EXPR)); \ + } \ + NIMBLE_SHORT_OVERLOADED(id equal(TYPE expectedValue), NMB_equal(expectedValue)); + + + NIMBLE_EXPORT NIMBLE_OVERLOADABLE + id NMB_equal(__nullable id expectedValue); + + NIMBLE_SHORT_OVERLOADED(id equal(__nullable id expectedValue), + NMB_equal(expectedValue)); + + // overloaded dispatch for nils - expect(nil) + DEFINE_OVERLOAD(void*__nullable, (id)nil) + DEFINE_OVERLOAD(NSRange, NIMBLE_VALUE_OF(expectedValue)) + DEFINE_OVERLOAD(long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long, @(expectedValue)) + DEFINE_OVERLOAD(int, @(expectedValue)) + DEFINE_OVERLOAD(unsigned int, @(expectedValue)) + DEFINE_OVERLOAD(float, @(expectedValue)) + DEFINE_OVERLOAD(double, @(expectedValue)) + DEFINE_OVERLOAD(long long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long long, @(expectedValue)) + DEFINE_OVERLOAD(char, @(expectedValue)) + DEFINE_OVERLOAD(unsigned char, @(expectedValue)) + // bool doesn't get the compiler to dispatch to BOOL types, but using BOOL here seems to allow + // the compiler to dispatch to bool. + DEFINE_OVERLOAD(BOOL, @(expectedValue)) + DEFINE_OVERLOAD(char *, @(expectedValue)) + +#undef DEFINE_OVERLOAD + + +#define DEFINE_OVERLOAD(TYPE, EXPR) \ + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ + id NMB_haveCount(TYPE expectedValue) { \ + return NMB_haveCount((EXPR)); \ + } \ + NIMBLE_SHORT_OVERLOADED(id haveCount(TYPE expectedValue), \ + NMB_haveCount(expectedValue)); + + + NIMBLE_EXPORT NIMBLE_OVERLOADABLE + id NMB_haveCount(id expectedValue); + + NIMBLE_SHORT_OVERLOADED(id haveCount(id expectedValue), + NMB_haveCount(expectedValue)); + + DEFINE_OVERLOAD(long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long, @(expectedValue)) + DEFINE_OVERLOAD(int, @(expectedValue)) + DEFINE_OVERLOAD(unsigned int, @(expectedValue)) + DEFINE_OVERLOAD(long long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long long, @(expectedValue)) + DEFINE_OVERLOAD(char, @(expectedValue)) + DEFINE_OVERLOAD(unsigned char, @(expectedValue)) + +#undef DEFINE_OVERLOAD + +#define DEFINE_OVERLOAD(TYPE, EXPR) \ + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ + NMBObjCBeCloseToMatcher *NMB_beCloseTo(TYPE expectedValue) { \ + return NMB_beCloseTo((NSNumber *)(EXPR)); \ + } \ + NIMBLE_SHORT_OVERLOADED(NMBObjCBeCloseToMatcher *beCloseTo(TYPE expectedValue), \ + NMB_beCloseTo(expectedValue)); + + NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue); + NIMBLE_SHORT_OVERLOADED(NMBObjCBeCloseToMatcher *beCloseTo(NSNumber *expectedValue), + NMB_beCloseTo(expectedValue)); + + // it would be better to only overload float & double, but zero becomes ambigious + + DEFINE_OVERLOAD(long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long, @(expectedValue)) + DEFINE_OVERLOAD(int, @(expectedValue)) + DEFINE_OVERLOAD(unsigned int, @(expectedValue)) + DEFINE_OVERLOAD(float, @(expectedValue)) + DEFINE_OVERLOAD(double, @(expectedValue)) + DEFINE_OVERLOAD(long long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long long, @(expectedValue)) + DEFINE_OVERLOAD(char, @(expectedValue)) + DEFINE_OVERLOAD(unsigned char, @(expectedValue)) + +#undef DEFINE_OVERLOAD NIMBLE_EXPORT id NMB_beAnInstanceOf(Class expectedClass); -NIMBLE_SHORT(id beAnInstanceOf(Class expectedClass), - NMB_beAnInstanceOf(expectedClass)); +NIMBLE_EXPORT_INLINE id beAnInstanceOf(Class expectedClass) { + return NMB_beAnInstanceOf(expectedClass); +} NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass); -NIMBLE_SHORT(id beAKindOf(Class expectedClass), - NMB_beAKindOf(expectedClass)); +NIMBLE_EXPORT_INLINE id beAKindOf(Class expectedClass) { + return NMB_beAKindOf(expectedClass); +} NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring); -NIMBLE_SHORT(id beginWith(id itemElementOrSubstring), - NMB_beginWith(itemElementOrSubstring)); - -NIMBLE_EXPORT id NMB_beGreaterThan(NSNumber *expectedValue); -NIMBLE_SHORT(id beGreaterThan(NSNumber *expectedValue), - NMB_beGreaterThan(expectedValue)); - -NIMBLE_EXPORT id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue); -NIMBLE_SHORT(id beGreaterThanOrEqualTo(NSNumber *expectedValue), - NMB_beGreaterThanOrEqualTo(expectedValue)); +NIMBLE_EXPORT_INLINE id beginWith(id itemElementOrSubstring) { + return NMB_beginWith(itemElementOrSubstring); +} + +#define DEFINE_OVERLOAD(TYPE, EXPR) \ + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ + id NMB_beGreaterThan(TYPE expectedValue) { \ + return NMB_beGreaterThan((EXPR)); \ + } \ + NIMBLE_SHORT_OVERLOADED(id beGreaterThan(TYPE expectedValue), NMB_beGreaterThan(expectedValue)); + + NIMBLE_EXPORT NIMBLE_OVERLOADABLE + id NMB_beGreaterThan(NSNumber *expectedValue); + + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE + id beGreaterThan(NSNumber *expectedValue) { + return NMB_beGreaterThan(expectedValue); + } + + DEFINE_OVERLOAD(long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long, @(expectedValue)) + DEFINE_OVERLOAD(int, @(expectedValue)) + DEFINE_OVERLOAD(unsigned int, @(expectedValue)) + DEFINE_OVERLOAD(float, @(expectedValue)) + DEFINE_OVERLOAD(double, @(expectedValue)) + DEFINE_OVERLOAD(long long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long long, @(expectedValue)) + DEFINE_OVERLOAD(char, @(expectedValue)) + DEFINE_OVERLOAD(unsigned char, @(expectedValue)) + +#undef DEFINE_OVERLOAD + +#define DEFINE_OVERLOAD(TYPE, EXPR) \ + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ + id NMB_beGreaterThanOrEqualTo(TYPE expectedValue) { \ + return NMB_beGreaterThanOrEqualTo((EXPR)); \ + } \ + NIMBLE_SHORT_OVERLOADED(id beGreaterThanOrEqualTo(TYPE expectedValue), \ + NMB_beGreaterThanOrEqualTo(expectedValue)); + + NIMBLE_EXPORT NIMBLE_OVERLOADABLE + id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue); + + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE + id beGreaterThanOrEqualTo(NSNumber *expectedValue) { + return NMB_beGreaterThanOrEqualTo(expectedValue); + } + + DEFINE_OVERLOAD(long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long, @(expectedValue)) + DEFINE_OVERLOAD(int, @(expectedValue)) + DEFINE_OVERLOAD(unsigned int, @(expectedValue)) + DEFINE_OVERLOAD(float, @(expectedValue)) + DEFINE_OVERLOAD(double, @(expectedValue)) + DEFINE_OVERLOAD(long long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long long, @(expectedValue)) + DEFINE_OVERLOAD(char, @(expectedValue)) + DEFINE_OVERLOAD(unsigned char, @(expectedValue)) + + +#undef DEFINE_OVERLOAD NIMBLE_EXPORT id NMB_beIdenticalTo(id expectedInstance); NIMBLE_SHORT(id beIdenticalTo(id expectedInstance), @@ -57,13 +233,66 @@ NIMBLE_EXPORT id NMB_be(id expectedInstance); NIMBLE_SHORT(id be(id expectedInstance), NMB_be(expectedInstance)); -NIMBLE_EXPORT id NMB_beLessThan(NSNumber *expectedValue); -NIMBLE_SHORT(id beLessThan(NSNumber *expectedValue), - NMB_beLessThan(expectedValue)); -NIMBLE_EXPORT id NMB_beLessThanOrEqualTo(NSNumber *expectedValue); -NIMBLE_SHORT(id beLessThanOrEqualTo(NSNumber *expectedValue), - NMB_beLessThanOrEqualTo(expectedValue)); +#define DEFINE_OVERLOAD(TYPE, EXPR) \ + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ + id NMB_beLessThan(TYPE expectedValue) { \ + return NMB_beLessThan((EXPR)); \ + } \ + NIMBLE_SHORT_OVERLOADED(id beLessThan(TYPE expectedValue), \ + NMB_beLessThan(expectedValue)); + + NIMBLE_EXPORT NIMBLE_OVERLOADABLE + id NMB_beLessThan(NSNumber *expectedValue); + + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE + id beLessThan(NSNumber *expectedValue) { + return NMB_beLessThan(expectedValue); + } + + DEFINE_OVERLOAD(long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long, @(expectedValue)) + DEFINE_OVERLOAD(int, @(expectedValue)) + DEFINE_OVERLOAD(unsigned int, @(expectedValue)) + DEFINE_OVERLOAD(float, @(expectedValue)) + DEFINE_OVERLOAD(double, @(expectedValue)) + DEFINE_OVERLOAD(long long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long long, @(expectedValue)) + DEFINE_OVERLOAD(char, @(expectedValue)) + DEFINE_OVERLOAD(unsigned char, @(expectedValue)) + +#undef DEFINE_OVERLOAD + + +#define DEFINE_OVERLOAD(TYPE, EXPR) \ + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ + id NMB_beLessThanOrEqualTo(TYPE expectedValue) { \ + return NMB_beLessThanOrEqualTo((EXPR)); \ + } \ + NIMBLE_SHORT_OVERLOADED(id beLessThanOrEqualTo(TYPE expectedValue), \ + NMB_beLessThanOrEqualTo(expectedValue)); + + + NIMBLE_EXPORT NIMBLE_OVERLOADABLE + id NMB_beLessThanOrEqualTo(NSNumber *expectedValue); + + NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE + id beLessThanOrEqualTo(NSNumber *expectedValue) { + return NMB_beLessThanOrEqualTo(expectedValue); + } + + DEFINE_OVERLOAD(long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long, @(expectedValue)) + DEFINE_OVERLOAD(int, @(expectedValue)) + DEFINE_OVERLOAD(unsigned int, @(expectedValue)) + DEFINE_OVERLOAD(float, @(expectedValue)) + DEFINE_OVERLOAD(double, @(expectedValue)) + DEFINE_OVERLOAD(long long, @(expectedValue)) + DEFINE_OVERLOAD(unsigned long long, @(expectedValue)) + DEFINE_OVERLOAD(char, @(expectedValue)) + DEFINE_OVERLOAD(unsigned char, @(expectedValue)) + +#undef DEFINE_OVERLOAD NIMBLE_EXPORT id NMB_beTruthy(void); NIMBLE_SHORT(id beTruthy(void), @@ -95,6 +324,10 @@ NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, . #define contain(...) NMB_contain(__VA_ARGS__) #endif +NIMBLE_EXPORT id NMB_containElementSatisfying(BOOL(^predicate)(id)); +NIMBLE_SHORT(id containElementSatisfying(BOOL(^predicate)(id)), + NMB_containElementSatisfying(predicate)); + NIMBLE_EXPORT id NMB_endWith(id itemElementOrSubstring); NIMBLE_SHORT(id endWith(id itemElementOrSubstring), NMB_endWith(itemElementOrSubstring)); @@ -134,7 +367,7 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger #define NMB_waitUntil NMB_waitUntilBuilder(@(__FILE__), __LINE__) #ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#define expect(...) NMB_expect(^id{ return (__VA_ARGS__); }, @(__FILE__), __LINE__) +#define expect(...) NMB_expect(^{ return (__VA_ARGS__); }, @(__FILE__), __LINE__) #define expectAction(BLOCK) NMB_expectAction((BLOCK), @(__FILE__), __LINE__) #define failWithMessage(msg) NMB_failWithMessage(msg, @(__FILE__), __LINE__) #define fail() failWithMessage(@"fail() always fails") @@ -142,4 +375,9 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger #define waitUntilTimeout NMB_waitUntilTimeout #define waitUntil NMB_waitUntil + +#undef NIMBLE_VALUE_OF + #endif + +NS_ASSUME_NONNULL_END diff --git a/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m b/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m index 2170238..31ff810 100644 --- a/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m +++ b/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m @@ -9,7 +9,11 @@ + (void)untilFile:(NSString *)file line:(NSUInteger)line action:(void(^)())actio @end -NIMBLE_EXPORT NMBExpectation *NMB_expect(id(^actualBlock)(), NSString *file, NSUInteger line) { + +NS_ASSUME_NONNULL_BEGIN + + +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBExpectation *__nonnull NMB_expect(id __nullable(^actualBlock)(), NSString *__nonnull file, NSUInteger line) { return [[NMBExpectation alloc] initWithActualBlock:actualBlock negative:NO file:file @@ -35,7 +39,7 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger return [NMBObjCMatcher beAKindOfMatcher:expectedClass]; } -NIMBLE_EXPORT NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue) { +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue) { return [NMBObjCMatcher beCloseToMatcher:expectedValue within:0.001]; } @@ -43,11 +47,11 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger return [NMBObjCMatcher beginWithMatcher:itemElementOrSubstring]; } -NIMBLE_EXPORT id NMB_beGreaterThan(NSNumber *expectedValue) { +NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThan(NSNumber *expectedValue) { return [NMBObjCMatcher beGreaterThanMatcher:expectedValue]; } -NIMBLE_EXPORT id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue) { +NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue) { return [NMBObjCMatcher beGreaterThanOrEqualToMatcher:expectedValue]; } @@ -59,11 +63,11 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; } -NIMBLE_EXPORT id NMB_beLessThan(NSNumber *expectedValue) { +NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThan(NSNumber *expectedValue) { return [NMBObjCMatcher beLessThanMatcher:expectedValue]; } -NIMBLE_EXPORT id NMB_beLessThanOrEqualTo(NSNumber *expectedValue) { +NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThanOrEqualTo(NSNumber *expectedValue) { return [NMBObjCMatcher beLessThanOrEqualToMatcher:expectedValue]; } @@ -109,15 +113,19 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger return [NMBObjCMatcher containMatcher:itemOrSubstringArray]; } +NIMBLE_EXPORT id NMB_containElementSatisfying(BOOL(^predicate)(id)) { + return [NMBObjCMatcher containElementSatisfyingMatcher:predicate]; +} + NIMBLE_EXPORT id NMB_endWith(id itemElementOrSubstring) { return [NMBObjCMatcher endWithMatcher:itemElementOrSubstring]; } -NIMBLE_EXPORT id NMB_equal(id expectedValue) { +NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_equal(__nullable id expectedValue) { return [NMBObjCMatcher equalMatcher:expectedValue]; } -NIMBLE_EXPORT id NMB_haveCount(id expectedValue) { +NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_haveCount(id expectedValue) { return [NMBObjCMatcher haveCountMatcher:expectedValue]; } @@ -148,3 +156,5 @@ NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger [NMBWait untilFile:file line:line action:action]; }; } + +NS_ASSUME_NONNULL_END diff --git a/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h b/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h index e0ec05a..d2a54d2 100644 --- a/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h +++ b/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h @@ -4,7 +4,7 @@ @interface NMBExceptionCapture : NSObject - (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)())finally; -- (void)tryBlock:(void(^ _Nonnull)())unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); +- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)())unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); @end diff --git a/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h b/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h index e5d5ddd..7938bca 100644 --- a/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h +++ b/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/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index be512d3..ab54f6b 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,381 +7,421 @@ objects = { /* Begin PBXBuildFile section */ - 0667612C6505ACFF5D92B5B61FE7BBEA /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9C962771DD2B1B049F98918116DABE /* QuickSpec.m */; }; - 099C64CF560DC424DB43BBBEC6370D8F /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C91BD1852D275FA519A9546A6B5A0A2A /* ThrowError.swift */; }; - 0A9DA2158E1A0BD404CD48D07C183F3A /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B1803B89967D1E59EBF19A30CEB68A2 /* World+DSL.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 109EB99F003668E3ED3868B57E1071AF /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6559B0A2178C924FCB7881428C78787 /* ExampleMetadata.swift */; }; - 11C22C7B844DF31A5EBDC9AC132C5E94 /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = 9082F45478C362610808EA87B8A66C41 /* UIImage+Compare.m */; }; - 130F048002A62769FAFCC66F2C79391A /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = 76DB4B5E7898B25E3F577B7641E60510 /* FBSnapshotTestController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1330782A55555085FE8872AF7BA8DD48 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11BFA072BC85223ADDBDE3D73F35C9E6 /* DSL.swift */; }; - 1BBA146EB2FBD8FA0A30A07E5AED6C2D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C8CBBF32C39839511129EB1C04B4277 /* Foundation.framework */; }; - 1C696A0CCC5C29FFBBB8620F5DC8FA6D /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = C181D93F628682731FAE109D26962EE7 /* Example.swift */; }; - 21FCC4B725EAF5F42EDFDA386FF3EC4C /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFED69C9F357D4065EBD81E2F1039DB9 /* BeNil.swift */; }; - 24AE47A6560D6EBB0AFF78BAAAB15E0F /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2028A859FEF82FEA8F0DCE3ABC93AA /* AsyncMatcherWrapper.swift */; }; - 24BA48295DE470061BB55F0999CC7B28 /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DD777FB8FEDE0FB9B23938CF5E05AF1 /* SuiteHooks.swift */; }; - 263465A57520B440C99D428CE2E51AE9 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAAA128C3DFBB59BCE7034FF40860D00 /* NimbleEnvironment.swift */; }; - 2C87E1788C8FA06AE3481A2226E3AF2D /* UIApplication+StrictKeyWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A587A1D3F23BEE74E95F9AE52EAE864 /* UIApplication+StrictKeyWindow.m */; }; - 31D19316E3F33AE77DDCD961DEC9A9E9 /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = A1FB93B2BA8D088CE5BFC2720246C173 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 344BEE9094F8B903BDACA3AB5811436C /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6A7CB967FB30ABD7519E562C1B21F7 /* DSL.m */; }; - 34A1C7E576C58A9D3F3101448308BF3E /* UIImage+Snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = 05AEE152EDF65EE475EA3BBA0B128AF6 /* UIImage+Snapshot.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 35E0EBA7AA92E190AB5B4ACFCF0F61C4 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29CB98A16E0D456241ACFA378ED0A2AF /* AssertionDispatcher.swift */; }; - 36076C14B35110B528A15AF21826CCE1 /* Nimble-Snapshots-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 28FD848AFC07C090348CAF492401F36D /* Nimble-Snapshots-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 36A09777D96DA589FD7FB47DD6EDC2AB /* Nimble-Snapshots-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C3EE67261216789A22D959DB9229C924 /* Nimble-Snapshots-dummy.m */; }; - 39007AD3711A35BCFA1D853E7AB79510 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24D858940B934FE9F5F607BC07086B78 /* BeLessThanOrEqual.swift */; }; - 3B78C4F35C369FBABE62D4622A67E7DF /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = E799D37D8B6C727B13EA2004D05E0ABD /* DSL.swift */; }; - 3C918E40C04067FAF57B447C0BC52B04 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D003044674A8D90C2E0247D4B38FBCD5 /* BeGreaterThanOrEqualTo.swift */; }; - 3D7AF86E9032C99357D2ED046461874F /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB4672ADD7CC732E317AD387E9029D7 /* BeGreaterThan.swift */; }; - 3DB8697476CF88CF1F0DACBD6197AEA3 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB83B5247BFDB707BC388C23F1B523B5 /* ErrorUtility.swift */; }; - 41EE5E3698CC1A17046AC74B36A279E0 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EE6E46DBD550BA5110C20BAB0809A7F /* RaisesException.swift */; }; - 421C068CCF276223CD76D9875DB0C537 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 680F72D45438C78D0EB35E4A30032748 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 42A5BFF181D12A41294B42BE5931FC9B /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = BD607A34ED322DCAC12DEE2FF93B9CC6 /* QCKDSL.m */; }; - 43B99F06587ACD844A4D09A0ED9FB66B /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1F739A1F98AAF2DD04AED50D15E7299 /* Stringers.swift */; }; - 497AA8816FC08215EF4C2431E1986992 /* FBSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A5BA45404994D810AF32680D5494917 /* FBSnapshotTestCase-dummy.m */; }; - 49CA018A1EFE0681D470F5743BA8BB0F /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9CEED1F8353F3A900611659B67BCDE /* QuickTestSuite.swift */; }; - 49E9CE6CDEA80E7C247CDA044A91B5F5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB581661953B50A6C707A77A53A29B1F /* UIKit.framework */; }; - 4A2EF0E72836C8432665C044C67933EA /* String+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA9DD9A32782B9F4BE310FCEFCCEA22 /* String+FileName.swift */; }; - 522E7C454877ACD8AB3D06601E7770AE /* CurrentTestCaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 24C503FEA6BBF87FE7B6C59FB4ECCFE4 /* CurrentTestCaseTracker.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 5438871833E759C86C2CA743AD3EF2DD /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4948BAB46EEC9A11A941BC84AE265BE4 /* World.swift */; }; - 56CA153033917F08CCDD22E94806C873 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93266F78F7C6C1F161E418D4B0637D48 /* MatchError.swift */; }; - 59A4C06B57864AA9BBFAE0B762DAE871 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9296B4E7ECC49BD5269AEBCAB7B40C20 /* BeLessThan.swift */; }; - 59AFC17D744CDEED360B4DF8876295BF /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F1078D6737E32952C35C9AC1874F492 /* Errors.swift */; }; - 5A4AC5619A05687E5EB0A4BBDC8AF154 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 780E500297492BD494198765A72D0F4A /* AllPass.swift */; }; - 5B21B2BBADCCEB5AC51E0A0C99BA5B93 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB5FC980EB77B65815ACB8F33387100 /* Expression.swift */; }; - 5C79957053941818EDA2B9339566E79E /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6257107A1A729D6814F643FFF44ABA6E /* XCTest.framework */; }; - 602B5CEB21CA60AFA67B508D13282E94 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303E271048DBBB0E4208E77C28941637 /* BeCloseTo.swift */; }; - 61EBC5CF0D5E065C88028B49C6B8D3B3 /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = F0DD120BDC84BB26D97C0F6787E83B6E /* UIImage+Diff.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 636A1DD83197D4668B43CC94E874E892 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA28356A18174F24234A03D509D7ED0F /* Callsite.swift */; }; - 6445B28465C1A7900E895709BC333C23 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DBE39329559FFC9790A4BB9CD44876E /* Contain.swift */; }; - 684A7E4C24ADAAB1B497B5F658036FC2 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AA88B172ABDA94F6478E9AB0B22494E /* Functional.swift */; }; - 68B245DB47CA60F8F9ADCA1E8CCDC324 /* UIApplication+StrictKeyWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 4613CD7A9A219611CC5C966F2A544B7E /* UIApplication+StrictKeyWindow.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6914EE43A9B8B8D30220B3B6B0D57523 /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 24AE05986ED0C8EE52848FBF33418273 /* FBSnapshotTestCase.m */; }; - 69BB3B31F3C8AE199A43ABE8B0CBF802 /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2E910834C78FF33CCC5435FC2B30BC /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6AEFB8CB53072AE49169F136706F7E2A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0401507CF8C223BBA0935EF757D1293D /* QuartzCore.framework */; }; - 6E4A16BF4D27C48BB1FE1E1CF5E8B90E /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = 88019BE679722D896B0BA84C93948876 /* FBSnapshotTestCasePlatform.m */; }; - 730FE65CF9B832FC01AB3F545A8CAF73 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C78B6ED294864387BED602BC3BF5A3B3 /* QuickSelectedTestSuiteBuilder.swift */; }; - 74C0C955A968122899AB6E0DA79D3FA0 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8A88D7384F1D92C3CD8EBFFC04C29E /* NMBObjCMatcher.swift */; }; - 77C07EB19C4FA487E6411EED4787728F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C8CBBF32C39839511129EB1C04B4277 /* Foundation.framework */; }; - 78C0EDC656B9152FB603EC259D241DA5 /* FBSnapshotTestCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9823197EA5904A9150FB0AD8B09841E6 /* FBSnapshotTestCase.framework */; }; - 79FF370D51D1A9B200EB9E571313444B /* Pods-TRXTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E1643A09ACFEBCACE7170E14E1D67928 /* Pods-TRXTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7DC1F64E7A3A97A5A620B7835FEBE34B /* Pods-TRXTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C14A754159ACE9664C012B542D511B8 /* Pods-TRXTests-dummy.m */; }; - 7F8AC53F92F56C3319DD733CAFB9DD58 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416DCDCE6819617145DEFCA518A50810 /* BeAKindOf.swift */; }; - 82E55B1159083B37527C20EB4E621550 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AD55F3974939097556240403DEE2DFF /* Nimble.framework */; }; - 83DA9B6F380D643725CFEE4E9AAB9F5D /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3E9E46640DBBCAB5505AB8F11882F5 /* Filter.swift */; }; - 85D178DFCA1BC67BBFB1188E34EC5B19 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E39919745142DBFA9E9A13766F238D4 /* SwiftSupport.swift */; }; - 85D4DBD7E83768DAFD903EF915D1C1DA /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B615C0BD21E2A570AC3401523EFA5416 /* HooksPhase.swift */; }; - 8ACF6A5515A175054E22414BF740EF14 /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D0A57AA107F4292506163947E3CF583 /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8DFE23F2C7973BC8A159168AFC2FB8C3 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCBA99E60C57041DCB968265BD79AA64 /* MatcherFunc.swift */; }; - 9296C7ABDE9E5894D47CD74E7F78F968 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0279B430D9728C12FCC154306B21AAC7 /* Match.swift */; }; - 92BC58B0158D9DFE7D59C341A85D4359 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE74DF25810B09E3F9396F5EE42E79 /* Async.swift */; }; - 95F54B9537875729AE90B472EA5D39BF /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9F3981F38B454DA7946EBCB54AD9D3C /* Expectation.swift */; }; - 9BAEE6A607528BBFAA526CFFA5277E43 /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4064EAC3E026BE12B1FC07E21A898318 /* ExampleHooks.swift */; }; - 9D904B7EAD0EC56AD12E704757CAA640 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953F6BD069D4324933F7115FC34E088A /* SourceLocation.swift */; }; - 9DBED967731DE53C22AD17C3E09079FD /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = 5ED636BB81D1B1CF2C46AF06EF4E99B7 /* XCTestObservationCenter+Register.m */; }; - 9EFD3EE819EB1FAA5EDE26E8DAA483CD /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = B90E809A9EB4BE08B463E1D7E5C5A69D /* EndWith.swift */; }; - 9FA3B93CE0ECAC3CDC30890659AACF82 /* FBSnapshotTestCasePlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = A8455A0F53ED8DEFB47169D79C9009B7 /* FBSnapshotTestCasePlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A0D6FCA100B1C734A358AB5C8AA55E1B /* NSString+QCKSelectorName.m in Sources */ = {isa = PBXBuildFile; fileRef = 35E21278E64AA798C95FD9DEFA9FA3F9 /* NSString+QCKSelectorName.m */; }; - A1253488850CE3B86ED19CB93A9CD3D5 /* HaveValidSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E5718B90C7279FB3375B883E7F11A60 /* HaveValidSnapshot.swift */; }; - A18E791645056D5563206104A3E3AD87 /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 583998969C72F07BA9FDA89E5EBE6796 /* PostNotification.swift */; }; - A1F69DD3961B60955EFD28E2BDF446E8 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C829CB1A73B6C829F36B55FC6353B22 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A29D71806400C5A396AEB085F6AB5D2B /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = 58EEBF4678ECD0AB476599E085CB1D4A /* World.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A8B06933352034483F1654F21432FDCF /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE229B8054D29B99878D59189F07F68C /* Closures.swift */; }; - A9DA3829FA747E599023EF1394CD2EB5 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EC69C4EF126AE28CCA3F0A3085D895F /* BeVoid.swift */; }; - AB2B63BFFD7A11E6871B472150F7984B /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B0CE7CDCF6C972F42529D1F85E0EC13 /* NMBExceptionCapture.m */; }; - AC8B65A38D97CC9DEA534F4017720837 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6257107A1A729D6814F643FFF44ABA6E /* XCTest.framework */; }; - AD2D4354F429E4DBD49D327BD408A3EB /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44B09305E7DCB46CECE1EF85C05E1CEA /* NSBundle+CurrentTestBundle.swift */; }; - B09B3461D9467BA8A230048F95C26E0F /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA2F7596178927FD84F8A04E76CDFB5 /* NimbleXCTestHandler.swift */; }; - B09C23A80024C09EF252801C784E74BE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C8CBBF32C39839511129EB1C04B4277 /* Foundation.framework */; }; - B1825287DE872A038A4A44623EA54C1B /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B563492046E9F5198F9CB24DE5E5A3 /* Configuration.swift */; }; - B47F2B1F7F5FEC4CE62F09832392E842 /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 987EDB5E1E3B4E2E0C356380F09D7D87 /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B5CEF5D407E2642EA6E84C35AEDAE999 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6257107A1A729D6814F643FFF44ABA6E /* XCTest.framework */; }; - B6A67A3B998747E4290BF6010EC33806 /* FBSnapshotTestCase-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C1AC971E106C697F0F341D2A89BFF27 /* FBSnapshotTestCase-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B78A3DF47B5FEF7D9BE0B7660500211B /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36EB8BCB4E328BA8D5718066561F94EC /* Equal.swift */; }; - B8E35E15EE54E28EBC2E50D54A80285D /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 59B099B85514FAFA571CB2712263229C /* QuickConfiguration.m */; }; - BA1A5F000918695209BA441D08ABEFE0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C8CBBF32C39839511129EB1C04B4277 /* Foundation.framework */; }; - BA7362188C5D17958A5080EE299A90FC /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 937B4E412E4C1B8B3DC2F3AB6164A9C3 /* BeginWith.swift */; }; - BBE10615F3CD16FAF02BBD3D42B6D246 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DED50B8805DBC0C29D699899DC21E52 /* World+DSL.swift */; }; - BBF88FA3F28C0906DBB78314A8E50A01 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB2ECCA73CFA9724CF54790B9CA94D99 /* AssertionRecorder.swift */; }; - BD0445E39C97A49EAFD877DCA85EF8EA /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 856E2FDF76D15D359F10614E4CA48211 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BD6302ECE07C5DD92C9826E7E6C9DBA9 /* Quick-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 12D833954B0B9590C952733B5F482814 /* Quick-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BE5D30335800F92135A863320B15757C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C8CBBF32C39839511129EB1C04B4277 /* Foundation.framework */; }; - BEA76FA499D5899BD98DBD891FF921D4 /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572497090050D3BE1BEB6CD556B09382 /* SatisfyAnyOf.swift */; }; - C033C346AC287D2009457C31E85587D1 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C36DB6F05615EC71278526272A72BAD /* Quick.framework */; }; - C10896B1EEB0291A92FBA848007CD7CF /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79AE7B678AAF23FAFF6E6BDDCDE88312 /* NMBExpectation.swift */; }; - C360952381641F725C15758993A0F665 /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF3C95FEF7D0FD6C288789E9061CD70 /* UIImage+Diff.m */; }; - C755136BFCDFA000C44C8BBCA065E4BE /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BBE5432DE146838ACF242D31E4B0D1D /* HaveCount.swift */; }; - C81BEDE79545C013BEBBA0363480FD47 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077F88487EFD2154D5D18B73D0FE85AA /* DSL+Wait.swift */; }; - C8A959D4777884FEF0AC76BE0A56E1BD /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = A9DA4449E8BAEB6FE5331178C5D6CB12 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CBB70E882E7FE0FF926730EAA0CD59DA /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B95C44837CA080E45BC91C3C117C1CA0 /* ExampleGroup.swift */; }; - D39881E8AB50A77DABF756314695BF25 /* PrettySyntax.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CF342D0975EDCEBBA92D14E81D90E98 /* PrettySyntax.swift */; }; - D45096E61E72E772AF46C3BECA03583B /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DBDC23165E799874F5A468DD3948C63 /* BeLogical.swift */; }; - D5C30BC656C11AF60394E3180A217BB1 /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EA8353924C917823667BE3AEC84759A /* UIImage+Snapshot.m */; }; - D8E0C72DDE130D4471BB48D2081FD235 /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0ABF947A344EF6249D1254633B7A4383 /* Nimble-dummy.m */; }; - DE5F3C28CC8C40B8031C784835B3577D /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC20C3028482A1C39B66EE37A34FE92 /* MatcherProtocols.swift */; }; - E008736F5514F44C0E07DD052A7B6D67 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94614A40FE83CD21010E9D268F4D49CF /* AdapterProtocols.swift */; }; - E8DE03684C234604E472C27ECD8F6B70 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55196666FC4F151DD087CD7C72FBF79F /* BeAnInstanceOf.swift */; }; - EAA652557B70F493923A3447B5D64E0D /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = 15972504538C2E413FB24CBD8408A1EE /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Private, ); }; }; - EB5BA9C76733488A03A8A59552D1AB61 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = 805EF8DE398C0351120C158B885E1465 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ED6A0B20E661EA13A99C377E2213DC5F /* NimbleSnapshotsConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376CDF4C1B71DB76A4AE4C5BCE79CE3B /* NimbleSnapshotsConfiguration.swift */; }; - EF6A8905CF7DF656FABD150ADED75007 /* NSString+QCKSelectorName.h in Headers */ = {isa = PBXBuildFile; fileRef = 980943C71FEA98B02B51450ECEC7B45D /* NSString+QCKSelectorName.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EFE20ADE81CBE47F13D76267285C4A35 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF4FDE5A9EA303E1B54BD924B103FFD7 /* FailureMessage.swift */; }; - F0EAD2BC539C8BF0B074566D73D4C6DB /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 745133B5A25CA92A9797839FD93CBDA3 /* XCTestSuite+QuickTestSuiteBuilder.m */; }; - F35657C05DC39E78A33D79BDD92ECA64 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 6517892683F6AD0BBF0450F78A70BA8C /* NMBStringify.m */; }; - F47158C234C50FFB069A1EF8AB26D9F1 /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = CBE643D724DA425DE914965F29391791 /* FBSnapshotTestController.m */; }; - F614EFDFC958434F53DC770F8887170B /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = E31F4834698C0F6F52893A946585EABD /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F953B46C77C8981DBEC593D9FDCFA4C9 /* Quick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF58500988D3C4DF554D3E6A513D283 /* Quick-dummy.m */; }; - FA145DCE313D583C0431D178FB32C96F /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91FFCB7C7AA459BA3EE25C72706D13B0 /* BeEmpty.swift */; }; - FF0366DFC597745127A6D92AB83F0D60 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 564BE59103383EAE403B1669B03D2CF9 /* BeIdenticalTo.swift */; }; + 0070E47A02237D3859A9D7A4EF2EEDC4 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85798C74E8D5711916EE105D5E47B83A /* Callsite.swift */; }; + 051A816D6DD0CAE13496DDCFE0829167 /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1BCADBE865EEFF925BE466DFFD8DE0 /* UIImage+Diff.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 051B2AF789E6D4E648C099830025DED9 /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 721B2D2CB39F99CA4B933568A9EB93E2 /* CwlCatchBadInstruction.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 094973D2D2F1E3B2E772F93C8147C6B9 /* UIApplication+StrictKeyWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 08F27615A9B22DFB69BA8E4D8ACD4F7F /* UIApplication+StrictKeyWindow.m */; }; + 0A1A3DC52B83AA8A153A008710FCBFFA /* NBSMockedApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = E2E67510FA1E514C0F856B2FB92FCED2 /* NBSMockedApplication.m */; }; + 0A2CA8B0DD7E300ABFCF1956E6B58248 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 3381E07245E54891E0BAD56D129A1AA2 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0CE5AC5B25B951D7EE91A121E335D7FE /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 53F0C72129ABFC0D1D49C6830DC4CAE5 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0F64DE0C6ED690D291DE6FACB0014304 /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = DBF88F83E8B596E139DA02C0A7E5BC1F /* World.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 143433CE06FC7E8ACBC21EE35BED47DC /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 971035B1AB152AF0693CCDFE8BB93FC7 /* QuickConfiguration.m */; }; + 16409C737271C4F1D7FEEFB91E317D5A /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D14AFB722E994601EAADE306B4F8772 /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 17C8EE7DF3F57C8F99EAF63C6E61EA99 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D1858C286AA6E6D597558BD61456FB /* FailureMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 1A3E19B9F5EEB773C3BB61CA42F8BF62 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0AD8A7685DECF4EF468FCAE9C6ED387 /* DSL.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 1AB7934C16CE49DE196FFC7BE7278287 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96B5ABD5C638619E721E05BCDCF5E930 /* SwiftSupport.swift */; }; + 1E1CE28FFCCD7499620B47C910E9B9E9 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F014111226F1AF0BE6AF3A6123FF99D /* BeLogical.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 22E9F6FA56858A5F7A5D664E5968ECB0 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = B1AA4EB0D4E7F45CF4558722592A5057 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24670236AEC11DE2259467E9C9822C60 /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F89AE88C9B0E8DBA607ED9E1466477 /* HooksPhase.swift */; }; + 24E857640F46E9D5B4FB7F22BD6A33B6 /* HaveValidDynamicTypeSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = F432C49C0BD6BC34E574525E34685F72 /* HaveValidDynamicTypeSnapshot.swift */; }; + 25D1805055756CAA69A167CA03B2465C /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFA8033526D88C851418921E64A8DF0A /* ContainElementSatisfying.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 25D7312BBE513DAB0ACBC1814DDC7C86 /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7591A3875ADA72EAB080B8F017C9980 /* CwlDarwinDefinitions.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 29A50416AE8AEBEDD36399986598676B /* NBSMockedApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = A098AD9360F8FD1B4051DAC87662979C /* NBSMockedApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 29A65FF7D1752DFFF87F5DC8F55CE859 /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1B4151C43C0E14BE2EC97DA938A0FF /* ToSucceed.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 2B54751A0A4669649E6B1039AC8870B7 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D7F619EC43A744450634F3F40C2260A /* Example.swift */; }; + 2E6730CD6DFCFE1212EDE5343F2E099B /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57D8E77C370EC1C42445F86EC686F23 /* CwlCatchException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 2F2DA5BA5AE1FB074F387E97115F47D5 /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 11D91E3A00AE7F2A1839F012F12A2699 /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2F485B69F51E4F723A38410F31F08550 /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3472CA7911C6A53A6026B43F64783B3E /* FBSnapshotTestController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 31C39ED8CB1C9317F1F2840FC919662D /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 203339FB12959585A1F7CBC8324C957F /* PostNotification.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 32B38992751B96F21324BFC9923BFCBD /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 533CF5274E96FAF6C5F33E724535C1A7 /* AssertionDispatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 35CCEBDFF67DD636A9301709FF7DD23B /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135867DE3632443114C169BE8EFE369E /* ExampleHooks.swift */; }; + 35DD05FD595A6FE7F5A0692D12E319DC /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = A04467FC73E92C278F91D39E771A1AE4 /* UIImage+Diff.m */; }; + 375A955DBD71AEFD185E729BA970F755 /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43FA92285155B8898E80E9BDD62B470 /* SuiteHooks.swift */; }; + 37C5AC3FE6711A1117819AC5A18EE5C4 /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF4E5D4D9ED4D95311E44AEFC99A5C4D /* CwlBadInstructionException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3B3A88E074630B1EBC2139F4F70F0443 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8CD6ED16BC5E27D432F81F0265B79EE /* ThrowAssertion.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3C66D2692E811DAE57A244A67E7AC555 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A71951088358F1FF7351DDF0CD8E846 /* BeVoid.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3D1A89FDD6B579BAA92AD398E5C019F9 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 718552A0A58EA3B7F10940B01FA10CFF /* EndWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3E04D23B2995705A6106D41F3E3E4E33 /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47FCF6792A8663BA26208C7A4AB66C12 /* ExpectationMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 421CDD701AEE0F2458A84200366CDD0F /* UIImage+Snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C081BD8731C2742BDE014F6369CA3E /* UIImage+Snapshot.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 4377B0EBB0D9D71671767F5EE0E569C7 /* DynamicSizeSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = A92C810B1A837E43E9D54DE3EDF1D21F /* DynamicSizeSnapshot.swift */; }; + 453982D62FB186B3AE2C4D3EF96DB5C0 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 363F7DC39CE1D40BCAF6A5EB1EBCB479 /* World+DSL.swift */; }; + 45F183320C688F9978649F30ABE21D09 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF11943C33369B2227B7C0589C17284F /* MatchError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 47699DC316EBBF997D8BD9A40F9F6CB3 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859E33F6FF8DC4509F4291F6D9327F53 /* DSL.swift */; }; + 483FDA74FEC933E1A53FA25E794A0443 /* XCTestObservationCenter+CurrentTestCaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 76A010B2CA654F5B26FD679A61C02EEC /* XCTestObservationCenter+CurrentTestCaseTracker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4CDACD8A5A6CFB688838AA988E7D1E43 /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 075AC900892E9340FCC45D6CD75C8A3E /* Nimble-dummy.m */; }; + 4D68C35510D1E911C9B89840FC4B777F /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F1904AFD4C66E09A8CA2524BBA126D3 /* mach_excServer.c */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 4FABBF5CA8F735F48035BE4144613CB7 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5705500F4611A1BDC73930A242064F4 /* Expression.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 50698F14E7847E18B907E9373FBF4C21 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FBC47DA706DBF982E54AA5ACC39EC9 /* Foundation.framework */; }; + 506D761F91EC3583789A837C559972FE /* FBSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 034F38A1591242E74C7F882D0050E7F4 /* FBSnapshotTestCase-dummy.m */; }; + 531C54B1C10BA0F17A2B7D81D02BD390 /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = A09AD3678AF70E0AB4501AA461AEA532 /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 532CABEF91DB2879ED3E754AE86A7CFF /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50262E9ECE7EA3FB917A6A951DB70AA7 /* QuickTestSuite.swift */; }; + 54CC2049C937561A469575AF9E6A6FE9 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065A0BF2405C3324CE1BA7B7B176D0F4 /* NimbleEnvironment.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 58C0125D796A97541FDE3414001D8A92 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1AEFF0BA56D733E73AA25F7EC966741 /* BeEmpty.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 58D964317DFBB10F54A273CB12843017 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED18B077C599A8A8058ED790C8AB83B /* BeGreaterThanOrEqualTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 5AB9DB61D62D8BF7B1C734B373F361E7 /* CurrentTestCaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = F193C309F3908B909B9A66956A84F009 /* CurrentTestCaseTracker.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 5BF274C2DEF332ED79B1CD15CFEC3498 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9986C787D46DE624CA5B7EEE59A653 /* ThrowError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 5C847F3744756CF256EDD51417E7E4DD /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = 50B6FBF0A7E6501AFA040EA6C7F005AA /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5DBCC0E4C72649C9A39A00D40D944DDA /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1799A89DACFB50FD2A84987B1BA206ED /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 622FC42D6430DD14EC15A74FD91C1002 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06DD029A3EDBE8A1D68E460BB1C997C1 /* XCTest.framework */; }; + 6236BE5FA5B5B8A0B39104A94F3CD782 /* HaveValidSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F487892C59C423988923E1CA530F1A1 /* HaveValidSnapshot.swift */; }; + 62D26CE7BA3AEDB4E5E87218FDCBBA90 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C71CD6BC16A489A6A9AF200AA99BCB /* Functional.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 64819C8D4EBD3386377D0F84DC909F8B /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BFF705475974CD221D01438C2DF43D2 /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 65985C142EE8A74E6E56D5E30A39C79C /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40BEC66949516F59EED0551B1F3397A3 /* Expectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 68FD03C72D719117929696B62038B3D7 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E703D260C38B084B163C46D80B5AFA8 /* NMBExpectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 69DA8B003216466C60F029CBD79897F1 /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = 01C0FFD6D93A251EF9E96E771C6E2EF1 /* UIImage+Compare.m */; }; + 6BB0EBEB4730B94AC07458E398D142C8 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17920C2F02A88BAA625AF2F5011A255 /* MatcherProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6CB4890B9BF5F846E980634AFE83917D /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = AAE5E81416B805116EC9318387C6F093 /* NMBExceptionCapture.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 70818FADE7AACFF3AE55DCE71D3E49A9 /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = C79E090FB62B2DA3EDF8FEAAD8C8A6DC /* Closures.swift */; }; + 73BC5AC2ECDB8722E085F14B53E0D24E /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB839AC295750FD978DFE177D6D4356 /* AssertionRecorder.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 74A7C826ED390EF61C25C69BB5A9C5B6 /* PrettySyntax.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AEBB1CD9FBADB97A5F9A4848AEEFE7 /* PrettySyntax.swift */; }; + 75538A8B20C7A20AF3D54BBF35D56FFE /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AE80509440006C26690035603A2F362 /* BeLessThanOrEqual.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 756564ABAF2892FE7140C92A1CDDCF65 /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = B250DB9938D26EE47395351C47272DC3 /* UIImage+Snapshot.m */; }; + 75ABB48E3C30C2D736C3D05D6FD566A8 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DB7F3A8704817ED0DC57AF58481E73F /* BeNil.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 7E0C9AE6468A5DF91F0F4C7A387D725C /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD8AF56ED604327B2339C3E41C7782E /* BeAKindOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 7E9B14D5F8842A86CA86F2AF45230725 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06DD029A3EDBE8A1D68E460BB1C997C1 /* XCTest.framework */; }; + 7FC992F4BD0376ACB4F97F9180B0F0B5 /* FBSnapshotTestCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC05FFCDBC43073BECB34E4AFEF85F02 /* FBSnapshotTestCase.framework */; }; + 804603755C246C88807BFA9BD2B03AEB /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8437017A33D1F36EE2E52375DA263D65 /* ExampleGroup.swift */; }; + 8170866E2ACE0ACFBC6D90081354EC65 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE7BA35F9EF37BC06C8750A40430C2B /* Stringers.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 841FF232C33C7D49C58CEFDBE7EEB92B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAF76EE06934D8A8AC0A7205A589C3D6 /* UIKit.framework */; }; + 87B09AC69ADAC2ADF5243BFB06B5B30E /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = F50D955E2936283EC2620C1A774A9E05 /* NSBundle+CurrentTestBundle.swift */; }; + 8B55BD430033027AD5FF22D630DD9F62 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 0734AE6B283CE8FE6B2D06D408E5F386 /* DSL.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 90C0CC6A63AB8AE0D63FE74846DAA1F8 /* Pods-TRXTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C14A754159ACE9664C012B542D511B8 /* Pods-TRXTests-dummy.m */; }; + 91D0138ACFAD733E4061F12E450C336C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FBC47DA706DBF982E54AA5ACC39EC9 /* Foundation.framework */; }; + 91D400CC851F516E785B032662E4FDD8 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70D8AC5990C544716D52E500CC8B75F0 /* Nimble.framework */; }; + 947C4FB60AF70037C1A258F15D3DCB3F /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9B3BD81C50A54D1AE53B16F9B2A0090 /* ExampleMetadata.swift */; }; + 96132E7432F8DD315A88A07C6B4F9C72 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C25014841168129127E166118824F54 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9673CF780F48C8E4EC2A331717B1F67C /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B7A4EB17EA0632FC2818C0CA29D9AF7 /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96C7558B42ED7A8A33EAC8A94677A5B2 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 115892C2E9618E41C58FA400A6DF6531 /* Filter.swift */; }; + 988EED125395950177DC14AF9BC87D8D /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28F7030A0A4ADC5C72B4198DAAA63274 /* HaveCount.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 9976E6F0C1DAF10A8E6E512DBDBD2786 /* NSString+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3464BECF7B951227207183625713B339 /* NSString+C99ExtendedIdentifier.swift */; }; + 99ED13BA15822FD5AEE570B9002C37A8 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAF76EE06934D8A8AC0A7205A589C3D6 /* UIKit.framework */; }; + A165E7F1F547BABA8BD22537D083607E /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32945B43078E3A23C6F9A76964C74CE0 /* Configuration.swift */; }; + A1A449AFBFE2B317DFA1D812CF3DBDE4 /* Quick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CFFB5A889670669ED1FBE235470FFD7A /* Quick-dummy.m */; }; + A275B84CFA9CF6A8788540C8DCEA6214 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = DC37FE121A8E56EB497238009ED03D5B /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A2ACDD3235110F6981004483CE60476F /* CurrentTestCaseTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DD9EAAD01BE2F866F0427DF9F3C07A0 /* CurrentTestCaseTracker.swift */; }; + A3758C19FA6A1E0C0F30EE2DC94AB303 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 707077DF291B93CA37D818CB47971E9E /* QuickSpec.m */; }; + A4F69F3477A935285620AC3031C5C848 /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = 379D414C3BFDF72F20ABE29605708C6C /* FBSnapshotTestController.m */; }; + A61ADD214AA182EEB2AC95EA3F3D658F /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B1B24C6925273400469A8A844FE3ED5 /* XCTestObservationCenter+Register.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + A74537420FF0CEDC6B9E82E1DC4C2B15 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38FF49C1EC422751EFB68E1679AF8DC6 /* Contain.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + A7C13C62E4116CA964A3E82179092AD5 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C615717CEB001476EE73E389BECC1D0 /* NMBObjCMatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + ADEE95A3A188BE3095990E20766BCCC8 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 456B897F5107980B5A82C434B373C85E /* DSL+Wait.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + AE4DA49ECD693BF384CD824DF02D7C6E /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = D81DE72B8908E397DB13868960F3FB84 /* NMBStringify.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + AED58B976AB8F62FBFB0DA437861E088 /* PrettyDynamicTypeSyntax.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BEF3643F8770AAF2FF637E8DD6BAEB9 /* PrettyDynamicTypeSyntax.swift */; }; + AF1174085D9BC5D50FCE0480E9C2BE94 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = C47D144D5E74D6986BC57DD90673FCD0 /* BeGreaterThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B102ABE4E54B71B3D2C2118E2782FAB9 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A2EEEA6E480B661AE6D375672436A15 /* BeLessThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B27DFD6025D94758785918F1D6F6C060 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E21267FD47DF4606165864334B2A3BBB /* QuartzCore.framework */; }; + B2C151B20635A480E1937E3D2B509BB4 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7F519027C542475CE4DA518899534F /* Async.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B37D0376FCEB3133F44CF5F4416C58E1 /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4209D4899C4E99A84CAB22EF699AADC2 /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B758FB09FE2C06C1B8E36A71A9D76D41 /* FBSnapshotTestCase-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9010C7CEC9443417BDC864744899455C /* FBSnapshotTestCase-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BB6EC3B43400455F2FC454D5629BBCC9 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F28C181F5B8C307678E4EE317C2CAE /* QuickSelectedTestSuiteBuilder.swift */; }; + BC7B9761322C74FA27969BD55833BA47 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F24A389460B60CBB3D0AAFD0DFEB388 /* Errors.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + BC952FC04FC963C1294DCD619C9B6B3B /* UIApplication+StrictKeyWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A7354BF233637D454776923888F68C4 /* UIApplication+StrictKeyWindow.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BD98E6990728E1DFB3936C840A154B42 /* QuickSpecBase.h in Headers */ = {isa = PBXBuildFile; fileRef = E8DB307D634D55A843753E20D4E24843 /* QuickSpecBase.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BE14F2198CDB0DAD98A567981D21C7A1 /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = ECA28284E7E021D204700966F129499D /* FBSnapshotTestCase.m */; }; + BF3B7218901760A6226C7F6346BEF454 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 050ACF58357C51C3A5418B9DF1DA92C2 /* BeCloseTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + BFCE460CC33E8872B7156D4166340178 /* FBSnapshotTestCasePlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = DACC6B76852446A41A604A87C46C5B8B /* FBSnapshotTestCasePlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C06FA100C1BBEE34B863BCB8A65359C1 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A39592892EF374D62E2FABE47E49DF9 /* MatcherFunc.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + C15ED5F53432E86C1F858A2E0C37A93E /* QuickSpecBase.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C734A3CD84E67127F60C0E4CF6BCD8 /* QuickSpecBase.m */; }; + C1D862177DC2999FAC710AC25F253BD0 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD11F4279442D689C9DF48C23623D7F2 /* BeAnInstanceOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + C365D0F41EBC7BDE6877581CB2494E03 /* XCTestObservationCenter+CurrentTestCaseTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = C1D1AD64B77F1F3FFE94699F2EBB80F3 /* XCTestObservationCenter+CurrentTestCaseTracker.m */; }; + C3B1A7E0024A06554CBE973A69DFEDA2 /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = C2690758C845E67B6DF367CA5A0402A3 /* CwlMachBadInstructionHandler.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + C8320A6164C870ADDB8A855ADEBBBDC9 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCDADB2337C8F79EAB7BE3514D21BC67 /* Equal.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + C89AFDB74F093530794264BF33F0AB32 /* Nimble-Snapshots-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F95C5E12A60A61B1FD31F1311E36A044 /* Nimble-Snapshots-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C907DC9A1F3C78CD7F5DBDB699289C0F /* Nimble-Snapshots-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FAF22BEA2B236C341DAC6C1027549E89 /* Nimble-Snapshots-dummy.m */; }; + CAFA5E486BCE117A7D8C0FBF9DA6666B /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BF4A482E17E859BCE16E6553F102028 /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Private, ); }; }; + CC47487DC7F837212FE8F97FDB805F15 /* Pods-TRXTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E1643A09ACFEBCACE7170E14E1D67928 /* Pods-TRXTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CCDAF11E7AF29E720C587B038145F622 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDAEB6226E51320042405B77FD19FB71 /* BeginWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + CDF0D6A7968DD28468B08F264820AFAF /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A5F510614DBC6D564C8C78CC045C204 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CF55697859D633C852C3586384647EB6 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFC6DEE05C822C2D76C4480902B26BA4 /* NimbleXCTestHandler.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + D1082E58F18E25BA41781F499EFFF0A5 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 711983F7DB715AC8E7DB732E6331F96D /* World.swift */; }; + D189E749DFA7ACB8F2CD52AD6A0FC5BA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FBC47DA706DBF982E54AA5ACC39EC9 /* Foundation.framework */; }; + D408A6EC57EC4AB7573C906DE73D48EC /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = E741C70862BB3ED4451E935E6A745DA7 /* QCKDSL.m */; }; + D606AF010FCD76080470EF71F93D8410 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B545412741032AD780091FD4A3C195 /* ErrorUtility.swift */; }; + DADF7748F7F8C649B83324622B1F74EC /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = FA37C80A226F86FA006849BE83AD2D6C /* World+DSL.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DB7A106243AC974FC7EBEB00B506C786 /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = 77EF91B600488DFF10C9DAD052252383 /* FBSnapshotTestCasePlatform.m */; }; + DF026F6F406A4FB6CEA63B0A4B9E27DD /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F2BD4D16AB849E169B12E8C53D9B16B /* AllPass.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DFC8C1E93959549CFEE5BBE6928ACB42 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FBC47DA706DBF982E54AA5ACC39EC9 /* Foundation.framework */; }; + E7C675C1460BB65C9EECEA98F21CA89E /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06DD029A3EDBE8A1D68E460BB1C997C1 /* XCTest.framework */; }; + EAAA05EBBC34225C0DB45797712E24A1 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1297C63E8BB9A376FBD2776F80A7634 /* AsyncMatcherWrapper.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + EAE2AAE5EB826B38978692984BB22FDD /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 583DE4597309AE31BA9A46AC02A254B1 /* RaisesException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + EB3A73071ABA60E77E0704649637D8BD /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA7D2DCE08F745683EA19AF07CEE757 /* SatisfyAnyOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + EF8548E0C37E8888D9DDC11ED89D3568 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A11D2B4B49F38B1A6728A9E8166255AC /* Predicate.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F1DE6A63148913147FF0E037C73F8B09 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FBC47DA706DBF982E54AA5ACC39EC9 /* Foundation.framework */; }; + F28003B228B82B7E1497D4F41F55A31E /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = A52B5E32F17C90CF738651DDD4511BCD /* Match.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F3BAA36614ABDBC0538B0DEA99CF80A0 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ED16FBF661E90B1F84EECFC224C74E5 /* SourceLocation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F4BD249C60F21F5E0F7C1FAC8A5BC2AF /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = F59BE72513A0FCCF2D6E8108A119442E /* BeIdenticalTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F6C9A5A3FBB40489F4902DA413E6D708 /* Quick-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BD3B318E963EE6E6A184D5526443545E /* Quick-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F85171F2D78C81422E38DA990CD9B319 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18B132201C09AB18FDDCE23633A063A0 /* URL+FileName.swift */; }; + F9649DD59BAEE88C6864EEFE73ECA88C /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B986298A57B18A06D13616CB4407920 /* AdapterProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + FB433A84B0A557CD5E5948A8B6705024 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C608C1BB8B3AC28DCEB86C234510F72 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FBD9388D2209675432B58D713CAA4B01 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E1CCA8CE5BFC48A7CF982D761ED9B8C /* XCTestSuite+QuickTestSuiteBuilder.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 16C4770CBDC3D282CE859382E56BE2BE /* PBXContainerItemProxy */ = { + 3CED1AD2DAD4C152F79A687D93BB6BFC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 40FF1C77152F384080A1A02E90A36DA9; + remoteGlobalIDString = DD7C8BF89FE8053D0A2A2D88BB49CF07; remoteInfo = Nimble; }; - 3076B96971D7C121D44AE85AA8BD8D91 /* PBXContainerItemProxy */ = { + 4056FFC91A14DDA4FB1C00B86D6B0073 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 5DB46EA499F9A5E22765121102FCC34B; + remoteGlobalIDString = 34CD2E3428AB802BACA62286FF5074B1; remoteInfo = FBSnapshotTestCase; }; - 67B84CC48124DDE2ADD9AFDFBAEE034C /* PBXContainerItemProxy */ = { + 407DF4C5265E64239AE297FBC8EDF2F8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 5DB46EA499F9A5E22765121102FCC34B; - remoteInfo = FBSnapshotTestCase; - }; - 7839961D148D585620FA3CB1EEE772EF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 40FF1C77152F384080A1A02E90A36DA9; - remoteInfo = Nimble; + remoteGlobalIDString = 6B8D2C966D4D7E5D2DF4A6BADFEF6290; + remoteInfo = "Nimble-Snapshots"; }; - 7B73A1A618322F16D02EC89ED7B2076D /* PBXContainerItemProxy */ = { + 5353CAC70EC628944A98543A0891A077 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = A5C430B1E2D8298FD6C5403590C0B80F; - remoteInfo = Quick; + remoteGlobalIDString = 34CD2E3428AB802BACA62286FF5074B1; + remoteInfo = FBSnapshotTestCase; }; - ACE5A968F36AB56BBFB9D1C9D951AD10 /* PBXContainerItemProxy */ = { + 642A89DF7D1D49DA93E3B815E53B2FCE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 9A3AE440FB23CCC076AA408C3C4836C4; - remoteInfo = "Nimble-Snapshots"; + remoteGlobalIDString = DD7C8BF89FE8053D0A2A2D88BB49CF07; + remoteInfo = Nimble; }; - AD8D9E5C1E2A5E186BE6CD546248CF51 /* PBXContainerItemProxy */ = { + DEDDF0B41AE8B5CA083EDB55C7000C53 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = A5C430B1E2D8298FD6C5403590C0B80F; + remoteGlobalIDString = 8264CB4234D8D7CA47AFB08BB6EBBCF4; remoteInfo = Quick; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 01BF96909EDC4CCB6D8E5693F8D37092 /* FBSnapshotTestCase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSnapshotTestCase.xcconfig; sourceTree = ""; }; - 0279B430D9728C12FCC154306B21AAC7 /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; - 0401507CF8C223BBA0935EF757D1293D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 05AEE152EDF65EE475EA3BBA0B128AF6 /* UIImage+Snapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Snapshot.h"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.h"; sourceTree = ""; }; - 077F88487EFD2154D5D18B73D0FE85AA /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; - 0AB5FC980EB77B65815ACB8F33387100 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; - 0ABF947A344EF6249D1254633B7A4383 /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; - 0B41C94CDDB8E92732838471FB3E4E52 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Nimble.modulemap; sourceTree = ""; }; - 0BA192C5E2CB68E8C922B352AFF1A18F /* Pods_TRXTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TRXTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0C1AC971E106C697F0F341D2A89BFF27 /* FBSnapshotTestCase-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-umbrella.h"; sourceTree = ""; }; - 0D6A7CB967FB30ABD7519E562C1B21F7 /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/NimbleObjectiveC/DSL.m; sourceTree = ""; }; - 0E39919745142DBFA9E9A13766F238D4 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = FBSnapshotTestCase/SwiftSupport.swift; sourceTree = ""; }; - 11BFA072BC85223ADDBDE3D73F35C9E6 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Quick/DSL/DSL.swift; sourceTree = ""; }; - 12D833954B0B9590C952733B5F482814 /* Quick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-umbrella.h"; sourceTree = ""; }; - 15972504538C2E413FB24CBD8408A1EE /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = ""; }; - 1BBE5432DE146838ACF242D31E4B0D1D /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; - 1F2E910834C78FF33CCC5435FC2B30BC /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = ""; }; - 24AE05986ED0C8EE52848FBF33418273 /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = ""; }; - 24C503FEA6BBF87FE7B6C59FB4ECCFE4 /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CurrentTestCaseTracker.h; path = Sources/NimbleObjectiveC/CurrentTestCaseTracker.h; sourceTree = ""; }; - 24D858940B934FE9F5F607BC07086B78 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; - 273912E71B275A8F839A141B6335614A /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 28FD848AFC07C090348CAF492401F36D /* Nimble-Snapshots-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-Snapshots-umbrella.h"; sourceTree = ""; }; - 29CB98A16E0D456241ACFA378ED0A2AF /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; - 2B0CE7CDCF6C972F42529D1F85E0EC13 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/NimbleObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; - 2DBDC23165E799874F5A468DD3948C63 /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; - 303E271048DBBB0E4208E77C28941637 /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; - 35E21278E64AA798C95FD9DEFA9FA3F9 /* NSString+QCKSelectorName.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+QCKSelectorName.m"; path = "Sources/QuickObjectiveC/NSString+QCKSelectorName.m"; sourceTree = ""; }; - 36EB8BCB4E328BA8D5718066561F94EC /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; - 376CDF4C1B71DB76A4AE4C5BCE79CE3B /* NimbleSnapshotsConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NimbleSnapshotsConfiguration.swift; sourceTree = ""; }; - 4064EAC3E026BE12B1FC07E21A898318 /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = ""; }; - 416DCDCE6819617145DEFCA518A50810 /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; - 44B09305E7DCB46CECE1EF85C05E1CEA /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+CurrentTestBundle.swift"; path = "Sources/Quick/NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; - 4613CD7A9A219611CC5C966F2A544B7E /* UIApplication+StrictKeyWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+StrictKeyWindow.h"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h"; sourceTree = ""; }; - 4948BAB46EEC9A11A941BC84AE265BE4 /* World.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = World.swift; path = Sources/Quick/World.swift; sourceTree = ""; }; - 4A5BA45404994D810AF32680D5494917 /* FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSnapshotTestCase-dummy.m"; sourceTree = ""; }; - 4AA88B172ABDA94F6478E9AB0B22494E /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; - 4AB4672ADD7CC732E317AD387E9029D7 /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; - 4C829CB1A73B6C829F36B55FC6353B22 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; - 4C9C962771DD2B1B049F98918116DABE /* QuickSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpec.m; path = Sources/QuickObjectiveC/QuickSpec.m; sourceTree = ""; }; - 4E5718B90C7279FB3375B883E7F11A60 /* HaveValidSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HaveValidSnapshot.swift; sourceTree = ""; }; - 4EA8353924C917823667BE3AEC84759A /* UIImage+Snapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Snapshot.m"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.m"; sourceTree = ""; }; - 55196666FC4F151DD087CD7C72FBF79F /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; - 564BE59103383EAE403B1669B03D2CF9 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; - 572497090050D3BE1BEB6CD556B09382 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; - 583998969C72F07BA9FDA89E5EBE6796 /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; - 58EEBF4678ECD0AB476599E085CB1D4A /* World.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = World.h; path = Sources/QuickObjectiveC/World.h; sourceTree = ""; }; - 59B099B85514FAFA571CB2712263229C /* QuickConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickConfiguration.m; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.m; sourceTree = ""; }; - 5AD55F3974939097556240403DEE2DFF /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5CE0F74F3D19787D4C2D38C5D26D5211 /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; - 5DBE39329559FFC9790A4BB9CD44876E /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; - 5ED636BB81D1B1CF2C46AF06EF4E99B7 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; - 6257107A1A729D6814F643FFF44ABA6E /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 6517892683F6AD0BBF0450F78A70BA8C /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/NimbleObjectiveC/NMBStringify.m; sourceTree = ""; }; - 66E7F921A5FA484CAEF02A7C6DB6EB13 /* Nimble-Snapshots.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Nimble-Snapshots.xcconfig"; sourceTree = ""; }; - 680F72D45438C78D0EB35E4A30032748 /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/NimbleObjectiveC/DSL.h; sourceTree = ""; }; - 6B1803B89967D1E59EBF19A30CEB68A2 /* World+DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "World+DSL.h"; path = "Sources/QuickObjectiveC/DSL/World+DSL.h"; sourceTree = ""; }; + 00F89AE88C9B0E8DBA607ED9E1466477 /* HooksPhase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HooksPhase.swift; path = Sources/Quick/Hooks/HooksPhase.swift; sourceTree = ""; }; + 01C0FFD6D93A251EF9E96E771C6E2EF1 /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = ""; }; + 034F38A1591242E74C7F882D0050E7F4 /* FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSnapshotTestCase-dummy.m"; sourceTree = ""; }; + 050ACF58357C51C3A5418B9DF1DA92C2 /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; + 065A0BF2405C3324CE1BA7B7B176D0F4 /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; + 06D4F17CF51F125886E02ABBBF6B8B60 /* Quick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Quick.modulemap; sourceTree = ""; }; + 06DD029A3EDBE8A1D68E460BB1C997C1 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 0734AE6B283CE8FE6B2D06D408E5F386 /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/NimbleObjectiveC/DSL.m; sourceTree = ""; }; + 0744337D5B0C7F295F047983EE5D5FC2 /* Quick.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Quick.xcconfig; sourceTree = ""; }; + 075AC900892E9340FCC45D6CD75C8A3E /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; + 08F27615A9B22DFB69BA8E4D8ACD4F7F /* UIApplication+StrictKeyWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+StrictKeyWindow.m"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m"; sourceTree = ""; }; + 0A2EEEA6E480B661AE6D375672436A15 /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; + 0BA192C5E2CB68E8C922B352AFF1A18F /* Pods_TRXTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TRXTests.framework; path = "Pods-TRXTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 0C615717CEB001476EE73E389BECC1D0 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/NMBObjCMatcher.swift; sourceTree = ""; }; + 0D7F619EC43A744450634F3F40C2260A /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = ""; }; + 0E1CCA8CE5BFC48A7CF982D761ED9B8C /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; + 0F487892C59C423988923E1CA530F1A1 /* HaveValidSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HaveValidSnapshot.swift; sourceTree = ""; }; + 115892C2E9618E41C58FA400A6DF6531 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Quick/Filter.swift; sourceTree = ""; }; + 11D91E3A00AE7F2A1839F012F12A2699 /* mach_excServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h; sourceTree = ""; }; + 12C71CD6BC16A489A6A9AF200AA99BCB /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; + 135867DE3632443114C169BE8EFE369E /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = ""; }; + 1799A89DACFB50FD2A84987B1BA206ED /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; + 17B545412741032AD780091FD4A3C195 /* ErrorUtility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtility.swift; path = Sources/Quick/ErrorUtility.swift; sourceTree = ""; }; + 18B132201C09AB18FDDCE23633A063A0 /* URL+FileName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+FileName.swift"; path = "Sources/Quick/URL+FileName.swift"; sourceTree = ""; }; + 1A1BCADBE865EEFF925BE466DFFD8DE0 /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.h"; sourceTree = ""; }; + 1D14AFB722E994601EAADE306B4F8772 /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlPreconditionTesting.h; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h; sourceTree = ""; }; + 1DE3F8907455621DC03D013F756C7421 /* FBSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-prefix.pch"; sourceTree = ""; }; + 1ED18B077C599A8A8058ED790C8AB83B /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; + 1F1904AFD4C66E09A8CA2524BBA126D3 /* mach_excServer.c */ = {isa = PBXFileReference; includeInIndex = 1; name = mach_excServer.c; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c; sourceTree = ""; }; + 1F24A389460B60CBB3D0AAFD0DFEB388 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; + 1F2BD4D16AB849E169B12E8C53D9B16B /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; + 203339FB12959585A1F7CBC8324C957F /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; + 273912E71B275A8F839A141B6335614A /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Quick.framework; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 28E59892C56B0098E0C6907E0B18D890 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 28F7030A0A4ADC5C72B4198DAAA63274 /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; + 2A5F510614DBC6D564C8C78CC045C204 /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = ""; }; + 2A7354BF233637D454776923888F68C4 /* UIApplication+StrictKeyWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+StrictKeyWindow.h"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h"; sourceTree = ""; }; + 2A7F519027C542475CE4DA518899534F /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Utils/Async.swift; sourceTree = ""; }; + 2BF4A482E17E859BCE16E6553F102028 /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = ""; }; + 2C25014841168129127E166118824F54 /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/NimbleObjectiveC/NMBStringify.h; sourceTree = ""; }; + 32945B43078E3A23C6F9A76964C74CE0 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Quick/Configuration/Configuration.swift; sourceTree = ""; }; + 3381E07245E54891E0BAD56D129A1AA2 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; + 3464BECF7B951227207183625713B339 /* NSString+C99ExtendedIdentifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSString+C99ExtendedIdentifier.swift"; path = "Sources/Quick/NSString+C99ExtendedIdentifier.swift"; sourceTree = ""; }; + 3472CA7911C6A53A6026B43F64783B3E /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = ""; }; + 363F7DC39CE1D40BCAF6A5EB1EBCB479 /* World+DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "World+DSL.swift"; path = "Sources/Quick/DSL/World+DSL.swift"; sourceTree = ""; }; + 379D414C3BFDF72F20ABE29605708C6C /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = ""; }; + 38FF49C1EC422751EFB68E1679AF8DC6 /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; + 3A39592892EF374D62E2FABE47E49DF9 /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; + 3C86D0B43EBE736423AF4DA3DF132383 /* Nimble-Snapshots-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-Snapshots-prefix.pch"; sourceTree = ""; }; + 3DD9EAAD01BE2F866F0427DF9F3C07A0 /* CurrentTestCaseTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CurrentTestCaseTracker.swift; sourceTree = ""; }; + 40BEC66949516F59EED0551B1F3397A3 /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; + 4209D4899C4E99A84CAB22EF699AADC2 /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlMachBadInstructionHandler.h; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h; sourceTree = ""; }; + 456B897F5107980B5A82C434B373C85E /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; + 47FCF6792A8663BA26208C7A4AB66C12 /* ExpectationMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpectationMessage.swift; path = Sources/Nimble/ExpectationMessage.swift; sourceTree = ""; }; + 4A52B274D15286A53775032D69E8616C /* Nimble-Snapshots.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Nimble-Snapshots.xcconfig"; sourceTree = ""; }; + 4C608C1BB8B3AC28DCEB86C234510F72 /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/NimbleObjectiveC/DSL.h; sourceTree = ""; }; + 4E703D260C38B084B163C46D80B5AFA8 /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/NMBExpectation.swift; sourceTree = ""; }; + 50262E9ECE7EA3FB917A6A951DB70AA7 /* QuickTestSuite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickTestSuite.swift; path = Sources/Quick/QuickTestSuite.swift; sourceTree = ""; }; + 50B6FBF0A7E6501AFA040EA6C7F005AA /* Quick.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Quick.h; path = Sources/QuickObjectiveC/Quick.h; sourceTree = ""; }; + 50FBC47DA706DBF982E54AA5ACC39EC9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 523920F4E7F228A50347C33BD70EC0A7 /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; + 533CF5274E96FAF6C5F33E724535C1A7 /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; + 53F0C72129ABFC0D1D49C6830DC4CAE5 /* QCKDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QCKDSL.h; path = Sources/QuickObjectiveC/DSL/QCKDSL.h; sourceTree = ""; }; + 583DE4597309AE31BA9A46AC02A254B1 /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; + 5AE80509440006C26690035603A2F362 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; + 60D1858C286AA6E6D597558BD61456FB /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; + 64AEBB1CD9FBADB97A5F9A4848AEEFE7 /* PrettySyntax.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PrettySyntax.swift; sourceTree = ""; }; + 6B7A4EB17EA0632FC2818C0CA29D9AF7 /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = ""; }; + 6B986298A57B18A06D13616CB4407920 /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; 6C14A754159ACE9664C012B542D511B8 /* Pods-TRXTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TRXTests-dummy.m"; sourceTree = ""; }; - 6D0A57AA107F4292506163947E3CF583 /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = ""; }; - 6D68BF9F862FF0965CB7B308F1E3374C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 6EC69C4EF126AE28CCA3F0A3085D895F /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; - 6F1078D6737E32952C35C9AC1874F492 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; - 745133B5A25CA92A9797839FD93CBDA3 /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; - 765B6134855876AACF2AABC79875AA9D /* Pods-TRXTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-TRXTests.modulemap"; sourceTree = ""; }; - 76DB4B5E7898B25E3F577B7641E60510 /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = ""; }; - 780E500297492BD494198765A72D0F4A /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; - 78BDCA0C1C56DE01861267A80E40AB4D /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 79AE7B678AAF23FAFF6E6BDDCDE88312 /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/NMBExpectation.swift; sourceTree = ""; }; - 7A587A1D3F23BEE74E95F9AE52EAE864 /* UIApplication+StrictKeyWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+StrictKeyWindow.m"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m"; sourceTree = ""; }; - 7DB34BF24FC34A36FD4FD1D23B70E0D8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7EE6E46DBD550BA5110C20BAB0809A7F /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; - 805EF8DE398C0351120C158B885E1465 /* Quick.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Quick.h; path = Sources/QuickObjectiveC/Quick.h; sourceTree = ""; }; - 856E2FDF76D15D359F10614E4CA48211 /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/NimbleObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; + 6C9986C787D46DE624CA5B7EEE59A653 /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; + 707077DF291B93CA37D818CB47971E9E /* QuickSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpec.m; path = Sources/QuickObjectiveC/QuickSpec.m; sourceTree = ""; }; + 70D8AC5990C544716D52E500CC8B75F0 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 711983F7DB715AC8E7DB732E6331F96D /* World.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = World.swift; path = Sources/Quick/World.swift; sourceTree = ""; }; + 718552A0A58EA3B7F10940B01FA10CFF /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; + 721B2D2CB39F99CA4B933568A9EB93E2 /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = ""; }; + 765B6134855876AACF2AABC79875AA9D /* Pods-TRXTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-TRXTests.modulemap"; sourceTree = ""; }; + 76A010B2CA654F5B26FD679A61C02EEC /* XCTestObservationCenter+CurrentTestCaseTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTestObservationCenter+CurrentTestCaseTracker.h"; sourceTree = ""; }; + 77EF91B600488DFF10C9DAD052252383 /* FBSnapshotTestCasePlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCasePlatform.m; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.m; sourceTree = ""; }; + 78BDCA0C1C56DE01861267A80E40AB4D /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FBSnapshotTestCase.framework; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8437017A33D1F36EE2E52375DA263D65 /* ExampleGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleGroup.swift; path = Sources/Quick/ExampleGroup.swift; sourceTree = ""; }; + 85798C74E8D5711916EE105D5E47B83A /* Callsite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Callsite.swift; path = Sources/Quick/Callsite.swift; sourceTree = ""; }; + 859E33F6FF8DC4509F4291F6D9327F53 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Quick/DSL/DSL.swift; sourceTree = ""; }; 87A3B3A13FA6251F4237BC3C7D73BC13 /* Pods-TRXTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TRXTests-acknowledgements.markdown"; sourceTree = ""; }; - 88019BE679722D896B0BA84C93948876 /* FBSnapshotTestCasePlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCasePlatform.m; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.m; sourceTree = ""; }; - 8A9CEED1F8353F3A900611659B67BCDE /* QuickTestSuite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickTestSuite.swift; path = Sources/Quick/QuickTestSuite.swift; sourceTree = ""; }; - 8C36DB6F05615EC71278526272A72BAD /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8C8CBBF32C39839511129EB1C04B4277 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 8CF342D0975EDCEBBA92D14E81D90E98 /* PrettySyntax.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PrettySyntax.swift; sourceTree = ""; }; - 8DED50B8805DBC0C29D699899DC21E52 /* World+DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "World+DSL.swift"; path = "Sources/Quick/DSL/World+DSL.swift"; sourceTree = ""; }; - 9082F45478C362610808EA87B8A66C41 /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = ""; }; - 91FFCB7C7AA459BA3EE25C72706D13B0 /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; - 9296B4E7ECC49BD5269AEBCAB7B40C20 /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; - 93266F78F7C6C1F161E418D4B0637D48 /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; - 937B4E412E4C1B8B3DC2F3AB6164A9C3 /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 94614A40FE83CD21010E9D268F4D49CF /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; - 953F6BD069D4324933F7115FC34E088A /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; - 980943C71FEA98B02B51450ECEC7B45D /* NSString+QCKSelectorName.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+QCKSelectorName.h"; path = "Sources/QuickObjectiveC/NSString+QCKSelectorName.h"; sourceTree = ""; }; - 9823197EA5904A9150FB0AD8B09841E6 /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 987EDB5E1E3B4E2E0C356380F09D7D87 /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; + 8A71951088358F1FF7351DDF0CD8E846 /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; + 8AD659FB8AF35A8085CF979BBDBA182B /* FBSnapshotTestCase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = FBSnapshotTestCase.modulemap; sourceTree = ""; }; + 8AD8AF56ED604327B2339C3E41C7782E /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; + 8B1B4151C43C0E14BE2EC97DA938A0FF /* ToSucceed.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToSucceed.swift; path = Sources/Nimble/Matchers/ToSucceed.swift; sourceTree = ""; }; + 8BEF3643F8770AAF2FF637E8DD6BAEB9 /* PrettyDynamicTypeSyntax.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrettyDynamicTypeSyntax.swift; path = DynamicType/PrettyDynamicTypeSyntax.swift; sourceTree = ""; }; + 8BFF705475974CD221D01438C2DF43D2 /* CwlCatchException.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m; sourceTree = ""; }; + 8C0641CF767D2849A5AA1508B6C12521 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Nimble.modulemap; sourceTree = ""; }; + 8DB7F3A8704817ED0DC57AF58481E73F /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; + 9010C7CEC9443417BDC864744899455C /* FBSnapshotTestCase-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-umbrella.h"; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 96B5ABD5C638619E721E05BCDCF5E930 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = FBSnapshotTestCase/SwiftSupport.swift; sourceTree = ""; }; + 971035B1AB152AF0693CCDFE8BB93FC7 /* QuickConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickConfiguration.m; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.m; sourceTree = ""; }; 99B83D5268B3F24362496B157D9A82F7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9CF3C95FEF7D0FD6C288789E9061CD70 /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.m"; sourceTree = ""; }; - 9DD777FB8FEDE0FB9B23938CF5E05AF1 /* SuiteHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SuiteHooks.swift; path = Sources/Quick/Hooks/SuiteHooks.swift; sourceTree = ""; }; + 9B1B24C6925273400469A8A844FE3ED5 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; + 9D5849C9E0C4B990891D2234E41995E2 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9DE7BA35F9EF37BC06C8750A40430C2B /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; + 9ED16FBF661E90B1F84EECFC224C74E5 /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; + 9F014111226F1AF0BE6AF3A6123FF99D /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; + 9FF7551B20E7F6B0D6691711225942E5 /* Nimble-Snapshots.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Nimble-Snapshots.modulemap"; sourceTree = ""; }; A015171E3978E83BFC328D94FC5CFA0E /* Pods-TRXTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TRXTests.debug.xcconfig"; sourceTree = ""; }; - A1F739A1F98AAF2DD04AED50D15E7299 /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; - A1FB93B2BA8D088CE5BFC2720246C173 /* QCKDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QCKDSL.h; path = Sources/QuickObjectiveC/DSL/QCKDSL.h; sourceTree = ""; }; + A04467FC73E92C278F91D39E771A1AE4 /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.m"; sourceTree = ""; }; + A098AD9360F8FD1B4051DAC87662979C /* NBSMockedApplication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NBSMockedApplication.h; path = DynamicType/NBSMockedApplication.h; sourceTree = ""; }; + A09AD3678AF70E0AB4501AA461AEA532 /* CwlCatchException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlCatchException.h; path = Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h; sourceTree = ""; }; + A0AD8A7685DECF4EF468FCAE9C6ED387 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; + A11D2B4B49F38B1A6728A9E8166255AC /* Predicate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Predicate.swift; path = Sources/Nimble/Matchers/Predicate.swift; sourceTree = ""; }; A212E7375F1884EE977E832206DDB1BE /* Pods-TRXTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TRXTests-acknowledgements.plist"; sourceTree = ""; }; - A8455A0F53ED8DEFB47169D79C9009B7 /* FBSnapshotTestCasePlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCasePlatform.h; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.h; sourceTree = ""; }; - A9DA4449E8BAEB6FE5331178C5D6CB12 /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = ""; }; - AAAA128C3DFBB59BCE7034FF40860D00 /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; - AAF58500988D3C4DF554D3E6A513D283 /* Quick-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Quick-dummy.m"; sourceTree = ""; }; - AF4FDE5A9EA303E1B54BD924B103FFD7 /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; - AFA9DD9A32782B9F4BE310FCEFCCEA22 /* String+FileName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+FileName.swift"; path = "Sources/Quick/String+FileName.swift"; sourceTree = ""; }; + A52B5E32F17C90CF738651DDD4511BCD /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; + A92C810B1A837E43E9D54DE3EDF1D21F /* DynamicSizeSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DynamicSizeSnapshot.swift; path = DynamicSize/DynamicSizeSnapshot.swift; sourceTree = ""; }; + AAE5E81416B805116EC9318387C6F093 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/NimbleObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; + AD11F4279442D689C9DF48C23623D7F2 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; + AF11943C33369B2227B7C0589C17284F /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; + AFC6DEE05C822C2D76C4480902B26BA4 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; + B1AA4EB0D4E7F45CF4558722592A5057 /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/NimbleObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; + B250DB9938D26EE47395351C47272DC3 /* UIImage+Snapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Snapshot.m"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.m"; sourceTree = ""; }; B2643DC7F2B9222C9F08816F150D3CC3 /* Pods-TRXTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TRXTests-resources.sh"; sourceTree = ""; }; - B2C2D14AA2DB1EF77751073FBE4348DC /* Quick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Quick.modulemap; sourceTree = ""; }; - B615C0BD21E2A570AC3401523EFA5416 /* HooksPhase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HooksPhase.swift; path = Sources/Quick/Hooks/HooksPhase.swift; sourceTree = ""; }; - B90E809A9EB4BE08B463E1D7E5C5A69D /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; - B95C44837CA080E45BC91C3C117C1CA0 /* ExampleGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleGroup.swift; path = Sources/Quick/ExampleGroup.swift; sourceTree = ""; }; - BA28356A18174F24234A03D509D7ED0F /* Callsite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Callsite.swift; path = Sources/Quick/Callsite.swift; sourceTree = ""; }; - BA8A88D7384F1D92C3CD8EBFFC04C29E /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/NMBObjCMatcher.swift; sourceTree = ""; }; - BD2028A859FEF82FEA8F0DCE3ABC93AA /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncMatcherWrapper.swift; path = Sources/Nimble/Matchers/AsyncMatcherWrapper.swift; sourceTree = ""; }; - BD607A34ED322DCAC12DEE2FF93B9CC6 /* QCKDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QCKDSL.m; path = Sources/QuickObjectiveC/DSL/QCKDSL.m; sourceTree = ""; }; - C181D93F628682731FAE109D26962EE7 /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = ""; }; - C19C42B8BB3BA162E2FB49113B8A2A08 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C3EE67261216789A22D959DB9229C924 /* Nimble-Snapshots-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-Snapshots-dummy.m"; sourceTree = ""; }; - C5C953BC74834A1F5E34F5D68A40BFFA /* Nimble_Snapshots.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble_Snapshots.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C78B6ED294864387BED602BC3BF5A3B3 /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickSelectedTestSuiteBuilder.swift; path = Sources/Quick/QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; - C91BD1852D275FA519A9546A6B5A0A2A /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; - CBC20C3028482A1C39B66EE37A34FE92 /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; - CBE643D724DA425DE914965F29391791 /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = ""; }; - CCA2F7596178927FD84F8A04E76CDFB5 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; - CCBA99E60C57041DCB968265BD79AA64 /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; - CFED69C9F357D4065EBD81E2F1039DB9 /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; - D003044674A8D90C2E0247D4B38FBCD5 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; - D6559B0A2178C924FCB7881428C78787 /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = ""; }; + B3F28C181F5B8C307678E4EE317C2CAE /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickSelectedTestSuiteBuilder.swift; path = Sources/Quick/QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; + B43FA92285155B8898E80E9BDD62B470 /* SuiteHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SuiteHooks.swift; path = Sources/Quick/Hooks/SuiteHooks.swift; sourceTree = ""; }; + B6D78A1B633FDCC5BCCBE3D2AB4C2439 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BCDADB2337C8F79EAB7BE3514D21BC67 /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; + BD3B318E963EE6E6A184D5526443545E /* Quick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-umbrella.h"; sourceTree = ""; }; + C17920C2F02A88BAA625AF2F5011A255 /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; + C1D1AD64B77F1F3FFE94699F2EBB80F3 /* XCTestObservationCenter+CurrentTestCaseTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XCTestObservationCenter+CurrentTestCaseTracker.m"; sourceTree = ""; }; + C2690758C845E67B6DF367CA5A0402A3 /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlMachBadInstructionHandler.m; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m; sourceTree = ""; }; + C3371809857F8661D55552FAFDA17A5E /* Quick-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-prefix.pch"; sourceTree = ""; }; + C3C081BD8731C2742BDE014F6369CA3E /* UIImage+Snapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Snapshot.h"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.h"; sourceTree = ""; }; + C47D144D5E74D6986BC57DD90673FCD0 /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; + C5C953BC74834A1F5E34F5D68A40BFFA /* Nimble_Snapshots.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Nimble_Snapshots.framework; path = "Nimble-Snapshots.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + C7591A3875ADA72EAB080B8F017C9980 /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; + C79E090FB62B2DA3EDF8FEAAD8C8A6DC /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = ""; }; + C8CD6ED16BC5E27D432F81F0265B79EE /* ThrowAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowAssertion.swift; path = Sources/Nimble/Matchers/ThrowAssertion.swift; sourceTree = ""; }; + C9B3BD81C50A54D1AE53B16F9B2A0090 /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = ""; }; + CDAEB6226E51320042405B77FD19FB71 /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; + CFFB5A889670669ED1FBE235470FFD7A /* Quick-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Quick-dummy.m"; sourceTree = ""; }; + D19A20D6946E8835B1005C5100B2F91F /* FBSnapshotTestCase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSnapshotTestCase.xcconfig; sourceTree = ""; }; + D34AC2E15AA3393CEBC502592FF8334A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D5705500F4611A1BDC73930A242064F4 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; D6B2AC57C057697F5EDFFA1490607B67 /* Pods-TRXTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TRXTests.release.xcconfig"; sourceTree = ""; }; - D790832876C15B1E5DE24939E26714FA /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; - D9F3981F38B454DA7946EBCB54AD9D3C /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; - DB2ECCA73CFA9724CF54790B9CA94D99 /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; - DB83B5247BFDB707BC388C23F1B523B5 /* ErrorUtility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtility.swift; path = Sources/Quick/ErrorUtility.swift; sourceTree = ""; }; - DCDF6DDC7BF79E7F88403998097C73D9 /* Quick-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-prefix.pch"; sourceTree = ""; }; + D81DE72B8908E397DB13868960F3FB84 /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/NimbleObjectiveC/NMBStringify.m; sourceTree = ""; }; + DACC6B76852446A41A604A87C46C5B8B /* FBSnapshotTestCasePlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCasePlatform.h; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.h; sourceTree = ""; }; + DBF88F83E8B596E139DA02C0A7E5BC1F /* World.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = World.h; path = Sources/QuickObjectiveC/World.h; sourceTree = ""; }; + DC05FFCDBC43073BECB34E4AFEF85F02 /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DC37FE121A8E56EB497238009ED03D5B /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = ""; }; + E1297C63E8BB9A376FBD2776F80A7634 /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncMatcherWrapper.swift; path = Sources/Nimble/Matchers/AsyncMatcherWrapper.swift; sourceTree = ""; }; E1643A09ACFEBCACE7170E14E1D67928 /* Pods-TRXTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TRXTests-umbrella.h"; sourceTree = ""; }; - E231AE9187AD7BE7F34650EAF0F840D4 /* Nimble-Snapshots.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Nimble-Snapshots.modulemap"; sourceTree = ""; }; - E2FE74DF25810B09E3F9396F5EE42E79 /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Utils/Async.swift; sourceTree = ""; }; - E31F4834698C0F6F52893A946585EABD /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/NimbleObjectiveC/NMBStringify.h; sourceTree = ""; }; - E799D37D8B6C727B13EA2004D05E0ABD /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; - E8A3BF9003F7F21545DDC017DE5F1094 /* FBSnapshotTestCase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = FBSnapshotTestCase.modulemap; sourceTree = ""; }; - ECD766B967272ACA06AB0F0E5B2D561F /* Nimble-Snapshots-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-Snapshots-prefix.pch"; sourceTree = ""; }; - EEF157D8BC665625B6DFEF5169B3AF93 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F0DD120BDC84BB26D97C0F6787E83B6E /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.h"; sourceTree = ""; }; - F7B563492046E9F5198F9CB24DE5E5A3 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Quick/Configuration/Configuration.swift; sourceTree = ""; }; - FB3E9E46640DBBCAB5505AB8F11882F5 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Quick/Filter.swift; sourceTree = ""; }; - FB581661953B50A6C707A77A53A29B1F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - FC0E9362F64A623815A6FF09A0CA5D40 /* Quick.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Quick.xcconfig; sourceTree = ""; }; - FD0C4A39C1F486E53BA98E95DF01E9DB /* FBSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-prefix.pch"; sourceTree = ""; }; + E21267FD47DF4606165864334B2A3BBB /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + E2E67510FA1E514C0F856B2FB92FCED2 /* NBSMockedApplication.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NBSMockedApplication.m; path = DynamicType/NBSMockedApplication.m; sourceTree = ""; }; + E57D8E77C370EC1C42445F86EC686F23 /* CwlCatchException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchException.swift; path = Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift; sourceTree = ""; }; + E72D2EB4444EDD57E56A01ECCF20A53E /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; + E741C70862BB3ED4451E935E6A745DA7 /* QCKDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QCKDSL.m; path = Sources/QuickObjectiveC/DSL/QCKDSL.m; sourceTree = ""; }; + E8DB307D634D55A843753E20D4E24843 /* QuickSpecBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpecBase.h; path = Sources/QuickSpecBase/include/QuickSpecBase.h; sourceTree = ""; }; + EAF76EE06934D8A8AC0A7205A589C3D6 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + ECA28284E7E021D204700966F129499D /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = ""; }; + ECA7D2DCE08F745683EA19AF07CEE757 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; + EF4E5D4D9ED4D95311E44AEFC99A5C4D /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; + EFA8033526D88C851418921E64A8DF0A /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContainElementSatisfying.swift; path = Sources/Nimble/Matchers/ContainElementSatisfying.swift; sourceTree = ""; }; + F193C309F3908B909B9A66956A84F009 /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CurrentTestCaseTracker.h; path = Sources/NimbleObjectiveC/CurrentTestCaseTracker.h; sourceTree = ""; }; + F1AEFF0BA56D733E73AA25F7EC966741 /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; + F432C49C0BD6BC34E574525E34685F72 /* HaveValidDynamicTypeSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveValidDynamicTypeSnapshot.swift; path = DynamicType/HaveValidDynamicTypeSnapshot.swift; sourceTree = ""; }; + F50D955E2936283EC2620C1A774A9E05 /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+CurrentTestBundle.swift"; path = "Sources/Quick/NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; + F59BE72513A0FCCF2D6E8108A119442E /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; + F5C734A3CD84E67127F60C0E4CF6BCD8 /* QuickSpecBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpecBase.m; path = Sources/QuickSpecBase/QuickSpecBase.m; sourceTree = ""; }; + F95C5E12A60A61B1FD31F1311E36A044 /* Nimble-Snapshots-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-Snapshots-umbrella.h"; sourceTree = ""; }; + FA37C80A226F86FA006849BE83AD2D6C /* World+DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "World+DSL.h"; path = "Sources/QuickObjectiveC/DSL/World+DSL.h"; sourceTree = ""; }; + FAF22BEA2B236C341DAC6C1027549E89 /* Nimble-Snapshots-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-Snapshots-dummy.m"; sourceTree = ""; }; + FCB839AC295750FD978DFE177D6D4356 /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; FD3B4CFD096D11464C5385EE8E795296 /* Pods-TRXTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TRXTests-frameworks.sh"; sourceTree = ""; }; - FE229B8054D29B99878D59189F07F68C /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = ""; }; - FEE5870617464A8619163E132F29F076 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FEE5870617464A8619163E132F29F076 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Nimble.framework; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 050B68EC615B591FDA5D0B855E697228 /* Frameworks */ = { + 1B9257BC7D5F4A4A0E5AC9C7EA6F3093 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 77C07EB19C4FA487E6411EED4787728F /* Foundation.framework in Frameworks */, + D189E749DFA7ACB8F2CD52AD6A0FC5BA /* Foundation.framework in Frameworks */, + 622FC42D6430DD14EC15A74FD91C1002 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 25B8FE47CFE8AFE95A5E2A03E197F976 /* Frameworks */ = { + 1D421A30A1BDB7E1C4216F64D0C939B1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BA1A5F000918695209BA441D08ABEFE0 /* Foundation.framework in Frameworks */, + 91D0138ACFAD733E4061F12E450C336C /* Foundation.framework in Frameworks */, + B27DFD6025D94758785918F1D6F6C060 /* QuartzCore.framework in Frameworks */, + 841FF232C33C7D49C58CEFDBE7EEB92B /* UIKit.framework in Frameworks */, + 7E9B14D5F8842A86CA86F2AF45230725 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 52D2A0585E7609A05EA3730EDC88EF38 /* Frameworks */ = { + 4A54B21ADD8A9AA74E129358F334DFA8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1BBA146EB2FBD8FA0A30A07E5AED6C2D /* Foundation.framework in Frameworks */, - 5C79957053941818EDA2B9339566E79E /* XCTest.framework in Frameworks */, + 7FC992F4BD0376ACB4F97F9180B0F0B5 /* FBSnapshotTestCase.framework in Frameworks */, + F1DE6A63148913147FF0E037C73F8B09 /* Foundation.framework in Frameworks */, + 91D400CC851F516E785B032662E4FDD8 /* Nimble.framework in Frameworks */, + 99ED13BA15822FD5AEE570B9002C37A8 /* UIKit.framework in Frameworks */, + E7C675C1460BB65C9EECEA98F21CA89E /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFD72241446E2D199D3818194463D3FE /* Frameworks */ = { + 819A9B65073BE3B5599196C0A3B27EBC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 78C0EDC656B9152FB603EC259D241DA5 /* FBSnapshotTestCase.framework in Frameworks */, - B09C23A80024C09EF252801C784E74BE /* Foundation.framework in Frameworks */, - 82E55B1159083B37527C20EB4E621550 /* Nimble.framework in Frameworks */, - C033C346AC287D2009457C31E85587D1 /* Quick.framework in Frameworks */, - B5CEF5D407E2642EA6E84C35AEDAE999 /* XCTest.framework in Frameworks */, + 50698F14E7847E18B907E9373FBF4C21 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - F1A13ADE6C7840452C8DD4B939BFD24B /* Frameworks */ = { + BF67FD2C0ED97DBD69501ACCC419E116 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BE5D30335800F92135A863320B15757C /* Foundation.framework in Frameworks */, - 6AEFB8CB53072AE49169F136706F7E2A /* QuartzCore.framework in Frameworks */, - 49E9CE6CDEA80E7C247CDA044A91B5F5 /* UIKit.framework in Frameworks */, - AC8B65A38D97CC9DEA534F4017720837 /* XCTest.framework in Frameworks */, + DFC8C1E93959549CFEE5BBE6928ACB42 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -406,6 +446,20 @@ path = "Target Support Files/Pods-TRXTests"; sourceTree = ""; }; + 01AD51737BF77CC02F3F64F2846A31C0 /* Support Files */ = { + isa = PBXGroup; + children = ( + B6D78A1B633FDCC5BCCBE3D2AB4C2439 /* Info.plist */, + 8C0641CF767D2849A5AA1508B6C12521 /* Nimble.modulemap */, + 523920F4E7F228A50347C33BD70EC0A7 /* Nimble.xcconfig */, + 075AC900892E9340FCC45D6CD75C8A3E /* Nimble-dummy.m */, + E72D2EB4444EDD57E56A01ECCF20A53E /* Nimble-prefix.pch */, + 1799A89DACFB50FD2A84987B1BA206ED /* Nimble-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/Nimble"; + sourceTree = ""; + }; 049E5DF5C15586B74FD7EF2339F8EC22 /* Products */ = { isa = PBXGroup; children = ( @@ -418,418 +472,444 @@ name = Products; sourceTree = ""; }; - 09503F6D653D965A32CB868FB8DEFC7E /* FBSnapshotTestCase */ = { + 0CC5FC7F9B3D677553A9271464F44DD8 /* SwiftSupport */ = { isa = PBXGroup; children = ( - 72D8D566190DCEF664ED7E71FDC21C39 /* Core */, - 580D8667DBE58DEEBCF6D2BA4F90CC4B /* Support Files */, - 6DF809A17A4BEB0B224FDCB3E0288947 /* SwiftSupport */, + 96B5ABD5C638619E721E05BCDCF5E930 /* SwiftSupport.swift */, ); - path = FBSnapshotTestCase; + name = SwiftSupport; sourceTree = ""; }; - 0DED7C96CF09F730909CBEEBF8EA0830 /* Support Files */ = { + 1623501078AD7652B04972ADFA6818B1 /* Frameworks */ = { isa = PBXGroup; children = ( - 6D68BF9F862FF0965CB7B308F1E3374C /* Info.plist */, - E231AE9187AD7BE7F34650EAF0F840D4 /* Nimble-Snapshots.modulemap */, - 66E7F921A5FA484CAEF02A7C6DB6EB13 /* Nimble-Snapshots.xcconfig */, - C3EE67261216789A22D959DB9229C924 /* Nimble-Snapshots-dummy.m */, - ECD766B967272ACA06AB0F0E5B2D561F /* Nimble-Snapshots-prefix.pch */, - 28FD848AFC07C090348CAF492401F36D /* Nimble-Snapshots-umbrella.h */, + DC05FFCDBC43073BECB34E4AFEF85F02 /* FBSnapshotTestCase.framework */, + 70D8AC5990C544716D52E500CC8B75F0 /* Nimble.framework */, + D1C102E20B1DDC3A6DCB4B28BEFE900C /* iOS */, ); - name = "Support Files"; - path = "../Target Support Files/Nimble-Snapshots"; + name = Frameworks; sourceTree = ""; }; - 1BA88B309FCAC0B2454CD7E2531270B5 /* iOS */ = { + 2DD1A61D6BAAA44B4B996476B4DDB95B /* Support Files */ = { isa = PBXGroup; children = ( - 8C8CBBF32C39839511129EB1C04B4277 /* Foundation.framework */, - 0401507CF8C223BBA0935EF757D1293D /* QuartzCore.framework */, - FB581661953B50A6C707A77A53A29B1F /* UIKit.framework */, - 6257107A1A729D6814F643FFF44ABA6E /* XCTest.framework */, + 9D5849C9E0C4B990891D2234E41995E2 /* Info.plist */, + 06D4F17CF51F125886E02ABBBF6B8B60 /* Quick.modulemap */, + 0744337D5B0C7F295F047983EE5D5FC2 /* Quick.xcconfig */, + CFFB5A889670669ED1FBE235470FFD7A /* Quick-dummy.m */, + C3371809857F8661D55552FAFDA17A5E /* Quick-prefix.pch */, + BD3B318E963EE6E6A184D5526443545E /* Quick-umbrella.h */, ); - name = iOS; + name = "Support Files"; + path = "../Target Support Files/Quick"; sourceTree = ""; }; - 1E65EBB2C5B066FC8AA4E561750120B7 /* Nimble-Snapshots */ = { + 49CD9855C1AA60C72374ACDE2198E494 /* Support Files */ = { isa = PBXGroup; children = ( - 4E5718B90C7279FB3375B883E7F11A60 /* HaveValidSnapshot.swift */, - 376CDF4C1B71DB76A4AE4C5BCE79CE3B /* NimbleSnapshotsConfiguration.swift */, - 8CF342D0975EDCEBBA92D14E81D90E98 /* PrettySyntax.swift */, - 0DED7C96CF09F730909CBEEBF8EA0830 /* Support Files */, + 8AD659FB8AF35A8085CF979BBDBA182B /* FBSnapshotTestCase.modulemap */, + D19A20D6946E8835B1005C5100B2F91F /* FBSnapshotTestCase.xcconfig */, + 034F38A1591242E74C7F882D0050E7F4 /* FBSnapshotTestCase-dummy.m */, + 1DE3F8907455621DC03D013F756C7421 /* FBSnapshotTestCase-prefix.pch */, + 9010C7CEC9443417BDC864744899455C /* FBSnapshotTestCase-umbrella.h */, + 28E59892C56B0098E0C6907E0B18D890 /* Info.plist */, ); - path = "Nimble-Snapshots"; + name = "Support Files"; + path = "../Target Support Files/FBSnapshotTestCase"; sourceTree = ""; }; - 580D8667DBE58DEEBCF6D2BA4F90CC4B /* Support Files */ = { + 500C290B19BF9623382592F705752C04 /* Support Files */ = { isa = PBXGroup; children = ( - E8A3BF9003F7F21545DDC017DE5F1094 /* FBSnapshotTestCase.modulemap */, - 01BF96909EDC4CCB6D8E5693F8D37092 /* FBSnapshotTestCase.xcconfig */, - 4A5BA45404994D810AF32680D5494917 /* FBSnapshotTestCase-dummy.m */, - FD0C4A39C1F486E53BA98E95DF01E9DB /* FBSnapshotTestCase-prefix.pch */, - 0C1AC971E106C697F0F341D2A89BFF27 /* FBSnapshotTestCase-umbrella.h */, - 7DB34BF24FC34A36FD4FD1D23B70E0D8 /* Info.plist */, + D34AC2E15AA3393CEBC502592FF8334A /* Info.plist */, + 9FF7551B20E7F6B0D6691711225942E5 /* Nimble-Snapshots.modulemap */, + 4A52B274D15286A53775032D69E8616C /* Nimble-Snapshots.xcconfig */, + FAF22BEA2B236C341DAC6C1027549E89 /* Nimble-Snapshots-dummy.m */, + 3C86D0B43EBE736423AF4DA3DF132383 /* Nimble-Snapshots-prefix.pch */, + F95C5E12A60A61B1FD31F1311E36A044 /* Nimble-Snapshots-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/FBSnapshotTestCase"; + path = "../Target Support Files/Nimble-Snapshots"; sourceTree = ""; }; - 6DF809A17A4BEB0B224FDCB3E0288947 /* SwiftSupport */ = { + 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( - 0E39919745142DBFA9E9A13766F238D4 /* SwiftSupport.swift */, + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 1623501078AD7652B04972ADFA6818B1 /* Frameworks */, + E587406BF5E179D88D9BCBC341FAA122 /* Pods */, + 049E5DF5C15586B74FD7EF2339F8EC22 /* Products */, + B56C52FBFD0DFDF92170F7B7F83D0953 /* Targets Support Files */, ); - name = SwiftSupport; sourceTree = ""; }; - 70103FC306E9E9667792A9F9AD653F41 /* Nimble */ = { + 8D1A70A3110EC6452150E56B1BFEB8C0 /* Quick */ = { isa = PBXGroup; children = ( - 94614A40FE83CD21010E9D268F4D49CF /* AdapterProtocols.swift */, - 780E500297492BD494198765A72D0F4A /* AllPass.swift */, - 29CB98A16E0D456241ACFA378ED0A2AF /* AssertionDispatcher.swift */, - DB2ECCA73CFA9724CF54790B9CA94D99 /* AssertionRecorder.swift */, - E2FE74DF25810B09E3F9396F5EE42E79 /* Async.swift */, - BD2028A859FEF82FEA8F0DCE3ABC93AA /* AsyncMatcherWrapper.swift */, - 416DCDCE6819617145DEFCA518A50810 /* BeAKindOf.swift */, - 55196666FC4F151DD087CD7C72FBF79F /* BeAnInstanceOf.swift */, - 303E271048DBBB0E4208E77C28941637 /* BeCloseTo.swift */, - 91FFCB7C7AA459BA3EE25C72706D13B0 /* BeEmpty.swift */, - 937B4E412E4C1B8B3DC2F3AB6164A9C3 /* BeginWith.swift */, - 4AB4672ADD7CC732E317AD387E9029D7 /* BeGreaterThan.swift */, - D003044674A8D90C2E0247D4B38FBCD5 /* BeGreaterThanOrEqualTo.swift */, - 564BE59103383EAE403B1669B03D2CF9 /* BeIdenticalTo.swift */, - 9296B4E7ECC49BD5269AEBCAB7B40C20 /* BeLessThan.swift */, - 24D858940B934FE9F5F607BC07086B78 /* BeLessThanOrEqual.swift */, - 2DBDC23165E799874F5A468DD3948C63 /* BeLogical.swift */, - CFED69C9F357D4065EBD81E2F1039DB9 /* BeNil.swift */, - 6EC69C4EF126AE28CCA3F0A3085D895F /* BeVoid.swift */, - 5DBE39329559FFC9790A4BB9CD44876E /* Contain.swift */, - 24C503FEA6BBF87FE7B6C59FB4ECCFE4 /* CurrentTestCaseTracker.h */, - 680F72D45438C78D0EB35E4A30032748 /* DSL.h */, - 0D6A7CB967FB30ABD7519E562C1B21F7 /* DSL.m */, - E799D37D8B6C727B13EA2004D05E0ABD /* DSL.swift */, - 077F88487EFD2154D5D18B73D0FE85AA /* DSL+Wait.swift */, - B90E809A9EB4BE08B463E1D7E5C5A69D /* EndWith.swift */, - 36EB8BCB4E328BA8D5718066561F94EC /* Equal.swift */, - 6F1078D6737E32952C35C9AC1874F492 /* Errors.swift */, - D9F3981F38B454DA7946EBCB54AD9D3C /* Expectation.swift */, - 0AB5FC980EB77B65815ACB8F33387100 /* Expression.swift */, - AF4FDE5A9EA303E1B54BD924B103FFD7 /* FailureMessage.swift */, - 4AA88B172ABDA94F6478E9AB0B22494E /* Functional.swift */, - 1BBE5432DE146838ACF242D31E4B0D1D /* HaveCount.swift */, - 0279B430D9728C12FCC154306B21AAC7 /* Match.swift */, - CCBA99E60C57041DCB968265BD79AA64 /* MatcherFunc.swift */, - CBC20C3028482A1C39B66EE37A34FE92 /* MatcherProtocols.swift */, - 93266F78F7C6C1F161E418D4B0637D48 /* MatchError.swift */, - 4C829CB1A73B6C829F36B55FC6353B22 /* Nimble.h */, - AAAA128C3DFBB59BCE7034FF40860D00 /* NimbleEnvironment.swift */, - CCA2F7596178927FD84F8A04E76CDFB5 /* NimbleXCTestHandler.swift */, - 856E2FDF76D15D359F10614E4CA48211 /* NMBExceptionCapture.h */, - 2B0CE7CDCF6C972F42529D1F85E0EC13 /* NMBExceptionCapture.m */, - 79AE7B678AAF23FAFF6E6BDDCDE88312 /* NMBExpectation.swift */, - BA8A88D7384F1D92C3CD8EBFFC04C29E /* NMBObjCMatcher.swift */, - E31F4834698C0F6F52893A946585EABD /* NMBStringify.h */, - 6517892683F6AD0BBF0450F78A70BA8C /* NMBStringify.m */, - 583998969C72F07BA9FDA89E5EBE6796 /* PostNotification.swift */, - 7EE6E46DBD550BA5110C20BAB0809A7F /* RaisesException.swift */, - 572497090050D3BE1BEB6CD556B09382 /* SatisfyAnyOf.swift */, - 953F6BD069D4324933F7115FC34E088A /* SourceLocation.swift */, - A1F739A1F98AAF2DD04AED50D15E7299 /* Stringers.swift */, - C91BD1852D275FA519A9546A6B5A0A2A /* ThrowError.swift */, - 5ED636BB81D1B1CF2C46AF06EF4E99B7 /* XCTestObservationCenter+Register.m */, - 974D5CF485B854633E83AAECDB37A80C /* Support Files */, + 85798C74E8D5711916EE105D5E47B83A /* Callsite.swift */, + C79E090FB62B2DA3EDF8FEAAD8C8A6DC /* Closures.swift */, + 32945B43078E3A23C6F9A76964C74CE0 /* Configuration.swift */, + 859E33F6FF8DC4509F4291F6D9327F53 /* DSL.swift */, + 17B545412741032AD780091FD4A3C195 /* ErrorUtility.swift */, + 0D7F619EC43A744450634F3F40C2260A /* Example.swift */, + 8437017A33D1F36EE2E52375DA263D65 /* ExampleGroup.swift */, + 135867DE3632443114C169BE8EFE369E /* ExampleHooks.swift */, + C9B3BD81C50A54D1AE53B16F9B2A0090 /* ExampleMetadata.swift */, + 115892C2E9618E41C58FA400A6DF6531 /* Filter.swift */, + 00F89AE88C9B0E8DBA607ED9E1466477 /* HooksPhase.swift */, + F50D955E2936283EC2620C1A774A9E05 /* NSBundle+CurrentTestBundle.swift */, + 3464BECF7B951227207183625713B339 /* NSString+C99ExtendedIdentifier.swift */, + 53F0C72129ABFC0D1D49C6830DC4CAE5 /* QCKDSL.h */, + E741C70862BB3ED4451E935E6A745DA7 /* QCKDSL.m */, + 50B6FBF0A7E6501AFA040EA6C7F005AA /* Quick.h */, + 2A5F510614DBC6D564C8C78CC045C204 /* QuickConfiguration.h */, + 971035B1AB152AF0693CCDFE8BB93FC7 /* QuickConfiguration.m */, + B3F28C181F5B8C307678E4EE317C2CAE /* QuickSelectedTestSuiteBuilder.swift */, + DC37FE121A8E56EB497238009ED03D5B /* QuickSpec.h */, + 707077DF291B93CA37D818CB47971E9E /* QuickSpec.m */, + E8DB307D634D55A843753E20D4E24843 /* QuickSpecBase.h */, + F5C734A3CD84E67127F60C0E4CF6BCD8 /* QuickSpecBase.m */, + 50262E9ECE7EA3FB917A6A951DB70AA7 /* QuickTestSuite.swift */, + B43FA92285155B8898E80E9BDD62B470 /* SuiteHooks.swift */, + 18B132201C09AB18FDDCE23633A063A0 /* URL+FileName.swift */, + DBF88F83E8B596E139DA02C0A7E5BC1F /* World.h */, + 711983F7DB715AC8E7DB732E6331F96D /* World.swift */, + FA37C80A226F86FA006849BE83AD2D6C /* World+DSL.h */, + 363F7DC39CE1D40BCAF6A5EB1EBCB479 /* World+DSL.swift */, + 0E1CCA8CE5BFC48A7CF982D761ED9B8C /* XCTestSuite+QuickTestSuiteBuilder.m */, + 2DD1A61D6BAAA44B4B996476B4DDB95B /* Support Files */, ); - path = Nimble; + name = Quick; + path = Quick; sourceTree = ""; }; - 72D8D566190DCEF664ED7E71FDC21C39 /* Core */ = { + AF541B3BDBD250F2521649DBFF4D9295 /* Core */ = { isa = PBXGroup; children = ( - 6D0A57AA107F4292506163947E3CF583 /* FBSnapshotTestCase.h */, - 24AE05986ED0C8EE52848FBF33418273 /* FBSnapshotTestCase.m */, - A8455A0F53ED8DEFB47169D79C9009B7 /* FBSnapshotTestCasePlatform.h */, - 88019BE679722D896B0BA84C93948876 /* FBSnapshotTestCasePlatform.m */, - 76DB4B5E7898B25E3F577B7641E60510 /* FBSnapshotTestController.h */, - CBE643D724DA425DE914965F29391791 /* FBSnapshotTestController.m */, - 4613CD7A9A219611CC5C966F2A544B7E /* UIApplication+StrictKeyWindow.h */, - 7A587A1D3F23BEE74E95F9AE52EAE864 /* UIApplication+StrictKeyWindow.m */, - 15972504538C2E413FB24CBD8408A1EE /* UIImage+Compare.h */, - 9082F45478C362610808EA87B8A66C41 /* UIImage+Compare.m */, - F0DD120BDC84BB26D97C0F6787E83B6E /* UIImage+Diff.h */, - 9CF3C95FEF7D0FD6C288789E9061CD70 /* UIImage+Diff.m */, - 05AEE152EDF65EE475EA3BBA0B128AF6 /* UIImage+Snapshot.h */, - 4EA8353924C917823667BE3AEC84759A /* UIImage+Snapshot.m */, + 3DD9EAAD01BE2F866F0427DF9F3C07A0 /* CurrentTestCaseTracker.swift */, + A92C810B1A837E43E9D54DE3EDF1D21F /* DynamicSizeSnapshot.swift */, + F432C49C0BD6BC34E574525E34685F72 /* HaveValidDynamicTypeSnapshot.swift */, + 0F487892C59C423988923E1CA530F1A1 /* HaveValidSnapshot.swift */, + A098AD9360F8FD1B4051DAC87662979C /* NBSMockedApplication.h */, + E2E67510FA1E514C0F856B2FB92FCED2 /* NBSMockedApplication.m */, + 8BEF3643F8770AAF2FF637E8DD6BAEB9 /* PrettyDynamicTypeSyntax.swift */, + 64AEBB1CD9FBADB97A5F9A4848AEEFE7 /* PrettySyntax.swift */, + 76A010B2CA654F5B26FD679A61C02EEC /* XCTestObservationCenter+CurrentTestCaseTracker.h */, + C1D1AD64B77F1F3FFE94699F2EBB80F3 /* XCTestObservationCenter+CurrentTestCaseTracker.m */, ); name = Core; sourceTree = ""; }; - 781C692CFC03A86226EF98EB04DD929B /* Support Files */ = { + B56C52FBFD0DFDF92170F7B7F83D0953 /* Targets Support Files */ = { isa = PBXGroup; children = ( - C19C42B8BB3BA162E2FB49113B8A2A08 /* Info.plist */, - B2C2D14AA2DB1EF77751073FBE4348DC /* Quick.modulemap */, - FC0E9362F64A623815A6FF09A0CA5D40 /* Quick.xcconfig */, - AAF58500988D3C4DF554D3E6A513D283 /* Quick-dummy.m */, - DCDF6DDC7BF79E7F88403998097C73D9 /* Quick-prefix.pch */, - 12D833954B0B9590C952733B5F482814 /* Quick-umbrella.h */, + 01277D7FAEF0451B9EAF752CD37DBA34 /* Pods-TRXTests */, ); - name = "Support Files"; - path = "../Target Support Files/Quick"; + name = "Targets Support Files"; sourceTree = ""; }; - 7DB346D0F39D3F0E887471402A8071AB = { + C00AA3E25C19789F092819C0216A0440 /* Core */ = { isa = PBXGroup; children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - AF3FA1139EC69E065B1C1095C25B2636 /* Frameworks */, - CB851A25FA75B1E1DA1748311B4839F2 /* Pods */, - 049E5DF5C15586B74FD7EF2339F8EC22 /* Products */, - B56C52FBFD0DFDF92170F7B7F83D0953 /* Targets Support Files */, + 6B7A4EB17EA0632FC2818C0CA29D9AF7 /* FBSnapshotTestCase.h */, + ECA28284E7E021D204700966F129499D /* FBSnapshotTestCase.m */, + DACC6B76852446A41A604A87C46C5B8B /* FBSnapshotTestCasePlatform.h */, + 77EF91B600488DFF10C9DAD052252383 /* FBSnapshotTestCasePlatform.m */, + 3472CA7911C6A53A6026B43F64783B3E /* FBSnapshotTestController.h */, + 379D414C3BFDF72F20ABE29605708C6C /* FBSnapshotTestController.m */, + 2A7354BF233637D454776923888F68C4 /* UIApplication+StrictKeyWindow.h */, + 08F27615A9B22DFB69BA8E4D8ACD4F7F /* UIApplication+StrictKeyWindow.m */, + 2BF4A482E17E859BCE16E6553F102028 /* UIImage+Compare.h */, + 01C0FFD6D93A251EF9E96E771C6E2EF1 /* UIImage+Compare.m */, + 1A1BCADBE865EEFF925BE466DFFD8DE0 /* UIImage+Diff.h */, + A04467FC73E92C278F91D39E771A1AE4 /* UIImage+Diff.m */, + C3C081BD8731C2742BDE014F6369CA3E /* UIImage+Snapshot.h */, + B250DB9938D26EE47395351C47272DC3 /* UIImage+Snapshot.m */, ); + name = Core; sourceTree = ""; }; - 887EF75137848E46A3A05C84E762D2D4 /* Quick */ = { + D1C102E20B1DDC3A6DCB4B28BEFE900C /* iOS */ = { isa = PBXGroup; children = ( - BA28356A18174F24234A03D509D7ED0F /* Callsite.swift */, - FE229B8054D29B99878D59189F07F68C /* Closures.swift */, - F7B563492046E9F5198F9CB24DE5E5A3 /* Configuration.swift */, - 11BFA072BC85223ADDBDE3D73F35C9E6 /* DSL.swift */, - DB83B5247BFDB707BC388C23F1B523B5 /* ErrorUtility.swift */, - C181D93F628682731FAE109D26962EE7 /* Example.swift */, - B95C44837CA080E45BC91C3C117C1CA0 /* ExampleGroup.swift */, - 4064EAC3E026BE12B1FC07E21A898318 /* ExampleHooks.swift */, - D6559B0A2178C924FCB7881428C78787 /* ExampleMetadata.swift */, - FB3E9E46640DBBCAB5505AB8F11882F5 /* Filter.swift */, - B615C0BD21E2A570AC3401523EFA5416 /* HooksPhase.swift */, - 44B09305E7DCB46CECE1EF85C05E1CEA /* NSBundle+CurrentTestBundle.swift */, - 980943C71FEA98B02B51450ECEC7B45D /* NSString+QCKSelectorName.h */, - 35E21278E64AA798C95FD9DEFA9FA3F9 /* NSString+QCKSelectorName.m */, - A1FB93B2BA8D088CE5BFC2720246C173 /* QCKDSL.h */, - BD607A34ED322DCAC12DEE2FF93B9CC6 /* QCKDSL.m */, - 805EF8DE398C0351120C158B885E1465 /* Quick.h */, - 1F2E910834C78FF33CCC5435FC2B30BC /* QuickConfiguration.h */, - 59B099B85514FAFA571CB2712263229C /* QuickConfiguration.m */, - C78B6ED294864387BED602BC3BF5A3B3 /* QuickSelectedTestSuiteBuilder.swift */, - A9DA4449E8BAEB6FE5331178C5D6CB12 /* QuickSpec.h */, - 4C9C962771DD2B1B049F98918116DABE /* QuickSpec.m */, - 8A9CEED1F8353F3A900611659B67BCDE /* QuickTestSuite.swift */, - AFA9DD9A32782B9F4BE310FCEFCCEA22 /* String+FileName.swift */, - 9DD777FB8FEDE0FB9B23938CF5E05AF1 /* SuiteHooks.swift */, - 58EEBF4678ECD0AB476599E085CB1D4A /* World.h */, - 4948BAB46EEC9A11A941BC84AE265BE4 /* World.swift */, - 6B1803B89967D1E59EBF19A30CEB68A2 /* World+DSL.h */, - 8DED50B8805DBC0C29D699899DC21E52 /* World+DSL.swift */, - 745133B5A25CA92A9797839FD93CBDA3 /* XCTestSuite+QuickTestSuiteBuilder.m */, - 781C692CFC03A86226EF98EB04DD929B /* Support Files */, + 50FBC47DA706DBF982E54AA5ACC39EC9 /* Foundation.framework */, + E21267FD47DF4606165864334B2A3BBB /* QuartzCore.framework */, + EAF76EE06934D8A8AC0A7205A589C3D6 /* UIKit.framework */, + 06DD029A3EDBE8A1D68E460BB1C997C1 /* XCTest.framework */, ); - path = Quick; + name = iOS; sourceTree = ""; }; - 974D5CF485B854633E83AAECDB37A80C /* Support Files */ = { + D4D5316818D75D0A542D30CDDD52E77C /* Nimble */ = { isa = PBXGroup; children = ( - EEF157D8BC665625B6DFEF5169B3AF93 /* Info.plist */, - 0B41C94CDDB8E92732838471FB3E4E52 /* Nimble.modulemap */, - 5CE0F74F3D19787D4C2D38C5D26D5211 /* Nimble.xcconfig */, - 0ABF947A344EF6249D1254633B7A4383 /* Nimble-dummy.m */, - D790832876C15B1E5DE24939E26714FA /* Nimble-prefix.pch */, - 987EDB5E1E3B4E2E0C356380F09D7D87 /* Nimble-umbrella.h */, + 6B986298A57B18A06D13616CB4407920 /* AdapterProtocols.swift */, + 1F2BD4D16AB849E169B12E8C53D9B16B /* AllPass.swift */, + 533CF5274E96FAF6C5F33E724535C1A7 /* AssertionDispatcher.swift */, + FCB839AC295750FD978DFE177D6D4356 /* AssertionRecorder.swift */, + 2A7F519027C542475CE4DA518899534F /* Async.swift */, + E1297C63E8BB9A376FBD2776F80A7634 /* AsyncMatcherWrapper.swift */, + 8AD8AF56ED604327B2339C3E41C7782E /* BeAKindOf.swift */, + AD11F4279442D689C9DF48C23623D7F2 /* BeAnInstanceOf.swift */, + 050ACF58357C51C3A5418B9DF1DA92C2 /* BeCloseTo.swift */, + F1AEFF0BA56D733E73AA25F7EC966741 /* BeEmpty.swift */, + CDAEB6226E51320042405B77FD19FB71 /* BeginWith.swift */, + C47D144D5E74D6986BC57DD90673FCD0 /* BeGreaterThan.swift */, + 1ED18B077C599A8A8058ED790C8AB83B /* BeGreaterThanOrEqualTo.swift */, + F59BE72513A0FCCF2D6E8108A119442E /* BeIdenticalTo.swift */, + 0A2EEEA6E480B661AE6D375672436A15 /* BeLessThan.swift */, + 5AE80509440006C26690035603A2F362 /* BeLessThanOrEqual.swift */, + 9F014111226F1AF0BE6AF3A6123FF99D /* BeLogical.swift */, + 8DB7F3A8704817ED0DC57AF58481E73F /* BeNil.swift */, + 8A71951088358F1FF7351DDF0CD8E846 /* BeVoid.swift */, + 38FF49C1EC422751EFB68E1679AF8DC6 /* Contain.swift */, + EFA8033526D88C851418921E64A8DF0A /* ContainElementSatisfying.swift */, + F193C309F3908B909B9A66956A84F009 /* CurrentTestCaseTracker.h */, + EF4E5D4D9ED4D95311E44AEFC99A5C4D /* CwlBadInstructionException.swift */, + 721B2D2CB39F99CA4B933568A9EB93E2 /* CwlCatchBadInstruction.swift */, + A09AD3678AF70E0AB4501AA461AEA532 /* CwlCatchException.h */, + 8BFF705475974CD221D01438C2DF43D2 /* CwlCatchException.m */, + E57D8E77C370EC1C42445F86EC686F23 /* CwlCatchException.swift */, + C7591A3875ADA72EAB080B8F017C9980 /* CwlDarwinDefinitions.swift */, + 4209D4899C4E99A84CAB22EF699AADC2 /* CwlMachBadInstructionHandler.h */, + C2690758C845E67B6DF367CA5A0402A3 /* CwlMachBadInstructionHandler.m */, + 1D14AFB722E994601EAADE306B4F8772 /* CwlPreconditionTesting.h */, + 4C608C1BB8B3AC28DCEB86C234510F72 /* DSL.h */, + 0734AE6B283CE8FE6B2D06D408E5F386 /* DSL.m */, + A0AD8A7685DECF4EF468FCAE9C6ED387 /* DSL.swift */, + 456B897F5107980B5A82C434B373C85E /* DSL+Wait.swift */, + 718552A0A58EA3B7F10940B01FA10CFF /* EndWith.swift */, + BCDADB2337C8F79EAB7BE3514D21BC67 /* Equal.swift */, + 1F24A389460B60CBB3D0AAFD0DFEB388 /* Errors.swift */, + 40BEC66949516F59EED0551B1F3397A3 /* Expectation.swift */, + 47FCF6792A8663BA26208C7A4AB66C12 /* ExpectationMessage.swift */, + D5705500F4611A1BDC73930A242064F4 /* Expression.swift */, + 60D1858C286AA6E6D597558BD61456FB /* FailureMessage.swift */, + 12C71CD6BC16A489A6A9AF200AA99BCB /* Functional.swift */, + 28F7030A0A4ADC5C72B4198DAAA63274 /* HaveCount.swift */, + 1F1904AFD4C66E09A8CA2524BBA126D3 /* mach_excServer.c */, + 11D91E3A00AE7F2A1839F012F12A2699 /* mach_excServer.h */, + A52B5E32F17C90CF738651DDD4511BCD /* Match.swift */, + 3A39592892EF374D62E2FABE47E49DF9 /* MatcherFunc.swift */, + C17920C2F02A88BAA625AF2F5011A255 /* MatcherProtocols.swift */, + AF11943C33369B2227B7C0589C17284F /* MatchError.swift */, + 3381E07245E54891E0BAD56D129A1AA2 /* Nimble.h */, + 065A0BF2405C3324CE1BA7B7B176D0F4 /* NimbleEnvironment.swift */, + AFC6DEE05C822C2D76C4480902B26BA4 /* NimbleXCTestHandler.swift */, + B1AA4EB0D4E7F45CF4558722592A5057 /* NMBExceptionCapture.h */, + AAE5E81416B805116EC9318387C6F093 /* NMBExceptionCapture.m */, + 4E703D260C38B084B163C46D80B5AFA8 /* NMBExpectation.swift */, + 0C615717CEB001476EE73E389BECC1D0 /* NMBObjCMatcher.swift */, + 2C25014841168129127E166118824F54 /* NMBStringify.h */, + D81DE72B8908E397DB13868960F3FB84 /* NMBStringify.m */, + 203339FB12959585A1F7CBC8324C957F /* PostNotification.swift */, + A11D2B4B49F38B1A6728A9E8166255AC /* Predicate.swift */, + 583DE4597309AE31BA9A46AC02A254B1 /* RaisesException.swift */, + ECA7D2DCE08F745683EA19AF07CEE757 /* SatisfyAnyOf.swift */, + 9ED16FBF661E90B1F84EECFC224C74E5 /* SourceLocation.swift */, + 9DE7BA35F9EF37BC06C8750A40430C2B /* Stringers.swift */, + C8CD6ED16BC5E27D432F81F0265B79EE /* ThrowAssertion.swift */, + 6C9986C787D46DE624CA5B7EEE59A653 /* ThrowError.swift */, + 8B1B4151C43C0E14BE2EC97DA938A0FF /* ToSucceed.swift */, + 9B1B24C6925273400469A8A844FE3ED5 /* XCTestObservationCenter+Register.m */, + 01AD51737BF77CC02F3F64F2846A31C0 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Nimble"; + name = Nimble; + path = Nimble; sourceTree = ""; }; - AF3FA1139EC69E065B1C1095C25B2636 /* Frameworks */ = { + D6EF4BA0EB5F1580BE034355B88BA4C9 /* Nimble-Snapshots */ = { isa = PBXGroup; children = ( - 9823197EA5904A9150FB0AD8B09841E6 /* FBSnapshotTestCase.framework */, - 5AD55F3974939097556240403DEE2DFF /* Nimble.framework */, - 8C36DB6F05615EC71278526272A72BAD /* Quick.framework */, - 1BA88B309FCAC0B2454CD7E2531270B5 /* iOS */, + AF541B3BDBD250F2521649DBFF4D9295 /* Core */, + 500C290B19BF9623382592F705752C04 /* Support Files */, ); - name = Frameworks; + name = "Nimble-Snapshots"; + path = "Nimble-Snapshots"; sourceTree = ""; }; - B56C52FBFD0DFDF92170F7B7F83D0953 /* Targets Support Files */ = { + E587406BF5E179D88D9BCBC341FAA122 /* Pods */ = { isa = PBXGroup; children = ( - 01277D7FAEF0451B9EAF752CD37DBA34 /* Pods-TRXTests */, + F14098799E9176FE144CE6A96913EA3E /* FBSnapshotTestCase */, + D4D5316818D75D0A542D30CDDD52E77C /* Nimble */, + D6EF4BA0EB5F1580BE034355B88BA4C9 /* Nimble-Snapshots */, + 8D1A70A3110EC6452150E56B1BFEB8C0 /* Quick */, ); - name = "Targets Support Files"; + name = Pods; sourceTree = ""; }; - CB851A25FA75B1E1DA1748311B4839F2 /* Pods */ = { + F14098799E9176FE144CE6A96913EA3E /* FBSnapshotTestCase */ = { isa = PBXGroup; children = ( - 09503F6D653D965A32CB868FB8DEFC7E /* FBSnapshotTestCase */, - 70103FC306E9E9667792A9F9AD653F41 /* Nimble */, - 1E65EBB2C5B066FC8AA4E561750120B7 /* Nimble-Snapshots */, - 887EF75137848E46A3A05C84E762D2D4 /* Quick */, + C00AA3E25C19789F092819C0216A0440 /* Core */, + 49CD9855C1AA60C72374ACDE2198E494 /* Support Files */, + 0CC5FC7F9B3D677553A9271464F44DD8 /* SwiftSupport */, ); - name = Pods; + name = FBSnapshotTestCase; + path = FBSnapshotTestCase; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0AA9BDD2EE167077970D198258CF5519 /* Headers */ = { + 0205A7FA11D16FC12C540E9AC47D1877 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - B6A67A3B998747E4290BF6010EC33806 /* FBSnapshotTestCase-umbrella.h in Headers */, - 8ACF6A5515A175054E22414BF740EF14 /* FBSnapshotTestCase.h in Headers */, - 9FA3B93CE0ECAC3CDC30890659AACF82 /* FBSnapshotTestCasePlatform.h in Headers */, - 130F048002A62769FAFCC66F2C79391A /* FBSnapshotTestController.h in Headers */, - 68B245DB47CA60F8F9ADCA1E8CCDC324 /* UIApplication+StrictKeyWindow.h in Headers */, - EAA652557B70F493923A3447B5D64E0D /* UIImage+Compare.h in Headers */, - 61EBC5CF0D5E065C88028B49C6B8D3B3 /* UIImage+Diff.h in Headers */, - 34A1C7E576C58A9D3F3101448308BF3E /* UIImage+Snapshot.h in Headers */, + CC47487DC7F837212FE8F97FDB805F15 /* Pods-TRXTests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 66E7DB4DE2644F5F693D68CBD15564AD /* Headers */ = { + 4FF9A84C7CE82218A6D2861AF01B81D0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 36076C14B35110B528A15AF21826CCE1 /* Nimble-Snapshots-umbrella.h in Headers */, + 29A50416AE8AEBEDD36399986598676B /* NBSMockedApplication.h in Headers */, + C89AFDB74F093530794264BF33F0AB32 /* Nimble-Snapshots-umbrella.h in Headers */, + 483FDA74FEC933E1A53FA25E794A0443 /* XCTestObservationCenter+CurrentTestCaseTracker.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7CE59C92D6D376E1C09DB1B66DA51442 /* Headers */ = { + 7AA31DBC45955CF62D3CD958F6831B06 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - EF6A8905CF7DF656FABD150ADED75007 /* NSString+QCKSelectorName.h in Headers */, - 31D19316E3F33AE77DDCD961DEC9A9E9 /* QCKDSL.h in Headers */, - BD6302ECE07C5DD92C9826E7E6C9DBA9 /* Quick-umbrella.h in Headers */, - EB5BA9C76733488A03A8A59552D1AB61 /* Quick.h in Headers */, - 69BB3B31F3C8AE199A43ABE8B0CBF802 /* QuickConfiguration.h in Headers */, - C8A959D4777884FEF0AC76BE0A56E1BD /* QuickSpec.h in Headers */, - 0A9DA2158E1A0BD404CD48D07C183F3A /* World+DSL.h in Headers */, - A29D71806400C5A396AEB085F6AB5D2B /* World.h in Headers */, + 0CE5AC5B25B951D7EE91A121E335D7FE /* QCKDSL.h in Headers */, + F6C9A5A3FBB40489F4902DA413E6D708 /* Quick-umbrella.h in Headers */, + 5C847F3744756CF256EDD51417E7E4DD /* Quick.h in Headers */, + CDF0D6A7968DD28468B08F264820AFAF /* QuickConfiguration.h in Headers */, + A275B84CFA9CF6A8788540C8DCEA6214 /* QuickSpec.h in Headers */, + BD98E6990728E1DFB3936C840A154B42 /* QuickSpecBase.h in Headers */, + DADF7748F7F8C649B83324622B1F74EC /* World+DSL.h in Headers */, + 0F64DE0C6ED690D291DE6FACB0014304 /* World.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 86696098DFE8EEF81BA9CA65392D6954 /* Headers */ = { + 85497845823171A47E23A59621A44463 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 79FF370D51D1A9B200EB9E571313444B /* Pods-TRXTests-umbrella.h in Headers */, + 5AB9DB61D62D8BF7B1C734B373F361E7 /* CurrentTestCaseTracker.h in Headers */, + 531C54B1C10BA0F17A2B7D81D02BD390 /* CwlCatchException.h in Headers */, + B37D0376FCEB3133F44CF5F4416C58E1 /* CwlMachBadInstructionHandler.h in Headers */, + 16409C737271C4F1D7FEEFB91E317D5A /* CwlPreconditionTesting.h in Headers */, + FB433A84B0A557CD5E5948A8B6705024 /* DSL.h in Headers */, + 2F2DA5BA5AE1FB074F387E97115F47D5 /* mach_excServer.h in Headers */, + 5DBCC0E4C72649C9A39A00D40D944DDA /* Nimble-umbrella.h in Headers */, + 0A2CA8B0DD7E300ABFCF1956E6B58248 /* Nimble.h in Headers */, + 22E9F6FA56858A5F7A5D664E5968ECB0 /* NMBExceptionCapture.h in Headers */, + 96132E7432F8DD315A88A07C6B4F9C72 /* NMBStringify.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - C9CAD1C0891D5863FF8627A68CC68ECA /* Headers */ = { + 9DC6F5AC11E37A1EB45C6473C9E800B6 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 522E7C454877ACD8AB3D06601E7770AE /* CurrentTestCaseTracker.h in Headers */, - 421C068CCF276223CD76D9875DB0C537 /* DSL.h in Headers */, - B47F2B1F7F5FEC4CE62F09832392E842 /* Nimble-umbrella.h in Headers */, - A1F69DD3961B60955EFD28E2BDF446E8 /* Nimble.h in Headers */, - BD0445E39C97A49EAFD877DCA85EF8EA /* NMBExceptionCapture.h in Headers */, - F614EFDFC958434F53DC770F8887170B /* NMBStringify.h in Headers */, + B758FB09FE2C06C1B8E36A71A9D76D41 /* FBSnapshotTestCase-umbrella.h in Headers */, + 9673CF780F48C8E4EC2A331717B1F67C /* FBSnapshotTestCase.h in Headers */, + BFCE460CC33E8872B7156D4166340178 /* FBSnapshotTestCasePlatform.h in Headers */, + 2F485B69F51E4F723A38410F31F08550 /* FBSnapshotTestController.h in Headers */, + BC952FC04FC963C1294DCD619C9B6B3B /* UIApplication+StrictKeyWindow.h in Headers */, + CAFA5E486BCE117A7D8C0FBF9DA6666B /* UIImage+Compare.h in Headers */, + 051A816D6DD0CAE13496DDCFE0829167 /* UIImage+Diff.h in Headers */, + 421CDD701AEE0F2458A84200366CDD0F /* UIImage+Snapshot.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 40FF1C77152F384080A1A02E90A36DA9 /* Nimble */ = { + 34CD2E3428AB802BACA62286FF5074B1 /* FBSnapshotTestCase */ = { isa = PBXNativeTarget; - buildConfigurationList = A4964CB88DC1058EA701972205BBB4A0 /* Build configuration list for PBXNativeTarget "Nimble" */; + buildConfigurationList = F28097D43AF5CD8DA838ABD52A053790 /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */; buildPhases = ( - 48AE5F6A6BC1CC0328D35EC2621B440C /* Sources */, - 050B68EC615B591FDA5D0B855E697228 /* Frameworks */, - C9CAD1C0891D5863FF8627A68CC68ECA /* Headers */, + E2E80CCD063D04B57A1A5E140726E8A4 /* Sources */, + 1D421A30A1BDB7E1C4216F64D0C939B1 /* Frameworks */, + 9DC6F5AC11E37A1EB45C6473C9E800B6 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = Nimble; - productName = Nimble; - productReference = FEE5870617464A8619163E132F29F076 /* Nimble.framework */; + name = FBSnapshotTestCase; + productName = FBSnapshotTestCase; + productReference = 78BDCA0C1C56DE01861267A80E40AB4D /* FBSnapshotTestCase.framework */; productType = "com.apple.product-type.framework"; }; - 4C0C2729F6655C5D2E6537A7EE86980B /* Pods-TRXTests */ = { + 3E27AEC80D896236A253AB6EBB7D1364 /* Pods-TRXTests */ = { isa = PBXNativeTarget; - buildConfigurationList = BD4E1396341048AA12F78D6F0EA9F5F5 /* Build configuration list for PBXNativeTarget "Pods-TRXTests" */; + buildConfigurationList = 6D51ACF55AF01AA357084E65EC4B5A9E /* Build configuration list for PBXNativeTarget "Pods-TRXTests" */; buildPhases = ( - 7973F4F55C7769DC240462E0459858A1 /* Sources */, - 25B8FE47CFE8AFE95A5E2A03E197F976 /* Frameworks */, - 86696098DFE8EEF81BA9CA65392D6954 /* Headers */, + 9F743CBC611AE9E79EBF4BA01D4FFDBD /* Sources */, + BF67FD2C0ED97DBD69501ACCC419E116 /* Frameworks */, + 0205A7FA11D16FC12C540E9AC47D1877 /* Headers */, ); buildRules = ( ); dependencies = ( - 630B12EEA1A2CF8038C1E46ABF2C2A89 /* PBXTargetDependency */, - 005D2FAAEB1B212A51B178B246538C41 /* PBXTargetDependency */, - 72735621CB28612EA70F5D4C0A447ECC /* PBXTargetDependency */, - 917D43AEAA807A3F9580276BE4611E66 /* PBXTargetDependency */, + 0106C91D2E7BBDF301E6A41CB01BDE0C /* PBXTargetDependency */, + 1F7FA6FD87BA0C6DA948A826A00CD36D /* PBXTargetDependency */, + 45507B0A0DEFBECD26622CFDA9A62BF8 /* PBXTargetDependency */, + B0D7FE3C7B4622F2A341FEDA741C01C5 /* PBXTargetDependency */, ); name = "Pods-TRXTests"; productName = "Pods-TRXTests"; productReference = 0BA192C5E2CB68E8C922B352AFF1A18F /* Pods_TRXTests.framework */; productType = "com.apple.product-type.framework"; }; - 5DB46EA499F9A5E22765121102FCC34B /* FBSnapshotTestCase */ = { + 6B8D2C966D4D7E5D2DF4A6BADFEF6290 /* Nimble-Snapshots */ = { isa = PBXNativeTarget; - buildConfigurationList = 8D492E06A9E9F494492A2A3B4D19493E /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */; + buildConfigurationList = 7779D6305C041AD32CE7ABC72AAAE8AB /* Build configuration list for PBXNativeTarget "Nimble-Snapshots" */; buildPhases = ( - 7DE474775CBF413C7A124107E34E5614 /* Sources */, - F1A13ADE6C7840452C8DD4B939BFD24B /* Frameworks */, - 0AA9BDD2EE167077970D198258CF5519 /* Headers */, + 46AFBC3BBC4753EC5E04BB357F5F8A55 /* Sources */, + 4A54B21ADD8A9AA74E129358F334DFA8 /* Frameworks */, + 4FF9A84C7CE82218A6D2861AF01B81D0 /* Headers */, ); buildRules = ( ); dependencies = ( + 2A87A2B5D370BC2AB91C28CC3B4C7D3E /* PBXTargetDependency */, + FD0636A82A891D3863EBCA65D7EE07CF /* PBXTargetDependency */, ); - name = FBSnapshotTestCase; - productName = FBSnapshotTestCase; - productReference = 78BDCA0C1C56DE01861267A80E40AB4D /* FBSnapshotTestCase.framework */; + name = "Nimble-Snapshots"; + productName = "Nimble-Snapshots"; + productReference = C5C953BC74834A1F5E34F5D68A40BFFA /* Nimble_Snapshots.framework */; productType = "com.apple.product-type.framework"; }; - 9A3AE440FB23CCC076AA408C3C4836C4 /* Nimble-Snapshots */ = { + 8264CB4234D8D7CA47AFB08BB6EBBCF4 /* Quick */ = { isa = PBXNativeTarget; - buildConfigurationList = 16338EE1C1BD578312E653B5ED79DBC9 /* Build configuration list for PBXNativeTarget "Nimble-Snapshots" */; + buildConfigurationList = 4A60DC8FAD063CBB25A5DFE7BB23CE20 /* Build configuration list for PBXNativeTarget "Quick" */; buildPhases = ( - CF1F5A529EDB9E4B0CDE183D34511F72 /* Sources */, - BFD72241446E2D199D3818194463D3FE /* Frameworks */, - 66E7DB4DE2644F5F693D68CBD15564AD /* Headers */, + DEFECBC3C2924095C5F3BB683BD156D0 /* Sources */, + 1B9257BC7D5F4A4A0E5AC9C7EA6F3093 /* Frameworks */, + 7AA31DBC45955CF62D3CD958F6831B06 /* Headers */, ); buildRules = ( ); dependencies = ( - DDF82A7F4F0212527E85A6197F5FD72A /* PBXTargetDependency */, - 51181AC113284270633563DB2A331F61 /* PBXTargetDependency */, - B5EEF869A8D853590BFC239D1E1CB7D8 /* PBXTargetDependency */, ); - name = "Nimble-Snapshots"; - productName = "Nimble-Snapshots"; - productReference = C5C953BC74834A1F5E34F5D68A40BFFA /* Nimble_Snapshots.framework */; + name = Quick; + productName = Quick; + productReference = 273912E71B275A8F839A141B6335614A /* Quick.framework */; productType = "com.apple.product-type.framework"; }; - A5C430B1E2D8298FD6C5403590C0B80F /* Quick */ = { + DD7C8BF89FE8053D0A2A2D88BB49CF07 /* Nimble */ = { isa = PBXNativeTarget; - buildConfigurationList = CDD472835DE04EBDB4665D3207961542 /* Build configuration list for PBXNativeTarget "Quick" */; + buildConfigurationList = 439502BDB29394EE0D69336E69C8494C /* Build configuration list for PBXNativeTarget "Nimble" */; buildPhases = ( - AE7BCB0C919D72823BFAC77FBDD032C3 /* Sources */, - 52D2A0585E7609A05EA3730EDC88EF38 /* Frameworks */, - 7CE59C92D6D376E1C09DB1B66DA51442 /* Headers */, + 3B8E072FBCB923980AC89BAC33C449B9 /* Sources */, + 819A9B65073BE3B5599196C0A3B27EBC /* Frameworks */, + 85497845823171A47E23A59621A44463 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = Quick; - productName = Quick; - productReference = 273912E71B275A8F839A141B6335614A /* Quick.framework */; + name = Nimble; + productName = Nimble; + productReference = FEE5870617464A8619163E132F29F076 /* Nimble.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -838,8 +918,8 @@ D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0900; + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0700; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -853,259 +933,228 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 5DB46EA499F9A5E22765121102FCC34B /* FBSnapshotTestCase */, - 40FF1C77152F384080A1A02E90A36DA9 /* Nimble */, - 9A3AE440FB23CCC076AA408C3C4836C4 /* Nimble-Snapshots */, - 4C0C2729F6655C5D2E6537A7EE86980B /* Pods-TRXTests */, - A5C430B1E2D8298FD6C5403590C0B80F /* Quick */, + 34CD2E3428AB802BACA62286FF5074B1 /* FBSnapshotTestCase */, + DD7C8BF89FE8053D0A2A2D88BB49CF07 /* Nimble */, + 6B8D2C966D4D7E5D2DF4A6BADFEF6290 /* Nimble-Snapshots */, + 3E27AEC80D896236A253AB6EBB7D1364 /* Pods-TRXTests */, + 8264CB4234D8D7CA47AFB08BB6EBBCF4 /* Quick */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - 48AE5F6A6BC1CC0328D35EC2621B440C /* Sources */ = { + 3B8E072FBCB923980AC89BAC33C449B9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E008736F5514F44C0E07DD052A7B6D67 /* AdapterProtocols.swift in Sources */, - 5A4AC5619A05687E5EB0A4BBDC8AF154 /* AllPass.swift in Sources */, - 35E0EBA7AA92E190AB5B4ACFCF0F61C4 /* AssertionDispatcher.swift in Sources */, - BBF88FA3F28C0906DBB78314A8E50A01 /* AssertionRecorder.swift in Sources */, - 92BC58B0158D9DFE7D59C341A85D4359 /* Async.swift in Sources */, - 24AE47A6560D6EBB0AFF78BAAAB15E0F /* AsyncMatcherWrapper.swift in Sources */, - 7F8AC53F92F56C3319DD733CAFB9DD58 /* BeAKindOf.swift in Sources */, - E8DE03684C234604E472C27ECD8F6B70 /* BeAnInstanceOf.swift in Sources */, - 602B5CEB21CA60AFA67B508D13282E94 /* BeCloseTo.swift in Sources */, - FA145DCE313D583C0431D178FB32C96F /* BeEmpty.swift in Sources */, - BA7362188C5D17958A5080EE299A90FC /* BeginWith.swift in Sources */, - 3D7AF86E9032C99357D2ED046461874F /* BeGreaterThan.swift in Sources */, - 3C918E40C04067FAF57B447C0BC52B04 /* BeGreaterThanOrEqualTo.swift in Sources */, - FF0366DFC597745127A6D92AB83F0D60 /* BeIdenticalTo.swift in Sources */, - 59A4C06B57864AA9BBFAE0B762DAE871 /* BeLessThan.swift in Sources */, - 39007AD3711A35BCFA1D853E7AB79510 /* BeLessThanOrEqual.swift in Sources */, - D45096E61E72E772AF46C3BECA03583B /* BeLogical.swift in Sources */, - 21FCC4B725EAF5F42EDFDA386FF3EC4C /* BeNil.swift in Sources */, - A9DA3829FA747E599023EF1394CD2EB5 /* BeVoid.swift in Sources */, - 6445B28465C1A7900E895709BC333C23 /* Contain.swift in Sources */, - C81BEDE79545C013BEBBA0363480FD47 /* DSL+Wait.swift in Sources */, - 344BEE9094F8B903BDACA3AB5811436C /* DSL.m in Sources */, - 3B78C4F35C369FBABE62D4622A67E7DF /* DSL.swift in Sources */, - 9EFD3EE819EB1FAA5EDE26E8DAA483CD /* EndWith.swift in Sources */, - B78A3DF47B5FEF7D9BE0B7660500211B /* Equal.swift in Sources */, - 59AFC17D744CDEED360B4DF8876295BF /* Errors.swift in Sources */, - 95F54B9537875729AE90B472EA5D39BF /* Expectation.swift in Sources */, - 5B21B2BBADCCEB5AC51E0A0C99BA5B93 /* Expression.swift in Sources */, - EFE20ADE81CBE47F13D76267285C4A35 /* FailureMessage.swift in Sources */, - 684A7E4C24ADAAB1B497B5F658036FC2 /* Functional.swift in Sources */, - C755136BFCDFA000C44C8BBCA065E4BE /* HaveCount.swift in Sources */, - 9296C7ABDE9E5894D47CD74E7F78F968 /* Match.swift in Sources */, - 8DFE23F2C7973BC8A159168AFC2FB8C3 /* MatcherFunc.swift in Sources */, - DE5F3C28CC8C40B8031C784835B3577D /* MatcherProtocols.swift in Sources */, - 56CA153033917F08CCDD22E94806C873 /* MatchError.swift in Sources */, - D8E0C72DDE130D4471BB48D2081FD235 /* Nimble-dummy.m in Sources */, - 263465A57520B440C99D428CE2E51AE9 /* NimbleEnvironment.swift in Sources */, - B09B3461D9467BA8A230048F95C26E0F /* NimbleXCTestHandler.swift in Sources */, - AB2B63BFFD7A11E6871B472150F7984B /* NMBExceptionCapture.m in Sources */, - C10896B1EEB0291A92FBA848007CD7CF /* NMBExpectation.swift in Sources */, - 74C0C955A968122899AB6E0DA79D3FA0 /* NMBObjCMatcher.swift in Sources */, - F35657C05DC39E78A33D79BDD92ECA64 /* NMBStringify.m in Sources */, - A18E791645056D5563206104A3E3AD87 /* PostNotification.swift in Sources */, - 41EE5E3698CC1A17046AC74B36A279E0 /* RaisesException.swift in Sources */, - BEA76FA499D5899BD98DBD891FF921D4 /* SatisfyAnyOf.swift in Sources */, - 9D904B7EAD0EC56AD12E704757CAA640 /* SourceLocation.swift in Sources */, - 43B99F06587ACD844A4D09A0ED9FB66B /* Stringers.swift in Sources */, - 099C64CF560DC424DB43BBBEC6370D8F /* ThrowError.swift in Sources */, - 9DBED967731DE53C22AD17C3E09079FD /* XCTestObservationCenter+Register.m in Sources */, + F9649DD59BAEE88C6864EEFE73ECA88C /* AdapterProtocols.swift in Sources */, + DF026F6F406A4FB6CEA63B0A4B9E27DD /* AllPass.swift in Sources */, + 32B38992751B96F21324BFC9923BFCBD /* AssertionDispatcher.swift in Sources */, + 73BC5AC2ECDB8722E085F14B53E0D24E /* AssertionRecorder.swift in Sources */, + B2C151B20635A480E1937E3D2B509BB4 /* Async.swift in Sources */, + EAAA05EBBC34225C0DB45797712E24A1 /* AsyncMatcherWrapper.swift in Sources */, + 7E0C9AE6468A5DF91F0F4C7A387D725C /* BeAKindOf.swift in Sources */, + C1D862177DC2999FAC710AC25F253BD0 /* BeAnInstanceOf.swift in Sources */, + BF3B7218901760A6226C7F6346BEF454 /* BeCloseTo.swift in Sources */, + 58C0125D796A97541FDE3414001D8A92 /* BeEmpty.swift in Sources */, + CCDAF11E7AF29E720C587B038145F622 /* BeginWith.swift in Sources */, + AF1174085D9BC5D50FCE0480E9C2BE94 /* BeGreaterThan.swift in Sources */, + 58D964317DFBB10F54A273CB12843017 /* BeGreaterThanOrEqualTo.swift in Sources */, + F4BD249C60F21F5E0F7C1FAC8A5BC2AF /* BeIdenticalTo.swift in Sources */, + B102ABE4E54B71B3D2C2118E2782FAB9 /* BeLessThan.swift in Sources */, + 75538A8B20C7A20AF3D54BBF35D56FFE /* BeLessThanOrEqual.swift in Sources */, + 1E1CE28FFCCD7499620B47C910E9B9E9 /* BeLogical.swift in Sources */, + 75ABB48E3C30C2D736C3D05D6FD566A8 /* BeNil.swift in Sources */, + 3C66D2692E811DAE57A244A67E7AC555 /* BeVoid.swift in Sources */, + A74537420FF0CEDC6B9E82E1DC4C2B15 /* Contain.swift in Sources */, + 25D1805055756CAA69A167CA03B2465C /* ContainElementSatisfying.swift in Sources */, + 37C5AC3FE6711A1117819AC5A18EE5C4 /* CwlBadInstructionException.swift in Sources */, + 051B2AF789E6D4E648C099830025DED9 /* CwlCatchBadInstruction.swift in Sources */, + 64819C8D4EBD3386377D0F84DC909F8B /* CwlCatchException.m in Sources */, + 2E6730CD6DFCFE1212EDE5343F2E099B /* CwlCatchException.swift in Sources */, + 25D7312BBE513DAB0ACBC1814DDC7C86 /* CwlDarwinDefinitions.swift in Sources */, + C3B1A7E0024A06554CBE973A69DFEDA2 /* CwlMachBadInstructionHandler.m in Sources */, + ADEE95A3A188BE3095990E20766BCCC8 /* DSL+Wait.swift in Sources */, + 8B55BD430033027AD5FF22D630DD9F62 /* DSL.m in Sources */, + 1A3E19B9F5EEB773C3BB61CA42F8BF62 /* DSL.swift in Sources */, + 3D1A89FDD6B579BAA92AD398E5C019F9 /* EndWith.swift in Sources */, + C8320A6164C870ADDB8A855ADEBBBDC9 /* Equal.swift in Sources */, + BC7B9761322C74FA27969BD55833BA47 /* Errors.swift in Sources */, + 65985C142EE8A74E6E56D5E30A39C79C /* Expectation.swift in Sources */, + 3E04D23B2995705A6106D41F3E3E4E33 /* ExpectationMessage.swift in Sources */, + 4FABBF5CA8F735F48035BE4144613CB7 /* Expression.swift in Sources */, + 17C8EE7DF3F57C8F99EAF63C6E61EA99 /* FailureMessage.swift in Sources */, + 62D26CE7BA3AEDB4E5E87218FDCBBA90 /* Functional.swift in Sources */, + 988EED125395950177DC14AF9BC87D8D /* HaveCount.swift in Sources */, + 4D68C35510D1E911C9B89840FC4B777F /* mach_excServer.c in Sources */, + F28003B228B82B7E1497D4F41F55A31E /* Match.swift in Sources */, + C06FA100C1BBEE34B863BCB8A65359C1 /* MatcherFunc.swift in Sources */, + 6BB0EBEB4730B94AC07458E398D142C8 /* MatcherProtocols.swift in Sources */, + 45F183320C688F9978649F30ABE21D09 /* MatchError.swift in Sources */, + 4CDACD8A5A6CFB688838AA988E7D1E43 /* Nimble-dummy.m in Sources */, + 54CC2049C937561A469575AF9E6A6FE9 /* NimbleEnvironment.swift in Sources */, + CF55697859D633C852C3586384647EB6 /* NimbleXCTestHandler.swift in Sources */, + 6CB4890B9BF5F846E980634AFE83917D /* NMBExceptionCapture.m in Sources */, + 68FD03C72D719117929696B62038B3D7 /* NMBExpectation.swift in Sources */, + A7C13C62E4116CA964A3E82179092AD5 /* NMBObjCMatcher.swift in Sources */, + AE4DA49ECD693BF384CD824DF02D7C6E /* NMBStringify.m in Sources */, + 31C39ED8CB1C9317F1F2840FC919662D /* PostNotification.swift in Sources */, + EF8548E0C37E8888D9DDC11ED89D3568 /* Predicate.swift in Sources */, + EAE2AAE5EB826B38978692984BB22FDD /* RaisesException.swift in Sources */, + EB3A73071ABA60E77E0704649637D8BD /* SatisfyAnyOf.swift in Sources */, + F3BAA36614ABDBC0538B0DEA99CF80A0 /* SourceLocation.swift in Sources */, + 8170866E2ACE0ACFBC6D90081354EC65 /* Stringers.swift in Sources */, + 3B3A88E074630B1EBC2139F4F70F0443 /* ThrowAssertion.swift in Sources */, + 5BF274C2DEF332ED79B1CD15CFEC3498 /* ThrowError.swift in Sources */, + 29A65FF7D1752DFFF87F5DC8F55CE859 /* ToSucceed.swift in Sources */, + A61ADD214AA182EEB2AC95EA3F3D658F /* XCTestObservationCenter+Register.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7973F4F55C7769DC240462E0459858A1 /* Sources */ = { + 46AFBC3BBC4753EC5E04BB357F5F8A55 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7DC1F64E7A3A97A5A620B7835FEBE34B /* Pods-TRXTests-dummy.m in Sources */, + A2ACDD3235110F6981004483CE60476F /* CurrentTestCaseTracker.swift in Sources */, + 4377B0EBB0D9D71671767F5EE0E569C7 /* DynamicSizeSnapshot.swift in Sources */, + 24E857640F46E9D5B4FB7F22BD6A33B6 /* HaveValidDynamicTypeSnapshot.swift in Sources */, + 6236BE5FA5B5B8A0B39104A94F3CD782 /* HaveValidSnapshot.swift in Sources */, + 0A1A3DC52B83AA8A153A008710FCBFFA /* NBSMockedApplication.m in Sources */, + C907DC9A1F3C78CD7F5DBDB699289C0F /* Nimble-Snapshots-dummy.m in Sources */, + AED58B976AB8F62FBFB0DA437861E088 /* PrettyDynamicTypeSyntax.swift in Sources */, + 74A7C826ED390EF61C25C69BB5A9C5B6 /* PrettySyntax.swift in Sources */, + C365D0F41EBC7BDE6877581CB2494E03 /* XCTestObservationCenter+CurrentTestCaseTracker.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7DE474775CBF413C7A124107E34E5614 /* Sources */ = { + 9F743CBC611AE9E79EBF4BA01D4FFDBD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 497AA8816FC08215EF4C2431E1986992 /* FBSnapshotTestCase-dummy.m in Sources */, - 6914EE43A9B8B8D30220B3B6B0D57523 /* FBSnapshotTestCase.m in Sources */, - 6E4A16BF4D27C48BB1FE1E1CF5E8B90E /* FBSnapshotTestCasePlatform.m in Sources */, - F47158C234C50FFB069A1EF8AB26D9F1 /* FBSnapshotTestController.m in Sources */, - 85D178DFCA1BC67BBFB1188E34EC5B19 /* SwiftSupport.swift in Sources */, - 2C87E1788C8FA06AE3481A2226E3AF2D /* UIApplication+StrictKeyWindow.m in Sources */, - 11C22C7B844DF31A5EBDC9AC132C5E94 /* UIImage+Compare.m in Sources */, - C360952381641F725C15758993A0F665 /* UIImage+Diff.m in Sources */, - D5C30BC656C11AF60394E3180A217BB1 /* UIImage+Snapshot.m in Sources */, + 90C0CC6A63AB8AE0D63FE74846DAA1F8 /* Pods-TRXTests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - AE7BCB0C919D72823BFAC77FBDD032C3 /* Sources */ = { + DEFECBC3C2924095C5F3BB683BD156D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 636A1DD83197D4668B43CC94E874E892 /* Callsite.swift in Sources */, - A8B06933352034483F1654F21432FDCF /* Closures.swift in Sources */, - B1825287DE872A038A4A44623EA54C1B /* Configuration.swift in Sources */, - 1330782A55555085FE8872AF7BA8DD48 /* DSL.swift in Sources */, - 3DB8697476CF88CF1F0DACBD6197AEA3 /* ErrorUtility.swift in Sources */, - 1C696A0CCC5C29FFBBB8620F5DC8FA6D /* Example.swift in Sources */, - CBB70E882E7FE0FF926730EAA0CD59DA /* ExampleGroup.swift in Sources */, - 9BAEE6A607528BBFAA526CFFA5277E43 /* ExampleHooks.swift in Sources */, - 109EB99F003668E3ED3868B57E1071AF /* ExampleMetadata.swift in Sources */, - 83DA9B6F380D643725CFEE4E9AAB9F5D /* Filter.swift in Sources */, - 85D4DBD7E83768DAFD903EF915D1C1DA /* HooksPhase.swift in Sources */, - AD2D4354F429E4DBD49D327BD408A3EB /* NSBundle+CurrentTestBundle.swift in Sources */, - A0D6FCA100B1C734A358AB5C8AA55E1B /* NSString+QCKSelectorName.m in Sources */, - 42A5BFF181D12A41294B42BE5931FC9B /* QCKDSL.m in Sources */, - F953B46C77C8981DBEC593D9FDCFA4C9 /* Quick-dummy.m in Sources */, - B8E35E15EE54E28EBC2E50D54A80285D /* QuickConfiguration.m in Sources */, - 730FE65CF9B832FC01AB3F545A8CAF73 /* QuickSelectedTestSuiteBuilder.swift in Sources */, - 0667612C6505ACFF5D92B5B61FE7BBEA /* QuickSpec.m in Sources */, - 49CA018A1EFE0681D470F5743BA8BB0F /* QuickTestSuite.swift in Sources */, - 4A2EF0E72836C8432665C044C67933EA /* String+FileName.swift in Sources */, - 24BA48295DE470061BB55F0999CC7B28 /* SuiteHooks.swift in Sources */, - BBE10615F3CD16FAF02BBD3D42B6D246 /* World+DSL.swift in Sources */, - 5438871833E759C86C2CA743AD3EF2DD /* World.swift in Sources */, - F0EAD2BC539C8BF0B074566D73D4C6DB /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, + 0070E47A02237D3859A9D7A4EF2EEDC4 /* Callsite.swift in Sources */, + 70818FADE7AACFF3AE55DCE71D3E49A9 /* Closures.swift in Sources */, + A165E7F1F547BABA8BD22537D083607E /* Configuration.swift in Sources */, + 47699DC316EBBF997D8BD9A40F9F6CB3 /* DSL.swift in Sources */, + D606AF010FCD76080470EF71F93D8410 /* ErrorUtility.swift in Sources */, + 2B54751A0A4669649E6B1039AC8870B7 /* Example.swift in Sources */, + 804603755C246C88807BFA9BD2B03AEB /* ExampleGroup.swift in Sources */, + 35CCEBDFF67DD636A9301709FF7DD23B /* ExampleHooks.swift in Sources */, + 947C4FB60AF70037C1A258F15D3DCB3F /* ExampleMetadata.swift in Sources */, + 96C7558B42ED7A8A33EAC8A94677A5B2 /* Filter.swift in Sources */, + 24670236AEC11DE2259467E9C9822C60 /* HooksPhase.swift in Sources */, + 87B09AC69ADAC2ADF5243BFB06B5B30E /* NSBundle+CurrentTestBundle.swift in Sources */, + 9976E6F0C1DAF10A8E6E512DBDBD2786 /* NSString+C99ExtendedIdentifier.swift in Sources */, + D408A6EC57EC4AB7573C906DE73D48EC /* QCKDSL.m in Sources */, + A1A449AFBFE2B317DFA1D812CF3DBDE4 /* Quick-dummy.m in Sources */, + 143433CE06FC7E8ACBC21EE35BED47DC /* QuickConfiguration.m in Sources */, + BB6EC3B43400455F2FC454D5629BBCC9 /* QuickSelectedTestSuiteBuilder.swift in Sources */, + A3758C19FA6A1E0C0F30EE2DC94AB303 /* QuickSpec.m in Sources */, + C15ED5F53432E86C1F858A2E0C37A93E /* QuickSpecBase.m in Sources */, + 532CABEF91DB2879ED3E754AE86A7CFF /* QuickTestSuite.swift in Sources */, + 375A955DBD71AEFD185E729BA970F755 /* SuiteHooks.swift in Sources */, + F85171F2D78C81422E38DA990CD9B319 /* URL+FileName.swift in Sources */, + 453982D62FB186B3AE2C4D3EF96DB5C0 /* World+DSL.swift in Sources */, + D1082E58F18E25BA41781F499EFFF0A5 /* World.swift in Sources */, + FBD9388D2209675432B58D713CAA4B01 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - CF1F5A529EDB9E4B0CDE183D34511F72 /* Sources */ = { + E2E80CCD063D04B57A1A5E140726E8A4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A1253488850CE3B86ED19CB93A9CD3D5 /* HaveValidSnapshot.swift in Sources */, - 36A09777D96DA589FD7FB47DD6EDC2AB /* Nimble-Snapshots-dummy.m in Sources */, - ED6A0B20E661EA13A99C377E2213DC5F /* NimbleSnapshotsConfiguration.swift in Sources */, - D39881E8AB50A77DABF756314695BF25 /* PrettySyntax.swift in Sources */, + 506D761F91EC3583789A837C559972FE /* FBSnapshotTestCase-dummy.m in Sources */, + BE14F2198CDB0DAD98A567981D21C7A1 /* FBSnapshotTestCase.m in Sources */, + DB7A106243AC974FC7EBEB00B506C786 /* FBSnapshotTestCasePlatform.m in Sources */, + A4F69F3477A935285620AC3031C5C848 /* FBSnapshotTestController.m in Sources */, + 1AB7934C16CE49DE196FFC7BE7278287 /* SwiftSupport.swift in Sources */, + 094973D2D2F1E3B2E772F93C8147C6B9 /* UIApplication+StrictKeyWindow.m in Sources */, + 69DA8B003216466C60F029CBD79897F1 /* UIImage+Compare.m in Sources */, + 35DD05FD595A6FE7F5A0692D12E319DC /* UIImage+Diff.m in Sources */, + 756564ABAF2892FE7140C92A1CDDCF65 /* UIImage+Snapshot.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 005D2FAAEB1B212A51B178B246538C41 /* PBXTargetDependency */ = { + 0106C91D2E7BBDF301E6A41CB01BDE0C /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Nimble; - target = 40FF1C77152F384080A1A02E90A36DA9 /* Nimble */; - targetProxy = 16C4770CBDC3D282CE859382E56BE2BE /* PBXContainerItemProxy */; + name = FBSnapshotTestCase; + target = 34CD2E3428AB802BACA62286FF5074B1 /* FBSnapshotTestCase */; + targetProxy = 4056FFC91A14DDA4FB1C00B86D6B0073 /* PBXContainerItemProxy */; }; - 51181AC113284270633563DB2A331F61 /* PBXTargetDependency */ = { + 1F7FA6FD87BA0C6DA948A826A00CD36D /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Nimble; - target = 40FF1C77152F384080A1A02E90A36DA9 /* Nimble */; - targetProxy = 7839961D148D585620FA3CB1EEE772EF /* PBXContainerItemProxy */; + target = DD7C8BF89FE8053D0A2A2D88BB49CF07 /* Nimble */; + targetProxy = 3CED1AD2DAD4C152F79A687D93BB6BFC /* PBXContainerItemProxy */; }; - 630B12EEA1A2CF8038C1E46ABF2C2A89 /* PBXTargetDependency */ = { + 2A87A2B5D370BC2AB91C28CC3B4C7D3E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = FBSnapshotTestCase; - target = 5DB46EA499F9A5E22765121102FCC34B /* FBSnapshotTestCase */; - targetProxy = 3076B96971D7C121D44AE85AA8BD8D91 /* PBXContainerItemProxy */; + target = 34CD2E3428AB802BACA62286FF5074B1 /* FBSnapshotTestCase */; + targetProxy = 5353CAC70EC628944A98543A0891A077 /* PBXContainerItemProxy */; }; - 72735621CB28612EA70F5D4C0A447ECC /* PBXTargetDependency */ = { + 45507B0A0DEFBECD26622CFDA9A62BF8 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "Nimble-Snapshots"; - target = 9A3AE440FB23CCC076AA408C3C4836C4 /* Nimble-Snapshots */; - targetProxy = ACE5A968F36AB56BBFB9D1C9D951AD10 /* PBXContainerItemProxy */; - }; - 917D43AEAA807A3F9580276BE4611E66 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Quick; - target = A5C430B1E2D8298FD6C5403590C0B80F /* Quick */; - targetProxy = AD8D9E5C1E2A5E186BE6CD546248CF51 /* PBXContainerItemProxy */; + target = 6B8D2C966D4D7E5D2DF4A6BADFEF6290 /* Nimble-Snapshots */; + targetProxy = 407DF4C5265E64239AE297FBC8EDF2F8 /* PBXContainerItemProxy */; }; - B5EEF869A8D853590BFC239D1E1CB7D8 /* PBXTargetDependency */ = { + B0D7FE3C7B4622F2A341FEDA741C01C5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Quick; - target = A5C430B1E2D8298FD6C5403590C0B80F /* Quick */; - targetProxy = 7B73A1A618322F16D02EC89ED7B2076D /* PBXContainerItemProxy */; + target = 8264CB4234D8D7CA47AFB08BB6EBBCF4 /* Quick */; + targetProxy = DEDDF0B41AE8B5CA083EDB55C7000C53 /* PBXContainerItemProxy */; }; - DDF82A7F4F0212527E85A6197F5FD72A /* PBXTargetDependency */ = { + FD0636A82A891D3863EBCA65D7EE07CF /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBSnapshotTestCase; - target = 5DB46EA499F9A5E22765121102FCC34B /* FBSnapshotTestCase */; - targetProxy = 67B84CC48124DDE2ADD9AFDFBAEE034C /* PBXContainerItemProxy */; + name = Nimble; + target = DD7C8BF89FE8053D0A2A2D88BB49CF07 /* Nimble */; + targetProxy = 642A89DF7D1D49DA93E3B815E53B2FCE /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 5BE7A699F6FBA5968C1306917CF0359F /* Release */ = { + 157AF0CD5E5AB2A2E74D3B8ECD865185 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 66E7F921A5FA484CAEF02A7C6DB6EB13 /* Nimble-Snapshots.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/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/Nimble-Snapshots/Nimble-Snapshots.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Nimble_Snapshots; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 620AD60CFC04D64DDC3572DD1722FAD9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + 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_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", + "POD_CONFIGURATION_RELEASE=1", "$(inherited)", ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -1113,18 +1162,18 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.3; - ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE_SPECIFIER = ABCDEFGHIJ/; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_VERSION = 3.0; SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; }; - name = Debug; + name = Release; }; - 9C9D747B4B60B0AF19A9B69177CB939D /* Debug */ = { + 545757539255DA8A4E8B63C9D54CD1FF /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FC0E9362F64A623815A6FF09A0CA5D40 /* Quick.xcconfig */; + baseConfigurationReference = A015171E3978E83BFC328D94FC5CFA0E /* Pods-TRXTests.debug.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1136,16 +1185,21 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-TRXTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-TRXTests/Pods-TRXTests.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Quick; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_TRXTests; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1154,100 +1208,85 @@ }; name = Debug; }; - A4430C9A172B825D8C3897B6DC93C8D4 /* Release */ = { + A00BE4B380BB3A448593E5D69CCC696A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5CE0F74F3D19787D4C2D38C5D26D5211 /* Nimble.xcconfig */; + baseConfigurationReference = 4A52B274D15286A53775032D69E8616C /* Nimble-Snapshots.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/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/Nimble/Nimble.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Nimble; + MODULEMAP_FILE = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = Nimble_Snapshots; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - AA581768B2C35E6218315EABF33B732D /* Release */ = { + B11F309976C1C797E655C7BFFCC8BD3E /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0744337D5B0C7F295F047983EE5D5FC2 /* Quick.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = 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_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; 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; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - PROVISIONING_PROFILE_SPECIFIER = ABCDEFGHIJ/; - STRIP_INSTALLED_PRODUCT = NO; + GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/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"; + MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Quick; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; - SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Release; }; - CF3042A3C0139B50D0F19D8FC418ACEA /* Release */ = { + B68B0A146151841ACE941243C8267FB2 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FC0E9362F64A623815A6FF09A0CA5D40 /* Quick.xcconfig */; + baseConfigurationReference = 0744337D5B0C7F295F047983EE5D5FC2 /* Quick.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1260,26 +1299,29 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = Quick; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - D4D173E0DBBA870BF3724D576A88C3A7 /* Release */ = { + BD5CB3691FE92843589F6AF6BCC8DFD5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 01BF96909EDC4CCB6D8E5693F8D37092 /* FBSnapshotTestCase.xcconfig */; + baseConfigurationReference = D19A20D6946E8835B1005C5100B2F91F /* FBSnapshotTestCase.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1292,88 +1334,144 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = FBSnapshotTestCase; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - D4F77D97C24E59EAC39325C64086EDD6 /* Debug */ = { + CF3BB66EB3CB25EAC2CD831D3ACCC046 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 01BF96909EDC4CCB6D8E5693F8D37092 /* FBSnapshotTestCase.xcconfig */; + baseConfigurationReference = D6B2AC57C057697F5EDFFA1490607B67 /* Pods-TRXTests.release.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-TRXTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = FBSnapshotTestCase; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-TRXTests/Pods-TRXTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_TRXTests; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; + name = Release; + }; + D7B1487F48E36BAD2CEF0AFCA4908B67 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + 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_OBJC_ROOT_CLASS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + ONLY_ACTIVE_ARCH = YES; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; name = Debug; }; - E1D7FA5E8F224B121D0ECBD7ED084C38 /* Debug */ = { + DA50E8F3A282EF8303372782E10598EF /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5CE0F74F3D19787D4C2D38C5D26D5211 /* Nimble.xcconfig */; + baseConfigurationReference = 4A52B274D15286A53775032D69E8616C /* Nimble-Snapshots.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/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/Nimble/Nimble.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Nimble; + MODULEMAP_FILE = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Nimble_Snapshots; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - E56F70D5885BEFA81D7BBC5BD14E69CC /* Release */ = { + F0BE9F21CC451E6E481AD11ECB9F4CFE /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D6B2AC57C057697F5EDFFA1490607B67 /* Pods-TRXTests.release.xcconfig */; + baseConfigurationReference = 523920F4E7F228A50347C33BD70EC0A7 /* Nimble.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1385,64 +1483,63 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-TRXTests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + 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-TRXTests/Pods-TRXTests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_TRXTests; + PRODUCT_NAME = Nimble; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - F11A1F0340BFD8A4E8576D45E0E7F846 /* Debug */ = { + F6DBA53A4511720174B84279A5CEB561 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 66E7F921A5FA484CAEF02A7C6DB6EB13 /* Nimble-Snapshots.xcconfig */; + baseConfigurationReference = D19A20D6946E8835B1005C5100B2F91F /* FBSnapshotTestCase.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble-Snapshots/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/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"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Nimble_Snapshots; + MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = FBSnapshotTestCase; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - FE0160B5753338CB07085E48E510E5BE /* Debug */ = { + FF2E959C56F73D64BA78EAE7B55A097C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A015171E3978E83BFC328D94FC5CFA0E /* Pods-TRXTests.debug.xcconfig */; + baseConfigurationReference = 523920F4E7F228A50347C33BD70EC0A7 /* Nimble.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1454,21 +1551,19 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-TRXTests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + 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-TRXTests/Pods-TRXTests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_TRXTests; + PRODUCT_NAME = Nimble; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1478,56 +1573,56 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 16338EE1C1BD578312E653B5ED79DBC9 /* Build configuration list for PBXNativeTarget "Nimble-Snapshots" */ = { + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - F11A1F0340BFD8A4E8576D45E0E7F846 /* Debug */, - 5BE7A699F6FBA5968C1306917CF0359F /* Release */, + D7B1487F48E36BAD2CEF0AFCA4908B67 /* Debug */, + 157AF0CD5E5AB2A2E74D3B8ECD865185 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + 439502BDB29394EE0D69336E69C8494C /* Build configuration list for PBXNativeTarget "Nimble" */ = { isa = XCConfigurationList; buildConfigurations = ( - 620AD60CFC04D64DDC3572DD1722FAD9 /* Debug */, - AA581768B2C35E6218315EABF33B732D /* Release */, + FF2E959C56F73D64BA78EAE7B55A097C /* Debug */, + F0BE9F21CC451E6E481AD11ECB9F4CFE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 8D492E06A9E9F494492A2A3B4D19493E /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */ = { + 4A60DC8FAD063CBB25A5DFE7BB23CE20 /* Build configuration list for PBXNativeTarget "Quick" */ = { isa = XCConfigurationList; buildConfigurations = ( - D4F77D97C24E59EAC39325C64086EDD6 /* Debug */, - D4D173E0DBBA870BF3724D576A88C3A7 /* Release */, + B68B0A146151841ACE941243C8267FB2 /* Debug */, + B11F309976C1C797E655C7BFFCC8BD3E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A4964CB88DC1058EA701972205BBB4A0 /* Build configuration list for PBXNativeTarget "Nimble" */ = { + 6D51ACF55AF01AA357084E65EC4B5A9E /* Build configuration list for PBXNativeTarget "Pods-TRXTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - E1D7FA5E8F224B121D0ECBD7ED084C38 /* Debug */, - A4430C9A172B825D8C3897B6DC93C8D4 /* Release */, + 545757539255DA8A4E8B63C9D54CD1FF /* Debug */, + CF3BB66EB3CB25EAC2CD831D3ACCC046 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - BD4E1396341048AA12F78D6F0EA9F5F5 /* Build configuration list for PBXNativeTarget "Pods-TRXTests" */ = { + 7779D6305C041AD32CE7ABC72AAAE8AB /* Build configuration list for PBXNativeTarget "Nimble-Snapshots" */ = { isa = XCConfigurationList; buildConfigurations = ( - FE0160B5753338CB07085E48E510E5BE /* Debug */, - E56F70D5885BEFA81D7BBC5BD14E69CC /* Release */, + A00BE4B380BB3A448593E5D69CCC696A /* Debug */, + DA50E8F3A282EF8303372782E10598EF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - CDD472835DE04EBDB4665D3207961542 /* Build configuration list for PBXNativeTarget "Quick" */ = { + F28097D43AF5CD8DA838ABD52A053790 /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9C9D747B4B60B0AF19A9B69177CB939D /* Debug */, - CF3042A3C0139B50D0F19D8FC418ACEA /* Release */, + BD5CB3691FE92843589F6AF6BCC8DFD5 /* Debug */, + F6DBA53A4511720174B84279A5CEB561 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Quick/README.md b/Pods/Quick/README.md index c3ac7db..e6dc0ad 100644 --- a/Pods/Quick/README.md +++ b/Pods/Quick/README.md @@ -1,6 +1,9 @@ ![](http://f.cl.ly/items/0r1E192C1R0b2g2Q3h2w/QuickLogo_Color.png) [![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) +[![Platforms](https://img.shields.io/cocoapods/p/Quick.svg)](https://cocoapods.org/pods/Quick) 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). @@ -41,7 +44,7 @@ Certain versions of Quick and Nimble only support certain versions of Swift. Dep |Swift version |Quick version |Nimble version | |:--------------------|:---------------|:--------------| -|Swift 3 |v0.10.0 or later|v5.0.0 or later| +|Swift 3 |v1.0.0 or later |v5.0.0 or later| |Swift 2.2 / Swift 2.3|v0.9.3 |v4.1.0 | ## Documentation @@ -53,26 +56,33 @@ All documentation can be found in the [Documentation folder](./Documentation), i use_frameworks! -def testing_pods - pod 'Quick' - pod 'Nimble' -end +target "MyApp" do + # Normal libraries -target 'MyTests' do - testing_pods -end + abstract_target 'Tests' do + inherit! :search_paths + target "MyAppTests" + target "MyAppUITests" -target 'MyUITests' do - testing_pods + pod 'Quick' + pod 'Nimble' + end end ``` ## Projects using Quick -Many apps use both Quick and Nimble however, as they are not included in the app binary, neither appear in “Top Used Libraries” blog posts. Therefore, it would be greatly appreciated to remind contributors that their efforts are valued by compiling a list of organizations and projects that use them. +Over ten-thousand apps use either Quick and Nimble however, as they are not included in the app binary, neither appear in “Top Used Libraries” blog posts. Therefore, it would be greatly appreciated to remind contributors that their efforts are valued by compiling a list of organizations and projects that use them. Does your organization or project use Quick and Nimble? If yes, [please add your project to the list](https://github.com/Quick/Quick/wiki/Projects-using-Quick). +## Who uses Quick + +Similar to projects using Quick, it would be nice to hear why people use Quick and Nimble. Are there features you love? Are there features that are just okay? Are there some features we have that no one uses? + +Have something positive to say about Quick (or Nimble)? If yes, [provide a testimonial here](https://github.com/Quick/Quick/wiki/Who-uses-Quick). + + ## License Apache 2.0 license. See the [`LICENSE`](LICENSE) file for details. diff --git a/Pods/Quick/Sources/Quick/Callsite.swift b/Pods/Quick/Sources/Quick/Callsite.swift index 53496cd..bb5cc0c 100644 --- a/Pods/Quick/Sources/Quick/Callsite.swift +++ b/Pods/Quick/Sources/Quick/Callsite.swift @@ -21,10 +21,12 @@ final public class Callsite: NSObject { } } -/** - Returns a boolean indicating whether two Callsite objects are equal. - If two callsites are in the same file and on the same line, they must be equal. -*/ -public func ==(lhs: Callsite, rhs: Callsite) -> Bool { - return lhs.file == rhs.file && lhs.line == rhs.line +extension Callsite { + /** + Returns a boolean indicating whether two Callsite objects are equal. + 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 + } } diff --git a/Pods/Quick/Sources/Quick/Configuration/Configuration.swift b/Pods/Quick/Sources/Quick/Configuration/Configuration.swift index 9836fef..583651b 100644 --- a/Pods/Quick/Sources/Quick/Configuration/Configuration.swift +++ b/Pods/Quick/Sources/Quick/Configuration/Configuration.swift @@ -4,7 +4,7 @@ import Foundation A closure that temporarily exposes a Configuration object within the scope of the closure. */ -public typealias QuickConfigurer = (_ configuration: Configuration) -> () +public typealias QuickConfigurer = (_ configuration: Configuration) -> Void /** A closure that, given metadata about an example, returns a boolean value @@ -19,14 +19,14 @@ public typealias ExampleFilter = (_ example: Example) -> Bool final public class Configuration: NSObject { internal let exampleHooks = ExampleHooks() internal let suiteHooks = SuiteHooks() - internal var exclusionFilters: [ExampleFilter] = [{ example in + internal var exclusionFilters: [ExampleFilter] = [ { example in if let pending = example.filterFlags[Filter.pending] { return pending } else { return false } }] - internal var inclusionFilters: [ExampleFilter] = [{ example in + internal var inclusionFilters: [ExampleFilter] = [ { example in if let focused = example.filterFlags[Filter.focused] { return focused } else { diff --git a/Pods/Quick/Sources/Quick/DSL/DSL.swift b/Pods/Quick/Sources/Quick/DSL/DSL.swift index b514b82..3da2c42 100644 --- a/Pods/Quick/Sources/Quick/DSL/DSL.swift +++ b/Pods/Quick/Sources/Quick/DSL/DSL.swift @@ -36,8 +36,8 @@ public func afterSuite(_ closure: @escaping AfterSuiteClosure) { using `describe` or `context`--the closure may contain any number of `beforeEach` and `afterEach` closures, as well as any number of examples (defined using `it`). */ -public func sharedExamples(_ name: String, closure: @escaping () -> ()) { - World.sharedWorld.sharedExamples(name, closure: { (NSDictionary) in closure() }) +public func sharedExamples(_ name: String, closure: @escaping () -> Void) { + World.sharedWorld.sharedExamples(name) { _ in closure() } } /** @@ -65,14 +65,14 @@ public func sharedExamples(_ name: String, closure: @escaping SharedExampleClosu - parameter closure: A closure that can contain other examples. - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. */ -public func describe(_ description: String, flags: FilterFlags = [:], closure: () -> ()) { +public func describe(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.describe(description, flags: flags, closure: closure) } /** Defines an example group. Equivalent to `describe`. */ -public func context(_ description: String, flags: FilterFlags = [:], closure: () -> ()) { +public func context(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.context(description, flags: flags, closure: closure) } @@ -127,7 +127,7 @@ public func afterEach(_ closure: @escaping AfterExampleWithMetadataClosure) { - parameter file: The absolute path to the file containing the example. A sensible default is provided. - parameter line: The line containing the example. A sensible default is provided. */ -public func it(_ description: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, closure: @escaping () -> ()) { +public func it(_ description: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, closure: @escaping () -> Void) { World.sharedWorld.it(description, flags: flags, file: file, line: line, closure: closure) } @@ -174,7 +174,7 @@ public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: String - parameter description: An arbitrary string describing the example or example group. - parameter closure: A closure that will not be evaluated. */ -public func pending(_ description: String, closure: () -> ()) { +public func pending(_ description: String, closure: () -> Void) { World.sharedWorld.pending(description, closure: closure) } @@ -182,7 +182,7 @@ public func pending(_ description: String, closure: () -> ()) { Use this to quickly mark a `describe` closure as pending. This disables all examples within the closure. */ -public func xdescribe(_ description: String, flags: FilterFlags, closure: () -> ()) { +public func xdescribe(_ description: String, flags: FilterFlags, closure: () -> Void) { World.sharedWorld.xdescribe(description, flags: flags, closure: closure) } @@ -190,7 +190,7 @@ public func xdescribe(_ description: String, flags: FilterFlags, closure: () -> Use this to quickly mark a `context` closure as pending. This disables all examples within the closure. */ -public func xcontext(_ description: String, flags: FilterFlags, closure: () -> ()) { +public func xcontext(_ description: String, flags: FilterFlags, closure: () -> Void) { xdescribe(description, flags: flags, closure: closure) } @@ -198,7 +198,7 @@ public func xcontext(_ description: String, flags: FilterFlags, closure: () -> ( 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 () -> ()) { +public func xit(_ description: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, closure: @escaping () -> Void) { World.sharedWorld.xit(description, flags: flags, file: file, line: line, closure: closure) } @@ -207,14 +207,14 @@ public func xit(_ description: String, flags: FilterFlags = [:], file: String = If any examples in the test suite are focused, only those examples are executed. This trumps any explicitly focused or unfocused examples within the closure--they are all treated as focused. */ -public func fdescribe(_ description: String, flags: FilterFlags = [:], closure: () -> ()) { +public func fdescribe(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.fdescribe(description, flags: flags, closure: closure) } /** Use this to quickly focus a `context` closure. Equivalent to `fdescribe`. */ -public func fcontext(_ description: String, flags: FilterFlags = [:], closure: () -> ()) { +public func fcontext(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { fdescribe(description, flags: flags, closure: closure) } @@ -222,6 +222,20 @@ 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 () -> ()) { +public func fit(_ description: String, flags: FilterFlags = [:], file: String = #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) { + 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) { + World.sharedWorld.fitBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) +} diff --git a/Pods/Quick/Sources/Quick/DSL/World+DSL.swift b/Pods/Quick/Sources/Quick/DSL/World+DSL.swift index ab35341..127ca54 100644 --- a/Pods/Quick/Sources/Quick/DSL/World+DSL.swift +++ b/Pods/Quick/Sources/Quick/DSL/World+DSL.swift @@ -18,7 +18,7 @@ extension World { registerSharedExample(name, closure: closure) } - internal func describe(_ description: String, flags: FilterFlags, closure: () -> ()) { + internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { guard currentExampleMetadata == nil else { raiseError("'describe' cannot be used inside '\(currentPhase)', 'describe' may only be used inside 'context' or 'describe'. ") } @@ -30,20 +30,20 @@ extension World { performWithCurrentExampleGroup(group, closure: closure) } - internal func context(_ description: String, flags: FilterFlags, closure: () -> ()) { + internal func context(_ description: String, flags: FilterFlags, closure: () -> Void) { guard currentExampleMetadata == nil else { raiseError("'context' cannot be used inside '\(currentPhase)', 'context' may only be used inside 'context' or 'describe'. ") } self.describe(description, flags: flags, closure: closure) } - internal func fdescribe(_ description: String, flags: FilterFlags, closure: () -> ()) { + internal func fdescribe(_ description: String, flags: FilterFlags, closure: () -> Void) { var focusedFlags = flags focusedFlags[Filter.focused] = true self.describe(description, flags: focusedFlags, closure: closure) } - internal func xdescribe(_ description: String, flags: FilterFlags, closure: () -> ()) { + internal func xdescribe(_ description: String, flags: FilterFlags, closure: () -> Void) { var pendingFlags = flags pendingFlags[Filter.pending] = true self.describe(description, flags: pendingFlags, closure: closure) @@ -85,7 +85,7 @@ extension World { } #endif - internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> ()) { + internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { if beforesCurrentlyExecuting { raiseError("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'. ") } @@ -100,13 +100,13 @@ extension World { currentExampleGroup.appendExample(example) } - internal func fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> ()) { + internal func fit(_ description: String, flags: FilterFlags, file: String, 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 () -> ()) { + internal func xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { var pendingFlags = flags pendingFlags[Filter.pending] = true self.it(description, flags: pendingFlags, file: file, line: line, closure: closure) @@ -131,19 +131,25 @@ extension World { } } + internal func fitBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { + var focusedFlags = flags + focusedFlags[Filter.focused] = true + self.itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: focusedFlags, file: file, line: line) + } + #if _runtime(_ObjC) @objc(itWithDescription:flags:file:line:closure:) - private func objc_it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> ()) { + private func objc_it(_ description: String, flags: FilterFlags, file: String, 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 () -> ()) { + private func objc_fit(_ description: String, flags: FilterFlags, file: String, 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 () -> ()) { + private func objc_xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { xit(description, flags: flags, file: file, line: line, closure: closure) } @@ -153,7 +159,7 @@ extension World { } #endif - internal func pending(_ description: String, closure: () -> ()) { + internal func pending(_ description: String, closure: () -> Void) { print("Pending: \(description)") } diff --git a/Pods/Quick/Sources/Quick/Example.swift b/Pods/Quick/Sources/Quick/Example.swift index 844bf3f..56b3303 100644 --- a/Pods/Quick/Sources/Quick/Example.swift +++ b/Pods/Quick/Sources/Quick/Example.swift @@ -23,16 +23,16 @@ final public class Example: NSObject { weak internal var group: ExampleGroup? private let internalDescription: String - private let closure: () -> () + private let closure: () -> Void private let flags: FilterFlags - internal init(description: String, callsite: Callsite, flags: FilterFlags, closure: @escaping () -> ()) { + internal init(description: String, callsite: Callsite, flags: FilterFlags, closure: @escaping () -> Void) { self.internalDescription = description self.closure = closure self.callsite = callsite self.flags = flags } - + public override var description: String { return internalDescription } @@ -102,10 +102,12 @@ final public class Example: NSObject { } } -/** - Returns a boolean indicating whether two Example objects are equal. - If two examples are defined at the exact same callsite, they must be equal. -*/ -public func ==(lhs: Example, rhs: Example) -> Bool { - return lhs.callsite == rhs.callsite +extension Example { + /** + Returns a boolean indicating whether two Example objects are equal. + If two examples are defined at the exact same callsite, they must be equal. + */ + @nonobjc public static func == (lhs: Example, rhs: Example) -> Bool { + return lhs.callsite == rhs.callsite + } } diff --git a/Pods/Quick/Sources/Quick/ExampleGroup.swift b/Pods/Quick/Sources/Quick/ExampleGroup.swift index b0b8be4..ca38356 100644 --- a/Pods/Quick/Sources/Quick/ExampleGroup.swift +++ b/Pods/Quick/Sources/Quick/ExampleGroup.swift @@ -8,7 +8,7 @@ import Foundation final public class ExampleGroup: NSObject { weak internal var parent: ExampleGroup? internal let hooks = ExampleHooks() - + internal var phase: HooksPhase = .nothingExecuted private let internalDescription: String @@ -50,7 +50,7 @@ final public class ExampleGroup: NSObject { internal var filterFlags: FilterFlags { var aggregateFlags = flags - walkUp() { (group: ExampleGroup) -> () in + walkUp { group in for (key, value) in group.flags { aggregateFlags[key] = value } @@ -60,7 +60,7 @@ final public class ExampleGroup: NSObject { internal var befores: [BeforeExampleWithMetadataClosure] { var closures = Array(hooks.befores.reversed()) - walkUp() { (group: ExampleGroup) -> () in + walkUp { group in closures.append(contentsOf: Array(group.hooks.befores.reversed())) } return Array(closures.reversed()) @@ -68,13 +68,13 @@ final public class ExampleGroup: NSObject { internal var afters: [AfterExampleWithMetadataClosure] { var closures = hooks.afters - walkUp() { (group: ExampleGroup) -> () in + walkUp { group in closures.append(contentsOf: group.hooks.afters) } return closures } - internal func walkDownExamples(_ callback: (_ example: Example) -> ()) { + internal func walkDownExamples(_ callback: (_ example: Example) -> Void) { for example in childExamples { callback(example) } @@ -93,7 +93,7 @@ final public class ExampleGroup: NSObject { childExamples.append(example) } - private func walkUp(_ callback: (_ group: ExampleGroup) -> ()) { + private func walkUp(_ callback: (_ group: ExampleGroup) -> Void) { var group = self while let parent = group.parent { callback(parent) diff --git a/Pods/Quick/Sources/Quick/Hooks/Closures.swift b/Pods/Quick/Sources/Quick/Hooks/Closures.swift index a241b33..9c7d310 100644 --- a/Pods/Quick/Sources/Quick/Hooks/Closures.swift +++ b/Pods/Quick/Sources/Quick/Hooks/Closures.swift @@ -3,13 +3,13 @@ /** A closure executed before an example is run. */ -public typealias BeforeExampleClosure = () -> () +public typealias BeforeExampleClosure = () -> Void /** A closure executed before an example is run. The closure is given example metadata, which contains information about the example that is about to be run. */ -public typealias BeforeExampleWithMetadataClosure = (_ exampleMetadata: ExampleMetadata) -> () +public typealias BeforeExampleWithMetadataClosure = (_ exampleMetadata: ExampleMetadata) -> Void /** A closure executed after an example is run. @@ -27,7 +27,7 @@ public typealias AfterExampleWithMetadataClosure = BeforeExampleWithMetadataClos /** A closure executed before any examples are run. */ -public typealias BeforeSuiteClosure = () -> () +public typealias BeforeSuiteClosure = () -> Void /** A closure executed after all examples have finished running. diff --git a/Pods/Quick/Sources/Quick/Hooks/ExampleHooks.swift b/Pods/Quick/Sources/Quick/Hooks/ExampleHooks.swift index ef6d53e..449cbfc 100644 --- a/Pods/Quick/Sources/Quick/Hooks/ExampleHooks.swift +++ b/Pods/Quick/Sources/Quick/Hooks/ExampleHooks.swift @@ -11,7 +11,7 @@ final internal class ExampleHooks { } internal func appendBefore(_ closure: @escaping BeforeExampleClosure) { - befores.append { (exampleMetadata: ExampleMetadata) in closure() } + befores.append { (_: ExampleMetadata) in closure() } } internal func appendAfter(_ closure: @escaping AfterExampleWithMetadataClosure) { @@ -19,7 +19,7 @@ final internal class ExampleHooks { } internal func appendAfter(_ closure: @escaping AfterExampleClosure) { - afters.append { (exampleMetadata: ExampleMetadata) in closure() } + afters.append { (_: ExampleMetadata) in closure() } } internal func executeBefores(_ exampleMetadata: ExampleMetadata) { @@ -27,7 +27,7 @@ final internal class ExampleHooks { for before in befores { before(exampleMetadata) } - + phase = .beforesFinished } diff --git a/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift b/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift index 730843e..994dd72 100644 --- a/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift +++ b/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift @@ -11,6 +11,15 @@ extension Bundle { return allBundles.first { $0.bundlePath.hasSuffix(".xctest") } } + /** + Return the module name of the bundle. + Uses the bundle filename and transform it to match Xcode's transformation. + Module name has to be a valid "C99 extended identifier". + */ + internal var moduleName: String { + let fileName = bundleURL.fileName as NSString + return fileName.c99ExtendedIdentifier + } } #endif diff --git a/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift b/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift new file mode 100644 index 0000000..4514863 --- /dev/null +++ b/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift @@ -0,0 +1,33 @@ +#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/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift b/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift index 63b55e1..d49e859 100644 --- a/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift +++ b/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift @@ -66,7 +66,7 @@ private func testCaseClassForTestCaseWithName(_ name: String) -> AnyClass? { if let testCaseClass = bundle.classNamed(className) { return testCaseClass } - guard let moduleName = bundle.bundlePath.fileName else { return nil } + let moduleName = bundle.moduleName return NSClassFromString("\(moduleName).\(className)") } diff --git a/Pods/Quick/Sources/Quick/String+FileName.swift b/Pods/Quick/Sources/Quick/String+FileName.swift deleted file mode 100644 index 83cdfcf..0000000 --- a/Pods/Quick/Sources/Quick/String+FileName.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation - -extension String { - - /** - If the receiver represents a path, returns its file name with a file extension. - */ - var fileName: String? { - return NSURL(string: self)?.deletingPathExtension?.lastPathComponent - } - -} diff --git a/Pods/Quick/Sources/Quick/URL+FileName.swift b/Pods/Quick/Sources/Quick/URL+FileName.swift new file mode 100644 index 0000000..23c4781 --- /dev/null +++ b/Pods/Quick/Sources/Quick/URL+FileName.swift @@ -0,0 +1,12 @@ +import Foundation + +extension URL { + + /** + Returns the path file name without file extension. + */ + var fileName: String { + return self.deletingPathExtension().lastPathComponent + } + +} diff --git a/Pods/Quick/Sources/Quick/World.swift b/Pods/Quick/Sources/Quick/World.swift index 56dae51..fb5ec25 100644 --- a/Pods/Quick/Sources/Quick/World.swift +++ b/Pods/Quick/Sources/Quick/World.swift @@ -4,13 +4,13 @@ import Foundation A closure that, when evaluated, returns a dictionary of key-value pairs that can be accessed from within a group of shared examples. */ -public typealias SharedExampleContext = () -> (NSDictionary) +public typealias SharedExampleContext = () -> [String: Any] /** A closure that is used to define a group of shared examples. This closure may contain any number of example and example groups. */ -public typealias SharedExampleClosure = (@escaping SharedExampleContext) -> () +public typealias SharedExampleClosure = (@escaping SharedExampleContext) -> Void /** A collection of state Quick builds up in order to work its magic. @@ -52,10 +52,11 @@ final internal class World: NSObject { internal var isRunningAdditionalSuites = false #endif - private var specs: Dictionary = [:] + private var specs: [String: ExampleGroup] = [:] private var sharedExamples: [String: SharedExampleClosure] = [:] private let configuration = Configuration() - private var isConfigurationFinalized = false + + internal private(set) var isConfigurationFinalized = false internal var exampleHooks: ExampleHooks {return configuration.exampleHooks } internal var suiteHooks: SuiteHooks { return configuration.suiteHooks } @@ -165,7 +166,7 @@ final internal class World: NSObject { internal var includedExampleCount: Int { return includedExamples.count } - + internal var beforesCurrentlyExecuting: Bool { let suiteBeforesExecuting = suiteHooks.phase == .beforesExecuting let exampleBeforesExecuting = exampleHooks.phase == .beforesExecuting @@ -173,10 +174,10 @@ final internal class World: NSObject { if let runningExampleGroup = currentExampleMetadata?.example.group { groupBeforesExecuting = runningExampleGroup.phase == .beforesExecuting } - + return suiteBeforesExecuting || exampleBeforesExecuting || groupBeforesExecuting } - + internal var aftersCurrentlyExecuting: Bool { let suiteAftersExecuting = suiteHooks.phase == .aftersExecuting let exampleAftersExecuting = exampleHooks.phase == .aftersExecuting @@ -184,7 +185,7 @@ final internal class World: NSObject { if let runningExampleGroup = currentExampleMetadata?.example.group { groupAftersExecuting = runningExampleGroup.phase == .aftersExecuting } - + return suiteAftersExecuting || exampleAftersExecuting || groupAftersExecuting } diff --git a/Pods/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.h b/Pods/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.h deleted file mode 100644 index 2da524e..0000000 --- a/Pods/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.h +++ /dev/null @@ -1,17 +0,0 @@ -#import - -/** - QuickSpec converts example names into test methods. - Those test methods need valid selector names, which means no whitespace, - control characters, etc. This category gives NSString objects an easy way - to replace those illegal characters with underscores. - */ -@interface NSString (QCKSelectorName) - -/** - Returns a string with underscores in place of all characters that cannot - be included in a selector (SEL) name. - */ -@property (nonatomic, readonly) NSString *qck_selectorName; - -@end diff --git a/Pods/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.m b/Pods/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.m deleted file mode 100644 index d374be6..0000000 --- a/Pods/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.m +++ /dev/null @@ -1,37 +0,0 @@ -#import "NSString+QCKSelectorName.h" - -@implementation NSString (QCKSelectorName) - -- (NSString *)qck_selectorName { - static NSMutableCharacterSet *invalidCharacters = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - invalidCharacters = [NSMutableCharacterSet new]; - - NSCharacterSet *whitespaceCharacterSet = [NSCharacterSet whitespaceCharacterSet]; - NSCharacterSet *newlineCharacterSet = [NSCharacterSet newlineCharacterSet]; - NSCharacterSet *illegalCharacterSet = [NSCharacterSet illegalCharacterSet]; - NSCharacterSet *controlCharacterSet = [NSCharacterSet controlCharacterSet]; - NSCharacterSet *punctuationCharacterSet = [NSCharacterSet punctuationCharacterSet]; - NSCharacterSet *nonBaseCharacterSet = [NSCharacterSet nonBaseCharacterSet]; - NSCharacterSet *symbolCharacterSet = [NSCharacterSet symbolCharacterSet]; - - [invalidCharacters formUnionWithCharacterSet:whitespaceCharacterSet]; - [invalidCharacters formUnionWithCharacterSet:newlineCharacterSet]; - [invalidCharacters formUnionWithCharacterSet:illegalCharacterSet]; - [invalidCharacters formUnionWithCharacterSet:controlCharacterSet]; - [invalidCharacters formUnionWithCharacterSet:punctuationCharacterSet]; - [invalidCharacters formUnionWithCharacterSet:nonBaseCharacterSet]; - [invalidCharacters formUnionWithCharacterSet:symbolCharacterSet]; - }); - - NSArray *validComponents = [self componentsSeparatedByCharactersInSet:invalidCharacters]; - - NSString *result = [validComponents componentsJoinedByString:@"_"]; - - return ([result length] == 0 - ? @"_" - : result); -} - -@end diff --git a/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m b/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m index ea64934..4891679 100644 --- a/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m +++ b/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m @@ -1,13 +1,10 @@ #import "QuickSpec.h" #import "QuickConfiguration.h" -#import "NSString+QCKSelectorName.h" #import "World.h" -#import +#import static QuickSpec *currentSpec = nil; -const void * const QCKExampleKey = &QCKExampleKey; - @interface QuickSpec () @property (nonatomic, strong) Example *example; @end @@ -63,24 +60,17 @@ + (NSArray *)testInvocations { for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; - NSInvocation *invocation = [self invocationForInstanceMethodWithSelector:selector - example:example]; + + NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + invocation.selector = selector; + [invocations addObject:invocation]; } return invocations; } -/** - XCTest sets the invocation for the current test case instance using this setter. - QuickSpec hooks into this event to give the test case a reference to the current example. - It will need this reference to correctly report its name to XCTest. - */ -- (void)setInvocation:(NSInvocation *)invocation { - self.example = objc_getAssociatedObject(invocation, QCKExampleKey); - [super setInvocation:invocation]; -} - #pragma mark - Public Interface - (void)spec { } @@ -105,21 +95,14 @@ - (void)spec { } */ + (SEL)addInstanceMethodForExample:(Example *)example classSelectorNames:(NSMutableSet *)selectorNames { IMP implementation = imp_implementationWithBlock(^(QuickSpec *self){ + self.example = example; currentSpec = self; [example run]; }); - NSCharacterSet *characterSet = [NSCharacterSet alphanumericCharacterSet]; - NSMutableString *sanitizedFileName = [NSMutableString string]; - for (NSUInteger i = 0; i < example.callsite.file.length; i++) { - unichar ch = [example.callsite.file characterAtIndex:i]; - if ([characterSet characterIsMember:ch]) { - [sanitizedFileName appendFormat:@"%c", ch]; - } - } - const char *types = [[NSString stringWithFormat:@"%s%s%s", @encode(id), @encode(id), @encode(SEL)] UTF8String]; + const char *types = [[NSString stringWithFormat:@"%s%s%s", @encode(void), @encode(id), @encode(SEL)] UTF8String]; - NSString *originalName = example.name.qck_selectorName; + NSString *originalName = example.name.qck_c99ExtendedIdentifier; NSString *selectorName = originalName; NSUInteger i = 2; @@ -135,18 +118,6 @@ + (SEL)addInstanceMethodForExample:(Example *)example classSelectorNames:(NSMuta return selector; } -+ (NSInvocation *)invocationForInstanceMethodWithSelector:(SEL)selector - example:(Example *)example { - NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; - invocation.selector = selector; - objc_setAssociatedObject(invocation, - QCKExampleKey, - example, - OBJC_ASSOCIATION_RETAIN_NONATOMIC); - return invocation; -} - /** This method is used to record failures, whether they represent example expectations that were not met, or exceptions raised during test setup diff --git a/Pods/Quick/Sources/QuickSpecBase/QuickSpecBase.m b/Pods/Quick/Sources/QuickSpecBase/QuickSpecBase.m new file mode 100644 index 0000000..10b6f7e --- /dev/null +++ b/Pods/Quick/Sources/QuickSpecBase/QuickSpecBase.m @@ -0,0 +1,55 @@ +#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 + +- (instancetype)init { + self = [super initWithInvocation: nil]; + return self; +} + +/** + Invocations for each test method in the test case. QuickSpec overrides this method to define a + new method for each example defined in +[QuickSpec spec]. + + @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]; + + for (_QuickSelectorWrapper *wrapper in wrappers) { + SEL selector = wrapper.selector; + NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + invocation.selector = selector; + + [invocations addObject:invocation]; + } + + return invocations; +} + ++ (NSArray<_QuickSelectorWrapper *> *)_qck_testMethodSelectors { + return @[]; +} + +@end diff --git a/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h b/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h new file mode 100644 index 0000000..69e96cc --- /dev/null +++ b/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h @@ -0,0 +1,11 @@ +@import Foundation; +@import XCTest; + +@interface _QuickSelectorWrapper : NSObject +- (instancetype)initWithSelector:(SEL)selector; +@end + +@interface _QuickSpecBase : XCTestCase ++ (NSArray<_QuickSelectorWrapper *> *)_qck_testMethodSelectors; +- (instancetype)init NS_DESIGNATED_INITIALIZER; +@end diff --git a/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch b/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch +++ b/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h b/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h index 3481131..1734e02 100644 --- a/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h +++ b/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif #import "FBSnapshotTestCase.h" diff --git a/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig b/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig index 059665b..ee7f02e 100644 --- a/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig +++ b/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig @@ -8,5 +8,6 @@ OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 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/Pods/Target Support Files/FBSnapshotTestCase/Info.plist b/Pods/Target Support Files/FBSnapshotTestCase/Info.plist index d6204c0..57b76a5 100644 --- a/Pods/Target Support Files/FBSnapshotTestCase/Info.plist +++ b/Pods/Target Support Files/FBSnapshotTestCase/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.1.3 + 2.1.4 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/Nimble-Snapshots/Info.plist b/Pods/Target Support Files/Nimble-Snapshots/Info.plist index 6631be7..2eb204d 100644 --- a/Pods/Target Support Files/Nimble-Snapshots/Info.plist +++ b/Pods/Target Support Files/Nimble-Snapshots/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.2.0 + 6.1.0 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch b/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch +++ b/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-umbrella.h b/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-umbrella.h index bae6432..f37d6db 100644 --- a/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-umbrella.h +++ b/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots-umbrella.h @@ -1,7 +1,17 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif +#import "XCTestObservationCenter+CurrentTestCaseTracker.h" +#import "NBSMockedApplication.h" FOUNDATION_EXPORT double Nimble_SnapshotsVersionNumber; FOUNDATION_EXPORT const unsigned char Nimble_SnapshotsVersionString[]; diff --git a/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots.xcconfig b/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots.xcconfig index 53c7d78..18263ce 100644 --- a/Pods/Target Support Files/Nimble-Snapshots/Nimble-Snapshots.xcconfig +++ b/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/FBSnapshotTestCase" "$PODS_CONFIGURATION_BUILD_DIR/Nimble" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" -OTHER_LDFLAGS = -framework "Foundation" -framework "XCTest" +OTHER_LDFLAGS = -framework "Foundation" -framework "UIKit" -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_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Nimble-Snapshots PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/Nimble/Info.plist b/Pods/Target Support Files/Nimble/Info.plist index e2771ff..3f2c147 100644 --- a/Pods/Target Support Files/Nimble/Info.plist +++ b/Pods/Target Support Files/Nimble/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 5.0.0 + 7.0.1 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/Nimble/Nimble-prefix.pch b/Pods/Target Support Files/Nimble/Nimble-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/Nimble/Nimble-prefix.pch +++ b/Pods/Target Support Files/Nimble/Nimble-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/Nimble/Nimble-umbrella.h b/Pods/Target Support Files/Nimble/Nimble-umbrella.h index fda1acc..9aac00a 100644 --- a/Pods/Target Support Files/Nimble/Nimble-umbrella.h +++ b/Pods/Target Support Files/Nimble/Nimble-umbrella.h @@ -1,7 +1,19 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif +#import "CwlCatchException.h" +#import "CwlMachBadInstructionHandler.h" +#import "mach_excServer.h" +#import "CwlPreconditionTesting.h" #import "Nimble.h" #import "DSL.h" #import "NMBExceptionCapture.h" diff --git a/Pods/Target Support Files/Nimble/Nimble.xcconfig b/Pods/Target Support Files/Nimble/Nimble.xcconfig index bc9e893..12698c0 100644 --- a/Pods/Target Support Files/Nimble/Nimble.xcconfig +++ b/Pods/Target Support Files/Nimble/Nimble.xcconfig @@ -8,5 +8,6 @@ OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 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 diff --git a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-acknowledgements.markdown b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-acknowledgements.markdown index 560873f..4f0aa61 100644 --- a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-acknowledgements.markdown @@ -224,7 +224,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2014 Quick Team + Copyright 2016 Quick Team Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-acknowledgements.plist b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-acknowledgements.plist index 1ed355f..b8bc0e9 100644 --- a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-acknowledgements.plist @@ -241,7 +241,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2014 Quick Team + Copyright 2016 Quick Team Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-frameworks.sh b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-frameworks.sh index 2783df1..80cdb96 100755 --- a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-frameworks.sh +++ b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-frameworks.sh @@ -59,8 +59,13 @@ 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 echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" fi } @@ -95,3 +100,6 @@ if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "$BUILT_PRODUCTS_DIR/Nimble-Snapshots/Nimble_Snapshots.framework" install_framework "$BUILT_PRODUCTS_DIR/Quick/Quick.framework" fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-resources.sh b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-resources.sh index 25e9d37..aed060f 100755 --- a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-resources.sh +++ b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-resources.sh @@ -18,6 +18,12 @@ case "${TARGETED_DEVICE_FAMILY}" in 2) TARGET_DEVICE_ARGS="--target-device ipad" ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; diff --git a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-umbrella.h b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-umbrella.h index 71d6068..9691d2d 100644 --- a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-umbrella.h +++ b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests.debug.xcconfig b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests.debug.xcconfig index f7d98a1..f3b6598 100644 --- a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests.debug.xcconfig @@ -1,5 +1,4 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -EMBEDDED_CONTENT_CONTAINS_SWIFT = 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" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' @@ -8,4 +7,5 @@ OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Nimble" 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 diff --git a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests.release.xcconfig b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests.release.xcconfig index f7d98a1..f3b6598 100644 --- a/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-TRXTests/Pods-TRXTests.release.xcconfig @@ -1,5 +1,4 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -EMBEDDED_CONTENT_CONTAINS_SWIFT = 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" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' @@ -8,4 +7,5 @@ OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Nimble" 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 diff --git a/Pods/Target Support Files/Quick/Info.plist b/Pods/Target Support Files/Quick/Info.plist index 994ffe8..21a30b4 100644 --- a/Pods/Target Support Files/Quick/Info.plist +++ b/Pods/Target Support Files/Quick/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.10.0 + 1.1.0 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/Quick/Quick-prefix.pch b/Pods/Target Support Files/Quick/Quick-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/Quick/Quick-prefix.pch +++ b/Pods/Target Support Files/Quick/Quick-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/Quick/Quick-umbrella.h b/Pods/Target Support Files/Quick/Quick-umbrella.h index c0a657c..1de6bf3 100644 --- a/Pods/Target Support Files/Quick/Quick-umbrella.h +++ b/Pods/Target Support Files/Quick/Quick-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif #import "QuickConfiguration.h" diff --git a/Pods/Target Support Files/Quick/Quick.xcconfig b/Pods/Target Support Files/Quick/Quick.xcconfig index f25ce83..66c8d21 100644 --- a/Pods/Target Support Files/Quick/Quick.xcconfig +++ b/Pods/Target Support Files/Quick/Quick.xcconfig @@ -8,5 +8,6 @@ OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 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 diff --git a/TRX.xcodeproj/project.pbxproj b/TRX.xcodeproj/project.pbxproj index 52b82fe..2e3b31d 100644 --- a/TRX.xcodeproj/project.pbxproj +++ b/TRX.xcodeproj/project.pbxproj @@ -615,7 +615,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; FE80B734608439DA52AFE904 /* [CP] Copy Pods Resources */ = {