From 2fb417c9e9df2829879619a16b4fdd188fbbe808 Mon Sep 17 00:00:00 2001 From: Mark DiFranco Date: Sun, 11 Mar 2018 17:31:11 -0400 Subject: [PATCH] Improvements for using the project with Carthage - Add Carthage Checkouts to gitignore. This is needed in order to allow sharing of the Swinject framework in containing apps. - Manually copy over configuration files into the repo. The same thing was done for SwinjectStoryboard. --- .gitignore | 2 +- .travis.yml | 4 + Cartfile.private | 1 - .../Checkouts/Nimble/.github/ISSUE_TEMPLATE | 36 - .../Nimble/.github/PULL_REQUEST_TEMPLATE | 14 - Carthage/Checkouts/Nimble/.gitignore | 21 - Carthage/Checkouts/Nimble/.hound.yml | 2 - Carthage/Checkouts/Nimble/.swift-version | 1 - Carthage/Checkouts/Nimble/.swiftlint.yml | 19 - Carthage/Checkouts/Nimble/.travis.yml | 31 - Carthage/Checkouts/Nimble/CONTRIBUTING.md | 120 - Carthage/Checkouts/Nimble/Dockerfile.test | 3 - Carthage/Checkouts/Nimble/Gemfile | 4 - Carthage/Checkouts/Nimble/Gemfile.lock | 73 - Carthage/Checkouts/Nimble/LICENSE | 201 -- Carthage/Checkouts/Nimble/Nimble.podspec | 50 - .../Nimble/Nimble.xcodeproj/project.pbxproj | 2305 -------------- .../contents.xcworkspacedata | 7 - .../xcschemes/Nimble-iOS.xcscheme | 84 - .../xcschemes/Nimble-macOS.xcscheme | 84 - .../xcschemes/Nimble-tvOS.xcscheme | 101 - Carthage/Checkouts/Nimble/Package.swift | 12 - Carthage/Checkouts/Nimble/README.md | 1764 ----------- .../CwlCatchException/CwlCatchException.swift | 37 - .../CwlCatchException.m | 37 - .../include/CwlCatchException.h | 33 - .../CwlMachBadInstructionHandler.m | 50 - .../include/CwlMachBadInstructionHandler.h | 70 - .../mach_excServer.c | 537 ---- .../mach_excServer.h | 321 -- .../CwlBadInstructionException.swift | 89 - .../CwlCatchBadInstruction.swift | 199 -- .../CwlCatchBadInstructionPOSIX.swift | 108 - .../CwlDarwinDefinitions.swift | 55 - .../Mach/CwlPreconditionTesting.h | 30 - .../Posix/CwlPreconditionTesting.h | 27 - .../Lib/CwlPreconditionTesting/README.md | 80 - .../Nimble/Adapters/AdapterProtocols.swift | 17 - .../Nimble/Adapters/AssertionDispatcher.swift | 19 - .../Nimble/Adapters/AssertionRecorder.swift | 100 - .../Nimble/Adapters/NMBExpectation.swift | 187 -- .../Nimble/Adapters/NMBObjCMatcher.swift | 83 - .../Nimble/Adapters/NimbleEnvironment.swift | 45 - .../Nimble/Adapters/NimbleXCTestHandler.swift | 81 - .../NonObjectiveC/ExceptionCapture.swift | 31 - .../Nimble/Sources/Nimble/DSL+Wait.swift | 116 - .../Checkouts/Nimble/Sources/Nimble/DSL.swift | 64 - .../Nimble/Sources/Nimble/Expectation.swift | 132 - .../Sources/Nimble/ExpectationMessage.swift | 262 -- .../Nimble/Sources/Nimble/Expression.swift | 99 - .../Sources/Nimble/FailureMessage.swift | 92 - .../Nimble/Sources/Nimble/Info.plist | 28 - .../Sources/Nimble/Matchers/AllPass.swift | 121 - .../Nimble/Matchers/AsyncMatcherWrapper.swift | 236 -- .../Sources/Nimble/Matchers/BeAKindOf.swift | 68 - .../Nimble/Matchers/BeAnInstanceOf.swift | 56 - .../Sources/Nimble/Matchers/BeCloseTo.swift | 126 - .../Sources/Nimble/Matchers/BeEmpty.swift | 95 - .../Nimble/Matchers/BeGreaterThan.swift | 42 - .../Matchers/BeGreaterThanOrEqualTo.swift | 44 - .../Nimble/Matchers/BeIdenticalTo.swift | 46 - .../Sources/Nimble/Matchers/BeLessThan.swift | 41 - .../Nimble/Matchers/BeLessThanOrEqual.swift | 42 - .../Sources/Nimble/Matchers/BeLogical.swift | 167 - .../Sources/Nimble/Matchers/BeNil.swift | 19 - .../Sources/Nimble/Matchers/BeVoid.swift | 18 - .../Sources/Nimble/Matchers/BeginWith.swift | 60 - .../Sources/Nimble/Matchers/Contain.swift | 95 - .../Matchers/ContainElementSatisfying.swift | 60 - .../Sources/Nimble/Matchers/EndWith.swift | 72 - .../Sources/Nimble/Matchers/Equal.swift | 220 -- .../Sources/Nimble/Matchers/HaveCount.swift | 59 - .../Sources/Nimble/Matchers/Match.swift | 30 - .../Sources/Nimble/Matchers/MatchError.swift | 58 - .../Sources/Nimble/Matchers/MatcherFunc.swift | 85 - .../Nimble/Matchers/MatcherProtocols.swift | 154 - .../Nimble/Matchers/PostNotification.swift | 68 - .../Sources/Nimble/Matchers/Predicate.swift | 348 --- .../Nimble/Matchers/RaisesException.swift | 198 -- .../Nimble/Matchers/SatisfyAnyOf.swift | 109 - .../Nimble/Matchers/ThrowAssertion.swift | 56 - .../Sources/Nimble/Matchers/ThrowError.swift | 258 -- .../Sources/Nimble/Matchers/ToSucceed.swift | 37 - .../Checkouts/Nimble/Sources/Nimble/Nimble.h | 9 - .../Nimble/Sources/Nimble/Utils/Async.swift | 377 --- .../Nimble/Sources/Nimble/Utils/Errors.swift | 59 - .../Sources/Nimble/Utils/Functional.swift | 12 - .../Sources/Nimble/Utils/SourceLocation.swift | 31 - .../Sources/Nimble/Utils/Stringers.swift | 212 -- .../NimbleObjectiveC/CurrentTestCaseTracker.h | 9 - .../Nimble/Sources/NimbleObjectiveC/DSL.h | 383 --- .../Nimble/Sources/NimbleObjectiveC/DSL.m | 160 - .../NimbleObjectiveC/NMBExceptionCapture.h | 11 - .../NimbleObjectiveC/NMBExceptionCapture.m | 35 - .../Sources/NimbleObjectiveC/NMBStringify.h | 18 - .../Sources/NimbleObjectiveC/NMBStringify.m | 6 - .../XCTestObservationCenter+Register.m | 78 - .../Checkouts/Nimble/Tests/.swiftlint.yml | 2 - .../Checkouts/Nimble/Tests/LinuxMain.swift | 37 - .../Tests/NimbleTests/AsynchronousTest.swift | 245 -- .../Helpers/ObjectWithLazyProperty.swift | 7 - .../Helpers/XCTestCaseProvider.swift | 52 - .../Tests/NimbleTests/Helpers/utils.swift | 100 - .../Nimble/Tests/NimbleTests/Info.plist | 24 - .../Tests/NimbleTests/LinuxSupport.swift | 9 - .../NimbleTests/Matchers/AllPassTest.swift | 126 - .../NimbleTests/Matchers/BeAKindOfTest.swift | 89 - .../Matchers/BeAnInstanceOfTest.swift | 79 - .../NimbleTests/Matchers/BeCloseToTest.swift | 160 - .../NimbleTests/Matchers/BeEmptyTest.swift | 82 - .../Matchers/BeGreaterThanOrEqualToTest.swift | 54 - .../Matchers/BeGreaterThanTest.swift | 53 - .../Matchers/BeIdenticalToObjectTest.swift | 64 - .../Matchers/BeIdenticalToTest.swift | 68 - .../Matchers/BeLessThanOrEqualToTest.swift | 52 - .../NimbleTests/Matchers/BeLessThanTest.swift | 57 - .../NimbleTests/Matchers/BeLogicalTest.swift | 270 -- .../NimbleTests/Matchers/BeNilTest.swift | 28 - .../NimbleTests/Matchers/BeVoidTest.swift | 32 - .../NimbleTests/Matchers/BeginWithTest.swift | 53 - .../ContainElementSatisfyingTest.swift | 86 - .../NimbleTests/Matchers/ContainTest.swift | 95 - .../NimbleTests/Matchers/EndWithTest.swift | 56 - .../NimbleTests/Matchers/EqualTest.swift | 276 -- .../NimbleTests/Matchers/HaveCountTest.swift | 56 - .../NimbleTests/Matchers/MatchErrorTest.swift | 84 - .../NimbleTests/Matchers/MatchTest.swift | 46 - .../Matchers/PostNotificationTest.swift | 91 - .../Matchers/RaisesExceptionTest.swift | 166 - .../Matchers/SatisfyAnyOfTest.swift | 56 - .../Matchers/ThrowAssertionTest.swift | 62 - .../NimbleTests/Matchers/ThrowErrorTest.swift | 155 - .../NimbleTests/Matchers/ToSucceedTest.swift | 36 - .../Tests/NimbleTests/SynchronousTests.swift | 128 - .../NimbleTests/UserDescriptionTest.swift | 64 - .../Tests/NimbleTests/objc/NimbleSpecHelper.h | 15 - .../Tests/NimbleTests/objc/ObjCAllPassTest.m | 38 - .../Tests/NimbleTests/objc/ObjCAsyncTest.m | 55 - .../NimbleTests/objc/ObjCBeAnInstanceOfTest.m | 34 - .../NimbleTests/objc/ObjCBeCloseToTest.m | 47 - .../Tests/NimbleTests/objc/ObjCBeEmptyTest.m | 89 - .../Tests/NimbleTests/objc/ObjCBeFalseTest.m | 46 - .../Tests/NimbleTests/objc/ObjCBeFalsyTest.m | 58 - .../objc/ObjCBeGreaterThanOrEqualToTest.m | 44 - .../NimbleTests/objc/ObjCBeGreaterThanTest.m | 42 - .../NimbleTests/objc/ObjCBeIdenticalToTest.m | 68 - .../Tests/NimbleTests/objc/ObjCBeKindOfTest.m | 34 - .../objc/ObjCBeLessThanOrEqualToTest.m | 43 - .../NimbleTests/objc/ObjCBeLessThanTest.m | 42 - .../Tests/NimbleTests/objc/ObjCBeNilTest.m | 24 - .../Tests/NimbleTests/objc/ObjCBeTrueTest.m | 47 - .../Tests/NimbleTests/objc/ObjCBeTruthyTest.m | 55 - .../NimbleTests/objc/ObjCBeginWithTest.m | 37 - .../objc/ObjCContainElementSatisfying.m | 64 - .../Tests/NimbleTests/objc/ObjCContainTest.m | 67 - .../Tests/NimbleTests/objc/ObjCEndWithTest.m | 37 - .../Tests/NimbleTests/objc/ObjCEqualTest.m | 94 - .../Tests/NimbleTests/objc/ObjCHaveCount.m | 174 -- .../Tests/NimbleTests/objc/ObjCMatchTest.m | 33 - .../NimbleTests/objc/ObjCRaiseExceptionTest.m | 178 -- .../NimbleTests/objc/ObjCSatisfyAnyOfTest.m | 32 - .../Tests/NimbleTests/objc/ObjCSyncTest.m | 21 - .../objc/ObjCUserDescriptionTest.m | 52 - .../NimbleTests/objc/ObjcStringersTest.m | 31 - Carthage/Checkouts/Nimble/script/release | 187 -- Carthage/Checkouts/Nimble/test | 156 - .../Checkouts/Quick/.github/ISSUE_TEMPLATE | 36 - .../Quick/.github/PULL_REQUEST_TEMPLATE | 14 - Carthage/Checkouts/Quick/.gitignore | 66 - Carthage/Checkouts/Quick/.gitmodules | 3 - Carthage/Checkouts/Quick/.hound.yml | 2 - Carthage/Checkouts/Quick/.swift-version | 1 - Carthage/Checkouts/Quick/.swiftlint.yml | 8 - Carthage/Checkouts/Quick/.travis.yml | 48 - Carthage/Checkouts/Quick/CODE_OF_CONDUCT.md | 74 - Carthage/Checkouts/Quick/CONTRIBUTING.md | 111 - Carthage/Checkouts/Quick/Dangerfile | 53 - .../Checkouts/Quick/Documentation/README.md | 6 - .../Documentation/en-us/ArrangeActAssert.md | 220 -- .../Documentation/en-us/BehavioralTesting.md | 87 - .../Documentation/en-us/ConfiguringQuick.md | 103 - .../en-us/InstallingFileTemplates.md | 28 - .../Documentation/en-us/InstallingQuick.md | 157 - .../Documentation/en-us/MoreResources.md | 28 - .../Documentation/en-us/NimbleAssertions.md | 106 - .../en-us/QuickExamplesAndGroups.md | 491 --- .../Documentation/en-us/QuickInObjectiveC.md | 57 - .../Quick/Documentation/en-us/README.md | 46 - .../en-us/SettingUpYourXcodeProject.md | 89 - .../Documentation/en-us/SharedExamples.md | 125 - .../en-us/TestUsingTestDoubles.md | 129 - .../Quick/Documentation/en-us/TestingApps.md | 179 -- .../Documentation/en-us/Troubleshooting.md | 9 - .../Documentation/ja/ArrangeActAssert.md | 212 -- .../Documentation/ja/BehavioralTesting.md | 81 - .../Documentation/ja/ConfiguringQuick.md | 101 - .../ja/InstallingFileTemplates.md | 26 - .../Quick/Documentation/ja/InstallingQuick.md | 152 - .../Quick/Documentation/ja/MoreResources.md | 27 - .../Documentation/ja/NimbleAssertions.md | 100 - .../ja/QuickExamplesAndGroups.md | 477 --- .../Documentation/ja/QuickInObjectiveC.md | 48 - .../Quick/Documentation/ja/README.md | 50 - .../ja/SettingUpYourXcodeProject.md | 77 - .../Quick/Documentation/ja/SharedExamples.md | 122 - .../Documentation/ja/TestUsingTestDoubles.md | 138 - .../Quick/Documentation/ja/TestingApps.md | 174 -- .../Quick/Documentation/ja/Troubleshooting.md | 9 - .../Documentation/pt-br/BehavioralTesting.md | 78 - .../Quick/Documentation/pt-br/README.md | 39 - .../Documentation/pt-br/SharedExamples.md | 116 - .../Documentation/zh-cn/ArrangeActAssert.md | 205 -- .../Documentation/zh-cn/BehavioralTesting.md | 75 - .../Documentation/zh-cn/ConfiguringQuick.md | 102 - .../zh-cn/InstallingFileTemplates.md | 26 - .../Documentation/zh-cn/InstallingQuick.md | 157 - .../Documentation/zh-cn/MoreResources.md | 23 - .../Documentation/zh-cn/NimbleAssertions.md | 100 - .../zh-cn/QuickExamplesAndGroups.md | 461 --- .../Documentation/zh-cn/QuickInObjectiveC.md | 52 - .../Quick/Documentation/zh-cn/README.md | 18 - .../zh-cn/SettingUpYourXcodeProject.md | 75 - .../Documentation/zh-cn/SharedExamples.md | 113 - .../zh-cn/TestUsingTestDoubles.md | 131 - .../Quick/Documentation/zh-cn/TestingApps.md | 174 -- .../Documentation/zh-cn/Troubleshooting.md | 10 - .../Externals/Nimble/.github/ISSUE_TEMPLATE | 36 - .../Nimble/.github/PULL_REQUEST_TEMPLATE | 14 - .../Quick/Externals/Nimble/.gitignore | 21 - .../Quick/Externals/Nimble/.hound.yml | 2 - .../Quick/Externals/Nimble/.swift-version | 1 - .../Quick/Externals/Nimble/.swiftlint.yml | 19 - .../Quick/Externals/Nimble/.travis.yml | 31 - .../Quick/Externals/Nimble/CONTRIBUTING.md | 120 - .../Quick/Externals/Nimble/Dockerfile.test | 3 - .../Checkouts/Quick/Externals/Nimble/Gemfile | 4 - .../Quick/Externals/Nimble/Gemfile.lock | 73 - .../Checkouts/Quick/Externals/Nimble/LICENSE | 201 -- .../Quick/Externals/Nimble/Nimble.podspec | 50 - .../Nimble/Nimble.xcodeproj/project.pbxproj | 2305 -------------- .../contents.xcworkspacedata | 7 - .../xcschemes/Nimble-iOS.xcscheme | 84 - .../xcschemes/Nimble-macOS.xcscheme | 84 - .../xcschemes/Nimble-tvOS.xcscheme | 101 - .../Quick/Externals/Nimble/Package.swift | 12 - .../Quick/Externals/Nimble/README.md | 1764 ----------- .../CwlCatchException/CwlCatchException.swift | 37 - .../CwlCatchException.m | 37 - .../include/CwlCatchException.h | 33 - .../CwlMachBadInstructionHandler.m | 50 - .../include/CwlMachBadInstructionHandler.h | 70 - .../mach_excServer.c | 537 ---- .../mach_excServer.h | 321 -- .../CwlBadInstructionException.swift | 89 - .../CwlCatchBadInstruction.swift | 199 -- .../CwlCatchBadInstructionPOSIX.swift | 108 - .../CwlDarwinDefinitions.swift | 55 - .../Mach/CwlPreconditionTesting.h | 30 - .../Posix/CwlPreconditionTesting.h | 27 - .../Lib/CwlPreconditionTesting/README.md | 80 - .../Nimble/Adapters/AdapterProtocols.swift | 17 - .../Nimble/Adapters/AssertionDispatcher.swift | 19 - .../Nimble/Adapters/AssertionRecorder.swift | 100 - .../Nimble/Adapters/NMBExpectation.swift | 187 -- .../Nimble/Adapters/NMBObjCMatcher.swift | 83 - .../Nimble/Adapters/NimbleEnvironment.swift | 45 - .../Nimble/Adapters/NimbleXCTestHandler.swift | 81 - .../NonObjectiveC/ExceptionCapture.swift | 31 - .../Nimble/Sources/Nimble/DSL+Wait.swift | 116 - .../Externals/Nimble/Sources/Nimble/DSL.swift | 64 - .../Nimble/Sources/Nimble/Expectation.swift | 132 - .../Sources/Nimble/ExpectationMessage.swift | 262 -- .../Nimble/Sources/Nimble/Expression.swift | 99 - .../Sources/Nimble/FailureMessage.swift | 92 - .../Nimble/Sources/Nimble/Info.plist | 28 - .../Sources/Nimble/Matchers/AllPass.swift | 121 - .../Nimble/Matchers/AsyncMatcherWrapper.swift | 236 -- .../Sources/Nimble/Matchers/BeAKindOf.swift | 68 - .../Nimble/Matchers/BeAnInstanceOf.swift | 56 - .../Sources/Nimble/Matchers/BeCloseTo.swift | 126 - .../Sources/Nimble/Matchers/BeEmpty.swift | 95 - .../Nimble/Matchers/BeGreaterThan.swift | 42 - .../Matchers/BeGreaterThanOrEqualTo.swift | 44 - .../Nimble/Matchers/BeIdenticalTo.swift | 46 - .../Sources/Nimble/Matchers/BeLessThan.swift | 41 - .../Nimble/Matchers/BeLessThanOrEqual.swift | 42 - .../Sources/Nimble/Matchers/BeLogical.swift | 167 - .../Sources/Nimble/Matchers/BeNil.swift | 19 - .../Sources/Nimble/Matchers/BeVoid.swift | 18 - .../Sources/Nimble/Matchers/BeginWith.swift | 60 - .../Sources/Nimble/Matchers/Contain.swift | 95 - .../Matchers/ContainElementSatisfying.swift | 60 - .../Sources/Nimble/Matchers/EndWith.swift | 72 - .../Sources/Nimble/Matchers/Equal.swift | 220 -- .../Sources/Nimble/Matchers/HaveCount.swift | 59 - .../Sources/Nimble/Matchers/Match.swift | 30 - .../Sources/Nimble/Matchers/MatchError.swift | 58 - .../Sources/Nimble/Matchers/MatcherFunc.swift | 85 - .../Nimble/Matchers/MatcherProtocols.swift | 154 - .../Nimble/Matchers/PostNotification.swift | 68 - .../Sources/Nimble/Matchers/Predicate.swift | 348 --- .../Nimble/Matchers/RaisesException.swift | 198 -- .../Nimble/Matchers/SatisfyAnyOf.swift | 109 - .../Nimble/Matchers/ThrowAssertion.swift | 56 - .../Sources/Nimble/Matchers/ThrowError.swift | 258 -- .../Sources/Nimble/Matchers/ToSucceed.swift | 37 - .../Externals/Nimble/Sources/Nimble/Nimble.h | 9 - .../Nimble/Sources/Nimble/Utils/Async.swift | 377 --- .../Nimble/Sources/Nimble/Utils/Errors.swift | 59 - .../Sources/Nimble/Utils/Functional.swift | 12 - .../Sources/Nimble/Utils/SourceLocation.swift | 31 - .../Sources/Nimble/Utils/Stringers.swift | 212 -- .../NimbleObjectiveC/CurrentTestCaseTracker.h | 9 - .../Nimble/Sources/NimbleObjectiveC/DSL.h | 383 --- .../Nimble/Sources/NimbleObjectiveC/DSL.m | 160 - .../NimbleObjectiveC/NMBExceptionCapture.h | 11 - .../NimbleObjectiveC/NMBExceptionCapture.m | 35 - .../Sources/NimbleObjectiveC/NMBStringify.h | 18 - .../Sources/NimbleObjectiveC/NMBStringify.m | 6 - .../XCTestObservationCenter+Register.m | 78 - .../Externals/Nimble/Tests/.swiftlint.yml | 2 - .../Externals/Nimble/Tests/LinuxMain.swift | 37 - .../Tests/NimbleTests/AsynchronousTest.swift | 245 -- .../Helpers/ObjectWithLazyProperty.swift | 7 - .../Helpers/XCTestCaseProvider.swift | 52 - .../Tests/NimbleTests/Helpers/utils.swift | 100 - .../Nimble/Tests/NimbleTests/Info.plist | 24 - .../Tests/NimbleTests/LinuxSupport.swift | 9 - .../NimbleTests/Matchers/AllPassTest.swift | 126 - .../NimbleTests/Matchers/BeAKindOfTest.swift | 89 - .../Matchers/BeAnInstanceOfTest.swift | 79 - .../NimbleTests/Matchers/BeCloseToTest.swift | 160 - .../NimbleTests/Matchers/BeEmptyTest.swift | 82 - .../Matchers/BeGreaterThanOrEqualToTest.swift | 54 - .../Matchers/BeGreaterThanTest.swift | 53 - .../Matchers/BeIdenticalToObjectTest.swift | 64 - .../Matchers/BeIdenticalToTest.swift | 68 - .../Matchers/BeLessThanOrEqualToTest.swift | 52 - .../NimbleTests/Matchers/BeLessThanTest.swift | 57 - .../NimbleTests/Matchers/BeLogicalTest.swift | 270 -- .../NimbleTests/Matchers/BeNilTest.swift | 28 - .../NimbleTests/Matchers/BeVoidTest.swift | 32 - .../NimbleTests/Matchers/BeginWithTest.swift | 53 - .../ContainElementSatisfyingTest.swift | 86 - .../NimbleTests/Matchers/ContainTest.swift | 95 - .../NimbleTests/Matchers/EndWithTest.swift | 56 - .../NimbleTests/Matchers/EqualTest.swift | 276 -- .../NimbleTests/Matchers/HaveCountTest.swift | 56 - .../NimbleTests/Matchers/MatchErrorTest.swift | 84 - .../NimbleTests/Matchers/MatchTest.swift | 46 - .../Matchers/PostNotificationTest.swift | 91 - .../Matchers/RaisesExceptionTest.swift | 166 - .../Matchers/SatisfyAnyOfTest.swift | 56 - .../Matchers/ThrowAssertionTest.swift | 62 - .../NimbleTests/Matchers/ThrowErrorTest.swift | 155 - .../NimbleTests/Matchers/ToSucceedTest.swift | 36 - .../Tests/NimbleTests/SynchronousTests.swift | 128 - .../NimbleTests/UserDescriptionTest.swift | 64 - .../Tests/NimbleTests/objc/NimbleSpecHelper.h | 15 - .../Tests/NimbleTests/objc/ObjCAllPassTest.m | 38 - .../Tests/NimbleTests/objc/ObjCAsyncTest.m | 55 - .../NimbleTests/objc/ObjCBeAnInstanceOfTest.m | 34 - .../NimbleTests/objc/ObjCBeCloseToTest.m | 47 - .../Tests/NimbleTests/objc/ObjCBeEmptyTest.m | 89 - .../Tests/NimbleTests/objc/ObjCBeFalseTest.m | 46 - .../Tests/NimbleTests/objc/ObjCBeFalsyTest.m | 58 - .../objc/ObjCBeGreaterThanOrEqualToTest.m | 44 - .../NimbleTests/objc/ObjCBeGreaterThanTest.m | 42 - .../NimbleTests/objc/ObjCBeIdenticalToTest.m | 68 - .../Tests/NimbleTests/objc/ObjCBeKindOfTest.m | 34 - .../objc/ObjCBeLessThanOrEqualToTest.m | 43 - .../NimbleTests/objc/ObjCBeLessThanTest.m | 42 - .../Tests/NimbleTests/objc/ObjCBeNilTest.m | 24 - .../Tests/NimbleTests/objc/ObjCBeTrueTest.m | 47 - .../Tests/NimbleTests/objc/ObjCBeTruthyTest.m | 55 - .../NimbleTests/objc/ObjCBeginWithTest.m | 37 - .../objc/ObjCContainElementSatisfying.m | 64 - .../Tests/NimbleTests/objc/ObjCContainTest.m | 67 - .../Tests/NimbleTests/objc/ObjCEndWithTest.m | 37 - .../Tests/NimbleTests/objc/ObjCEqualTest.m | 94 - .../Tests/NimbleTests/objc/ObjCHaveCount.m | 174 -- .../Tests/NimbleTests/objc/ObjCMatchTest.m | 33 - .../NimbleTests/objc/ObjCRaiseExceptionTest.m | 178 -- .../NimbleTests/objc/ObjCSatisfyAnyOfTest.m | 32 - .../Tests/NimbleTests/objc/ObjCSyncTest.m | 21 - .../objc/ObjCUserDescriptionTest.m | 52 - .../NimbleTests/objc/ObjcStringersTest.m | 31 - .../Quick/Externals/Nimble/script/release | 187 -- .../Checkouts/Quick/Externals/Nimble/test | 156 - Carthage/Checkouts/Quick/Gemfile | 5 - Carthage/Checkouts/Quick/Gemfile.lock | 113 - Carthage/Checkouts/Quick/LICENSE | 201 -- Carthage/Checkouts/Quick/Package.swift | 47 - .../Checkouts/Quick/Package@swift-4.swift | 40 - .../Objective-C/___FILEBASENAME___.h | 13 - .../Objective-C/___FILEBASENAME___.m | 17 - .../Swift/___FILEBASENAME___.swift | 15 - .../TemplateIcon.icns | Bin 529473 -> 0 bytes .../TemplateInfo.plist | 73 - .../Objective-C/___FILEBASENAME___.m | 14 - .../Swift/___FILEBASENAME___.swift | 16 - .../TemplateIcon.icns | Bin 529473 -> 0 bytes .../TemplateInfo.plist | 73 - Carthage/Checkouts/Quick/Quick.podspec | 38 - .../Quick/Quick.xcodeproj/project.pbxproj | 2700 ----------------- .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Quick-iOS.xcscheme | 135 - .../xcschemes/Quick-macOS.xcscheme | 135 - .../xcschemes/Quick-tvOS.xcscheme | 135 - .../contents.xcworkspacedata | 10 - Carthage/Checkouts/Quick/README.md | 88 - Carthage/Checkouts/Quick/Rakefile | 67 - .../Quick/Sources/Quick/Behavior.swift | 17 - .../Quick/Sources/Quick/Callsite.swift | 45 - .../Quick/Configuration/Configuration.swift | 161 - .../Configuration/QuickConfiguration.swift | 39 - .../Quick/Sources/Quick/DSL/DSL.swift | 271 -- .../Quick/Sources/Quick/DSL/World+DSL.swift | 205 -- .../Quick/Sources/Quick/ErrorUtility.swift | 10 - .../Quick/Sources/Quick/Example.swift | 131 - .../Quick/Sources/Quick/ExampleGroup.swift | 99 - .../Quick/Sources/Quick/ExampleMetadata.swift | 37 - .../Quick/Sources/Quick/Filter.swift | 44 - .../Quick/Sources/Quick/Hooks/Closures.swift | 35 - .../Sources/Quick/Hooks/ExampleHooks.swift | 42 - .../Sources/Quick/Hooks/HooksPhase.swift | 11 - .../Sources/Quick/Hooks/SuiteHooks.swift | 32 - .../Checkouts/Quick/Sources/Quick/Info.plist | 28 - .../Quick/NSBundle+CurrentTestBundle.swift | 25 - .../NSString+C99ExtendedIdentifier.swift | 33 - .../Quick/Sources/Quick/QuickMain.swift | 38 - .../Quick/QuickSelectedTestSuiteBuilder.swift | 74 - .../Quick/Sources/Quick/QuickSpec.swift | 122 - .../Quick/Sources/Quick/QuickTestSuite.swift | 52 - .../Quick/Sources/Quick/URL+FileName.swift | 12 - .../Checkouts/Quick/Sources/Quick/World.swift | 247 -- .../Configuration/QuickConfiguration.h | 30 - .../Configuration/QuickConfiguration.m | 83 - .../Sources/QuickObjectiveC/DSL/QCKDSL.h | 234 -- .../Sources/QuickObjectiveC/DSL/QCKDSL.m | 79 - .../Sources/QuickObjectiveC/DSL/World+DSL.h | 20 - .../Quick/Sources/QuickObjectiveC/Quick.h | 11 - .../Quick/Sources/QuickObjectiveC/QuickSpec.h | 50 - .../Quick/Sources/QuickObjectiveC/QuickSpec.m | 141 - .../Quick/Sources/QuickObjectiveC/World.h | 18 - .../XCTestSuite+QuickTestSuiteBuilder.m | 40 - .../Sources/QuickSpecBase/QuickSpecBase.m | 55 - .../QuickSpecBase/include/QuickSpecBase.h | 11 - .../Checkouts/Quick/Tests/LinuxMain.swift | 45 - .../AfterSuiteTests+ObjC.m | 32 - .../AfterSuiteTests.swift | 26 - .../QuickAfterSuiteTests/Info.plist | 24 - .../QuickFocusedTests/FocusedTests+ObjC.m | 56 - .../QuickFocusedTests/FocusedTests.swift | 68 - .../QuickTests/QuickFocusedTests/Info.plist | 24 - .../QuickTestHelpers/SpecRunner.swift | 30 - .../QuickTests/QuickTestHelpers/TestRun.swift | 9 - .../QuickTestHelpers/XCTestCaseProvider.swift | 52 - ...ctionalTests_BehaviorTests_Behaviors.swift | 20 - ...s_SharedExamplesTests_SharedExamples.swift | 20 - .../FunctionalTests/AfterEachTests.swift | 92 - .../FunctionalTests/BeforeEachTests.swift | 75 - .../FunctionalTests/BeforeSuiteTests.swift | 39 - .../FunctionalTests/BehaviorTests.swift | 59 - .../BundleModuleNameTests.swift | 30 - .../AfterEach/Configuration+AfterEach.swift | 11 - .../Configuration+AfterEachTests.swift | 31 - .../BeforeEach/Configuration+BeforeEach.swift | 11 - .../Configuration+BeforeEachTests.swift | 28 - .../FunctionalTests/ContextTests.swift | 20 - .../CrossReferencingSpecs.swift | 19 - .../FunctionalTests/DescribeTests.swift | 34 - .../QuickTests/FunctionalTests/ItTests.swift | 127 - .../ObjC/AfterEachTests+ObjC.m | 81 - .../ObjC/BeforeEachTests+ObjC.m | 68 - .../ObjC/BeforeSuiteTests+ObjC.m | 39 - .../FunctionalTests/ObjC/FailureTests+ObjC.m | 61 - .../ObjC/FailureUsingXCTAssertTests+ObjC.m | 55 - .../FunctionalTests/ObjC/ItTests+ObjC.m | 42 - .../FunctionalTests/ObjC/PendingTests+ObjC.m | 60 - .../SharedExamples+BeforeEachTests+ObjC.m | 59 - .../ObjC/SharedExamplesTests+ObjC.m | 65 - .../FunctionalTests/PendingTests.swift | 61 - .../SharedExamples+BeforeEachTests.swift | 48 - .../FunctionalTests/SharedExamplesTests.swift | 54 - .../QuickTests/Helpers/QCKSpecRunner.h | 22 - .../QuickTests/Helpers/QCKSpecRunner.m | 33 - .../Helpers/QuickSpec+QuickSpec_MethodList.h | 11 - .../Helpers/QuickSpec+QuickSpec_MethodList.m | 31 - .../Helpers/QuickTestsBridgingHeader.h | 2 - ...tObservationCenter+QCKSuspendObservation.h | 20 - ...tObservationCenter+QCKSuspendObservation.m | 54 - .../Tests/QuickTests/QuickTests/Info.plist | 24 - .../QuickTests/QuickConfigurationTests.m | 12 - Carthage/Checkouts/Quick/script/release | 182 -- .../Quick/script/travis-install-linux | 5 - .../Quick/script/travis-install-macos | 4 - .../Quick/script/travis-script-linux | 4 - .../Quick/script/travis-script-macos | 10 - .../Checkouts/Swinject/.Package.test.swift | 9 - Carthage/Checkouts/Swinject/.gitignore | 69 - Carthage/Checkouts/Swinject/.gitmodules | 1 - Carthage/Checkouts/Swinject/.hound.yml | 3 - Carthage/Checkouts/Swinject/.swift-version | 1 - Carthage/Checkouts/Swinject/.swiftlint.yml | 14 - Carthage/Checkouts/Swinject/.travis.yml | 44 - .../Swinject/Assets/SwinjectIcon.sketch | Bin 57344 -> 0 bytes Carthage/Checkouts/Swinject/CHANGELOG.md | 1 - Carthage/Checkouts/Swinject/CONTRIBUTING.md | 50 - Carthage/Checkouts/Swinject/Cartfile.private | 2 - Carthage/Checkouts/Swinject/Cartfile.resolved | 2 - .../Carthage/Checkouts/Nimble/.gitignore | 21 - .../Carthage/Checkouts/Nimble/.swift-version | 1 - .../Carthage/Checkouts/Nimble/.travis.yml | 25 - .../Carthage/Checkouts/Nimble/CONTRIBUTING.md | 120 - .../Carthage/Checkouts/Nimble/Gemfile | 4 - .../Carthage/Checkouts/Nimble/Gemfile.lock | 69 - .../Carthage/Checkouts/Nimble/LICENSE.md | 201 -- .../Carthage/Checkouts/Nimble/Nimble.podspec | 47 - .../Nimble/Nimble.xcodeproj/project.pbxproj | 2102 ------------- .../contents.xcworkspacedata | 7 - .../xcschemes/Nimble-iOS.xcscheme | 82 - .../xcschemes/Nimble-macOS.xcscheme | 82 - .../xcschemes/Nimble-tvOS.xcscheme | 99 - .../Carthage/Checkouts/Nimble/Package.swift | 10 - .../Carthage/Checkouts/Nimble/README.md | 1340 -------- .../CwlCatchException/.gitignore | 3 - .../CwlCatchException/CwlCatchException.h | 30 - .../CwlCatchException/CwlCatchException.m | 35 - .../CwlCatchException/CwlCatchException.swift | 32 - .../CwlCatchException/Info.plist | 28 - .../CwlBadInstructionException.swift | 76 - .../CwlCatchBadInstruction.h | 61 - .../CwlCatchBadInstruction.m | 50 - .../CwlCatchBadInstruction.swift | 194 -- .../CwlCatchBadInstructionPOSIX.swift | 108 - .../CwlDarwinDefinitions.swift | 63 - .../CwlPreconditionTesting/Info.plist | 28 - .../CwlPreconditionTesting/mach_excServer.c | 537 ---- .../CwlPreconditionTesting/mach_excServer.h | 298 -- .../Lib/CwlPreconditionTesting/README.md | 80 - .../Nimble/Adapters/AdapterProtocols.swift | 17 - .../Nimble/Adapters/AssertionDispatcher.swift | 20 - .../Nimble/Adapters/AssertionRecorder.swift | 100 - .../Nimble/Adapters/NMBExpectation.swift | 131 - .../Nimble/Adapters/NMBObjCMatcher.swift | 81 - .../Nimble/Adapters/NimbleEnvironment.swift | 45 - .../Nimble/Adapters/NimbleXCTestHandler.swift | 77 - .../NonObjectiveC/ExceptionCapture.swift | 31 - .../Nimble/Sources/Nimble/DSL+Wait.swift | 98 - .../Checkouts/Nimble/Sources/Nimble/DSL.swift | 64 - .../Nimble/Sources/Nimble/Expectation.swift | 76 - .../Nimble/Sources/Nimble/Expression.swift | 90 - .../Sources/Nimble/FailureMessage.swift | 65 - .../Nimble/Sources/Nimble/Info.plist | 28 - .../Sources/Nimble/Matchers/AllPass.swift | 100 - .../Nimble/Matchers/AsyncMatcherWrapper.swift | 146 - .../Sources/Nimble/Matchers/BeAKindOf.swift | 38 - .../Nimble/Matchers/BeAnInstanceOf.swift | 40 - .../Sources/Nimble/Matchers/BeCloseTo.swift | 122 - .../Sources/Nimble/Matchers/BeEmpty.swift | 92 - .../Nimble/Matchers/BeGreaterThan.swift | 42 - .../Matchers/BeGreaterThanOrEqualTo.swift | 44 - .../Nimble/Matchers/BeIdenticalTo.swift | 47 - .../Sources/Nimble/Matchers/BeLessThan.swift | 41 - .../Nimble/Matchers/BeLessThanOrEqual.swift | 42 - .../Sources/Nimble/Matchers/BeLogical.swift | 173 -- .../Sources/Nimble/Matchers/BeNil.swift | 20 - .../Sources/Nimble/Matchers/BeVoid.swift | 18 - .../Sources/Nimble/Matchers/BeginWith.swift | 65 - .../Sources/Nimble/Matchers/Contain.swift | 96 - .../Sources/Nimble/Matchers/EndWith.swift | 75 - .../Sources/Nimble/Matchers/Equal.swift | 181 -- .../Sources/Nimble/Matchers/HaveCount.swift | 57 - .../Sources/Nimble/Matchers/Match.swift | 30 - .../Sources/Nimble/Matchers/MatchError.swift | 26 - .../Sources/Nimble/Matchers/MatcherFunc.swift | 69 - .../Nimble/Matchers/MatcherProtocols.swift | 153 - .../Nimble/Matchers/PostNotification.swift | 70 - .../Nimble/Matchers/RaisesException.swift | 183 -- .../Nimble/Matchers/SatisfyAnyOf.swift | 65 - .../Nimble/Matchers/ThrowAssertion.swift | 55 - .../Sources/Nimble/Matchers/ThrowError.swift | 53 - .../Checkouts/Nimble/Sources/Nimble/Nimble.h | 14 - .../Nimble/Sources/Nimble/Utils/Async.swift | 361 --- .../Nimble/Sources/Nimble/Utils/Errors.swift | 142 - .../Sources/Nimble/Utils/Functional.swift | 12 - .../Sources/Nimble/Utils/SourceLocation.swift | 31 - .../Sources/Nimble/Utils/Stringers.swift | 213 -- .../NimbleObjectiveC/CurrentTestCaseTracker.h | 9 - .../Nimble/Sources/NimbleObjectiveC/DSL.h | 377 --- .../Nimble/Sources/NimbleObjectiveC/DSL.m | 156 - .../NimbleObjectiveC/NMBExceptionCapture.h | 11 - .../NimbleObjectiveC/NMBExceptionCapture.m | 35 - .../Sources/NimbleObjectiveC/NMBStringify.h | 18 - .../Sources/NimbleObjectiveC/NMBStringify.m | 6 - .../XCTestObservationCenter+Register.m | 78 - .../Checkouts/Nimble/Tests/LinuxMain.swift | 37 - .../Tests/NimbleTests/AsynchronousTest.swift | 222 -- .../Helpers/ObjectWithLazyProperty.swift | 7 - .../Helpers/XCTestCaseProvider.swift | 52 - .../Tests/NimbleTests/Helpers/utils.swift | 98 - .../Nimble/Tests/NimbleTests/Info.plist | 24 - .../Tests/NimbleTests/LinuxSupport.swift | 9 - .../NimbleTests/Matchers/AllPassTest.swift | 126 - .../NimbleTests/Matchers/BeAKindOfTest.swift | 56 - .../Matchers/BeAnInstanceOfTest.swift | 58 - .../NimbleTests/Matchers/BeCloseToTest.swift | 160 - .../NimbleTests/Matchers/BeEmptyTest.swift | 82 - .../Matchers/BeGreaterThanOrEqualToTest.swift | 50 - .../Matchers/BeGreaterThanTest.swift | 50 - .../Matchers/BeIdenticalToObjectTest.swift | 64 - .../Matchers/BeIdenticalToTest.swift | 68 - .../Matchers/BeLessThanOrEqualToTest.swift | 52 - .../NimbleTests/Matchers/BeLessThanTest.swift | 57 - .../NimbleTests/Matchers/BeLogicalTest.swift | 270 -- .../NimbleTests/Matchers/BeNilTest.swift | 28 - .../NimbleTests/Matchers/BeVoidTest.swift | 32 - .../NimbleTests/Matchers/BeginWithTest.swift | 53 - .../NimbleTests/Matchers/ContainTest.swift | 95 - .../NimbleTests/Matchers/EndWithTest.swift | 56 - .../NimbleTests/Matchers/EqualTest.swift | 274 -- .../NimbleTests/Matchers/HaveCountTest.swift | 56 - .../NimbleTests/Matchers/MatchErrorTest.swift | 83 - .../NimbleTests/Matchers/MatchTest.swift | 46 - .../Matchers/PostNotificationTest.swift | 91 - .../Matchers/RaisesExceptionTest.swift | 166 - .../Matchers/SatisfyAnyOfTest.swift | 56 - .../Matchers/ThrowAssertionTest.swift | 62 - .../NimbleTests/Matchers/ThrowErrorTest.swift | 154 - .../Tests/NimbleTests/SynchronousTests.swift | 129 - .../NimbleTests/UserDescriptionTest.swift | 64 - .../Tests/NimbleTests/objc/NimbleSpecHelper.h | 15 - .../Tests/NimbleTests/objc/ObjCAllPassTest.m | 38 - .../Tests/NimbleTests/objc/ObjCAsyncTest.m | 55 - .../NimbleTests/objc/ObjCBeAnInstanceOfTest.m | 34 - .../NimbleTests/objc/ObjCBeCloseToTest.m | 47 - .../Tests/NimbleTests/objc/ObjCBeEmptyTest.m | 89 - .../Tests/NimbleTests/objc/ObjCBeFalseTest.m | 46 - .../Tests/NimbleTests/objc/ObjCBeFalsyTest.m | 58 - .../objc/ObjCBeGreaterThanOrEqualToTest.m | 42 - .../NimbleTests/objc/ObjCBeGreaterThanTest.m | 41 - .../NimbleTests/objc/ObjCBeIdenticalToTest.m | 68 - .../Tests/NimbleTests/objc/ObjCBeKindOfTest.m | 34 - .../objc/ObjCBeLessThanOrEqualToTest.m | 43 - .../NimbleTests/objc/ObjCBeLessThanTest.m | 42 - .../Tests/NimbleTests/objc/ObjCBeNilTest.m | 24 - .../Tests/NimbleTests/objc/ObjCBeTrueTest.m | 47 - .../Tests/NimbleTests/objc/ObjCBeTruthyTest.m | 55 - .../NimbleTests/objc/ObjCBeginWithTest.m | 37 - .../Tests/NimbleTests/objc/ObjCContainTest.m | 67 - .../Tests/NimbleTests/objc/ObjCEndWithTest.m | 37 - .../Tests/NimbleTests/objc/ObjCEqualTest.m | 94 - .../Tests/NimbleTests/objc/ObjCHaveCount.m | 174 -- .../Tests/NimbleTests/objc/ObjCMatchTest.m | 33 - .../NimbleTests/objc/ObjCRaiseExceptionTest.m | 178 -- .../NimbleTests/objc/ObjCSatisfyAnyOfTest.m | 32 - .../Tests/NimbleTests/objc/ObjCSyncTest.m | 21 - .../objc/ObjCUserDescriptionTest.m | 52 - .../NimbleTests/objc/ObjcStringersTest.m | 31 - .../Carthage/Checkouts/Nimble/script/release | 186 -- .../Swinject/Carthage/Checkouts/Nimble/test | 142 - .../Checkouts/Quick/.Package.test.swift | 19 - .../Checkouts/Quick/.github/ISSUE_TEMPLATE | 36 - .../Quick/.github/PULL_REQUEST_TEMPLATE | 14 - .../Carthage/Checkouts/Quick/.gitignore | 65 - .../Carthage/Checkouts/Quick/.gitmodules | 3 - .../Carthage/Checkouts/Quick/.hound.yml | 2 - .../Carthage/Checkouts/Quick/.swift-version | 1 - .../Carthage/Checkouts/Quick/.swiftlint.yml | 12 - .../Carthage/Checkouts/Quick/.travis.yml | 30 - .../Checkouts/Quick/CODE_OF_CONDUCT.md | 74 - .../Carthage/Checkouts/Quick/CONTRIBUTING.md | 111 - .../Checkouts/Quick/Documentation/README.md | 6 - .../Documentation/en-us/ArrangeActAssert.md | 220 -- .../Documentation/en-us/BehavioralTesting.md | 87 - .../Documentation/en-us/ConfiguringQuick.md | 103 - .../en-us/InstallingFileTemplates.md | 28 - .../Documentation/en-us/InstallingQuick.md | 157 - .../Documentation/en-us/MoreResources.md | 28 - .../Documentation/en-us/NimbleAssertions.md | 106 - .../en-us/QuickExamplesAndGroups.md | 491 --- .../Documentation/en-us/QuickInObjectiveC.md | 57 - .../Quick/Documentation/en-us/README.md | 46 - .../en-us/SettingUpYourXcodeProject.md | 86 - .../Documentation/en-us/SharedExamples.md | 125 - .../en-us/TestUsingTestDoubles.md | 129 - .../Quick/Documentation/en-us/TestingApps.md | 179 -- .../Documentation/en-us/Troubleshooting.md | 9 - .../Documentation/ja/ArrangeActAssert.md | 212 -- .../Documentation/ja/BehavioralTesting.md | 81 - .../Documentation/ja/ConfiguringQuick.md | 101 - .../ja/InstallingFileTemplates.md | 26 - .../Quick/Documentation/ja/InstallingQuick.md | 152 - .../Quick/Documentation/ja/MoreResources.md | 27 - .../Documentation/ja/NimbleAssertions.md | 100 - .../ja/QuickExamplesAndGroups.md | 477 --- .../Documentation/ja/QuickInObjectiveC.md | 48 - .../Quick/Documentation/ja/README.md | 50 - .../ja/SettingUpYourXcodeProject.md | 77 - .../Quick/Documentation/ja/SharedExamples.md | 122 - .../Documentation/ja/TestUsingTestDoubles.md | 138 - .../Quick/Documentation/ja/TestingApps.md | 174 -- .../Quick/Documentation/ja/Troubleshooting.md | 9 - .../Documentation/pt-br/BehavioralTesting.md | 78 - .../Quick/Documentation/pt-br/README.md | 39 - .../Documentation/zh-cn/ArrangeActAssert.md | 205 -- .../Documentation/zh-cn/BehavioralTesting.md | 75 - .../Documentation/zh-cn/ConfiguringQuick.md | 102 - .../zh-cn/InstallingFileTemplates.md | 26 - .../Documentation/zh-cn/InstallingQuick.md | 157 - .../Documentation/zh-cn/MoreResources.md | 23 - .../Documentation/zh-cn/NimbleAssertions.md | 100 - .../zh-cn/QuickExamplesAndGroups.md | 461 --- .../Documentation/zh-cn/QuickInObjectiveC.md | 52 - .../Quick/Documentation/zh-cn/README.md | 18 - .../zh-cn/SettingUpYourXcodeProject.md | 75 - .../Documentation/zh-cn/SharedExamples.md | 113 - .../zh-cn/TestUsingTestDoubles.md | 131 - .../Quick/Documentation/zh-cn/TestingApps.md | 174 -- .../Documentation/zh-cn/Troubleshooting.md | 10 - .../Quick/Externals/Nimble/.gitignore | 21 - .../Quick/Externals/Nimble/.swift-version | 1 - .../Quick/Externals/Nimble/.travis.yml | 25 - .../Quick/Externals/Nimble/CONTRIBUTING.md | 120 - .../Checkouts/Quick/Externals/Nimble/Gemfile | 4 - .../Quick/Externals/Nimble/Gemfile.lock | 69 - .../Quick/Externals/Nimble/LICENSE.md | 201 -- .../Quick/Externals/Nimble/Nimble.podspec | 47 - .../Nimble/Nimble.xcodeproj/project.pbxproj | 2102 ------------- .../contents.xcworkspacedata | 7 - .../xcschemes/Nimble-iOS.xcscheme | 82 - .../xcschemes/Nimble-macOS.xcscheme | 82 - .../xcschemes/Nimble-tvOS.xcscheme | 99 - .../Quick/Externals/Nimble/Package.swift | 10 - .../Quick/Externals/Nimble/README.md | 1340 -------- .../CwlCatchException/.gitignore | 3 - .../CwlCatchException/CwlCatchException.h | 30 - .../CwlCatchException/CwlCatchException.m | 35 - .../CwlCatchException/CwlCatchException.swift | 32 - .../CwlCatchException/Info.plist | 28 - .../CwlBadInstructionException.swift | 76 - .../CwlCatchBadInstruction.h | 61 - .../CwlCatchBadInstruction.m | 50 - .../CwlCatchBadInstruction.swift | 194 -- .../CwlCatchBadInstructionPOSIX.swift | 100 - .../CwlDarwinDefinitions.swift | 63 - .../CwlPreconditionTesting/Info.plist | 28 - .../CwlPreconditionTesting/mach_excServer.c | 537 ---- .../CwlPreconditionTesting/mach_excServer.h | 298 -- .../Lib/CwlPreconditionTesting/README.md | 80 - .../Nimble/Adapters/AdapterProtocols.swift | 17 - .../Nimble/Adapters/AssertionDispatcher.swift | 20 - .../Nimble/Adapters/AssertionRecorder.swift | 100 - .../Nimble/Adapters/NMBExpectation.swift | 131 - .../Nimble/Adapters/NMBObjCMatcher.swift | 81 - .../Nimble/Adapters/NimbleEnvironment.swift | 45 - .../Nimble/Adapters/NimbleXCTestHandler.swift | 77 - .../NonObjectiveC/ExceptionCapture.swift | 31 - .../Nimble/Sources/Nimble/DSL+Wait.swift | 98 - .../Externals/Nimble/Sources/Nimble/DSL.swift | 64 - .../Nimble/Sources/Nimble/Expectation.swift | 76 - .../Nimble/Sources/Nimble/Expression.swift | 90 - .../Sources/Nimble/FailureMessage.swift | 65 - .../Nimble/Sources/Nimble/Info.plist | 28 - .../Sources/Nimble/Matchers/AllPass.swift | 100 - .../Nimble/Matchers/AsyncMatcherWrapper.swift | 146 - .../Sources/Nimble/Matchers/BeAKindOf.swift | 38 - .../Nimble/Matchers/BeAnInstanceOf.swift | 40 - .../Sources/Nimble/Matchers/BeCloseTo.swift | 122 - .../Sources/Nimble/Matchers/BeEmpty.swift | 92 - .../Nimble/Matchers/BeGreaterThan.swift | 42 - .../Matchers/BeGreaterThanOrEqualTo.swift | 44 - .../Nimble/Matchers/BeIdenticalTo.swift | 47 - .../Sources/Nimble/Matchers/BeLessThan.swift | 41 - .../Nimble/Matchers/BeLessThanOrEqual.swift | 42 - .../Sources/Nimble/Matchers/BeLogical.swift | 173 -- .../Sources/Nimble/Matchers/BeNil.swift | 20 - .../Sources/Nimble/Matchers/BeVoid.swift | 18 - .../Sources/Nimble/Matchers/BeginWith.swift | 65 - .../Sources/Nimble/Matchers/Contain.swift | 96 - .../Sources/Nimble/Matchers/EndWith.swift | 75 - .../Sources/Nimble/Matchers/Equal.swift | 181 -- .../Sources/Nimble/Matchers/HaveCount.swift | 57 - .../Sources/Nimble/Matchers/Match.swift | 30 - .../Sources/Nimble/Matchers/MatchError.swift | 26 - .../Sources/Nimble/Matchers/MatcherFunc.swift | 69 - .../Nimble/Matchers/MatcherProtocols.swift | 153 - .../Nimble/Matchers/PostNotification.swift | 70 - .../Nimble/Matchers/RaisesException.swift | 183 -- .../Nimble/Matchers/SatisfyAnyOf.swift | 65 - .../Nimble/Matchers/ThrowAssertion.swift | 55 - .../Sources/Nimble/Matchers/ThrowError.swift | 53 - .../Externals/Nimble/Sources/Nimble/Nimble.h | 14 - .../Nimble/Sources/Nimble/Utils/Async.swift | 361 --- .../Nimble/Sources/Nimble/Utils/Errors.swift | 142 - .../Sources/Nimble/Utils/Functional.swift | 12 - .../Sources/Nimble/Utils/SourceLocation.swift | 31 - .../Sources/Nimble/Utils/Stringers.swift | 213 -- .../NimbleObjectiveC/CurrentTestCaseTracker.h | 9 - .../Nimble/Sources/NimbleObjectiveC/DSL.h | 377 --- .../Nimble/Sources/NimbleObjectiveC/DSL.m | 156 - .../NimbleObjectiveC/NMBExceptionCapture.h | 11 - .../NimbleObjectiveC/NMBExceptionCapture.m | 35 - .../Sources/NimbleObjectiveC/NMBStringify.h | 18 - .../Sources/NimbleObjectiveC/NMBStringify.m | 6 - .../XCTestObservationCenter+Register.m | 78 - .../Externals/Nimble/Tests/LinuxMain.swift | 37 - .../Tests/NimbleTests/AsynchronousTest.swift | 222 -- .../Helpers/ObjectWithLazyProperty.swift | 7 - .../Helpers/XCTestCaseProvider.swift | 52 - .../Tests/NimbleTests/Helpers/utils.swift | 98 - .../Nimble/Tests/NimbleTests/Info.plist | 24 - .../Tests/NimbleTests/LinuxSupport.swift | 9 - .../NimbleTests/Matchers/AllPassTest.swift | 126 - .../NimbleTests/Matchers/BeAKindOfTest.swift | 56 - .../Matchers/BeAnInstanceOfTest.swift | 58 - .../NimbleTests/Matchers/BeCloseToTest.swift | 160 - .../NimbleTests/Matchers/BeEmptyTest.swift | 82 - .../Matchers/BeGreaterThanOrEqualToTest.swift | 50 - .../Matchers/BeGreaterThanTest.swift | 50 - .../Matchers/BeIdenticalToObjectTest.swift | 64 - .../Matchers/BeIdenticalToTest.swift | 68 - .../Matchers/BeLessThanOrEqualToTest.swift | 52 - .../NimbleTests/Matchers/BeLessThanTest.swift | 57 - .../NimbleTests/Matchers/BeLogicalTest.swift | 270 -- .../NimbleTests/Matchers/BeNilTest.swift | 28 - .../NimbleTests/Matchers/BeVoidTest.swift | 32 - .../NimbleTests/Matchers/BeginWithTest.swift | 53 - .../NimbleTests/Matchers/ContainTest.swift | 95 - .../NimbleTests/Matchers/EndWithTest.swift | 56 - .../NimbleTests/Matchers/EqualTest.swift | 274 -- .../NimbleTests/Matchers/HaveCountTest.swift | 56 - .../NimbleTests/Matchers/MatchErrorTest.swift | 83 - .../NimbleTests/Matchers/MatchTest.swift | 46 - .../Matchers/PostNotificationTest.swift | 91 - .../Matchers/RaisesExceptionTest.swift | 166 - .../Matchers/SatisfyAnyOfTest.swift | 56 - .../Matchers/ThrowAssertionTest.swift | 62 - .../NimbleTests/Matchers/ThrowErrorTest.swift | 154 - .../Tests/NimbleTests/SynchronousTests.swift | 129 - .../NimbleTests/UserDescriptionTest.swift | 64 - .../Tests/NimbleTests/objc/NimbleSpecHelper.h | 15 - .../Tests/NimbleTests/objc/ObjCAllPassTest.m | 38 - .../Tests/NimbleTests/objc/ObjCAsyncTest.m | 55 - .../NimbleTests/objc/ObjCBeAnInstanceOfTest.m | 34 - .../NimbleTests/objc/ObjCBeCloseToTest.m | 47 - .../Tests/NimbleTests/objc/ObjCBeEmptyTest.m | 89 - .../Tests/NimbleTests/objc/ObjCBeFalseTest.m | 46 - .../Tests/NimbleTests/objc/ObjCBeFalsyTest.m | 58 - .../objc/ObjCBeGreaterThanOrEqualToTest.m | 42 - .../NimbleTests/objc/ObjCBeGreaterThanTest.m | 41 - .../NimbleTests/objc/ObjCBeIdenticalToTest.m | 68 - .../Tests/NimbleTests/objc/ObjCBeKindOfTest.m | 34 - .../objc/ObjCBeLessThanOrEqualToTest.m | 43 - .../NimbleTests/objc/ObjCBeLessThanTest.m | 42 - .../Tests/NimbleTests/objc/ObjCBeNilTest.m | 24 - .../Tests/NimbleTests/objc/ObjCBeTrueTest.m | 47 - .../Tests/NimbleTests/objc/ObjCBeTruthyTest.m | 55 - .../NimbleTests/objc/ObjCBeginWithTest.m | 37 - .../Tests/NimbleTests/objc/ObjCContainTest.m | 67 - .../Tests/NimbleTests/objc/ObjCEndWithTest.m | 37 - .../Tests/NimbleTests/objc/ObjCEqualTest.m | 94 - .../Tests/NimbleTests/objc/ObjCHaveCount.m | 174 -- .../Tests/NimbleTests/objc/ObjCMatchTest.m | 33 - .../NimbleTests/objc/ObjCRaiseExceptionTest.m | 178 -- .../NimbleTests/objc/ObjCSatisfyAnyOfTest.m | 32 - .../Tests/NimbleTests/objc/ObjCSyncTest.m | 21 - .../objc/ObjCUserDescriptionTest.m | 52 - .../NimbleTests/objc/ObjcStringersTest.m | 31 - .../Quick/Externals/Nimble/script/release | 186 -- .../Checkouts/Quick/Externals/Nimble/test | 142 - .../Swinject/Carthage/Checkouts/Quick/Gemfile | 3 - .../Carthage/Checkouts/Quick/Gemfile.lock | 67 - .../Swinject/Carthage/Checkouts/Quick/LICENSE | 201 -- .../Carthage/Checkouts/Quick/Package.swift | 13 - .../Objective-C/___FILEBASENAME___.h | 13 - .../Objective-C/___FILEBASENAME___.m | 17 - .../Swift/___FILEBASENAME___.swift | 15 - .../TemplateIcon.icns | Bin 529473 -> 0 bytes .../TemplateInfo.plist | 73 - .../Objective-C/___FILEBASENAME___.m | 14 - .../Swift/___FILEBASENAME___.swift | 16 - .../TemplateIcon.icns | Bin 529473 -> 0 bytes .../TemplateInfo.plist | 73 - .../Carthage/Checkouts/Quick/Quick.podspec | 38 - .../Quick/Quick.xcodeproj/project.pbxproj | 2641 ---------------- .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Quick-iOS.xcscheme | 119 - .../xcschemes/Quick-macOS.xcscheme | 119 - .../xcschemes/Quick-tvOS.xcscheme | 119 - .../contents.xcworkspacedata | 10 - .../Carthage/Checkouts/Quick/README.md | 85 - .../Carthage/Checkouts/Quick/Rakefile | 68 - .../Quick/Sources/Quick/Callsite.swift | 30 - .../Quick/Configuration/Configuration.swift | 161 - .../Configuration/QuickConfiguration.swift | 8 - .../Quick/Sources/Quick/DSL/DSL.swift | 227 -- .../Quick/Sources/Quick/DSL/World+DSL.swift | 169 -- .../Quick/Sources/Quick/ErrorUtility.swift | 10 - .../Quick/Sources/Quick/Example.swift | 111 - .../Quick/Sources/Quick/ExampleGroup.swift | 103 - .../Quick/Sources/Quick/ExampleMetadata.swift | 24 - .../Quick/Sources/Quick/Filter.swift | 31 - .../Quick/Sources/Quick/Hooks/Closures.swift | 35 - .../Sources/Quick/Hooks/ExampleHooks.swift | 42 - .../Sources/Quick/Hooks/HooksPhase.swift | 11 - .../Sources/Quick/Hooks/SuiteHooks.swift | 32 - .../Checkouts/Quick/Sources/Quick/Info.plist | 28 - .../Quick/NSBundle+CurrentTestBundle.swift | 16 - .../Quick/Sources/Quick/QuickMain.swift | 33 - .../Quick/QuickSelectedTestSuiteBuilder.swift | 75 - .../Quick/Sources/Quick/QuickSpec.swift | 48 - .../Quick/Sources/Quick/QuickTestSuite.swift | 52 - .../Quick/Sources/Quick/URL+FileName.swift | 12 - .../Checkouts/Quick/Sources/Quick/World.swift | 232 -- .../Configuration/QuickConfiguration.h | 30 - .../Configuration/QuickConfiguration.m | 83 - .../Sources/QuickObjectiveC/DSL/QCKDSL.h | 234 -- .../Sources/QuickObjectiveC/DSL/QCKDSL.m | 79 - .../Sources/QuickObjectiveC/DSL/World+DSL.h | 20 - .../NSString+QCKSelectorName.h | 17 - .../NSString+QCKSelectorName.m | 37 - .../Quick/Sources/QuickObjectiveC/Quick.h | 11 - .../Quick/Sources/QuickObjectiveC/QuickSpec.h | 50 - .../Quick/Sources/QuickObjectiveC/QuickSpec.m | 170 -- .../Quick/Sources/QuickObjectiveC/World.h | 18 - .../XCTestSuite+QuickTestSuiteBuilder.m | 40 - .../Checkouts/Quick/Tests/LinuxMain.swift | 45 - .../AfterSuiteTests+ObjC.m | 32 - .../AfterSuiteTests.swift | 26 - .../QuickAfterSuiteTests/Info.plist | 24 - .../QuickFocusedTests/FocusedTests+ObjC.m | 56 - .../QuickFocusedTests/FocusedTests.swift | 53 - .../QuickTests/QuickFocusedTests/Info.plist | 24 - .../QuickTestHelpers/SpecRunner.swift | 30 - .../QuickTests/QuickTestHelpers/TestRun.swift | 9 - .../QuickTestHelpers/XCTestCaseProvider.swift | 52 - ...s_SharedExamplesTests_SharedExamples.swift | 20 - .../FunctionalTests/AfterEachTests.swift | 93 - .../FunctionalTests/BeforeEachTests.swift | 76 - .../FunctionalTests/BeforeSuiteTests.swift | 39 - .../AfterEach/Configuration+AfterEach.swift | 11 - .../Configuration+AfterEachTests.swift | 31 - .../BeforeEach/Configuration+BeforeEach.swift | 11 - .../Configuration+BeforeEachTests.swift | 28 - .../FunctionalTests/ContextTests.swift | 20 - .../CrossReferencingSpecs.swift | 19 - .../FunctionalTests/DescribeTests.swift | 34 - .../QuickTests/FunctionalTests/ItTests.swift | 127 - .../ObjC/AfterEachTests+ObjC.m | 81 - .../ObjC/BeforeEachTests+ObjC.m | 68 - .../ObjC/BeforeSuiteTests+ObjC.m | 39 - .../FunctionalTests/ObjC/FailureTests+ObjC.m | 61 - .../ObjC/FailureUsingXCTAssertTests+ObjC.m | 55 - .../FunctionalTests/ObjC/ItTests+ObjC.m | 42 - .../FunctionalTests/ObjC/PendingTests+ObjC.m | 60 - .../SharedExamples+BeforeEachTests+ObjC.m | 59 - .../ObjC/SharedExamplesTests+ObjC.m | 65 - .../FunctionalTests/PendingTests.swift | 54 - .../SharedExamples+BeforeEachTests.swift | 48 - .../FunctionalTests/SharedExamplesTests.swift | 54 - .../QuickTests/Helpers/QCKSpecRunner.h | 22 - .../QuickTests/Helpers/QCKSpecRunner.m | 33 - .../Helpers/QuickSpec+QuickSpec_MethodList.h | 11 - .../Helpers/QuickSpec+QuickSpec_MethodList.m | 31 - .../Helpers/QuickTestsBridgingHeader.h | 2 - ...tObservationCenter+QCKSuspendObservation.h | 20 - ...tObservationCenter+QCKSuspendObservation.m | 54 - .../Tests/QuickTests/QuickTests/Info.plist | 24 - .../QuickTests/QuickConfigurationTests.m | 12 - .../Carthage/Checkouts/Quick/script/release | 182 -- .../Quick/script/travis-install-linux | 5 - .../Quick/script/travis-install-macos | 4 - .../Quick/script/travis-script-linux | 4 - .../Quick/script/travis-script-macos | 10 - .../Carthage/Checkouts/xcconfigs/.gitignore | 1 - .../Checkouts/xcconfigs/Base/Common.xcconfig | 179 -- .../Base/Configurations/Debug.xcconfig | 43 - .../Base/Configurations/Test.xcconfig | 10 - .../Carthage/Checkouts/xcconfigs/README.md | 13 - .../Configurations/Base/Common.xcconfig | 179 -- .../Base/Configurations/Debug.xcconfig | 43 - .../Base/Configurations/Profile.xcconfig | 27 - .../Base/Configurations/Release.xcconfig | 34 - .../Base/Configurations/Test.xcconfig | 10 - .../Base/Targets/Application.xcconfig | 12 - .../Base/Targets/Framework.xcconfig | 37 - .../Base/Targets/StaticLibrary.xcconfig | 32 - .../Mac OS X/Mac-Application.xcconfig | 15 - .../Configurations/Mac OS X/Mac-Base.xcconfig | 19 - .../Mac OS X/Mac-DynamicLibrary.xcconfig | 18 - .../Mac OS X/Mac-Framework.xcconfig | 11 - .../Mac OS X/Mac-StaticLibrary.xcconfig | 11 - .../iOS/iOS-Application.xcconfig | 11 - .../Configurations/iOS/iOS-Base.xcconfig | 18 - .../Configurations/iOS/iOS-Framework.xcconfig | 11 - .../iOS/iOS-StaticLibrary.xcconfig | 11 - .../tvOS/tvOS-Application.xcconfig | 11 - .../Configurations/tvOS/tvOS-Base.xcconfig | 15 - .../tvOS/tvOS-Framework.xcconfig | 11 - .../tvOS/tvOS-StaticLibrary.xcconfig | 11 - .../watchOS/watchOS-Application.xcconfig | 11 - .../watchOS/watchOS-Base.xcconfig | 15 - .../watchOS/watchOS-Framework.xcconfig | 11 - .../watchOS/watchOS-StaticLibrary.xcconfig | 11 - .../Swinject/Documentation/Assembler.md | 170 -- .../AnimalViewControllerScreenshot1.png | Bin 44301 -> 0 bytes .../AnimalViewControllerScreenshot2.png | Bin 57041 -> 0 bytes .../Documentation/CircularDependencies.md | 106 - .../Documentation/ContainerHierarchy.md | 27 - .../Swinject/Documentation/DIContainer.md | 232 -- .../Documentation/InjectionPatterns.md | 127 - .../Checkouts/Swinject/Documentation/Misc.md | 96 - .../Swinject/Documentation/ObjectScopes.md | 55 - .../Swinject/Documentation/README.md | 28 - .../Swinject/Documentation/ThreadSafety.md | 79 - Carthage/Checkouts/Swinject/LICENSE.txt | 21 - Carthage/Checkouts/Swinject/Package.swift | 5 - Carthage/Checkouts/Swinject/README.md | 287 -- .../Sample-iOS.playground/Contents.swift | 392 --- .../contents.xcplayground | 4 - .../Swinject/Sources/Assembler.swift | 118 - .../Checkouts/Swinject/Sources/Assembly.swift | 32 - .../Swinject/Sources/Container.Arguments.erb | 93 - .../Sources/Container.Arguments.swift | 512 ---- .../Swinject/Sources/Container.Logging.swift | 24 - .../Swinject/Sources/Container.swift | 268 -- .../Swinject/Sources/DebugHelper.swift | 54 - .../Swinject/Sources/FunctionType.swift | 10 - .../Checkouts/Swinject/Sources/Info.plist | 26 - .../Swinject/Sources/InstanceStorage.swift | 49 - .../Sources/ObjectScope.Standard.swift | 25 - .../Swinject/Sources/ObjectScope.swift | 40 - .../Checkouts/Swinject/Sources/Resolver.erb | 69 - .../Checkouts/Swinject/Sources/Resolver.swift | 270 -- .../Swinject/Sources/ServiceEntry.swift | 88 - .../Swinject/Sources/ServiceKey.swift | 50 - .../Checkouts/Swinject/Sources/SpinLock.swift | 19 - .../Checkouts/Swinject/Sources/Swinject.h | 17 - .../SynchronizedResolver.Arguments.erb | 46 - .../SynchronizedResolver.Arguments.swift | 191 -- .../Sources/SynchronizedResolver.swift | 42 - .../Swinject/Sources/UnavailableItems.swift | 25 - .../Swinject/Sources/_Resolver.swift | 24 - Carthage/Checkouts/Swinject/Swinject.podspec | 19 - .../Swinject.xcodeproj/project.pbxproj | 1373 --------- .../contents.xcworkspacedata | 7 - .../xcschemes/Swinject-OSX.xcscheme | 100 - .../xcschemes/Swinject-iOS.xcscheme | 100 - .../xcschemes/Swinject-tvOS.xcscheme | 99 - .../xcschemes/Swinject-watchOS.xcscheme | 80 - .../Checkouts/Swinject/Tests/LinuxMain.swift | 24 - .../Swinject/Tests/SwinjectTests/Animal.swift | 49 - .../Tests/SwinjectTests/AssemblerSpec.swift | 275 -- .../Tests/SwinjectTests/BasicAssembly.swift | 39 - .../Tests/SwinjectTests/Circularity.swift | 73 - .../ContainerSpec.Arguments.swift | 104 - .../ContainerSpec.Circularity.swift | 126 - .../ContainerSpec.CustomScope.swift | 93 - ...ontainerSpec.CustomStringConvertible.swift | 79 - .../ContainerSpec.DebugHelper.swift | 71 - .../Tests/SwinjectTests/ContainerSpec.swift | 343 --- .../Swinject/Tests/SwinjectTests/Food.swift | 13 - .../Swinject/Tests/SwinjectTests/Info.plist | 24 - .../SwinjectTests/LoadAwareAssembly.swift | 29 - .../Swinject/Tests/SwinjectTests/Person.swift | 27 - .../SwinjectTests/ServiceEntrySpec.swift | 22 - .../Tests/SwinjectTests/ServiceKeySpec.swift | 134 - .../SynchronizedResolverSpec.swift | 122 - .../Tests/SwinjectTests/WeakStorageSpec.swift | 62 - Carthage/Checkouts/Swinject/script/gencode | 8 - Carthage/Checkouts/xcconfigs/.gitignore | 1 - .../Base/Configurations/Profile.xcconfig | 27 - .../Base/Configurations/Release.xcconfig | 34 - .../Base/Targets/Application.xcconfig | 12 - .../xcconfigs/Base/Targets/Framework.xcconfig | 37 - .../Base/Targets/StaticLibrary.xcconfig | 32 - .../Mac OS X/Mac-Application.xcconfig | 15 - .../xcconfigs/Mac OS X/Mac-Base.xcconfig | 19 - .../Mac OS X/Mac-DynamicLibrary.xcconfig | 18 - .../xcconfigs/Mac OS X/Mac-Framework.xcconfig | 11 - .../Mac OS X/Mac-StaticLibrary.xcconfig | 11 - Carthage/Checkouts/xcconfigs/README.md | 13 - .../xcconfigs/iOS/iOS-Application.xcconfig | 11 - .../Checkouts/xcconfigs/iOS/iOS-Base.xcconfig | 18 - .../xcconfigs/iOS/iOS-Framework.xcconfig | 11 - .../xcconfigs/iOS/iOS-StaticLibrary.xcconfig | 11 - .../xcconfigs/tvOS/tvOS-Application.xcconfig | 11 - .../xcconfigs/tvOS/tvOS-Base.xcconfig | 15 - .../xcconfigs/tvOS/tvOS-Framework.xcconfig | 11 - .../tvOS/tvOS-StaticLibrary.xcconfig | 11 - .../watchOS/watchOS-Application.xcconfig | 11 - .../xcconfigs/watchOS/watchOS-Base.xcconfig | 15 - .../watchOS/watchOS-Framework.xcconfig | 11 - .../watchOS/watchOS-StaticLibrary.xcconfig | 11 - .../Base/Common.xcconfig | 12 +- .../Base/Configurations/Debug.xcconfig | 0 .../Base/Configurations/Profile.xcconfig | 0 .../Base/Configurations/Release.xcconfig | 0 .../Base/Configurations/Test.xcconfig | 0 .../Base/Targets/Application.xcconfig | 0 .../Base/Targets/Framework.xcconfig | 0 .../Base/Targets/StaticLibrary.xcconfig | 0 .../Mac OS X/Mac-Application.xcconfig | 0 .../Mac OS X/Mac-Base.xcconfig | 0 .../Mac OS X/Mac-DynamicLibrary.xcconfig | 0 .../Mac OS X/Mac-Framework.xcconfig | 0 .../Mac OS X/Mac-StaticLibrary.xcconfig | 0 .../iOS/iOS-Application.xcconfig | 0 .../iOS/iOS-Base.xcconfig | 0 .../iOS/iOS-Framework.xcconfig | 0 .../iOS/iOS-StaticLibrary.xcconfig | 0 .../tvOS/tvOS-Application.xcconfig | 0 .../tvOS/tvOS-Base.xcconfig | 0 .../tvOS/tvOS-Framework.xcconfig | 0 .../tvOS/tvOS-StaticLibrary.xcconfig | 0 .../watchOS/watchOS-Application.xcconfig | 0 .../watchOS/watchOS-Base.xcconfig | 0 .../watchOS/watchOS-Framework.xcconfig | 0 .../watchOS/watchOS-StaticLibrary.xcconfig | 0 .../project.pbxproj | 17 +- 1122 files changed, 22 insertions(+), 102689 deletions(-) delete mode 100644 Carthage/Checkouts/Nimble/.github/ISSUE_TEMPLATE delete mode 100644 Carthage/Checkouts/Nimble/.github/PULL_REQUEST_TEMPLATE delete mode 100644 Carthage/Checkouts/Nimble/.gitignore delete mode 100644 Carthage/Checkouts/Nimble/.hound.yml delete mode 100644 Carthage/Checkouts/Nimble/.swift-version delete mode 100644 Carthage/Checkouts/Nimble/.swiftlint.yml delete mode 100644 Carthage/Checkouts/Nimble/.travis.yml delete mode 100644 Carthage/Checkouts/Nimble/CONTRIBUTING.md delete mode 100644 Carthage/Checkouts/Nimble/Dockerfile.test delete mode 100644 Carthage/Checkouts/Nimble/Gemfile delete mode 100644 Carthage/Checkouts/Nimble/Gemfile.lock delete mode 100644 Carthage/Checkouts/Nimble/LICENSE delete mode 100644 Carthage/Checkouts/Nimble/Nimble.podspec delete mode 100644 Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.pbxproj delete mode 100644 Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme delete mode 100644 Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme delete mode 100644 Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme delete mode 100644 Carthage/Checkouts/Nimble/Package.swift delete mode 100644 Carthage/Checkouts/Nimble/README.md delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/README.md delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/DSL+Wait.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/DSL.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Expectation.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/ExpectationMessage.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Expression.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/FailureMessage.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Info.plist delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AllPass.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeEmpty.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThan.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLogical.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeNil.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeVoid.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeginWith.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Contain.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/EndWith.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Equal.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/HaveCount.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Match.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatchError.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Predicate.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/RaisesException.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowError.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ToSucceed.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Nimble.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Async.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Errors.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Functional.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Utils/SourceLocation.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Stringers.swift delete mode 100644 Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.m delete mode 100644 Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m delete mode 100644 Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.h delete mode 100644 Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.m delete mode 100644 Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/.swiftlint.yml delete mode 100644 Carthage/Checkouts/Nimble/Tests/LinuxMain.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/AsynchronousTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/utils.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Info.plist delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/LinuxSupport.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/SynchronousTests.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/UserDescriptionTest.swift delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainElementSatisfying.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m delete mode 100644 Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m delete mode 100755 Carthage/Checkouts/Nimble/script/release delete mode 100755 Carthage/Checkouts/Nimble/test delete mode 100644 Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE delete mode 100644 Carthage/Checkouts/Quick/.github/PULL_REQUEST_TEMPLATE delete mode 100644 Carthage/Checkouts/Quick/.gitignore delete mode 100644 Carthage/Checkouts/Quick/.gitmodules delete mode 100644 Carthage/Checkouts/Quick/.hound.yml delete mode 100644 Carthage/Checkouts/Quick/.swift-version delete mode 100644 Carthage/Checkouts/Quick/.swiftlint.yml delete mode 100644 Carthage/Checkouts/Quick/.travis.yml delete mode 100644 Carthage/Checkouts/Quick/CODE_OF_CONDUCT.md delete mode 100644 Carthage/Checkouts/Quick/CONTRIBUTING.md delete mode 100644 Carthage/Checkouts/Quick/Dangerfile delete mode 100644 Carthage/Checkouts/Quick/Documentation/README.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/ArrangeActAssert.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/BehavioralTesting.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/ConfiguringQuick.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/InstallingFileTemplates.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/MoreResources.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/NimbleAssertions.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/QuickExamplesAndGroups.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/QuickInObjectiveC.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/README.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/SettingUpYourXcodeProject.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/SharedExamples.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/TestUsingTestDoubles.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/TestingApps.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/en-us/Troubleshooting.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/ArrangeActAssert.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/BehavioralTesting.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/ConfiguringQuick.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/InstallingFileTemplates.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/MoreResources.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/NimbleAssertions.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/QuickExamplesAndGroups.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/QuickInObjectiveC.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/README.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/SettingUpYourXcodeProject.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/TestUsingTestDoubles.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/TestingApps.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/ja/Troubleshooting.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/pt-br/BehavioralTesting.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/pt-br/README.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/pt-br/SharedExamples.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/ArrangeActAssert.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/BehavioralTesting.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/ConfiguringQuick.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingFileTemplates.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/MoreResources.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/NimbleAssertions.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/QuickExamplesAndGroups.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/QuickInObjectiveC.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/README.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/SettingUpYourXcodeProject.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/TestUsingTestDoubles.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/TestingApps.md delete mode 100644 Carthage/Checkouts/Quick/Documentation/zh-cn/Troubleshooting.md delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/.github/ISSUE_TEMPLATE delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/.github/PULL_REQUEST_TEMPLATE delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/.gitignore delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/.hound.yml delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/.swift-version delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/.swiftlint.yml delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/CONTRIBUTING.md delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Dockerfile.test delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Gemfile delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/LICENSE delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Package.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/README.md delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/README.md delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/ExpectationMessage.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/FailureMessage.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Info.plist delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Predicate.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ToSucceed.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Async.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/SourceLocation.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/.swiftlint.yml delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/LinuxMain.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/utils.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Info.plist delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/LinuxSupport.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTests.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainElementSatisfying.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m delete mode 100644 Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m delete mode 100755 Carthage/Checkouts/Quick/Externals/Nimble/script/release delete mode 100755 Carthage/Checkouts/Quick/Externals/Nimble/test delete mode 100644 Carthage/Checkouts/Quick/Gemfile delete mode 100644 Carthage/Checkouts/Quick/Gemfile.lock delete mode 100644 Carthage/Checkouts/Quick/LICENSE delete mode 100644 Carthage/Checkouts/Quick/Package.swift delete mode 100644 Carthage/Checkouts/Quick/Package@swift-4.swift delete mode 100644 Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.h delete mode 100644 Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.m delete mode 100644 Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Swift/___FILEBASENAME___.swift delete mode 100644 Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateIcon.icns delete mode 100755 Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateInfo.plist delete mode 100644 Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m delete mode 100644 Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Swift/___FILEBASENAME___.swift delete mode 100644 Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateIcon.icns delete mode 100755 Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateInfo.plist delete mode 100644 Carthage/Checkouts/Quick/Quick.podspec delete mode 100644 Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj delete mode 100644 Carthage/Checkouts/Quick/Quick.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-iOS.xcscheme delete mode 100644 Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme delete mode 100644 Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-tvOS.xcscheme delete mode 100644 Carthage/Checkouts/Quick/Quick.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/Quick/README.md delete mode 100644 Carthage/Checkouts/Quick/Rakefile delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Behavior.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/DSL/DSL.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/ErrorUtility.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Example.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/ExampleGroup.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Filter.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Hooks/Closures.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Hooks/ExampleHooks.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Hooks/HooksPhase.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Hooks/SuiteHooks.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/Info.plist delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/QuickMain.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/QuickTestSuite.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/URL+FileName.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/Quick/World.swift delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.h delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.h delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Quick.h delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.h delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/World.h delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickSpecBase/QuickSpecBase.m delete mode 100644 Carthage/Checkouts/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h delete mode 100644 Carthage/Checkouts/Quick/Tests/LinuxMain.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/Info.plist delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/Info.plist delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/SpecRunner.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/TestRun.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/XCTestCaseProvider.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_BehaviorTests_Behaviors.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_SharedExamplesTests_SharedExamples.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BehaviorTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BundleModuleNameTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEach.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEach.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/CrossReferencingSpecs.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/AfterEachTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeEachTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeSuiteTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureUsingXCTAssertTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/ItTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/PendingTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamples+BeforeEachTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamplesTests+ObjC.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.h delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.h delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.h delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.m delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Info.plist delete mode 100644 Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/QuickConfigurationTests.m delete mode 100755 Carthage/Checkouts/Quick/script/release delete mode 100755 Carthage/Checkouts/Quick/script/travis-install-linux delete mode 100755 Carthage/Checkouts/Quick/script/travis-install-macos delete mode 100755 Carthage/Checkouts/Quick/script/travis-script-linux delete mode 100755 Carthage/Checkouts/Quick/script/travis-script-macos delete mode 100644 Carthage/Checkouts/Swinject/.Package.test.swift delete mode 100644 Carthage/Checkouts/Swinject/.gitignore delete mode 100644 Carthage/Checkouts/Swinject/.gitmodules delete mode 100644 Carthage/Checkouts/Swinject/.hound.yml delete mode 100644 Carthage/Checkouts/Swinject/.swift-version delete mode 100644 Carthage/Checkouts/Swinject/.swiftlint.yml delete mode 100644 Carthage/Checkouts/Swinject/.travis.yml delete mode 100644 Carthage/Checkouts/Swinject/Assets/SwinjectIcon.sketch delete mode 100644 Carthage/Checkouts/Swinject/CHANGELOG.md delete mode 100644 Carthage/Checkouts/Swinject/CONTRIBUTING.md delete mode 100644 Carthage/Checkouts/Swinject/Cartfile.private delete mode 100644 Carthage/Checkouts/Swinject/Cartfile.resolved delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.gitignore delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.swift-version delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.travis.yml delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/CONTRIBUTING.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Gemfile delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Gemfile.lock delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/LICENSE.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.podspec delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.pbxproj delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Package.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/.gitignore delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/DSL+Wait.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/DSL.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Expectation.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Expression.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/FailureMessage.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AllPass.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeEmpty.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThan.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLogical.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeNil.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeVoid.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeginWith.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Contain.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/EndWith.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Equal.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/HaveCount.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Match.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatchError.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/RaisesException.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowError.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Nimble.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Async.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Errors.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Functional.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/SourceLocation.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Stringers.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/LinuxMain.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/AsynchronousTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/utils.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/LinuxSupport.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/SynchronousTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/UserDescriptionTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/script/release delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/test delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.Package.test.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.github/PULL_REQUEST_TEMPLATE delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.gitignore delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.gitmodules delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.hound.yml delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.swift-version delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.swiftlint.yml delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.travis.yml delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/CODE_OF_CONDUCT.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/CONTRIBUTING.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/ArrangeActAssert.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/BehavioralTesting.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/ConfiguringQuick.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/InstallingFileTemplates.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/MoreResources.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/NimbleAssertions.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/QuickExamplesAndGroups.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/QuickInObjectiveC.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/SettingUpYourXcodeProject.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/SharedExamples.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/TestUsingTestDoubles.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/TestingApps.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/Troubleshooting.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/ArrangeActAssert.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/BehavioralTesting.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/ConfiguringQuick.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/InstallingFileTemplates.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/MoreResources.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/NimbleAssertions.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/QuickExamplesAndGroups.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/QuickInObjectiveC.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/SettingUpYourXcodeProject.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/TestUsingTestDoubles.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/TestingApps.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/Troubleshooting.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/pt-br/BehavioralTesting.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/pt-br/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/ArrangeActAssert.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/BehavioralTesting.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/ConfiguringQuick.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingFileTemplates.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/MoreResources.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/NimbleAssertions.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickExamplesAndGroups.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickInObjectiveC.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/SettingUpYourXcodeProject.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/TestUsingTestDoubles.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/TestingApps.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/Troubleshooting.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.gitignore delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/CONTRIBUTING.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/LICENSE.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Package.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/.gitignore delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/FailureMessage.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Async.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/SourceLocation.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/LinuxMain.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/utils.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/LinuxSupport.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/script/release delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/test delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Gemfile delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Gemfile.lock delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/LICENSE delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Package.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Swift/___FILEBASENAME___.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateIcon.icns delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateInfo.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Swift/___FILEBASENAME___.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateIcon.icns delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateInfo.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.podspec delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-iOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-tvOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/README.md delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Rakefile delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/DSL/DSL.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ErrorUtility.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Example.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ExampleGroup.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/Closures.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/ExampleHooks.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/HooksPhase.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/SuiteHooks.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickMain.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickTestSuite.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/URL+FileName.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/World.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Quick.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/World.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/LinuxMain.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/SpecRunner.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/TestRun.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/XCTestCaseProvider.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_SharedExamplesTests_SharedExamples.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEach.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEach.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/CrossReferencingSpecs.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/AfterEachTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeEachTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeSuiteTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureUsingXCTAssertTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/ItTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/PendingTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamples+BeforeEachTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamplesTests+ObjC.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.h delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.m delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/QuickConfigurationTests.m delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/release delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-install-linux delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-install-macos delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-script-linux delete mode 100755 Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-script-macos delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/.gitignore delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Common.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Debug.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Test.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/README.md delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Base/Common.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Debug.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Profile.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Release.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Test.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Base/Targets/Application.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Base/Targets/Framework.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Base/Targets/StaticLibrary.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Application.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Base.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-DynamicLibrary.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Framework.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-StaticLibrary.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Application.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Base.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Framework.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/iOS/iOS-StaticLibrary.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Application.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Base.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Framework.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-StaticLibrary.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Application.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Base.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Framework.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-StaticLibrary.xcconfig delete mode 100644 Carthage/Checkouts/Swinject/Documentation/Assembler.md delete mode 100644 Carthage/Checkouts/Swinject/Documentation/Assets/AnimalViewControllerScreenshot1.png delete mode 100644 Carthage/Checkouts/Swinject/Documentation/Assets/AnimalViewControllerScreenshot2.png delete mode 100644 Carthage/Checkouts/Swinject/Documentation/CircularDependencies.md delete mode 100644 Carthage/Checkouts/Swinject/Documentation/ContainerHierarchy.md delete mode 100644 Carthage/Checkouts/Swinject/Documentation/DIContainer.md delete mode 100644 Carthage/Checkouts/Swinject/Documentation/InjectionPatterns.md delete mode 100644 Carthage/Checkouts/Swinject/Documentation/Misc.md delete mode 100644 Carthage/Checkouts/Swinject/Documentation/ObjectScopes.md delete mode 100644 Carthage/Checkouts/Swinject/Documentation/README.md delete mode 100644 Carthage/Checkouts/Swinject/Documentation/ThreadSafety.md delete mode 100644 Carthage/Checkouts/Swinject/LICENSE.txt delete mode 100644 Carthage/Checkouts/Swinject/Package.swift delete mode 100644 Carthage/Checkouts/Swinject/README.md delete mode 100644 Carthage/Checkouts/Swinject/Sample-iOS.playground/Contents.swift delete mode 100644 Carthage/Checkouts/Swinject/Sample-iOS.playground/contents.xcplayground delete mode 100644 Carthage/Checkouts/Swinject/Sources/Assembler.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/Assembly.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/Container.Arguments.erb delete mode 100644 Carthage/Checkouts/Swinject/Sources/Container.Arguments.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/Container.Logging.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/Container.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/DebugHelper.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/FunctionType.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Sources/InstanceStorage.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/ObjectScope.Standard.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/ObjectScope.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/Resolver.erb delete mode 100644 Carthage/Checkouts/Swinject/Sources/Resolver.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/ServiceEntry.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/ServiceKey.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/SpinLock.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/Swinject.h delete mode 100644 Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.Arguments.erb delete mode 100644 Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.Arguments.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/UnavailableItems.swift delete mode 100644 Carthage/Checkouts/Swinject/Sources/_Resolver.swift delete mode 100644 Carthage/Checkouts/Swinject/Swinject.podspec delete mode 100644 Carthage/Checkouts/Swinject/Swinject.xcodeproj/project.pbxproj delete mode 100644 Carthage/Checkouts/Swinject/Swinject.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-OSX.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-iOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-tvOS.xcscheme delete mode 100644 Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-watchOS.xcscheme delete mode 100755 Carthage/Checkouts/Swinject/Tests/LinuxMain.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/Animal.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/AssemblerSpec.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/BasicAssembly.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/Circularity.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.Arguments.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.Circularity.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.CustomScope.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.CustomStringConvertible.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.DebugHelper.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/Food.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/Info.plist delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/LoadAwareAssembly.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/Person.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/ServiceEntrySpec.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/ServiceKeySpec.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/SynchronizedResolverSpec.swift delete mode 100644 Carthage/Checkouts/Swinject/Tests/SwinjectTests/WeakStorageSpec.swift delete mode 100755 Carthage/Checkouts/Swinject/script/gencode delete mode 100644 Carthage/Checkouts/xcconfigs/.gitignore delete mode 100644 Carthage/Checkouts/xcconfigs/Base/Configurations/Profile.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/Base/Configurations/Release.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/Base/Targets/Application.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/Base/Targets/Framework.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/Base/Targets/StaticLibrary.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Application.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Base.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/Mac OS X/Mac-DynamicLibrary.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Framework.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/Mac OS X/Mac-StaticLibrary.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/README.md delete mode 100644 Carthage/Checkouts/xcconfigs/iOS/iOS-Application.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/iOS/iOS-Base.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/iOS/iOS-Framework.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/iOS/iOS-StaticLibrary.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/tvOS/tvOS-Application.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/tvOS/tvOS-Base.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/tvOS/tvOS-Framework.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/tvOS/tvOS-StaticLibrary.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/watchOS/watchOS-Application.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/watchOS/watchOS-Base.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/watchOS/watchOS-Framework.xcconfig delete mode 100644 Carthage/Checkouts/xcconfigs/watchOS/watchOS-StaticLibrary.xcconfig rename {Carthage/Checkouts/xcconfigs => Configurations}/Base/Common.xcconfig (94%) rename {Carthage/Checkouts/xcconfigs => Configurations}/Base/Configurations/Debug.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Base/Configurations/Profile.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Base/Configurations/Release.xcconfig (100%) rename {Carthage/Checkouts/xcconfigs => Configurations}/Base/Configurations/Test.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Base/Targets/Application.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Base/Targets/Framework.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Base/Targets/StaticLibrary.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Mac OS X/Mac-Application.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Mac OS X/Mac-Base.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Mac OS X/Mac-DynamicLibrary.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Mac OS X/Mac-Framework.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/Mac OS X/Mac-StaticLibrary.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/iOS/iOS-Application.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/iOS/iOS-Base.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/iOS/iOS-Framework.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/iOS/iOS-StaticLibrary.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/tvOS/tvOS-Application.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/tvOS/tvOS-Base.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/tvOS/tvOS-Framework.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/tvOS/tvOS-StaticLibrary.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/watchOS/watchOS-Application.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/watchOS/watchOS-Base.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/watchOS/watchOS-Framework.xcconfig (100%) rename {Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs => Configurations}/watchOS/watchOS-StaticLibrary.xcconfig (100%) diff --git a/.gitignore b/.gitignore index c083b4f..09d94a9 100644 --- a/.gitignore +++ b/.gitignore @@ -48,7 +48,7 @@ Packages/ # Carthage # # Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts +Carthage/Checkouts Carthage/Build diff --git a/.travis.yml b/.travis.yml index 66bc374..4f272ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,10 @@ matrix: - env: JOB="XCODE" DEST="OS=2.2,name=Apple Watch - 42mm" SCHEME="SwinjectAutoregistration-watchOS" SDK="watchsimulator" ACTION="build" - env: JOB="XCODE" DEST="OS=3.2,name=Apple Watch - 42mm" SCHEME="SwinjectAutoregistration-watchOS" SDK="watchsimulator" ACTION="build" - env: JOB="XCODE" DEST="OS=4.0,name=Apple Watch - 42mm" SCHEME="SwinjectAutoregistration-watchOS" SDK="watchsimulator" ACTION="build" +before_install: + - curl -L -O https://github.com/Carthage/Carthage/releases/download/0.17.2/Carthage.pkg + - sudo installer -pkg Carthage.pkg -target / + - carthage bootstrap --no-use-binaries --no-build script: - set -o pipefail - open -b com.apple.iphonesimulator # Workaround https://github.com/travis-ci/travis-ci/issues/3040 diff --git a/Cartfile.private b/Cartfile.private index a09732f..8f0c9e7 100644 --- a/Cartfile.private +++ b/Cartfile.private @@ -1,3 +1,2 @@ github "Quick/Quick" ~> 1.1 github "Quick/Nimble" ~> 7.0 -github "jspahrsummers/xcconfigs" ~> 0.10 diff --git a/Carthage/Checkouts/Nimble/.github/ISSUE_TEMPLATE b/Carthage/Checkouts/Nimble/.github/ISSUE_TEMPLATE deleted file mode 100644 index 85e591e..0000000 --- a/Carthage/Checkouts/Nimble/.github/ISSUE_TEMPLATE +++ /dev/null @@ -1,36 +0,0 @@ -- [ ] I have read [CONTRIBUTING](https://github.com/Quick/Nimble/blob/master/CONTRIBUTING.md) and have done my best to follow them. - -### What did you do? - -Please replace this with what you did. - -### What did you expect to happen? - -Please replace this with what you expected to happen. - -### What actually happened instead? - -Please replace this with what happened instead. - -### Environment - -List the software versions you're using: - - - Quick: *?.?.?* - - Nimble: *?.?.?* - - Xcode Version: *?.? (????)* (Open Xcode; In menubar: Xcode > About Xcode) - - Swift Version: *?.?* (Open Xcode Preferences; Components > Toolchains. If none, use `Xcode Default`.) - -Please also mention which package manager you used and its version. Delete the -other package managers in this list: - - - Cocoapods: *?.?.?* (Use `pod --version` in Terminal) - - Carthage: *?.?* (Use `carthage version` in Terminal) - - Swift Package Manager *?.?.? (swiftpm-???)* (Use `swift build --version` in Terminal) - -### Project that demonstrates the issue - -Please link to a project we can download that reproduces the issue. Feel free -to delete this section if it's not relevant to the issue (eg - feature request). - -The project should be [short, self-contained, and correct example](http://sscce.org/). diff --git a/Carthage/Checkouts/Nimble/.github/PULL_REQUEST_TEMPLATE b/Carthage/Checkouts/Nimble/.github/PULL_REQUEST_TEMPLATE deleted file mode 100644 index 20e40c8..0000000 --- a/Carthage/Checkouts/Nimble/.github/PULL_REQUEST_TEMPLATE +++ /dev/null @@ -1,14 +0,0 @@ -The PR should summarize what was changed and why. Here are some questions to -help you if you're not sure: - - - What behavior was changed? - - What code was refactored / updated to support this change? - - What issues are related to this PR? Or why was this change introduced? - -Checklist - While not every PR needs it, new features should consider this list: - - - [ ] Does this have tests? - - [ ] Does this have documentation? - - [ ] Does this break the public API (Requires major version bump)? - - [ ] Is this a new feature (Requires minor version bump)? - diff --git a/Carthage/Checkouts/Nimble/.gitignore b/Carthage/Checkouts/Nimble/.gitignore deleted file mode 100644 index e50906d..0000000 --- a/Carthage/Checkouts/Nimble/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -.DS_Store -**/xcuserdata/* -**/*.xccheckout -**/*.xcscmblueprint -build/ -.idea -DerivedData/ -Nimble.framework.zip - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -.build/ diff --git a/Carthage/Checkouts/Nimble/.hound.yml b/Carthage/Checkouts/Nimble/.hound.yml deleted file mode 100644 index b867fd9..0000000 --- a/Carthage/Checkouts/Nimble/.hound.yml +++ /dev/null @@ -1,2 +0,0 @@ -swift: - config_file: .swiftlint.yml diff --git a/Carthage/Checkouts/Nimble/.swift-version b/Carthage/Checkouts/Nimble/.swift-version deleted file mode 100644 index 9f55b2c..0000000 --- a/Carthage/Checkouts/Nimble/.swift-version +++ /dev/null @@ -1 +0,0 @@ -3.0 diff --git a/Carthage/Checkouts/Nimble/.swiftlint.yml b/Carthage/Checkouts/Nimble/.swiftlint.yml deleted file mode 100644 index 489f196..0000000 --- a/Carthage/Checkouts/Nimble/.swiftlint.yml +++ /dev/null @@ -1,19 +0,0 @@ -disabled_rules: - - todo - - variable_name - - force_try - - force_cast - -included: - - Sources - - Tests - -excluded: - - Sources/Lib - -trailing_comma: - mandatory_comma: true - -line_length: - ignores_comments: true - ignores_function_declarations: true diff --git a/Carthage/Checkouts/Nimble/.travis.yml b/Carthage/Checkouts/Nimble/.travis.yml deleted file mode 100644 index 0b64ea7..0000000 --- a/Carthage/Checkouts/Nimble/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -osx_image: xcode8.3 -language: generic -matrix: - include: - - os: osx - sudo: required - env: TYPE=podspec - - os: osx - env: TYPE=ios NIMBLE_RUNTIME_IOS_SDK_VERSION=10.0 - - os: osx - env: TYPE=tvos NIMBLE_RUNTIME_TVOS_SDK_VERSION=10.0 - - os: osx - env: TYPE=macos - - os: osx - env: TYPE=macos - osx_image: xcode9 - - os: osx - env: TYPE=swiftpm - - os: osx - env: TYPE=swiftpm - osx_image: xcode9 - - os: linux - dist: trusty - sudo: required - env: TYPE=swiftpm - install: - - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/9f442512a46d7a2af7b850d65a7e9bd31edfb09b/swiftenv-install.sh)" -install: - - if [[ "$TYPE" == "podspec" ]]; then sudo gem install bundler; bundle install; fi -script: - - ./test $TYPE diff --git a/Carthage/Checkouts/Nimble/CONTRIBUTING.md b/Carthage/Checkouts/Nimble/CONTRIBUTING.md deleted file mode 100644 index d9c4ba6..0000000 --- a/Carthage/Checkouts/Nimble/CONTRIBUTING.md +++ /dev/null @@ -1,120 +0,0 @@ - - - -- [Welcome to Nimble!](#welcome-to-nimble!) - - [Reporting Bugs](#reporting-bugs) - - [Building the Project](#building-the-project) - - [Pull Requests](#pull-requests) - - [Style Conventions](#style-conventions) - - [Core Members](#core-members) - - [Code of Conduct](#code-of-conduct) - - - -# Welcome to Nimble! - -We're building a testing framework for a new generation of Swift and -Objective-C developers. - -Nimble should be easy to use and easy to maintain. Let's keep things -simple and well-tested. - -**tl;dr:** If you've added a file to the project, make sure it's -included in both the OS X and iOS targets. - -## Reporting Bugs - -Nothing is off-limits. If you're having a problem, we want to hear about -it. - -- See a crash? File an issue. -- Code isn't compiling, but you don't know why? Sounds like you should - submit a new issue, bud. -- Went to the kitchen, only to forget why you went in the first place? - Better submit an issue. - -Be sure to include in your issue: - -- Your Xcode version (eg - Xcode 7.0.1 7A1001) -- Your version of Nimble (eg - v2.0.0 or git sha `20a3f3b4e63cc8d97c92c4164bf36f2a2c9a6e1b`) -- What are the steps to reproduce this issue? -- What platform are you using? (eg - OS X, iOS, watchOS, tvOS) -- If the problem is on a UI Testing Bundle, Unit Testing Bundle, or some other target configuration -- Are you using carthage or cocoapods? - -## Building the Project - -- Use `Nimble.xcodeproj` to work on Nimble. - -## Running the Swift Package Manager tests - -1. Install `swiftenv` by running a line from the build script (`.travis.yml`): - - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/02090c7ede5a637b76e6df1710e83cd0bbe7dcdf/swiftenv-install.sh)" - -2. Run `./test swiftpm` - -## Pull Requests - -- Nothing is trivial. Submit pull requests for anything: typos, - whitespace, you name it. -- Not all pull requests will be merged, but all will be acknowledged. If - no one has provided feedback on your request, ping one of the owners - by name. -- Make sure your pull request includes any necessary updates to the - README or other documentation. -- Be sure the unit tests for both the OS X and iOS targets of Nimble - before submitting your pull request. You can run all the OS X & iOS unit - tests using `./test`. -- If you've added a file to the project, make sure it's included in both - the OS X and iOS targets. -- The `master` branch will always support the stable Xcode version. Other - branches will point to their corresponding versions they support. -- If you're making a configuration change, make sure to edit both the xcode - project and the podspec file. - -### Style Conventions - -- Indent using 4 spaces. -- Keep lines 100 characters or shorter. Break long statements into - shorter ones over multiple lines. -- In Objective-C, use `#pragma mark -` to mark public, internal, - protocol, and superclass methods. - -## Core Members - -If a few of your pull requests have been merged, and you'd like a -controlling stake in the project, file an issue asking for write access -to the repository. - -### Code of Conduct - -Your conduct as a core member is your own responsibility, but here are -some "ground rules": - -- Feel free to push whatever you want to master, and (if you have - ownership permissions) to create any repositories you'd like. - - Ideally, however, all changes should be submitted as GitHub pull - requests. No one should merge their own pull request, unless no - other core members respond for at least a few days. - - If you'd like to create a new repository, it'd be nice if you created - a GitHub issue and gathered some feedback first. - -- It'd be awesome if you could review, provide feedback on, and close - issues or pull requests submitted to the project. Please provide kind, - constructive feedback. Please don't be sarcastic or snarky. - -### Creating a Release - -The process is relatively straight forward, but here's is a useful checklist for tagging: - -- Look at changes from the previously tagged release and write release notes: `git log v0.4.0...HEAD` -- Run the release script: `./script/release A.B.C release-notes-file` -- The script will prompt you to create a new [GitHub release](https://github.com/Quick/Nimble/releases). - - Use the same release notes you created for the tag, but tweak up formatting for GitHub. -- Update [Quick](https://github.com/Quick/Quick) - - Update Quick's submodule reference to the newly released Nimble version - - Update Nimble version in `README.md` and Documentation in [Quick](https://github.com/Quick/Quick) if it's not a patch version update. -- Announce! diff --git a/Carthage/Checkouts/Nimble/Dockerfile.test b/Carthage/Checkouts/Nimble/Dockerfile.test deleted file mode 100644 index a995ae2..0000000 --- a/Carthage/Checkouts/Nimble/Dockerfile.test +++ /dev/null @@ -1,3 +0,0 @@ -FROM swift:latest -COPY . . -CMD ./test swiftpm diff --git a/Carthage/Checkouts/Nimble/Gemfile b/Carthage/Checkouts/Nimble/Gemfile deleted file mode 100644 index 0211a92..0000000 --- a/Carthage/Checkouts/Nimble/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -# A sample Gemfile -source "https://rubygems.org" - -gem 'cocoapods', '1.2.0' diff --git a/Carthage/Checkouts/Nimble/Gemfile.lock b/Carthage/Checkouts/Nimble/Gemfile.lock deleted file mode 100644 index edde6bb..0000000 --- a/Carthage/Checkouts/Nimble/Gemfile.lock +++ /dev/null @@ -1,73 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (2.3.5) - activesupport (4.2.8) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - claide (1.0.1) - cocoapods (1.2.0) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.1, < 2.0) - cocoapods-core (= 1.2.0) - cocoapods-deintegrate (>= 1.0.1, < 2.0) - cocoapods-downloader (>= 1.1.3, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.1.2, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored (~> 1.2) - escape (~> 0.0.4) - fourflusher (~> 2.0.1) - gh_inspector (~> 1.0) - molinillo (~> 0.5.5) - nap (~> 1.0) - ruby-macho (~> 0.2.5) - xcodeproj (>= 1.4.1, < 2.0) - cocoapods-core (1.2.0) - activesupport (>= 4.0.2, < 5) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.1) - cocoapods-downloader (1.1.3) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.0.0) - cocoapods-trunk (1.1.2) - nap (>= 0.8, < 2.0) - netrc (= 0.7.8) - cocoapods-try (1.1.0) - colored (1.2) - escape (0.0.4) - fourflusher (2.0.1) - fuzzy_match (2.0.4) - gh_inspector (1.0.3) - i18n (0.8.1) - minitest (5.10.1) - molinillo (0.5.6) - nanaimo (0.2.3) - nap (1.1.0) - netrc (0.7.8) - ruby-macho (0.2.6) - thread_safe (0.3.6) - tzinfo (1.2.2) - thread_safe (~> 0.1) - xcodeproj (1.4.2) - CFPropertyList (~> 2.3.3) - activesupport (>= 3) - claide (>= 1.0.1, < 2.0) - colored (~> 1.2) - nanaimo (~> 0.2.3) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods (= 1.2.0) - -BUNDLED WITH - 1.14.5 diff --git a/Carthage/Checkouts/Nimble/LICENSE b/Carthage/Checkouts/Nimble/LICENSE deleted file mode 100644 index 82b84bf..0000000 --- a/Carthage/Checkouts/Nimble/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 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. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Carthage/Checkouts/Nimble/Nimble.podspec b/Carthage/Checkouts/Nimble/Nimble.podspec deleted file mode 100644 index 682d287..0000000 --- a/Carthage/Checkouts/Nimble/Nimble.podspec +++ /dev/null @@ -1,50 +0,0 @@ -Pod::Spec.new do |s| - s.name = "Nimble" - s.version = "7.0.2" - s.summary = "A Matcher Framework for Swift and Objective-C" - s.description = <<-DESC - Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by Cedar. - DESC - s.homepage = "https://github.com/Quick/Nimble" - s.license = { :type => "Apache 2.0", :file => "LICENSE" } - s.author = "Quick Contributors" - s.ios.deployment_target = "8.0" - s.osx.deployment_target = "10.10" - s.tvos.deployment_target = "9.0" - s.source = { :git => "https://github.com/Quick/Nimble.git", - :tag => "v#{s.version}" } - - s.source_files = "Sources/**/*.{swift,h,m,c}" - - s.osx.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPosix.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h", - ] - s.ios.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h", - ] - s.tvos.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift", - "Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift", - "Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m", - "Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h", - ] - - s.private_header_files = "Sources/NimbleObjectiveC/CurrentTestCaseTracker.h" - - s.exclude_files = "Sources/Nimble/Adapters/NonObjectiveC/*.swift" - s.weak_framework = "XCTest" - s.requires_arc = true - s.compiler_flags = '-DPRODUCT_NAME=Nimble/Nimble' - s.pod_target_xcconfig = { - 'ENABLE_BITCODE' => 'NO', - 'OTHER_LDFLAGS' => '-weak-lswiftXCTest', - 'OTHER_SWIFT_FLAGS' => '$(inherited) -suppress-warnings', - 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks"', - } -end diff --git a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.pbxproj b/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.pbxproj deleted file mode 100644 index dd11b16..0000000 --- a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2305 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXAggregateTarget section */ - A8F2B2541E79A4AB005BDD17 /* SwiftLint */ = { - isa = PBXAggregateTarget; - buildConfigurationList = A8F2B2571E79A4AC005BDD17 /* Build configuration list for PBXAggregateTarget "SwiftLint" */; - buildPhases = ( - A8F2B2581E79A4B0005BDD17 /* ShellScript */, - ); - dependencies = ( - ); - name = SwiftLint; - productName = SwiftLint; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 1F0648CC19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F0648CD19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F0648D41963AAB2001F9C46 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F0648D51963AAB2001F9C46 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F12BE941E778F70006952EC /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */; }; - 1F12BE951E778F70006952EC /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BE981E778F70006952EC /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8B1E778F70006952EC /* CwlBadInstructionException.swift */; }; - 1F12BE991E778F70006952EC /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8C1E778F70006952EC /* CwlCatchBadInstruction.swift */; }; - 1F12BE9B1E778F70006952EC /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8E1E778F70006952EC /* CwlDarwinDefinitions.swift */; }; - 1F12BE9D1E778F70006952EC /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE911E778F70006952EC /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BE9F1E778F8F006952EC /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */; }; - 1F12BEA01E778F90006952EC /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */; }; - 1F12BEA11E778FA9006952EC /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEA21E778FBA006952EC /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE881E778F70006952EC /* mach_excServer.c */; }; - 1F12BEA31E778FFA006952EC /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE911E778F70006952EC /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEA41E77900A006952EC /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8B1E778F70006952EC /* CwlBadInstructionException.swift */; }; - 1F12BEA51E77900A006952EC /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8C1E778F70006952EC /* CwlCatchBadInstruction.swift */; }; - 1F12BEA61E779012006952EC /* CwlCatchBadInstructionPOSIX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8D1E778F70006952EC /* CwlCatchBadInstructionPOSIX.swift */; }; - 1F12BEA71E779018006952EC /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8E1E778F70006952EC /* CwlDarwinDefinitions.swift */; }; - 1F12BEA81E77902A006952EC /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE931E778F70006952EC /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEDC1E7791B9006952EC /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BED71E7791B9006952EC /* CwlCatchException.swift */; }; - 1F12BEDD1E7791B9006952EC /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BED71E7791B9006952EC /* CwlCatchException.swift */; }; - 1F12BEDF1E7791B9006952EC /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BED91E7791B9006952EC /* CwlCatchException.m */; }; - 1F12BEE01E7791B9006952EC /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BED91E7791B9006952EC /* CwlCatchException.m */; }; - 1F12BEE21E7791B9006952EC /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BEDB1E7791B9006952EC /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEE31E7791B9006952EC /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BEDB1E7791B9006952EC /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEE91E779784006952EC /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE881E778F70006952EC /* mach_excServer.c */; }; - 1F12BEEA1E77ABE3006952EC /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */; }; - 1F14FB64194180C5009F2A08 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F1871C51CA89EDB00A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871C61CA89EDB00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871C71CA89EDB00A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871C81CA89EDB00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871C91CA89EDB00A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871CA1CA89EDB00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871CB1CA89EDB00A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871CC1CA89EDB00A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871D21CA89EEE00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871D31CA89EEE00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871D41CA89EEE00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871D61CA89EEF00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871D71CA89EEF00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871D81CA89EEF00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871D91CA89EF100A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871DA1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871DB1CA89EF100A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871DC1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871DD1CA89EF500A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871DE1CA89EF500A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871DF1CA89EF500A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E01CA89EF600A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E11CA89EF600A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E21CA89EF600A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E41CA89FB600A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E61CA89FCD00A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1871E71CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E81CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E91CA8A18700A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1871EB1CA8A18800A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1A742F1940169200FFFC47 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1A74351940169200FFFC47 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F1A74291940169200FFFC47 /* Nimble.framework */; }; - 1F1B5AD41963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F299EAC19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F43728C1A1B343C00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F43728E1A1B343F00EB80F8 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F43728F1A1B344000EB80F8 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F4999A61DBF2DD100BF8877 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F4A56661A3B305F009E1637 /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - 1F4A56671A3B305F009E1637 /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - 1F4A566A1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - 1F4A566B1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - 1F4A566D1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - 1F4A566E1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - 1F4A56701A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - 1F4A56711A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - 1F4A56731A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - 1F4A56741A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - 1F4A56761A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - 1F4A56771A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - 1F4A56791A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - 1F4A567A1A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - 1F4A567C1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - 1F4A567D1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - 1F4A567F1A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - 1F4A56801A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - 1F4A56821A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - 1F4A56831A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - 1F4A56851A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - 1F4A56861A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - 1F4A56881A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - 1F4A56891A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - 1F4A568B1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - 1F4A568C1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - 1F4A568E1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - 1F4A568F1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - 1F4A56911A3B344A009E1637 /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - 1F4A56921A3B344A009E1637 /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - 1F4A56941A3B346F009E1637 /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - 1F4A56951A3B346F009E1637 /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - 1F4A56971A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - 1F4A56981A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - 1F4A569A1A3B3539009E1637 /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - 1F4A569B1A3B3539009E1637 /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - 1F4A569D1A3B3565009E1637 /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - 1F4A569E1A3B3565009E1637 /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - 1F4A56A01A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - 1F4A56A11A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - 1F4BB8B61DACA0E30048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8B71DACA0E40048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8B81DACAACF0048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F5DF15F1BDCA0CE00C3A531 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */; }; - 1F5DF16C1BDCA0F500C3A531 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1F5DF16D1BDCA0F500C3A531 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1F5DF16E1BDCA0F500C3A531 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1F5DF16F1BDCA0F500C3A531 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1F5DF1701BDCA0F500C3A531 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1F5DF1711BDCA0F500C3A531 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - 1F5DF1721BDCA0F500C3A531 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1F5DF1741BDCA0F500C3A531 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1F5DF1751BDCA0F500C3A531 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1F5DF1761BDCA0F500C3A531 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - 1F5DF1771BDCA0F500C3A531 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1F5DF1781BDCA0F500C3A531 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1F5DF1791BDCA0F500C3A531 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1F5DF17A1BDCA0F500C3A531 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1F5DF17B1BDCA0F500C3A531 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1F5DF17C1BDCA0F500C3A531 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1F5DF17D1BDCA0F500C3A531 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1F5DF17E1BDCA0F500C3A531 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1F5DF17F1BDCA0F500C3A531 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1F5DF1801BDCA0F500C3A531 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1F5DF1811BDCA0F500C3A531 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1F5DF1821BDCA0F500C3A531 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1F5DF1831BDCA0F500C3A531 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1F5DF1841BDCA0F500C3A531 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1F5DF1851BDCA0F500C3A531 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1F5DF1861BDCA0F500C3A531 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - 1F5DF1891BDCA0F500C3A531 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F5DF18C1BDCA0F500C3A531 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F5DF18E1BDCA0F500C3A531 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F5DF1921BDCA10200C3A531 /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F5DF1931BDCA10200C3A531 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F5DF1941BDCA10200C3A531 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - 1F5DF1951BDCA10200C3A531 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F5DF1961BDCA10200C3A531 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F5DF1971BDCA10200C3A531 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - 1F5DF1981BDCA10200C3A531 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F5DF1991BDCA10200C3A531 /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F5DF19A1BDCA10200C3A531 /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F5DF19B1BDCA10200C3A531 /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F5DF19C1BDCA10200C3A531 /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F5DF19D1BDCA10200C3A531 /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F5DF19E1BDCA10200C3A531 /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F5DF19F1BDCA10200C3A531 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - 1F5DF1A01BDCA10200C3A531 /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1F5DF1A11BDCA10200C3A531 /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F5DF1A21BDCA10200C3A531 /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F5DF1A31BDCA10200C3A531 /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F5DF1A41BDCA10200C3A531 /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F5DF1A51BDCA10200C3A531 /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F5DF1A61BDCA10200C3A531 /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F5DF1A71BDCA10200C3A531 /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F5DF1A81BDCA10200C3A531 /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 1F5DF1A91BDCA10200C3A531 /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - 1F5DF1AA1BDCA10200C3A531 /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F5DF1AB1BDCA10200C3A531 /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 1F8A37B01B7C5042001C8357 /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - 1F8A37B11B7C5042001C8357 /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - 1F91DD2D1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD2E1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD2F1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD311C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F91DD321C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F91DD331C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F925EB8195C0D6300ED456B /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F925EAD195C0D6300ED456B /* Nimble.framework */; }; - 1F925EC7195C0DD100ED456B /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F925EE2195C0DFD00ED456B /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F925EE6195C121200ED456B /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F925EE7195C121200ED456B /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F925EE9195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F925EEA195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F925EEC195C12C800ED456B /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F925EED195C12C800ED456B /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F925EEF195C136500ED456B /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F925EF0195C136500ED456B /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F925EF6195C147800ED456B /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F925EF7195C147800ED456B /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F925EF9195C175000ED456B /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F925EFA195C175000ED456B /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F925EFC195C186800ED456B /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F925EFD195C186800ED456B /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F925EFF195C187600ED456B /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F925F00195C187600ED456B /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F925F02195C189500ED456B /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F925F03195C189500ED456B /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F925F05195C18B700ED456B /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F925F06195C18B700ED456B /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F925F08195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F925F09195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F925F0B195C18E100ED456B /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F925F0C195C18E100ED456B /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F925F0E195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F925F0F195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F925F11195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F925F12195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F9DB8FB1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - 1F9DB8FC1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - 1FA0C3FF1E30B14500623165 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA0C3FE1E30B14500623165 /* Predicate.swift */; }; - 1FA0C4001E30B14500623165 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA0C3FE1E30B14500623165 /* Predicate.swift */; }; - 1FA0C4011E30B14500623165 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA0C3FE1E30B14500623165 /* Predicate.swift */; }; - 1FB90098195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1FB90099195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1FC494AA1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FC494AB1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FC494AC1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FCF914F1C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91501C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91511C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FCF91551C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1FD8CD2F1968AB07008ED995 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1FD8CD301968AB07008ED995 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1FD8CD311968AB07008ED995 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1FD8CD321968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1FD8CD331968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1FD8CD341968AB07008ED995 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1FD8CD351968AB07008ED995 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1FD8CD361968AB07008ED995 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1FD8CD371968AB07008ED995 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1FD8CD381968AB07008ED995 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1FD8CD391968AB07008ED995 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1FD8CD3A1968AB07008ED995 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1FD8CD3B1968AB07008ED995 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1FD8CD3C1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1FD8CD3D1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1FD8CD3E1968AB07008ED995 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1FD8CD3F1968AB07008ED995 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1FD8CD401968AB07008ED995 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1FD8CD411968AB07008ED995 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1FD8CD421968AB07008ED995 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1FD8CD431968AB07008ED995 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1FD8CD441968AB07008ED995 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1FD8CD451968AB07008ED995 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1FD8CD461968AB07008ED995 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1FD8CD471968AB07008ED995 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1FD8CD481968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1FD8CD491968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1FD8CD4A1968AB07008ED995 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1FD8CD4B1968AB07008ED995 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1FD8CD4C1968AB07008ED995 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1FD8CD4D1968AB07008ED995 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1FD8CD4E1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1FD8CD4F1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1FD8CD501968AB07008ED995 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1FD8CD511968AB07008ED995 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1FD8CD521968AB07008ED995 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1FD8CD531968AB07008ED995 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1FD8CD561968AB07008ED995 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1FD8CD571968AB07008ED995 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1FD8CD581968AB07008ED995 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1FD8CD591968AB07008ED995 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1FD8CD5A1968AB07008ED995 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1FD8CD5B1968AB07008ED995 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1FD8CD5E1968AB07008ED995 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1FD8CD5F1968AB07008ED995 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1FD8CD6A1968AB07008ED995 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1FD8CD6B1968AB07008ED995 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1FDBD8671AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1FDBD8681AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1FE661571E6574E30035F243 /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE661561E6574E20035F243 /* ExpectationMessage.swift */; }; - 1FE661581E6574E30035F243 /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE661561E6574E20035F243 /* ExpectationMessage.swift */; }; - 1FE661591E6574E30035F243 /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE661561E6574E20035F243 /* ExpectationMessage.swift */; }; - 29EA59631B551ED2002D767E /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 29EA59641B551ED2002D767E /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 472FD1351B9E085700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 472FD1391B9E0A9700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 472FD13A1B9E0A9F00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 472FD13B1B9E0CFE00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 4793854D1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - 4793854E1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - 6CAEDD0A1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 6CAEDD0B1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 6CAEDD0C1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 7A0A26231E7F52360092A34E /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0A26221E7F52360092A34E /* ToSucceed.swift */; }; - 7A6AB2C21E7F547E00A2F694 /* ToSucceedTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */; }; - 7A6AB2C31E7F547E00A2F694 /* ToSucceedTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */; }; - 7A6AB2C41E7F547E00A2F694 /* ToSucceedTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */; }; - 7A6AB2C51E7F628900A2F694 /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0A26221E7F52360092A34E /* ToSucceed.swift */; }; - 7A6AB2C61E7F628A00A2F694 /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0A26221E7F52360092A34E /* ToSucceed.swift */; }; - 7B13BA061DD360AA00C9098C /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */; }; - 7B13BA0B1DD361D200C9098C /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */; }; - 7B13BA0C1DD361D300C9098C /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */; }; - 7B13BA0D1DD361DE00C9098C /* ContainElementSatisfyingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */; }; - 7B13BA0E1DD361DF00C9098C /* ContainElementSatisfyingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */; }; - 7B13BA0F1DD361DF00C9098C /* ContainElementSatisfyingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */; }; - 7B13BA101DD361EA00C9098C /* ObjCContainElementSatisfying.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */; }; - 7B13BA111DD361EB00C9098C /* ObjCContainElementSatisfying.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */; }; - 7B13BA121DD361EB00C9098C /* ObjCContainElementSatisfying.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */; }; - 7B5358BA1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BB1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BC1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BE1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 7B5358BF1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 7B5358C01C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 964CFEFD1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 964CFEFE1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 964CFEFF1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 965B0D091B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - 965B0D0A1B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - 965B0D0C1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - 965B0D0D1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - AE4BA9AD1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE4BA9AE1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE4BA9AF1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE7ADE451C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE461C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE471C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE491C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - AE7ADE4A1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - AE7ADE4B1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - CD79C9A01D2CC839004B6F9A /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - CD79C9A11D2CC83B004B6F9A /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - CD79C9A21D2CC83E004B6F9A /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - CD79C9A31D2CC841004B6F9A /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - CD79C9A41D2CC848004B6F9A /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - CD79C9A51D2CC848004B6F9A /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - CD79C9A61D2CC848004B6F9A /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - CD79C9A71D2CC848004B6F9A /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - CD79C9A81D2CC848004B6F9A /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - CD79C9A91D2CC848004B6F9A /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - CD79C9AA1D2CC848004B6F9A /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - CD79C9AB1D2CC848004B6F9A /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - CD79C9AC1D2CC848004B6F9A /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - CD79C9AD1D2CC848004B6F9A /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - CD79C9AE1D2CC848004B6F9A /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - CD79C9AF1D2CC848004B6F9A /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - CD79C9B01D2CC848004B6F9A /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - CD79C9B11D2CC848004B6F9A /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - CD79C9B21D2CC848004B6F9A /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - CD79C9B31D2CC848004B6F9A /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - CD79C9B41D2CC848004B6F9A /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - CD79C9B51D2CC848004B6F9A /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - CD79C9B61D2CC848004B6F9A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - CD79C9B71D2CC848004B6F9A /* ObjCSatisfyAnyOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */; }; - CDD80B831F2030790002CD65 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - CDD80B841F20307A0002CD65 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - CDD80B851F20307B0002CD65 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - DA9E8C821A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - DA9E8C831A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - DD72EC641A93874A002F7651 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - DD72EC651A93874A002F7651 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - DD9A9A8F19CF439B00706F49 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - DD9A9A9019CF43AD00706F49 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - DDB1BC791A92235600F743C3 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - DDB1BC7A1A92235600F743C3 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - DDB4D5ED19FE43C200E9D9FE /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - DDB4D5F019FE442800E9D9FE /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - DDB4D5F119FE442800E9D9FE /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - DDEFAEB41A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - DDEFAEB51A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - F8A1BE2F1CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; - F8A1BE301CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; - F8A1BE311CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1F1A74361940169200FFFC47 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = "Nimble-iOS"; - }; - 1F5DF1601BDCA0CE00C3A531 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F5DF1541BDCA0CE00C3A531; - remoteInfo = "Nimble-tvOS"; - }; - 1F6BB82A1968BFF9009F1DBB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = "Nimble-iOS"; - }; - 1F925EA4195C0C8500ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = Nimble; - }; - 1F925EA6195C0C8500ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = Nimble; - }; - 1F925EB9195C0D6300ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-macOS"; - }; - 1F9B7BFD1968AD760094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-macOS"; - }; - 1F9B7BFF1968AD760094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-macOS"; - }; - 1F9B7C011968AD820094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-macOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectWithLazyProperty.swift; sourceTree = ""; }; - 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronousTests.swift; sourceTree = ""; }; - 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CwlMachBadInstructionHandler.m; sourceTree = ""; }; - 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlMachBadInstructionHandler.h; sourceTree = ""; }; - 1F12BE881E778F70006952EC /* mach_excServer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mach_excServer.c; sourceTree = ""; }; - 1F12BE891E778F70006952EC /* mach_excServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mach_excServer.h; sourceTree = ""; }; - 1F12BE8B1E778F70006952EC /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlBadInstructionException.swift; sourceTree = ""; }; - 1F12BE8C1E778F70006952EC /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchBadInstruction.swift; sourceTree = ""; }; - 1F12BE8D1E778F70006952EC /* CwlCatchBadInstructionPOSIX.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchBadInstructionPOSIX.swift; sourceTree = ""; }; - 1F12BE8E1E778F70006952EC /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlDarwinDefinitions.swift; sourceTree = ""; }; - 1F12BE911E778F70006952EC /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlPreconditionTesting.h; sourceTree = ""; }; - 1F12BE931E778F70006952EC /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlPreconditionTesting.h; sourceTree = ""; }; - 1F12BED71E7791B9006952EC /* CwlCatchException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchException.swift; sourceTree = ""; }; - 1F12BED91E7791B9006952EC /* CwlCatchException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CwlCatchException.m; sourceTree = ""; }; - 1F12BEDB1E7791B9006952EC /* CwlCatchException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlCatchException.h; sourceTree = ""; }; - 1F14FB63194180C5009F2A08 /* utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = utils.swift; sourceTree = ""; }; - 1F1871BC1CA89EDB00A34BF2 /* DSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DSL.h; sourceTree = ""; }; - 1F1871BD1CA89EDB00A34BF2 /* DSL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DSL.m; sourceTree = ""; }; - 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMBExceptionCapture.h; sourceTree = ""; }; - 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NMBExceptionCapture.m; sourceTree = ""; }; - 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMBStringify.h; sourceTree = ""; }; - 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NMBStringify.m; sourceTree = ""; }; - 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NMBExpectation.swift; sourceTree = ""; }; - 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NMBObjCMatcher.swift; sourceTree = ""; }; - 1F1871CD1CA89EE000A34BF2 /* ExceptionCapture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExceptionCapture.swift; sourceTree = ""; }; - 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncMatcherWrapper.swift; sourceTree = ""; }; - 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherFunc.swift; sourceTree = ""; }; - 1F1A74291940169200FFFC47 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F1A742D1940169200FFFC47 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F1A742E1940169200FFFC47 /* Nimble.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Nimble.h; sourceTree = ""; }; - 1F1A74341940169200FFFC47 /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F1A743A1940169200FFFC47 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAKindOfTest.swift; sourceTree = ""; }; - 1F2752D119445B8400052A26 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; lineEnding = 0; path = README.md; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.markdown; }; - 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeEmptyTest.swift; sourceTree = ""; }; - 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCAsyncTest.m; sourceTree = ""; }; - 1F4A56681A3B3074009E1637 /* NimbleSpecHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NimbleSpecHelper.h; sourceTree = ""; }; - 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeAnInstanceOfTest.m; sourceTree = ""; }; - 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeKindOfTest.m; sourceTree = ""; }; - 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeCloseToTest.m; sourceTree = ""; }; - 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeginWithTest.m; sourceTree = ""; }; - 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeGreaterThanTest.m; sourceTree = ""; }; - 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeGreaterThanOrEqualToTest.m; sourceTree = ""; }; - 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeIdenticalToTest.m; sourceTree = ""; }; - 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeLessThanTest.m; sourceTree = ""; }; - 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeLessThanOrEqualToTest.m; sourceTree = ""; }; - 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeTruthyTest.m; sourceTree = ""; }; - 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeFalsyTest.m; sourceTree = ""; }; - 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeTrueTest.m; sourceTree = ""; }; - 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeFalseTest.m; sourceTree = ""; }; - 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeNilTest.m; sourceTree = ""; }; - 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCContainTest.m; sourceTree = ""; }; - 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCEndWithTest.m; sourceTree = ""; }; - 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCEqualTest.m; sourceTree = ""; }; - 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCMatchTest.m; sourceTree = ""; }; - 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCRaiseExceptionTest.m; sourceTree = ""; }; - 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowAssertionTest.swift; sourceTree = ""; }; - 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCSyncTest.m; sourceTree = ""; }; - 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeVoidTest.swift; sourceTree = ""; }; - 1F91DD301C74BF61002C309F /* BeVoid.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeVoid.swift; sourceTree = ""; }; - 1F925EAD195C0D6300ED456B /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F925EE5195C121200ED456B /* AsynchronousTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsynchronousTest.swift; sourceTree = ""; }; - 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAnInstanceOfTest.swift; sourceTree = ""; }; - 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RaisesExceptionTest.swift; sourceTree = ""; }; - 1F925EEE195C136500ED456B /* BeLogicalTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLogicalTest.swift; sourceTree = ""; }; - 1F925EF5195C147800ED456B /* BeCloseToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeCloseToTest.swift; sourceTree = ""; }; - 1F925EF8195C175000ED456B /* BeNilTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeNilTest.swift; sourceTree = ""; }; - 1F925EFB195C186800ED456B /* BeginWithTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeginWithTest.swift; sourceTree = ""; }; - 1F925EFE195C187600ED456B /* EndWithTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndWithTest.swift; sourceTree = ""; }; - 1F925F01195C189500ED456B /* ContainTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainTest.swift; sourceTree = ""; }; - 1F925F04195C18B700ED456B /* EqualTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EqualTest.swift; sourceTree = ""; }; - 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThanTest.swift; sourceTree = ""; }; - 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThanTest.swift; sourceTree = ""; }; - 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThanOrEqualToTest.swift; sourceTree = ""; }; - 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThanOrEqualToTest.swift; sourceTree = ""; }; - 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeEmptyTest.m; sourceTree = ""; }; - 1FA0C3FE1E30B14500623165 /* Predicate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Predicate.swift; sourceTree = ""; }; - 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeIdenticalToTest.swift; sourceTree = ""; }; - 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleEnvironment.swift; sourceTree = ""; }; - 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostNotificationTest.swift; sourceTree = ""; }; - 1FCF91521C61C8A400B15DCB /* PostNotification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostNotification.swift; sourceTree = ""; }; - 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionRecorder.swift; sourceTree = ""; }; - 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdapterProtocols.swift; sourceTree = ""; }; - 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleXCTestHandler.swift; sourceTree = ""; }; - 1FD8CD081968AB07008ED995 /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSL.swift; sourceTree = ""; }; - 1FD8CD091968AB07008ED995 /* Expectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expectation.swift; sourceTree = ""; }; - 1FD8CD0A1968AB07008ED995 /* Expression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expression.swift; sourceTree = ""; }; - 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FailureMessage.swift; sourceTree = ""; }; - 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAnInstanceOf.swift; sourceTree = ""; }; - 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeAKindOf.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeCloseTo.swift; sourceTree = ""; }; - 1FD8CD101968AB07008ED995 /* BeEmpty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeEmpty.swift; sourceTree = ""; }; - 1FD8CD111968AB07008ED995 /* BeginWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeginWith.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeGreaterThan.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeGreaterThanOrEqualTo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeIdenticalTo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD151968AB07008ED995 /* BeLessThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLessThan.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLessThanOrEqual.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD171968AB07008ED995 /* BeLogical.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLogical.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD181968AB07008ED995 /* BeNil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeNil.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD1A1968AB07008ED995 /* Contain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Contain.swift; sourceTree = ""; }; - 1FD8CD1B1968AB07008ED995 /* EndWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndWith.swift; sourceTree = ""; }; - 1FD8CD1C1968AB07008ED995 /* Equal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Equal.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherProtocols.swift; sourceTree = ""; }; - 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RaisesException.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD251968AB07008ED995 /* Functional.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Functional.swift; sourceTree = ""; }; - 1FD8CD261968AB07008ED995 /* Async.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Async.swift; sourceTree = ""; }; - 1FD8CD271968AB07008ED995 /* SourceLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SourceLocation.swift; sourceTree = ""; }; - 1FD8CD281968AB07008ED995 /* Stringers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stringers.swift; sourceTree = ""; }; - 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionDispatcher.swift; sourceTree = ""; }; - 1FE661561E6574E20035F243 /* ExpectationMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpectationMessage.swift; sourceTree = ""; }; - 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowErrorTest.swift; sourceTree = ""; }; - 29EA59651B551EE6002D767E /* ThrowError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowError.swift; sourceTree = ""; }; - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestCaseProvider.swift; sourceTree = ""; }; - 472FD1341B9E085700C7B8DA /* HaveCount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCount.swift; sourceTree = ""; }; - 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCountTest.swift; sourceTree = ""; }; - 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCHaveCount.m; sourceTree = ""; }; - 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinuxSupport.swift; sourceTree = ""; }; - 7A0A26221E7F52360092A34E /* ToSucceed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToSucceed.swift; sourceTree = ""; }; - 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToSucceedTest.swift; sourceTree = ""; }; - 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainElementSatisfying.swift; sourceTree = ""; }; - 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCContainElementSatisfying.m; sourceTree = ""; }; - 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainElementSatisfyingTest.swift; sourceTree = ""; }; - 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SatisfyAnyOfTest.swift; sourceTree = ""; }; - 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SatisfyAnyOf.swift; sourceTree = ""; }; - 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCSatisfyAnyOfTest.m; sourceTree = ""; }; - 8DF1C3F61C94FC75004B2D36 /* ObjcStringersTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjcStringersTest.m; sourceTree = ""; }; - 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowAssertion.swift; sourceTree = ""; }; - 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCUserDescriptionTest.m; sourceTree = ""; }; - 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDescriptionTest.swift; sourceTree = ""; }; - AE4BA9AC1C88DDB500B73906 /* Errors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = ""; }; - AE7ADE441C80BF8000B94CD3 /* MatchError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchError.swift; sourceTree = ""; }; - AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchErrorTest.swift; sourceTree = ""; }; - DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DSL+Wait.swift"; sourceTree = ""; }; - DD72EC631A93874A002F7651 /* AllPassTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllPassTest.swift; sourceTree = ""; }; - DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeIdenticalToObjectTest.swift; sourceTree = ""; }; - DDB1BC781A92235600F743C3 /* AllPass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllPass.swift; sourceTree = ""; }; - DDB4D5EC19FE43C200E9D9FE /* Match.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Match.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchTest.swift; sourceTree = ""; }; - DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCAllPassTest.m; sourceTree = ""; }; - F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCTestObservationCenter+Register.m"; sourceTree = ""; }; - F8A1BE321CB3777F00031679 /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CurrentTestCaseTracker.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1F1A74251940169200FFFC47 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74311940169200FFFC47 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F1A74351940169200FFFC47 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1511BDCA0CE00C3A531 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15B1BDCA0CE00C3A531 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F5DF15F1BDCA0CE00C3A531 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EA9195C0D6300ED456B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB4195C0D6300ED456B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F925EB8195C0D6300ED456B /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1F12BE841E778F70006952EC /* CwlMachBadInstructionHandler */ = { - isa = PBXGroup; - children = ( - 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */, - 1F12BE861E778F70006952EC /* include */, - 1F12BE881E778F70006952EC /* mach_excServer.c */, - 1F12BE891E778F70006952EC /* mach_excServer.h */, - ); - path = CwlMachBadInstructionHandler; - sourceTree = ""; - }; - 1F12BE861E778F70006952EC /* include */ = { - isa = PBXGroup; - children = ( - 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */, - ); - path = include; - sourceTree = ""; - }; - 1F12BE8A1E778F70006952EC /* CwlPreconditionTesting */ = { - isa = PBXGroup; - children = ( - 1F12BE8B1E778F70006952EC /* CwlBadInstructionException.swift */, - 1F12BE8C1E778F70006952EC /* CwlCatchBadInstruction.swift */, - 1F12BE8D1E778F70006952EC /* CwlCatchBadInstructionPOSIX.swift */, - 1F12BE8E1E778F70006952EC /* CwlDarwinDefinitions.swift */, - 1F12BE901E778F70006952EC /* Mach */, - 1F12BE921E778F70006952EC /* Posix */, - ); - path = CwlPreconditionTesting; - sourceTree = ""; - }; - 1F12BE901E778F70006952EC /* Mach */ = { - isa = PBXGroup; - children = ( - 1F12BE911E778F70006952EC /* CwlPreconditionTesting.h */, - ); - path = Mach; - sourceTree = ""; - }; - 1F12BE921E778F70006952EC /* Posix */ = { - isa = PBXGroup; - children = ( - 1F12BE931E778F70006952EC /* CwlPreconditionTesting.h */, - ); - path = Posix; - sourceTree = ""; - }; - 1F12BED61E7791B9006952EC /* CwlCatchException */ = { - isa = PBXGroup; - children = ( - 1F12BED71E7791B9006952EC /* CwlCatchException.swift */, - ); - path = CwlCatchException; - sourceTree = ""; - }; - 1F12BED81E7791B9006952EC /* CwlCatchExceptionSupport */ = { - isa = PBXGroup; - children = ( - 1F12BED91E7791B9006952EC /* CwlCatchException.m */, - 1F12BEDA1E7791B9006952EC /* include */, - ); - path = CwlCatchExceptionSupport; - sourceTree = ""; - }; - 1F12BEDA1E7791B9006952EC /* include */ = { - isa = PBXGroup; - children = ( - 1F12BEDB1E7791B9006952EC /* CwlCatchException.h */, - ); - path = include; - sourceTree = ""; - }; - 1F14FB61194180A7009F2A08 /* Helpers */ = { - isa = PBXGroup; - children = ( - 1F14FB63194180C5009F2A08 /* utils.swift */, - 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */, - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 1F1871B91CA89E1B00A34BF2 /* NimbleObjectiveC */ = { - isa = PBXGroup; - children = ( - F8A1BE321CB3777F00031679 /* CurrentTestCaseTracker.h */, - 1F1871BC1CA89EDB00A34BF2 /* DSL.h */, - 1F1871BD1CA89EDB00A34BF2 /* DSL.m */, - 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */, - 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */, - 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */, - 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */, - F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */, - ); - name = NimbleObjectiveC; - path = Sources/NimbleObjectiveC; - sourceTree = ""; - }; - 1F1871BA1CA89E2500A34BF2 /* NonObjectiveC */ = { - isa = PBXGroup; - children = ( - 1F1871CD1CA89EE000A34BF2 /* ExceptionCapture.swift */, - ); - path = NonObjectiveC; - sourceTree = ""; - }; - 1F1A741F1940169200FFFC47 = { - isa = PBXGroup; - children = ( - 1F2752D119445B8400052A26 /* README.md */, - 1F1A742B1940169200FFFC47 /* Nimble */, - 1F1871B91CA89E1B00A34BF2 /* NimbleObjectiveC */, - 1F1A74381940169200FFFC47 /* NimbleTests */, - 9630C0081C6D0AB3000693EE /* Lib */, - 1F1A742A1940169200FFFC47 /* Products */, - ); - indentWidth = 4; - sourceTree = ""; - tabWidth = 4; - usesTabs = 0; - }; - 1F1A742A1940169200FFFC47 /* Products */ = { - isa = PBXGroup; - children = ( - 1F1A74291940169200FFFC47 /* Nimble.framework */, - 1F1A74341940169200FFFC47 /* NimbleTests.xctest */, - 1F925EAD195C0D6300ED456B /* Nimble.framework */, - 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */, - 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */, - 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 1F1A742B1940169200FFFC47 /* Nimble */ = { - isa = PBXGroup; - children = ( - 1FD8CD041968AB07008ED995 /* Adapters */, - 1FD8CD081968AB07008ED995 /* DSL.swift */, - DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */, - 1FD8CD091968AB07008ED995 /* Expectation.swift */, - 1FD8CD0A1968AB07008ED995 /* Expression.swift */, - 1FE661561E6574E20035F243 /* ExpectationMessage.swift */, - 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */, - 1F1A742D1940169200FFFC47 /* Info.plist */, - 1FD8CD0C1968AB07008ED995 /* Matchers */, - 1F1A742E1940169200FFFC47 /* Nimble.h */, - 1FD8CD241968AB07008ED995 /* Utils */, - ); - name = Nimble; - path = Sources/Nimble; - sourceTree = ""; - }; - 1F1A74381940169200FFFC47 /* NimbleTests */ = { - isa = PBXGroup; - children = ( - 1F925EE5195C121200ED456B /* AsynchronousTest.swift */, - 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */, - 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */, - 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */, - 1FFD729A1963FC8200CD29A2 /* objc */, - 1F14FB61194180A7009F2A08 /* Helpers */, - 1F925EE3195C11B000ED456B /* Matchers */, - 1F1A74391940169200FFFC47 /* Supporting Files */, - ); - name = NimbleTests; - path = Tests/NimbleTests; - sourceTree = ""; - }; - 1F1A74391940169200FFFC47 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 1F1A743A1940169200FFFC47 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 1F925EE3195C11B000ED456B /* Matchers */ = { - isa = PBXGroup; - children = ( - DD72EC631A93874A002F7651 /* AllPassTest.swift */, - 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */, - 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */, - 1F925EF5195C147800ED456B /* BeCloseToTest.swift */, - 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */, - 1F925EFB195C186800ED456B /* BeginWithTest.swift */, - 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */, - 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */, - DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */, - 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */, - 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */, - 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */, - 1F925EEE195C136500ED456B /* BeLogicalTest.swift */, - 1F925EF8195C175000ED456B /* BeNilTest.swift */, - 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */, - 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */, - 1F925F01195C189500ED456B /* ContainTest.swift */, - 1F925EFE195C187600ED456B /* EndWithTest.swift */, - 1F925F04195C18B700ED456B /* EqualTest.swift */, - 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */, - DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */, - 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */, - 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */, - 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */, - 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */, - AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */, - 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */, - 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */, - ); - path = Matchers; - sourceTree = ""; - }; - 1FD8CD041968AB07008ED995 /* Adapters */ = { - isa = PBXGroup; - children = ( - 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */, - 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */, - 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */, - 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */, - 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */, - 1F1871BA1CA89E2500A34BF2 /* NonObjectiveC */, - 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */, - 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */, - ); - path = Adapters; - sourceTree = ""; - }; - 1FD8CD0C1968AB07008ED995 /* Matchers */ = { - isa = PBXGroup; - children = ( - DDB1BC781A92235600F743C3 /* AllPass.swift */, - 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */, - 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */, - 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */, - 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */, - 1FD8CD101968AB07008ED995 /* BeEmpty.swift */, - 1FD8CD111968AB07008ED995 /* BeginWith.swift */, - 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */, - 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */, - 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */, - 1FD8CD151968AB07008ED995 /* BeLessThan.swift */, - 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */, - 1FD8CD171968AB07008ED995 /* BeLogical.swift */, - 1FD8CD181968AB07008ED995 /* BeNil.swift */, - 1F91DD301C74BF61002C309F /* BeVoid.swift */, - 1FD8CD1A1968AB07008ED995 /* Contain.swift */, - 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */, - 1FD8CD1B1968AB07008ED995 /* EndWith.swift */, - 1FD8CD1C1968AB07008ED995 /* Equal.swift */, - 472FD1341B9E085700C7B8DA /* HaveCount.swift */, - DDB4D5EC19FE43C200E9D9FE /* Match.swift */, - 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */, - 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */, - AE7ADE441C80BF8000B94CD3 /* MatchError.swift */, - 1FCF91521C61C8A400B15DCB /* PostNotification.swift */, - 1FA0C3FE1E30B14500623165 /* Predicate.swift */, - 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */, - 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */, - 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */, - 29EA59651B551EE6002D767E /* ThrowError.swift */, - 7A0A26221E7F52360092A34E /* ToSucceed.swift */, - ); - path = Matchers; - sourceTree = ""; - }; - 1FD8CD241968AB07008ED995 /* Utils */ = { - isa = PBXGroup; - children = ( - 1FD8CD251968AB07008ED995 /* Functional.swift */, - 1FD8CD261968AB07008ED995 /* Async.swift */, - 1FD8CD271968AB07008ED995 /* SourceLocation.swift */, - 1FD8CD281968AB07008ED995 /* Stringers.swift */, - AE4BA9AC1C88DDB500B73906 /* Errors.swift */, - ); - path = Utils; - sourceTree = ""; - }; - 1FFD729A1963FC8200CD29A2 /* objc */ = { - isa = PBXGroup; - children = ( - 1F4A56681A3B3074009E1637 /* NimbleSpecHelper.h */, - 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */, - 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */, - 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */, - 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */, - 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */, - 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */, - 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */, - 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */, - 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */, - 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */, - 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */, - 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */, - 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */, - 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */, - 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */, - 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */, - 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */, - 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */, - 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */, - 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */, - 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */, - 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */, - 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */, - 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */, - 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */, - DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */, - 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */, - 8DF1C3F61C94FC75004B2D36 /* ObjcStringersTest.m */, - ); - path = objc; - sourceTree = ""; - }; - 9630C0081C6D0AB3000693EE /* Lib */ = { - isa = PBXGroup; - children = ( - 9630C0091C6D0ABA000693EE /* CwlPreconditionTesting */, - ); - name = Lib; - path = Sources/Lib; - sourceTree = ""; - }; - 9630C0091C6D0ABA000693EE /* CwlPreconditionTesting */ = { - isa = PBXGroup; - children = ( - 1F12BED61E7791B9006952EC /* CwlCatchException */, - 1F12BED81E7791B9006952EC /* CwlCatchExceptionSupport */, - 1F12BE841E778F70006952EC /* CwlMachBadInstructionHandler */, - 1F12BE8A1E778F70006952EC /* CwlPreconditionTesting */, - ); - path = CwlPreconditionTesting; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 1F1A74261940169200FFFC47 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F12BEA31E778FFA006952EC /* CwlPreconditionTesting.h in Headers */, - 1F12BEA11E778FA9006952EC /* CwlMachBadInstructionHandler.h in Headers */, - 1F1871C91CA89EDB00A34BF2 /* NMBStringify.h in Headers */, - 1F1871C51CA89EDB00A34BF2 /* DSL.h in Headers */, - 1F1871C71CA89EDB00A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F1A742F1940169200FFFC47 /* Nimble.h in Headers */, - 1F12BEE31E7791B9006952EC /* CwlCatchException.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1521BDCA0CE00C3A531 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F1871E21CA89EF600A34BF2 /* NMBStringify.h in Headers */, - 1F1871E01CA89EF600A34BF2 /* DSL.h in Headers */, - 1F1871E11CA89EF600A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F12BEA81E77902A006952EC /* CwlPreconditionTesting.h in Headers */, - 1F12BEEA1E77ABE3006952EC /* CwlMachBadInstructionHandler.h in Headers */, - 1F4999A61DBF2DD100BF8877 /* Nimble.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EAA195C0D6300ED456B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F12BE951E778F70006952EC /* CwlMachBadInstructionHandler.h in Headers */, - 1F1871DF1CA89EF500A34BF2 /* NMBStringify.h in Headers */, - 1F12BE9D1E778F70006952EC /* CwlPreconditionTesting.h in Headers */, - 1F1871DD1CA89EF500A34BF2 /* DSL.h in Headers */, - 1F1871DE1CA89EF500A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F925EC7195C0DD100ED456B /* Nimble.h in Headers */, - 1F12BEE21E7791B9006952EC /* CwlCatchException.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1F1A74281940169200FFFC47 /* Nimble-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F1A743F1940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOS" */; - buildPhases = ( - 1F1A74241940169200FFFC47 /* Sources */, - 1F1A74251940169200FFFC47 /* Frameworks */, - 1F1A74261940169200FFFC47 /* Headers */, - 1F1A74271940169200FFFC47 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-iOS"; - productName = "Nimble-iOS"; - productReference = 1F1A74291940169200FFFC47 /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F1A74331940169200FFFC47 /* Nimble-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F1A74421940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOSTests" */; - buildPhases = ( - 1F1A74301940169200FFFC47 /* Sources */, - 1F1A74311940169200FFFC47 /* Frameworks */, - 1F1A74321940169200FFFC47 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F1A74371940169200FFFC47 /* PBXTargetDependency */, - 1F925EA5195C0C8500ED456B /* PBXTargetDependency */, - 1F925EA7195C0C8500ED456B /* PBXTargetDependency */, - 1F6BB82B1968BFF9009F1DBB /* PBXTargetDependency */, - ); - name = "Nimble-iOSTests"; - productName = "Nimble-iOSTests"; - productReference = 1F1A74341940169200FFFC47 /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F5DF16A1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOS" */; - buildPhases = ( - 1F5DF1501BDCA0CE00C3A531 /* Sources */, - 1F5DF1511BDCA0CE00C3A531 /* Frameworks */, - 1F5DF1521BDCA0CE00C3A531 /* Headers */, - 1F5DF1531BDCA0CE00C3A531 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-tvOS"; - productName = "Nimble-tvOS"; - productReference = 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F5DF15D1BDCA0CE00C3A531 /* Nimble-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F5DF16B1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOSTests" */; - buildPhases = ( - 1F5DF15A1BDCA0CE00C3A531 /* Sources */, - 1F5DF15B1BDCA0CE00C3A531 /* Frameworks */, - 1F5DF15C1BDCA0CE00C3A531 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F5DF1611BDCA0CE00C3A531 /* PBXTargetDependency */, - ); - name = "Nimble-tvOSTests"; - productName = "Nimble-tvOSTests"; - productReference = 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F925EAC195C0D6300ED456B /* Nimble-macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F925EC0195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOS" */; - buildPhases = ( - 1F925EA8195C0D6300ED456B /* Sources */, - 1F925EA9195C0D6300ED456B /* Frameworks */, - 1F925EAA195C0D6300ED456B /* Headers */, - 1F925EAB195C0D6300ED456B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-macOS"; - productName = "Nimble-macOS"; - productReference = 1F925EAD195C0D6300ED456B /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F925EB6195C0D6300ED456B /* Nimble-macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F925EC3195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOSTests" */; - buildPhases = ( - 1F925EB3195C0D6300ED456B /* Sources */, - 1F925EB4195C0D6300ED456B /* Frameworks */, - 1F925EB5195C0D6300ED456B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F925EBA195C0D6300ED456B /* PBXTargetDependency */, - 1F9B7BFE1968AD760094EB8F /* PBXTargetDependency */, - 1F9B7C001968AD760094EB8F /* PBXTargetDependency */, - 1F9B7C021968AD820094EB8F /* PBXTargetDependency */, - ); - name = "Nimble-macOSTests"; - productName = "Nimble-OSXTests"; - productReference = 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 1F1A74201940169200FFFC47 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0900; - ORGANIZATIONNAME = "Jeff Hui"; - TargetAttributes = { - 1F1A74281940169200FFFC47 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0900; - }; - 1F1A74331940169200FFFC47 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0900; - TestTargetID = 1F1A74281940169200FFFC47; - }; - 1F5DF1541BDCA0CE00C3A531 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0900; - }; - 1F5DF15D1BDCA0CE00C3A531 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0900; - }; - 1F925EAC195C0D6300ED456B = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0900; - }; - 1F925EB6195C0D6300ED456B = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0900; - TestTargetID = 1F925EAC195C0D6300ED456B; - }; - A8F2B2541E79A4AB005BDD17 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 1F1A74231940169200FFFC47 /* Build configuration list for PBXProject "Nimble" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 1F1A741F1940169200FFFC47; - productRefGroup = 1F1A742A1940169200FFFC47 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1F925EAC195C0D6300ED456B /* Nimble-macOS */, - 1F925EB6195C0D6300ED456B /* Nimble-macOSTests */, - 1F1A74281940169200FFFC47 /* Nimble-iOS */, - 1F1A74331940169200FFFC47 /* Nimble-iOSTests */, - 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */, - 1F5DF15D1BDCA0CE00C3A531 /* Nimble-tvOSTests */, - A8F2B2541E79A4AB005BDD17 /* SwiftLint */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1F1A74271940169200FFFC47 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74321940169200FFFC47 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1531BDCA0CE00C3A531 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15C1BDCA0CE00C3A531 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EAB195C0D6300ED456B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB5195C0D6300ED456B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - A8F2B2581E79A4B0005BDD17 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1F1A74241940169200FFFC47 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1FD8CD401968AB07008ED995 /* BeCloseTo.swift in Sources */, - 1F12BEA51E77900A006952EC /* CwlCatchBadInstruction.swift in Sources */, - 1F1871C81CA89EDB00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1FD8CD361968AB07008ED995 /* Expectation.swift in Sources */, - 1FD8CD321968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */, - 1F43728F1A1B344000EB80F8 /* Stringers.swift in Sources */, - 1F12BEA41E77900A006952EC /* CwlBadInstructionException.swift in Sources */, - 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */, - 1FD8CD4E1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, - 1FDBD8671AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */, - AE4BA9AD1C88DDB500B73906 /* Errors.swift in Sources */, - 1FD8CD3C1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, - 7A6AB2C51E7F628900A2F694 /* ToSucceed.swift in Sources */, - 1FD8CD501968AB07008ED995 /* BeLogical.swift in Sources */, - 1F1871CB1CA89EDB00A34BF2 /* NMBExpectation.swift in Sources */, - DA9E8C821A414BB9002633C2 /* DSL+Wait.swift in Sources */, - DDB1BC791A92235600F743C3 /* AllPass.swift in Sources */, - 1FD8CD3E1968AB07008ED995 /* BeAKindOf.swift in Sources */, - DDB4D5ED19FE43C200E9D9FE /* Match.swift in Sources */, - 1F12BE9F1E778F8F006952EC /* CwlMachBadInstructionHandler.m in Sources */, - 1F91DD311C74BF61002C309F /* BeVoid.swift in Sources */, - 7B13BA0B1DD361D200C9098C /* ContainElementSatisfying.swift in Sources */, - 1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */, - 1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */, - 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */, - 1FD8CD5A1968AB07008ED995 /* Equal.swift in Sources */, - 1FD8CD4C1968AB07008ED995 /* BeLessThan.swift in Sources */, - 1F1871CC1CA89EDB00A34BF2 /* NMBObjCMatcher.swift in Sources */, - 1FD8CD461968AB07008ED995 /* BeGreaterThan.swift in Sources */, - F8A1BE2F1CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F12BEA21E778FBA006952EC /* mach_excServer.c in Sources */, - 1F1871C61CA89EDB00A34BF2 /* DSL.m in Sources */, - 1FD8CD301968AB07008ED995 /* AdapterProtocols.swift in Sources */, - 1F12BEA71E779018006952EC /* CwlDarwinDefinitions.swift in Sources */, - 1F12BEE01E7791B9006952EC /* CwlCatchException.m in Sources */, - AE7ADE451C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AA1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - CDD80B841F20307A0002CD65 /* MatcherProtocols.swift in Sources */, - 1FD8CD5E1968AB07008ED995 /* RaisesException.swift in Sources */, - 1FD8CD561968AB07008ED995 /* Contain.swift in Sources */, - 1FD8CD481968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */, - 1FD8CD441968AB07008ED995 /* BeginWith.swift in Sources */, - 1FD8CD4A1968AB07008ED995 /* BeIdenticalTo.swift in Sources */, - 1FE661581E6574E30035F243 /* ExpectationMessage.swift in Sources */, - 1F1871E61CA89FCD00A34BF2 /* MatcherFunc.swift in Sources */, - 1FD8CD421968AB07008ED995 /* BeEmpty.swift in Sources */, - 1F1871E41CA89FB600A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1F1871CA1CA89EDB00A34BF2 /* NMBStringify.m in Sources */, - 1FD8CD521968AB07008ED995 /* BeNil.swift in Sources */, - 1FD8CD6A1968AB07008ED995 /* Async.swift in Sources */, - 1FD8CD581968AB07008ED995 /* EndWith.swift in Sources */, - 1FD8CD341968AB07008ED995 /* DSL.swift in Sources */, - 1F12BEDD1E7791B9006952EC /* CwlCatchException.swift in Sources */, - 7B5358BE1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1FD8CD381968AB07008ED995 /* Expression.swift in Sources */, - 1FD8CD3A1968AB07008ED995 /* FailureMessage.swift in Sources */, - 472FD1351B9E085700C7B8DA /* HaveCount.swift in Sources */, - 1FA0C4001E30B14500623165 /* Predicate.swift in Sources */, - 964CFEFD1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74301940169200FFFC47 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4A569A1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, - 1F925EEC195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, - 1F925EFF195C187600ED456B /* EndWithTest.swift in Sources */, - 1F1B5AD41963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, - 1F925F0E195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, - 1F4A56661A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, - 1F925EFC195C186800ED456B /* BeginWithTest.swift in Sources */, - 1F14FB64194180C5009F2A08 /* utils.swift in Sources */, - DDB4D5F019FE442800E9D9FE /* MatchTest.swift in Sources */, - 1F4A56731A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */, - 1F4A56821A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 7B13BA0E1DD361DF00C9098C /* ContainElementSatisfyingTest.swift in Sources */, - 1F925F02195C189500ED456B /* ContainTest.swift in Sources */, - 1F4A56881A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */, - 1F4A568E1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */, - 1F925F11195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F925EEF195C136500ED456B /* BeLogicalTest.swift in Sources */, - 1F4A56A01A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */, - 1F925F0B195C18E100ED456B /* BeLessThanTest.swift in Sources */, - 1F9DB8FB1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */, - 1FB90098195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */, - 1F91DD2D1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 1F4A56761A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, - 1F925EF9195C175000ED456B /* BeNilTest.swift in Sources */, - 7A6AB2C31E7F547E00A2F694 /* ToSucceedTest.swift in Sources */, - 1F4A56701A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, - 1F4A56971A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */, - 1F4A567C1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */, - 965B0D0C1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */, - 1FCF914F1C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - 965B0D091B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */, - 1F4A56911A3B344A009E1637 /* ObjCBeNilTest.m in Sources */, - 1F8A37B01B7C5042001C8357 /* ObjCSyncTest.m in Sources */, - 1F4A56941A3B346F009E1637 /* ObjCContainTest.m in Sources */, - 1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */, - 7B13BA111DD361EB00C9098C /* ObjCContainElementSatisfying.m in Sources */, - 1F925EF6195C147800ED456B /* BeCloseToTest.swift in Sources */, - 1F4A56791A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - AE7ADE491C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 1F4A568B1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */, - DDEFAEB41A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */, - 1F4A567F1A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */, - 1F925EE6195C121200ED456B /* AsynchronousTest.swift in Sources */, - 1F0648CC19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */, - 1F4A56851A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */, - DD9A9A8F19CF439B00706F49 /* BeIdenticalToObjectTest.swift in Sources */, - 1F4BB8B71DACA0E40048464B /* ThrowAssertionTest.swift in Sources */, - 1F0648D41963AAB2001F9C46 /* SynchronousTests.swift in Sources */, - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 4793854D1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */, - 1F925F08195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, - 7B5358BA1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F925F05195C18B700ED456B /* EqualTest.swift in Sources */, - 1F4A566D1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */, - DD72EC641A93874A002F7651 /* AllPassTest.swift in Sources */, - 1F4A569D1A3B3565009E1637 /* ObjCMatchTest.m in Sources */, - 1F925EE9195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */, - 29EA59631B551ED2002D767E /* ThrowErrorTest.swift in Sources */, - 6CAEDD0A1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4A566A1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */, - 472FD13B1B9E0CFE00C7B8DA /* HaveCountTest.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1501BDCA0CE00C3A531 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F5DF1791BDCA0F500C3A531 /* BeCloseTo.swift in Sources */, - 1F5DF16C1BDCA0F500C3A531 /* AssertionRecorder.swift in Sources */, - 1F1871D71CA89EEF00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1F5DF16E1BDCA0F500C3A531 /* NimbleXCTestHandler.swift in Sources */, - 7A6AB2C61E7F628A00A2F694 /* ToSucceed.swift in Sources */, - 1F5DF1751BDCA0F500C3A531 /* FailureMessage.swift in Sources */, - 1F5DF1801BDCA0F500C3A531 /* BeLessThanOrEqual.swift in Sources */, - 1F1871E81CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */, - 1F5DF1891BDCA0F500C3A531 /* RaisesException.swift in Sources */, - 1F5DF1761BDCA0F500C3A531 /* AllPass.swift in Sources */, - AE4BA9AF1C88DDB500B73906 /* Errors.swift in Sources */, - 1F5DF1861BDCA0F500C3A531 /* HaveCount.swift in Sources */, - 1F5DF1811BDCA0F500C3A531 /* BeLogical.swift in Sources */, - 1F1871DB1CA89EF100A34BF2 /* NMBExpectation.swift in Sources */, - 1F5DF1741BDCA0F500C3A531 /* Expression.swift in Sources */, - 1F5DF1781BDCA0F500C3A531 /* BeAnInstanceOf.swift in Sources */, - 1F12BEA01E778F90006952EC /* CwlMachBadInstructionHandler.m in Sources */, - 1F5DF1771BDCA0F500C3A531 /* BeAKindOf.swift in Sources */, - 1F5DF17F1BDCA0F500C3A531 /* BeLessThan.swift in Sources */, - 1F5DF17C1BDCA0F500C3A531 /* BeGreaterThan.swift in Sources */, - 1F91DD331C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91551C61C8A400B15DCB /* PostNotification.swift in Sources */, - 1F5DF1831BDCA0F500C3A531 /* Contain.swift in Sources */, - 1F5DF1851BDCA0F500C3A531 /* Equal.swift in Sources */, - 1F1871DC1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */, - F8A1BE311CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1FE661591E6574E30035F243 /* ExpectationMessage.swift in Sources */, - 1FA0C4011E30B14500623165 /* Predicate.swift in Sources */, - 1F5DF1711BDCA0F500C3A531 /* DSL+Wait.swift in Sources */, - 1F1871D61CA89EEF00A34BF2 /* DSL.m in Sources */, - 1F5DF17D1BDCA0F500C3A531 /* BeGreaterThanOrEqualTo.swift in Sources */, - AE7ADE471C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AC1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1F5DF18E1BDCA0F500C3A531 /* Stringers.swift in Sources */, - 1F5DF16D1BDCA0F500C3A531 /* AdapterProtocols.swift in Sources */, - 1F5DF17B1BDCA0F500C3A531 /* BeginWith.swift in Sources */, - 1F5DF17E1BDCA0F500C3A531 /* BeIdenticalTo.swift in Sources */, - 1F1871E91CA8A18700A34BF2 /* MatcherFunc.swift in Sources */, - 1F5DF17A1BDCA0F500C3A531 /* BeEmpty.swift in Sources */, - 1F5DF18C1BDCA0F500C3A531 /* Async.swift in Sources */, - 1F1871D81CA89EEF00A34BF2 /* NMBStringify.m in Sources */, - 1F5DF1821BDCA0F500C3A531 /* BeNil.swift in Sources */, - 1F5DF16F1BDCA0F500C3A531 /* AssertionDispatcher.swift in Sources */, - 964CFEFF1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - 1F5DF1841BDCA0F500C3A531 /* EndWith.swift in Sources */, - 1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */, - 1F5DF1701BDCA0F500C3A531 /* DSL.swift in Sources */, - CDD80B851F20307B0002CD65 /* MatcherProtocols.swift in Sources */, - 1F5DF1721BDCA0F500C3A531 /* Expectation.swift in Sources */, - 7B5358C01C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 7B13BA0C1DD361D300C9098C /* ContainElementSatisfying.swift in Sources */, - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */, - 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */, - 1F12BEA61E779012006952EC /* CwlCatchBadInstructionPOSIX.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15A1BDCA0CE00C3A531 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CD79C9AD1D2CC848004B6F9A /* ObjCBeTrueTest.m in Sources */, - CD79C9B41D2CC848004B6F9A /* ObjCRaiseExceptionTest.m in Sources */, - 1F5DF1A31BDCA10200C3A531 /* BeLogicalTest.swift in Sources */, - 1F5DF1951BDCA10200C3A531 /* utils.swift in Sources */, - CD79C9B01D2CC848004B6F9A /* ObjCEndWithTest.m in Sources */, - CD79C9B21D2CC848004B6F9A /* ObjCHaveCount.m in Sources */, - CD79C9A41D2CC848004B6F9A /* ObjCBeFalsyTest.m in Sources */, - 1F5DF1981BDCA10200C3A531 /* BeAKindOfTest.swift in Sources */, - 1F5DF19B1BDCA10200C3A531 /* BeEmptyTest.swift in Sources */, - 7B5358BC1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F5DF1A11BDCA10200C3A531 /* BeLessThanOrEqualToTest.swift in Sources */, - 1F5DF1961BDCA10200C3A531 /* ObjectWithLazyProperty.swift in Sources */, - 1F5DF1AB1BDCA10200C3A531 /* ThrowErrorTest.swift in Sources */, - CD79C9A91D2CC848004B6F9A /* ObjCBeKindOfTest.m in Sources */, - 1F5DF1A51BDCA10200C3A531 /* ContainTest.swift in Sources */, - 7B13BA121DD361EB00C9098C /* ObjCContainElementSatisfying.m in Sources */, - AE7ADE4B1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 7B13BA0F1DD361DF00C9098C /* ContainElementSatisfyingTest.swift in Sources */, - CD79C9B31D2CC848004B6F9A /* ObjCMatchTest.m in Sources */, - 1F5DF19E1BDCA10200C3A531 /* BeGreaterThanTest.swift in Sources */, - 1F5DF1A21BDCA10200C3A531 /* BeLessThanTest.swift in Sources */, - CD79C9AB1D2CC848004B6F9A /* ObjCBeLessThanTest.m in Sources */, - CD79C9A81D2CC848004B6F9A /* ObjCBeIdenticalToTest.m in Sources */, - CD79C9AE1D2CC848004B6F9A /* ObjCBeTruthyTest.m in Sources */, - 1F5DF1921BDCA10200C3A531 /* AsynchronousTest.swift in Sources */, - 1F5DF1A91BDCA10200C3A531 /* MatchTest.swift in Sources */, - 1F5DF1A81BDCA10200C3A531 /* HaveCountTest.swift in Sources */, - 1F5DF1971BDCA10200C3A531 /* AllPassTest.swift in Sources */, - CD79C9A61D2CC848004B6F9A /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */, - 1FCF91511C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - CD79C9B51D2CC848004B6F9A /* ObjCUserDescriptionTest.m in Sources */, - 1F5DF19C1BDCA10200C3A531 /* BeginWithTest.swift in Sources */, - 1F5DF1A01BDCA10200C3A531 /* BeIdenticalToTest.swift in Sources */, - 1F5DF19A1BDCA10200C3A531 /* BeCloseToTest.swift in Sources */, - 1F5DF1A61BDCA10200C3A531 /* EndWithTest.swift in Sources */, - CD79C9A31D2CC841004B6F9A /* ObjCBeFalseTest.m in Sources */, - 1F5DF1A71BDCA10200C3A531 /* EqualTest.swift in Sources */, - CD79C9AA1D2CC848004B6F9A /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 1F5DF1931BDCA10200C3A531 /* SynchronousTests.swift in Sources */, - CD79C9A11D2CC83B004B6F9A /* ObjCBeCloseToTest.m in Sources */, - 1F5DF19D1BDCA10200C3A531 /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F5DF1A41BDCA10200C3A531 /* BeNilTest.swift in Sources */, - 7A6AB2C41E7F547E00A2F694 /* ToSucceedTest.swift in Sources */, - CD79C9A71D2CC848004B6F9A /* ObjCBeGreaterThanTest.m in Sources */, - CD79C9A51D2CC848004B6F9A /* ObjCBeginWithTest.m in Sources */, - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 1F5DF1AA1BDCA10200C3A531 /* RaisesExceptionTest.swift in Sources */, - 1F5DF1941BDCA10200C3A531 /* UserDescriptionTest.swift in Sources */, - CD79C9AF1D2CC848004B6F9A /* ObjCContainTest.m in Sources */, - 1F5DF19F1BDCA10200C3A531 /* BeIdenticalToObjectTest.swift in Sources */, - CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */, - 1F91DD2F1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 6CAEDD0C1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4BB8B81DACAACF0048464B /* ThrowAssertionTest.swift in Sources */, - CD79C9B71D2CC848004B6F9A /* ObjCSatisfyAnyOfTest.m in Sources */, - 1F5DF1991BDCA10200C3A531 /* BeAnInstanceOfTest.swift in Sources */, - CD79C9B11D2CC848004B6F9A /* ObjCEqualTest.m in Sources */, - CD79C9A21D2CC83E004B6F9A /* ObjCBeEmptyTest.m in Sources */, - CD79C9AC1D2CC848004B6F9A /* ObjCBeNilTest.m in Sources */, - CD79C9A01D2CC839004B6F9A /* ObjCBeAnInstanceOfTest.m in Sources */, - CD79C9B61D2CC848004B6F9A /* ObjCAllPassTest.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EA8195C0D6300ED456B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1FD8CD411968AB07008ED995 /* BeCloseTo.swift in Sources */, - 1F12BE991E778F70006952EC /* CwlCatchBadInstruction.swift in Sources */, - 1F1871D31CA89EEE00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1FD8CD371968AB07008ED995 /* Expectation.swift in Sources */, - 1FD8CD331968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */, - 1F43728E1A1B343F00EB80F8 /* Stringers.swift in Sources */, - 1F12BE981E778F70006952EC /* CwlBadInstructionException.swift in Sources */, - 1F43728C1A1B343C00EB80F8 /* SourceLocation.swift in Sources */, - 1FD8CD4F1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, - 1F1871E71CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1FDBD8681AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */, - AE4BA9AE1C88DDB500B73906 /* Errors.swift in Sources */, - 1FD8CD3D1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, - 1F12BEDF1E7791B9006952EC /* CwlCatchException.m in Sources */, - 1FD8CD511968AB07008ED995 /* BeLogical.swift in Sources */, - 1F1871D91CA89EF100A34BF2 /* NMBExpectation.swift in Sources */, - DA9E8C831A414BB9002633C2 /* DSL+Wait.swift in Sources */, - DDB1BC7A1A92235600F743C3 /* AllPass.swift in Sources */, - 1FD8CD3F1968AB07008ED995 /* BeAKindOf.swift in Sources */, - 1F12BE941E778F70006952EC /* CwlMachBadInstructionHandler.m in Sources */, - 1FD8CD2F1968AB07008ED995 /* AssertionRecorder.swift in Sources */, - 7B13BA061DD360AA00C9098C /* ContainElementSatisfying.swift in Sources */, - 1F91DD321C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */, - DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */, - 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */, - 1FD8CD5B1968AB07008ED995 /* Equal.swift in Sources */, - 1F12BEE91E779784006952EC /* mach_excServer.c in Sources */, - 1FD8CD4D1968AB07008ED995 /* BeLessThan.swift in Sources */, - 1FD8CD471968AB07008ED995 /* BeGreaterThan.swift in Sources */, - F8A1BE301CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F1871DA1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */, - 1FD8CD311968AB07008ED995 /* AdapterProtocols.swift in Sources */, - 1F1871D21CA89EEE00A34BF2 /* DSL.m in Sources */, - AE7ADE461C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AB1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1FD8CD5F1968AB07008ED995 /* RaisesException.swift in Sources */, - CDD80B831F2030790002CD65 /* MatcherProtocols.swift in Sources */, - 1FD8CD571968AB07008ED995 /* Contain.swift in Sources */, - 7A0A26231E7F52360092A34E /* ToSucceed.swift in Sources */, - 1FD8CD491968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */, - 1FE661571E6574E30035F243 /* ExpectationMessage.swift in Sources */, - 1FD8CD451968AB07008ED995 /* BeginWith.swift in Sources */, - 1F1871EB1CA8A18800A34BF2 /* MatcherFunc.swift in Sources */, - 1FD8CD4B1968AB07008ED995 /* BeIdenticalTo.swift in Sources */, - 1FD8CD431968AB07008ED995 /* BeEmpty.swift in Sources */, - 1F1871D41CA89EEE00A34BF2 /* NMBStringify.m in Sources */, - 1FD8CD531968AB07008ED995 /* BeNil.swift in Sources */, - 1F12BEDC1E7791B9006952EC /* CwlCatchException.swift in Sources */, - 1FD8CD6B1968AB07008ED995 /* Async.swift in Sources */, - 964CFEFE1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - 1FD8CD591968AB07008ED995 /* EndWith.swift in Sources */, - 1FD8CD351968AB07008ED995 /* DSL.swift in Sources */, - 7B5358BF1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1F12BE9B1E778F70006952EC /* CwlDarwinDefinitions.swift in Sources */, - 1FD8CD391968AB07008ED995 /* Expression.swift in Sources */, - 1FD8CD3B1968AB07008ED995 /* FailureMessage.swift in Sources */, - 1FA0C3FF1E30B14500623165 /* Predicate.swift in Sources */, - 472FD1391B9E0A9700C7B8DA /* HaveCount.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB3195C0D6300ED456B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4A569B1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, - 1F925EED195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, - 1F925F00195C187600ED456B /* EndWithTest.swift in Sources */, - 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, - 1F925F0F195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, - 1F4A56671A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, - 1F925EFD195C186800ED456B /* BeginWithTest.swift in Sources */, - 1F925EE2195C0DFD00ED456B /* utils.swift in Sources */, - DDB4D5F119FE442800E9D9FE /* MatchTest.swift in Sources */, - 1F4A56741A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */, - 1F4A56831A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 7B13BA0D1DD361DE00C9098C /* ContainElementSatisfyingTest.swift in Sources */, - 1F925F03195C189500ED456B /* ContainTest.swift in Sources */, - 1F4A56891A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */, - 1F4A568F1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */, - 1F925F12195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F925EF0195C136500ED456B /* BeLogicalTest.swift in Sources */, - 1F4A56A11A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */, - 1F925F0C195C18E100ED456B /* BeLessThanTest.swift in Sources */, - 1F9DB8FC1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */, - 1FB90099195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */, - 1F91DD2E1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 1F4A56771A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, - 1F925EFA195C175000ED456B /* BeNilTest.swift in Sources */, - 7A6AB2C21E7F547E00A2F694 /* ToSucceedTest.swift in Sources */, - 1F4A56711A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, - 1F4A56981A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */, - 1F4A567D1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */, - 965B0D0D1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */, - 1FCF91501C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - 965B0D0A1B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */, - 1F4A56921A3B344A009E1637 /* ObjCBeNilTest.m in Sources */, - 1F8A37B11B7C5042001C8357 /* ObjCSyncTest.m in Sources */, - 1F4A56951A3B346F009E1637 /* ObjCContainTest.m in Sources */, - 1F299EAC19627B2D002641AF /* BeEmptyTest.swift in Sources */, - 7B13BA101DD361EA00C9098C /* ObjCContainElementSatisfying.m in Sources */, - 1F925EF7195C147800ED456B /* BeCloseToTest.swift in Sources */, - 1F4A567A1A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - AE7ADE4A1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 1F4A568C1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */, - DDEFAEB51A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */, - 1F4A56801A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */, - 1F925EE7195C121200ED456B /* AsynchronousTest.swift in Sources */, - 1F0648CD19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */, - 1F4A56861A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */, - DD9A9A9019CF43AD00706F49 /* BeIdenticalToObjectTest.swift in Sources */, - 1F4BB8B61DACA0E30048464B /* ThrowAssertionTest.swift in Sources */, - 1F0648D51963AAB2001F9C46 /* SynchronousTests.swift in Sources */, - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 4793854E1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */, - 1F925F09195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, - 7B5358BB1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F925F06195C18B700ED456B /* EqualTest.swift in Sources */, - 1F4A566E1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */, - DD72EC651A93874A002F7651 /* AllPassTest.swift in Sources */, - 1F4A569E1A3B3565009E1637 /* ObjCMatchTest.m in Sources */, - 1F925EEA195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */, - 29EA59641B551ED2002D767E /* ThrowErrorTest.swift in Sources */, - 6CAEDD0B1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4A566B1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */, - 472FD13A1B9E0A9F00C7B8DA /* HaveCountTest.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1F1A74371940169200FFFC47 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F1A74361940169200FFFC47 /* PBXContainerItemProxy */; - }; - 1F5DF1611BDCA0CE00C3A531 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */; - targetProxy = 1F5DF1601BDCA0CE00C3A531 /* PBXContainerItemProxy */; - }; - 1F6BB82B1968BFF9009F1DBB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F6BB82A1968BFF9009F1DBB /* PBXContainerItemProxy */; - }; - 1F925EA5195C0C8500ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F925EA4195C0C8500ED456B /* PBXContainerItemProxy */; - }; - 1F925EA7195C0C8500ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F925EA6195C0C8500ED456B /* PBXContainerItemProxy */; - }; - 1F925EBA195C0D6300ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F925EB9195C0D6300ED456B /* PBXContainerItemProxy */; - }; - 1F9B7BFE1968AD760094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7BFD1968AD760094EB8F /* PBXContainerItemProxy */; - }; - 1F9B7C001968AD760094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7BFF1968AD760094EB8F /* PBXContainerItemProxy */; - }; - 1F9B7C021968AD820094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7C011968AD820094EB8F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1F1A743D1940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = NO; - 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_ERROR; - 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_ERROR; - 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; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 1F1A743E1940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = NO; - 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_ERROR; - 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_ERROR; - 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; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 1F1A74401940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F1A74411940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 1F1A74431940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F1A74441940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 1F5DF1661BDCA0CE00C3A531 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Debug; - }; - 1F5DF1671BDCA0CE00C3A531 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Release; - }; - 1F5DF1681BDCA0CE00C3A531 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Debug; - }; - 1F5DF1691BDCA0CE00C3A531 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = appletvos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Release; - }; - 1F925EC1195C0D6300ED456B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - FRAMEWORK_VERSION = A; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = macosx; - SKIP_INSTALL = YES; - VALID_ARCHS = x86_64; - }; - name = Debug; - }; - 1F925EC2195C0D6300ED456B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - FRAMEWORK_VERSION = A; - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALID_ARCHS = x86_64; - }; - name = Release; - }; - 1F925EC4195C0D6300ED456B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F925EC5195C0D6300ED456B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - A8F2B2551E79A4AB005BDD17 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = macosx; - }; - name = Debug; - }; - A8F2B2561E79A4AB005BDD17 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1F1A74231940169200FFFC47 /* Build configuration list for PBXProject "Nimble" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A743D1940169200FFFC47 /* Debug */, - 1F1A743E1940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F1A743F1940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A74401940169200FFFC47 /* Debug */, - 1F1A74411940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F1A74421940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A74431940169200FFFC47 /* Debug */, - 1F1A74441940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F5DF16A1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F5DF1661BDCA0CE00C3A531 /* Debug */, - 1F5DF1671BDCA0CE00C3A531 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F5DF16B1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F5DF1681BDCA0CE00C3A531 /* Debug */, - 1F5DF1691BDCA0CE00C3A531 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F925EC0195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F925EC1195C0D6300ED456B /* Debug */, - 1F925EC2195C0D6300ED456B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F925EC3195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F925EC4195C0D6300ED456B /* Debug */, - 1F925EC5195C0D6300ED456B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A8F2B2571E79A4AC005BDD17 /* Build configuration list for PBXAggregateTarget "SwiftLint" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A8F2B2551E79A4AB005BDD17 /* Debug */, - A8F2B2561E79A4AB005BDD17 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 1F1A74201940169200FFFC47 /* Project object */; -} diff --git a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a822b74..0000000 --- a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme b/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme deleted file mode 100644 index 0cbad84..0000000 --- a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme b/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme deleted file mode 100644 index 571a9f4..0000000 --- a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme b/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme deleted file mode 100644 index dba65f1..0000000 --- a/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Nimble/Package.swift b/Carthage/Checkouts/Nimble/Package.swift deleted file mode 100644 index 2ef4037..0000000 --- a/Carthage/Checkouts/Nimble/Package.swift +++ /dev/null @@ -1,12 +0,0 @@ -// swift-tools-version:3.0 - -import PackageDescription - -let package = Package( - name: "Nimble", - exclude: [ - "Sources/Lib", - "Sources/NimbleObjectiveC", - "Tests/NimbleTests/objc", - ] -) diff --git a/Carthage/Checkouts/Nimble/README.md b/Carthage/Checkouts/Nimble/README.md deleted file mode 100644 index a190ac6..0000000 --- a/Carthage/Checkouts/Nimble/README.md +++ /dev/null @@ -1,1764 +0,0 @@ -# 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). - -```swift -// Swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` - -# How to Use Nimble - - - -**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - -- [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 Safety](#type-safety) - - [Operator Overloads](#operator-overloads) - - [Lazily Computed Values](#lazily-computed-values) - - [C Primitives](#c-primitives) - - [Asynchronous Expectations](#asynchronous-expectations) - - [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) - - [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) - - [Using Nimble without XCTest](#using-nimble-without-xctest) - - - -# Some Background: Expressing Outcomes Using Assertions in XCTest - -Apple's Xcode includes the XCTest framework, which provides -assertion macros to test whether code behaves properly. -For example, to assert that `1 + 1 = 2`, XCTest has you write: - -```swift -// Swift - -XCTAssertEqual(1 + 1, 2, "expected one plus one to equal two") -``` - -Or, in Objective-C: - -```objc -// Objective-C - -XCTAssertEqual(1 + 1, 2, @"expected one plus one to equal two"); -``` - -XCTest assertions have a couple of drawbacks: - -1. **Not enough macros.** There's no easy way to assert that a string - contains a particular substring, or that a number is less than or - equal to another. -2. **It's hard to write asynchronous tests.** XCTest forces you to write - a lot of boilerplate code. - -Nimble addresses these concerns. - -# Nimble: Expectations Using `expect(...).to` - -Nimble allows you to express expectations using a natural, -easily understood language: - -```swift -// Swift - -import Nimble - -expect(seagull.squawk).to(equal("Squee!")) -``` - -```objc -// Objective-C - -@import Nimble; - -expect(seagull.squawk).to(equal(@"Squee!")); -``` - -> The `expect` function autocompletes to include `file:` and `line:`, - but these parameters are optional. Use the default values to have - Xcode highlight the correct line when an expectation is not met. - -To perform the opposite expectation--to assert something is *not* -equal--use `toNot` or `notTo`: - -```swift -// Swift - -import Nimble - -expect(seagull.squawk).toNot(equal("Oh, hello there!")) -expect(seagull.squawk).notTo(equal("Oh, hello there!")) -``` - -```objc -// Objective-C - -@import Nimble; - -expect(seagull.squawk).toNot(equal(@"Oh, hello there!")); -expect(seagull.squawk).notTo(equal(@"Oh, hello there!")); -``` - -## Custom Failure Messages - -Would you like to add more information to the test's failure messages? Use the `description` optional argument to add your own text: - -```swift -// Swift - -expect(1 + 1).to(equal(3)) -// failed - expected to equal <3>, got <2> - -expect(1 + 1).to(equal(3), description: "Make sure libKindergartenMath is loaded") -// failed - Make sure libKindergartenMath is loaded -// expected to equal <3>, got <2> -``` - -Or the *WithDescription version in Objective-C: - -```objc -// Objective-C - -@import Nimble; - -expect(@(1+1)).to(equal(@3)); -// failed - expected to equal <3.0000>, got <2.0000> - -expect(@(1+1)).toWithDescription(equal(@3), @"Make sure libKindergartenMath is loaded"); -// failed - Make sure libKindergartenMath is loaded -// expected to equal <3.0000>, got <2.0000> -``` - -## Type Safety - -Nimble makes sure you don't compare two types that don't match: - -```swift -// Swift - -// Does not compile: -expect(1 + 1).to(equal("Squee!")) -``` - -> Nimble uses generics--only available in Swift--to ensure - type correctness. That means type checking is - not available when using Nimble in Objective-C. :sob: - -## Operator Overloads - -Tired of so much typing? With Nimble, you can use overloaded operators -like `==` for equivalence, or `>` for comparisons: - -```swift -// Swift - -// Passes if squawk does not equal "Hi!": -expect(seagull.squawk) != "Hi!" - -// Passes if 10 is greater than 2: -expect(10) > 2 -``` - -> Operator overloads are only available in Swift, so you won't be able - to use this syntax in Objective-C. :broken_heart: - -## Lazily Computed Values - -The `expect` function doesn't evaluate the value it's given until it's -time to match. So Nimble can test whether an expression raises an -exception once evaluated: - -```swift -// Swift - -// Note: Swift currently doesn't have exceptions. -// Only Objective-C code can raise exceptions -// that Nimble will catch. -// (see https://github.com/Quick/Nimble/issues/220#issuecomment-172667064) -let exception = NSException( - name: NSInternalInconsistencyException, - reason: "Not enough fish in the sea.", - userInfo: ["something": "is fishy"]) -expect { exception.raise() }.to(raiseException()) - -// Also, you can customize raiseException to be more specific -expect { exception.raise() }.to(raiseException(named: NSInternalInconsistencyException)) -expect { exception.raise() }.to(raiseException( - named: NSInternalInconsistencyException, - reason: "Not enough fish in the sea")) -expect { exception.raise() }.to(raiseException( - named: NSInternalInconsistencyException, - reason: "Not enough fish in the sea", - userInfo: ["something": "is fishy"])) -``` - -Objective-C works the same way, but you must use the `expectAction` -macro when making an expectation on an expression that has no return -value: - -```objc -// Objective-C - -NSException *exception = [NSException exceptionWithName:NSInternalInconsistencyException - reason:@"Not enough fish in the sea." - userInfo:nil]; -expectAction(^{ [exception raise]; }).to(raiseException()); - -// Use the property-block syntax to be more specific. -expectAction(^{ [exception raise]; }).to(raiseException().named(NSInternalInconsistencyException)); -expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInternalInconsistencyException). - reason("Not enough fish in the sea")); -expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInternalInconsistencyException). - reason("Not enough fish in the sea"). - userInfo(@{@"something": @"is fishy"})); - -// You can also pass a block for custom matching of the raised exception -expectAction(exception.raise()).to(raiseException().satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(beginWith(NSInternalInconsistencyException)); -})); -``` - -## C Primitives - -Some testing frameworks make it hard to test primitive C values. -In Nimble, it just works: - -```swift -// Swift - -let actual: CInt = 1 -let expectedValue: CInt = 1 -expect(actual).to(equal(expectedValue)) -``` - -In fact, Nimble uses type inference, so you can write the above -without explicitly specifying both types: - -```swift -// Swift - -expect(1 as CInt).to(equal(1)) -``` - -> In Objective-C, Nimble only supports Objective-C objects. To - make expectations on primitive C values, wrap then in an object - literal: - -```objc -expect(@(1 + 1)).to(equal(@2)); -``` - -## Asynchronous Expectations - -In Nimble, it's easy to make expectations on values that are updated -asynchronously. Just use `toEventually` or `toEventuallyNot`: - -```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") -} -expect(ocean).toEventually(contain("dolphins", "whales")) -``` - - -```objc -// Objective-C - -dispatch_async(dispatch_get_main_queue(), ^{ - [ocean add:@"dolphins"]; - [ocean add:@"whales"]; -}); -expect(ocean).toEventually(contain(@"dolphins", @"whales")); -``` - -Note: toEventually triggers its polls on the main thread. Blocking the main -thread will cause Nimble to stop the run loop. This can cause test pollution -for whatever incomplete code that was running on the main thread. Blocking the -main thread can be caused by blocking IO, calls to sleep(), deadlocks, and -synchronous IPC. - -In the above example, `ocean` is constantly re-evaluated. If it ever -contains dolphins and whales, the expectation passes. If `ocean` still -doesn't contain them, even after being continuously re-evaluated for one -whole second, the expectation fails. - -Sometimes it takes more than a second for a value to update. In those -cases, use the `timeout` parameter: - -```swift -// Swift - -// 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 -// Objective-C - -// Waits three seconds for ocean to contain "starfish": -expect(ocean).withTimeout(3).toEventually(contain(@"starfish")); -``` - -You can also provide a callback by using the `waitUntil` function: - -```swift -// Swift - -waitUntil { done in - ocean.goFish { success in - expect(success).to(beTrue()) - done() - } -} -``` - -```objc -// Objective-C - -waitUntil(^(void (^done)(void)){ - [ocean goFishWithHandler:^(BOOL success){ - expect(success).to(beTrue()); - done(); - }]; -}); -``` - -`waitUntil` also optionally takes a timeout parameter: - -```swift -// Swift - -waitUntil(timeout: 10) { done in - ocean.goFish { success in - expect(success).to(beTrue()) - done() - } -} -``` - -```objc -// Objective-C - -waitUntilTimeout(10, ^(void (^done)(void)){ - [ocean goFishWithHandler:^(BOOL success){ - expect(success).to(beTrue()); - done(); - }]; -}); -``` - -Note: `waitUntil` triggers its timeout code on the main thread. Blocking the main -thread will cause Nimble to stop the run loop to continue. This can cause test -pollution for whatever incomplete code that was running on the main thread. -Blocking the main thread can be caused by blocking IO, calls to sleep(), -deadlocks, and synchronous IPC. - -In some cases (e.g. when running on slower machines) it can be useful to modify -the default timeout and poll interval values. This can be done as follows: - -```swift -// Swift - -// Increase the global timeout to 5 seconds: -Nimble.AsyncDefaults.Timeout = 5 - -// Slow the polling interval to 0.1 seconds: -Nimble.AsyncDefaults.PollInterval = 0.1 -``` - -## Objective-C Support - -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 or can be converted into - an `NSObject` equivalent: - - ```objc - // Objective-C - - @import Nimble; - - 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, - such as `-[NSException raise]`, use `expectAction` instead of - `expect`: - - ```objc - // 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 -`expect` function. To disable this shorthand in Objective-C, define the -`NIMBLE_DISABLE_SHORT_SYNTAX` macro somewhere in your code before -importing Nimble: - -```objc -#define NIMBLE_DISABLE_SHORT_SYNTAX 1 - -@import Nimble; - -NMB_expect(^{ return seagull.squawk; }, __FILE__, __LINE__).to(NMB_equal(@"Squee!")); -``` - -> Disabling the shorthand is useful if you're testing functions with - names that conflict with Nimble functions, such as `expect` or - `equal`. If that's not the case, there's no point in disabling the - shorthand. - -# Built-in Matcher Functions - -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': -expect(actual).to(equal(expected)) -expect(actual) == expected - -// Passes if 'actual' is not equivalent to 'expected': -expect(actual).toNot(equal(expected)) -expect(actual) != expected -``` - -```objc -// Objective-C - -// Passes if 'actual' is equivalent to 'expected': -expect(actual).to(equal(expected)) - -// Passes if 'actual' is not equivalent to 'expected': -expect(actual).toNot(equal(expected)) -``` - -Values must be `Equatable`, `Comparable`, or subclasses of `NSObject`. -`equal` will always fail when used to compare one or more `nil` values. - -## Identity - -```swift -// Swift - -// 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': -expect(actual).toNot(beIdenticalTo(expected)) -expect(actual) !== expected -``` - -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': -expect(actual).to(beIdenticalTo(expected)); - -// Passes if 'actual' does not have the same pointer address as 'expected': -expect(actual).toNot(beIdenticalTo(expected)); -``` - -## Comparisons - -```swift -// Swift - -expect(actual).to(beLessThan(expected)) -expect(actual) < expected - -expect(actual).to(beLessThanOrEqualTo(expected)) -expect(actual) <= expected - -expect(actual).to(beGreaterThan(expected)) -expect(actual) > expected - -expect(actual).to(beGreaterThanOrEqualTo(expected)) -expect(actual) >= expected -``` - -```objc -// Objective-C - -expect(actual).to(beLessThan(expected)); -expect(actual).to(beLessThanOrEqualTo(expected)); -expect(actual).to(beGreaterThan(expected)); -expect(actual).to(beGreaterThanOrEqualTo(expected)); -``` - -> Values given to the comparison matchers above must implement - `Comparable`. - -Because of how computers represent floating point numbers, assertions -that two floating point numbers be equal will sometimes fail. To express -that two numbers should be close to one another within a certain margin -of error, use `beCloseTo`: - -```swift -// Swift - -expect(actual).to(beCloseTo(expected, within: delta)) -``` - -```objc -// Objective-C - -expect(actual).to(beCloseTo(expected).within(delta)); -``` - -For example, to assert that `10.01` is close to `10`, you can write: - -```swift -// Swift - -expect(10.01).to(beCloseTo(10, within: 0.1)) -``` - -```objc -// Objective-C - -expect(@(10.01)).to(beCloseTo(@10).within(0.1)); -``` - -There is also an operator shortcut available in Swift: - -```swift -// Swift - -expect(actual) ≈ expected -expect(actual) ≈ (expected, delta) - -``` -(Type Option-x to get ≈ on a U.S. keyboard) - -The former version uses the default delta of 0.0001. Here is yet another way to do this: - -```swift -// Swift - -expect(actual) ≈ expected ± delta -expect(actual) == expected ± delta - -``` -(Type Option-Shift-= to get ± on a U.S. keyboard) - -If you are comparing arrays of floating point numbers, you'll find the following useful: - -```swift -// Swift - -expect([0.0, 2.0]) ≈ [0.0001, 2.0001] -expect([0.0, 2.0]).to(beCloseTo([0.1, 2.1], within: 0.1)) - -``` - -> Values given to the `beCloseTo` matcher must be coercable into a - `Double`. - -## Types/Classes - -```swift -// Swift - -// 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: -expect(instance).to(beAKindOf(aClass)) -``` - -```objc -// Objective-C - -// 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: -expect(instance).to(beAKindOf(aClass)); -``` - -> Instances must be Objective-C objects: subclasses of `NSObject`, - or Swift objects bridged to Objective-C with the `@objc` prefix. - -For example, to assert that `dolphin` is a kind of `Mammal`: - -```swift -// Swift - -expect(dolphin).to(beAKindOf(Mammal)) -``` - -```objc -// Objective-C - -expect(dolphin).to(beAKindOf([Mammal class])); -``` - -> `beAnInstanceOf` uses the `-[NSObject isMemberOfClass:]` method to - test membership. `beAKindOf` uses `-[NSObject isKindOfClass:]`. - -## Truthiness - -```swift -// 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): -expect(actual).to(beTrue()) - -// 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): -expect(actual).to(beFalse()) - -// 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: -expect(actual).to(beTruthy()); - -// 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: -expect(actual).to(beFalsy()); - -// Passes if 'actual' is only false (not nil or an object conforming to Boolean false): -expect(actual).to(beFalse()); - -// 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 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 'Error': -expect { try somethingThatThrows() }.to(throwError()) - -// 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 a particular error enum case: -expect { try somethingThatThrows() }.to(throwError(NSCocoaError.PropertyListReadCorruptError)) - -// Passes if 'somethingThatThrows()' throws an error of a particular type: -expect { try somethingThatThrows() }.to(throwError(errorType: NimbleError.self)) -``` - -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: Error = ... - -// Passes if 'actual' represents any error value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum.self)) - -// 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 one provided: -expect(actual).to(matchError(NSError(domain: "err", code: 123, userInfo: nil))) -``` - -Note: This feature is only available in Swift. - -## Exceptions - -```swift -// Swift - -// Passes if 'actual', when evaluated, raises an exception: -expect(actual).to(raiseException()) - -// 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: -expect(actual).to(raiseException(named: name, reason: reason)) - -// 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")) -}) -``` - -```objc -// Objective-C - -// Passes if 'actual', when evaluated, raises an exception: -expect(actual).to(raiseException()) - -// 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: -expect(actual).to(raiseException().named(name).reason(reason)) - -// 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. - -## Collection Membership - -```swift -// Swift - -// Passes if all of the expected values are members of 'actual': -expect(actual).to(contain(expected...)) - -// 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': -expect(actual).to(contain(expected)); - -// Passes if 'actual' is empty (i.e. it contains no elements): -expect(actual).to(beEmpty()); -``` - -> In Swift `contain` takes any number of arguments. The expectation - passes if all of them are members of the collection. In Objective-C, - `contain` only takes one argument [for now](https://github.com/Quick/Nimble/issues/27). - -For example, to assert that a list of sea creature names contains -"dolphin" and "starfish": - -```swift -// Swift - -expect(["whale", "dolphin", "starfish"]).to(contain("dolphin", "starfish")) -``` - -```objc -// Objective-C - -expect(@[@"whale", @"dolphin", @"starfish"]).to(contain(@"dolphin")); -expect(@[@"whale", @"dolphin", @"starfish"]).to(contain(@"starfish")); -``` - -> `contain` and `beEmpty` expect collections to be instances of - `NSArray`, `NSSet`, or a Swift collection composed of `Equatable` elements. - -To test whether a set of elements is present at the beginning or end of -an ordered collection, use `beginWith` and `endWith`: - -```swift -// Swift - -// 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': -expect(actual).to(endWith(expected...)) -``` - -```objc -// Objective-C - -// 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': -expect(actual).to(endWith(expected)); -``` - -> `beginWith` and `endWith` expect collections to be instances of - `NSArray`, or ordered Swift collections composed of `Equatable` - elements. - - 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': -expect(actual).to(contain(substring)) - -// Passes if 'actual' begins with 'prefix': -expect(actual).to(beginWith(prefix)) - -// Passes if 'actual' ends with 'suffix': -expect(actual).to(endWith(suffix)) - -// Passes if 'actual' represents the empty string, "": -expect(actual).to(beEmpty()) - -// Passes if 'actual' matches the regular expression defined in 'expected': -expect(actual).to(match(expected)) -``` - -```objc -// Objective-C - -// Passes if 'actual' contains 'substring': -expect(actual).to(contain(expected)); - -// Passes if 'actual' begins with 'prefix': -expect(actual).to(beginWith(prefix)); - -// Passes if 'actual' ends with 'suffix': -expect(actual).to(endWith(suffix)); - -// Passes if 'actual' represents the empty string, "": -expect(actual).to(beEmpty()); - -// Passes if 'actual' matches the regular expression defined in 'expected': -expect(actual).to(match(expected)) -``` - -## 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 - -// Providing a custom function: -expect([1, 2, 3, 4]).to(allPass { $0! < 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))); -``` - -## Collection Count - -```swift -// Swift - -// Passes if 'actual' contains the 'expected' number of elements: -expect(actual).to(haveCount(expected)) - -// Passes if 'actual' does _not_ contain the 'expected' number of elements: -expect(actual).notTo(haveCount(expected)) -``` - -```objc -// Objective-C - -// Passes if 'actual' contains the 'expected' number of elements: -expect(actual).to(haveCount(expected)) - -// Passes if 'actual' does _not_ contain the 'expected' number of elements: -expect(actual).notTo(haveCount(expected)) -``` - -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 must be one of the following classes, or their subclasses: - - - `NSArray`, - - `NSDictionary`, - - `NSSet`, or - - `NSHashTable`. - -## Notifications - -```swift -// Swift -let testNotification = Notification(name: "Foo", object: nil) - -// passes if the closure in expect { ... } posts a notification to the default -// notification center. -expect { - NotificationCenter.default.postNotification(testNotification) -}.to(postNotifications(equal([testNotification])) - -// passes if the closure in expect { ... } posts a notification to a given -// notification center -let notificationCenter = NotificationCenter() -expect { - notificationCenter.postNotification(testNotification) -}.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) -``` - -> This matcher is only available in Swift. - -## 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))) - -// can include any number of matchers -- the following will pass -// **be careful** -- too many matchers can be the sign of an unfocused test -expect(6).to(satisfyAnyOf(equal(2), equal(3), equal(4), equal(5), equal(6), equal(7))) - -// in Swift you also have the option to use the || operator to achieve a similar function -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))) - -// can include any number of matchers -- the following will pass -// **be careful** -- too many matchers can be the sign of an unfocused test -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. - -## Custom Validation - -```swift -// Swift - -// passes if .succeeded is returned from the closure -expect({ - guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { - return .failed(reason: "wrong enum case") - } - - return .succeeded -}).to(succeed()) - -// passes if .failed is returned from the closure -expect({ - guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { - return .failed(reason: "wrong enum case") - } - - return .succeeded -}).notTo(succeed()) -``` - -The `String` provided with `.failed()` is shown when the test fails. - -When using `toEventually()` be careful not to make state changes or run process intensive code since this closure will be ran many times. - -# Writing Your Own Matchers - -In Nimble, matchers are Swift functions that take an expected -value and return a `Predicate` closure. Take `equal`, for example: - -```swift -// Swift - -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 PredicateResult( - bool: actualValue == expectedValue!, - message: msg - ) - } else { - return PredicateResult( - status: .fail, - message: msg.appendedBeNilHint() - ) - } - } -} -``` - -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 - `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 -in an Xcode project you distribute to others. - -> If you write a matcher you think everyone can use, consider adding it - to Nimble's built-in set of matchers by sending a pull request! Or - distribute it yourself via GitHub. - -For examples of how to write your own matchers, just check out the -[`Matchers` directory](https://github.com/Quick/Nimble/tree/master/Sources/Nimble/Matchers) -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 -`expect` function. The expression can either be a closure or a value directly -passed to `expect(...)`. In order to determine whether that value matches, -custom matchers should call `actualExpression.evaluate()`: - -```swift -// Swift - -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 -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. - -## Type Checking via Swift Generics - -Using Swift's generics, matchers can constrain the type of the actual value -passed to the `expect` function by modifying the return type. - -For example, the following matcher, `haveDescription`, only accepts actual -values that implement the `Printable` protocol. It checks their `description` -against the one provided to the matcher function, and passes if they are the same: - -```swift -// Swift - -public func haveDescription(description: String) -> Predicate { - return Predicate.simple("have description") { actual in - return PredicateStatus(bool: actual.evaluate().description == description) - } -} -``` - -## Customizing Failure Messages - -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)>" -``` - -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 - -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) - } -} -``` - -In the example above, `msg` is defined based on the string given to -`Predicate.define`. The code looks akin to: - -```swift -// Swift - -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 - -To use a custom matcher written in Swift from Objective-C, you'll have -to extend the `NMBObjCMatcher` class, adding a new class method for your -custom matcher. The example below defines the class method -`+[NMBObjCMatcher beNilMatcher]`: - -```swift -// Swift - -extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualBlock, failureMessage, location in - let block = ({ actualBlock() as NSObject? }) - let expr = Expression(expression: block, location: location) - return beNil().matches(expr, failureMessage: failureMessage) - } - } -} -``` - -The above allows you to use the matcher from Objective-C: - -```objc -// Objective-C - -expect(actual).to([NMBObjCMatcher beNilMatcher]()); -``` - -To make the syntax easier to use, define a C function that calls the -class method: - -```objc -// Objective-C - -FOUNDATION_EXPORT id beNil() { - return [NMBObjCMatcher beNilMatcher]; -} -``` - -### Properly Handling `nil` in Objective-C Matchers - -When supporting Objective-C, make sure you handle `nil` appropriately. -Like [Cedar](https://github.com/pivotal/cedar/issues/100), -**most matchers do not match with nil**. This is to bring prevent test -writers from being surprised by `nil` values where they did not expect -them. - -Nimble provides the `beNil` matcher function for test writer that want -to make expectations on `nil` objects: - -```objc -// Objective-C - -expect(nil).to(equal(nil)); // fails -expect(nil).to(beNil()); // passes -``` - -If your matcher does not want to match with nil, you use `NonNilMatcherFunc` -and the `canMatchNil` constructor on `NMBObjCMatcher`. Using both types will -automatically generate expected value failure messages when they're nil. - -```swift - -public func beginWith(startingElement: T) -> NonNilMatcherFunc { - 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 - } -} - -extension NMBObjCMatcher { - public class func beginWithMatcher(expected: AnyObject) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = actualExpression.evaluate() - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return beginWith(expected).matches(expr, failureMessage: failureMessage) - } - } -} -``` - -## 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 - 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. - -## Installing Nimble as a Submodule - -To use Nimble as a submodule to test your macOS, iOS or tvOS applications, follow -these 4 easy steps: - -1. Clone the Nimble repository -2. Add Nimble.xcodeproj to the Xcode workspace for your project -3. Link Nimble.framework to your test target -4. Start writing expectations! - -For more detailed instructions on each of these steps, -read [How to Install Quick](https://github.com/Quick/Quick#how-to-install-quick). -Ignore the steps involving adding Quick to your project in order to -install just Nimble. - -## Installing Nimble via CocoaPods - -To use Nimble in CocoaPods to test your macOS, iOS or tvOS applications, add -Nimble to your podfile and add the ```use_frameworks!``` line to enable Swift -support for CocoaPods. - -```ruby -platform :ios, '8.0' - -source 'https://github.com/CocoaPods/Specs.git' - -# Whatever pods you need for your app go here - -target 'YOUR_APP_NAME_HERE_Tests', :exclusive => true do - use_frameworks! - pod 'Nimble', '~> 6.0.0' -end -``` - -Finally run `pod install`. - -## Using Nimble without XCTest - -Nimble is integrated with XCTest to allow it work well when used in Xcode test -bundles, however it can also be used in a standalone app. After installing -Nimble using one of the above methods, there are two additional steps required -to make this work. - -1. Create a custom assertion handler and assign an instance of it to the - global `NimbleAssertionHandler` variable. For example: - -```swift -class MyAssertionHandler : AssertionHandler { - func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) { - if (!assertion) { - print("Expectation failed: \(message.stringValue)") - } - } -} -``` -```swift -// Somewhere before you use any assertions -NimbleAssertionHandler = MyAssertionHandler() -``` - -2. Add a post-build action to fix an issue with the Swift XCTest support - library being unnecessarily copied into your app - * Edit your scheme in Xcode, and navigate to Build -> Post-actions - * Click the "+" icon and select "New Run Script Action" - * Open the "Provide build settings from" dropdown and select your target - * Enter the following script contents: -``` -rm "${SWIFT_STDLIB_TOOL_DESTINATION_DIR}/libswiftXCTest.dylib" -``` - -You can now use Nimble assertions in your code and handle failures as you see -fit. diff --git a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift deleted file mode 100644 index 196ee9a..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// 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/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m deleted file mode 100644 index 8cf414f..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m +++ /dev/null @@ -1,37 +0,0 @@ -// -// 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)(void)) { - @try { - inBlock(); - } @catch (NSException *exception) { - if ([exception isKindOfClass:type]) { - return exception; - } else { - @throw; - } - } - return nil; -} diff --git a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h deleted file mode 100644 index ae48c23..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// 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)(void)); - diff --git a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m deleted file mode 100644 index 8183196..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// 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/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h deleted file mode 100644 index 5755bfc..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h +++ /dev/null @@ -1,70 +0,0 @@ -// -// 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/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c deleted file mode 100644 index 733c564..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c +++ /dev/null @@ -1,537 +0,0 @@ -/* - * 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/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h deleted file mode 100644 index 52e53ae..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h +++ /dev/null @@ -1,321 +0,0 @@ -#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/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift deleted file mode 100644 index 91e5d4d..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// 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/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift deleted file mode 100644 index 6e84115..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift +++ /dev/null @@ -1,199 +0,0 @@ -// -// 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/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift deleted file mode 100644 index eb9bc19..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// CwlCatchBadInstructionPosix.swift -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 8/02/2016. -// 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 arch(x86_64) - - // This file is an alternative implementation to CwlCatchBadInstruction.swift that uses a SIGILL signal action and setenv/longjmp instead of a Mach exception handler and Objective-C exception raising. - // - // WARNING: - // This code is quick and dirty. It's a proof of concept for using a SIGILL handler and setjmp/longjmp where Mach exceptions and the Obj-C runtime aren't available. I ran the automated tests when I first wrote this code but I don't personally use it at all so by the time you're reading this comment, it probably broke and I didn't notice. - // Obvious limitations: - // * It doesn't work when debugging with lldb. - // * It doesn't scope correctly to the thread (it's global) - // * In violation of rules for signal handlers, it writes to the "red zone" on the stack - // * It isn't re-entrant - // * Plus all of the same caveats as the Mach exceptions version (doesn't play well with other handlers, probably leaks ARC memory, etc) - // Treat it like a loaded shotgun. Don't point it at your face. - - // This function is called from the signal handler to shut down the thread and return 1 (indicating a SIGILL was received). - private func callThreadExit() { - pthread_exit(UnsafeMutableRawPointer(bitPattern: 1)) - } - - // When called, this signal handler simulates a function call to `callThreadExit` - private func sigIllHandler(code: Int32, info: UnsafeMutablePointer<__siginfo>?, uap: UnsafeMutableRawPointer?) -> Void { - guard let context = uap?.assumingMemoryBound(to: ucontext64_t.self) else { return } - - // 1. Decrement the stack pointer - context.pointee.uc_mcontext64.pointee.__ss.__rsp -= __uint64_t(MemoryLayout.size) - - // 2. Save the old Instruction Pointer to the stack. - let rsp = context.pointee.uc_mcontext64.pointee.__ss.__rsp - if let ump = UnsafeMutablePointer<__uint64_t>(bitPattern: UInt(rsp)) { - ump.pointee = rsp - } - - // 3. Set the Instruction Pointer to the new function's address - var f: @convention(c) () -> Void = callThreadExit - withUnsafePointer(to: &f) { $0.withMemoryRebound(to: __uint64_t.self, capacity: 1) { ptr in - context.pointee.uc_mcontext64.pointee.__ss.__rip = ptr.pointee - } } - } - - /// Without Mach exceptions or the Objective-C runtime, there's nothing to put in the exception object. It's really just a boolean – either a SIGILL was caught or not. - public class BadInstructionException { - } - - /// Run the provided block. If a POSIX SIGILL is received, handle it and return a BadInstructionException (which is just an empty object in this POSIX signal version). 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 SIGILL is received, the block will be interrupted using a C `longjmp`. The risks associated with abrupt jumps apply here: most Swift functions are *not* interrupt-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 SIGILL is raised during the execution of `block` then a BadInstructionException will be returned, otherwise `nil`. - public func catchBadInstruction(block: @escaping () -> Void) -> BadInstructionException? { - // Construct the signal action - var sigActionPrev = sigaction() - let action = __sigaction_u(__sa_sigaction: sigIllHandler) - var sigActionNew = sigaction(__sigaction_u: action, sa_mask: sigset_t(), sa_flags: SA_SIGINFO) - - // Install the signal action - if sigaction(SIGILL, &sigActionNew, &sigActionPrev) != 0 { - fatalError("Sigaction error: \(errno)") - } - - defer { - // Restore the previous signal action - if sigaction(SIGILL, &sigActionPrev, nil) != 0 { - fatalError("Sigaction error: \(errno)") - } - } - - var b = block - let caught: Bool = withUnsafeMutablePointer(to: &b) { blockPtr in - // Run the block on its own thread - var handlerThread: pthread_t? = nil - let e = pthread_create(&handlerThread, nil, { arg in - (arg.assumingMemoryBound(to: (() -> Void).self).pointee)() - return nil - }, blockPtr) - precondition(e == 0, "Unable to create thread") - - // Wait for completion and get the result. It will be either `nil` or bitPattern 1 - var rawResult: UnsafeMutableRawPointer? = nil - let e2 = pthread_join(handlerThread!, &rawResult) - precondition(e2 == 0, "Thread join failed") - return Int(bitPattern: rawResult) != 0 - } - - return caught ? BadInstructionException() : nil - } - -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift deleted file mode 100644 index 8d99d5e..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift +++ /dev/null @@ -1,55 +0,0 @@ -// -// 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/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h deleted file mode 100644 index f9dbedd..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// 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/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h deleted file mode 100644 index 710afae..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// 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[]; diff --git a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/README.md b/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/README.md deleted file mode 100644 index a1a9a70..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# CwlPreconditionTesting - -A Mach exception handler, written in Swift and Objective-C, that allows `EXC_BAD_INSTRUCTION` (as raised by Swift's `assertionFailure`/`preconditionFailure`/`fatalError`) to be caught and tested. - -For an extended discussion of this code, please see the Cocoa with Love article: - -[Partial functions in Swift, Part 2: Catching precondition failures](http://cocoawithlove.com/blog/2016/02/02/partial-functions-part-two-catching-precondition-failures.html) - -## Usage - -The short version is: - -1. `git clone https://github.com/mattgallagher/CwlPreconditionTesting.git` -2. drag the "CwlPreconditionTesting.xcodeproj" file into your project's file tree in Xcode -3. go to your testing target's Build Phase settings and under "Target Dependencies" press the "+" button and select the relevant "CwlPreconditionTesting" target ("_iOS" or "_OSX", depending on your testing target's SDK) -4. write `import CwlPreconditionTesting` at the top of any test file where you want to use `catchBadInstruction` (Swift should handle the linkage automatically when you do this) -5. use the `catchBadInstruction` function as shown in the [CwlCatchBadInstructionTests.swift tests file](https://github.com/mattgallagher/CwlPreconditionTesting/blob/master/CwlPreconditionTestingTests/CwlCatchBadInstructionTests.swift?ts=4) - -### Project details - -The "CwlPreconditionTesting.xcodeproj" contains two targets: - -* CwlPreconditionTesting_OSX -* CwlPreconditionTesting_iOS - -both build a framework named "CwlPreconditionTesting.framework". If you're linking manually, be certain to select the "CwlPreconditionTesting.framework" from the appropriate target. - -Remember: the iOS build is useful only in the simulator. All Mach exception handling code will be conditionally excluded in any device build. - -### Static inclusion - -Due to the complications associated with needing to call into and out of Objective-C, static inclusion in other projects is not a single file nor a quick drag and drop. There's at least 7 files and you'll need to add some project settings. - -All of the following files: - -* CwlCatchBadInstruction.swift -* CwlCatchBadInstruction.h -* CwlCatchBadInstruction.m -* CwlCatchException.swift -* CwlCatchException.h -* CwlCatchException.m - -and either: - -* $(SDKROOT)/usr/include/mach/mach_exc.defs -* mach_excServer.c - -need to be added to the testing target for OS X projects or iOS projects, respectively. - -Your target will also need to have the following macros defined in the "Apple LLVM - Preprocessing" → "Preprocessor Macros" build setting: - - PRODUCT_NAME=$(PRODUCT_NAME) - -This lets the Objective-C file generate the include directive for the autogenerated Swift header so it can call back into Swift during the Mach exception handler callbacks. This macro should stay in sync if you change the target name but if you do anything else in your project that changes the name of the autogenerated Swift header independent of the target name (or you want to add spaces or other command-line complications to the target name), you'll want to update "CwlCatchBadInstruction.m" directly with the correct include directive. - -Additionally, you'll need a standard Objective-C "Bridging header" for your testing target and it will need to include the following import statements: - -``` -#if defined(__x86_64__) -#import -#endif - -#import -``` - -### Using POSIX signals and setjmp/longjmp - -For comparison or for anyone running this code on a platform without Mach exceptions or the Objective-C runtime, I've added a proof-of-concept implementation of `catchBadInstruction` that uses a POSIX SIGILL `sigaction` and `setjmp`/`longjmp` to perform the throw. - -In Xcode, you can simply select the CwlPreconditionTesting_POSIX target (instead of the OSX or iOS targets). If you're building without Xcode: all you need is the CwlCatchBadInstructionPOSIX.swift file (compared to the Mach exception handler, the code is tiny doesn't have any weird Objective-C/MiG file dependencies). - -**Warning No. 1**: on OS X, this approach can't be used when lldb is attached since lldb's Mach exception handler blocks the SIGILL from ever occurring (I've disabled the "Debug Executable" setting for the tests in Xcode - re-enable it to witness the problem). - -**Warning No. 2**: if you're switching between the CwlPreconditionTesting_OSX and CwlPreconditionTesting_POSIX targets, Xcode (as of Xcode 7.2.1) will not detect the change and will not remove the old framework correctly so you'll need to *clean your project* otherwise the old framework will hang around. - -Additional problems in decreasing severity include: - -* the signal handler is whole process (rather than correctly scoped to the thread where the "catch" occurs) -* the signal handler doesn't deal with re-entrancy whereas the mach exception handler remains deterministic in the face of multiple fatal errors -* the signal handler overwrites the "[red zone](https://en.wikipedia.org/wiki/Red_zone_(computing))" which is technically frowned upon in signal handlers (although unlikely to cause problems here) diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift deleted file mode 100644 index 2e58fdf..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation - -/// Protocol for the assertion handler that Nimble uses for all expectations. -public protocol AssertionHandler { - func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) -} - -/// Global backing interface for assertions that Nimble creates. -/// Defaults to a private test handler that passes through to XCTest. -/// -/// If XCTest is not available, you must assign your own assertion handler -/// before using any matchers, otherwise Nimble will abort the program. -/// -/// @see AssertionHandler -public var NimbleAssertionHandler: AssertionHandler = { () -> AssertionHandler in - return isXCTestAvailable() ? NimbleXCTestHandler() : NimbleXCTestUnavailableHandler() -}() diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift deleted file mode 100644 index 94a9030..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift +++ /dev/null @@ -1,19 +0,0 @@ -/// AssertionDispatcher allows multiple AssertionHandlers to receive -/// assertion messages. -/// -/// @warning Does not fully dispatch if one of the handlers raises an exception. -/// This is possible with XCTest-based assertion handlers. -/// -public class AssertionDispatcher: AssertionHandler { - let handlers: [AssertionHandler] - - public init(handlers: [AssertionHandler]) { - self.handlers = handlers - } - - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - for handler in handlers { - handler.assert(assertion, message: message, location: location) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift deleted file mode 100644 index 740c392..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift +++ /dev/null @@ -1,100 +0,0 @@ -import Foundation - -/// A data structure that stores information about an assertion when -/// AssertionRecorder is set as the Nimble assertion handler. -/// -/// @see AssertionRecorder -/// @see AssertionHandler -public struct AssertionRecord: CustomStringConvertible { - /// Whether the assertion succeeded or failed - public let success: Bool - /// The failure message the assertion would display on failure. - public let message: FailureMessage - /// The source location the expectation occurred on. - public let location: SourceLocation - - public var description: String { - return "AssertionRecord { success=\(success), message='\(message.stringValue)', location=\(location) }" - } -} - -/// An AssertionHandler that silently records assertions that Nimble makes. -/// This is useful for testing failure messages for matchers. -/// -/// @see AssertionHandler -public class AssertionRecorder: AssertionHandler { - /// All the assertions that were captured by this recorder - public var assertions = [AssertionRecord]() - - public init() {} - - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - assertions.append( - AssertionRecord( - success: assertion, - message: message, - location: location)) - } -} - -/// Allows you to temporarily replace the current Nimble assertion handler with -/// the one provided for the scope of the closure. -/// -/// Once the closure finishes, then the original Nimble assertion handler is restored. -/// -/// @see AssertionHandler -public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler, closure: () throws -> Void) { - let environment = NimbleEnvironment.activeInstance - let oldRecorder = environment.assertionHandler - let capturer = NMBExceptionCapture(handler: nil, finally: ({ - environment.assertionHandler = oldRecorder - })) - environment.assertionHandler = tempAssertionHandler - capturer.tryBlock { - try! closure() - } -} - -/// Captures expectations that occur in the given closure. Note that all -/// expectations will still go through to the default Nimble handler. -/// -/// This can be useful if you want to gather information about expectations -/// that occur within a closure. -/// -/// @param silently expectations are no longer send to the default Nimble -/// assertion handler when this is true. Defaults to false. -/// -/// @see gatherFailingExpectations -public func gatherExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { - let previousRecorder = NimbleEnvironment.activeInstance.assertionHandler - let recorder = AssertionRecorder() - let handlers: [AssertionHandler] - - if silently { - handlers = [recorder] - } else { - handlers = [recorder, previousRecorder] - } - - let dispatcher = AssertionDispatcher(handlers: handlers) - withAssertionHandler(dispatcher, closure: closure) - return recorder.assertions -} - -/// Captures failed expectations that occur in the given closure. Note that all -/// expectations will still go through to the default Nimble handler. -/// -/// This can be useful if you want to gather information about failed -/// expectations that occur within a closure. -/// -/// @param silently expectations are no longer send to the default Nimble -/// assertion handler when this is true. Defaults to false. -/// -/// @see gatherExpectations -/// @see raiseException source for an example use case. -public func gatherFailingExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { - let assertions = gatherExpectations(silently: silently, closure: closure) - return assertions.filter { assertion in - !assertion.success - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift deleted file mode 100644 index 88d9406..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift +++ /dev/null @@ -1,187 +0,0 @@ -import Foundation - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - -private func from(objcPredicate: NMBPredicate) -> Predicate { - return Predicate { actualExpression in - let result = objcPredicate.satisfies(({ try! actualExpression.evaluate() }), - location: actualExpression.location) - return result.toSwift() - } -} - -internal struct ObjCMatcherWrapper: Matcher { - let matcher: NMBMatcher - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.matches( - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.doesNotMatch( - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) - } -} - -// Equivalent to Expectation, but for Nimble's Objective-C interface -public class NMBExpectation: NSObject { - internal let _actualBlock: () -> NSObject! - internal var _negative: Bool - internal let _file: FileString - internal let _line: UInt - internal var _timeout: TimeInterval = 1.0 - - @objc public init(actualBlock: @escaping () -> NSObject!, negative: Bool, file: FileString, line: UInt) { - self._actualBlock = actualBlock - self._negative = negative - self._file = file - self._line = line - } - - private var expectValue: Expectation { - return expect(_file, line: _line) { - self._actualBlock() as NSObject? - } - } - - @objc public var withTimeout: (TimeInterval) -> NMBExpectation { - return ({ timeout in self._timeout = timeout - return self - }) - } - - @objc public var to: (NMBMatcher) -> Void { - return ({ matcher in - if let pred = matcher as? NMBPredicate { - self.expectValue.to(from(objcPredicate: pred)) - } else { - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher)) - } - }) - } - - @objc public var toWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - if let pred = matcher as? NMBPredicate { - self.expectValue.to(from(objcPredicate: pred), description: description) - } else { - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher), description: description) - } - }) - } - - @objc public var toNot: (NMBMatcher) -> Void { - return ({ matcher in - if let pred = matcher as? NMBPredicate { - self.expectValue.toNot(from(objcPredicate: pred)) - } else { - self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher)) - } - }) - } - - @objc public var toNotWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - if let pred = matcher as? NMBPredicate { - self.expectValue.toNot(from(objcPredicate: pred), description: description) - } else { - self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher), description: description) - } - }) - } - - @objc public var notTo: (NMBMatcher) -> Void { return toNot } - - @objc public var notToWithDescription: (NMBMatcher, String) -> Void { return toNotWithDescription } - - @objc public var toEventually: (NMBMatcher) -> Void { - return ({ matcher in - 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 - ) - } - }) - } - - @objc public var toEventuallyWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - 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 - ) - } - }) - } - - @objc public var toEventuallyNot: (NMBMatcher) -> Void { - return ({ matcher in - 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 - ) - } - }) - } - - @objc public var toEventuallyNotWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - 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 - ) - } - }) - } - - @objc public var toNotEventually: (NMBMatcher) -> Void { - return toEventuallyNot - } - - @objc public var toNotEventuallyWithDescription: (NMBMatcher, String) -> Void { - return toEventuallyNotWithDescription - } - - @objc public class func failWithMessage(_ message: String, file: FileString, line: UInt) { - fail(message, location: SourceLocation(file: file, line: line)) - } -} - -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift deleted file mode 100644 index 9ba2ffa..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift +++ /dev/null @@ -1,83 +0,0 @@ -import Foundation - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -// swiftlint:disable line_length -public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) -> Bool -public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) -> Bool -// swiftlint:enable line_length - -public class NMBObjCMatcher: NSObject, NMBMatcher { - let _match: MatcherBlock - let _doesNotMatch: MatcherBlock - let canMatchNil: Bool - - public init(canMatchNil: Bool, matcher: @escaping MatcherBlock, notMatcher: @escaping MatcherBlock) { - self.canMatchNil = canMatchNil - self._match = matcher - self._doesNotMatch = notMatcher - } - - public convenience init(matcher: @escaping MatcherBlock) { - self.init(canMatchNil: true, matcher: matcher) - } - - public convenience init(canMatchNil: Bool, matcher: @escaping MatcherBlock) { - self.init(canMatchNil: canMatchNil, matcher: matcher, notMatcher: ({ actualExpression, failureMessage in - return !matcher(actualExpression, failureMessage) - })) - } - - public convenience init(matcher: @escaping FullMatcherBlock) { - self.init(canMatchNil: true, matcher: matcher) - } - - public convenience init(canMatchNil: Bool, matcher: @escaping FullMatcherBlock) { - self.init(canMatchNil: canMatchNil, matcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, false) - }), notMatcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, true) - })) - } - - private func canMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - do { - if !canMatchNil { - if try actualExpression.evaluate() == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - return false - } - } - } catch let error { - failureMessage.actualValue = "an unexpected error thrown: \(error)" - return false - } - return true - } - - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let expr = Expression(expression: actualBlock, location: location) - let result = _match( - expr, - failureMessage) - if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { - return result - } else { - return false - } - } - - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let expr = Expression(expression: actualBlock, location: location) - let result = _doesNotMatch( - expr, - failureMessage) - if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { - return result - } else { - return false - } - } -} - -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift deleted file mode 100644 index e1b5432..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Dispatch -import Foundation - -/// "Global" state of Nimble is stored here. Only DSL functions should access / be aware of this -/// class' existence -internal class NimbleEnvironment { - static var activeInstance: NimbleEnvironment { - get { - let env = Thread.current.threadDictionary["NimbleEnvironment"] - if let env = env as? NimbleEnvironment { - return env - } else { - let newEnv = NimbleEnvironment() - self.activeInstance = newEnv - return newEnv - } - } - set { - Thread.current.threadDictionary["NimbleEnvironment"] = newValue - } - } - - // TODO: eventually migrate the global to this environment value - var assertionHandler: AssertionHandler { - get { return NimbleAssertionHandler } - set { NimbleAssertionHandler = newValue } - } - - var suppressTVOSAssertionWarning: Bool = false - var awaiter: Awaiter - - init() { - let timeoutQueue: DispatchQueue - if #available(OSX 10.10, *) { - timeoutQueue = DispatchQueue.global(qos: .userInitiated) - } else { - timeoutQueue = DispatchQueue.global(priority: .high) - } - - awaiter = Awaiter( - waitLock: AssertionWaitLock(), - asyncQueue: .main, - timeoutQueue: timeoutQueue) - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift deleted file mode 100644 index 0ad8590..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift +++ /dev/null @@ -1,81 +0,0 @@ -import Foundation -import XCTest - -/// Default handler for Nimble. This assertion handler passes failures along to -/// XCTest. -public class NimbleXCTestHandler: AssertionHandler { - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - if !assertion { - recordFailure("\(message.stringValue)\n", location: location) - } - } -} - -/// Alternative handler for Nimble. This assertion handler passes failures along -/// to XCTest by attempting to reduce the failure message size. -public class NimbleShortXCTestHandler: AssertionHandler { - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - if !assertion { - let msg: String - if let actual = message.actualValue { - msg = "got: \(actual) \(message.postfixActual)" - } else { - msg = "expected \(message.to) \(message.postfixMessage)" - } - recordFailure("\(msg)\n", location: location) - } - } -} - -/// Fallback handler in case XCTest is unavailable. This assertion handler will abort -/// the program if it is invoked. -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 !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() - - private(set) var currentTestCase: XCTestCase? - - @objc func testCaseWillStart(_ testCase: XCTestCase) { - currentTestCase = testCase - } - - @objc func testCaseDidFinish(_ testCase: XCTestCase) { - currentTestCase = nil - } -} -#endif - -func isXCTestAvailable() -> Bool { -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - // XCTest is weakly linked and so may not be present - return NSClassFromString("XCTestCase") != nil -#else - return true -#endif -} - -private func recordFailure(_ message: String, location: SourceLocation) { -#if SWIFT_PACKAGE - XCTFail("\(message)", file: location.file, line: location.line) -#else - if let testCase = CurrentTestCaseTracker.sharedInstance.currentTestCase { - #if swift(>=4) - let line = Int(location.line) - #else - let line = location.line - #endif - testCase.recordFailure(withDescription: message, inFile: location.file, atLine: line, expected: true) - } else { - let msg = "Attempted to report a test failure to XCTest while no test case was running. " + - "The failure was:\n\"\(message)\"\nIt occurred at: \(location.file):\(location.line)" - NSException(name: .internalInconsistencyException, reason: msg, userInfo: nil).raise() - } -#endif -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift deleted file mode 100644 index 8f8d360..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) -// swift-corelibs-foundation doesn't provide NSException at all, so provide a dummy -class NSException {} -#endif - -// NOTE: This file is not intended to be included in the Xcode project. It -// is picked up by the Swift Package Manager during its build process. - -/// A dummy reimplementation of the `NMBExceptionCapture` class to serve -/// as a stand-in for build and runtime environments that don't support -/// Objective C. -internal class ExceptionCapture { - let finally: (() -> Void)? - - init(handler: ((NSException) -> Void)?, finally: (() -> Void)?) { - self.finally = finally - } - - func tryBlock(_ unsafeBlock: (() -> Void)) { - // We have no way of handling Objective C exceptions in Swift, - // so we just go ahead and run the unsafeBlock as-is - unsafeBlock() - - finally?() - } -} - -/// Compatibility with the actual Objective-C implementation -typealias NMBExceptionCapture = ExceptionCapture diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/DSL+Wait.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/DSL+Wait.swift deleted file mode 100644 index a84682f..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/DSL+Wait.swift +++ /dev/null @@ -1,116 +0,0 @@ -import Dispatch -import Foundation - -private enum ErrorResult { - case exception(NSException) - case error(Error) - case none -} - -/// Only classes, protocols, methods, properties, and subscript declarations can be -/// bridges to Objective-C via the @objc keyword. This class encapsulates callback-style -/// asynchronous waiting logic so that it may be called from Objective-C and Swift. -internal class NMBWait: NSObject { -// About these kind of lines, `@objc` attributes are only required for Objective-C -// support, so that should be conditional on Darwin platforms and normal Xcode builds -// (non-SwiftPM builds). -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objc - internal class func until( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) -> Void) { - return throwableUntil(timeout: timeout, file: file, line: line) { done in - action(done) - } - } -#else - internal class func until( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) -> Void) { - return throwableUntil(timeout: timeout, file: file, line: line) { done in - action(done) - } - } -#endif - - // Using a throwable closure makes this method not objc compatible. - internal class func throwableUntil( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) throws -> Void) { - let awaiter = NimbleEnvironment.activeInstance.awaiter - let leeway = timeout / 2.0 - // swiftlint:disable:next line_length - let result = awaiter.performBlock(file: file, line: line) { (done: @escaping (ErrorResult) -> Void) throws -> Void in - DispatchQueue.main.async { - let capture = NMBExceptionCapture( - handler: ({ exception in - done(.exception(exception)) - }), - finally: ({ }) - ) - capture.tryBlock { - do { - try action { - done(.none) - } - } catch let e { - done(.error(e)) - } - } - } - }.timeout(timeout, forcefullyAbortTimeout: leeway).wait("waitUntil(...)", file: file, line: line) - - switch result { - case .incomplete: internalError("Reached .incomplete state for waitUntil(...).") - case .blockedRunLoop: - fail(blockedRunLoopErrorMessageFor("-waitUntil()", leeway: leeway), - file: file, line: line) - case .timedOut: - let pluralize = (timeout == 1 ? "" : "s") - fail("Waited more than \(timeout) second\(pluralize)", file: file, line: line) - case let .raisedException(exception): - fail("Unexpected exception raised: \(exception)") - case let .errorThrown(error): - fail("Unexpected error thrown: \(error)") - case .completed(.exception(let exception)): - fail("Unexpected exception raised: \(exception)") - case .completed(.error(let error)): - fail("Unexpected error thrown: \(error)") - case .completed(.none): // success - break - } - } - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objc(untilFile:line:action:) - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) { - until(timeout: 1, file: file, line: line, action: action) - } -#else - 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 { - // swiftlint:disable:next line_length - return "\(fnName) timed out but was unable to run the timeout handler because the main thread is unresponsive (\(leeway) seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." -} - -/// Wait asynchronously until the done closure is called or the timeout has been reached. -/// -/// @discussion -/// Call the done() closure to indicate the waiting has completed. -/// -/// 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) { - NMBWait.until(timeout: timeout, file: file, line: line, action: action) -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/DSL.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/DSL.swift deleted file mode 100644 index e49bb0c..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/DSL.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation - -/// Make an expectation on a given actual value. The value given is lazily evaluated. -public func expect(_ expression: @autoclosure @escaping () throws -> T?, file: FileString = #file, line: UInt = #line) -> Expectation { - return Expectation( - expression: Expression( - expression: expression, - location: SourceLocation(file: file, line: line), - isClosure: true)) -} - -/// Make an expectation on a given actual value. The closure is lazily invoked. -public func expect(_ file: FileString = #file, line: UInt = #line, expression: @escaping () throws -> T?) -> Expectation { - return Expectation( - expression: Expression( - expression: expression, - location: SourceLocation(file: file, line: line), - isClosure: true)) -} - -/// Always fails the test with a message and a specified location. -public func fail(_ message: String, location: SourceLocation) { - let handler = NimbleEnvironment.activeInstance.assertionHandler - handler.assert(false, message: FailureMessage(stringValue: message), location: location) -} - -/// Always fails the test with a message. -public func fail(_ message: String, file: FileString = #file, line: UInt = #line) { - fail(message, location: SourceLocation(file: file, line: line)) -} - -/// Always fails the test. -public func fail(_ file: FileString = #file, line: UInt = #line) { - fail("fail() always fails", file: file, line: line) -} - -/// Like Swift's precondition(), but raises NSExceptions instead of sigaborts -internal func nimblePrecondition( - _ expr: @autoclosure() -> Bool, - _ name: @autoclosure() -> String, - _ message: @autoclosure() -> String, - file: StaticString = #file, - line: UInt = #line) { - let result = expr() - if !result { -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let e = NSException( - name: NSExceptionName(name()), - reason: message(), - userInfo: nil) - e.raise() -#else - preconditionFailure("\(name()) - \(message())", file: file, line: line) -#endif - } -} - -internal func internalError(_ msg: String, file: FileString = #file, line: UInt = #line) -> Never { - fatalError( - "Nimble Bug Found: \(msg) at \(file):\(line).\n" + - "Please file a bug to Nimble: https://github.com/Quick/Nimble/issues with the " + - "code snippet that caused this error." - ) -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Expectation.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Expectation.swift deleted file mode 100644 index e3f616a..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Expectation.swift +++ /dev/null @@ -1,132 +0,0 @@ -import Foundation - -// Deprecated -internal func expressionMatches(_ expression: Expression, matcher: U, to: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T { - let msg = FailureMessage() - msg.userDescription = description - msg.to = to - do { - let pass = try matcher.matches(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" - } - return (pass, msg) - } catch let 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 { - let msg = FailureMessage() - msg.userDescription = description - msg.to = toNot - do { - let pass = try matcher.doesNotMatch(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" - } - return (pass, msg) - } catch let 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 - - public func verify(_ pass: Bool, _ message: FailureMessage) { - let handler = NimbleEnvironment.activeInstance.assertionHandler - handler.assert(pass, message: message, location: expression.location) - } - - ////////////////// OLD API ///////////////////// - - /// DEPRECATED: Tests the actual value using a matcher to match. - public func to(_ matcher: U, description: String? = nil) - where U: Matcher, U.ValueType == T { - let (pass, msg) = expressionMatches(expression, matcher: matcher, to: "to", description: description) - verify(pass, msg) - } - - /// DEPRECATED: Tests the actual value using a matcher to not match. - public func toNot(_ matcher: U, description: String? = nil) - where U: Matcher, U.ValueType == T { - // swiftlint:disable:next line_length - let (pass, msg) = expressionDoesNotMatch(expression, matcher: matcher, toNot: "to not", description: description) - verify(pass, msg) - } - - /// 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 { - 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/Carthage/Checkouts/Nimble/Sources/Nimble/ExpectationMessage.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/ExpectationMessage.swift deleted file mode 100644 index 992ee0e..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/ExpectationMessage.swift +++ /dev/null @@ -1,262 +0,0 @@ -import Foundation - -public indirect enum ExpectationMessage { - // --- Primary Expectations --- - /// includes actual value in output ("expected to , got ") - case expectedActualValueTo(/* message: */ String) - /// uses a custom actual value string in output ("expected to , got ") - case expectedCustomValueTo(/* message: */ String, /* actual: */ String) - /// excludes actual value in output ("expected to ") - case expectedTo(/* message: */ String) - /// allows any free-form message ("") - case fail(/* message: */ String) - - // --- Composite Expectations --- - // Generally, you'll want the methods, appended(message:) and appended(details:) instead. - - /// Not Fully Implemented Yet. - case prepends(/* Prepended Message */ String, ExpectationMessage) - - /// appends after an existing message (" (use beNil() to match nils)") - case appends(ExpectationMessage, /* Appended Message */ String) - - /// provides long-form multi-line explainations ("\n\n") - case details(ExpectationMessage, String) - - internal var sampleMessage: String { - let asStr = toString(actual: "", expected: "expected", to: "to") - let asFailureMessage = FailureMessage() - update(failureMessage: asFailureMessage) - // swiftlint:disable:next line_length - return "(toString(actual:expected:to:) -> \(asStr) || update(failureMessage:) -> \(asFailureMessage.stringValue))" - } - - /// Returns the smallest message after the "expected to" string that summarizes the error. - /// - /// Returns the message part from ExpectationMessage, ignoring all .appends and .details. - public var expectedMessage: String { - switch self { - case let .fail(msg): - return msg - case let .expectedTo(msg): - return msg - case let .expectedActualValueTo(msg): - return msg - case let .expectedCustomValueTo(msg, _): - return msg - case let .prepends(_, expectation): - return expectation.expectedMessage - case let .appends(expectation, msg): - return "\(expectation.expectedMessage)\(msg)" - case let .details(expectation, _): - return expectation.expectedMessage - } - } - - /// Appends a message after the primary expectation message - public func appended(message: String) -> ExpectationMessage { - switch self { - case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo, .appends, .prepends: - return .appends(self, message) - case let .details(expectation, msg): - return .details(expectation.appended(message: message), msg) - } - } - - /// Appends a message hinting to use beNil() for when the actual value given was nil. - public func appendedBeNilHint() -> ExpectationMessage { - return appended(message: " (use beNil() to match nils)") - } - - /// Appends a detailed (aka - multiline) message after the primary expectation message - /// Detailed messages will be placed after .appended(message:) calls. - public func appended(details: String) -> ExpectationMessage { - return .details(self, details) - } - - internal func visitLeafs(_ f: (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage { - switch self { - case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo: - return f(self) - case let .prepends(msg, expectation): - return .prepends(msg, expectation.visitLeafs(f)) - case let .appends(expectation, msg): - return .appends(expectation.visitLeafs(f), msg) - case let .details(expectation, msg): - return .details(expectation.visitLeafs(f), msg) - } - } - - /// Replaces a primary expectation with one returned by f. Preserves all composite expectations - /// that were built upon it (aka - all appended(message:) and appended(details:). - public func replacedExpectation(_ f: @escaping (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage { - func walk(_ msg: ExpectationMessage) -> ExpectationMessage { - switch msg { - case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo: - return f(msg) - default: - return msg - } - } - return visitLeafs(walk) - } - - /// Wraps a primary expectation with text before and after it. - /// Alias to prepended(message: before).appended(message: after) - public func wrappedExpectation(before: String, after: String) -> ExpectationMessage { - return prepended(expectation: before).appended(message: after) - } - - /// Prepends a message by modifying the primary expectation - public func prepended(expectation message: String) -> ExpectationMessage { - func walk(_ msg: ExpectationMessage) -> ExpectationMessage { - switch msg { - case let .expectedTo(msg): - return .expectedTo(message + msg) - case let .expectedActualValueTo(msg): - return .expectedActualValueTo(message + msg) - case let .expectedCustomValueTo(msg, actual): - return .expectedCustomValueTo(message + msg, actual) - default: - return msg.visitLeafs(walk) - } - } - return visitLeafs(walk) - } - - // TODO: test & verify correct behavior - internal func prepended(message: String) -> ExpectationMessage { - return .prepends(message, self) - } - - /// Converts the tree of ExpectationMessages into a final built string. - public func toString(actual: String, expected: String = "expected", to: String = "to") -> String { - switch self { - case let .fail(msg): - return msg - case let .expectedTo(msg): - return "\(expected) \(to) \(msg)" - case let .expectedActualValueTo(msg): - return "\(expected) \(to) \(msg), got \(actual)" - case let .expectedCustomValueTo(msg, actual): - return "\(expected) \(to) \(msg), got \(actual)" - case let .prepends(msg, expectation): - return "\(msg)\(expectation.toString(actual: actual, expected: expected, to: to))" - case let .appends(expectation, msg): - return "\(expectation.toString(actual: actual, expected: expected, to: to))\(msg)" - case let .details(expectation, msg): - return "\(expectation.toString(actual: actual, expected: expected, to: to))\n\n\(msg)" - } - } - - // Backwards compatibility: converts ExpectationMessage tree to FailureMessage - internal func update(failureMessage: FailureMessage) { - switch self { - case let .fail(msg): - 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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -public class NMBExpectationMessage: NSObject { - private let msg: ExpectationMessage - - internal init(swift msg: ExpectationMessage) { - self.msg = msg - } - - public init(expectedTo message: String) { - self.msg = .expectedTo(message) - } - public init(expectedActualValueTo message: String) { - self.msg = .expectedActualValueTo(message) - } - - public init(expectedActualValueTo message: String, customActualValue actual: String) { - self.msg = .expectedCustomValueTo(message, actual) - } - - public init(fail message: String) { - self.msg = .fail(message) - } - - public init(prepend message: String, child: NMBExpectationMessage) { - self.msg = .prepends(message, child.msg) - } - - public init(appendedMessage message: String, child: NMBExpectationMessage) { - self.msg = .appends(child.msg, message) - } - - public init(prependedMessage message: String, child: NMBExpectationMessage) { - self.msg = .prepends(message, child.msg) - } - - public init(details message: String, child: NMBExpectationMessage) { - self.msg = .details(child.msg, message) - } - - public func appendedBeNilHint() -> NMBExpectationMessage { - return NMBExpectationMessage(swift: msg.appendedBeNilHint()) - } - - public func toSwift() -> ExpectationMessage { return self.msg } -} - -extension ExpectationMessage { - func toObjectiveC() -> NMBExpectationMessage { - return NMBExpectationMessage(swift: self) - } -} - -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Expression.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Expression.swift deleted file mode 100644 index 5a233fd..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Expression.swift +++ /dev/null @@ -1,99 +0,0 @@ -import Foundation - -// Memoizes the given closure, only calling the passed -// closure once; even if repeat calls to the returned closure -internal func memoizedClosure(_ closure: @escaping () throws -> T) -> (Bool) throws -> T { - var cache: T? - return ({ withoutCaching in - if withoutCaching || cache == nil { - cache = try closure() - } - return cache! - }) -} - -/// Expression represents the closure of the value inside expect(...). -/// Expressions are memoized by default. This makes them safe to call -/// evaluate() multiple times without causing a re-evaluation of the underlying -/// closure. -/// -/// @warning Since the closure can be any code, Objective-C code may choose -/// to raise an exception. Currently, Expression does not memoize -/// exception raising. -/// -/// This provides a common consumable API for matchers to utilize to allow -/// Nimble to change internals to how the captured closure is managed. -public struct Expression { - internal let _expression: (Bool) throws -> T? - internal let _withoutCaching: Bool - public let location: SourceLocation - public let isClosure: Bool - - /// Creates a new expression struct. Normally, expect(...) will manage this - /// creation process. The expression is memoized. - /// - /// @param expression The closure that produces a given value. - /// @param location The source location that this closure originates from. - /// @param isClosure A bool indicating if the captured expression is a - /// closure or internally produced closure. Some matchers - /// may require closures. For example, toEventually() - /// requires an explicit closure. This gives Nimble - /// flexibility if @autoclosure behavior changes between - /// Swift versions. Nimble internals always sets this true. - public init(expression: @escaping () throws -> T?, location: SourceLocation, isClosure: Bool = true) { - self._expression = memoizedClosure(expression) - self.location = location - self._withoutCaching = false - self.isClosure = isClosure - } - - /// Creates a new expression struct. Normally, expect(...) will manage this - /// creation process. - /// - /// @param expression The closure that produces a given value. - /// @param location The source location that this closure originates from. - /// @param withoutCaching Indicates if the struct should memoize the given - /// closure's result. Subsequent evaluate() calls will - /// not call the given closure if this is true. - /// @param isClosure A bool indicating if the captured expression is a - /// closure or internally produced closure. Some matchers - /// may require closures. For example, toEventually() - /// requires an explicit closure. This gives Nimble - /// flexibility if @autoclosure behavior changes between - /// Swift versions. Nimble internals always sets this true. - public init(memoizedExpression: @escaping (Bool) throws -> T?, location: SourceLocation, withoutCaching: Bool, isClosure: Bool = true) { - self._expression = memoizedExpression - self.location = location - self._withoutCaching = withoutCaching - self.isClosure = isClosure - } - - /// Returns a new Expression from the given expression. Identical to a map() - /// on this type. This should be used only to typecast the Expression's - /// closure value. - /// - /// The returned expression will preserve location and isClosure. - /// - /// @param block The block that can cast the current Expression value to a - /// new type. - public func cast(_ block: @escaping (T?) throws -> U?) -> Expression { - return Expression( - expression: ({ try block(self.evaluate()) }), - location: self.location, - isClosure: self.isClosure - ) - } - - public func evaluate() throws -> T? { - return try self._expression(_withoutCaching) - } - - public func withoutCaching() -> Expression { - return Expression( - memoizedExpression: self._expression, - location: location, - withoutCaching: true, - isClosure: isClosure - ) - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/FailureMessage.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/FailureMessage.swift deleted file mode 100644 index 2bc57eb..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/FailureMessage.swift +++ /dev/null @@ -1,92 +0,0 @@ -import Foundation - -/// Encapsulates the failure message that matchers can report to the end user. -/// -/// This is shared state between Nimble and matchers that mutate this value. -public class FailureMessage: NSObject { - public var expected: String = "expected" - public var actualValue: String? = "" // empty string -> use default; nil -> exclude - public var to: String = "to" - public var postfixMessage: String = "match" - public var postfixActual: String = "" - /// 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? - public var userDescription: String? - - public var stringValue: String { - get { - if let value = _stringValueOverride { - return value - } else { - return computeStringValue() - } - } - set { - _stringValueOverride = newValue - } - } - - internal var _stringValueOverride: String? - internal var hasOverriddenStringValue: Bool { - return _stringValueOverride != nil - } - - public override init() { - } - - public init(stringValue: String) { - _stringValueOverride = stringValue - } - - internal func stripNewlines(_ str: String) -> String { - let whitespaces = CharacterSet.whitespacesAndNewlines - return str - .components(separatedBy: "\n") - .map { line in line.trimmingCharacters(in: whitespaces) } - .joined(separator: "") - } - - internal func computeStringValue() -> String { - var value = "\(expected) \(to) \(postfixMessage)" - if let actualValue = actualValue { - value = "\(expected) \(to) \(postfixMessage), got \(actualValue)\(postfixActual)" - } - value = stripNewlines(value) - - if let extendedMessage = extendedMessage { - value += "\n\(stripNewlines(extendedMessage))" - } - - 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/Carthage/Checkouts/Nimble/Sources/Nimble/Info.plist b/Carthage/Checkouts/Nimble/Sources/Nimble/Info.plist deleted file mode 100644 index 6ac80b8..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSHumanReadableCopyright - Copyright © 2014 Jeff Hui. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AllPass.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AllPass.swift deleted file mode 100644 index 8affa62..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AllPass.swift +++ /dev/null @@ -1,121 +0,0 @@ -import Foundation - -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?) 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(_ elementMatcher: M) -> Predicate - where S: Sequence, M: Matcher, S.Iterator.Element == M.ValueType { - return createPredicate(elementMatcher.predicate) -} - -public func allPass(_ elementPredicate: Predicate) -> Predicate - where S: Sequence { - return createPredicate(elementPredicate) -} - -private func 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) - 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) - } - } - failure = failure.replacedExpectation({ expectation in - return .expectedTo(expectation.expectedMessage) - }) - return PredicateResult(status: .matches, message: failure) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc 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 { - var generator = NSFastEnumerationIterator(value) - while let obj = generator.next() { - if let nsObject = obj as? NSObject { - nsObjects.append(nsObject) - } else { - collectionIsUsable = false - break - } - } - } else { - collectionIsUsable = false - } - - if !collectionIsUsable { - return NMBPredicateResult( - status: NMBPredicateStatus.fail, - message: NMBExpectationMessage( - // swiftlint:disable:next line_length - fail: "allPass can only be used with types which implement NSFastEnumeration (NSArray, NSSet, ...), and whose elements subclass NSObject, got <\(actualValue?.description ?? "nil")>" - ) - ) - } - - let expr = Expression(expression: ({ nsObjects }), location: location) - let 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() - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift deleted file mode 100644 index 3cba8b0..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift +++ /dev/null @@ -1,236 +0,0 @@ -import Foundation - -/// If you are running on a slower machine, it could be useful to increase the default timeout value -/// or slow down poll interval. Default timeout interval is 1, and poll interval is 0.01. -public struct AsyncDefaults { - public static var Timeout: TimeInterval = 1 - public static var PollInterval: TimeInterval = 0.01 -} - -private func async(style: ExpectationStyle, predicate: Predicate, timeout: TimeInterval, poll: TimeInterval, fnName: String) -> Predicate { - return Predicate { actualExpression in - let uncachedExpression = actualExpression.withoutCaching() - let fnName = "expect(...).\(fnName)(...)" - var lastPredicateResult: PredicateResult? - let result = pollBlock( - pollInterval: poll, - timeoutInterval: timeout, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: fnName) { - lastPredicateResult = try predicate.satisfies(uncachedExpression) - return lastPredicateResult!.toBoolean(expectation: style) - } - switch result { - case .completed: return lastPredicateResult! - case .timedOut: 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: - // swiftlint:disable:next line_length - 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 { - let fullMatcher: U - let timeoutInterval: TimeInterval - let pollInterval: TimeInterval - - init(fullMatcher: U, timeoutInterval: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval) { - self.fullMatcher = fullMatcher - self.timeoutInterval = timeoutInterval - self.pollInterval = pollInterval - } - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let fnName = "expect(...).toEventually(...)" - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: fnName) { - try self.fullMatcher.matches(uncachedExpression, failureMessage: failureMessage) - } - switch result { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.stringValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventually(...).") - } - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: "expect(...).toEventuallyNot(...)") { - try self.fullMatcher.doesNotMatch(uncachedExpression, failureMessage: failureMessage) - } - switch result { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.stringValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventuallyNot(...).") - } - } -} - -private let toEventuallyRequiresClosureError = FailureMessage( - // swiftlint:disable:next line_length - stringValue: "expect(...).toEventually(...) requires an explicit closure (eg - expect { ... }.toEventually(...) )\nSwift 1.2 @autoclosure behavior has changed in an incompatible way for Nimble to function" -) - -extension Expectation { - /// Tests the actual value using a matcher to match by checking continuously - /// at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { - nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) - - let (pass, msg) = execute( - expression, - .toMatch, - async(style: .toMatch, predicate: predicate, timeout: timeout, poll: pollInterval, fnName: "toEventually"), - to: "to eventually", - description: description, - captureExceptions: false - ) - verify(pass, msg) - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventuallyNot(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { - nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) - - let (pass, msg) = execute( - expression, - .toNotMatch, - async( - style: .toNotMatch, - predicate: predicate, - timeout: timeout, - poll: pollInterval, - fnName: "toEventuallyNot" - ), - to: "to eventually not", - description: description, - captureExceptions: false - ) - verify(pass, msg) - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// Alias of toEventuallyNot() - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toNotEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { - return toEventuallyNot(predicate, timeout: timeout, pollInterval: pollInterval, description: description) - } -} - -// Deprecated -extension Expectation { - /// Tests the actual value using a matcher to match by checking continuously - /// at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T { - if expression.isClosure { - let (pass, msg) = expressionMatches( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - to: "to eventually", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventuallyNot(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T { - if expression.isClosure { - let (pass, msg) = expressionDoesNotMatch( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - toNot: "to eventually not", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// Alias of toEventuallyNot() - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toNotEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T { - return toEventuallyNot(matcher, timeout: timeout, pollInterval: pollInterval, description: description) - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift deleted file mode 100644 index 5674525..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Foundation - -private func matcherMessage(forType expectedType: T.Type) -> String { - return "be a kind of \(String(describing: expectedType))" -} -private func matcherMessage(forClass expectedClass: AnyClass) -> String { - return "be a kind of \(String(describing: expectedClass))" -} - -/// A Nimble matcher that succeeds when the actual value is an instance of the given class. -public func beAKindOf(_ expectedType: T.Type) -> 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>" - ) - - return PredicateResult( - bool: validInstance is T, - message: message - ) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -/// A Nimble matcher that succeeds when the actual value is an instance of the given class. -/// @see beAnInstanceOf if you want to match against the exact class -public func beAKindOf(_ expectedClass: AnyClass) -> Predicate { - return Predicate.define { actualExpression in - let message: ExpectationMessage - let status: PredicateStatus - - let instance = try actualExpression.evaluate() - if let validInstance = instance { - status = PredicateStatus(bool: instance != nil && instance!.isKind(of: expectedClass)) - message = .expectedCustomValueTo( - matcherMessage(forClass: expectedClass), - "<\(String(describing: type(of: validInstance))) instance>" - ) - } else { - status = .fail - message = .expectedCustomValueTo( - matcherMessage(forClass: expectedClass), - "" - ) - } - - return PredicateResult(status: status, message: message) - } -} - -extension NMBObjCMatcher { - @objc public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAKindOf(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift deleted file mode 100644 index 70c5661..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is an _exact_ instance of the given class. -public func beAnInstanceOf(_ expectedType: T.Type) -> 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) -> 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 { - actualString = "<\(String(describing: type(of: validInstance))) instance>" - } else { - actualString = "" - } - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let matches = instance != nil && instance!.isMember(of: expectedClass) - #else - let matches = instance != nil && type(of: instance!) == expectedClass - #endif - return PredicateResult( - status: PredicateStatus(bool: matches), - message: .expectedCustomValueTo(errorMessage, actualString) - ) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAnInstanceOf(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift deleted file mode 100644 index dfb4e28..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift +++ /dev/null @@ -1,126 +0,0 @@ -import Foundation - -public let DefaultDelta = 0.0001 - -internal func isCloseTo(_ actualValue: NMBDoubleConvertible?, - expectedValue: NMBDoubleConvertible, - delta: Double) - -> PredicateResult { - let errorMessage = "be close to <\(stringify(expectedValue))> (within \(stringify(delta)))" - return PredicateResult( - bool: actualValue != nil && - abs(actualValue!.doubleValue - expectedValue.doubleValue) < delta, - message: .expectedCustomValueTo(errorMessage, "<\(stringify(actualValue))>") - ) -} - -/// A Nimble matcher that succeeds when a value is close to another. This is used for floating -/// point values which can have imprecise results when doing arithmetic on them. -/// -/// @see equal -public func beCloseTo(_ expectedValue: Double, within delta: Double = DefaultDelta) -> Predicate { - return Predicate.define { actualExpression in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta) - } -} - -/// 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: NMBDoubleConvertible, within delta: Double = DefaultDelta) -> Predicate { - return Predicate.define { actualExpression in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { - var _expected: NSNumber - var _delta: CDouble - init(expected: NSNumber, within: CDouble) { - _expected = expected - _delta = within - } - - @objc public func matches(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.matches(expr, failureMessage: failureMessage) - } - - @objc public func doesNotMatch(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.doesNotMatch(expr, failureMessage: failureMessage) - } - - @objc public var within: (CDouble) -> NMBObjCBeCloseToMatcher { - return ({ delta in - return NMBObjCBeCloseToMatcher(expected: self._expected, within: delta) - }) - } -} - -extension NMBObjCMatcher { - @objc public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToMatcher { - return NMBObjCBeCloseToMatcher(expected: expected, within: within) - } -} -#endif - -public func beCloseTo(_ expectedValues: [Double], within delta: Double = DefaultDelta) -> 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() { - if actual.count != expectedValues.count { - return .doesNotMatch - } else { - for (index, actualItem) in actual.enumerated() { - if fabs(actualItem - expectedValues[index]) > delta { - return .doesNotMatch - } - } - return .matches - } - } - return .doesNotMatch - } -} - -// MARK: - Operators - -infix operator ≈ : ComparisonPrecedence - -public func ≈(lhs: Expectation<[Double]>, rhs: [Double]) { - lhs.to(beCloseTo(rhs)) -} - -public func ≈(lhs: Expectation, rhs: NMBDoubleConvertible) { - lhs.to(beCloseTo(rhs)) -} - -public func ≈(lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) -} - -public func == (lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) -} - -// make this higher precedence than exponents so the Doubles either end aren't pulled in -// unexpectantly -precedencegroup PlusMinusOperatorPrecedence { - higherThan: BitwiseShiftPrecedence -} - -infix operator ± : PlusMinusOperatorPrecedence -public func ±(lhs: NMBDoubleConvertible, rhs: Double) -> (expected: NMBDoubleConvertible, delta: Double) { - return (expected: lhs, delta: rhs) -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeEmpty.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeEmpty.swift deleted file mode 100644 index 3cbc15d..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeEmpty.swift +++ /dev/null @@ -1,95 +0,0 @@ -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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualSeq = try actualExpression.evaluate() - if actualSeq == nil { - return .fail - } - var generator = actualSeq!.makeIterator() - 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualString = try actualExpression.evaluate() - 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualString = try actualExpression.evaluate() - return PredicateStatus(bool: actualString == nil || actualString!.length == 0) - } -} - -// Without specific overrides, beEmpty() is ambiguous for NSDictionary, NSArray, -// etc, since they conform to Sequence as well as NMBCollection. - -/// 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualDictionary = try actualExpression.evaluate() - 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualArray = try actualExpression.evaluate() - 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actual = try actualExpression.evaluate() - return PredicateStatus(bool: actual == nil || actual!.count == 0) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beEmptyMatcher() -> NMBPredicate { - return NMBPredicate { actualExpression in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - - if let value = actualValue as? NMBCollection { - let expr = Expression(expression: ({ value as NMBCollection }), location: location) - 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().satisfies(expr).toObjectiveC() - } else if let actualValue = actualValue { - // swiftlint:disable:next line_length - let badTypeErrorMsg = "be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings)" - return NMBPredicateResult( - status: NMBPredicateStatus.fail, - message: NMBExpectationMessage( - expectedActualValueTo: badTypeErrorMsg, - customActualValue: "\(String(describing: type(of: actualValue))) type" - ) - ) - } - return NMBPredicateResult( - status: NMBPredicateStatus.fail, - message: NMBExpectationMessage(expectedActualValueTo: "be empty").appendedBeNilHint() - ) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift deleted file mode 100644 index 8717f97..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift +++ /dev/null @@ -1,42 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is greater than the expected value. -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 PredicateStatus(bool: actual > expected) - } - return .fail - } -} - -/// A Nimble matcher that succeeds when the actual value is greater than the expected value. -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?) { - lhs.to(beGreaterThan(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThan(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift deleted file mode 100644 index 55d8e7b..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift +++ /dev/null @@ -1,44 +0,0 @@ -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?) -> 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?) -> 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) { - lhs.to(beGreaterThanOrEqualTo(rhs)) -} - -public func >=(lhs: Expectation, rhs: T) { - lhs.to(beGreaterThanOrEqualTo(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift deleted file mode 100644 index ad19def..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift +++ /dev/null @@ -1,46 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is the same instance -/// as the expected instance. -public func beIdenticalTo(_ expected: Any?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - #if os(Linux) - let actual = try actualExpression.evaluate() as? AnyObject - #else - let actual = try actualExpression.evaluate() as AnyObject? - #endif - failureMessage.actualValue = "\(identityAsString(actual))" - failureMessage.postfixMessage = "be identical to \(identityAsString(expected))" - #if os(Linux) - return actual === (expected as? AnyObject) && actual !== nil - #else - return actual === (expected as AnyObject?) && actual !== nil - #endif - }.requireNonNil -} - -public func === (lhs: Expectation, rhs: Any?) { - lhs.to(beIdenticalTo(rhs)) -} -public func !== (lhs: Expectation, rhs: Any?) { - lhs.toNot(beIdenticalTo(rhs)) -} - -/// A Nimble matcher that succeeds when the actual value is the same instance -/// as the expected instance. -/// -/// Alias for "beIdenticalTo". -public func be(_ expected: Any?) -> Predicate { - return beIdenticalTo(expected) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let aExpr = actualExpression.cast { $0 as Any? } - return try! beIdenticalTo(expected).matches(aExpr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThan.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThan.swift deleted file mode 100644 index 8047efd..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThan.swift +++ /dev/null @@ -1,41 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is less than the expected value. -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?) -> 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?) { - lhs.to(beLessThan(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThan(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift deleted file mode 100644 index 098a852..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift +++ /dev/null @@ -1,42 +0,0 @@ -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?) -> 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?) -> 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) { - lhs.to(beLessThanOrEqualTo(rhs)) -} - -public func <=(lhs: Expectation, rhs: T) { - lhs.to(beLessThanOrEqualTo(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil:false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLogical.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLogical.swift deleted file mode 100644 index 2b18b4c..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLogical.swift +++ /dev/null @@ -1,167 +0,0 @@ -import Foundation - -extension Int8: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int8Value - } -} - -extension UInt8: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint8Value - } -} - -extension Int16: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int16Value - } -} - -extension UInt16: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint16Value - } -} - -extension Int32: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int32Value - } -} - -extension UInt32: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint32Value - } -} - -extension Int64: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int64Value - } -} - -extension UInt64: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint64Value - } -} - -extension Float: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).floatValue - } -} - -extension Double: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).doubleValue - } -} - -extension Int: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).intValue - } -} - -extension UInt: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uintValue - } -} - -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() -> 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() -> 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() -> 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. - // See: - // - https://bugs.swift.org/browse/SR-2290 - // - https://github.com/norio-nomura/Nimble/pull/5#issuecomment-237835873 - if let number = actualValue as? NSNumber { - return PredicateStatus(bool: number.boolValue == true) - } - - return PredicateStatus(bool: actualValue == (true as T)) - } - 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() -> 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. - // See: - // - https://bugs.swift.org/browse/SR-2290 - // - https://github.com/norio-nomura/Nimble/pull/5#issuecomment-237835873 - if let number = actualValue as? NSNumber { - return PredicateStatus(bool: number.boolValue == false) - } - - return PredicateStatus(bool: actualValue == (false as T)) - } - return PredicateStatus(bool: actualValue == nil) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beTruthyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTruthy().matches(expr, failureMessage: failureMessage) - } - } - - @objc public class func beFalsyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalsy().matches(expr, failureMessage: failureMessage) - } - } - - @objc public class func beTrueMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTrue().matches(expr, failureMessage: failureMessage) - } - } - - @objc public class func beFalseMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalse().matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeNil.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeNil.swift deleted file mode 100644 index a22e0f4..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeNil.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is nil. -public func beNil() -> Predicate { - return Predicate.simpleNilable("be nil") { actualExpression in - let actualValue = try actualExpression.evaluate() - return PredicateStatus(bool: actualValue == nil) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - return try! beNil().matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeVoid.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeVoid.swift deleted file mode 100644 index f5bf22a..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeVoid.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is Void. -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: ()) { - lhs.to(beVoid()) -} - -public func != (lhs: Expectation<()>, rhs: ()) { - lhs.toNot(beVoid()) -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeginWith.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeginWith.swift deleted file mode 100644 index c2ab568..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeginWith.swift +++ /dev/null @@ -1,60 +0,0 @@ -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) -> 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 PredicateStatus(bool: actualGenerator.next() == startingElement) - } - 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) -> 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 .fail - } - #else - let collectionValue = collection.object(at: 0) as AnyObject - #endif - 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) -> Predicate { - return Predicate.simple("begin with <\(startingSubstring)>") { actualExpression in - if let actual = try actualExpression.evaluate() { - let range = actual.range(of: startingSubstring) - return PredicateStatus(bool: range != nil && range!.lowerBound == actual.startIndex) - } - return .fail - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beginWithMatcher(_ expected: Any) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = try! actualExpression.evaluate() - if (actual as? String) != nil { - let expr = actualExpression.cast { $0 as? String } - return try! beginWith(expected as! String).matches(expr, failureMessage: failureMessage) - } else { - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! beginWith(expected).matches(expr, failureMessage: failureMessage) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Contain.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Contain.swift deleted file mode 100644 index f1afb72..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Contain.swift +++ /dev/null @@ -1,95 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual sequence contains the expected value. -public func contain(_ items: T...) -> Predicate - where S.Iterator.Element == T { - return contain(items) -} - -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 { - return actual.contains($0) - } - } - return false - }.requireNonNil -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: String...) -> Predicate { - return contain(substrings) -} - -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 { - let range = actual.range(of: $0) - return range != nil && !range!.isEmpty - } - } - return false - }.requireNonNil -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: NSString...) -> Predicate { - return contain(substrings) -} - -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?...) -> Predicate { - return contain(items) -} - -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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func containMatcher(_ expected: [NSObject]) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - if let value = actualValue as? NMBContainer { - let expr = Expression(expression: ({ value as NMBContainer }), location: location) - - // A straightforward cast on the array causes this to crash, so we have to cast the individual items - let expectedOptionals: [Any?] = expected.map({ $0 as Any? }) - return try! contain(expectedOptionals).matches(expr, failureMessage: failureMessage) - } else if let value = actualValue as? NSString { - let expr = Expression(expression: ({ value as String }), location: location) - return try! contain(expected as! [String]).matches(expr, failureMessage: failureMessage) - } else if actualValue != nil { - // swiftlint:disable:next line_length - failureMessage.postfixMessage = "contain <\(arrayAsString(expected))> (only works for NSArrays, NSSets, NSHashTables, and NSStrings)" - } else { - failureMessage.postfixMessage = "contain <\(arrayAsString(expected))>" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift deleted file mode 100644 index ae0d854..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift +++ /dev/null @@ -1,60 +0,0 @@ -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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - extension NMBObjCMatcher { - @objc 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 { - // swiftlint:disable:next line_length - 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/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/EndWith.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/EndWith.swift deleted file mode 100644 index a6f9f91..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/EndWith.swift +++ /dev/null @@ -1,72 +0,0 @@ -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) -> Predicate - where S.Iterator.Element == T { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingElement)>" - - if let actualValue = try actualExpression.evaluate() { - var actualGenerator = actualValue.makeIterator() - var lastItem: T? - var item: T? - repeat { - 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) -> 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 } - #if os(Linux) - guard let collectionValue = collection.object(at: collection.count - 1) as? NSObject else { - return false - } - #else - let collectionValue = collection.object(at: collection.count - 1) as AnyObject - #endif - - return collectionValue.isEqual(endingElement) - }.requireNonNil -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring -/// where the expected substring's location is the actual string's length minus the -/// expected substring's length. -public func endWith(_ endingSubstring: String) -> 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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func endWithMatcher(_ expected: Any) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = try! actualExpression.evaluate() - if (actual as? String) != nil { - let expr = actualExpression.cast { $0 as? String } - return try! endWith(expected as! String).matches(expr, failureMessage: failureMessage) - } else { - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! endWith(expected).matches(expr, failureMessage: failureMessage) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Equal.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Equal.swift deleted file mode 100644 index 9467154..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Equal.swift +++ /dev/null @@ -1,220 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is equal to the expected value. -/// 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?) -> 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(status: PredicateStatus(bool: matches), message: msg) - } -} - -/// A Nimble matcher that succeeds when the actual value is equal to the expected value. -/// 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]?) -> 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 && actualValue != nil { - return PredicateResult( - status: .fail, - message: msg.appendedBeNilHint() - ) - } - return PredicateResult(status: .fail, message: msg) - } - 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]?) -> Predicate<[T]> { - return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in - let actualValue = try actualExpression.evaluate() - 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: expectedValue! == actualValue!, - message: msg - ) - } -} - -/// A Nimble matcher allowing comparison of collection with optional type -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 doesNotMatch - } - - for (index, item) in actualValue.enumerated() { - let otherItem = expectedValue[index] - if item == nil && otherItem == nil { - continue - } else if item == nil && otherItem != nil { - return doesNotMatch - } else if item != nil && otherItem == nil { - return doesNotMatch - } else if item! != otherItem! { - return doesNotMatch - } - } - - return PredicateResult( - status: .matches, - message: msg - ) - } else { - return PredicateResult( - status: .fail, - message: msg.appendedBeNilHint() - ) - } - } -} - -/// A Nimble matcher that succeeds when the actual set is equal to the expected set. -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?) -> Predicate> { - return equal(expectedValue, stringify: { - if let set = $0 { - return stringify(Array(set).sorted { $0 < $1 }) - } else { - return "nil" - } - }) -} - -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() { - errorMessage = .expectedCustomValueTo( - "equal <\(stringify(expectedValue))>", - "<\(stringify(actualValue))>" - ) - - if expectedValue == actualValue { - return PredicateResult( - status: .matches, - message: errorMessage - ) - } - - let missing = expectedValue.subtracting(actualValue) - if missing.count > 0 { - errorMessage = errorMessage.appended(message: ", missing <\(stringify(missing))>") - } - - let extra = actualValue.subtracting(expectedValue) - if extra.count > 0 { - errorMessage = errorMessage.appended(message: ", extra <\(stringify(extra))>") - } - return PredicateResult( - status: .doesNotMatch, - message: errorMessage - ) - } - return PredicateResult( - status: .fail, - message: errorMessage.appendedBeNilHint() - ) - } else { - return PredicateResult( - status: .fail, - message: errorMessage.appendedBeNilHint() - ) - } - } -} - -public func ==(lhs: Expectation, rhs: T?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation, rhs: T?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation<[T]>, rhs: [T]?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation<[T]>, rhs: [T]?) { - lhs.toNot(equal(rhs)) -} - -public func == (lhs: Expectation>, rhs: Set?) { - lhs.to(equal(rhs)) -} - -public func != (lhs: Expectation>, rhs: Set?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation>, rhs: Set?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation>, rhs: Set?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation<[T: C]>, rhs: [T: C]?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { - lhs.toNot(equal(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! equal(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/HaveCount.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/HaveCount.swift deleted file mode 100644 index 93335a8..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/HaveCount.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation - -// The `haveCount` matchers do not print the full string representation of the collection value, -// instead they only print the type name and the expected count. This makes it easier to understand -// the reason for failed expectations. See: https://github.com/Quick/Nimble/issues/308. -// The representation of the collection content is provided in a new line as an `extendedMessage`. - -/// A Nimble matcher that succeeds when the actual Collection's count equals -/// the expected value -public func haveCount(_ expectedValue: T.IndexDistance) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - if let actualValue = try actualExpression.evaluate() { - // swiftlint:disable:next line_length - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" - let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result - } else { - return false - } - }.requireNonNil -} - -/// A Nimble matcher that succeeds when the actual collection's count equals -/// the expected value -public func haveCount(_ expectedValue: Int) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - if let actualValue = try actualExpression.evaluate() { - // swiftlint:disable:next line_length - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" - let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result - } else { - return false - } - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func haveCountMatcher(_ expected: NSNumber) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - if let value = actualValue as? NMBCollection { - let expr = Expression(expression: ({ value as NMBCollection}), location: location) - return try! haveCount(expected.intValue).matches(expr, failureMessage: failureMessage) - } else if let actualValue = actualValue { - failureMessage.postfixMessage = "get type of NSArray, NSSet, NSDictionary, or NSHashTable" - failureMessage.actualValue = "\(String(describing: type(of: actualValue)))" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Match.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Match.swift deleted file mode 100644 index 1e5762f..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Match.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual string satisfies the regular expression -/// described by the expected string. -public func match(_ expectedValue: String?) -> 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 - } - } - - return false - }.requireNonNil -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -extension NMBObjCMatcher { - @objc public class func matchMatcher(_ expected: NSString) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = actualExpression.cast { $0 as? String } - return try! match(expected.description).matches(actual, failureMessage: failureMessage) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatchError.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatchError.swift deleted file mode 100644 index 9c86fb7..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatchError.swift +++ /dev/null @@ -1,58 +0,0 @@ -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) -> 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 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) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() - - setFailureMessageForError( - failureMessage, - postfixMessageVerb: "match", - actualError: actualError, - errorType: errorType - ) - var matches = false - if actualError as? T != nil { - matches = true - } - return matches - }.requireNonNil -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift deleted file mode 100644 index abcafa9..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift +++ /dev/null @@ -1,85 +0,0 @@ -/// 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 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 - - public init(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) { - self.matcher = matcher - } - - public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - return try matcher(actualExpression, failureMessage) - } - - 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) - } -} - -/// 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. -/// This applies regardless of using to() or toNot(). -/// -/// 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 NonNilMatcherFunc: Matcher { - public let matcher: (Expression, FailureMessage) throws -> Bool - - public init(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) { - self.matcher = matcher - } - - public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - let pass = try matcher(actualExpression, failureMessage) - if try attachNilErrorIfNeeded(actualExpression, failureMessage: failureMessage) { - return false - } - return pass - } - - public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - let pass = try !matcher(actualExpression, failureMessage) - if try attachNilErrorIfNeeded(actualExpression, failureMessage: failureMessage) { - return false - } - return pass - } - - internal func attachNilErrorIfNeeded(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - if try actualExpression.evaluate() == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - return true - } - 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/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift deleted file mode 100644 index fff3c77..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift +++ /dev/null @@ -1,154 +0,0 @@ -import Foundation -// `CGFloat` is in Foundation (swift-corelibs-foundation) on Linux. -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - import CoreGraphics -#endif - -/// Implement this protocol to implement a custom matcher for Swift -@available(*, deprecated, message: "Use Predicate instead") -public protocol Matcher { - associatedtype ValueType - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool -} - -extension Matcher { - var predicate: Predicate { - return Predicate.fromDeprecatedMatcher(self) - } - - var toClosure: (Expression, FailureMessage, Bool) throws -> Bool { - return ({ expr, msg, expectedResult in - if expectedResult { - return try self.matches(expr, failureMessage: msg) - } else { - return try self.doesNotMatch(expr, failureMessage: msg) - } - }) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -/// Objective-C interface to the Swift variant of Matcher. -@objc public protocol NMBMatcher { - func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool - func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool -} -#endif - -/// Protocol for types that support contain() matcher. -public protocol NMBContainer { - func contains(_ anObject: Any) -> Bool -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -// FIXME: NSHashTable can not conform to NMBContainer since swift-DEVELOPMENT-SNAPSHOT-2016-04-25-a -//extension NSHashTable : NMBContainer {} // Corelibs Foundation does not include this class yet -#endif - -extension NSArray : NMBContainer {} -extension NSSet : NMBContainer {} - -/// Protocol for types that support only beEmpty(), haveCount() matchers -public protocol NMBCollection { - var count: Int { get } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NSHashTable : NMBCollection {} // Corelibs Foundation does not include these classes yet -extension NSMapTable : NMBCollection {} -#endif - -extension NSSet : NMBCollection {} -extension NSIndexSet : NMBCollection {} -extension NSDictionary : NMBCollection {} - -/// Protocol for types that support beginWith(), endWith(), beEmpty() matchers -public protocol NMBOrderedCollection: NMBCollection { - func object(at index: Int) -> Any -} - -extension NSArray : NMBOrderedCollection {} - -public protocol NMBDoubleConvertible { - var doubleValue: CDouble { get } -} - -extension Double : NMBDoubleConvertible { - public var doubleValue: CDouble { - return self - } -} - -extension Float : NMBDoubleConvertible { - public var doubleValue: CDouble { - return CDouble(self) - } -} - -extension CGFloat: NMBDoubleConvertible { - public var doubleValue: CDouble { - return CDouble(self) - } -} - -extension NSNumber : NMBDoubleConvertible { -} - -private let dateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSS" - formatter.locale = Locale(identifier: "en_US_POSIX") - - return formatter -}() - -extension Date: NMBDoubleConvertible { - public var doubleValue: CDouble { - return self.timeIntervalSinceReferenceDate - } -} - -extension NSDate: NMBDoubleConvertible { - public var doubleValue: CDouble { - return self.timeIntervalSinceReferenceDate - } -} - -extension Date: TestOutputStringConvertible { - public var testDescription: String { - return dateFormatter.string(from: self) - } -} - -extension NSDate: TestOutputStringConvertible { - public var testDescription: String { - return dateFormatter.string(from: Date(timeIntervalSinceReferenceDate: self.timeIntervalSinceReferenceDate)) - } -} - -/// Protocol for types to support beLessThan(), beLessThanOrEqualTo(), -/// beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers. -/// -/// Types that conform to Swift's Comparable protocol will work implicitly too -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -@objc public protocol NMBComparable { - func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult -} -#else -// This should become obsolete once Corelibs Foundation adds Comparable conformance to NSNumber -public protocol NMBComparable { - func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult -} -#endif - -extension NSNumber : NMBComparable { - public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { - return compare(otherObject as! NSNumber) - } -} -extension NSString : NMBComparable { - public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { - return compare(otherObject as! String) - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift deleted file mode 100644 index 8288bb0..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Foundation - -internal class NotificationCollector { - private(set) var observedNotifications: [Notification] - private let notificationCenter: NotificationCenter - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - private var token: AnyObject? - #else - private var token: NSObjectProtocol? - #endif - - required init(notificationCenter: NotificationCenter) { - self.notificationCenter = notificationCenter - self.observedNotifications = [] - } - - func startObserving() { - self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil) { [weak self] n in - // linux-swift gets confused by .append(n) - self?.observedNotifications.append(n) - } - } - - deinit { - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - if let token = self.token { - self.notificationCenter.removeObserver(token) - } - #else - if let token = self.token as? AnyObject { - self.notificationCenter.removeObserver(token) - } - #endif - } -} - -private let mainThread = pthread_self() - -public func postNotifications( - _ notificationsMatcher: T, - fromNotificationCenter center: NotificationCenter = .default) - -> Predicate - where T: Matcher, T.ValueType == [Notification] -{ - _ = mainThread // Force lazy-loading of this value - let collector = NotificationCollector(notificationCenter: center) - collector.startObserving() - var once: Bool = false - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - let collectorNotificationsExpression = Expression(memoizedExpression: { _ in - return collector.observedNotifications - }, location: actualExpression.location, withoutCaching: true) - - assert(pthread_equal(mainThread, pthread_self()) != 0, "Only expecting closure to be evaluated on main thread.") - if !once { - once = true - _ = try actualExpression.evaluate() - } - - let match = try notificationsMatcher.matches(collectorNotificationsExpression, failureMessage: failureMessage) - if collector.observedNotifications.isEmpty { - failureMessage.actualValue = "no notifications" - } else { - failureMessage.actualValue = "<\(stringify(collector.observedNotifications))>" - } - return match - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Predicate.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Predicate.swift deleted file mode 100644 index e48d164..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Predicate.swift +++ /dev/null @@ -1,348 +0,0 @@ -// 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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -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/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/RaisesException.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/RaisesException.swift deleted file mode 100644 index 60553bd..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/RaisesException.swift +++ /dev/null @@ -1,198 +0,0 @@ -import Foundation - -// This matcher requires the Objective-C, and being built by Xcode rather than the Swift Package Manager -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - -/// A Nimble matcher that succeeds when the actual expression raises an -/// exception with the specified name, reason, and/or userInfo. -/// -/// Alternatively, you can pass a closure to do any arbitrary custom matching -/// to the raised exception. The closure only gets called when an exception -/// is raised. -/// -/// nil arguments indicates that the matcher should not attempt to match against -/// that parameter. -public func raiseException( - named: String? = nil, - reason: String? = nil, - userInfo: NSDictionary? = nil, - closure: ((NSException) -> Void)? = nil) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - - var exception: NSException? - let capture = NMBExceptionCapture(handler: ({ e in - exception = e - }), finally: nil) - - capture.tryBlock { - _ = try! actualExpression.evaluate() - return - } - - setFailureMessageForException( - failureMessage, - exception: exception, - named: named, - reason: reason, - userInfo: userInfo, - closure: closure - ) - return exceptionMatchesNonNilFieldsOrClosure( - exception, - named: named, - reason: reason, - userInfo: userInfo, - closure: closure - ) - } -} - -// swiftlint:disable:next function_parameter_count -internal func setFailureMessageForException( - _ failureMessage: FailureMessage, - exception: NSException?, - named: String?, - reason: String?, - userInfo: NSDictionary?, - closure: ((NSException) -> Void)?) { - failureMessage.postfixMessage = "raise exception" - - if let named = named { - failureMessage.postfixMessage += " with name <\(named)>" - } - if let reason = reason { - failureMessage.postfixMessage += " with reason <\(reason)>" - } - if let userInfo = userInfo { - failureMessage.postfixMessage += " with userInfo <\(userInfo)>" - } - if closure != nil { - failureMessage.postfixMessage += " that satisfies block" - } - if named == nil && reason == nil && userInfo == nil && closure == nil { - failureMessage.postfixMessage = "raise any exception" - } - - if let exception = exception { - // swiftlint:disable:next line_length - failureMessage.actualValue = "\(String(describing: type(of: exception))) { name=\(exception.name), reason='\(stringify(exception.reason))', userInfo=\(stringify(exception.userInfo)) }" - } else { - failureMessage.actualValue = "no exception" - } -} - -internal func exceptionMatchesNonNilFieldsOrClosure( - _ exception: NSException?, - named: String?, - reason: String?, - userInfo: NSDictionary?, - closure: ((NSException) -> Void)?) -> Bool { - var matches = false - - if let exception = exception { - matches = true - - if let named = named, exception.name.rawValue != named { - matches = false - } - if reason != nil && exception.reason != reason { - matches = false - } - if let userInfo = userInfo, let exceptionUserInfo = exception.userInfo, - (exceptionUserInfo as NSDictionary) != userInfo { - matches = false - } - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(exception) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - - return matches -} - -public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { - internal var _name: String? - internal var _reason: String? - internal var _userInfo: NSDictionary? - internal var _block: ((NSException) -> Void)? - - internal init(name: String?, reason: String?, userInfo: NSDictionary?, block: ((NSException) -> Void)?) { - _name = name - _reason = reason - _userInfo = userInfo - _block = block - } - - @objc public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let block: () -> Any? = ({ _ = actualBlock(); return nil }) - let expr = Expression(expression: block, location: location) - - return try! raiseException( - named: _name, - reason: _reason, - userInfo: _userInfo, - closure: _block - ).matches(expr, failureMessage: failureMessage) - } - - @objc public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - return !matches(actualBlock, failureMessage: failureMessage, location: location) - } - - @objc public var named: (_ name: String) -> NMBObjCRaiseExceptionMatcher { - return ({ name in - return NMBObjCRaiseExceptionMatcher( - name: name, - reason: self._reason, - userInfo: self._userInfo, - block: self._block - ) - }) - } - - @objc public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionMatcher { - return ({ reason in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: reason, - userInfo: self._userInfo, - block: self._block - ) - }) - } - - @objc public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionMatcher { - return ({ userInfo in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, - userInfo: userInfo, - block: self._block - ) - }) - } - - @objc public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionMatcher { - return ({ block in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, - userInfo: self._userInfo, - block: block - ) - }) - } -} - -extension NMBObjCMatcher { - @objc public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionMatcher { - return NMBObjCRaiseExceptionMatcher(name: nil, reason: nil, userInfo: nil, block: nil) - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift deleted file mode 100644 index d02a0ff..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift +++ /dev/null @@ -1,109 +0,0 @@ -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...) -> Predicate - where U: Matcher, U.ValueType == T { - return satisfyAnyOf(matchers) -} - -/// 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)}")) - } - - failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "\(actualValue)" - } - - 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: 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) -> Predicate { - return satisfyAnyOf(left, right) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func satisfyAnyOfMatcher(_ matchers: [NMBMatcher]) -> NMBPredicate { - return NMBPredicate { actualExpression in - if matchers.isEmpty { - return NMBPredicateResult( - status: NMBPredicateStatus.fail, - message: NMBExpectationMessage( - fail: "satisfyAnyOf must be called with at least one matcher" - ) - ) - } - - var elementEvaluators = [Predicate]() - for matcher in matchers { - let elementEvaluator = Predicate { expression in - if let predicate = matcher as? NMBPredicate { - // swiftlint:disable:next line_length - return predicate.satisfies({ try! expression.evaluate() }, location: actualExpression.location).toSwift() - } else { - let failureMessage = FailureMessage() - // swiftlint:disable:next line_length - let success = matcher.matches({ try! expression.evaluate() }, failureMessage: failureMessage, location: actualExpression.location) - return PredicateResult(bool: success, message: failureMessage.toExpectationMessage()) - } - } - - elementEvaluators.append(elementEvaluator) - } - - return try! satisfyAnyOf(elementEvaluators).satisfies(actualExpression).toObjectiveC() - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift deleted file mode 100644 index a530c60..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation - -public func throwAssertion() -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - #if arch(x86_64) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !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 (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) conditional statement") - // swiftlint:disable:previous line_length - #endif - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowError.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowError.swift deleted file mode 100644 index 872ca5c..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowError.swift +++ /dev/null @@ -1,258 +0,0 @@ -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. -/// -/// Errors are tried to be compared by their implementation of Equatable, -/// otherwise they fallback to comparision by _domain and _code. -/// -/// Alternatively, you can pass a closure to do any arbitrary custom matching -/// to the thrown error. The closure only gets called when an error was thrown. -/// -/// nil arguments indicates that the matcher should not attempt to match against -/// that parameter. -public func throwError( - errorType: T.Type, - closure: ((T) -> Void)? = nil) -> Predicate { - return Predicate.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 - } - } - } - } - - 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 -/// error or when the passed closures' arbitrary custom matching succeeds. -/// -/// This duplication to it's generic adequate is required to allow to receive -/// values of the existential type `Error` in the closure. -/// -/// The closure only gets called when an error was thrown. -public func throwError(closure: @escaping ((T) -> Void)) -> Predicate { - return Predicate.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 - } - } - return matches - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ToSucceed.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ToSucceed.swift deleted file mode 100644 index 01369bb..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ToSucceed.swift +++ /dev/null @@ -1,37 +0,0 @@ -/** - 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/Carthage/Checkouts/Nimble/Sources/Nimble/Nimble.h b/Carthage/Checkouts/Nimble/Sources/Nimble/Nimble.h deleted file mode 100644 index bd45c5d..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Nimble.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import "NMBExceptionCapture.h" -#import "NMBStringify.h" -#import "DSL.h" - -#import "CwlPreconditionTesting.h" - -FOUNDATION_EXPORT double NimbleVersionNumber; -FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Async.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Async.swift deleted file mode 100644 index c77a8fc..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Async.swift +++ /dev/null @@ -1,377 +0,0 @@ -import CoreFoundation -import Dispatch -import Foundation - -#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) - import CDispatch -#endif - -private let timeoutLeeway = DispatchTimeInterval.milliseconds(1) -private let pollLeeway = DispatchTimeInterval.milliseconds(1) - -/// Stores debugging information about callers -internal struct WaitingInfo: CustomStringConvertible { - let name: String - let file: FileString - let lineNumber: UInt - - var description: String { - return "\(name) at \(file):\(lineNumber)" - } -} - -internal protocol WaitLock { - func acquireWaitingLock(_ fnName: String, file: FileString, line: UInt) - func releaseWaitingLock() - func isWaitingLocked() -> Bool -} - -internal class AssertionWaitLock: WaitLock { - private var currentWaiter: WaitingInfo? - init() { } - - func acquireWaitingLock(_ fnName: String, file: FileString, line: UInt) { - let info = WaitingInfo(name: fnName, file: file, lineNumber: line) - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let isMainThread = Thread.isMainThread - #else - let isMainThread = _CFIsMainThread() - #endif - nimblePrecondition( - isMainThread, - "InvalidNimbleAPIUsage", - "\(fnName) can only run on the main thread." - ) - nimblePrecondition( - currentWaiter == nil, - "InvalidNimbleAPIUsage", - "Nested async expectations are not allowed to avoid creating flaky tests.\n\n" + - "The call to\n\t\(info)\n" + - "triggered this exception because\n\t\(currentWaiter!)\n" + - "is currently managing the main run loop." - ) - currentWaiter = info - } - - func isWaitingLocked() -> Bool { - return currentWaiter != nil - } - - func releaseWaitingLock() { - currentWaiter = nil - } -} - -internal enum AwaitResult { - /// Incomplete indicates None (aka - this value hasn't been fulfilled yet) - case incomplete - /// TimedOut indicates the result reached its defined timeout limit before returning - case timedOut - /// BlockedRunLoop indicates the main runloop is too busy processing other blocks to trigger - /// the timeout code. - /// - /// This may also mean the async code waiting upon may have never actually ran within the - /// required time because other timers & sources are running on the main run loop. - case blockedRunLoop - /// The async block successfully executed and returned a given result - case completed(T) - /// When a Swift Error is thrown - case errorThrown(Error) - /// When an Objective-C Exception is raised - case raisedException(NSException) - - func isIncomplete() -> Bool { - switch self { - case .incomplete: return true - default: return false - } - } - - func isCompleted() -> Bool { - switch self { - case .completed: return true - default: return false - } - } -} - -/// Holds the resulting value from an asynchronous expectation. -/// This class is thread-safe at receiving an "response" to this promise. -internal class AwaitPromise { - private(set) internal var asyncResult: AwaitResult = .incomplete - private var signal: DispatchSemaphore - - init() { - signal = DispatchSemaphore(value: 1) - } - - deinit { - signal.signal() - } - - /// Resolves the promise with the given result if it has not been resolved. Repeated calls to - /// this method will resolve in a no-op. - /// - /// @returns a Bool that indicates if the async result was accepted or rejected because another - /// value was received first. - func resolveResult(_ result: AwaitResult) -> Bool { - if signal.wait(timeout: .now()) == .success { - self.asyncResult = result - return true - } else { - return false - } - } -} - -internal struct AwaitTrigger { - let timeoutSource: DispatchSourceTimer - let actionSource: DispatchSourceTimer? - let start: () throws -> Void -} - -/// Factory for building fully configured AwaitPromises and waiting for their results. -/// -/// This factory stores all the state for an async expectation so that Await doesn't -/// doesn't have to manage it. -internal class AwaitPromiseBuilder { - let awaiter: Awaiter - let waitLock: WaitLock - let trigger: AwaitTrigger - let promise: AwaitPromise - - internal init( - awaiter: Awaiter, - waitLock: WaitLock, - promise: AwaitPromise, - trigger: AwaitTrigger) { - self.awaiter = awaiter - self.waitLock = waitLock - self.promise = promise - self.trigger = trigger - } - - func timeout(_ timeoutInterval: TimeInterval, forcefullyAbortTimeout: TimeInterval) -> Self { - // = Discussion = - // - // There's a lot of technical decisions here that is useful to elaborate on. This is - // definitely more lower-level than the previous NSRunLoop based implementation. - // - // - // Why Dispatch Source? - // - // - // We're using a dispatch source to have better control of the run loop behavior. - // A timer source gives us deferred-timing control without having to rely as much on - // a run loop's traditional dispatching machinery (eg - NSTimers, DefaultRunLoopMode, etc.) - // which is ripe for getting corrupted by application code. - // - // And unlike dispatch_async(), we can control how likely our code gets prioritized to - // executed (see leeway parameter) + DISPATCH_TIMER_STRICT. - // - // This timer is assumed to run on the HIGH priority queue to ensure it maintains the - // highest priority over normal application / test code when possible. - // - // - // Run Loop Management - // - // In order to properly interrupt the waiting behavior performed by this factory class, - // this timer stops the main run loop to tell the waiter code that the result should be - // checked. - // - // In addition, stopping the run loop is used to halt code executed on the main run loop. - #if swift(>=4.0) - trigger.timeoutSource.schedule( - deadline: DispatchTime.now() + timeoutInterval, - repeating: .never, - leeway: timeoutLeeway - ) - #else - trigger.timeoutSource.scheduleOneshot( - deadline: DispatchTime.now() + timeoutInterval, - leeway: timeoutLeeway - ) - #endif - trigger.timeoutSource.setEventHandler { - guard self.promise.asyncResult.isIncomplete() else { return } - let timedOutSem = DispatchSemaphore(value: 0) - let semTimedOutOrBlocked = DispatchSemaphore(value: 0) - semTimedOutOrBlocked.signal() - let runLoop = CFRunLoopGetMain() - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let runLoopMode = CFRunLoopMode.defaultMode.rawValue - #else - let runLoopMode = kCFRunLoopDefaultMode - #endif - CFRunLoopPerformBlock(runLoop, runLoopMode) { - if semTimedOutOrBlocked.wait(timeout: .now()) == .success { - timedOutSem.signal() - semTimedOutOrBlocked.signal() - if self.promise.resolveResult(.timedOut) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - // potentially interrupt blocking code on run loop to let timeout code run - CFRunLoopStop(runLoop) - let now = DispatchTime.now() + forcefullyAbortTimeout - let didNotTimeOut = timedOutSem.wait(timeout: now) != .success - let timeoutWasNotTriggered = semTimedOutOrBlocked.wait(timeout: .now()) == .success - if didNotTimeOut && timeoutWasNotTriggered { - if self.promise.resolveResult(.blockedRunLoop) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - return self - } - - /// Blocks for an asynchronous result. - /// - /// @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 undesirable behavior. - /// - /// This method will return an AwaitResult in the following cases: - /// - /// - The main run loop is blocked by other operations and the async expectation cannot be - /// be stopped. - /// - The async expectation timed out - /// - The async expectation succeeded - /// - The async expectation raised an unexpected exception (objc) - /// - The async expectation raised an unexpected error (swift) - /// - /// The returned AwaitResult will NEVER be .incomplete. - func wait(_ fnName: String = #function, file: FileString = #file, line: UInt = #line) -> AwaitResult { - waitLock.acquireWaitingLock( - fnName, - file: file, - line: line) - - let capture = NMBExceptionCapture(handler: ({ exception in - _ = self.promise.resolveResult(.raisedException(exception)) - }), finally: ({ - self.waitLock.releaseWaitingLock() - })) - capture.tryBlock { - do { - try self.trigger.start() - } catch let error { - _ = self.promise.resolveResult(.errorThrown(error)) - } - 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) - } - - self.trigger.timeoutSource.cancel() - if let asyncSource = self.trigger.actionSource { - asyncSource.cancel() - } - } - - return promise.asyncResult - } -} - -internal class Awaiter { - let waitLock: WaitLock - let timeoutQueue: DispatchQueue - let asyncQueue: DispatchQueue - - internal init( - waitLock: WaitLock, - asyncQueue: DispatchQueue, - timeoutQueue: DispatchQueue) { - self.waitLock = waitLock - self.asyncQueue = asyncQueue - self.timeoutQueue = timeoutQueue - } - - private func createTimerSource(_ queue: DispatchQueue) -> DispatchSourceTimer { - return DispatchSource.makeTimerSource(flags: .strict, queue: queue) - } - - func performBlock( - file: FileString, - line: UInt, - _ closure: @escaping (@escaping (T) -> Void) throws -> Void - ) -> AwaitPromiseBuilder { - let promise = AwaitPromise() - let timeoutSource = createTimerSource(timeoutQueue) - var completionCount = 0 - let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: nil) { - try closure { - completionCount += 1 - 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) - } - } - } - - return AwaitPromiseBuilder( - awaiter: self, - waitLock: waitLock, - promise: promise, - trigger: trigger) - } - - func poll(_ pollInterval: TimeInterval, closure: @escaping () throws -> T?) -> AwaitPromiseBuilder { - let promise = AwaitPromise() - let timeoutSource = createTimerSource(timeoutQueue) - let asyncSource = createTimerSource(asyncQueue) - let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: asyncSource) { - let interval = DispatchTimeInterval.nanoseconds(Int(pollInterval * TimeInterval(NSEC_PER_SEC))) - #if swift(>=4.0) - asyncSource.schedule(deadline: .now(), repeating: interval, leeway: pollLeeway) - #else - asyncSource.scheduleRepeating(deadline: .now(), interval: interval, leeway: pollLeeway) - #endif - asyncSource.setEventHandler { - do { - if let result = try closure() { - if promise.resolveResult(.completed(result)) { - CFRunLoopStop(CFRunLoopGetCurrent()) - } - } - } catch let error { - if promise.resolveResult(.errorThrown(error)) { - CFRunLoopStop(CFRunLoopGetCurrent()) - } - } - } - asyncSource.resume() - } - - return AwaitPromiseBuilder( - awaiter: self, - waitLock: waitLock, - promise: promise, - trigger: trigger) - } -} - -internal func pollBlock( - pollInterval: TimeInterval, - timeoutInterval: TimeInterval, - file: FileString, - line: UInt, - fnName: String = #function, - expression: @escaping () throws -> Bool) -> AwaitResult { - let awaiter = NimbleEnvironment.activeInstance.awaiter - let result = awaiter.poll(pollInterval) { () throws -> Bool? in - if try expression() { - return true - } - return nil - }.timeout(timeoutInterval, forcefullyAbortTimeout: timeoutInterval / 2.0).wait(fnName, file: file, line: line) - - return result -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Errors.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Errors.swift deleted file mode 100644 index 074cb20..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Errors.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation - -// Generic - -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, - postfixMessageVerb: String = "throw", - actualError: Error?, - error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) { - failureMessage.postfixMessage = "\(postfixMessageVerb) error" - - if let error = error { - failureMessage.postfixMessage += " <\(error)>" - } else if errorType != nil || closure != nil { - failureMessage.postfixMessage += " from type <\(T.self)>" - } - if closure != nil { - failureMessage.postfixMessage += " that satisfies block" - } - if error == nil && errorType == nil && closure == nil { - failureMessage.postfixMessage = "\(postfixMessageVerb) any error" - } - - if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" - } else { - failureMessage.actualValue = "no error" - } -} - -internal func errorMatchesExpectedError( - _ actualError: Error, - expectedError: T) -> Bool { - return actualError._domain == expectedError._domain - && actualError._code == expectedError._code -} - -// Non-generic - -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, - actualError: Error?, - closure: ((Error) -> Void)?) { - failureMessage.postfixMessage = "throw error" - - if closure != nil { - failureMessage.postfixMessage += " that satisfies block" - } else { - failureMessage.postfixMessage = "throw any error" - } - - if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" - } else { - failureMessage.actualValue = "no error" - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Functional.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Functional.swift deleted file mode 100644 index 6c5126a..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Functional.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation - -extension Sequence { - internal func all(_ fn: (Iterator.Element) -> Bool) -> Bool { - for item in self { - if !fn(item) { - return false - } - } - return true - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/SourceLocation.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/SourceLocation.swift deleted file mode 100644 index 4e37aef..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/SourceLocation.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -// Ideally we would always use `StaticString` as the type for tracking the file name -// that expectations originate from, for consistency with `assert` etc. from the -// stdlib, and because recent versions of the XCTest overlay require `StaticString` -// when calling `XCTFail`. Under the Objective-C runtime (i.e. building on Mac), we -// have to use `String` instead because StaticString can't be generated from Objective-C -#if SWIFT_PACKAGE -public typealias FileString = StaticString -#else -public typealias FileString = String -#endif - -public final class SourceLocation: NSObject { - public let file: FileString - public let line: UInt - - override init() { - file = "Unknown File" - line = 0 - } - - init(file: FileString, line: UInt) { - self.file = file - self.line = line - } - - override public var description: String { - return "\(file):\(line)" - } -} diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Stringers.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Stringers.swift deleted file mode 100644 index cd6de20..0000000 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Stringers.swift +++ /dev/null @@ -1,212 +0,0 @@ -import Foundation - -internal func identityAsString(_ value: Any?) -> String { - let anyObject: AnyObject? -#if os(Linux) - anyObject = value as? AnyObject -#else - anyObject = value as AnyObject? -#endif - if let value = anyObject { - return NSString(format: "<%p>", unsafeBitCast(value, to: Int.self)).description - } else { - return "nil" - } -} - -internal func arrayAsString(_ items: [T], joiner: String = ", ") -> String { - return items.reduce("") { accum, item in - let prefix = (accum.isEmpty ? "" : joiner) - return accum + prefix + "\(stringify(item))" - } -} - -/// A type with a customized test output text representation. -/// -/// This textual representation is produced when values will be -/// printed in test runs, and may be useful when producing -/// error messages in custom matchers. -/// -/// - SeeAlso: `CustomDebugStringConvertible` -public protocol TestOutputStringConvertible { - var testDescription: String { get } -} - -extension Double: TestOutputStringConvertible { - public var testDescription: String { - return NSNumber(value: self).testDescription - } -} - -extension Float: TestOutputStringConvertible { - public var testDescription: String { - return NSNumber(value: self).testDescription - } -} - -extension NSNumber: TestOutputStringConvertible { - // This is using `NSString(format:)` instead of - // `String(format:)` because the latter somehow breaks - // 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. - // Maybe this will change in a future snapshot. - let decimalPlaces = NSString(string: NSString(string: description) - .components(separatedBy: ".")[1]) - - // SeeAlso: https://bugs.swift.org/browse/SR-1464 - switch decimalPlaces.length { - case 1: - return NSString(format: "%0.1f", self.doubleValue).description - case 2: - return NSString(format: "%0.2f", self.doubleValue).description - case 3: - return NSString(format: "%0.3f", self.doubleValue).description - default: - return NSString(format: "%0.4f", self.doubleValue).description - } - } - return self.description - } -} - -extension Array: TestOutputStringConvertible { - public var testDescription: String { - let list = self.map(Nimble.stringify).joined(separator: ", ") - return "[\(list)]" - } -} - -extension AnySequence: TestOutputStringConvertible { - public var testDescription: String { - 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)]" - } -} - -extension NSArray: TestOutputStringConvertible { - public var testDescription: String { - let list = Array(self).map(Nimble.stringify).joined(separator: ", ") - return "(\(list))" - } -} - -extension NSIndexSet: TestOutputStringConvertible { - public var testDescription: String { - let list = Array(self).map(Nimble.stringify).joined(separator: ", ") - return "(\(list))" - } -} - -extension String: TestOutputStringConvertible { - public var testDescription: String { - return self - } -} - -extension Data: TestOutputStringConvertible { - public var testDescription: String { - #if os(Linux) - // FIXME: Swift on Linux triggers a segfault when calling NSData's hash() (last checked on 03-11-16) - return "Data" - #else - return "Data" - #endif - } -} - -/// -/// Returns a string appropriate for displaying in test output -/// from the provided value. -/// -/// - parameter value: A value that will show up in a test's output. -/// -/// - returns: The string that is returned can be -/// customized per type by conforming a type to the `TestOutputStringConvertible` -/// protocol. When stringifying a non-`TestOutputStringConvertible` type, this -/// function will return the value's debug description and then its -/// normal description if available and in that order. Otherwise it -/// will return the result of constructing a string from the value. -/// -/// - SeeAlso: `TestOutputStringConvertible` -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) -} - -/// -SeeAlso: `stringify(value: T)` -public func stringify(_ value: T?) -> String { - if let unboxed = value { - return stringify(unboxed) - } - return "nil" -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -@objc public class NMBStringer: NSObject { - @objc public class func stringify(_ obj: Any?) -> String { - return Nimble.stringify(obj) - } -} -#endif - -// MARK: Collection Type Stringers - -/// Attempts to generate a pretty type string for a given value. If the value is of a Objective-C -/// collection type, or a subclass thereof, (e.g. `NSArray`, `NSDictionary`, etc.). -/// This function will return the type name of the root class of the class cluster for better -/// readability (e.g. `NSArray` instead of `__NSArrayI`). -/// -/// For values that don't have a type of an Objective-C collection, this function returns the -/// default type description. -/// -/// - parameter value: A value that will be used to determine a type name. -/// -/// - returns: The name of the class cluster root class for Objective-C collection types, or the -/// the `dynamicType` of the value for values of any other type. -public func prettyCollectionType(_ value: T) -> String { - switch value { - case is NSArray: - return String(describing: NSArray.self) - case is NSDictionary: - return String(describing: NSDictionary.self) - case is NSSet: - return String(describing: NSSet.self) - case is NSIndexSet: - return String(describing: NSIndexSet.self) - default: - return String(describing: value) - } -} - -/// Returns the type name for a given collection type. This overload is used by Swift -/// collection types. -/// -/// - parameter collection: A Swift `CollectionType` value. -/// -/// - returns: A string representing the `dynamicType` of the value. -public func prettyCollectionType(_ collection: T) -> String { - return String(describing: type(of: collection)) -} diff --git a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h deleted file mode 100644 index 5d416e4..0000000 --- a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble22CurrentTestCaseTracker") -@interface CurrentTestCaseTracker : NSObject -+ (CurrentTestCaseTracker *)sharedInstance; -@end - -@interface CurrentTestCaseTracker (Register) @end diff --git a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.h b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.h deleted file mode 100644 index caa3f7c..0000000 --- a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.h +++ /dev/null @@ -1,383 +0,0 @@ -#import - -@class NMBExpectation; -@class NMBObjCBeCloseToMatcher; -@class NMBObjCRaiseExceptionMatcher; -@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 - - - -#define DEFINE_NMB_EXPECT_OVERLOAD(TYPE, EXPR) \ - NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - NMBExpectation *NMB_expect(TYPE(^actualBlock)(void), NSString *file, NSUInteger line) { \ - return NMB_expect(^id { return EXPR; }, file, line); \ - } - - NIMBLE_EXPORT NIMBLE_OVERLOADABLE - NMBExpectation *NMB_expect(id(^actualBlock)(void), 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)(void), NSString *file, NSUInteger line); - - - -#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_EXPORT_INLINE id beAnInstanceOf(Class expectedClass) { - return NMB_beAnInstanceOf(expectedClass); -} - -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass); -NIMBLE_EXPORT_INLINE id beAKindOf(Class expectedClass) { - return NMB_beAKindOf(expectedClass); -} - -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring); -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), - NMB_beIdenticalTo(expectedInstance)); - -NIMBLE_EXPORT id NMB_be(id expectedInstance); -NIMBLE_SHORT(id be(id expectedInstance), - NMB_be(expectedInstance)); - - -#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), - NMB_beTruthy()); - -NIMBLE_EXPORT id NMB_beFalsy(void); -NIMBLE_SHORT(id beFalsy(void), - NMB_beFalsy()); - -NIMBLE_EXPORT id NMB_beTrue(void); -NIMBLE_SHORT(id beTrue(void), - NMB_beTrue()); - -NIMBLE_EXPORT id NMB_beFalse(void); -NIMBLE_SHORT(id beFalse(void), - NMB_beFalse()); - -NIMBLE_EXPORT id NMB_beNil(void); -NIMBLE_SHORT(id beNil(void), - NMB_beNil()); - -NIMBLE_EXPORT id NMB_beEmpty(void); -NIMBLE_SHORT(id beEmpty(void), - NMB_beEmpty()); - -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) NS_REQUIRES_NIL_TERMINATION; -#define NMB_contain(...) NMB_containWithNilTermination(__VA_ARGS__, nil) -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#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)); - -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException(void); -NIMBLE_SHORT(NMBObjCRaiseExceptionMatcher *raiseException(void), - NMB_raiseException()); - -NIMBLE_EXPORT id NMB_match(id expectedValue); -NIMBLE_SHORT(id match(id expectedValue), - NMB_match(expectedValue)); - -NIMBLE_EXPORT id NMB_allPass(id matcher); -NIMBLE_SHORT(id allPass(id matcher), - NMB_allPass(matcher)); - -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers); -#define NMB_satisfyAnyOf(...) NMB_satisfyAnyOfWithMatchers(@[__VA_ARGS__]) -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#define satisfyAnyOf(...) NMB_satisfyAnyOf(__VA_ARGS__) -#endif - -// In order to preserve breakpoint behavior despite using macros to fill in __FILE__ and __LINE__, -// define a builder that populates __FILE__ and __LINE__, and returns a block that takes timeout -// and action arguments. See https://github.com/Quick/Quick/pull/185 for details. -typedef void (^NMBWaitUntilTimeoutBlock)(NSTimeInterval timeout, void (^action)(void (^)(void))); -typedef void (^NMBWaitUntilBlock)(void (^action)(void (^)(void))); - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line); - -NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line); -NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line); - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line); - -#define NMB_waitUntilTimeout NMB_waitUntilTimeoutBuilder(@(__FILE__), __LINE__) -#define NMB_waitUntil NMB_waitUntilBuilder(@(__FILE__), __LINE__) - -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#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") - - -#define waitUntilTimeout NMB_waitUntilTimeout -#define waitUntil NMB_waitUntil - -#undef NIMBLE_VALUE_OF - -#endif - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.m b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.m deleted file mode 100644 index 5a145b8..0000000 --- a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.m +++ /dev/null @@ -1,160 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble7NMBWait") -@interface NMBWait : NSObject - -+ (void)untilTimeout:(NSTimeInterval)timeout file:(NSString *)file line:(NSUInteger)line action:(void (^ _Nonnull)(void (^ _Nonnull)(void)))action; -+ (void)untilFile:(NSString *)file line:(NSUInteger)line action:(void (^ _Nonnull)(void (^ _Nonnull)(void)))action; - -@end - - -NS_ASSUME_NONNULL_BEGIN - - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBExpectation *__nonnull NMB_expect(id __nullable(^actualBlock)(void), NSString *__nonnull file, NSUInteger line) { - return [[NMBExpectation alloc] initWithActualBlock:actualBlock - negative:NO - file:file - line:line]; -} - -NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSString *file, NSUInteger line) { - return NMB_expect(^id{ - actualBlock(); - return nil; - }, file, line); -} - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line) { - return [NMBExpectation failWithMessage:msg file:file line:line]; -} - -NIMBLE_EXPORT id NMB_beAnInstanceOf(Class expectedClass) { - return [NMBObjCMatcher beAnInstanceOfMatcher:expectedClass]; -} - -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass) { - return [NMBObjCMatcher beAKindOfMatcher:expectedClass]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beCloseToMatcher:expectedValue within:0.001]; -} - -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring) { - return [NMBObjCMatcher beginWithMatcher:itemElementOrSubstring]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanOrEqualToMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_beIdenticalTo(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; -} - -NIMBLE_EXPORT id NMB_be(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanOrEqualToMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_beTruthy() { - return [NMBObjCMatcher beTruthyMatcher]; -} - -NIMBLE_EXPORT id NMB_beFalsy() { - return [NMBObjCMatcher beFalsyMatcher]; -} - -NIMBLE_EXPORT id NMB_beTrue() { - return [NMBObjCMatcher beTrueMatcher]; -} - -NIMBLE_EXPORT id NMB_beFalse() { - return [NMBObjCMatcher beFalseMatcher]; -} - -NIMBLE_EXPORT id NMB_beNil() { - return [NMBObjCMatcher beNilMatcher]; -} - -NIMBLE_EXPORT id NMB_beEmpty() { - return [NMBObjCMatcher beEmptyMatcher]; -} - -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) { - NSMutableArray *itemOrSubstringArray = [NSMutableArray array]; - - if (itemOrSubstring) { - [itemOrSubstringArray addObject:itemOrSubstring]; - - va_list args; - va_start(args, itemOrSubstring); - id next; - while ((next = va_arg(args, id))) { - [itemOrSubstringArray addObject:next]; - } - va_end(args); - } - - 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 NIMBLE_OVERLOADABLE id NMB_equal(__nullable id expectedValue) { - return [NMBObjCMatcher equalMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_haveCount(id expectedValue) { - return [NMBObjCMatcher haveCountMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_match(id expectedValue) { - return [NMBObjCMatcher matchMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_allPass(id expectedValue) { - return [NMBObjCMatcher allPassMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers) { - return [NMBObjCMatcher satisfyAnyOfMatcher:matchers]; -} - -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException() { - return [NMBObjCMatcher raiseExceptionMatcher]; -} - -NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line) { - return ^(NSTimeInterval timeout, void (^ _Nonnull action)(void (^ _Nonnull)(void))) { - [NMBWait untilTimeout:timeout file:file line:line action:action]; - }; -} - -NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line) { - return ^(void (^ _Nonnull action)(void (^ _Nonnull)(void))) { - [NMBWait untilFile:file line:line action:action]; - }; -} - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h deleted file mode 100644 index e6e0272..0000000 --- a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h +++ /dev/null @@ -1,11 +0,0 @@ -#import -#import - -@interface NMBExceptionCapture : NSObject - -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)(void))finally; -- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)(void))unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); - -@end - -typedef void(^NMBSourceCallbackBlock)(BOOL successful); diff --git a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m deleted file mode 100644 index 3381047..0000000 --- a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m +++ /dev/null @@ -1,35 +0,0 @@ -#import "NMBExceptionCapture.h" - -@interface NMBExceptionCapture () -@property (nonatomic, copy) void(^ _Nullable handler)(NSException * _Nullable); -@property (nonatomic, copy) void(^ _Nullable finally)(void); -@end - -@implementation NMBExceptionCapture - -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)(void))finally { - self = [super init]; - if (self) { - self.handler = handler; - self.finally = finally; - } - return self; -} - -- (void)tryBlock:(void(^ _Nonnull)(void))unsafeBlock { - @try { - unsafeBlock(); - } - @catch (NSException *exception) { - if (self.handler) { - self.handler(exception); - } - } - @finally { - if (self.finally) { - self.finally(); - } - } -} - -@end diff --git a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.h b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.h deleted file mode 100644 index 7938bca..0000000 --- a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.h +++ /dev/null @@ -1,18 +0,0 @@ -@class NSString; - -/** - * Returns a string appropriate for displaying in test output - * from the provided value. - * - * @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` - * protocol. When stringifying a non-`TestOutputStringConvertible` type, this - * function will return the value's debug description and then its - * normal description if available and in that order. Otherwise it - * will return the result of constructing a string from the value. - * - * @see `TestOutputStringConvertible` - */ -extern NSString *_Nonnull NMBStringify(id _Nullable anyObject) __attribute__((warn_unused_result)); diff --git a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.m b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.m deleted file mode 100644 index 329d39a..0000000 --- a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.m +++ /dev/null @@ -1,6 +0,0 @@ -#import "NMBStringify.h" -#import - -NSString *_Nonnull NMBStringify(id _Nullable anyObject) { - return [NMBStringer stringify:anyObject]; -} diff --git a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m deleted file mode 100644 index 35f26fd..0000000 --- a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m +++ /dev/null @@ -1,78 +0,0 @@ -#import "CurrentTestCaseTracker.h" -#import -#import - -#pragma mark - Method Swizzling - -/// Swaps the implementations between two instance methods. -/// -/// @param class The class containing `originalSelector`. -/// @param originalSelector Original method to replace. -/// @param replacementSelector Replacement method. -void swizzleSelectors(Class class, SEL originalSelector, SEL replacementSelector) { - Method originalMethod = class_getInstanceMethod(class, originalSelector); - Method replacementMethod = class_getInstanceMethod(class, replacementSelector); - - BOOL didAddMethod = - class_addMethod(class, - originalSelector, - method_getImplementation(replacementMethod), - method_getTypeEncoding(replacementMethod)); - - if (didAddMethod) { - class_replaceMethod(class, - replacementSelector, - method_getImplementation(originalMethod), - method_getTypeEncoding(originalMethod)); - } else { - method_exchangeImplementations(originalMethod, replacementMethod); - } -} - -#pragma mark - Private - -@interface XCTestObservationCenter (Private) -- (void)_addLegacyTestObserver:(id)observer; -@end - -@implementation XCTestObservationCenter (Register) - -/// Uses objc method swizzling to register `CurrentTestCaseTracker` as a test observer. This is necessary -/// because Xcode 7.3 introduced timing issues where if a custom `XCTestObservation` is registered too early -/// it suppresses all console output (generated by `XCTestLog`), breaking any tools that depend on this output. -/// This approach waits to register our custom test observer until XCTest adds its first "legacy" observer, -/// falling back to registering after the first normal observer if this private method ever changes. -+ (void)load { - if (class_getInstanceMethod([self class], @selector(_addLegacyTestObserver:))) { - // Swizzle -_addLegacyTestObserver: - swizzleSelectors([self class], @selector(_addLegacyTestObserver:), @selector(NMB_original__addLegacyTestObserver:)); - } else { - // Swizzle -addTestObserver:, only if -_addLegacyTestObserver: is not implemented - swizzleSelectors([self class], @selector(addTestObserver:), @selector(NMB_original_addTestObserver:)); - } -} - -#pragma mark - Replacement Methods - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -- (void)NMB_original__addLegacyTestObserver:(id)observer { - [self NMB_original__addLegacyTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -/// This method is only used if `-_addLegacyTestObserver:` is not impelemented. (added in Xcode 7.3) -- (void)NMB_original_addTestObserver:(id)observer { - [self NMB_original_addTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self NMB_original_addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/.swiftlint.yml b/Carthage/Checkouts/Nimble/Tests/.swiftlint.yml deleted file mode 100644 index f003326..0000000 --- a/Carthage/Checkouts/Nimble/Tests/.swiftlint.yml +++ /dev/null @@ -1,2 +0,0 @@ -disabled_rules: - - line_length diff --git a/Carthage/Checkouts/Nimble/Tests/LinuxMain.swift b/Carthage/Checkouts/Nimble/Tests/LinuxMain.swift deleted file mode 100644 index 16c6953..0000000 --- a/Carthage/Checkouts/Nimble/Tests/LinuxMain.swift +++ /dev/null @@ -1,37 +0,0 @@ -import XCTest -@testable import NimbleTests - -// This is the entry point for NimbleTests on Linux - -XCTMain([ - testCase(AsyncTest.allTests), - testCase(SynchronousTest.allTests), - testCase(UserDescriptionTest.allTests), - - // Matchers - testCase(AllPassTest.allTests), - testCase(BeAKindOfSwiftTest.allTests), - testCase(BeAnInstanceOfTest.allTests), - testCase(BeCloseToTest.allTests), - testCase(BeginWithTest.allTests), - testCase(BeGreaterThanOrEqualToTest.allTests), - testCase(BeGreaterThanTest.allTests), - testCase(BeIdenticalToObjectTest.allTests), - testCase(BeIdenticalToTest.allTests), - testCase(BeLessThanOrEqualToTest.allTests), - testCase(BeLessThanTest.allTests), - testCase(BeTruthyTest.allTests), - testCase(BeTrueTest.allTests), - testCase(BeFalsyTest.allTests), - testCase(BeFalseTest.allTests), - testCase(BeNilTest.allTests), - testCase(ContainTest.allTests), - testCase(EndWithTest.allTests), - testCase(EqualTest.allTests), - testCase(HaveCountTest.allTests), - testCase(MatchTest.allTests), - // testCase(RaisesExceptionTest.allTests), - testCase(ThrowErrorTest.allTests), - testCase(SatisfyAnyOfTest.allTests), - testCase(PostNotificationTest.allTests), -]) diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/AsynchronousTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/AsynchronousTest.swift deleted file mode 100644 index 46e34ce..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/AsynchronousTest.swift +++ /dev/null @@ -1,245 +0,0 @@ -import Dispatch -import Foundation -import XCTest -import Nimble - -final class AsyncTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AsyncTest) -> () throws -> Void)] { - return [ - ("testToEventuallyPositiveMatches", testToEventuallyPositiveMatches), - ("testToEventuallyNegativeMatches", testToEventuallyNegativeMatches), - ("testWaitUntilPositiveMatches", testWaitUntilPositiveMatches), - ("testToEventuallyWithCustomDefaultTimeout", testToEventuallyWithCustomDefaultTimeout), - ("testWaitUntilTimesOutIfNotCalled", testWaitUntilTimesOutIfNotCalled), - ("testWaitUntilTimesOutWhenExceedingItsTime", testWaitUntilTimesOutWhenExceedingItsTime), - ("testWaitUntilNegativeMatches", testWaitUntilNegativeMatches), - ("testWaitUntilDetectsStalledMainThreadActivity", testWaitUntilDetectsStalledMainThreadActivity), - ("testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed", testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed), - ("testWaitUntilErrorsIfDoneIsCalledMultipleTimes", testWaitUntilErrorsIfDoneIsCalledMultipleTimes), - ("testWaitUntilMustBeInMainThread", testWaitUntilMustBeInMainThread), - ("testToEventuallyMustBeInMainThread", testToEventuallyMustBeInMainThread), - ("testSubjectUnderTestIsReleasedFromMemory", testSubjectUnderTestIsReleasedFromMemory), - ] - } - - class Error: Swift.Error {} - let errorToThrow = Error() - - private func doThrowError() throws -> Int { - throw errorToThrow - } - - func testToEventuallyPositiveMatches() { - var value = 0 - deferToMainQueue { value = 1 } - expect { value }.toEventually(equal(1)) - - deferToMainQueue { value = 0 } - expect { value }.toEventuallyNot(equal(1)) - } - - func testToEventuallyNegativeMatches() { - let value = 0 - failsWithErrorMessage("expected to eventually not equal <0>, got <0>") { - expect { value }.toEventuallyNot(equal(0)) - } - failsWithErrorMessage("expected to eventually equal <1>, got <0>") { - expect { value }.toEventually(equal(1)) - } - failsWithErrorMessage("unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toEventually(equal(1)) - } - failsWithErrorMessage("unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toEventuallyNot(equal(0)) - } - } - - func testToEventuallyWithCustomDefaultTimeout() { - AsyncDefaults.Timeout = 2 - defer { - AsyncDefaults.Timeout = 1 - } - - var value = 0 - - let sleepThenSetValueTo: (Int) -> Void = { newValue in - Thread.sleep(forTimeInterval: 1.1) - value = newValue - } - - var asyncOperation: () -> Void = { sleepThenSetValueTo(1) } - - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect { value }.toEventually(equal(1)) - - asyncOperation = { sleepThenSetValueTo(0) } - - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect { value }.toEventuallyNot(equal(1)) - } - - func testWaitUntilPositiveMatches() { - waitUntil { done in - done() - } - waitUntil { done in - deferToMainQueue { - done() - } - } - } - - func testWaitUntilTimesOutIfNotCalled() { - failsWithErrorMessage("Waited more than 1.0 second") { - waitUntil(timeout: 1) { _ in return } - } - } - - func testWaitUntilTimesOutWhenExceedingItsTime() { - var waiting = true - failsWithErrorMessage("Waited more than 0.01 seconds") { - waitUntil(timeout: 0.01) { done in - let asyncOperation: () -> Void = { - Thread.sleep(forTimeInterval: 0.1) - done() - waiting = false - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - } - } - - // "clear" runloop to ensure this test doesn't poison other tests - repeat { - RunLoop.main.run(until: Date().addingTimeInterval(0.2)) - } while(waiting) - } - - func testWaitUntilNegativeMatches() { - failsWithErrorMessage("expected to equal <2>, got <1>") { - waitUntil { done in - Thread.sleep(forTimeInterval: 0.1) - expect(1).to(equal(2)) - done() - } - } - } - - func testWaitUntilDetectsStalledMainThreadActivity() { - let msg = "-waitUntil() timed out but was unable to run the timeout handler because the main thread is unresponsive (0.5 seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." - failsWithErrorMessage(msg) { - waitUntil(timeout: 1) { done in - Thread.sleep(forTimeInterval: 5.0) - done() - } - } - } - - func testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed() { - // Currently we are unable to catch Objective-C exceptions when built by the Swift Package Manager -#if !SWIFT_PACKAGE - let referenceLine = #line + 9 - var msg = "Unexpected exception raised: Nested async expectations are not allowed " - msg += "to avoid creating flaky tests." - msg += "\n\n" - msg += "The call to\n\t" - msg += "expect(...).toEventually(...) at \(#file):\(referenceLine + 7)\n" - msg += "triggered this exception because\n\t" - msg += "waitUntil(...) at \(#file):\(referenceLine + 1)\n" - msg += "is currently managing the main run loop." - failsWithErrorMessage(msg) { // reference line - waitUntil(timeout: 2.0) { done in - var protected: Int = 0 - DispatchQueue.main.async { - protected = 1 - } - - expect(protected).toEventually(equal(1)) - done() - } - } -#endif - } - - func testWaitUntilErrorsIfDoneIsCalledMultipleTimes() { - failsWithErrorMessage("waitUntil(..) expects its completion closure to be only called once") { - waitUntil { done in - deferToMainQueue { - done() - done() - } - } - } - } - - func testWaitUntilMustBeInMainThread() { -#if !SWIFT_PACKAGE - var executedAsyncBlock: Bool = false - let asyncOperation: () -> Void = { - expect { - waitUntil { done in done() } - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - executedAsyncBlock = true - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect(executedAsyncBlock).toEventually(beTruthy()) -#endif - } - - func testToEventuallyMustBeInMainThread() { -#if !SWIFT_PACKAGE - var executedAsyncBlock: Bool = false - let asyncOperation: () -> Void = { - expect { - expect(1).toEventually(equal(2)) - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - executedAsyncBlock = true - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect(executedAsyncBlock).toEventually(beTruthy()) -#endif - } - - final class ClassUnderTest { - var deinitCalled: (() -> Void)? - var count = 0 - deinit { deinitCalled?() } - } - - func testSubjectUnderTestIsReleasedFromMemory() { - var subject: ClassUnderTest? = ClassUnderTest() - - if let sub = subject { - expect(sub.count).toEventually(equal(0), timeout: 0.1) - expect(sub.count).toEventuallyNot(equal(1), timeout: 0.1) - } - - waitUntil(timeout: 0.5) { done in - subject?.deinitCalled = { - done() - } - - deferToMainQueue { subject = nil } - } - } - -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift deleted file mode 100644 index 26e5a98..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation - -class ObjectWithLazyProperty { - init() {} - lazy var value: String = "hello" - lazy var anotherValue: String = { return "world" }() -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift deleted file mode 100644 index 08a67c6..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest - -// XCTestCaseProvider should be adopted by all XCTestCase subclasses. It provides a -// mechanism for us to fail tests in Xcode which haven't been included in the `allTests` -// list for swift-corelibs-xctest which is unable to dynamically discover tests. Note -// that only `static var allTests` needs to be explicitly implemented, as `allTestNames` -// has a default implementation provided by a protocol extension. - -// Implementation note: This is broken down into two separate protocols because we need a -// protocol with no Self references to which we can cast XCTestCase instances in a non-generic context. - -public protocol XCTestCaseProviderStatic { - // This should be explicitly implemented by XCTestCase subclasses - static var allTests: [(String, (Self) -> () throws -> Void)] { get } -} - -public protocol XCTestCaseNameProvider { - // This does not need to be explicitly implemented because of the protocol extension below - var allTestNames: [String] { get } -} - -public protocol XCTestCaseProvider: XCTestCaseProviderStatic, XCTestCaseNameProvider {} - -extension XCTestCaseProvider { - var allTestNames: [String] { - return type(of: self).allTests.map({ name, _ in - return name - }) - } -} - -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) - -extension XCTestCase { - override open func tearDown() { - if let provider = self as? XCTestCaseNameProvider { - provider.assertContainsTest(invocation!.selector.description) - } - - super.tearDown() - } -} - -extension XCTestCaseNameProvider { - fileprivate func assertContainsTest(_ name: String) { - let contains = self.allTestNames.contains(name) - XCTAssert(contains, "Test '\(name)' is missing from the allTests array") - } -} - -#endif diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/utils.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/utils.swift deleted file mode 100644 index 6a5f544..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/utils.swift +++ /dev/null @@ -1,100 +0,0 @@ -import Dispatch -import Foundation -@testable import Nimble -import XCTest - -func failsWithErrorMessage(_ messages: [String], file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () throws -> Void) { - var filePath = file - var lineNumber = line - - let recorder = AssertionRecorder() - withAssertionHandler(recorder, closure: closure) - - for msg in messages { - var lastFailure: AssertionRecord? - var foundFailureMessage = false - - for assertion in recorder.assertions where assertion.message.stringValue == msg && !assertion.success { - lastFailure = assertion - foundFailureMessage = true - break - } - - if foundFailureMessage { - continue - } - - if preferOriginalSourceLocation { - if let failure = lastFailure { - filePath = failure.location.file - lineNumber = failure.location.line - } - } - - let message: String - if let lastFailure = lastFailure { - message = "Got failure message: \"\(lastFailure.message.stringValue)\", but expected \"\(msg)\"" - } else { - let knownFailures = recorder.assertions.filter { !$0.success }.map { $0.message.stringValue } - let knownFailuresJoined = knownFailures.joined(separator: ", ") - message = "Expected error message (\(msg)), got (\(knownFailuresJoined))\n\nAssertions Received:\n\(recorder.assertions)" - } - NimbleAssertionHandler.assert(false, - message: FailureMessage(stringValue: message), - location: SourceLocation(file: filePath, line: lineNumber)) - } -} - -func failsWithErrorMessage(_ message: String, file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () -> Void) { - return failsWithErrorMessage( - [message], - file: file, - line: line, - preferOriginalSourceLocation: preferOriginalSourceLocation, - closure: closure - ) -} - -func failsWithErrorMessageForNil(_ message: String, file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () -> Void) { - failsWithErrorMessage("\(message) (use beNil() to match nils)", file: file, line: line, preferOriginalSourceLocation: preferOriginalSourceLocation, closure: closure) -} - -func deferToMainQueue(action: @escaping () -> Void) { - DispatchQueue.main.async { - Thread.sleep(forTimeInterval: 0.01) - action() - } -} - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE -public class NimbleHelper: NSObject { - @objc public class func expectFailureMessage(_ message: NSString, block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessage(String(describing: message), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } - - @objc public class func expectFailureMessages(_ messages: [NSString], block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessage(messages.map({String(describing: $0)}), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } - - @objc public class func expectFailureMessageForNil(_ message: NSString, block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessageForNil(String(describing: message), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } -} -#endif - -extension Date { - init(dateTimeString: String) { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - dateFormatter.locale = Locale(identifier: "en_US_POSIX") - let date = dateFormatter.date(from: dateTimeString)! - self.init(timeInterval:0, since:date) - } -} - -extension NSDate { - convenience init(dateTimeString: String) { - let date = Date(dateTimeString: dateTimeString) - self.init(timeIntervalSinceReferenceDate: date.timeIntervalSinceReferenceDate) - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Info.plist b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Info.plist deleted file mode 100644 index 6d32c15..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/LinuxSupport.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/LinuxSupport.swift deleted file mode 100644 index 03ff8e1..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/LinuxSupport.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -#if os(Linux) - extension NSNotification.Name { - init(_ rawValue: String) { - self.init(rawValue: rawValue) - } - } -#endif diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift deleted file mode 100644 index 2050881..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift +++ /dev/null @@ -1,126 +0,0 @@ -import XCTest -import Nimble - -/// Add operators to `Optional` for conforming `Comparable` that removed in Swift 3.0 -extension Optional where Wrapped: Comparable { - static func < (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l < r - case (nil, _?): - return true - default: - return false - } - } - - static func > (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l > r - default: - return rhs < lhs - } - } - - static func <= (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l <= r - default: - return !(rhs < lhs) - } - } - - static func >= (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l >= r - default: - return !(lhs < rhs) - } - } -} - -final class AllPassTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AllPassTest) -> () throws -> Void)] { - return [ - ("testAllPassArray", testAllPassArray), - ("testAllPassMatcher", testAllPassMatcher), - ("testAllPassCollectionsWithOptionalsDontWork", testAllPassCollectionsWithOptionalsDontWork), - ("testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer", testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer), - ("testAllPassSet", testAllPassSet), - ("testAllPassWithNilAsExpectedValue", testAllPassWithNilAsExpectedValue), - ] - } - - func testAllPassArray() { - expect([1, 2, 3, 4]).to(allPass({$0 < 5})) - expect([1, 2, 3, 4]).toNot(allPass({$0 > 5})) - - failsWithErrorMessage( - "expected to all pass a condition, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1, 2, 3, 4]).to(allPass({$0 < 3})) - } - failsWithErrorMessage("expected to not all pass a condition") { - expect([1, 2, 3, 4]).toNot(allPass({$0 < 5})) - } - failsWithErrorMessage( - "expected to all be something, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1, 2, 3, 4]).to(allPass("be something", {$0 < 3})) - } - failsWithErrorMessage("expected to not all be something") { - expect([1, 2, 3, 4]).toNot(allPass("be something", {$0 < 5})) - } - } - - func testAllPassMatcher() { - expect([1, 2, 3, 4]).to(allPass(beLessThan(5))) - expect([1, 2, 3, 4]).toNot(allPass(beGreaterThan(5))) - - failsWithErrorMessage( - "expected to all be less than <3>, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1, 2, 3, 4]).to(allPass(beLessThan(3))) - } - failsWithErrorMessage("expected to not all be less than <5>") { - expect([1, 2, 3, 4]).toNot(allPass(beLessThan(5))) - } - } - - func testAllPassCollectionsWithOptionalsDontWork() { - failsWithErrorMessage("expected to all be nil, but failed first at element in <[nil, nil, nil]>") { - expect([nil, nil, nil] as [Int?]).to(allPass(beNil())) - } - failsWithErrorMessage("expected to all pass a condition, but failed first at element in <[nil, nil, nil]>") { - expect([nil, nil, nil] as [Int?]).to(allPass({$0 == nil})) - } - } - - func testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer() { - expect([nil, nil, nil] as [Int?]).to(allPass({$0! == nil})) - expect([nil, 1, nil] as [Int?]).toNot(allPass({$0! == nil})) - expect([1, 1, 1] as [Int?]).to(allPass({$0! == 1})) - expect([1, 1, nil] as [Int?]).toNot(allPass({$0! == 1})) - expect([1, 2, 3] as [Int?]).to(allPass({$0! < 4})) - expect([1, 2, 3] as [Int?]).toNot(allPass({$0! < 3})) - expect([1, 2, nil] as [Int?]).to(allPass({$0! < 3})) - } - - func testAllPassSet() { - expect(Set([1, 2, 3, 4])).to(allPass({$0 < 5})) - expect(Set([1, 2, 3, 4])).toNot(allPass({$0 > 5})) - - failsWithErrorMessage("expected to not all pass a condition") { - expect(Set([1, 2, 3, 4])).toNot(allPass({$0 < 5})) - } - failsWithErrorMessage("expected to not all be something") { - expect(Set([1, 2, 3, 4])).toNot(allPass("be something", {$0 < 5})) - } - } - - func testAllPassWithNilAsExpectedValue() { - failsWithErrorMessageForNil("expected to all pass") { - expect(nil as [Int]?).to(allPass(beLessThan(5))) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift deleted file mode 100644 index 94137dc..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift +++ /dev/null @@ -1,89 +0,0 @@ -import Foundation -import XCTest -import Nimble - -private class TestNull: NSNull {} -private protocol TestProtocol {} -private class TestClassConformingToProtocol: TestProtocol {} -private struct TestStructConformingToProtocol: TestProtocol {} - -final class BeAKindOfSwiftTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAKindOfSwiftTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testFailureMessages", testFailureMessages), - ] - } - - enum TestEnum { - case one, two - } - - func testPositiveMatch() { - expect(1).to(beAKindOf(Int.self)) - expect(1).toNot(beAKindOf(String.self)) - expect("turtle string").to(beAKindOf(String.self)) - expect("turtle string").toNot(beAKindOf(TestClassConformingToProtocol.self)) - - expect(TestEnum.one).to(beAKindOf(TestEnum.self)) - - let testProtocolClass = TestClassConformingToProtocol() - expect(testProtocolClass).to(beAKindOf(TestClassConformingToProtocol.self)) - expect(testProtocolClass).to(beAKindOf(TestProtocol.self)) - expect(testProtocolClass).toNot(beAKindOf(TestStructConformingToProtocol.self)) - - let testProtocolStruct = TestStructConformingToProtocol() - expect(testProtocolStruct).to(beAKindOf(TestStructConformingToProtocol.self)) - expect(testProtocolStruct).to(beAKindOf(TestProtocol.self)) - expect(testProtocolStruct).toNot(beAKindOf(TestClassConformingToProtocol.self)) - } - - func testFailureMessages() { - failsWithErrorMessage("expected to not be a kind of Int, got ") { - expect(1).toNot(beAKindOf(Int.self)) - } - - let testClass = TestClassConformingToProtocol() - failsWithErrorMessage("expected to not be a kind of \(String(describing: TestProtocol.self)), got <\(String(describing: TestClassConformingToProtocol.self)) instance>") { - expect(testClass).toNot(beAKindOf(TestProtocol.self)) - } - - failsWithErrorMessage("expected to be a kind of String, got ") { - expect(1).to(beAKindOf(String.self)) - } - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -final class BeAKindOfObjCTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAKindOfObjCTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testFailureMessages", testFailureMessages), - ] - } - - func testPositiveMatch() { - expect(TestNull()).to(beAKindOf(NSNull.self)) - expect(NSObject()).to(beAKindOf(NSObject.self)) - expect(NSNumber(value:1)).toNot(beAKindOf(NSDate.self)) - } - - func testFailureMessages() { - failsWithErrorMessageForNil("expected to not be a kind of NSNull, got ") { - expect(nil as NSNull?).toNot(beAKindOf(NSNull.self)) - } - failsWithErrorMessageForNil("expected to be a kind of NSString, got ") { - expect(nil as NSString?).to(beAKindOf(NSString.self)) - } - failsWithErrorMessage("expected to be a kind of NSString, got <__NSCFNumber instance>") { - expect(NSNumber(value:1)).to(beAKindOf(NSString.self)) - } - failsWithErrorMessage("expected to not be a kind of NSNumber, got <__NSCFNumber instance>") { - expect(NSNumber(value:1)).toNot(beAKindOf(NSNumber.self)) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift deleted file mode 100644 index fe089dd..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift +++ /dev/null @@ -1,79 +0,0 @@ -import Foundation -import XCTest -import Nimble - -private protocol TestProtocol {} -private class TestClassConformingToProtocol: TestProtocol {} -private struct TestStructConformingToProtocol: TestProtocol {} - -final class BeAnInstanceOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAnInstanceOfTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testPositiveMatchSwiftTypes", testPositiveMatchSwiftTypes), - ("testFailureMessages", testFailureMessages), - ("testFailureMessagesSwiftTypes", testFailureMessagesSwiftTypes), - ] - } - - func testPositiveMatch() { - expect(NSNull()).to(beAnInstanceOf(NSNull.self)) - expect(NSNumber(value:1)).toNot(beAnInstanceOf(NSDate.self)) - } - - enum TestEnum { - case one, two - } - - func testPositiveMatchSwiftTypes() { - expect(1).to(beAnInstanceOf(Int.self)) - expect("test").to(beAnInstanceOf(String.self)) - - expect(TestEnum.one).to(beAnInstanceOf(TestEnum.self)) - - let testProtocolClass = TestClassConformingToProtocol() - expect(testProtocolClass).to(beAnInstanceOf(TestClassConformingToProtocol.self)) - expect(testProtocolClass).toNot(beAnInstanceOf(TestProtocol.self)) - expect(testProtocolClass).toNot(beAnInstanceOf(TestStructConformingToProtocol.self)) - - let testProtocolStruct = TestStructConformingToProtocol() - expect(testProtocolStruct).to(beAnInstanceOf(TestStructConformingToProtocol.self)) - expect(testProtocolStruct).toNot(beAnInstanceOf(TestProtocol.self)) - expect(testProtocolStruct).toNot(beAnInstanceOf(TestClassConformingToProtocol.self)) - } - - func testFailureMessages() { - failsWithErrorMessageForNil("expected to not be an instance of NSNull, got ") { - expect(nil as NSNull?).toNot(beAnInstanceOf(NSNull.self)) - } - failsWithErrorMessageForNil("expected to be an instance of NSString, got ") { - expect(nil as NSString?).to(beAnInstanceOf(NSString.self)) - } -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let numberTypeName = "__NSCFNumber" -#else - let numberTypeName = "NSNumber" -#endif - failsWithErrorMessage("expected to be an instance of NSString, got <\(numberTypeName) instance>") { - expect(NSNumber(value:1)).to(beAnInstanceOf(NSString.self)) - } - failsWithErrorMessage("expected to not be an instance of \(numberTypeName), got <\(numberTypeName) instance>") { - expect(NSNumber(value:1)).toNot(beAnInstanceOf(type(of: NSNumber(value:1)))) - } - } - - func testFailureMessagesSwiftTypes() { - failsWithErrorMessage("expected to not be an instance of Int, got ") { - expect(1).toNot(beAnInstanceOf(Int.self)) - } - - let testClass = TestClassConformingToProtocol() - failsWithErrorMessage("expected to be an instance of \(String(describing: TestProtocol.self)), got <\(String(describing: TestClassConformingToProtocol.self)) instance>") { - expect(testClass).to(beAnInstanceOf(TestProtocol.self)) - } - - failsWithErrorMessage("expected to be an instance of String, got ") { - expect(1).to(beAnInstanceOf(String.self)) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift deleted file mode 100644 index 81530f3..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift +++ /dev/null @@ -1,160 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeCloseToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeCloseToTest) -> () throws -> Void)] { - return [ - ("testBeCloseTo", testBeCloseTo), - ("testBeCloseToWithin", testBeCloseToWithin), - ("testBeCloseToWithNSNumber", testBeCloseToWithNSNumber), - ("testBeCloseToWithDate", testBeCloseToWithDate), - ("testBeCloseToWithNSDate", testBeCloseToWithNSDate), - ("testBeCloseToOperator", testBeCloseToOperator), - ("testBeCloseToWithinOperator", testBeCloseToWithinOperator), - ("testPlusMinusOperator", testPlusMinusOperator), - ("testBeCloseToOperatorWithDate", testBeCloseToOperatorWithDate), - ("testBeCloseToWithinOperatorWithDate", testBeCloseToWithinOperatorWithDate), - ("testPlusMinusOperatorWithDate", testPlusMinusOperatorWithDate), - ("testBeCloseToArray", testBeCloseToArray), - ("testBeCloseToWithCGFloat", testBeCloseToWithCGFloat), - ] - } - - func testBeCloseTo() { - expect(1.2).to(beCloseTo(1.2001)) - expect(1.2 as CDouble).to(beCloseTo(1.2001)) - expect(1.2 as Float).to(beCloseTo(1.2001)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 0.0001), got <1.2>") { - expect(1.2).toNot(beCloseTo(1.2001)) - } - } - - func testBeCloseToWithin() { - expect(1.2).to(beCloseTo(9.300, within: 10)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(1.2).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithNSNumber() { - expect(NSNumber(value:1.2)).to(beCloseTo(9.300, within: 10)) - expect(NSNumber(value:1.2)).to(beCloseTo(NSNumber(value:9.300), within: 10)) - expect(1.2).to(beCloseTo(NSNumber(value:9.300), within: 10)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(NSNumber(value:1.2)).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithCGFloat() { - expect(CGFloat(1.2)).to(beCloseTo(1.2001)) - expect(CGFloat(1.2)).to(beCloseTo(CGFloat(1.2001))) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(CGFloat(1.2)).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")).to(beCloseTo(Date(dateTimeString: "2015-08-26 11:43:05"), within: 10)) - - failsWithErrorMessage("expected to not be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")).toNot(beCloseTo(expectedDate, within: 0.006)) - } - } - - func testBeCloseToWithNSDate() { - expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).to(beCloseTo(NSDate(dateTimeString: "2015-08-26 11:43:05"), within: 10)) - - failsWithErrorMessage("expected to not be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = NSDate(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).toNot(beCloseTo(expectedDate, within: 0.006)) - } - } - - func testBeCloseToOperator() { - expect(1.2) ≈ 1.2001 - expect(1.2 as CDouble) ≈ 1.2001 - - failsWithErrorMessage("expected to be close to <1.2002> (within 0.0001), got <1.2>") { - expect(1.2) ≈ 1.2002 - } - } - - func testBeCloseToWithinOperator() { - expect(1.2) ≈ (9.300, 10) - expect(1.2) == (9.300, 10) - - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) ≈ (1.0, 0.1) - } - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) == (1.0, 0.1) - } - } - - func testPlusMinusOperator() { - expect(1.2) ≈ 9.300 ± 10 - expect(1.2) == 9.300 ± 10 - - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) ≈ 1.0 ± 0.1 - } - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) == 1.0 ± 0.1 - } - } - - func testBeCloseToOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ Date(dateTimeString: "2015-08-26 11:43:00") - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.0001), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ expectedDate - } - } - - func testBeCloseToWithinOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ (Date(dateTimeString: "2015-08-26 11:43:05"), 10) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == (Date(dateTimeString: "2015-08-26 11:43:05"), 10) - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ (expectedDate, 0.004) - } - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == (expectedDate, 0.004) - } - } - - func testPlusMinusOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ Date(dateTimeString: "2015-08-26 11:43:05") ± 10 - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == Date(dateTimeString: "2015-08-26 11:43:05") ± 10 - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ expectedDate ± 0.004 - } - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == expectedDate ± 0.004 - } - } - - func testBeCloseToArray() { - expect([0.0, 1.1, 2.2]) ≈ [0.0001, 1.1001, 2.2001] - expect([0.0, 1.1, 2.2]).to(beCloseTo([0.1, 1.2, 2.3], within: 0.1)) - - failsWithErrorMessage("expected to be close to <[0, 1]> (each within 0.0001), got <[0, 1.1]>") { - expect([0.0, 1.1]) ≈ [0.0, 1.0] - } - failsWithErrorMessage("expected to be close to <[0.2, 1.2]> (each within 0.1), got <[0, 1.1]>") { - expect([0.0, 1.1]).to(beCloseTo([0.2, 1.2], within: 0.1)) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift deleted file mode 100644 index 9562fe0..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift +++ /dev/null @@ -1,82 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeEmptyTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeEmptyTest) -> () throws -> Void)] { - return [ - ("testBeEmptyPositive", testBeEmptyPositive), - ("testBeEmptyNegative", testBeEmptyNegative), - ] - } - - func testBeEmptyPositive() { - expect([] as [Int]).to(beEmpty()) - expect([1]).toNot(beEmpty()) - - expect([] as [CInt]).to(beEmpty()) - expect([1] as [CInt]).toNot(beEmpty()) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSDictionary() as? [Int:Int]).to(beEmpty()) - expect(NSDictionary(object: 1, forKey: 1 as NSNumber) as? [Int:Int]).toNot(beEmpty()) -#endif - - expect([Int: Int]()).to(beEmpty()) - expect(["hi": 1]).toNot(beEmpty()) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray() as? [Int]).to(beEmpty()) - expect(NSArray(array: [1]) as? [Int]).toNot(beEmpty()) -#endif - - expect(NSSet()).to(beEmpty()) - expect(NSSet(array: [NSNumber(value: 1)])).toNot(beEmpty()) - - expect(NSIndexSet()).to(beEmpty()) - expect(NSIndexSet(index: 1)).toNot(beEmpty()) - - expect(NSString()).to(beEmpty()) - expect(NSString(string: "hello")).toNot(beEmpty()) - - expect("").to(beEmpty()) - expect("foo").toNot(beEmpty()) - } - - func testBeEmptyNegative() { - failsWithErrorMessageForNil("expected to be empty, got ") { - expect(nil as NSString?).to(beEmpty()) - } - failsWithErrorMessageForNil("expected to not be empty, got ") { - expect(nil as [CInt]?).toNot(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <()>") { - expect(NSArray()).toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got <[1]>") { - expect([1]).to(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <{()}>") { - expect(NSSet()).toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got <{(1)}>") { - expect(NSSet(object: NSNumber(value: 1))).to(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <()>") { - expect(NSIndexSet()).toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got <(1)>") { - expect(NSIndexSet(index: 1)).to(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <>") { - expect("").toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got ") { - expect("foo").to(beEmpty()) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift deleted file mode 100644 index b9bd642..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift +++ /dev/null @@ -1,54 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeGreaterThanOrEqualToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeGreaterThanOrEqualToTest) -> () throws -> Void)] { - return [ - ("testGreaterThanOrEqualTo", testGreaterThanOrEqualTo), - ("testGreaterThanOrEqualToOperator", testGreaterThanOrEqualToOperator), - ] - } - - func testGreaterThanOrEqualTo() { - expect(10).to(beGreaterThanOrEqualTo(10)) - expect(10).to(beGreaterThanOrEqualTo(2)) - expect(1).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value:1)).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value:2)).to(beGreaterThanOrEqualTo(NSNumber(value:2))) -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(1).to(beGreaterThanOrEqualTo(NSNumber(value:0))) -#endif - - failsWithErrorMessage("expected to be greater than or equal to <2>, got <0>") { - expect(0).to(beGreaterThanOrEqualTo(2)) - return - } - failsWithErrorMessage("expected to not be greater than or equal to <1>, got <1>") { - expect(1).toNot(beGreaterThanOrEqualTo(1)) - return - } - failsWithErrorMessageForNil("expected to be greater than or equal to <-2>, got ") { - expect(nil as Int?).to(beGreaterThanOrEqualTo(-2)) - } - failsWithErrorMessageForNil("expected to not be greater than or equal to <1>, got ") { - expect(nil as Int?).toNot(beGreaterThanOrEqualTo(1)) - } - } - - func testGreaterThanOrEqualToOperator() { - expect(0) >= 0 - expect(1) >= 0 - expect(NSNumber(value:1)) >= 1 - expect(NSNumber(value:1)) >= NSNumber(value:1) - expect(2.5) >= 2.5 - expect(2.5) >= 2 - expect(Float(2.5)) >= Float(2.5) - expect(Float(2.5)) >= 2 - - failsWithErrorMessage("expected to be greater than or equal to <2>, got <1>") { - expect(1) >= 2 - return - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift deleted file mode 100644 index ea024a3..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeGreaterThanTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeGreaterThanTest) -> () throws -> Void)] { - return [ - ("testGreaterThan", testGreaterThan), - ("testGreaterThanOperator", testGreaterThanOperator), - ] - } - - func testGreaterThan() { - expect(10).to(beGreaterThan(2)) - expect(1).toNot(beGreaterThan(2)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:3)).to(beGreaterThan(2)) -#else - expect(NSNumber(value:3)).to(beGreaterThan(2 as NSNumber)) -#endif - expect(NSNumber(value:1)).toNot(beGreaterThan(NSNumber(value:2))) - - failsWithErrorMessage("expected to be greater than <2>, got <0>") { - expect(0).to(beGreaterThan(2)) - } - failsWithErrorMessage("expected to not be greater than <0>, got <1>") { - expect(1).toNot(beGreaterThan(0)) - } - failsWithErrorMessageForNil("expected to be greater than <-2>, got ") { - expect(nil as Int?).to(beGreaterThan(-2)) - } - failsWithErrorMessageForNil("expected to not be greater than <0>, got ") { - expect(nil as Int?).toNot(beGreaterThan(0)) - } - } - - func testGreaterThanOperator() { - expect(1) > 0 - expect(NSNumber(value:1)) > NSNumber(value:0) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:1)) > 0 -#else - expect(NSNumber(value:1)) > 0 as NSNumber -#endif - expect(2.5) > 1.5 - expect(Float(2.5)) > Float(1.5) - - failsWithErrorMessage("expected to be greater than <2>, got <1>") { - expect(1) > 2 - return - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift deleted file mode 100644 index 923fa76..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeIdenticalToObjectTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeIdenticalToObjectTest) -> () throws -> Void)] { - return [ - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testFailsOnNils", testFailsOnNils), - ("testOperators", testOperators), - ] - } - - private class BeIdenticalToObjectTester {} - private let testObjectA = BeIdenticalToObjectTester() - private let testObjectB = BeIdenticalToObjectTester() - - func testBeIdenticalToPositive() { - expect(self.testObjectA).to(beIdenticalTo(testObjectA)) - } - - func testBeIdenticalToNegative() { - expect(self.testObjectA).toNot(beIdenticalTo(testObjectB)) - } - - func testBeIdenticalToPositiveMessage() { - let message = String(describing: NSString(format: "expected to be identical to <%p>, got <%p>", - unsafeBitCast(testObjectB, to: Int.self), unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessage(message) { - expect(self.testObjectA).to(beIdenticalTo(self.testObjectB)) - } - } - - func testBeIdenticalToNegativeMessage() { - let message = String(describing: NSString(format: "expected to not be identical to <%p>, got <%p>", - unsafeBitCast(testObjectA, to: Int.self), unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessage(message) { - expect(self.testObjectA).toNot(beIdenticalTo(self.testObjectA)) - } - } - - func testFailsOnNils() { - let message1 = String(describing: NSString(format: "expected to be identical to <%p>, got nil", - unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessageForNil(message1) { - expect(nil as BeIdenticalToObjectTester?).to(beIdenticalTo(self.testObjectA)) - } - - let message2 = String(describing: NSString(format: "expected to not be identical to <%p>, got nil", - unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessageForNil(message2) { - expect(nil as BeIdenticalToObjectTester?).toNot(beIdenticalTo(self.testObjectA)) - } - } - - func testOperators() { - expect(self.testObjectA) === testObjectA - expect(self.testObjectA) !== testObjectB - } - -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift deleted file mode 100644 index eb976e6..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Foundation -import XCTest -@testable import Nimble - -final class BeIdenticalToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeIdenticalToTest) -> () throws -> Void)] { - return [ - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testOperators", testOperators), - ("testBeAlias", testBeAlias), - ] - } - - func testBeIdenticalToPositive() { - let value = NSDate() - expect(value).to(beIdenticalTo(value)) - } - - func testBeIdenticalToNegative() { - expect(NSNumber(value:1)).toNot(beIdenticalTo(NSString(string: "yo"))) - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) - } - - func testBeIdenticalToPositiveMessage() { - let num1 = NSNumber(value:1) - let num2 = NSNumber(value:2) - let message = "expected to be identical to \(identityAsString(num2)), got \(identityAsString(num1))" - failsWithErrorMessage(message) { - expect(num1).to(beIdenticalTo(num2)) - } - } - - func testBeIdenticalToNegativeMessage() { - let value1 = NSArray(array: []) - let value2 = value1 - let message = "expected to not be identical to \(identityAsString(value2)), got \(identityAsString(value1))" - failsWithErrorMessage(message) { - expect(value1).toNot(beIdenticalTo(value2)) - } - } - - func testOperators() { - let value = NSDate() - expect(value) === value - expect(NSNumber(value:1)) !== NSNumber(value:2) - } - - func testBeAlias() { - let value = NSDate() - expect(value).to(be(value)) - expect(NSNumber(value:1)).toNot(be(NSString(string: "turtles"))) - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect([1]).toNot(be([1])) - #else - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) - #endif - - let value1 = NSArray(array: []) - let value2 = value1 - let message = "expected to not be identical to \(identityAsString(value1)), got \(identityAsString(value2))" - failsWithErrorMessage(message) { - expect(value1).toNot(be(value2)) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift deleted file mode 100644 index 1668223..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeLessThanOrEqualToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeLessThanOrEqualToTest) -> () throws -> Void)] { - return [ - ("testLessThanOrEqualTo", testLessThanOrEqualTo), - ("testLessThanOrEqualToOperator", testLessThanOrEqualToOperator), - ] - } - - func testLessThanOrEqualTo() { - expect(10).to(beLessThanOrEqualTo(10)) - expect(2).to(beLessThanOrEqualTo(10)) - expect(2).toNot(beLessThanOrEqualTo(1)) - - expect(NSNumber(value:2)).to(beLessThanOrEqualTo(10)) - expect(NSNumber(value:2)).toNot(beLessThanOrEqualTo(1)) -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(2).to(beLessThanOrEqualTo(NSNumber(value:10))) - expect(2).toNot(beLessThanOrEqualTo(NSNumber(value:1))) -#endif - - failsWithErrorMessage("expected to be less than or equal to <0>, got <2>") { - expect(2).to(beLessThanOrEqualTo(0)) - return - } - failsWithErrorMessage("expected to not be less than or equal to <0>, got <0>") { - expect(0).toNot(beLessThanOrEqualTo(0)) - return - } - failsWithErrorMessageForNil("expected to be less than or equal to <2>, got ") { - expect(nil as Int?).to(beLessThanOrEqualTo(2)) - return - } - failsWithErrorMessageForNil("expected to not be less than or equal to <-2>, got ") { - expect(nil as Int?).toNot(beLessThanOrEqualTo(-2)) - return - } - } - - func testLessThanOrEqualToOperator() { - expect(0) <= 1 - expect(1) <= 1 - - failsWithErrorMessage("expected to be less than or equal to <1>, got <2>") { - expect(2) <= 1 - return - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift deleted file mode 100644 index f1c3317..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeLessThanTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeLessThanTest) -> () throws -> Void)] { - return [ - ("testLessThan", testLessThan), - ("testLessThanOperator", testLessThanOperator), - ] - } - - func testLessThan() { - expect(2).to(beLessThan(10)) - expect(2).toNot(beLessThan(1)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:2)).to(beLessThan(10)) - expect(NSNumber(value:2)).toNot(beLessThan(1)) - - expect(2).to(beLessThan(NSNumber(value:10))) - expect(2).toNot(beLessThan(NSNumber(value:1))) -#else - expect(NSNumber(value:2)).to(beLessThan(10 as NSNumber)) - expect(NSNumber(value:2)).toNot(beLessThan(1 as NSNumber)) - - expect(2 as NSNumber).to(beLessThan(NSNumber(value:10))) - expect(2 as NSNumber).toNot(beLessThan(NSNumber(value:1))) -#endif - - failsWithErrorMessage("expected to be less than <0>, got <2>") { - expect(2).to(beLessThan(0)) - } - failsWithErrorMessage("expected to not be less than <1>, got <0>") { - expect(0).toNot(beLessThan(1)) - } - - failsWithErrorMessageForNil("expected to be less than <2>, got ") { - expect(nil as Int?).to(beLessThan(2)) - } - failsWithErrorMessageForNil("expected to not be less than <-1>, got ") { - expect(nil as Int?).toNot(beLessThan(-1)) - } - } - - func testLessThanOperator() { - expect(0) < 1 -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:0)) < 1 -#else - expect(NSNumber(value:0)) < 1 as NSNumber -#endif - failsWithErrorMessage("expected to be less than <1>, got <2>") { - expect(2) < 1 - return - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift deleted file mode 100644 index 947a1b4..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift +++ /dev/null @@ -1,270 +0,0 @@ -import XCTest -import Nimble -import Foundation - -enum ConvertsToBool: ExpressibleByBooleanLiteral, CustomStringConvertible { - case trueLike, falseLike - - typealias BooleanLiteralType = Bool - - init(booleanLiteral value: Bool) { - switch value { - case true: self = .trueLike - case false: self = .falseLike - } - } - - var boolValue: Bool { - switch self { - case .trueLike: return true - case .falseLike: return false - } - } - - var description: String { - switch self { - case .trueLike: return "TrueLike" - case .falseLike: return "FalseLike" - } - } -} - -final class BeTruthyTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeTruthyTest) -> () throws -> Void)] { - return [ - ("testShouldMatchNonNilTypes", testShouldMatchNonNilTypes), - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchNilTypes", testShouldNotMatchNilTypes), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ("testShouldMatchBoolConvertibleTypesThatConvertToTrue", testShouldMatchBoolConvertibleTypesThatConvertToTrue), - ("testShouldNotMatchBoolConvertibleTypesThatConvertToFalse", testShouldNotMatchBoolConvertibleTypesThatConvertToFalse), - ] - } - - func testShouldMatchNonNilTypes() { - expect(true as Bool?).to(beTruthy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(1 as Int8?).to(beTruthy()) - expect(1 as UInt8?).to(beTruthy()) - expect(1 as Int16?).to(beTruthy()) - expect(1 as UInt16?).to(beTruthy()) - expect(1 as Int32?).to(beTruthy()) - expect(1 as UInt32?).to(beTruthy()) - expect(1 as Int64?).to(beTruthy()) - expect(1 as UInt64?).to(beTruthy()) - expect(1 as Float?).to(beTruthy()) - expect(1 as Double?).to(beTruthy()) - expect(1 as Int?).to(beTruthy()) - expect(1 as UInt?).to(beTruthy()) - } - - func testShouldMatchTrue() { - expect(true).to(beTruthy()) - - failsWithErrorMessage("expected to not be truthy, got ") { - expect(true).toNot(beTruthy()) - } - } - - func testShouldNotMatchNilTypes() { - expect(false as Bool?).toNot(beTruthy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(nil as Bool?).toNot(beTruthy()) - expect(nil as Int8?).toNot(beTruthy()) - expect(nil as UInt8?).toNot(beTruthy()) - expect(nil as Int16?).toNot(beTruthy()) - expect(nil as UInt16?).toNot(beTruthy()) - expect(nil as Int32?).toNot(beTruthy()) - expect(nil as UInt32?).toNot(beTruthy()) - expect(nil as Int64?).toNot(beTruthy()) - expect(nil as UInt64?).toNot(beTruthy()) - expect(nil as Float?).toNot(beTruthy()) - expect(nil as Double?).toNot(beTruthy()) - expect(nil as Int?).toNot(beTruthy()) - expect(nil as UInt?).toNot(beTruthy()) - } - - func testShouldNotMatchFalse() { - expect(false).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(false).to(beTruthy()) - } - } - - func testShouldNotMatchNilBools() { - expect(nil as Bool?).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(nil as Bool?).to(beTruthy()) - } - } - - func testShouldMatchBoolConvertibleTypesThatConvertToTrue() { - expect(ConvertsToBool.trueLike).to(beTruthy()) - - failsWithErrorMessage("expected to not be truthy, got ") { - expect(ConvertsToBool.trueLike).toNot(beTruthy()) - } - } - - func testShouldNotMatchBoolConvertibleTypesThatConvertToFalse() { - expect(ConvertsToBool.falseLike).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(ConvertsToBool.falseLike).to(beTruthy()) - } - } -} - -final class BeTrueTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeTrueTest) -> () throws -> Void)] { - return [ - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ] - } - - func testShouldMatchTrue() { - expect(true).to(beTrue()) - - failsWithErrorMessage("expected to not be true, got ") { - expect(true).toNot(beTrue()) - } - } - - func testShouldNotMatchFalse() { - expect(false).toNot(beTrue()) - - failsWithErrorMessage("expected to be true, got ") { - expect(false).to(beTrue()) - } - } - - func testShouldNotMatchNilBools() { - failsWithErrorMessageForNil("expected to not be true, got ") { - expect(nil as Bool?).toNot(beTrue()) - } - - failsWithErrorMessageForNil("expected to be true, got ") { - expect(nil as Bool?).to(beTrue()) - } - } -} - -final class BeFalsyTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeFalsyTest) -> () throws -> Void)] { - return [ - ("testShouldMatchNilTypes", testShouldMatchNilTypes), - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ("testShouldNotMatchNonNilTypes", testShouldNotMatchNonNilTypes), - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldMatchNilBools", testShouldMatchNilBools), - ] - } - - func testShouldMatchNilTypes() { - expect(false as Bool?).to(beFalsy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(nil as Bool?).to(beFalsy()) - expect(nil as Int8?).to(beFalsy()) - expect(nil as UInt8?).to(beFalsy()) - expect(nil as Int16?).to(beFalsy()) - expect(nil as UInt16?).to(beFalsy()) - expect(nil as Int32?).to(beFalsy()) - expect(nil as UInt32?).to(beFalsy()) - expect(nil as Int64?).to(beFalsy()) - expect(nil as UInt64?).to(beFalsy()) - expect(nil as Float?).to(beFalsy()) - expect(nil as Double?).to(beFalsy()) - expect(nil as Int?).to(beFalsy()) - expect(nil as UInt?).to(beFalsy()) - } - - func testShouldNotMatchTrue() { - expect(true).toNot(beFalsy()) - - failsWithErrorMessage("expected to be falsy, got ") { - expect(true).to(beFalsy()) - } - } - - func testShouldNotMatchNonNilTypes() { - expect(true as Bool?).toNot(beFalsy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(1 as Int8?).toNot(beFalsy()) - expect(1 as UInt8?).toNot(beFalsy()) - expect(1 as Int16?).toNot(beFalsy()) - expect(1 as UInt16?).toNot(beFalsy()) - expect(1 as Int32?).toNot(beFalsy()) - expect(1 as UInt32?).toNot(beFalsy()) - expect(1 as Int64?).toNot(beFalsy()) - expect(1 as UInt64?).toNot(beFalsy()) - expect(1 as Float?).toNot(beFalsy()) - expect(1 as Double?).toNot(beFalsy()) - expect(1 as Int?).toNot(beFalsy()) - expect(1 as UInt?).toNot(beFalsy()) - } - - func testShouldMatchFalse() { - expect(false).to(beFalsy()) - - failsWithErrorMessage("expected to not be falsy, got ") { - expect(false).toNot(beFalsy()) - } - } - - func testShouldMatchNilBools() { - expect(nil as Bool?).to(beFalsy()) - - failsWithErrorMessage("expected to not be falsy, got ") { - expect(nil as Bool?).toNot(beFalsy()) - } - } -} - -final class BeFalseTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeFalseTest) -> () throws -> Void)] { - return [ - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ] - } - - func testShouldNotMatchTrue() { - expect(true).toNot(beFalse()) - - failsWithErrorMessage("expected to be false, got ") { - expect(true).to(beFalse()) - } - } - - func testShouldMatchFalse() { - expect(false).to(beFalse()) - - failsWithErrorMessage("expected to not be false, got ") { - expect(false).toNot(beFalse()) - } - } - - func testShouldNotMatchNilBools() { - failsWithErrorMessageForNil("expected to be false, got ") { - expect(nil as Bool?).to(beFalse()) - } - - failsWithErrorMessageForNil("expected to not be false, got ") { - expect(nil as Bool?).toNot(beFalse()) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift deleted file mode 100644 index 69f4185..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift +++ /dev/null @@ -1,28 +0,0 @@ -import XCTest -import Nimble - -final class BeNilTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeNilTest) -> () throws -> Void)] { - return [ - ("testBeNil", testBeNil), - ] - } - - func producesNil() -> [Int]? { - return nil - } - - func testBeNil() { - expect(nil as Int?).to(beNil()) - expect(1 as Int?).toNot(beNil()) - expect(self.producesNil()).to(beNil()) - - failsWithErrorMessage("expected to not be nil, got ") { - expect(nil as Int?).toNot(beNil()) - } - - failsWithErrorMessage("expected to be nil, got <1>") { - expect(1 as Int?).to(beNil()) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift deleted file mode 100644 index a8eefc1..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift +++ /dev/null @@ -1,32 +0,0 @@ -import XCTest -import Nimble - -final class BeVoidTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeVoidTest) -> () throws -> Void)] { - return [ - ("testBeVoid", testBeVoid), - ] - } - - func testBeVoid() { - expect(()).to(beVoid()) - expect(() as ()?).to(beVoid()) - expect(nil as ()?).toNot(beVoid()) - - expect(()) == () - expect(() as ()?) == () - expect(nil as ()?) != () - - failsWithErrorMessage("expected to not be void, got <()>") { - expect(()).toNot(beVoid()) - } - - failsWithErrorMessage("expected to not be void, got <()>") { - expect(() as ()?).toNot(beVoid()) - } - - failsWithErrorMessage("expected to be void, got ") { - expect(nil as ()?).to(beVoid()) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift deleted file mode 100644 index 276c7d0..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeginWithTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeginWithTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testNegativeMatches", testNegativeMatches), - ] - } - - func testPositiveMatches() { - expect([1, 2, 3]).to(beginWith(1)) - expect([1, 2, 3]).toNot(beginWith(2)) - - expect("foobar").to(beginWith("foo")) - expect("foobar").toNot(beginWith("oo")) - - expect("foobarfoo").to(beginWith("foo")) - - expect(NSString(string: "foobar").description).to(beginWith("foo")) - expect(NSString(string: "foobar").description).toNot(beginWith("oo")) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray(array: ["a", "b"])).to(beginWith("a")) - expect(NSArray(array: ["a", "b"])).toNot(beginWith("b")) -#endif - } - - func testNegativeMatches() { - failsWithErrorMessageForNil("expected to begin with , got ") { - expect(nil as NSArray?).to(beginWith(NSString(string: "b"))) - } - failsWithErrorMessageForNil("expected to not begin with , got ") { - expect(nil as NSArray?).toNot(beginWith(NSString(string: "b"))) - } - - failsWithErrorMessage("expected to begin with <2>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(beginWith(2)) - } - failsWithErrorMessage("expected to not begin with <1>, got <[1, 2, 3]>") { - expect([1, 2, 3]).toNot(beginWith(1)) - } - failsWithErrorMessage("expected to begin with , got ") { - expect("batman").to(beginWith("atm")) - } - failsWithErrorMessage("expected to not begin with , got ") { - expect("batman").toNot(beginWith("bat")) - } - } - -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift deleted file mode 100644 index a9fe80e..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift +++ /dev/null @@ -1,86 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class ContainElementSatisfyingTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ContainElementSatisfyingTest) -> () throws -> Void)] { - return [ - ("testContainElementSatisfying", testContainElementSatisfying), - ("testContainElementSatisfyingDefaultErrorMessage", testContainElementSatisfyingDefaultErrorMessage), - ("testContainElementSatisfyingSpecificErrorMessage", testContainElementSatisfyingSpecificErrorMessage), - ("testContainElementSatisfyingNegativeCase", - testContainElementSatisfyingNegativeCase), - ("testContainElementSatisfyingNegativeCaseDefaultErrorMessage", - testContainElementSatisfyingNegativeCaseDefaultErrorMessage), - ("testContainElementSatisfyingNegativeCaseSpecificErrorMessage", - testContainElementSatisfyingNegativeCaseSpecificErrorMessage), - ] - } - - func testContainElementSatisfying() { - var orderIndifferentArray = [1, 2, 3] - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 1 - })) - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 2 - })) - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 3 - })) - - orderIndifferentArray = [3, 1, 2] - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 1 - })) - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 2 - })) - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 3 - })) - } - - func testContainElementSatisfyingDefaultErrorMessage() { - let orderIndifferentArray = [1, 2, 3] - failsWithErrorMessage("expected to find object in collection that satisfies predicate") { - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 4 - })) - } - } - - func testContainElementSatisfyingSpecificErrorMessage() { - let orderIndifferentArray = [1, 2, 3] - failsWithErrorMessage("expected to find object in collection equal to 4") { - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 4 - }, "equal to 4")) - } - } - - func testContainElementSatisfyingNegativeCase() { - let orderIndifferentArray = ["puppies", "kittens", "turtles"] - expect(orderIndifferentArray).toNot(containElementSatisfying({ string in - return string == "armadillos" - })) - } - - func testContainElementSatisfyingNegativeCaseDefaultErrorMessage() { - let orderIndifferentArray = ["puppies", "kittens", "turtles"] - failsWithErrorMessage("expected to not find object in collection that satisfies predicate") { - expect(orderIndifferentArray).toNot(containElementSatisfying({ string in - return string == "kittens" - })) - } - } - - func testContainElementSatisfyingNegativeCaseSpecificErrorMessage() { - let orderIndifferentArray = ["puppies", "kittens", "turtles"] - failsWithErrorMessage("expected to not find object in collection equal to 'kittens'") { - expect(orderIndifferentArray).toNot(containElementSatisfying({ string in - return string == "kittens" - }, "equal to 'kittens'")) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift deleted file mode 100644 index a63c79d..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift +++ /dev/null @@ -1,95 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class ContainTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ContainTest) -> () throws -> Void)] { - return [ - ("testContain", testContain), - ("testContainSubstring", testContainSubstring), - ("testContainObjCSubstring", testContainObjCSubstring), - ("testVariadicArguments", testVariadicArguments), - ("testCollectionArguments", testCollectionArguments), - ] - } - - func testContain() { - expect([1, 2, 3]).to(contain(1)) - expect([1, 2, 3] as [CInt]).to(contain(1 as CInt)) - expect([1, 2, 3] as [CInt]).toNot(contain(4 as CInt)) - expect(["foo", "bar", "baz"]).to(contain("baz")) - expect([1, 2, 3]).toNot(contain(4)) - expect(["foo", "bar", "baz"]).toNot(contain("ba")) -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray(array: ["a"])).to(contain(NSString(string: "a"))) - expect(NSArray(array: ["a"])).toNot(contain(NSString(string:"b"))) - expect(NSArray(object: 1) as NSArray?).to(contain(1)) -#endif - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain("bar")) - } - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain("b")) - } - - failsWithErrorMessageForNil("expected to contain , got ") { - expect(nil as [String]?).to(contain("bar")) - } - failsWithErrorMessageForNil("expected to not contain , got ") { - expect(nil as [String]?).toNot(contain("b")) - } - } - - func testContainSubstring() { - expect("foo").to(contain("o")) - expect("foo").to(contain("oo")) - expect("foo").toNot(contain("z")) - expect("foo").toNot(contain("zz")) - - failsWithErrorMessage("expected to contain , got ") { - expect("foo").to(contain("bar")) - } - failsWithErrorMessage("expected to not contain , got ") { - expect("foo").toNot(contain("oo")) - } - } - - func testContainObjCSubstring() { - let str = NSString(string: "foo") - expect(str).to(contain(NSString(string: "o"))) - expect(str).to(contain(NSString(string: "oo"))) - expect(str).toNot(contain(NSString(string: "z"))) - expect(str).toNot(contain(NSString(string: "zz"))) - } - - func testVariadicArguments() { - expect([1, 2, 3]).to(contain(1, 2)) - expect([1, 2, 3]).toNot(contain(1, 4)) - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain("a", "bar")) - } - - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain("b", "a")) - } - } - - func testCollectionArguments() { - expect([1, 2, 3]).to(contain([1, 2])) - expect([1, 2, 3]).toNot(contain([1, 4])) - - let collection = Array(1...10) - let slice = Array(collection[3...5]) - expect(collection).to(contain(slice)) - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain(["a", "bar"])) - } - - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain(["b", "a"])) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift deleted file mode 100644 index 30e3b26..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class EndWithTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (EndWithTest) -> () throws -> Void)] { - return [ - ("testEndWithPositives", testEndWithPositives), - ("testEndWithNegatives", testEndWithNegatives), - ] - } - - func testEndWithPositives() { - expect([1, 2, 3]).to(endWith(3)) - expect([1, 2, 3]).toNot(endWith(2)) - expect([]).toNot(endWith(1)) - expect(["a", "b", "a"]).to(endWith("a")) - - expect("foobar").to(endWith("bar")) - expect("foobar").toNot(endWith("oo")) - expect("foobarfoo").to(endWith("foo")) - - expect(NSString(string: "foobar").description).to(endWith("bar")) - expect(NSString(string: "foobar").description).toNot(endWith("oo")) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray(array: ["a", "b"])).to(endWith("b")) - expect(NSArray(array: ["a", "b"])).toNot(endWith("a")) - expect(NSArray(array: [])).toNot(endWith("a")) - expect(NSArray(array: ["a", "b", "a"])).to(endWith("a")) -#endif - } - - func testEndWithNegatives() { - failsWithErrorMessageForNil("expected to end with <2>, got ") { - expect(nil as [Int]?).to(endWith(2)) - } - failsWithErrorMessageForNil("expected to not end with <2>, got ") { - expect(nil as [Int]?).toNot(endWith(2)) - } - - failsWithErrorMessage("expected to end with <2>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(endWith(2)) - } - failsWithErrorMessage("expected to not end with <3>, got <[1, 2, 3]>") { - expect([1, 2, 3]).toNot(endWith(3)) - } - failsWithErrorMessage("expected to end with , got ") { - expect("batman").to(endWith("atm")) - } - failsWithErrorMessage("expected to not end with , got ") { - expect("batman").toNot(endWith("man")) - } - } - -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift deleted file mode 100644 index 48f8c28..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift +++ /dev/null @@ -1,276 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class EqualTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (EqualTest) -> () throws -> Void)] { - return [ - ("testEquality", testEquality), - ("testArrayEquality", testArrayEquality), - ("testSetEquality", testSetEquality), - ("testDoesNotMatchNils", testDoesNotMatchNils), - ("testDictionaryEquality", testDictionaryEquality), - ("testDataEquality", testDataEquality), - ("testNSObjectEquality", testNSObjectEquality), - ("testOperatorEquality", testOperatorEquality), - ("testOperatorEqualityWithArrays", testOperatorEqualityWithArrays), - ("testOperatorEqualityWithDictionaries", testOperatorEqualityWithDictionaries), - ("testOptionalEquality", testOptionalEquality), - ("testArrayOfOptionalsEquality", testArrayOfOptionalsEquality), - ("testDictionariesWithDifferentSequences", testDictionariesWithDifferentSequences), - ] - } - - func testEquality() { - expect(1 as CInt).to(equal(1 as CInt)) - expect(1 as CInt).to(equal(1)) - expect(1).to(equal(1)) - expect("hello").to(equal("hello")) - expect("hello").toNot(equal("world")) - - expect { - 1 - }.to(equal(1)) - - failsWithErrorMessage("expected to equal , got ") { - expect("hello").to(equal("world")) - } - failsWithErrorMessage("expected to not equal , got ") { - expect("hello").toNot(equal("hello")) - } - } - - func testArrayEquality() { - expect([1, 2, 3]).to(equal([1, 2, 3])) - expect([1, 2, 3]).toNot(equal([1, 2])) - expect([1, 2, 3]).toNot(equal([1, 2, 4])) - - let array1: [Int] = [1, 2, 3] - let array2: [Int] = [1, 2, 3] - expect(array1).to(equal(array2)) - expect(array1).to(equal([1, 2, 3])) - expect(array1).toNot(equal([1, 2] as [Int])) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray(array: [1, 2, 3])).to(equal(NSArray(array: [1, 2, 3]))) -#endif - - failsWithErrorMessage("expected to equal <[1, 2]>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(equal([1, 2])) - } - } - - func testSetEquality() { - expect(Set([1, 2])).to(equal(Set([1, 2]))) - expect(Set()).to(equal(Set())) - expect(Set()) == Set() - expect(Set([1, 2])) != Set() - - failsWithErrorMessageForNil("expected to equal <[1, 2]>, got ") { - expect(nil as Set?).to(equal(Set([1, 2]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3]>, missing <[1]>") { - expect(Set([2, 3])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[1, 2, 3, 4]>, extra <[4]>") { - expect(Set([1, 2, 3, 4])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3, 4]>, missing <[1]>, extra <[4]>") { - expect(Set([2, 3, 4])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3, 4]>, missing <[1]>, extra <[4]>") { - expect(Set([2, 3, 4])) == Set([1, 2, 3]) - } - - failsWithErrorMessage("expected to not equal <[1, 2, 3]>, got <[1, 2, 3]>") { - expect(Set([1, 2, 3])) != Set([1, 2, 3]) - } - } - - func testDoesNotMatchNils() { - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as String?).to(equal(nil as String?)) - } - failsWithErrorMessageForNil("expected to not equal , got ") { - expect("foo").toNot(equal(nil as String?)) - } - failsWithErrorMessageForNil("expected to not equal , got ") { - expect(nil as String?).toNot(equal("bar")) - } - - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as [Int]?).to(equal(nil as [Int]?)) - } - failsWithErrorMessageForNil("expected to not equal <[1]>, got ") { - expect(nil as [Int]?).toNot(equal([1])) - } - failsWithErrorMessageForNil("expected to not equal , got <[1]>") { - expect([1]).toNot(equal(nil as [Int]?)) - } - - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as [Int: Int]?).to(equal(nil as [Int: Int]?)) - } - failsWithErrorMessageForNil("expected to not equal <[1: 1]>, got ") { - expect(nil as [Int: Int]?).toNot(equal([1: 1])) - } - failsWithErrorMessageForNil("expected to not equal , got <[1: 1]>") { - expect([1: 1]).toNot(equal(nil as [Int: Int]?)) - } - - failsWithErrorMessageForNil("expected to not equal , got <1>") { - expect(1).toNot(equal(nil)) - } - } - - func testDictionaryEquality() { - expect(["foo": "bar"]).to(equal(["foo": "bar"])) - expect(["foo": "bar"]).toNot(equal(["foo": "baz"])) - - let actual = ["foo": "bar"] - let expected = ["foo": "bar"] - let unexpected = ["foo": "baz"] - expect(actual).to(equal(expected)) - expect(actual).toNot(equal(unexpected)) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString)).to(equal(["foo": "bar"])) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString) as? [String:String]).to(equal(expected)) -#endif - } - - func testDataEquality() { - let actual = "foobar".data(using: .utf8) - let expected = "foobar".data(using: .utf8) - let unexpected = "foobarfoo".data(using: .utf8) - - expect(actual).to(equal(expected)) - expect(actual).toNot(equal(unexpected)) - - #if os(Linux) - // FIXME: Swift on Linux triggers a segfault when calling NSData's hash() (last checked on 03-11) - let expectedErrorMessage = "expected to equal >, got >" - #else - let expectedErrorMessage = "expected to equal >," - + " got >" - #endif - - failsWithErrorMessage(expectedErrorMessage) { - expect(actual).to(equal(unexpected)) - } - } - - func testNSObjectEquality() { - expect(NSNumber(value:1)).to(equal(NSNumber(value:1))) - expect(NSNumber(value:1)) == NSNumber(value:1) - expect(NSNumber(value:1)) != NSNumber(value:2) - expect { NSNumber(value:1) }.to(equal(1)) - } - - func testOperatorEquality() { - expect("foo") == "foo" - expect("foo") != "bar" - - failsWithErrorMessage("expected to equal , got ") { - expect("hello") == "world" - return - } - failsWithErrorMessage("expected to not equal , got ") { - expect("hello") != "hello" - return - } - } - - func testOperatorEqualityWithArrays() { - let array1: [Int] = [1, 2, 3] - let array2: [Int] = [1, 2, 3] - let array3: [Int] = [1, 2] - expect(array1) == array2 - expect(array1) != array3 - } - - func testOperatorEqualityWithDictionaries() { - let dict1 = ["foo": "bar"] - let dict2 = ["foo": "bar"] - let dict3 = ["foo": "baz"] - expect(dict1) == dict2 - expect(dict1) != dict3 - } - - func testOptionalEquality() { - expect(1 as CInt?).to(equal(1)) - expect(1 as CInt?).to(equal(1 as CInt?)) - } - - func testArrayOfOptionalsEquality() { - let array1: [Int?] = [1, nil, 3] - let array2: [Int?] = [nil, 2, 3] - let array3: [Int?] = [1, nil, 3] - - expect(array1).toNot(equal(array2)) - expect(array1).to(equal(array3)) - expect(array2).toNot(equal(array3)) - - let allNils1: [String?] = [nil, nil, nil, nil] - let allNils2: [String?] = [nil, nil, nil, nil] - let notReallyAllNils: [String?] = [nil, nil, nil, "turtles"] - - expect(allNils1).to(equal(allNils2)) - expect(allNils1).toNot(equal(notReallyAllNils)) - - let noNils1: [Int?] = [1, 2, 3, 4, 5] - let noNils2: [Int?] = [1, 3, 5, 7, 9] - - expect(noNils1).toNot(equal(noNils2)) - - failsWithErrorMessage("expected to equal <[Optional(1), nil]>, got <[nil, Optional(2)]>") { - let arrayOfOptionalInts: [Int?] = [nil, 2] - let anotherArrayOfOptionalInts: [Int?] = [1, nil] - expect(arrayOfOptionalInts).to(equal(anotherArrayOfOptionalInts)) - return - } - } - - func testDictionariesWithDifferentSequences() { - // see: https://github.com/Quick/Nimble/issues/61 - // these dictionaries generate different orderings of sequences. - let result = ["how": 1, "think": 1, "didnt": 2, "because": 1, - "interesting": 1, "always": 1, "right": 1, "such": 1, - "to": 3, "say": 1, "cool": 1, "you": 1, - "weather": 3, "be": 1, "went": 1, "was": 2, - "sometimes": 1, "and": 3, "mind": 1, "rain": 1, - "whole": 1, "everything": 1, "weather.": 1, "down": 1, - "kind": 1, "mood.": 1, "it": 2, "everyday": 1, "might": 1, - "more": 1, "have": 2, "person": 1, "could": 1, "tenth": 2, - "night": 1, "write": 1, "Youd": 1, "affects": 1, "of": 3, - "Who": 1, "us": 1, "an": 1, "I": 4, "my": 1, "much": 2, - "wrong.": 1, "peacefully.": 1, "amazing": 3, "would": 4, - "just": 1, "grade.": 1, "Its": 2, "The": 2, "had": 1, "that": 1, - "the": 5, "best": 1, "but": 1, "essay": 1, "for": 1, "summer": 2, - "your": 1, "grade": 1, "vary": 1, "pretty": 1, "at": 1, "rain.": 1, - "about": 1, "allow": 1, "thought": 1, "in": 1, "sleep": 1, "a": 1, - "hot": 1, "really": 1, "beach": 1, "life.": 1, "we": 1, "although": 1, ] - - let storyCount = ["The": 2, "summer": 2, "of": 3, "tenth": 2, "grade": 1, - "was": 2, "the": 5, "best": 1, "my": 1, "life.": 1, "I": 4, - "went": 1, "to": 3, "beach": 1, "everyday": 1, "and": 3, - "we": 1, "had": 1, "amazing": 3, "weather.": 1, "weather": 3, - "didnt": 2, "really": 1, "vary": 1, "much": 2, "always": 1, - "pretty": 1, "hot": 1, "although": 1, "sometimes": 1, "at": 1, - "night": 1, "it": 2, "would": 4, "rain.": 1, "mind": 1, "rain": 1, - "because": 1, "cool": 1, "everything": 1, "down": 1, "allow": 1, - "us": 1, "sleep": 1, "peacefully.": 1, "Its": 2, "how": 1, - "affects": 1, "your": 1, "mood.": 1, "Who": 1, "have": 2, - "thought": 1, "that": 1, "could": 1, "write": 1, "a": 1, - "whole": 1, "essay": 1, "just": 1, "about": 1, "in": 1, - "grade.": 1, "kind": 1, "right": 1, "Youd": 1, "think": 1, - "for": 1, "such": 1, "an": 1, "interesting": 1, "person": 1, - "might": 1, "more": 1, "say": 1, "but": 1, "you": 1, "be": 1, "wrong.": 1, ] - - expect(result).to(equal(storyCount)) - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift deleted file mode 100644 index a0294c3..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble - -final class HaveCountTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (HaveCountTest) -> () throws -> Void)] { - return [ - ("testHaveCountForArray", testHaveCountForArray), - ("testHaveCountForDictionary", testHaveCountForDictionary), - ("testHaveCountForSet", testHaveCountForSet), - ] - } - - func testHaveCountForArray() { - expect([1, 2, 3]).to(haveCount(3)) - expect([1, 2, 3]).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Array with count 1, got 3\nActual Value: [1, 2, 3]") { - expect([1, 2, 3]).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Array with count 3, got 3\nActual Value: [1, 2, 3]") { - expect([1, 2, 3]).notTo(haveCount(3)) - } - } - - func testHaveCountForDictionary() { - let dictionary = ["1": 1, "2": 2, "3": 3] - expect(dictionary).to(haveCount(3)) - expect(dictionary).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Dictionary with count 1, got 3\nActual Value: \(stringify(dictionary))") { - expect(dictionary).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Dictionary with count 3, got 3" + - "\nActual Value: \(stringify(dictionary))") { - expect(dictionary).notTo(haveCount(3)) - } - } - - func testHaveCountForSet() { - let set = Set([1, 2, 3]) - expect(set).to(haveCount(3)) - expect(set).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Set with count 1, got 3" + - "\nActual Value: \(stringify(set))") { - expect(set).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Set with count 3, got 3" + - "\nActual Value: \(stringify(set))") { - expect(set).notTo(haveCount(3)) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift deleted file mode 100644 index 2d626f2..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift +++ /dev/null @@ -1,84 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class MatchErrorTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (MatchErrorTest) -> () throws -> Void)] { - return [ - ("testMatchErrorPositive", testMatchErrorPositive), - ("testMatchErrorNegative", testMatchErrorNegative), - ("testMatchNSErrorPositive", testMatchNSErrorPositive), - ("testMatchNSErrorNegative", testMatchNSErrorNegative), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testDoesNotMatchNils", testDoesNotMatchNils), - ] - } - - func testMatchErrorPositive() { - expect(NimbleError.laugh).to(matchError(NimbleError.laugh)) - expect(NimbleError.laugh).to(matchError(NimbleError.self)) - expect(EquatableError.parameterized(x: 1)).to(matchError(EquatableError.parameterized(x: 1))) - - expect(NimbleError.laugh as Error).to(matchError(NimbleError.laugh)) - } - - func testMatchErrorNegative() { - expect(NimbleError.laugh).toNot(matchError(NimbleError.cry)) - expect(NimbleError.laugh as Error).toNot(matchError(NimbleError.cry)) - expect(NimbleError.laugh).toNot(matchError(EquatableError.self)) - expect(EquatableError.parameterized(x: 1)).toNot(matchError(EquatableError.parameterized(x: 2))) - } - - func testMatchNSErrorPositive() { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 0, userInfo: nil) - - expect(error1).to(matchError(error2)) - } - - func testMatchNSErrorNegative() { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 1, userInfo: nil) - - expect(error1).toNot(matchError(error2)) - } - - func testMatchPositiveMessage() { - failsWithErrorMessage("expected to match error , got ") { - expect(EquatableError.parameterized(x: 1)).to(matchError(EquatableError.parameterized(x: 2))) - } - failsWithErrorMessage("expected to match error , got ") { - expect(NimbleError.laugh).to(matchError(NimbleError.cry)) - } - failsWithErrorMessage("expected to match error , got ") { - expect(CustomDebugStringConvertibleError.a).to(matchError(CustomDebugStringConvertibleError.b)) - } - - failsWithErrorMessage("expected to match error , got ") { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 1, userInfo: nil) - expect(error1).to(matchError(error2)) - } - } - - func testMatchNegativeMessage() { - failsWithErrorMessage("expected to not match error , got ") { - expect(NimbleError.laugh).toNot(matchError(NimbleError.laugh)) - } - - failsWithErrorMessage("expected to match error from type , got ") { - expect(NimbleError.laugh).to(matchError(EquatableError.self)) - } - } - - func testDoesNotMatchNils() { - failsWithErrorMessageForNil("expected to match error , got no error") { - expect(nil as Error?).to(matchError(NimbleError.laugh)) - } - - failsWithErrorMessageForNil("expected to not match error , got no error") { - expect(nil as Error?).toNot(matchError(NimbleError.laugh)) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift deleted file mode 100644 index a95ba56..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift +++ /dev/null @@ -1,46 +0,0 @@ -import XCTest -import Nimble - -final class MatchTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (MatchTest) -> () throws -> Void)] { - return [ - ("testMatchPositive", testMatchPositive), - ("testMatchNegative", testMatchNegative), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testMatchNils", testMatchNils), - ] - } - - func testMatchPositive() { - expect("11:14").to(match("\\d{2}:\\d{2}")) - } - - func testMatchNegative() { - expect("hello").toNot(match("\\d{2}:\\d{2}")) - } - - func testMatchPositiveMessage() { - let message = "expected to match <\\d{2}:\\d{2}>, got " - failsWithErrorMessage(message) { - expect("hello").to(match("\\d{2}:\\d{2}")) - } - } - - func testMatchNegativeMessage() { - let message = "expected to not match <\\d{2}:\\d{2}>, got <11:14>" - failsWithErrorMessage(message) { - expect("11:14").toNot(match("\\d{2}:\\d{2}")) - } - } - - func testMatchNils() { - failsWithErrorMessageForNil("expected to match <\\d{2}:\\d{2}>, got ") { - expect(nil as String?).to(match("\\d{2}:\\d{2}")) - } - - failsWithErrorMessageForNil("expected to not match <\\d{2}:\\d{2}>, got ") { - expect(nil as String?).toNot(match("\\d{2}:\\d{2}")) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift deleted file mode 100644 index ac7f9ec..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift +++ /dev/null @@ -1,91 +0,0 @@ -import XCTest -import Nimble -import Foundation - -final class PostNotificationTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (PostNotificationTest) -> () throws -> Void)] { - return [ - ("testPassesWhenNoNotificationsArePosted", testPassesWhenNoNotificationsArePosted), - ("testPassesWhenExpectedNotificationIsPosted", testPassesWhenExpectedNotificationIsPosted), - ("testPassesWhenAllExpectedNotificationsArePosted", testPassesWhenAllExpectedNotificationsArePosted), - ("testFailsWhenNoNotificationsArePosted", testFailsWhenNoNotificationsArePosted), - ("testFailsWhenNotificationWithWrongNameIsPosted", testFailsWhenNotificationWithWrongNameIsPosted), - ("testFailsWhenNotificationWithWrongObjectIsPosted", testFailsWhenNotificationWithWrongObjectIsPosted), - ("testPassesWhenExpectedNotificationEventuallyIsPosted", testPassesWhenExpectedNotificationEventuallyIsPosted), - ] - } - - let notificationCenter = NotificationCenter() - - func testPassesWhenNoNotificationsArePosted() { - expect { - // no notifications here! - return nil - }.to(postNotifications(beEmpty(), fromNotificationCenter: notificationCenter)) - } - - func testPassesWhenExpectedNotificationIsPosted() { - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - expect { - self.notificationCenter.post(testNotification) - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) - } - - func testPassesWhenAllExpectedNotificationsArePosted() { - let foo = NSNumber(value: 1) - let bar = NSNumber(value: 2) - let n1 = Notification(name: Notification.Name("Foo"), object: foo) - let n2 = Notification(name: Notification.Name("Bar"), object: bar) - expect { - self.notificationCenter.post(n1) - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1, n2]), fromNotificationCenter: notificationCenter)) - } - - func testFailsWhenNoNotificationsArePosted() { - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - failsWithErrorMessage("expected to equal <[\(testNotification)]>, got no notifications") { - expect { - // no notifications here! - return nil - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testFailsWhenNotificationWithWrongNameIsPosted() { - let n1 = Notification(name: Notification.Name("Foo"), object: nil) - let n2 = Notification(name: Notification.Name(n1.name.rawValue + "a"), object: nil) - failsWithErrorMessage("expected to equal <[\(n1)]>, got <[\(n2)]>") { - expect { - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testFailsWhenNotificationWithWrongObjectIsPosted() { - let n1 = Notification(name: Notification.Name("Foo"), object: nil) - let n2 = Notification(name: n1.name, object: NSObject()) - failsWithErrorMessage("expected to equal <[\(n1)]>, got <[\(n2)]>") { - expect { - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testPassesWhenExpectedNotificationEventuallyIsPosted() { - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - expect { - deferToMainQueue { - self.notificationCenter.post(testNotification) - } - return nil - }.toEventually(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) - #else - print("\(#function) is missing because toEventually is not implement on this platform") - #endif - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift deleted file mode 100644 index 9e6a6f5..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift +++ /dev/null @@ -1,166 +0,0 @@ -import XCTest -import Nimble - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - -final class RaisesExceptionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (RaisesExceptionTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testPositiveMatchesWithClosures", testPositiveMatchesWithClosures), - ("testNegativeMatches", testNegativeMatches), - ("testNegativeMatchesDoNotCallClosureWithoutException", testNegativeMatchesDoNotCallClosureWithoutException), - ("testNegativeMatchesWithClosure", testNegativeMatchesWithClosure), - ] - } - - var anException = NSException(name: NSExceptionName("laugh"), reason: "Lulz", userInfo: ["key": "value"]) - - func testPositiveMatches() { - expect { self.anException.raise() }.to(raiseException()) - expect { self.anException.raise() }.to(raiseException(named: "laugh")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) - } - - func testPositiveMatchesWithClosures() { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName("laugh"))) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("as")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("df")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("as")) - }) - } - - func testNegativeMatches() { - failsWithErrorMessage("expected to raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "foo")) - } - - failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "bar")) - } - - failsWithErrorMessage( - "expected to raise exception with name with reason with userInfo <{k = v;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["k": "v"])) - } - - failsWithErrorMessage("expected to raise any exception, got no exception") { - expect { self.anException }.to(raiseException()) - } - failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) - } - failsWithErrorMessage("expected to raise exception with name with reason , got no exception") { - expect { self.anException }.to(raiseException(named: "laugh", reason: "Lulz")) - } - - failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "bar", reason: "Lulz")) - } - failsWithErrorMessage("expected to not raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh")) - } - failsWithErrorMessage("expected to not raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz")) - } - - failsWithErrorMessage("expected to not raise exception with name with reason with userInfo <{key = value;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) - } - } - - func testNegativeMatchesDoNotCallClosureWithoutException() { - failsWithErrorMessage("expected to raise exception that satisfies block, got no exception") { - expect { self.anException }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName(rawValue:"foo"))) - }) - } - - failsWithErrorMessage("expected to raise exception with name that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo") { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to raise exception with name with reason that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "ha") { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to raise exception with name with reason with userInfo <{}> that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "Lulz", userInfo: [:]) { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) - } - } - - func testNegativeMatchesWithClosure() { - failsWithErrorMessage("expected to raise exception that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - let innerFailureMessage = "expected to begin with , got " - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "wrong") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{key = value;}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "Lulz", userInfo: [:]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - } -} -#endif diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift deleted file mode 100644 index 0bd9495..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble -import Foundation - -final class SatisfyAnyOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SatisfyAnyOfTest) -> () throws -> Void)] { - return [ - ("testSatisfyAnyOf", testSatisfyAnyOf), - ("testOperatorOr", testOperatorOr), - ] - } - - func testSatisfyAnyOf() { - expect(2).to(satisfyAnyOf(equal(2), equal(3))) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(satisfyAnyOf(equal(3), equal("turtles"))) -#else - expect(2 as NSNumber).toNot(satisfyAnyOf(equal(3 as NSNumber), equal("turtles" as NSString))) -#endif - expect([1, 2, 3]).to(satisfyAnyOf(equal([1, 2, 3]), allPass({$0 < 4}), haveCount(3))) - expect("turtle").toNot(satisfyAnyOf(contain("a"), endWith("magic"))) - expect(82.0).toNot(satisfyAnyOf(beLessThan(10.5), beGreaterThan(100.75), beCloseTo(50.1))) - expect(false).to(satisfyAnyOf(beTrue(), beFalse())) - expect(true).to(satisfyAnyOf(beTruthy(), beFalsy())) - - failsWithErrorMessage( - "expected to match one of: {equal <3>}, or {equal <4>}, or {equal <5>}, got 2") { - expect(2).to(satisfyAnyOf(equal(3), equal(4), equal(5))) - } - failsWithErrorMessage( - "expected to match one of: {all be less than 4, but failed first at element <5> in <[5, 6, 7]>}, or {equal <[1, 2, 3, 4]>}, got [5, 6, 7]") { - expect([5, 6, 7]).to(satisfyAnyOf(allPass("be less than 4", {$0 < 4}), equal([1, 2, 3, 4]))) - } - failsWithErrorMessage( - "expected to match one of: {be true}, got false") { - expect(false).to(satisfyAnyOf(beTrue())) - } - failsWithErrorMessage( - "expected to not match one of: {be less than <10.5>}, or {be greater than <100.75>}, or {be close to <50.1> (within 0.0001)}, got 50.10001") { - expect(50.10001).toNot(satisfyAnyOf(beLessThan(10.5), beGreaterThan(100.75), beCloseTo(50.1))) - } - } - - func testOperatorOr() { - expect(2).to(equal(2) || equal(3)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(equal(3) || equal("turtles")) -#else - expect(2 as NSNumber).toNot(equal(3 as NSNumber) || equal("turtles" as NSString)) -#endif - expect("turtle").toNot(contain("a") || endWith("magic")) - expect(82.0).toNot(beLessThan(10.5) || beGreaterThan(100.75)) - expect(false).to(beTrue() || beFalse()) - expect(true).to(beTruthy() || beFalsy()) - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift deleted file mode 100644 index 68086e0..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift +++ /dev/null @@ -1,62 +0,0 @@ -import Foundation -import XCTest -import Nimble - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - -final class ThrowAssertionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ThrowAssertionTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testErrorThrown", testErrorThrown), - ("testPostAssertionCodeNotRun", testPostAssertionCodeNotRun), - ("testNegativeMatch", testNegativeMatch), - ("testPositiveMessage", testPositiveMessage), - ("testNegativeMessage", testNegativeMessage), - ] - } - - func testPositiveMatch() { - expect { () -> Void in fatalError() }.to(throwAssertion()) - } - - func testErrorThrown() { - expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion()) - } - - func testPostAssertionCodeNotRun() { - var reachedPoint1 = false - var reachedPoint2 = false - - expect { - reachedPoint1 = true - precondition(false, "condition message") - reachedPoint2 = true - }.to(throwAssertion()) - - expect(reachedPoint1) == true - expect(reachedPoint2) == false - } - - func testNegativeMatch() { - var reachedPoint1 = false - - expect { reachedPoint1 = true }.toNot(throwAssertion()) - - expect(reachedPoint1) == true - } - - func testPositiveMessage() { - failsWithErrorMessage("expected to throw an assertion") { - expect { () -> Void? in return }.to(throwAssertion()) - } - } - - func testNegativeMessage() { - failsWithErrorMessage("expected to not throw an assertion") { - expect { () -> Void in fatalError() }.toNot(throwAssertion()) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift deleted file mode 100644 index f0e0f94..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift +++ /dev/null @@ -1,155 +0,0 @@ -import XCTest -import Nimble - -enum NimbleError: Error { - case laugh - case cry -} - -enum EquatableError: Error { - case parameterized(x: Int) -} - -extension EquatableError : Equatable { -} - -func == (lhs: EquatableError, rhs: EquatableError) -> Bool { - switch (lhs, rhs) { - case (.parameterized(let l), .parameterized(let r)): - return l == r - } -} - -enum CustomDebugStringConvertibleError: Error { - case a - case b -} - -extension CustomDebugStringConvertibleError : CustomDebugStringConvertible { - var debugDescription: String { - return "code=\(_code)" - } -} - -final class ThrowErrorTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ThrowErrorTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testPositiveMatchesWithClosures", testPositiveMatchesWithClosures), - ("testNegativeMatches", testNegativeMatches), - ("testPositiveNegatedMatches", testPositiveNegatedMatches), - ("testNegativeNegatedMatches", testNegativeNegatedMatches), - ("testNegativeMatchesDoNotCallClosureWithoutError", testNegativeMatchesDoNotCallClosureWithoutError), - ("testNegativeMatchesWithClosure", testNegativeMatchesWithClosure), - ] - } - - func testPositiveMatches() { - expect { throw NimbleError.laugh }.to(throwError()) - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh)) - expect { throw NimbleError.laugh }.to(throwError(errorType: NimbleError.self)) - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 1))) - expect { throw EquatableError.parameterized(x: 1) }.toNot(throwError(EquatableError.parameterized(x: 2))) - } - - func testPositiveMatchesWithClosures() { - // Generic typed closure - expect { throw EquatableError.parameterized(x: 42) }.to(throwError { error in - guard case EquatableError.parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Explicit typed closure - expect { throw EquatableError.parameterized(x: 42) }.to(throwError { (error: EquatableError) in - guard case .parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Typed closure over errorType argument - expect { throw EquatableError.parameterized(x: 42) }.to(throwError(errorType: EquatableError.self) { error in - guard case .parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Typed closure over error argument - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh) { (error: Error) in - expect(error._domain).to(beginWith("Nim")) - }) - // Typed closure over error argument - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh) { (error: Error) in - expect(error._domain).toNot(beginWith("as")) - }) - } - - func testNegativeMatches() { - // Same case, different arguments - failsWithErrorMessage("expected to throw error , got ") { - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 2))) - } - // Same case, different arguments - failsWithErrorMessage("expected to throw error , got ") { - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 2))) - } - // Different case - failsWithErrorMessage("expected to throw error , got ") { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.cry)) - } - // Different case with closure - failsWithErrorMessage("expected to throw error that satisfies block, got ") { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.cry) { _ in return }) - } - // Different case, implementing CustomDebugStringConvertible - failsWithErrorMessage("expected to throw error , got ") { - expect { throw CustomDebugStringConvertibleError.a }.to(throwError(CustomDebugStringConvertibleError.b)) - } - } - - func testPositiveNegatedMatches() { - // No error at all - expect { return }.toNot(throwError()) - // Different case - expect { throw NimbleError.laugh }.toNot(throwError(NimbleError.cry)) - } - - func testNegativeNegatedMatches() { - // No error at all - failsWithErrorMessage("expected to not throw any error, got ") { - expect { throw NimbleError.laugh }.toNot(throwError()) - } - // Different error - failsWithErrorMessage("expected to not throw error , got ") { - expect { throw NimbleError.laugh }.toNot(throwError(NimbleError.laugh)) - } - } - - func testNegativeMatchesDoNotCallClosureWithoutError() { - failsWithErrorMessage("expected to throw error that satisfies block, got no error") { - expect { return }.to(throwError { _ in - fail() - }) - } - - failsWithErrorMessage("expected to throw error that satisfies block, got no error") { - expect { return }.to(throwError(NimbleError.laugh) { _ in - fail() - }) - } - } - - func testNegativeMatchesWithClosure() { - let moduleName = "NimbleTests" - let innerFailureMessage = "expected to equal , got <\(moduleName).NimbleError>" - let closure = { (error: Error) in - expect(error._domain).to(equal("foo")) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(closure: closure)) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error from type that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(errorType: NimbleError.self, closure: closure)) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh, closure: closure)) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift deleted file mode 100644 index dde999a..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift +++ /dev/null @@ -1,36 +0,0 @@ -import XCTest -import Nimble - -final class ToSucceedTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ToSucceedTest) -> () throws -> Void)] { - return [ - ("testToSucceed", testToSucceed), - ] - } - - func testToSucceed() { - expect({ - return .succeeded - }).to(succeed()) - - expect({ - return .failed(reason: "") - }).toNot(succeed()) - - failsWithErrorMessageForNil("expected a closure, got ") { - expect(nil as (() -> ToSucceedResult)?).to(succeed()) - } - - failsWithErrorMessage("expected to succeed, got because ") { - expect({ - .failed(reason: "something went wrong") - }).to(succeed()) - } - - failsWithErrorMessage("expected to not succeed, got ") { - expect({ - return .succeeded - }).toNot(succeed()) - } - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/SynchronousTests.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/SynchronousTests.swift deleted file mode 100644 index ce8181b..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/SynchronousTests.swift +++ /dev/null @@ -1,128 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class SynchronousTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SynchronousTest) -> () throws -> Void)] { - return [ - ("testFailAlwaysFails", testFailAlwaysFails), - ("testUnexpectedErrorsThrownFails", testUnexpectedErrorsThrownFails), - ("testToMatchesIfMatcherReturnsTrue", testToMatchesIfMatcherReturnsTrue), - ("testToProvidesActualValueExpression", testToProvidesActualValueExpression), - ("testToProvidesAMemoizedActualValueExpression", testToProvidesActualValueExpression), - ("testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testToMatchAgainstLazyProperties", testToMatchAgainstLazyProperties), - ("testToNotMatchesIfMatcherReturnsTrue", testToNotMatchesIfMatcherReturnsTrue), - ("testToNotProvidesActualValueExpression", testToNotProvidesActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpression", testToNotProvidesAMemoizedActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testToNotNegativeMatches", testToNotNegativeMatches), - ("testNotToMatchesLikeToNot", testNotToMatchesLikeToNot), - ] - } - - class Error: Swift.Error {} - let errorToThrow = Error() - - private func doThrowError() throws -> Int { - throw errorToThrow - } - - func testFailAlwaysFails() { - failsWithErrorMessage("My error message") { - fail("My error message") - } - failsWithErrorMessage("fail() always fails") { - fail() - } - } - - func testUnexpectedErrorsThrownFails() { - failsWithErrorMessage("unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.to(equal(1)) - } - failsWithErrorMessage("unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toNot(equal(1)) - } - } - - func testToMatchesIfMatcherReturnsTrue() { - expect(1).to(MatcherFunc { _, _ in true }) - expect {1}.to(MatcherFunc { _, _ in true }) - } - - func testToProvidesActualValueExpression() { - var value: Int? - expect(1).to(MatcherFunc { expr, _ in value = try expr.evaluate(); return true }) - expect(value).to(equal(1)) - } - - func testToProvidesAMemoizedActualValueExpression() { - var callCount = 0 - expect { callCount += 1 }.to(MatcherFunc { expr, _ in - _ = try expr.evaluate() - _ = try expr.evaluate() - return true - }) - expect(callCount).to(equal(1)) - } - - func testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { - var callCount = 0 - expect { callCount += 1 }.to(MatcherFunc { expr, _ in - expect(callCount).to(equal(0)) - _ = try expr.evaluate() - return true - }) - expect(callCount).to(equal(1)) - } - - func testToMatchAgainstLazyProperties() { - expect(ObjectWithLazyProperty().value).to(equal("hello")) - expect(ObjectWithLazyProperty().value).toNot(equal("world")) - expect(ObjectWithLazyProperty().anotherValue).to(equal("world")) - expect(ObjectWithLazyProperty().anotherValue).toNot(equal("hello")) - } - - // repeated tests from to() for toNot() - func testToNotMatchesIfMatcherReturnsTrue() { - expect(1).toNot(MatcherFunc { _, _ in false }) - expect {1}.toNot(MatcherFunc { _, _ in false }) - } - - func testToNotProvidesActualValueExpression() { - var value: Int? - expect(1).toNot(MatcherFunc { expr, _ in value = try expr.evaluate(); return false }) - expect(value).to(equal(1)) - } - - func testToNotProvidesAMemoizedActualValueExpression() { - var callCount = 0 - expect { callCount += 1 }.toNot(MatcherFunc { expr, _ in - _ = try expr.evaluate() - _ = try expr.evaluate() - return false - }) - expect(callCount).to(equal(1)) - } - - func testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { - var callCount = 0 - expect { callCount += 1 }.toNot(MatcherFunc { expr, _ in - expect(callCount).to(equal(0)) - _ = try expr.evaluate() - return false - }) - expect(callCount).to(equal(1)) - } - - func testToNotNegativeMatches() { - failsWithErrorMessage("expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { _, _ in true }) - } - } - - func testNotToMatchesLikeToNot() { - expect(1).notTo(MatcherFunc { _, _ in false }) - } -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/UserDescriptionTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/UserDescriptionTest.swift deleted file mode 100644 index 9bb64b6..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/UserDescriptionTest.swift +++ /dev/null @@ -1,64 +0,0 @@ -import XCTest -import Nimble - -final class UserDescriptionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (UserDescriptionTest) -> () throws -> Void)] { - return [ - ("testToMatcher_CustomFailureMessage", testToMatcher_CustomFailureMessage), - ("testNotToMatcher_CustomFailureMessage", testNotToMatcher_CustomFailureMessage), - ("testToNotMatcher_CustomFailureMessage", testToNotMatcher_CustomFailureMessage), - ("testToEventuallyMatch_CustomFailureMessage", testToEventuallyMatch_CustomFailureMessage), - ("testToEventuallyNotMatch_CustomFailureMessage", testToEventuallyNotMatch_CustomFailureMessage), - ("testToNotEventuallyMatch_CustomFailureMessage", testToNotEventuallyMatch_CustomFailureMessage), - ] - } - - func testToMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to match, got <1>") { - expect(1).to(MatcherFunc { _, _ in false }, description: "These aren't equal!") - } - } - - func testNotToMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to not match, got <1>") { - expect(1).notTo(MatcherFunc { _, _ in true }, description: "These aren't equal!") - } - } - - func testToNotMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { _, _ in true }, description: "These aren't equal!") - } - } - - func testToEventuallyMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't eventually equal!\n" + - "expected to eventually equal <1>, got <0>") { - expect { 0 }.toEventually(equal(1), description: "These aren't eventually equal!") - } - } - - func testToEventuallyNotMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These are eventually equal!\n" + - "expected to eventually not equal <1>, got <1>") { - expect { 1 }.toEventuallyNot(equal(1), description: "These are eventually equal!") - } - } - - func testToNotEventuallyMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These are eventually equal!\n" + - "expected to eventually not equal <1>, got <1>") { - expect { 1 }.toEventuallyNot(equal(1), description: "These are eventually equal!") - } - } - -} diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h deleted file mode 100644 index 282993d..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h +++ /dev/null @@ -1,15 +0,0 @@ -@import Nimble; -#import "NimbleTests-Swift.h" - -// Use this when you want to verify the failure message for when an expectation fails -#define expectFailureMessage(MSG, BLOCK) \ -[NimbleHelper expectFailureMessage:(MSG) block:(BLOCK) file:@(__FILE__) line:__LINE__]; - -#define expectFailureMessages(MSGS, BLOCK) \ -[NimbleHelper expectFailureMessages:(MSGS) block:(BLOCK) file:@(__FILE__) line:__LINE__]; - - -// Use this when you want to verify the failure message with the nil message postfixed -// to it: " (use beNil() to match nils)" -#define expectNilFailureMessage(MSG, BLOCK) \ -[NimbleHelper expectFailureMessageForNil:(MSG) block:(BLOCK) file:@(__FILE__) line:__LINE__]; diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m deleted file mode 100644 index 4bdc021..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m +++ /dev/null @@ -1,38 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCAllPassTest : XCTestCase - -@end - -@implementation ObjCAllPassTest - -- (void)testPositiveMatches { - expect(@[@1, @2, @3,@4]).to(allPass(beLessThan(@5))); - expect(@[@1, @2, @3,@4]).toNot(allPass(beGreaterThan(@5))); - - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).to(allPass(beLessThan(@5))); - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).toNot(allPass(beGreaterThan(@5))); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to all be less than <3>, but failed first at element" - " <3> in <[1, 2, 3, 4]>", ^{ - expect(@[@1, @2, @3, @4]).to(allPass(beLessThan(@3))); - }); - expectFailureMessage(@"expected to not all be less than <5>", ^{ - expect(@[@1, @2, @3, @4]).toNot(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"expected to not all be less than <5>", ^{ - expect([NSSet setWithArray:@[@1, @2, @3, @4]]).toNot(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"allPass can only be used with types which implement NSFastEnumeration " - "(NSArray, NSSet, ...), and whose elements subclass NSObject, got <3>", ^{ - expect(@3).to(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"allPass can only be used with types which implement NSFastEnumeration " - "(NSArray, NSSet, ...), and whose elements subclass NSObject, got <3>", ^{ - expect(@3).toNot(allPass(beLessThan(@5))); - }); -} -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m deleted file mode 100644 index f052e74..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m +++ /dev/null @@ -1,55 +0,0 @@ -#import -#import -#import "NimbleSpecHelper.h" - -@interface ObjCAsyncTest : XCTestCase - -@end - -@implementation ObjCAsyncTest - -- (void)testAsync { - __block id obj = @1; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - obj = nil; - }); - expect(obj).toEventually(beNil()); -} - - -- (void)testAsyncWithCustomTimeout { - __block id obj = nil; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - obj = @1; - }); - expect(obj).withTimeout(5).toEventuallyNot(beNil()); -} - -- (void)testAsyncCallback { - waitUntil(^(void (^done)(void)){ - done(); - }); - - expectFailureMessage(@"Waited more than 1.0 second", ^{ - waitUntil(^(void (^done)(void)){ /* ... */ }); - }); - - expectFailureMessage(@"Waited more than 0.01 seconds", ^{ - waitUntilTimeout(0.01, ^(void (^done)(void)){ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [NSThread sleepForTimeInterval:0.1]; - done(); - }); - }); - }); - - expectFailureMessage(@"expected to equal , got ", ^{ - waitUntil(^(void (^done)(void)){ - [NSThread sleepForTimeInterval:0.1]; - expect(@"hello").to(equal(@"goodbye")); - done(); - }); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m deleted file mode 100644 index f5fca2d..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m +++ /dev/null @@ -1,34 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeAnInstanceOfTest : XCTestCase -@end - -@implementation ObjCBeAnInstanceOfTest - -- (void)testPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(beAnInstanceOf([NSNull class])); - expect(@1).toNot(beAnInstanceOf([NSNull class])); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be an instance of NSNull, got <__NSCFNumber instance>", ^{ - expect(@1).to(beAnInstanceOf([NSNull class])); - }); - expectFailureMessage(@"expected to not be an instance of NSNull, got ", ^{ - expect([NSNull null]).toNot(beAnInstanceOf([NSNull class])); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be an instance of NSNull, got ", ^{ - expect(nil).to(beAnInstanceOf([NSNull class])); - }); - - expectNilFailureMessage(@"expected to not be an instance of NSNull, got ", ^{ - expect(nil).toNot(beAnInstanceOf([NSNull class])); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m deleted file mode 100644 index c33d643..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m +++ /dev/null @@ -1,47 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeCloseToTest : XCTestCase - -@end - -@implementation ObjCBeCloseToTest - -- (void)testPositiveMatches { - expect(@1.2).to(beCloseTo(@1.2001)); - expect(@1.2).to(beCloseTo(@2).within(10)); - expect(@2).toNot(beCloseTo(@1)); - expect(@1.00001).toNot(beCloseTo(@1).within(0.00000001)); - - expect(1.2).to(beCloseTo(1.2001)); - expect(1.2).to(beCloseTo(2).within(10)); - expect(2).toNot(beCloseTo(1)); - expect(1.00001).toNot(beCloseTo(1).within(0.00000001)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be close to <0> (within 0.001), got <1>", ^{ - expect(@1).to(beCloseTo(@0)); - }); - expectFailureMessage(@"expected to not be close to <0> (within 0.001), got <0.0001>", ^{ - expect(@(0.0001)).toNot(beCloseTo(@0)); - }); - expectFailureMessage(@"expected to be close to <0> (within 0.001), got <1>", ^{ - expect(1).to(beCloseTo(0)); - }); - expectFailureMessage(@"expected to not be close to <0> (within 0.001), got <0.0001>", ^{ - expect(0.0001).toNot(beCloseTo(0)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be close to <0> (within 0.001), got ", ^{ - expect(nil).to(beCloseTo(@0)); - }); - expectNilFailureMessage(@"expected to not be close to <0> (within 0.001), got ", ^{ - expect(nil).toNot(beCloseTo(@0)); - }); -} - - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m deleted file mode 100644 index 5e803cb..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m +++ /dev/null @@ -1,89 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeEmptyTest : XCTestCase -@end - -@implementation ObjCBeEmptyTest - -- (void)testPositiveMatches { - expect(@[]).to(beEmpty()); - expect(@"").to(beEmpty()); - expect(@{}).to(beEmpty()); - expect([NSSet set]).to(beEmpty()); - expect([NSIndexSet indexSet]).to(beEmpty()); - expect([NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]).to(beEmpty()); - - expect(@[@1, @2]).toNot(beEmpty()); - expect(@"a").toNot(beEmpty()); - expect(@{@"key": @"value"}).toNot(beEmpty()); - expect([NSSet setWithObject:@1]).toNot(beEmpty()); - expect([NSIndexSet indexSetWithIndex:1]).toNot(beEmpty()); - - NSHashTable *table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - expect(table).toNot(beEmpty()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be empty, got ", ^{ - expect(@"foo").to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <(1)>", ^{ - expect(@[@1]).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <{key = value;}>", ^{ - expect(@{@"key": @"value"}).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <{(1)}>", ^{ - expect([NSSet setWithObject:@1]).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <(1)>", ^{ - expect([NSIndexSet indexSetWithIndex:1]).to(beEmpty()); - }); - NSHashTable *table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - NSString *tableString = [[table description] stringByReplacingOccurrencesOfString:@"\n" withString:@""]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be empty, got <%@>", tableString]), ^{ - expect(table).to(beEmpty()); - }); - - expectFailureMessage(@"expected to not be empty, got <>", ^{ - expect(@"").toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <()>", ^{ - expect(@[]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <{}>", ^{ - expect(@{}).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <{()}>", ^{ - expect([NSSet set]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <()>", ^{ - expect([NSIndexSet indexSet]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got ", ^{ - expect([NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]).toNot(beEmpty()); - }); -} - -- (void)testItDoesNotMatchNil { - expectNilFailureMessage(@"expected to be empty, got ", ^{ - expect(nil).to(beEmpty()); - }); - expectNilFailureMessage(@"expected to not be empty, got ", ^{ - expect(nil).toNot(beEmpty()); - }); -} - -- (void)testItReportsTypesItMatchesAgainst { - expectFailureMessage(@"expected to be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings), got __NSCFNumber type", ^{ - expect(@1).to(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings), got __NSCFNumber type", ^{ - expect(@1).toNot(beEmpty()); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m deleted file mode 100644 index 5a5bce8..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m +++ /dev/null @@ -1,46 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeFalseTest : XCTestCase - -@end - -@implementation ObjCBeFalseTest - -- (void)testPositiveMatches { - expect(@NO).to(beFalse()); - expect(@YES).toNot(beFalse()); - - expect(false).to(beFalse()); - expect(true).toNot(beFalse()); - - expect(NO).to(beFalse()); - expect(YES).toNot(beFalse()); - - expect(10).toNot(beFalse()); -} - -- (void)testNegativeMatches { - expectNilFailureMessage(@"expected to be false, got ", ^{ - expect(nil).to(beFalse()); - }); - expectNilFailureMessage(@"expected to not be false, got ", ^{ - expect(nil).toNot(beFalse()); - }); - - expectFailureMessage(@"expected to be false, got <1>", ^{ - expect(true).to(beFalse()); - }); - expectFailureMessage(@"expected to not be false, got <0>", ^{ - expect(false).toNot(beFalse()); - }); - - expectFailureMessage(@"expected to be false, got <1>", ^{ - expect(YES).to(beFalse()); - }); - expectFailureMessage(@"expected to not be false, got <0>", ^{ - expect(NO).toNot(beFalse()); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m deleted file mode 100644 index f3f5c98..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m +++ /dev/null @@ -1,58 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeFalsyTest : XCTestCase - -@end - -@implementation ObjCBeFalsyTest - -- (void)testPositiveMatches { - expect(@NO).to(beFalsy()); - expect(@YES).toNot(beFalsy()); - expect(nil).to(beFalsy()); - - expect(true).toNot(beFalsy()); - expect(false).to(beFalsy()); - - expect(YES).toNot(beFalsy()); - expect(NO).to(beFalsy()); - - expect(10).toNot(beFalsy()); - expect(0).to(beFalsy()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to not be falsy, got ", ^{ - expect(nil).toNot(beFalsy()); - }); - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(@1).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(@NO).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(true).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(false).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(YES).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(NO).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <10>", ^{ - expect(10).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(0).toNot(beFalsy()); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m deleted file mode 100644 index 28862ba..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m +++ /dev/null @@ -1,44 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeGreaterThanOrEqualToTest : XCTestCase - -@end - -@implementation ObjCBeGreaterThanOrEqualToTest - -- (void)testPositiveMatches { - expect(@2).to(beGreaterThanOrEqualTo(@2)); - expect(@2).toNot(beGreaterThanOrEqualTo(@3)); - expect(2).to(beGreaterThanOrEqualTo(0)); - expect(2).to(beGreaterThanOrEqualTo(2)); - expect(2).toNot(beGreaterThanOrEqualTo(3)); - expect(2.5).to(beGreaterThanOrEqualTo(2)); - expect(2.5).to(beGreaterThanOrEqualTo(2.5)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be greater than or equal to <0>, got <-1>", ^{ - expect(@(-1)).to(beGreaterThanOrEqualTo(@0)); - }); - expectFailureMessage(@"expected to not be greater than or equal to <1>, got <2>", ^{ - expect(@2).toNot(beGreaterThanOrEqualTo(@(1))); - }); - expectFailureMessage(@"expected to be greater than or equal to <0>, got <-1>", ^{ - expect(-1).to(beGreaterThanOrEqualTo(0)); - }); - expectFailureMessage(@"expected to not be greater than or equal to <1>, got <2>", ^{ - expect(2).toNot(beGreaterThanOrEqualTo(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be greater than or equal to <-1>, got ", ^{ - expect(nil).to(beGreaterThanOrEqualTo(@(-1))); - }); - expectNilFailureMessage(@"expected to not be greater than or equal to <1>, got ", ^{ - expect(nil).toNot(beGreaterThanOrEqualTo(@(1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m deleted file mode 100644 index 5a57d54..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m +++ /dev/null @@ -1,42 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeGreaterThanTest : XCTestCase - -@end - -@implementation ObjCBeGreaterThanTest - -- (void)testPositiveMatches { - expect(@2).to(beGreaterThan(@1)); - expect(@2).toNot(beGreaterThan(@2)); - expect(@2).to(beGreaterThan(0)); - expect(@2).toNot(beGreaterThan(2)); - expect(2.5).to(beGreaterThan(1.5)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be greater than <0>, got <-1>", ^{ - expect(@(-1)).to(beGreaterThan(@(0))); - }); - expectFailureMessage(@"expected to not be greater than <1>, got <2>", ^{ - expect(@2).toNot(beGreaterThan(@(1))); - }); - expectFailureMessage(@"expected to be greater than <0>, got <-1>", ^{ - expect(-1).to(beGreaterThan(0)); - }); - expectFailureMessage(@"expected to not be greater than <1>, got <2>", ^{ - expect(2).toNot(beGreaterThan(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be greater than <-1>, got ", ^{ - expect(nil).to(beGreaterThan(@(-1))); - }); - expectNilFailureMessage(@"expected to not be greater than <1>, got ", ^{ - expect(nil).toNot(beGreaterThan(@(1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m deleted file mode 100644 index a9d9d51..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m +++ /dev/null @@ -1,68 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeIdenticalToTest : XCTestCase - -@end - -@implementation ObjCBeIdenticalToTest - -- (void)testPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(beIdenticalTo([NSNull null])); - expect(@2).toNot(beIdenticalTo(@3)); -} - -- (void)testNegativeMatches { - NSNull *obj = [NSNull null]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be identical to <%p>, got <%p>", obj, @2]), ^{ - expect(@2).to(beIdenticalTo(obj)); - }); - expectFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got <%p>", obj, obj]), ^{ - expect(obj).toNot(beIdenticalTo(obj)); - }); -} - -- (void)testNilMatches { - NSNull *obj = [NSNull null]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnonnull" - expectNilFailureMessage(@"expected to be identical to nil, got nil", ^{ - expect(nil).to(beIdenticalTo(nil)); - }); -#pragma clang diagnostic pop - expectNilFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got nil", obj]), ^{ - expect(nil).toNot(beIdenticalTo(obj)); - }); -} - -- (void)testAliasPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(be([NSNull null])); - expect(@2).toNot(be(@3)); -} - -- (void)testAliasNegativeMatches { - NSNull *obj = [NSNull null]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be identical to <%p>, got <%p>", obj, @2]), ^{ - expect(@2).to(be(obj)); - }); - expectFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got <%p>", obj, obj]), ^{ - expect(obj).toNot(be(obj)); - }); -} - -- (void)testAliasNilMatches { - NSNull *obj = [NSNull null]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnonnull" - expectNilFailureMessage(@"expected to be identical to nil, got nil", ^{ - expect(nil).to(be(nil)); - }); -#pragma clang diagnostic pop - expectNilFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got nil", obj]), ^{ - expect(nil).toNot(be(obj)); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m deleted file mode 100644 index 7eee261..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m +++ /dev/null @@ -1,34 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeKindOfTest : XCTestCase - -@end - -@implementation ObjCBeKindOfTest - -- (void)testPositiveMatches { - NSMutableArray *array = [NSMutableArray array]; - expect(array).to(beAKindOf([NSArray class])); - expect(@1).toNot(beAKindOf([NSNull class])); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be a kind of NSNull, got <__NSCFNumber instance>", ^{ - expect(@1).to(beAKindOf([NSNull class])); - }); - expectFailureMessage(@"expected to not be a kind of NSNull, got ", ^{ - expect([NSNull null]).toNot(beAKindOf([NSNull class])); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be a kind of NSNull, got ", ^{ - expect(nil).to(beAKindOf([NSNull class])); - }); - expectNilFailureMessage(@"expected to not be a kind of NSNull, got ", ^{ - expect(nil).toNot(beAKindOf([NSNull class])); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m deleted file mode 100644 index 4a738ec..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m +++ /dev/null @@ -1,43 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeLessThanOrEqualToTest : XCTestCase - -@end - -@implementation ObjCBeLessThanOrEqualToTest - -- (void)testPositiveMatches { - expect(@2).to(beLessThanOrEqualTo(@2)); - expect(@2).toNot(beLessThanOrEqualTo(@1)); - expect(2).to(beLessThanOrEqualTo(2)); - expect(2).toNot(beLessThanOrEqualTo(1)); - expect(2).toNot(beLessThanOrEqualTo(0)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be less than or equal to <1>, got <2>", ^{ - expect(@2).to(beLessThanOrEqualTo(@1)); - }); - expectFailureMessage(@"expected to not be less than or equal to <1>, got <1>", ^{ - expect(@1).toNot(beLessThanOrEqualTo(@1)); - }); - - expectFailureMessage(@"expected to be less than or equal to <1>, got <2>", ^{ - expect(2).to(beLessThanOrEqualTo(1)); - }); - expectFailureMessage(@"expected to not be less than or equal to <1>, got <1>", ^{ - expect(1).toNot(beLessThanOrEqualTo(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be less than or equal to <1>, got ", ^{ - expect(nil).to(beLessThanOrEqualTo(@1)); - }); - expectNilFailureMessage(@"expected to not be less than or equal to <-1>, got ", ^{ - expect(nil).toNot(beLessThanOrEqualTo(@(-1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m deleted file mode 100644 index 9750641..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m +++ /dev/null @@ -1,42 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeLessThanTest : XCTestCase - -@end - -@implementation ObjCBeLessThanTest - -- (void)testPositiveMatches { - expect(@2).to(beLessThan(@3)); - expect(@2).toNot(beLessThan(@2)); - expect(2).to(beLessThan(3)); - expect(2).toNot(beLessThan(2)); - expect(2).toNot(beLessThan(0)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be less than <0>, got <1>", ^{ - expect(@(1)).to(beLessThan(@0)); - }); - expectFailureMessage(@"expected to not be less than <1>, got <0>", ^{ - expect(@0).toNot(beLessThan(@1)); - }); - expectFailureMessage(@"expected to be less than <0>, got <1>", ^{ - expect(1).to(beLessThan(0)); - }); - expectFailureMessage(@"expected to not be less than <1>, got <0>", ^{ - expect(0).toNot(beLessThan(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be less than <-1>, got ", ^{ - expect(nil).to(beLessThan(@(-1))); - }); - expectNilFailureMessage(@"expected to not be less than <1>, got ", ^{ - expect(nil).toNot(beLessThan(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m deleted file mode 100644 index a43ee50..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m +++ /dev/null @@ -1,24 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeNilTest : XCTestCase - -@end - -@implementation ObjCBeNilTest - -- (void)testPositiveMatches { - expect(nil).to(beNil()); - expect(@NO).toNot(beNil()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be nil, got <1>", ^{ - expect(@1).to(beNil()); - }); - expectFailureMessage(@"expected to not be nil, got ", ^{ - expect(nil).toNot(beNil()); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m deleted file mode 100644 index c669475..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m +++ /dev/null @@ -1,47 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeTrueTest : XCTestCase - -@end - -@implementation ObjCBeTrueTest - -- (void)testPositiveMatches { - expect(@YES).to(beTrue()); - expect(@NO).toNot(beTrue()); - expect(nil).toNot(beTrue()); - - expect(true).to(beTrue()); - expect(false).toNot(beTrue()); - - expect(YES).to(beTrue()); - expect(NO).toNot(beTrue()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(@NO).to(beTrue()); - }); - expectFailureMessage(@"expected to be true, got ", ^{ - expect(nil).to(beTrue()); - }); - - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(false).to(beTrue()); - }); - - expectFailureMessage(@"expected to not be true, got <1>", ^{ - expect(true).toNot(beTrue()); - }); - - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(NO).to(beTrue()); - }); - - expectFailureMessage(@"expected to not be true, got <1>", ^{ - expect(YES).toNot(beTrue()); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m deleted file mode 100644 index 1ad7913..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m +++ /dev/null @@ -1,55 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeTruthyTest : XCTestCase - -@end - -@implementation ObjCBeTruthyTest - -- (void)testPositiveMatches { - expect(@YES).to(beTruthy()); - expect(@NO).toNot(beTruthy()); - expect(nil).toNot(beTruthy()); - - expect(true).to(beTruthy()); - expect(false).toNot(beTruthy()); - - expect(YES).to(beTruthy()); - expect(NO).toNot(beTruthy()); - - expect(10).to(beTruthy()); - expect(0).toNot(beTruthy()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be truthy, got ", ^{ - expect(nil).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(@1).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(@NO).to(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(false).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(true).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(NO).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(YES).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <10>", ^{ - expect(10).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(0).to(beTruthy()); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m deleted file mode 100644 index 5ca7be4..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m +++ /dev/null @@ -1,37 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeginWithTest : XCTestCase - -@end - -@implementation ObjCBeginWithTest - -- (void)testPositiveMatches { - expect(@"hello world!").to(beginWith(@"hello")); - expect(@"hello world!").toNot(beginWith(@"world")); - - NSArray *array = @[@1, @2]; - expect(array).to(beginWith(@1)); - expect(array).toNot(beginWith(@2)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to begin with , got ", ^{ - expect(@"foo").to(beginWith(@"bar")); - }); - expectFailureMessage(@"expected to not begin with , got ", ^{ - expect(@"foo").toNot(beginWith(@"foo")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to begin with <1>, got ", ^{ - expect(nil).to(beginWith(@1)); - }); - expectNilFailureMessage(@"expected to not begin with <1>, got ", ^{ - expect(nil).toNot(beginWith(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainElementSatisfying.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainElementSatisfying.m deleted file mode 100644 index b15d6c3..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainElementSatisfying.m +++ /dev/null @@ -1,64 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCContainElementSatisfyingTest : XCTestCase - -@end - -@implementation ObjCContainElementSatisfyingTest - -- (void)testPassingMatches { - NSArray *orderIndifferentArray = @[@1, @2, @3]; - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@1]; - })); - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@2]; - })); - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@3]; - })); - - orderIndifferentArray = @[@3, @1, @2]; - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@1]; - })); - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@2]; - })); - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@3]; - })); - - NSSet *orderIndifferentSet = [NSSet setWithObjects:@"turtle test", @"turtle assessment", nil]; - expect(orderIndifferentSet).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToString:@"turtle assessment"]; - })); -} - -- (void)testFailingMatches { - expectFailureMessage(@"expected to find object in collection that satisfies predicate", ^{ - expect(@[@1]).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@2]; - })); - }); - expectFailureMessage(@"containElementSatisfying must be provided an NSFastEnumeration object", ^{ - expect((nil)).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@3]; - })); - }); - expectFailureMessage(@"containElementSatisfying must be provided an NSFastEnumeration object", ^{ - expect((@3)).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@3]; - })); - }); -} - -- (void)testNegativeCases { - NSArray *orderIndifferentArray = @[@"puppies", @"kittens", @"turtles"]; - expect(orderIndifferentArray).toNot(containElementSatisfying(^BOOL(id object) { - return [object isEqualToString:@"armadillos"]; - })); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m deleted file mode 100644 index 8b954fe..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m +++ /dev/null @@ -1,67 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCContainTest : XCTestCase - -@end - -@implementation ObjCContainTest - -- (void)testPositiveMatches { - NSArray *array = @[@1, @2]; - expect(array).to(contain(@1)); - expect(array).toNot(contain(@"HI")); - expect(@"String").to(contain(@"Str")); - expect(@"Other").toNot(contain(@"Str")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to contain <3>, got <(1, 2)>", ^{ - expect((@[@1, @2])).to(contain(@3)); - }); - expectFailureMessage(@"expected to not contain <2>, got <(1, 2)>", ^{ - expect((@[@1, @2])).toNot(contain(@2)); - }); - - expectFailureMessage(@"expected to contain , got ", ^{ - expect(@"la").to(contain(@"hi")); - }); - expectFailureMessage(@"expected to not contain , got ", ^{ - expect(@"hihihi").toNot(contain(@"hi")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to contain <3>, got ", ^{ - expect(nil).to(contain(@3)); - }); - expectNilFailureMessage(@"expected to not contain <3>, got ", ^{ - expect(nil).toNot(contain(@3)); - }); - - expectNilFailureMessage(@"expected to contain , got ", ^{ - expect(nil).to(contain(@"hi")); - }); - expectNilFailureMessage(@"expected to not contain , got ", ^{ - expect(nil).toNot(contain(@"hi")); - }); -} - -- (void)testVariadicArguments { - NSArray *array = @[@1, @2]; - expect(array).to(contain(@1, @2)); - expect(array).toNot(contain(@"HI", @"whale")); - expect(@"String").to(contain(@"Str", @"ng")); - expect(@"Other").toNot(contain(@"Str", @"Oth")); - - - expectFailureMessage(@"expected to contain , got <(a, b, c)>", ^{ - expect(@[@"a", @"b", @"c"]).to(contain(@"a", @"bar")); - }); - - expectFailureMessage(@"expected to not contain , got <(a, b, c)>", ^{ - expect(@[@"a", @"b", @"c"]).toNot(contain(@"a", @"b")); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m deleted file mode 100644 index b960f01..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m +++ /dev/null @@ -1,37 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCEndWithTest : XCTestCase - -@end - -@implementation ObjCEndWithTest - -- (void)testPositiveMatches { - NSArray *array = @[@1, @2]; - expect(@"hello world!").to(endWith(@"world!")); - expect(@"hello world!").toNot(endWith(@"hello")); - expect(array).to(endWith(@2)); - expect(array).toNot(endWith(@1)); - expect(@1).toNot(contain(@"foo")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to end with , got ", ^{ - expect(@"hello world!").to(endWith(@"?")); - }); - expectFailureMessage(@"expected to not end with , got ", ^{ - expect(@"hello world!").toNot(endWith(@"!")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to end with <1>, got ", ^{ - expect(nil).to(endWith(@1)); - }); - expectNilFailureMessage(@"expected to not end with <1>, got ", ^{ - expect(nil).toNot(endWith(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m deleted file mode 100644 index 9d1361e..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m +++ /dev/null @@ -1,94 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCEqualTest : XCTestCase - -@end - -@implementation ObjCEqualTest - -- (void)testPositiveMatches { - expect(@1).to(equal(@1)); - expect(@1).toNot(equal(@2)); - expect(@1).notTo(equal(@2)); - expect(@"hello").to(equal(@"hello")); - expect("hello").to(equal("hello")); - expect(NSMakeRange(0, 10)).to(equal(NSMakeRange(0, 10))); - expect(NSMakeRange(0, 10)).toNot(equal(NSMakeRange(0, 5))); - expect((NSInteger)1).to(equal((NSInteger)1)); - expect((NSInteger)1).toNot(equal((NSInteger)2)); - expect((NSUInteger)1).to(equal((NSUInteger)1)); - expect((NSUInteger)1).toNot(equal((NSUInteger)2)); - expect(0).to(equal(0)); - expect(1).to(equal(1)); - expect(1).toNot(equal(2)); - expect(1.0).to(equal(1.0)); // Note: not recommended, use beCloseTo() instead - expect(1.0).toNot(equal(2.0)); // Note: not recommended, use beCloseTo() instead - expect((float)1.0).to(equal((float)1.0)); // Note: not recommended, use beCloseTo() instead - expect((float)1.0).toNot(equal((float)2.0)); // Note: not recommended, use beCloseTo() instead - expect((double)1.0).to(equal((double)1.0)); // Note: not recommended, use beCloseTo() instead - expect((double)1.0).toNot(equal((double)2.0)); // Note: not recommended, use beCloseTo() instead - expect((long long)1).to(equal((long long)1)); - expect((long long)1).toNot(equal((long long)2)); - expect((unsigned long long)1).to(equal((unsigned long long)1)); - expect((unsigned long long)1).toNot(equal((unsigned long long)2)); -} - -- (void)testNimbleCurrentlyBoxesNumbersWhichAllowsImplicitTypeConversions { - expect(1).to(equal(1.0)); - expect((long long)1).to(equal((unsigned long long)1)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(@1).to(equal(@2)); - }); - expectFailureMessage(@"expected to not equal <1>, got <1>", ^{ - expect(@1).toNot(equal(@1)); - }); - expectFailureMessage(@"expected to not equal , got ", ^{ - expect("bar").toNot(equal("bar")); - }); - expectFailureMessage(@"expected to equal , got ", ^{ - expect(NSMakeRange(0, 10)).to(equal(NSMakeRange(0, 5))); - }); - - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((NSInteger)1).to(equal((NSInteger)2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((NSUInteger)1).to(equal((NSUInteger)2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(1).to(equal(2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(1.0).to(equal(2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((float)1.0).to(equal((float)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((double)1.0).to(equal((double)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((long long)1.0).to(equal((long long)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((unsigned long long)1.0).to(equal((unsigned long long)2.0)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to equal , got ", ^{ - expect(NULL).to(equal(NULL)); - }); - expectNilFailureMessage(@"expected to equal , got ", ^{ - expect(nil).to(equal(nil)); - }); - expectNilFailureMessage(@"expected to not equal , got ", ^{ - expect(nil).toNot(equal(nil)); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m deleted file mode 100644 index 31053c8..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m +++ /dev/null @@ -1,174 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCHaveCountTest : XCTestCase - -@end - -@implementation ObjCHaveCountTest - -- (void)testHaveCountForNSArray { - expect(@[@1, @2, @3]).to(haveCount(@3)); - expect(@[@1, @2, @3]).notTo(haveCount(@1)); - - expect(@[]).to(haveCount(@0)); - expect(@[@1]).notTo(haveCount(@0)); - - expect(@[@1, @2, @3]).to(haveCount(3)); - expect(@[@1, @2, @3]).notTo(haveCount(1)); - - expect(@[]).to(haveCount(0)); - expect(@[@1]).notTo(haveCount(0)); - - expectFailureMessage(@"expected to have NSArray with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSArray with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSArray with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSArray with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSDictionary { - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(@3)); - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(@1)); - - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(3)); - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSDictionary with count 1, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSDictionary with count 3, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSDictionary with count 1, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSDictionary with count 3, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSHashtable { - NSHashTable *const table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - [table addObject:@2]; - [table addObject:@3]; - - expect(table).to(haveCount(@3)); - expect(table).notTo(haveCount(@1)); - - expect(table).to(haveCount(3)); - expect(table).notTo(haveCount(1)); - - NSString *msg = [NSString stringWithFormat: - @"expected to have NSHashTable {[2] 2[12] 1[13] 3}with count 1, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).to(haveCount(@1)); - }); - - msg = [NSString stringWithFormat: - @"expected to not have NSHashTable {[2] 2[12] 1[13] 3}with count 3, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).notTo(haveCount(@3)); - }); - - - msg = [NSString stringWithFormat: - @"expected to have NSHashTable {[2] 2[12] 1[13] 3}with count 1, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).to(haveCount(1)); - }); - - msg = [NSString stringWithFormat: - @"expected to not have NSHashTable {[2] 2[12] 1[13] 3}with count 3, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSSet { - NSSet *const set = [NSSet setWithArray:@[@1, @2, @3]]; - - expect(set).to(haveCount(@3)); - expect(set).notTo(haveCount(@1)); - expect(set).to(haveCount(3)); - expect(set).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSSet with count 1, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSSet with count 3, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSSet with count 1, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSSet with count 3, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSIndexSet { - NSIndexSet *const set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]; - - expect(set).to(haveCount(@3)); - expect(set).notTo(haveCount(@1)); - expect(set).to(haveCount(3)); - expect(set).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSIndexSet with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSIndexSet with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSIndexSet with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSIndexSet with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForUnsupportedTypes { - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFConstantString", ^{ - expect(@"string").to(haveCount(@6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFNumber", ^{ - expect(@1).to(haveCount(@6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFConstantString", ^{ - expect(@"string").to(haveCount(6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFNumber", ^{ - expect(@1).to(haveCount(6)); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m deleted file mode 100644 index 2342ae4..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m +++ /dev/null @@ -1,33 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCMatchTest : XCTestCase - -@end - -@implementation ObjCMatchTest - -- (void)testPositiveMatches { - expect(@"11:14").to(match(@"\\d{2}:\\d{2}")); - expect(@"hello").toNot(match(@"\\d{2}:\\d{2}")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to match <\\d{2}:\\d{2}>, got ", ^{ - expect(@"hello").to(match(@"\\d{2}:\\d{2}")); - }); - expectFailureMessage(@"expected to not match <\\d{2}:\\d{2}>, got <11:22>", ^{ - expect(@"11:22").toNot(match(@"\\d{2}:\\d{2}")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to match <\\d{2}:\\d{2}>, got ", ^{ - expect(nil).to(match(@"\\d{2}:\\d{2}")); - }); - expectNilFailureMessage(@"expected to not match <\\d{2}:\\d{2}>, got ", ^{ - expect(nil).toNot(match(@"\\d{2}:\\d{2}")); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m deleted file mode 100644 index 9b5a378..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m +++ /dev/null @@ -1,178 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCRaiseExceptionTest : XCTestCase - -@end - -@implementation ObjCRaiseExceptionTest - -- (void)testPositiveMatches { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectAction(^{ @throw exception; }).to(raiseException()); - expectAction(^{ [exception raise]; }).to(raiseException()); - expectAction(^{ [exception raise]; }).to(raiseException().named(NSInvalidArgumentException)); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food")); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"})); - - expectAction(^{ }).toNot(raiseException()); -} - -- (void)testPositiveMatchesWithBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectAction(^{ [exception raise]; }).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); -} - -- (void)testNegativeMatches { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - - expectFailureMessage(@"expected to raise any exception, got no exception", ^{ - expectAction(^{ }).to(raiseException()); - }); - - expectFailureMessage(@"expected to raise exception with name , got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(@"foo")); - }); - - expectFailureMessage(@"expected to raise exception with name with reason , got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"cakes")); - }); - - expectFailureMessage(@"expected to raise exception with name with reason with userInfo <{k = v;}>, got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"k": @"v"})); - }); - - expectFailureMessage(@"expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }", ^{ - expectAction(^{ [exception raise]; }).toNot(raiseException()); - }); -} - -- (void)testNegativeMatchesWithPassingBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectFailureMessage(@"expected to raise exception that satisfies block, got no exception", ^{ - expect(exception).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"LOL")); - })); - }); - - NSString *outerFailureMessage = @"expected to raise exception that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).toNot(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(@"foo"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"bar"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name with reason with userInfo <{}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); -} - -- (void)testNegativeMatchesWithNegativeBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - NSString *outerFailureMessage; - - NSString *const innerFailureMessage = @"expected to equal , got "; - outerFailureMessage = @"expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); - - - outerFailureMessage = @"expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); - - - outerFailureMessage = @"expected to raise exception with name with reason with userInfo <{key = value;}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m deleted file mode 100644 index 4c80abc..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m +++ /dev/null @@ -1,32 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCSatisfyAnyOfTest : XCTestCase - -@end - -@implementation ObjCSatisfyAnyOfTest - -- (void)testPositiveMatches { - expect(@2).to(satisfyAnyOf(equal(@2), equal(@3))); - expect(@2).toNot(satisfyAnyOf(equal(@3), equal(@16))); - expect(@[@1, @2, @3]).to(satisfyAnyOf(equal(@[@1, @2, @3]), allPass(beLessThan(@4)))); - expect(@NO).to(satisfyAnyOf(beTrue(), beFalse())); - expect(@YES).to(satisfyAnyOf(beTrue(), beFalse())); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to match one of: {equal <3>}, or {equal <4>}, or {equal <5>}, got 2", ^{ - expect(@2).to(satisfyAnyOf(equal(@3), equal(@4), equal(@5))); - }); - - expectFailureMessage(@"expected to match one of: {all be less than <4>, but failed first at element" - " <5> in <[5, 6, 7]>}, or {equal <(1, 2, 3, 4)>}, got (5,6,7)", ^{ - expect(@[@5, @6, @7]).to(satisfyAnyOf(allPass(beLessThan(@4)), equal(@[@1, @2, @3, @4]))); - }); - - expectFailureMessage(@"satisfyAnyOf must be called with at least one matcher", ^{ - expect(@"turtles").to(satisfyAnyOf()); - }); -} -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m deleted file mode 100644 index 2aae816..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m +++ /dev/null @@ -1,21 +0,0 @@ -#import -#import -#import "NimbleSpecHelper.h" - -@interface ObjCSyncTest : XCTestCase - -@end - -@implementation ObjCSyncTest - -- (void)testFailureExpectation { - expectFailureMessage(@"fail() always fails", ^{ - fail(); - }); - - expectFailureMessage(@"This always fails", ^{ - failWithMessage(@"This always fails"); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m deleted file mode 100644 index ffb5407..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m +++ /dev/null @@ -1,52 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCUserDescriptionTest : XCTestCase - -@end - -@implementation ObjCUserDescriptionTest - -- (void)testToWithDescription { - expectFailureMessage(@"These are equal!\n" - "expected to equal <2>, got <1>", ^{ - expect(@1).toWithDescription(equal(@2), @"These are equal!"); - }); -} - -- (void)testToNotWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to not equal <1>, got <1>", ^{ - expect(@1).toNotWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testNotToWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to not equal <1>, got <1>", ^{ - expect(@1).notToWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testToEventuallyWithDescription { - expectFailureMessage(@"These are equal!\n" - "expected to eventually equal <2>, got <1>", ^{ - expect(@1).toEventuallyWithDescription(equal(@2), @"These are equal!"); - }); -} - -- (void)testToEventuallyNotWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to eventually not equal <1>, got <1>", ^{ - expect(@1).toEventuallyNotWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testToNotEventuallyWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to eventually not equal <1>, got <1>", ^{ - expect(@1).toNotEventuallyWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m b/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m deleted file mode 100644 index 4ba2eae..0000000 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m +++ /dev/null @@ -1,31 +0,0 @@ -@import XCTest; -@import Nimble; - -@interface ObjcStringersTest : XCTestCase - -@end - -@implementation ObjcStringersTest - -- (void)testItCanStringifyArrays { - NSArray *array = @[@1, @2, @3]; - NSString *result = NMBStringify(array); - - expect(result).to(equal(@"(1, 2, 3)")); -} - -- (void)testItCanStringifyIndexSets { - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]; - NSString *result = NMBStringify(indexSet); - - expect(result).to(equal(@"(1, 2, 3)")); -} - -- (void)testItRoundsLongDecimals { - NSNumber *num = @291.123782163; - NSString *result = NMBStringify(num); - - expect(result).to(equal(@"291.1238")); -} - -@end diff --git a/Carthage/Checkouts/Nimble/script/release b/Carthage/Checkouts/Nimble/script/release deleted file mode 100755 index f61c0dc..0000000 --- a/Carthage/Checkouts/Nimble/script/release +++ /dev/null @@ -1,187 +0,0 @@ -#!/usr/bin/env sh -REMOTE_BRANCH=master -POD_NAME=Nimble -PODSPEC=Nimble.podspec - -POD=${COCOAPODS:-pod} - -function help { - echo "Usage: release VERSION RELEASE_NOTES [-f]" - echo - echo "VERSION should be the version to release, should not include the 'v' prefix" - echo "RELEASE_NOTES should be a file that lists all the release notes for this version" - echo " if file does not exist, creates a git-style commit with a diff as a comment" - echo - echo "FLAGS" - echo " -f Forces override of tag" - echo - echo " Example: ./release 1.0.0-rc.2 ./release-notes.txt" - echo - echo "HINT: use 'git diff ...HEAD' to build the release notes" - echo - exit 2 -} - -function die { - echo "[ERROR] $@" - echo - exit 1 -} - -if [ $# -lt 2 ]; then - help -fi - -VERSION=$1 -RELEASE_NOTES=$2 -FORCE_TAG=$3 - -VERSION_TAG="v$VERSION" - -echo "-> Verifying Local Directory for Release" - -if [ -z "`which $POD`" ]; then - die "Cocoapods is required to produce a release. Aborting." -fi -echo " > Cocoapods is installed" - -echo " > Is this a reasonable tag?" - -echo $VERSION_TAG | grep -q "^vv" -if [ $? -eq 0 ]; then - die "This tag ($VERSION) is an incorrect format. You should remove the 'v' prefix." -fi - -echo $VERSION_TAG | grep -q -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" -if [ $? -ne 0 ]; then - die "This tag ($VERSION) is an incorrect format. It should be in 'v{MAJOR}.{MINOR}.{PATCH}(-{PRERELEASE_NAME}.{PRERELEASE_VERSION})' form." -fi - -echo " > Is this version ($VERSION) unique?" -git describe --exact-match "$VERSION_TAG" > /dev/null 2>&1 -if [ $? -eq 0 ]; then - if [ -z "$FORCE_TAG" ]; then - die "This tag ($VERSION) already exists. Aborting. Append '-f' to override" - else - echo " > NO, but force was specified." - fi -else - echo " > Yes, tag is unique" -fi - -if [ ! -f "$RELEASE_NOTES" ]; then - echo " > Failed to find $RELEASE_NOTES. Prompting editor" - RELEASE_NOTES=/tmp/nimble.release.notes - LATEST_TAG=`git for-each-ref refs/tags --sort=-refname --format="%(refname:short)" | grep -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" | ruby -e 'puts STDIN.read.split("\n").sort { |a,b| Gem::Version.new(a.gsub(/^v/, "")) <=> Gem::Version.new(b.gsub(/^v/, "")) }.last'` - echo " > Latest tag ${LATEST_TAG}" - echo "${POD_NAME} v$VERSION" > $RELEASE_NOTES - echo "================" >> $RELEASE_NOTES - echo >> $RELEASE_NOTES - echo "# Changelog from ${LATEST_TAG}..HEAD" >> $RELEASE_NOTES - git log ${LATEST_TAG}..HEAD | sed -e 's/^/# /' >> $RELEASE_NOTES - $EDITOR $RELEASE_NOTES - diff -q $RELEASE_NOTES ${RELEASE_NOTES}.backup > /dev/null 2>&1 - STATUS=$? - rm ${RELEASE_NOTES}.backup - if [ $STATUS -eq 0 ]; then - rm $RELEASE_NOTES - die "No changes in release notes file. Aborting." - fi -fi -echo " > Release notes: $RELEASE_NOTES" - -if [ ! -f "$PODSPEC" ]; then - die "Cannot find podspec: $PODSPEC. Aborting." -fi -echo " > Podspec exists" - -git config --get user.signingkey > /dev/null || { - echo "[ERROR] No PGP found to sign tag. Aborting." - echo - echo " Creating a release requires signing the tag for security purposes. This allows users to verify the git cloned tree is from a trusted source." - echo " From a security perspective, it is not considered safe to trust the commits (including Author & Signed-off fields). It is easy for any" - echo " intermediate between you and the end-users to modify the git repository." - echo - echo " While not all users may choose to verify the PGP key for tagged releases. It is a good measure to ensure 'this is an official release'" - echo " from the official maintainers." - echo - echo " If you're creating your PGP key for the first time, use RSA with at least 4096 bits." - echo - echo "Related resources:" - echo " - Configuring your system for PGP: https://git-scm.com/book/tr/v2/Git-Tools-Signing-Your-Work" - echo " - Why: http://programmers.stackexchange.com/questions/212192/what-are-the-advantages-and-disadvantages-of-cryptographically-signing-commits-a" - echo - exit 2 -} -echo " > Found PGP key for git" - -# Verify cocoapods trunk ownership -pod trunk me | grep -q "$POD_NAME" || die "You do not have access to pod repository $POD_NAME. Aborting." -echo " > Verified ownership to $POD_NAME pod" - - -echo "--- Releasing version $VERSION (tag: $VERSION_TAG)..." - -function restore_podspec { - if [ -f "${PODSPEC}.backup" ]; then - mv -f ${PODSPEC}{.backup,} - fi -} - -echo "-> Ensuring no differences to origin/$REMOTE_BRANCH" -git fetch origin || die "Failed to fetch origin" -git diff --quiet HEAD "origin/$REMOTE_BRANCH" || die "HEAD is not aligned to origin/$REMOTE_BRANCH. Cannot update version safely" - - -echo "-> Setting podspec version" -cat "$PODSPEC" | grep 's.version' | grep -q "\"$VERSION\"" -SET_PODSPEC_VERSION=$? -if [ $SET_PODSPEC_VERSION -eq 0 ]; then - echo " > Podspec already set to $VERSION. Skipping." -else - sed -i.backup "s/s.version *= *\".*\"/s.version = \"$VERSION\"/g" "$PODSPEC" || { - restore_podspec - die "Failed to update version in podspec" - } - - git add ${PODSPEC} || { restore_podspec; die "Failed to add ${PODSPEC} to INDEX"; } - git commit -m "Bumping version to $VERSION" || { restore_podspec; die "Failed to push updated version: $VERSION"; } -fi - -if [ -z "$FORCE_TAG" ]; then - echo "-> Tagging version" - git tag -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin" - git push origin "$VERSION_TAG" || die "Failed to push tag '$VERSION_TAG' to origin" -else - echo "-> Tagging version (force)" - git tag -f -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin (force)" - git push origin "$VERSION_TAG" -f || die "Failed to push tag '$VERSION_TAG' to origin" -fi - -if [ $SET_PODSPEC_VERSION -ne 0 ]; then - git push origin "$REMOTE_BRANCH" || die "Failed to push to origin" - echo " > Pushed version to origin" -fi - -echo -echo "---------------- Released as $VERSION_TAG ----------------" -echo - -echo -echo "Pushing to pod trunk..." - -# NOTE: remove allow-warnings after v9.0.0 of Nimble -$POD trunk push "$PODSPEC" --allow-warnings - -echo -echo "================ Finalizing the Release ================" -echo -echo " - Opening GitHub to mark this as a release..." -echo " - Paste the contents of $RELEASE_NOTES into the release notes. Tweak for GitHub styling." -echo " - Announce!" - -open "https://github.com/Quick/Nimble/releases/new?tag=$VERSION_TAG" - -rm ${PODSPEC}.backup diff --git a/Carthage/Checkouts/Nimble/test b/Carthage/Checkouts/Nimble/test deleted file mode 100755 index 0766351..0000000 --- a/Carthage/Checkouts/Nimble/test +++ /dev/null @@ -1,156 +0,0 @@ -#!/bin/bash - -GREEN="\033[0;32m" -CLEAR="\033[0m" - -if which xcodebuild > /dev/null; then - echo -e "Gathering ${GREEN}xcodebuild sdk versions${CLEAR}..." - BUILD_DIR=`pwd`/build - LATEST_IOS_SDK_VERSION=`xcodebuild -showsdks | grep iphonesimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_TVOS_SDK_VERSION=`xcodebuild -showsdks | grep appletvsimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_MACOS_SDK_VERSION=`xcodebuild -showsdks | grep 'macosx' | cut -d ' ' -f 3 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - BUILD_IOS_SDK_VERSION=${NIMBLE_BUILD_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - RUNTIME_IOS_SDK_VERSION=${NIMBLE_RUNTIME_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - BUILD_TVOS_SDK_VERSION=${NIMBLE_BUILD_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - RUNTIME_TVOS_SDK_VERSION=${NIMBLE_RUNTIME_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - BUILD_MACOS_SDK_VERSION=${NIMBLE_BUILD_MACOS_SDK_VERSION:-$LATEST_MACOS_SDK_VERSION} -fi - -set -e - -function color_if_overridden { - local actual=$1 - local env_var=$2 - if [ -z "$env_var" ]; then - printf "$actual" - else - printf "$GREEN$actual$CLEAR" - fi -} - -function print_env { - echo "=== Environment ===" - echo " iOS:" - echo " Latest iOS SDK: $LATEST_IOS_SDK_VERSION" - echo " Building with iOS SDK: `color_if_overridden $BUILD_IOS_SDK_VERSION $NIMBLE_BUILD_IOS_SDK_VERSION`" - echo " Running with iOS SDK: `color_if_overridden $RUNTIME_IOS_SDK_VERSION $NIMBLE_RUNTIME_IOS_SDK_VERSION`" - echo - echo " tvOS:" - echo " Latest tvOS SDK: $LATEST_TVOS_SDK_VERSION" - echo " Building with tvOS SDK: `color_if_overridden $BUILD_TVOS_SDK_VERSION $NIMBLE_BUILD_TVOS_SDK_VERSION`" - echo " Running with tvOS SDK: `color_if_overridden $RUNTIME_TVOS_SDK_VERSION $NIMBLE_RUNTIME_TVOS_SDK_VERSION`" - echo - echo " macOS:" - echo " Latest macOS SDK: $LATEST_MACOS_SDK_VERSION" - echo " Building with macOS SDK: `color_if_overridden $BUILD_MACOS_SDK_VERSION $NIMBLE_BUILD_MACOS_SDK_VERSION`" - echo - echo "======= END =======" - echo -} - -function run { - echo -e "$GREEN==>$CLEAR $@" - "$@" -} - -function test_ios { - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPad Air,OS=$RUNTIME_IOS_SDK_VERSION" build-for-testing test-without-building - - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPhone 5s,OS=$RUNTIME_IOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_tvos { - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -sdk "appletvsimulator$BUILD_TVOS_SDK_VERSION" -destination "name=Apple TV 1080p,OS=$RUNTIME_TVOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_macos { - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-macOS" -configuration "Debug" -sdk "macosx$BUILD_MACOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_podspec { - echo "Gathering CocoaPods installation information..." - run bundle exec pod --version - echo "Linting podspec..." - # Note: remove `--allow-warnings` once old Matcher API has been removed - run bundle exec pod lib lint Nimble.podspec --allow-warnings -} - -function test_swiftpm { - if [ -d .build ]; then - run swift build --clean - fi - run swift build && swift test -} - -function test_swiftpm_docker { - run docker build -t nimble-tests -f Dockerfile.test --no-cache . - run docker run -it --privileged=true nimble-tests -} - -function test() { - test_ios - test_tvos - test_macos - - if which swift-test; then - test_swiftpm - else - echo "Not testing with the Swift Package Manager because swift-test is not installed" - fi - - if which docker; then - test_swiftpm_docker - else - echo "Not testing linux in docker container since docker is not in PATH!" - fi -} - -function clean { - run rm -rf ~/Library/Developer/Xcode/DerivedData\; true -} - -function help { - echo "Usage: $0 COMMANDS" - echo - echo "COMMANDS:" - echo " all - Runs the all tests of macos, ios and tvos" - echo " clean - Cleans the derived data directory of Xcode. Assumes default location" - echo " help - Displays this help" - echo " ios - Runs the tests as an iOS device" - echo " macos - Runs the tests on macOS 10.10 (Yosemite and newer only)" - echo " podspec - Runs pod lib lint against the podspec to detect breaking changes" - echo " swiftpm - Runs the tests built by the Swift Package Manager" - echo " swiftpm_docker - Runs the tests built by the Swift Package Manager in a docker linux container" - echo " tvos - Runs the tests as an tvOS device" - echo - exit 1 -} - -function main { - print_env - for arg in $@ - do - case "$arg" in - clean) clean ;; - ios) test_ios ;; - tvos) test_tvos ;; - macos) test_macos ;; - podspec) test_podspec ;; - test) test ;; - all) test ;; - swiftpm) test_swiftpm ;; - swiftpm_docker) test_swiftpm_docker ;; - help) help ;; - esac - done - - if [ $# -eq 0 ]; then - clean - test - fi -} - -main $@ diff --git a/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE b/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE deleted file mode 100644 index ebe5a2b..0000000 --- a/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE +++ /dev/null @@ -1,36 +0,0 @@ -- [ ] I have read [CONTRIBUTING](https://github.com/Quick/Quick/blob/master/CONTRIBUTING.md) and have done my best to follow them. - -### What did you do? - -Please replace this with what you did. - -### What did you expect to happen? - -Please replace this with what you expected to happen. - -### What actually happened instead? - -Please replace this with what happened instead. - -### Environment - -List the software versions you're using: - - - Quick: *?.?.?* - - Nimble: *?.?.?* - - Xcode Version: *?.? (????)* (Open Xcode; In menubar: Xcode > About Xcode) - - Swift Version: *?.?* (Open Xcode Preferences; Components > Toolchains. If none, use `Xcode Default`.) - -Please also mention which package manager you used and its version. Delete the -other package managers in this list: - - - Cocoapods: *?.?.?* (Use `pod --version` in Terminal) - - Carthage: *?.?* (Use `carthage version` in Terminal) - - Swift Package Manager *?.?.? (swiftpm-???)* (Use `swift build --version` in Terminal) - -### Project that demonstrates the issue - -Please link to a project we can download that reproduces the issue. Feel free -to delete this section if it's not relevant to the issue (eg - feature request). - -The project should be [short, self-contained, and correct example](http://sscce.org/). diff --git a/Carthage/Checkouts/Quick/.github/PULL_REQUEST_TEMPLATE b/Carthage/Checkouts/Quick/.github/PULL_REQUEST_TEMPLATE deleted file mode 100644 index 20e40c8..0000000 --- a/Carthage/Checkouts/Quick/.github/PULL_REQUEST_TEMPLATE +++ /dev/null @@ -1,14 +0,0 @@ -The PR should summarize what was changed and why. Here are some questions to -help you if you're not sure: - - - What behavior was changed? - - What code was refactored / updated to support this change? - - What issues are related to this PR? Or why was this change introduced? - -Checklist - While not every PR needs it, new features should consider this list: - - - [ ] Does this have tests? - - [ ] Does this have documentation? - - [ ] Does this break the public API (Requires major version bump)? - - [ ] Is this a new feature (Requires minor version bump)? - diff --git a/Carthage/Checkouts/Quick/.gitignore b/Carthage/Checkouts/Quick/.gitignore deleted file mode 100644 index 7b472b3..0000000 --- a/Carthage/Checkouts/Quick/.gitignore +++ /dev/null @@ -1,66 +0,0 @@ -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## Build generated -build/ -DerivedData - -## Various settings -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata - -## Other -*.xccheckout -*.moved-aside -*.xcuserstate -*.xcscmblueprint - -## Obj-C/Swift specific -*.hmap -*.ipa - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -.build/ -Package.pins -Package.resolved - -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md - -fastlane/report.xml -fastlane/screenshots - -# Mac OS X -.DS_Store - -# Quick -Quick.framework.zip diff --git a/Carthage/Checkouts/Quick/.gitmodules b/Carthage/Checkouts/Quick/.gitmodules deleted file mode 100644 index cffbed0..0000000 --- a/Carthage/Checkouts/Quick/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "Externals/Nimble"] - path = Externals/Nimble - url = https://github.com/Quick/Nimble.git diff --git a/Carthage/Checkouts/Quick/.hound.yml b/Carthage/Checkouts/Quick/.hound.yml deleted file mode 100644 index b867fd9..0000000 --- a/Carthage/Checkouts/Quick/.hound.yml +++ /dev/null @@ -1,2 +0,0 @@ -swift: - config_file: .swiftlint.yml diff --git a/Carthage/Checkouts/Quick/.swift-version b/Carthage/Checkouts/Quick/.swift-version deleted file mode 100644 index 8c50098..0000000 --- a/Carthage/Checkouts/Quick/.swift-version +++ /dev/null @@ -1 +0,0 @@ -3.1 diff --git a/Carthage/Checkouts/Quick/.swiftlint.yml b/Carthage/Checkouts/Quick/.swiftlint.yml deleted file mode 100644 index 79cda08..0000000 --- a/Carthage/Checkouts/Quick/.swiftlint.yml +++ /dev/null @@ -1,8 +0,0 @@ -disabled_rules: - - line_length - - type_name - - function_body_length - - identifier_name -included: - - Sources - - Tests diff --git a/Carthage/Checkouts/Quick/.travis.yml b/Carthage/Checkouts/Quick/.travis.yml deleted file mode 100644 index 32dfc90..0000000 --- a/Carthage/Checkouts/Quick/.travis.yml +++ /dev/null @@ -1,48 +0,0 @@ -osx_image: xcode8.3 -language: generic -matrix: - include: - - os: osx - env: - - PLATFORM=macos - - XCODE_ACTION="build-for-testing test-without-building" - - os: osx - osx_image: xcode9 - env: - - PLATFORM=macos - - XCODE_ACTION="build-for-testing test-without-building" - - os: osx - env: - - PLATFORM=ios - - XCODE_ACTION="build-for-testing test-without-building" - - os: osx - env: - - PLATFORM=tvos - - XCODE_ACTION="build-for-testing test-without-building" - - os: osx - env: - - PLATFORM=swiftpm - - os: osx - osx_image: xcode9 - env: - - PLATFORM=swiftpm - - os: osx - sudo: required - env: - - PODSPEC=1 - - os: linux - sudo: required - dist: trusty - - os: linux - sudo: required - dist: trusty - env: - - SWIFT_VERSION=4.0-DEVELOPMENT-SNAPSHOT-2017-09-04-a -install: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./script/travis-install-macos; fi - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./script/travis-install-linux; fi - - if [[ "$PODSPEC" ]]; then rvm system; sudo gem install bundler; bundle install; fi -script: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./script/travis-script-macos; fi - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./script/travis-script-linux; fi - - if [[ "$PODSPEC" ]]; then danger; fi diff --git a/Carthage/Checkouts/Quick/CODE_OF_CONDUCT.md b/Carthage/Checkouts/Quick/CODE_OF_CONDUCT.md deleted file mode 100644 index f82f39a..0000000 --- a/Carthage/Checkouts/Quick/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or -advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at [quickorg@icloud.com](mailto:quickorg@icloud.com). All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/Carthage/Checkouts/Quick/CONTRIBUTING.md b/Carthage/Checkouts/Quick/CONTRIBUTING.md deleted file mode 100644 index e8e32c1..0000000 --- a/Carthage/Checkouts/Quick/CONTRIBUTING.md +++ /dev/null @@ -1,111 +0,0 @@ - - -**Table of Contents** *generated with [DocToc](http://doctoc.herokuapp.com/)* - -- [Welcome to Quick!](#welcome-to-quick!) - - [Reporting Bugs](#reporting-bugs) - - [Building the Project](#building-the-project) - - [Pull Requests](#pull-requests) - - [Style Conventions](#style-conventions) - - [Core Members](#core-members) - - [Code of Conduct](#code-of-conduct) - - [Creating a Release](#creating-a-release) - - - -# Welcome to Quick! - -We're building a testing framework for a new generation of Swift and -Objective-C developers. - -Quick should be easy to use and easy to maintain. Let's keep things -simple and well-tested. - -## Reporting Bugs - -Nothing is off-limits. If you're having a problem, we want to hear about -it. - -- See a crash? File an issue. -- Code isn't compiling, but you don't know why? Sounds like you should - submit a new issue, bud. -- Went to the kitchen, only to forget why you went in the first place? - Better submit an issue. - -Be sure to include in your issue: - -- Your Xcode version (eg - Xcode 7.0.1 7A1001) -- Your version of Quick / Nimble (eg - v0.7.0 or git sha `7d0b8c21357839a8c5228863b77faecf709254a9`) -- What are the steps to reproduce this issue? -- What platform are you using? (eg - OS X, iOS, watchOS, tvOS) -- If the problem is on a UI Testing Bundle, Unit Testing Bundle, or some other target configuration -- Are you using carthage or cocoapods? - -## Building the Project - -- After cloning the repository, run `git submodule update --init` to pull the Nimble submodule. -- Use `Quick.xcworkspace` to work on Quick. The workspace includes - Nimble, which is used in Quick's tests. - -## Pull Requests - -- Nothing is trivial. Submit pull requests for anything: typos, - whitespace, you name it. -- Not all pull requests will be merged, but all will be acknowledged. If - no one has provided feedback on your request, ping one of the owners - by name. -- Make sure your pull request includes any necessary updates to the - README or other documentation. -- Be sure the unit tests for both the OS X and iOS targets of both Quick - and Nimble pass before submitting your pull request. You can run all - the iOS and OS X unit tests using `rake`. -- The `master` branch will always support the stable Xcode version. Other - branches will point to their corresponding versions they support. -- If you're making a configuration change, make sure to edit both the xcode - project and the podspec file. - -### Style Conventions - -- Indent using 4 spaces. -- Keep lines 100 characters or shorter. Break long statements into - shorter ones over multiple lines. -- In Objective-C, use `#pragma mark -` to mark public, internal, - protocol, and superclass methods. See `QuickSpec.m` for an example. - -## Core Members - -If a few of your pull requests have been merged, and you'd like a -controlling stake in the project, file an issue asking for write access -to the repository. - -Your conduct as a core member is your own responsibility, but here are -some "ground rules": - -- Feel free to push whatever you want to master, and (if you have - ownership permissions) to create any repositories you'd like. - - Ideally, however, all changes should be submitted as GitHub pull - requests. No one should merge their own pull request, unless no - other core members respond for at least a few days. - - Pull requests should be issued from personal forks. The Quick repo - should be reserved for long-running feature branches. - - If you'd like to create a new repository, it'd be nice if you created - a GitHub issue and gathered some feedback first. - -- It'd be awesome if you could review, provide feedback on, and close - issues or pull requests submitted to the project. Please provide kind, - constructive feedback. Please don't be sarcastic or snarky. - -Read [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for more in depth guidelines. - -## Creating a Release - -The process is relatively straight forward, but here's is a useful checklist for tagging: - -- Look at changes from the previously tagged release and write release notes: `git log v0.4.0...HEAD` -- Run the release script: `./script/release A.B.C release-notes-file` -- The script will prompt you to create a new [GitHub release](https://github.com/Quick/Quick/releases). - - Use the same release notes you created for the tag, but tweak up formatting for GitHub. -- Announce! diff --git a/Carthage/Checkouts/Quick/Dangerfile b/Carthage/Checkouts/Quick/Dangerfile deleted file mode 100644 index 719de60..0000000 --- a/Carthage/Checkouts/Quick/Dangerfile +++ /dev/null @@ -1,53 +0,0 @@ -# set the number of lines that must be changed before this classifies as a 'Big PR' -@SDM_DANGER_BIG_PR_LINES = 50 - -# set the files to watch and fail if there are changes -@SDM_DANGER_IMMUTABLE_FILES = ['LICENSE', 'CONTRIBUTING.md', 'CODE_OF_CONDUCT.md'] - -# Sometimes it's a README fix, or something like that which is trivial -not_declared_trivial = !(github.pr_title.include? "#trivial") -has_app_changes = !git.modified_files.grep(/Sources/).empty? -no_test_modify = git.modified_files.grep(/Tests/).empty? - -# Warns when changing source files -if has_app_changes && not_declared_trivial && no_test_modify - warn("Need to add an unit test if you're modifying swift source") -end - -# determine if any of the files were modified -def did_modify(files_array) - did_modify_files = false - files_array.each do |file_name| - if git.modified_files.include?(file_name) || git.deleted_files.include?(file_name) - did_modify_files = true - end - end - return did_modify_files -end - -# Fail if changes to immutable files, such as License or CoC -fail('Do not modify the license or Code of Conduct') if did_modify(@SDM_DANGER_IMMUTABLE_FILES) - -# Make it more obvious that a PR is a work in progress and shouldn't be merged yet -warn("PR is classed as Work in Progress") if github.pr_title.include? "[WIP]" - -# Warn when there is a big PR -warn("Big PR") if git.lines_of_code > @SDM_DANGER_BIG_PR_LINES - -# Make a note about contributors not in the organization -unless github.api.organization_member?('Quick', github.pr_author) - # Pay extra attention if they modify the podspec - if git.modified_files.include?("*.podspec") - warn "External contributor has edited the Podspec file" - end -end - -# Mainly to encourage writing up some reasoning about the PR, rather than -# just leaving a title -if github.pr_body.length < 5 - warn "Please provide a summary in the Pull Request description" -end - -swiftlint.config_file = '.swiftlint.yml' -swiftlint.lint_files - diff --git a/Carthage/Checkouts/Quick/Documentation/README.md b/Carthage/Checkouts/Quick/Documentation/README.md deleted file mode 100644 index 08fb556..0000000 --- a/Carthage/Checkouts/Quick/Documentation/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Documentation - -- [English](en-us/README.md) -- [日本語](ja/README.md) -- [中文](zh-cn/README.md) -- [pt-br](pt-br/README.md) diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/ArrangeActAssert.md b/Carthage/Checkouts/Quick/Documentation/en-us/ArrangeActAssert.md deleted file mode 100644 index fc7915b..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/ArrangeActAssert.md +++ /dev/null @@ -1,220 +0,0 @@ -# Effective Tests Using XCTest: Arrange, Act, and Assert - -Whether you're using XCTest, Quick, or another testing framework, you can write -effective unit tests by following a simple pattern: - -1. Arrange -2. Act -3. Assert - -## Using Arrange, Act, and Assert - -For example, let's look at a simple class called `Banana`: - -```swift -// Banana/Banana.swift - -/** A delicious banana. Tastes better if you peel it first. */ -public class Banana { - private var isPeeled = false - - /** Peels the banana. */ - public func peel() { - isPeeled = true - } - - /** You shouldn't eat a banana unless it's been peeled. */ - public var isEdible: Bool { - return isPeeled - } -} -``` - -Let's verify the `Banana.peel()` method does what it's supposed to: - -```swift -// BananaTests/BananaTests.swift - -class BananaTests: XCTestCase { - func testPeel() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) - } -} -``` - -## Using Clear Test Names - -Our `testPeel()` makes sure that, if the `Banana.peel()` method ever -stops working right, we'll know. This usually happens when our application -code changes, which either means: - -1. We accidentally broke our application code, so we have to fix the application code -2. We changed how our application code works--maybe because we're adding a new - feature--so we have to change the test code - -If our tests start breaking, how do we know which one of these cases applies? It might -surprise you that **the name of the test** is our best indication. Good test names: - -1. Are clear about what is being tested. -2. Are clear about when the test should pass or fail. - -Is our `testPeel()` method clearly named? Let's make it clearer: - -```diff -// BananaTests.swift - --func testPeel() { -+func testPeel_makesTheBananaEdible() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) -} -``` - -The new name: - -1. Is clear about what is being tested: `testPeel` indicates it's the `Banana.peel()` method. -2. Is clear about when the test should pass: `makesTheBananaEdible` indicates the - banana is edible once the method has been called. - -## Testing Conditions - -Let's say we want to offer people bananas, using a function called `offer()`: - -```swift -// Banana/Offer.swift - -/** Given a banana, returns a string that can be used to offer someone the banana. */ -public func offer(banana: Banana) -> String { - if banana.isEdible { - return "Hey, want a banana?" - } else { - return "Hey, want me to peel this banana for you?" - } -} -``` - -Our application code does one of two things: - -1. Either it offers a banana that's already been peeled... -2. ...or it offers an unpeeled banana. - -Let's write tests for these two cases: - -```swift -// BananaTests/OfferTests.swift - -class OfferTests: XCTestCase { - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { - // Arrange: Create a banana and peel it. - let banana = Banana() - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { - // Arrange: Create a banana. - let banana = Banana() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -Our test names clearly indicate the **conditions** under which our tests should pass: -in the case that `whenTheBananaIsPeeled`, `offer()` should `offersTheBanana`. And if -the banana isn't peeled? Well, we have a test for that, too! - -Notice that we have one test per `if` statement in our application code. -This is a great pattern when writing tests: it makes sure every set of conditions -is tested. If one of those conditions no longer works, or needs to be changed, we'll know -exactly which test needs to be looked at. - -## Shorter "Arrange" Steps with `XCTestCase.setUp()` - -Both of our `OfferTests` tests contain the same "Arrange" code: they both -create a banana. We should move that code into a single place. Why? - -1. As-is, if we change the `Banana` initializer, we'll have to change every test that creates a banana. -2. Our test methods will be shorter--which is a good thing if (and **only if**) that makes - the tests easier to read. - -Let's move the `Banana` initialization into the `XCTestCase.setUp()` method, which is called -once before every test method. - -```diff -// OfferTests.swift - -class OfferTests: XCTestCase { -+ var banana: Banana! -+ -+ override func setUp() { -+ super.setUp() -+ banana = Banana() -+ } -+ - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { -- // Arrange: Create a banana and peel it. -- let banana = Banana() -+ // Arrange: Peel the banana. - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { -- // Arrange: Create a banana. -- let banana = Banana() -- - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -## Sharing "Arrange" Code Across Multiple Tests - -If you find yourself using the same "arrange" steps across multiple tests, -you may want to define a helper function within your test target: - -```swift -// BananaTests/BananaHelpers.swift - -internal func createNewPeeledBanana() -> Banana { - let banana = Banana() - banana.peel() - return banana -} -``` - -> Use a function to define your helpers: functions can't be subclassed, nor - can they retain any state. Subclassing and mutable state can make your tests - harder to read. diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/BehavioralTesting.md b/Carthage/Checkouts/Quick/Documentation/en-us/BehavioralTesting.md deleted file mode 100644 index 02ae0c0..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/BehavioralTesting.md +++ /dev/null @@ -1,87 +0,0 @@ -# Don't Test Code, Instead Verify Behavior - -Tests should only fail if the application **behaves differently**. -They should test *what* the application code does, not *how* it does those things. - -- Tests that verify *what* an application does are **behavioral tests**. -- Tests that break if the application code changes, even if the behavior - remains the same, are **brittle tests**. - -Let's say we have a banana database, called `GorillaDB`. -`GorillaDB` is a key-value store for bananas. We can save bananas: - -```swift -let database = GorillaDB() -let banana = Banana() -database.save(banana: banana, key: "my-banana") -``` - -And we can restore bananas from disk later: - -```swift -let banana = database.load(key: "my-banana") -``` - -## Brittle Tests - -How can we test this behavior? One way would be to check the size of the database -after we save a banana: - -```swift -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() - let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - - // Assert: The size of the database should have increased by one. - XCTAssertEqual(database.size, originalSize + 1) -} -``` - - -Imagine, however, that the source code of `GorillaDB` changes. In order to make -reading bananas from the database faster, it maintains a cache of the most frequently -used bananas. `GorillaDB.size` grows as the size of the cache grows, and our test fails: - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/Screenshot_database_size_fail.png) - -## Behavioral Tests - -The key to writing behavioral tests is determining exactly what you're expecting -your application code to do. - -In the context of our `testSave_savesTheBananaToTheDatabase` test: what is the -behavior we expect when we "save" a banana to the database? "Saving" implies, to me, -that we can load it later. So instead of testing that the size of the database increases, -we should test that we can load a banana. - -```diff -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() -- let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - -- // Assert: The size of the database should have increased by one. -- XCTAssertEqual(database.size, originalSize + 1) -+ // Assert: The bananas saved to and loaded from the database should be the same. -+ XCTAssertEqual(database.load(key: "test-banana"), banana) -} -``` - -The key to writing behavioral tests is asking: - -- What exactly should this application code do? -- Is my test verifying *only* that behavior? - Or could it fail due to other aspects of how the code works? diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/ConfiguringQuick.md b/Carthage/Checkouts/Quick/Documentation/en-us/ConfiguringQuick.md deleted file mode 100644 index 919d4de..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/ConfiguringQuick.md +++ /dev/null @@ -1,103 +0,0 @@ -# Configuring How Quick Behaves - -You can customize how Quick behaves by subclassing `QuickConfiguration` and -overriding the `QuickConfiguration.Type.configure()` class method: - -```swift -// Swift - -import Quick - -class ProjectDataTestConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - // ...set options on the configuration object here. - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(ProjectDataTestConfiguration) - -+ (void)configure:(Configuration *configuration) { - // ...set options on the configuration object here. -} - -QuickConfigurationEnd -``` - -Projects may include several configurations. Quick does not make any -guarantee about the order in which those configurations are executed. - -## Adding Global `beforeEach` and `afterEach` Closures - -Using `QuickConfiguration.beforeEach` and `QuickConfiguration.afterEach`, you -can specify closures to be run before or after *every* example in a test suite: - -```swift -// Swift - -import Quick -import Sea - -class FinConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { - Dorsal.sharedFin().height = 0 - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -#import "Dorsal.h" - -QuickConfigurationBegin(FinConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEach:^{ - [Dorsal sharedFin].height = 0; - }]; -} - -QuickConfigurationEnd -``` - -In addition, Quick allows you to access metadata regarding the current -example being run: - -```swift -// Swift - -import Quick - -class SeaConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { exampleMetadata in - // ...use the example metadata object to access the current example name, and more. - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(SeaConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEachWithMetadata:^(ExampleMetadata *data) { - // ...use the example metadata object to access the current example name, and more. - }]; -} - -QuickConfigurationEnd -``` diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/InstallingFileTemplates.md b/Carthage/Checkouts/Quick/Documentation/en-us/InstallingFileTemplates.md deleted file mode 100644 index 3de82c5..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/InstallingFileTemplates.md +++ /dev/null @@ -1,28 +0,0 @@ -# Installing Quick File Templates - -The Quick repository includes file templates for both Swift and -Objective-C specs. - -## Alcatraz - -Quick templates can be installed via [Alcatraz](https://github.com/supermarin/Alcatraz), -a package manager for Xcode. Just search for the templates from the -Package Manager window. - -![](http://f.cl.ly/items/3T3q0G1j0b2t1V0M0T04/Screen%20Shot%202014-06-27%20at%202.01.10%20PM.png) - -## Manually via the Rakefile - -To manually install the templates, just clone the repository and -run the `templates:install` rake task: - -```sh -$ git clone git@github.com:Quick/Quick.git -$ rake templates:install -``` - -Uninstalling is easy, too: - -```sh -$ rake templates:uninstall -``` diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md b/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md deleted file mode 100644 index 258956f..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md +++ /dev/null @@ -1,157 +0,0 @@ -# Installing Quick - ->Before starting, check [here](../../README.md#swift-version) which versions of Quick and Nimble are compatible with your version of Swift. - -Quick provides the syntax to define examples and example groups. Nimble -provides the `expect(...).to` assertion syntax. You may use either one, -or both, in your tests. - -There are three recommended ways of linking Quick to your tests: - -1. [Git Submodules](#git-submodules) -2. [CocoaPods](#cocoapods) -3. [Carthage](#carthage) -4. [Swift Package Manager (experimental)](#swift-package-manager) - -Choose one and follow the instructions below. Once you've completed them, -you should be able to `import Quick` from within files in your test target. - -## Git Submodules - -To link Quick and Nimble using Git submodules: - -1. Add submodule for Quick. -2. If you don't already have a `.xcworkspace` for your project, create one. ([Here's how](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) -3. Add `Quick.xcodeproj` to your project's `.xcworkspace`. -4. Add `Nimble.xcodeproj` to your project's `.xcworkspace`. It exists in `path/to/Quick/Externals/Nimble`. By adding Nimble from Quick's dependencies (as opposed to adding directly as a submodule), you'll ensure that you're using the correct version of Nimble for whatever version of Quick you're using. -5. Link `Quick.framework` and `Nimble.framework` in your test target's - "Link Binary with Libraries" build phase. - -First, if you don't already have one, create a directory for your Git submodules. -Let's assume you have a directory named `Vendor`. - -**Step One:** Download Quick and Nimble as Git submodules: - -```sh -git submodule add git@github.com:Quick/Quick.git Vendor/Quick -git submodule add git@github.com:Quick/Nimble.git Vendor/Nimble -git submodule update --init --recursive -``` - -**Step Two:** Add the `Quick.xcodeproj` and `Nimble.xcodeproj` files downloaded above to -your project's `.xcworkspace`. For example, this is `Guanaco.xcworkspace`, the -workspace for a project that is tested using Quick and Nimble: - -![](http://f.cl.ly/items/2b2R0e1h09003u2f0Z3U/Screen%20Shot%202015-02-27%20at%202.19.37%20PM.png) - -**Step Three:** Link the `Quick.framework` during your test target's -`Link Binary with Libraries` build phase. You should see two -`Quick.frameworks`; one is for macOS, and the other is for iOS. - -![](http://cl.ly/image/2L0G0H1a173C/Screen%20Shot%202014-06-08%20at%204.27.48%20AM.png) - -Do the same for the `Nimble.framework`, and you're done! - -**Updating the Submodules:** If you ever want to update the Quick -or Nimble submodules to latest version, enter the Quick directory -and pull from the master repository: - -```sh -cd /path/to/your/project/Vendor/Quick -git checkout master -git pull --rebase origin master -``` - -Your Git repository will track changes to submodules. You'll want to -commit the fact that you've updated the Quick submodule: - -```sh -cd /path/to/your/project -git commit -m "Updated Quick submodule" -``` - -**Cloning a Repository that Includes a Quick Submodule:** After other people -clone your repository, they'll have to pull down the submodules as well. -They can do so by running the `git submodule update` command: - -```sh -git submodule update --init --recursive -``` - -You can read more about Git submodules [here](http://git-scm.com/book/en/Git-Tools-Submodules). - -## CocoaPods - -First, update CocoaPods to Version 0.36.0 or newer, which is necessary to install CocoaPods using Swift. - -Then, add Quick and Nimble to your Podfile. Additionally, the ```use_frameworks!``` line is necessary for using Swift in CocoaPods: - -```rb - -# Podfile - -use_frameworks! - -def testing_pods - pod 'Quick' - pod 'Nimble' -end - -target 'MyTests' do - testing_pods -end - -target 'MyUITests' do - testing_pods -end -``` - -Finally, download and link Quick and Nimble to your tests: - -```sh -pod install -``` - -## [Carthage](https://github.com/Carthage/Carthage) - -As test targets do not have the "Embedded Binaries" section, the frameworks must -be added to the target's "Link Binary With Libraries" as well as a "Copy Files" build phase -to copy them to the target's Frameworks destination. - - > As Carthage builds dynamic frameworks, you will need a valid code signing identity set up. - -1. Add Quick to your [`Cartfile.private`](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfileprivate): - - ``` - github "Quick/Quick" - github "Quick/Nimble" - ``` - -2. Run `carthage update`. -3. From your `Carthage/Build/[platform]/` directory, add both Quick and Nimble to your test target's "Link Binary With Libraries" build phase: - ![](http://i.imgur.com/pBkDDk5.png) - -4. For your test target, create a new build phase of type "Copy Files": - ![](http://i.imgur.com/jZATIjQ.png) - -5. Set the "Destination" to "Frameworks", then add both frameworks: - ![](http://i.imgur.com/rpnyWGH.png) - -This is not "the one and only way" to use Carthage to manage dependencies. -For further reference check out the [Carthage documentation](https://github.com/Carthage/Carthage/blob/master/README.md). - -## [Swift Package Manager](https://github.com/apple/swift-package-manager) -With the advent of the [swift.org](https://swift.org) open-source project, Swift now has an official, though nascent, package manager tool. Notably, this provides the possibility of using Quick on non-Apple platforms for the first time. Initial steps have been taken to allow using Quick to test projects using the Swift Package Manager, although frequent breakage is expected at this point since the tool is still under heavy development. - -Until further documentation has been written, the following repository may be useful as an example of how Quick can be declared as a dependency in a `Package.swift` file for SwiftPM: - -https://github.com/Quick/QuickOnLinuxExample - -### (Not Recommended) Running Quick Specs on a Physical iOS Device - -In order to run specs written in Quick on device, you need to add `Quick.framework` and -`Nimble.framework` as `Embedded Binaries` to the `Host Application` of the -test target. After adding a framework as an embedded binary, Xcode will -automatically link the host app against the framework. - -![](http://indiedev.kapsi.fi/images/embed-in-host.png) diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/MoreResources.md b/Carthage/Checkouts/Quick/Documentation/en-us/MoreResources.md deleted file mode 100644 index 65d7eba..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/MoreResources.md +++ /dev/null @@ -1,28 +0,0 @@ -# More Resources - -## Examples of Quick Specs - -Quick is used by many companies, open-source projects, and individuals, -including [GitHub](https://github.com/github) and -[ReactiveCocoa](https://github.com/ReactiveCocoa). For examples, check out: - -- https://github.com/ReactiveCocoa/ReactiveCocoa -- https://github.com/github/Archimedes -- https://github.com/libgit2/objective-git -- https://github.com/jspahrsummers/RXSwift -- https://github.com/artsy/eidolon -- https://github.com/AshFurrow/Moya -- https://github.com/nerdyc/Squeal -- https://github.com/pepibumur/SugarRecord - -## More on Unit Testing for OS X and iOS Apps - -- **[Quality Coding](http://qualitycoding.org/)**: - A blog on iOS development that focuses on unit testing. -- **[OCMock Tutorials](http://ocmock.org/support/)**: - Use OCMock when you need "fake objects" in your tests. -- **[Nocilla: Stunning HTTP stubbing for iOS and Mac OS X](https://github.com/luisobo/Nocilla)**: - Use this library to test code that sends requests to, and receives responses from, the Internet. -- **[Pivotal Labs: Writing Beautiful Specs with Jasmine Custom Matchers](http://pivotallabs.com/writing-beautiful-specs-jasmine-custom-matchers/)**: - See [the Nimble documentation](https://github.com/Quick/Nimble) for instructions on how to write - custom matchers in Nimble. diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/NimbleAssertions.md b/Carthage/Checkouts/Quick/Documentation/en-us/NimbleAssertions.md deleted file mode 100644 index 3b31ac3..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/NimbleAssertions.md +++ /dev/null @@ -1,106 +0,0 @@ -# Clearer Tests Using Nimble Assertions - -When code doesn't work the way it's supposed to, unit tests should make it -**clear** exactly what's wrong. - -Take the following function which, given a bunch of monkeys, only returns -the silly monkeys in the bunch: - -```swift -public func silliest(monkeys: [Monkey]) -> [Monkey] { - return monkeys.filter { $0.silliness == .VerySilly } -} -``` - -Now let's say we have a unit test for this function: - -```swift -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) - XCTAssertTrue(contains(sillyMonkeys, kiki)) -} -``` - -The test fails with the following failure message: - -``` -XCTAssertTrue failed -``` - -![](http://f.cl.ly/items/1G17453p47090y30203d/Screen%20Shot%202015-02-26%20at%209.08.27%20AM.png) - -The failure message leaves a lot to be desired. It leaves us wondering, -"OK, so something that should have been true was false--but what?" -That confusion slows us down, since we now have to spend time deciphering test code. - -## Better Failure Messages, Part 1: Manually Providing `XCTAssert` Failure Messages - -`XCTAssert` assertions allow us to specify a failure message of our own, which certainly helps: - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki)) -+ XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -} -``` - -But we have to write our own failure message. - -## Better Failure Messages, Part 2: Nimble Failure Messages - -Nimble makes your test assertions, and their failure messages, easier to read: - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -+ expect(sillyMonkeys).to(contain(kiki)) -} -``` - -We don't have to write our own failure message--the one provided by Nimble -is already very readable: - -``` -expected to contain , - got <[Monkey(name: Jane, silliness: VerySilly)]> -``` - -![](http://f.cl.ly/items/3N2e3g2K3W123b1L1J0G/Screen%20Shot%202015-02-26%20at%2011.27.02%20AM.png) - -The failure message makes it clear what's wrong: we were expecting `kiki` to be included -in the result of `silliest()`, but the result only contains `jane`. Now that we know -exactly what's wrong, it's easy to fix the issue: - -```diff -public func silliest(monkeys: [Monkey]) -> [Monkey] { -- return monkeys.filter { $0.silliness == .VerySilly } -+ return monkeys.filter { $0.silliness == .VerySilly || $0.silliness == .ExtremelySilly } -} -``` - -Nimble provides many different kind of assertions, each with great failure -messages. And unlike `XCTAssert`, you don't have to type your own failure message -every time. - -For the full list of Nimble assertions, check out the [Nimble README](https://github.com/Quick/Nimble). -Below is just a sample, to whet your appetite: - -```swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/QuickExamplesAndGroups.md b/Carthage/Checkouts/Quick/Documentation/en-us/QuickExamplesAndGroups.md deleted file mode 100644 index e9f0550..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/QuickExamplesAndGroups.md +++ /dev/null @@ -1,491 +0,0 @@ -# Organized Tests with Quick Examples and Example Groups - -Quick uses a special syntax to define **examples** and **example groups**. - -In *[Effective Tests Using XCTest: Arrange, Act, and Assert](ArrangeActAssert.md)*, -we learned that a good test method name is crucial--when a test starts failing, it's -the best way to determine whether we have to fix the application code or update the test. - -Quick examples and example groups serve two purposes: - -1. They encourage you to write descriptive test names. -2. They greatly simplify the test code in the "arrange" step of your tests. - -## Examples Using `it` - -Examples, defined with the `it` function, use assertions to demonstrate -how code should behave. These are like test methods in XCTest. - -`it` takes two parameters: the name of the example, and a closure. -The examples below specify how the `Sea.Dolphin` class should behave. -A new dolphin should be smart and friendly: - -```swift -// Swift - -import Quick -import Nimble -import Sea - -class DolphinSpec: QuickSpec { - override func spec() { - it("is friendly") { - expect(Dolphin().isFriendly).to(beTruthy()) - } - - it("is smart") { - expect(Dolphin().isSmart).to(beTruthy()) - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -it(@"is friendly", ^{ - expect(@([[Dolphin new] isFriendly])).to(beTruthy()); -}); - -it(@"is smart", ^{ - expect(@([[Dolphin new] isSmart])).to(beTruthy()); -}); - -QuickSpecEnd -``` - -Use descriptions to make it clear what your examples are testing. -Descriptions can be of any length and use any character, including -characters from languages besides English, or even emoji! :v: :sunglasses: - -## Example Groups Using `describe` and `context` - -Example groups are logical groupings of examples. Example groups can share -setup and teardown code. - -### Describing Classes and Methods Using `describe` - -To specify the behavior of the `Dolphin` class's `click` method--in -other words, to test the method works--several `it` examples can be -grouped together using the `describe` function. Grouping similar -examples together makes the spec easier to read: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - describe("its click") { - it("is loud") { - let click = Dolphin().click() - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - let click = Dolphin().click() - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - describe(@"its click", ^{ - it(@"is loud", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -When these two examples are run in Xcode, they'll display the -description from the `describe` and `it` functions: - -1. `DolphinSpec.a_dolphin_its_click_is_loud` -2. `DolphinSpec.a_dolphin_its_click_has_a_high_frequency` - -Again, it's clear what each of these examples is testing. - -### Sharing Setup/Teardown Code Using `beforeEach` and `afterEach` - -Example groups don't just make the examples clearer, they're also useful -for sharing setup and teardown code among examples in a group. - -In the example below, the `beforeEach` function is used to create a brand -new instance of a dolphin and its click before each example in the group. -This ensures that both are in a "fresh" state for every example: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { - dolphin = Dolphin() - } - - describe("its click") { - var click: Click! - beforeEach { - click = dolphin.click() - } - - it("is loud") { - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ - dolphin = [Dolphin new]; - }); - - describe(@"its click", ^{ - __block Click *click = nil; - beforeEach(^{ - click = [dolphin click]; - }); - - it(@"is loud", ^{ - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -Sharing setup like this might not seem like a big deal with the -dolphin example, but for more complicated objects, it saves a lot -of typing! - -To execute code *after* each example, use `afterEach`. - -### Specifying Conditional Behavior Using `context` - -Dolphins use clicks for echolocation. When they approach something -particularly interesting to them, they release a series of clicks in -order to get a better idea of what it is. - -The tests need to show that the `click` method behaves differently in -different circumstances. Normally, the dolphin just clicks once. But when -the dolphin is close to something interesting, it clicks several times. - -This can be expressed using `context` functions: one `context` for the -normal case, and one `context` for when the dolphin is close to -something interesting: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { dolphin = Dolphin() } - - describe("its click") { - context("when the dolphin is not near anything interesting") { - it("is only emitted once") { - expect(dolphin!.click().count).to(equal(1)) - } - } - - context("when the dolphin is near something interesting") { - beforeEach { - let ship = SunkenShip() - Jamaica.dolphinCove.add(ship) - Jamaica.dolphinCove.add(dolphin) - } - - it("is emitted three times") { - expect(dolphin.click().count).to(equal(3)) - } - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ dolphin = [Dolphin new]; }); - - describe(@"its click", ^{ - context(@"when the dolphin is not near anything interesting", ^{ - it(@"is only emitted once", ^{ - expect(@([[dolphin click] count])).to(equal(@1)); - }); - }); - - context(@"when the dolphin is near something interesting", ^{ - beforeEach(^{ - [[Jamaica dolphinCove] add:[SunkenShip new]]; - [[Jamaica dolphinCove] add:dolphin]; - }); - - it(@"is emitted three times", ^{ - expect(@([[dolphin click] count])).to(equal(@3)); - }); - }); - }); -}); - -QuickSpecEnd -``` - -Strictly speaking, the `context` keyword is a synonym for `describe`, -but thoughtful use will make your spec easier to understand. - -### Test Readability: Quick and XCTest - -In [Effective Tests Using XCTest: Arrange, Act, and Assert](ArrangeActAssert.md), -we looked at how one test per condition was a great way to organize test code. -In XCTest, that leads to long test method names: - -```swift -func testDolphin_click_whenTheDolphinIsNearSomethingInteresting_isEmittedThreeTimes() { - // ... -} -``` - -Using Quick, the conditions are much easier to read, and we can perform setup -for each example group: - -```swift -describe("a dolphin") { - describe("its click") { - context("when the dolphin is near something interesting") { - it("is emitted three times") { - // ... - } - } - } -} -``` - -## Temporarily Disabling Examples or Groups - -You can temporarily disable examples or example groups that don't pass yet. -The names of the examples will be printed out along with the test results, -but they won't be run. - -You can disable an example or group by prepending `x`: - -```swift -// Swift - -xdescribe("its click") { - // ...none of the code in this closure will be run. -} - -xcontext("when the dolphin is not near anything interesting") { - // ...none of the code in this closure will be run. -} - -xit("is only emitted once") { - // ...none of the code in this closure will be run. -} -``` - -```objc -// Objective-C - -xdescribe(@"its click", ^{ - // ...none of the code in this closure will be run. -}); - -xcontext(@"when the dolphin is not near anything interesting", ^{ - // ...none of the code in this closure will be run. -}); - -xit(@"is only emitted once", ^{ - // ...none of the code in this closure will be run. -}); -``` - -## Temporarily Running a Subset of Focused Examples - -Sometimes it helps to focus on only one or a few examples. Running one -or two examples is faster than the entire suite, after all. You can -run only one or two by using the `fit` function. You can also focus a -group of examples using `fdescribe` or `fcontext`: - -```swift -fit("is loud") { - // ...only this focused example will be run. -} - -it("has a high frequency") { - // ...this example is not focused, and will not be run. -} - -fcontext("when the dolphin is near something interesting") { - // ...examples in this group are also focused, so they'll be run. -} -``` - -```objc -fit(@"is loud", { - // ...only this focused example will be run. -}); - -it(@"has a high frequency", ^{ - // ...this example is not focused, and will not be run. -}); - -fcontext(@"when the dolphin is near something interesting", ^{ - // ...examples in this group are also focused, so they'll be run. -}); -``` - -## Global Setup/Teardown Using `beforeSuite` and `afterSuite` - -Some test setup needs to be performed before *any* examples are -run. For these cases, use `beforeSuite` and `afterSuite`. - -In the example below, a database of all the creatures in the ocean is -created before any examples are run. That database is torn down once all -the examples have finished: - -```swift -// Swift - -import Quick - -class DolphinSpec: QuickSpec { - override func spec() { - beforeSuite { - OceanDatabase.createDatabase(name: "test.db") - OceanDatabase.connectToDatabase(name: "test.db") - } - - afterSuite { - OceanDatabase.teardownDatabase(name: "test.db") - } - - describe("a dolphin") { - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickSpecBegin(DolphinSpec) - -beforeSuite(^{ - [OceanDatabase createDatabase:@"test.db"]; - [OceanDatabase connectToDatabase:@"test.db"]; -}); - -afterSuite(^{ - [OceanDatabase teardownDatabase:@"test.db"]; -}); - -describe(@"a dolphin", ^{ - // ... -}); - -QuickSpecEnd -``` - -You can specify as many `beforeSuite` and `afterSuite` as you like. All -`beforeSuite` closures will be executed before any tests run, and all -`afterSuite` closures will be executed after all the tests are finished. -There is no guarantee as to what order these closures will be executed in. - -## Accessing Metadata for the Current Example - -There may be some cases in which you'd like the know the name of the example -that is currently being run, or how many have been run so far. Quick provides -access to this metadata in `beforeEach` and `afterEach` closures. - -```swift -beforeEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) is about to be run.") -} - -afterEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) has run.") -} -``` - -```objc -beforeEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l is about to be run.", (long)exampleMetadata.exampleIndex); -}); - -afterEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l has run.", (long)exampleMetadata.exampleIndex); -}); -``` diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/QuickInObjectiveC.md b/Carthage/Checkouts/Quick/Documentation/en-us/QuickInObjectiveC.md deleted file mode 100644 index 3fb6bdc..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/QuickInObjectiveC.md +++ /dev/null @@ -1,57 +0,0 @@ -# Using Quick in Objective-C - -Quick works equally well in both Swift and Objective-C. - -There are two notes to keep in mind when using Quick in Objective-C, -however, which are described below. - -## The Optional Shorthand Syntax - -Importing Quick in an Objective-C file defines macros named `it` and -`itShouldBehaveLike`, as well as functions like `context()` and `describe()`. - -If the project you are testing also defines symbols with these names, you may -encounter confusing build failures. In that case, you can avoid namespace -collision by turning off Quick's optional "shorthand" syntax: - -```objc -#define QUICK_DISABLE_SHORT_SYNTAX 1 - -@import Quick; - -QuickSpecBegin(DolphinSpec) -// ... -QuickSpecEnd -``` - -You must define the `QUICK_DISABLE_SHORT_SYNTAX` macro *before* -importing the Quick header. - -Alternatively, you may define the macro in your test target's build configuration: - -![](http://d.twobitlabs.com/VFEamhvixX.png) - -## Your Test Target Must Include At Least One Swift File - -The Swift stdlib will not be linked into your test target, and thus -Quick will fail to execute properly, if your test target does not contain -*at least one* Swift file. - -Without at least one Swift file, your tests will exit prematurely with -the following error: - -``` -*** Test session exited(82) without checking in. Executable cannot be -loaded for some other reason, such as a problem with a library it -depends on or a code signature/entitlements mismatch. -``` - -To fix the problem, add a blank file called `SwiftSpec.swift` to your test target: - -```swift -// SwiftSpec.swift - -import Quick -``` - -> For more details on this issue, see https://github.com/Quick/Quick/issues/164. diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/README.md b/Carthage/Checkouts/Quick/Documentation/en-us/README.md deleted file mode 100644 index d03f633..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Documentation - -Quick helps you verify how your Swift and Objective-C programs behave. -Doing so effectively isn't just a matter of knowing how to use Quick, -however. The guides in this directory can help you write -effective tests--not just using Quick, but even XCTest or other testing -frameworks. - -Each guide covers a particular topic. If you're completely new to unit -testing, consider reading them in the order they're introduced below: - -- **[Setting Up Tests in Your Xcode Project](SettingUpYourXcodeProject.md)**: - Read this if you're having trouble using your application code from within - your test files. -- **[Effective Tests Using XCTest: Arrange, Act, and Assert](ArrangeActAssert.md)**: - Read this to learn how to write `XCTestCase` tests that will help you write - code faster and more effectively. -- **[Don't Test Code, Instead Verify Behavior](BehavioralTesting.md)**: - Read this to learn what kinds of tests speed you up, and which ones will only end up - slowing you down. -- **[Clearer Tests Using Nimble Assertions](NimbleAssertions.md)**: - Read this to learn how to use Nimble to generate better failure messages. - Better failure messages help you move faster, by spending less time figuring out why - a test failed. -- **[Organized Tests with Quick Examples and Example Groups](QuickExamplesAndGroups.md)**: - Read this to learn how Quick can help you write even more effective tests, using - *examples* and *example groups*. -- **[Testing OS X and iOS Applications](TestingApps.md)**: - Read this to learn more about testing code that uses the AppKit and UIKit frameworks. -- **[Testing with test doubles](TestUsingTestDoubles.md)**: - Read this to learn what test doubles are and how to use them. -- **[Reducing Test Boilerplate with Shared Assertions](SharedExamples.md)**: - Read this to learn how to share sets of assertions among your tests. -- **[Configuring How Quick Behaves](ConfiguringQuick.md)**: - Read this to learn how you can change how Quick behaves when running your test suite. -- **[Using Quick in Objective-C](QuickInObjectiveC.md)**: - Read this if you experience trouble using Quick in Objective-C. -- **[Installing Quick](InstallingQuick.md)**: - Read this for instructions on how to add Quick to your project, using - Git submodules, CocoaPods, Carthage, or the Swift Package Manager. -- **[Installing Quick File Templates](InstallingFileTemplates.md)**: - Read this to learn how to install file templates that make writing Quick specs faster. -- **[More Resources](MoreResources.md)**: - A list of additional resources on OS X and iOS testing. -- **[Troubleshooting](Troubleshooting.md)**: - Read this when you experience other troubles. diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/SettingUpYourXcodeProject.md b/Carthage/Checkouts/Quick/Documentation/en-us/SettingUpYourXcodeProject.md deleted file mode 100644 index 76e9d3e..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/SettingUpYourXcodeProject.md +++ /dev/null @@ -1,89 +0,0 @@ -# Setting Up Tests in Your Xcode Project - -With the exception of the Command Line Tool project type, when you create a new project in Xcode 7, a unit test target is included -by default. [See specific instructions for a Command Line Tool Project](#setting-up-a-test-target-for-a-command-line-tool-project). To write unit tests, you'll need to be able to use your main -target's code from within your test target. - -## Testing Swift Code Using Swift - -In order to test code written in Swift, you'll need to do two things: - -1. Set "Defines Module" in your `.xcodeproj` to `YES`. - - * To do this in Xcode: Choose your project, then "Build Settings", then "Packaging" header, - then "Defines Module" line, then select "Yes". Note: you may have - to choose "All" (Build Settings) instead of "Basic" to see the - "Packaging" section. - -2. `@testable import YourAppModuleName` in your unit tests. This will expose Any `public` and `internal` (the default) - symbols to your tests. `private` symbols are still unavailable. - -```swift -// MyAppTests.swift - -import XCTest -@testable import MyModule - -class MyClassTests: XCTestCase { - // ... -} -``` - -> Quick integration in the Xcode Test Navigator suffers from some limitations (open [issue](https://github.com/Quick/Quick/issues/219)). Quick tests will not show up in the navigator until they've been run, repeat runs tend to reset the list in unpredictable ways and the tests cannot be run from the gutter next to the source code. -> Please file a radar to Apple and mention this as a duplicate to [rdar://26152293](http://openradar.appspot.com/radar?id=4974047628623872) to promote this feature request for Apple Engineers. - -> Some developers advocate adding Swift source files to your test target. -However, this leads to [subtle, hard-to-diagnose -errors](https://github.com/Quick/Quick/issues/91), and is not -recommended. - -## Testing Objective-C Code Using Swift - -1. Add a bridging header to your test target. -2. In the bridging header, import the file containing the code you'd like to test. - -```objc -// MyAppTests-BridgingHeader.h - -#import "MyClass.h" -``` - -You can now use the code from `MyClass.h` in your Swift test files. - -## Testing Swift Code Using Objective-C - -1. Bridge Swift classes and functions you'd like to test to Objective-C by - using the `@objc` attribute. -2. Import your module's Swift headers in your unit tests. - -```objc -@import XCTest; -#import "MyModule-Swift.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -## Testing Objective-C Code Using Objective-C - -Import the file defining the code you'd like to test from within your test target: - -```objc -// MyAppTests.m - -@import XCTest; -#import "MyClass.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -### Setting Up a Test Target for a Command Line Tool Project - -1. Add a target to your project in the project pane. -2. Select "OS X Unit Testing Bundle". -3. Edit the scheme of your main target. -4. Select the "Test" node, click the "+" under the "Info" heading, and select - your testing bundle. diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/SharedExamples.md b/Carthage/Checkouts/Quick/Documentation/en-us/SharedExamples.md deleted file mode 100644 index 339bf34..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/SharedExamples.md +++ /dev/null @@ -1,125 +0,0 @@ -# Reducing Test Boilerplate with Shared Assertions - -In some cases, the same set of specifications apply to multiple objects. - -For example, consider a protocol called `Edible`. When a dolphin -eats something `Edible`, the dolphin becomes happy. `Mackerel` and -`Cod` are both edible. Quick allows you to easily test that a dolphin is -happy to eat either one. - -The example below defines a set of "shared examples" for "something edible", -and specifies that both mackerel and cod behave like "something edible": - -```swift -// Swift - -import Quick -import Nimble - -class EdibleSharedExamplesConfiguration: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in - it("makes dolphins happy") { - let dolphin = Dolphin(happy: false) - let edible = sharedExampleContext()["edible"] - dolphin.eat(edible) - expect(dolphin.isHappy).to(beTruthy()) - } - } - } -} - -class MackerelSpec: QuickSpec { - override func spec() { - var mackerel: Mackerel! - beforeEach { - mackerel = Mackerel() - } - - itBehavesLike("something edible") { ["edible": mackerel] } - } -} - -class CodSpec: QuickSpec { - override func spec() { - var cod: Cod! - beforeEach { - cod = Cod() - } - - itBehavesLike("something edible") { ["edible": cod] } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickConfigurationBegin(EdibleSharedExamplesConfiguration) - -+ (void)configure:(Configuration *configuration) { - sharedExamples(@"something edible", ^(QCKDSLSharedExampleContext exampleContext) { - it(@"makes dolphins happy") { - Dolphin *dolphin = [[Dolphin alloc] init]; - dolphin.happy = NO; - id edible = exampleContext()[@"edible"]; - [dolphin eat:edible]; - expect(dolphin.isHappy).to(beTruthy()) - } - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(MackerelSpec) - -__block Mackerel *mackerel = nil; -beforeEach(^{ - mackerel = [[Mackerel alloc] init]; -}); - -itBehavesLike(@"something edible", ^{ return @{ @"edible": mackerel }; }); - -QuickSpecEnd - -QuickSpecBegin(CodSpec) - -__block Mackerel *cod = nil; -beforeEach(^{ - cod = [[Cod alloc] init]; -}); - -itBehavesLike(@"something edible", ^{ return @{ @"edible": cod }; }); - -QuickSpecEnd -``` - -Shared examples can include any number of `it`, `context`, and -`describe` blocks. They save a *lot* of typing when running -the same tests against several different kinds of objects. - -In some cases, you won't need any additional context. In Swift, you can -simply use `sharedExamples` closures that take no parameters. This -might be useful when testing some sort of global state: - -```swift -// Swift - -import Quick - -sharedExamples("everything under the sea") { - // ... -} - -itBehavesLike("everything under the sea") -``` - -> In Objective-C, you'll have to pass a block that takes a - `QCKDSLSharedExampleContext`, even if you don't plan on using that - argument. Sorry, but that's the way the cookie crumbles! - :cookie: :bomb: - -You can also "focus" shared examples using the `fitBehavesLike` function. diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/TestUsingTestDoubles.md b/Carthage/Checkouts/Quick/Documentation/en-us/TestUsingTestDoubles.md deleted file mode 100644 index fc4f3f9..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/TestUsingTestDoubles.md +++ /dev/null @@ -1,129 +0,0 @@ -# Testing with Mocks - -## Test doubles - -Dependencies between objects can cause problems when writing tests. For example, say you have a `Car` class that depends on/uses `Tire`. - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesA.png) - -`CarTests` tests `Car`, which calls `Tire`. Now bugs in `Tire` could cause `CarTests` to fail (even though `Car` is okay). It can be hard to answer the question: "What's broken?". - -To avoid this problem, you can use a stand-in object for `Tire` in `CarTests`. In this case, we'll create a stand-in object for `Tire` called `PerfectTire`. - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesAmock.png) - -`PerfectTire` will have all of the same public functions and properties as `Tire`. However, the implementation of some or all of those functions and properties will differ. - -Objects like `PerfectTire` are called "test doubles". Test doubles are used as "stand-in objects" for testing the functionality of related objects in isolation. There are several kinds of test doubles: - -- Mock object: Used for receiving output from a test class. -- Stub object: Used for providing input to a test class. -- Fake object: Behaves similarly to the original class, but in a simplified way. - -Let's start with how to use mock objects. - -## Mock - -A mock object focuses on fully specifying the correct interaction with other objects and detecting when something goes awry. The mock object should know (in advance) the methods that should be called on it during the test and what values the mock object should return. - -Mock objects are great because you can: - -- Run tests a lot quicker. -- Run tests even if you're not connected to the Internet. -- Focus on testing classes in isolation from their dependencies. - -### Writing Tests with Mock Objects in Swift - -#### Sample app - -For example, let's create an app which retrieves data from the Internet: - -* Data from the Internet will be displayed in `ViewController`. -* A custom class will implement the `DataProviderProtocol`, which specifies methods for fetching data. - -`DataProviderProtocol` is defined as follows: - -```swift -protocol DataProviderProtocol: class { - func fetch(callback: (data: String) -> Void) -} -``` - -`fetch()` gets data from the Internet and returns it using a `callback` closure. - -Here is the `DataProvider` class, which conforms to the `DataProviderProtocol` protocol. - -```swift -class DataProvider: NSObject, DataProviderProtocol { - func fetch(callback: (data: String) -> Void) { - let url = URL(string: "http://example.com/")! - let session = URLSession(configuration: .default) - let task = session.dataTask(with: url) { - (data, resp, err) in - let string = String(data: data!, encoding: .utf8) - callback(data: string) - } - task.resume() - } -} -``` - -In our scenario, `fetch()` is called in the `viewDidLoad()` method of `ViewController`. - -```swift -class ViewController: UIViewController { - - // MARK: Properties - @IBOutlet weak var resultLabel: UILabel! - private var dataProvider: DataProviderProtocol? - - // MARK: View Controller Lifecycle - override func viewDidLoad() { - super.viewDidLoad() - - dataProvider = dataProvider ?? DataProvider() - - dataProvider?.fetch({ [unowned self] (data) -> Void in - self.resultLabel.text = data - }) - } -} -``` - -#### Testing using a Mock of `DataProviderProtocol` - -`ViewController` depends on `DataProviderProtocol`. In order to test the view controller in isolation, you can create a mock object which conforms to `DataProviderProtocol`. - -```swift -class MockDataProvider: NSObject, DataProviderProtocol { - var fetchCalled = false - func fetch(callback: (data: String) -> Void) { - fetchCalled = true - callback(data: "foobar") - } -} -``` - -The `fetchCalled` property is set to `true` when `fetch()` is called, so that the test can confirm that it was called. - -The following test verifies that when `ViewController` is loaded, the view controller calls `dataProvider.fetch()`. - -```swift -override func spec() { - describe("view controller") { - it("fetch data with data provider") { - let mockProvider = MockDataProvider() - let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as! ViewController - viewController.dataProvider = mockProvider - - expect(mockProvider.fetchCalled).to(beFalse()) - - let _ = viewController.view - - expect(mockProvider.fetchCalled).to(beTrue()) - } - } -} -``` - -If you're interested in learning more about writing tests, continue on to . diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/TestingApps.md b/Carthage/Checkouts/Quick/Documentation/en-us/TestingApps.md deleted file mode 100644 index 4f5ce1d..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/TestingApps.md +++ /dev/null @@ -1,179 +0,0 @@ -# Testing OS X and iOS Applications - -*[Setting Up Tests in Your Xcode Project](SettingUpYourXcodeProject.md)* -covers everything you need to know to test any Objective-C or Swift function or class. -In this section, we'll go over a few additional hints for testing -classes like `UIViewController` subclasses. - -> You can see a short lightning talk covering most of these topics - [here](https://vimeo.com/115671189#t=37m50s) (the talk begins at 37'50"). - -## Triggering `UIViewController` Lifecycle Events - -Normally, UIKit triggers lifecycle events for your view controller as it's -presented within the app. When testing a `UIViewController`, however, you'll -need to trigger these yourself. You can do so in one of three ways: - -1. Accessing `UIViewController.view`, which triggers things like `UIViewController.viewDidLoad()`. -2. Use `UIViewController.beginAppearanceTransition()` to trigger most lifecycle events. -3. Directly calling methods like `UIViewController.viewDidLoad()` or `UIViewController.viewWillAppear()`. - -```swift -// Swift - -import Quick -import Nimble -import BananaApp - -class BananaViewControllerSpec: QuickSpec { - override func spec() { - var viewController: BananaViewController! - beforeEach { - viewController = BananaViewController() - } - - describe(".viewDidLoad()") { - beforeEach { - // Method #1: Access the view to trigger BananaViewController.viewDidLoad(). - let _ = viewController.view - } - - it("sets the banana count label to zero") { - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal("0")) - } - } - - describe("the view") { - beforeEach { - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - viewController.beginAppearanceTransition(true, animated: false) - viewController.endAppearanceTransition() - } - // ... - } - - describe(".viewWillDisappear()") { - beforeEach { - // Method #3: Directly call the lifecycle event. - viewController.viewWillDisappear(false) - } - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; -#import "BananaViewController.h" - -QuickSpecBegin(BananaViewControllerSpec) - -__block BananaViewController *viewController = nil; -beforeEach(^{ - viewController = [[BananaViewController alloc] init]; -}); - -describe(@"-viewDidLoad", ^{ - beforeEach(^{ - // Method #1: Access the view to trigger -[BananaViewController viewDidLoad]. - [viewController view]; - }); - - it(@"sets the banana count label to zero", ^{ - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal(@"0")) - }); -}); - -describe(@"the view", ^{ - beforeEach(^{ - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - [viewController beginAppearanceTransition:YES animated:NO]; - [viewController endAppearanceTransition]; - }); - // ... -}); - -describe(@"-viewWillDisappear", ^{ - beforeEach(^{ - // Method #3: Directly call the lifecycle event. - [viewController viewWillDisappear:NO]; - }); - // ... -}); - -QuickSpecEnd -``` - -## Initializing View Controllers Defined in Storyboards - -To initialize view controllers defined in a storyboard, you'll need to assign -a **Storyboard ID** to the view controller: - -![](http://f.cl.ly/items/2X2G381K1h1l2B2Q0g3L/Screen%20Shot%202015-02-27%20at%2011.58.06%20AM.png) - -Once you've done so, you can instantiate the view controller from within your tests: - -```swift -// Swift - -var viewController: BananaViewController! -beforeEach { - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - let storyboard = UIStoryboard(name: "Main", bundle: nil) - // 2. Use the storyboard to instantiate the view controller. - viewController = - storyboard.instantiateViewControllerWithIdentifier( - "BananaViewControllerID") as! BananaViewController -} -``` - -```objc -// Objective-C - -__block BananaViewController *viewController = nil; -beforeEach(^{ - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; - // 2. Use the storyboard to instantiate the view controller. - viewController = [storyboard instantiateViewControllerWithIdentifier:@"BananaViewControllerID"]; -}); -``` - -## Triggering UIControl Events Like Button Taps - -Buttons and other UIKit classes inherit from `UIControl`, which defines methods -that allow us to send control events, like button taps, programmatically. -To test behavior that occurs when a button is tapped, you can write: - -```swift -// Swift - -describe("the 'more bananas' button") { - it("increments the banana count label when tapped") { - viewController.moreButton.sendActionsForControlEvents( - UIControlEvents.TouchUpInside) - expect(viewController.bananaCountLabel.text).to(equal("1")) - } -} -``` - -```objc -// Objective-C - -describe(@"the 'more bananas' button", ^{ - it(@"increments the banana count label when tapped", ^{ - [viewController.moreButton sendActionsForControlEvents:UIControlEventTouchUpInside]; - expect(viewController.bananaCountLabel.text).to(equal(@"1")); - }); -}); -``` diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/Troubleshooting.md b/Carthage/Checkouts/Quick/Documentation/en-us/Troubleshooting.md deleted file mode 100644 index c39403c..0000000 --- a/Carthage/Checkouts/Quick/Documentation/en-us/Troubleshooting.md +++ /dev/null @@ -1,9 +0,0 @@ -# Common Installation Issues - -Here are solutions to common issues that come up when using the framework. - -## No such module 'Quick' - -- If you have already run `pod install`, close and reopen the Xcode workspace. If this does not fix the issue, continue below. -- Delete the _entire_ `~/Library/Developer/Xcode/DerivedData` direction, which includes `ModuleCache`. -- Explicitly build (`Cmd+B`) the `Quick`, `Nimble`, and `Pods-ProjectNameTests` targets after enabled their schemes from the Manage Schemes dialog. \ No newline at end of file diff --git a/Carthage/Checkouts/Quick/Documentation/ja/ArrangeActAssert.md b/Carthage/Checkouts/Quick/Documentation/ja/ArrangeActAssert.md deleted file mode 100644 index 2f0a138..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/ArrangeActAssert.md +++ /dev/null @@ -1,212 +0,0 @@ -# Effective Tests Using XCTest: Arrange, Act, and Assert - -XCTest や Quick に限らず、テストフレームワークを使用する際、このパターンに従うことで効率的なユニットテストを書くことができます。 - -1. Arrange(環境構築) -2. Act(実行) -3. Assert(動作確認) - -## パターンに従ってテストを書く - -例として Banana クラスを用意します。 - -```swift -// Banana/Banana.swift - -/** A delicious banana. Tastes better if you peel it first. */ -public class Banana { - private var isPeeled = false - - /** Peels the banana. */ - public func peel() { - isPeeled = true - } - - /** You shouldn't eat a banana unless it's been peeled. */ - public var isEdible: Bool { - return isPeeled - } -} -``` - -ここでは `Banana.peel()` のテストをしてみましょう。このメソッドの期待する振る舞いはこのようになります。 - -```swift -// BananaTests/BananaTests.swift - -class BananaTests: XCTestCase { - func testPeel() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) - } -} -``` - -## 簡潔なテスト名を用いる - -この `testPeel()` テストのおかげで `Banana.peel()` が正しく動作しない場合、すぐ気付くことができます。 -我々のアプリケーションコードを変更することで正しく動作しないケース(テストが失敗するケース)はしばしば起こります。 -テストが失敗する場合は下記どちらかのケースになります。 - -1. 間違えてアプリケーションコードを壊してしまっているため、直す必要がある -2. アプリケーションコードは期待したとおりに動いているが、もともと期待した機能が変わっているためテストコードを直す必要がある - -もしテストが失敗した場合、どちらのケースに当てはまる判断する必要が出てきます。そのためテスト名が分かりやすいことが重要になります。 - -良いテスト名とは、 - -1. 何をテストしているか明確であること -2. どのような時にテストがパスするか・失敗するか明確であること - -例に挙げた `testPeel()` は良いテスト名でしょうか?分かりやすくしてみましょう。 - -```diff -// BananaTests.swift - --func testPeel() { -+func testPeel_makesTheBananaEdible() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) -} -``` - -新しいテスト名は、 - -1. 何をテストしているか明確である: `testPeel` は `Banana.peel()` メソッドをテストしてることを示す。 -2. どのような時にテストがパスするか明確である: `makesTheBananaEdible` はバナナが食べられるか(edible)どうかをテストしていることを示す。 - -## テスト時の条件 - -人々がバナナを欲しい時、`offer()` というメソッドを使います。 - -```swift -// Banana/Offer.swift - -/** Given a banana, returns a string that can be used to offer someone the banana. */ -public func offer(banana: Banana) -> String { - if banana.isEdible { - return "Hey, want a banana?" - } else { - return "Hey, want me to peel this banana for you?" - } -} -``` - -私達のアプリケーションコードは2つのうちどちらかを実行します: - -1. 食べられる(すでに皮がむかれている)バナナを注文するか -2. まだ食べられない(すでに皮がむかれている)バナナを注文するか - -両方のケースをテストしてみましょう。 - -```swift -// BananaTests/OfferTests.swift - -class OfferTests: XCTestCase { - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { - // Arrange: Create a banana and peel it. - let banana = Banana() - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { - // Arrange: Create a banana. - let banana = Banana() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -私達のテスト名は'どのような条件でテストをパスするか'を明確に表しています。 -`whenTheBananaIsPeeled`, `offer()` のケースでは `offersTheBanana` となるべきです。またバナナの皮がむかれていない場合は? -ここでは両方共テストしています。 - -ここで大事なことはアプリケーションコード内の各`if`文に対してそれぞれ1つのテストを持っていることです。 -これはテストを書く際の重要なアプローチです。このアプローチでは全ての条件(if文)に関してテストされていることを保証します。 -テストのうちどれか1つがでも失敗するようになったらコードの見直しをする必要があります。テスト名が分かりやすいとすぐにチェックすべき箇所が分かります。 - -## `XCTestCase.setUp()`を用いて簡潔に環境構築をする - -`OfferTests` の2つのテストのどちらにも同じ"環境構築"のコードが入っています。 -どちらのテストでも banana を作っています。このコードは一箇所にまとめるべきです。なぜでしょう? - -1. そのままにしておく場合、もし `Banana` の生成方法が変わったら, 私たちは全てのテストを修正しないといけなくなります。 -2. テストコードが短くなり、テストの可読性が向上します。 - -Banana の生成方法を `XCTestCase.setUp()` の中に移しましょう。`XCTestCase.setUp()` は各テストの実行前に一度呼び出されます。 - -```diff -// OfferTests.swift - -class OfferTests: XCTestCase { -+ var banana: Banana! -+ -+ override func setUp() { -+ super.setUp() -+ banana = Banana() -+ } -+ - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { -- // Arrange: Create a banana and peel it. -- let banana = Banana() -+ // Arrange: Peel the banana. - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { -- // Arrange: Create a banana. -- let banana = Banana() -- - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -## 複数のテストにまたがって環境構築を共有する - -もし複数のテストにまたがって同じ環境構築のコードを使っている部分があれば、 test target 内に'ヘルパー関数'を定義しましょう。 - -```swift -// BananaTests/BananaHelpers.swift - -internal func createNewPeeledBanana() -> Banana { - let banana = Banana() - banana.peel() - return banana -} -``` - -> 共通操作を定義するのに関数を使いましょう。関数は継承できず、状態を保持することができません。継承や状態を持たせる場合、テストの可読性が落ちてしまいます。 diff --git a/Carthage/Checkouts/Quick/Documentation/ja/BehavioralTesting.md b/Carthage/Checkouts/Quick/Documentation/ja/BehavioralTesting.md deleted file mode 100644 index af78e50..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/BehavioralTesting.md +++ /dev/null @@ -1,81 +0,0 @@ -# コードをテストせず、動作を確認する - -テストはアプリケーションが**期待と異なる動作** をした時のみ失敗するようにすべきです。 -アプリケーションコードが *何を* したかをテストすべきで、*どのように* したかをテストすべきではありません。 - -- アプリケーションが *何を* したかを確認するテストは **動作テスト(behavioral tests)** といいます。 -- アプリケーションの動作が変わっていなくても、コードを変更すると失敗するようになるテストは **脆弱なテスト(brittle tests)** といいます。 - -ここで `GorillaDB` というバナナのデータベースを用意します。 -`GorillaDB`は Key-Value 型のデータベースでバナナを保存することができます。 - -```swift -let database = GorillaDB() -let banana = Banana() -database.save(banana: banana, key: "my-banana") -``` - -そしてバナナをディスクから取り出すことができます。 - -```swift -let banana = database.load(key: "my-banana") -``` - -## 脆弱なテスト(Brittle Tests) - -どのようにして動作をテストするのでしょう?一つの方法としてここではバナナを保存した後にバナナのデータベースのサイズをチェックします。 - -```swift -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() - let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - - // Assert: The size of the database should have increased by one. - XCTAssertEqual(database.size, originalSize + 1) -} -``` - -ここで `GorillaDB` のソースコードを変更したとします。データベースからの読み出しを速くするためにもっとも頻繁に使用するバナナをキャッシュに保持するようにします。 -`GorillaDB.size` はキャッシュのサイズに合わせて大きくなります。この場合ディスクに保存しなくなるため上記のテストは失敗します。 - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/Screenshot_database_size_fail.png) - -## 動作テスト(Behavioral Tests) - -動作のテストの重要なポイントは アプリケーションコードに期待する動作を明確にすることです。 - -`testSave_savesTheBananaToTheDatabase` というテストで期待する動作は バナナをデータベースに "保存する" ことでしょうか? -"保存する"というのは 後から読み出すことができる、という意味です。そのためデータベースのサイズが大きくなることをテストするのではなく、 -バナナを読み出すことができるかをテストすべきです。 - - -```diff -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() -- let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - -- // Assert: The size of the database should have increased by one. -- XCTAssertEqual(database.size, originalSize + 1) -+ // Assert: The bananas saved to and loaded from the database should be the same. -+ XCTAssertEqual(database.load(key: "test-banana"), banana) -} -``` - -動作テストを書く際の重要なポイント: - -- アプリケーションコードが何をすべきか明確にしているか? -- テストが *動作のみ* をテストしているか?コードの動作が他の要因で意図しない動きにならないか。 diff --git a/Carthage/Checkouts/Quick/Documentation/ja/ConfiguringQuick.md b/Carthage/Checkouts/Quick/Documentation/ja/ConfiguringQuick.md deleted file mode 100644 index 3c2432f..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/ConfiguringQuick.md +++ /dev/null @@ -1,101 +0,0 @@ -# Quickの挙動をカスタマイズしましょう - -`QuickConfiguration` を継承したクラスを作成し、`QuickConfiguration.Type.configure()` をオーバーライドすることで Quick の挙動をカスタマイズすることができます。 - -```swift -// Swift - -import Quick - -class ProjectDataTestConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - // ...set options on the configuration object here. - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(ProjectDataTestConfiguration) - -+ (void)configure:(Configuration *configuration) { - // ...set options on the configuration object here. -} - -QuickConfigurationEnd -``` - -一つのプロジェクトで複数の configuration を持つこともできますが -どの順に configuration が実行されるか保証されません。 - -## テスト全体で使う `beforeEach` と `afterEach` を追加する - -`QuickConfiguration.beforeEach` と `QuickConfiguration.afterEach` を使うと -テストスイート内の各テストの実行前・実行後に走らせる処理を記述することができます。 - -```swift -// Swift - -import Quick -import Sea - -class FinConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { - Dorsal.sharedFin().height = 0 - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -#import "Dorsal.h" - -QuickConfigurationBegin(FinConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEach:^{ - [Dorsal sharedFin].height = 0; - }]; -} - -QuickConfigurationEnd -``` - -さらに現在実行中のテストに関するメタデータを取得することもできます。 - -```swift -// Swift - -import Quick - -class SeaConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { exampleMetadata in - // ...use the example metadata object to access the current example name, and more. - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(SeaConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEachWithMetadata:^(ExampleMetadata *data) { - // ...use the example metadata object to access the current example name, and more. - }]; -} - -QuickConfigurationEnd -``` diff --git a/Carthage/Checkouts/Quick/Documentation/ja/InstallingFileTemplates.md b/Carthage/Checkouts/Quick/Documentation/ja/InstallingFileTemplates.md deleted file mode 100644 index 1c87e52..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/InstallingFileTemplates.md +++ /dev/null @@ -1,26 +0,0 @@ -# Quickファイル・テンプレートのインストール方法 - -Quick のリポジトリには Swift, Objective-C の両方で使用できるテンプレートが含まれています。 - -## Alcatraz - -Quick のテンプレートは Xcode のパッケージマネージャーの [Alcatraz](https://github.com/supermarin/Alcatraz) 経由でインストールできます。 -パッケージマネージャーから検索してみてください。 - -![](http://f.cl.ly/items/3T3q0G1j0b2t1V0M0T04/Screen%20Shot%202014-06-27%20at%202.01.10%20PM.png) - -## Rakefile から手動でインストールする - -手動でインストールすることもできます。 -リポジトリを clone して rake task の `templates:install` を実行してください。 - -```sh -$ git clone git@github.com:Quick/Quick.git -$ rake templates:install -``` - -アンインストールも簡単です、下記コマンドを実行してください。 - -```sh -$ rake templates:uninstall -``` diff --git a/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md b/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md deleted file mode 100644 index 884b8a5..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md +++ /dev/null @@ -1,152 +0,0 @@ -# Quickのインストール方法 - -> **もし Xcode 7.1 を使用していたら** 現時点で最新バージョンの Quick--`v0.9.0` を使用してください -> 最新のリリースは `swift-2.0` branch で開発されています。 - -Quick は examples(テスト) and example groups(テストグループ)の文法を提供します。 -Nimble は `expect(...).to` の文法を提供します。 -テストでは両方を使ってもいいですし、どちらか片方を使う、ということもできます。 - -Quick をテストに組み込むには3つの方法があります。 - -1. [Git Submodules](#git-submodules) -2. [CocoaPods](#cocoapods) -3. [Carthage](#carthage) - -下記のインストール手順の中からどれか選択してインストールを進めてください。 -インストール完了後、テストターゲット内のファイルで Quick を使用(`import Quick`)できるようになります。 - -## Git Submodules - -Git submodules を使って Quick と Nimble をリンクします。手順の流れとしては下記の通りです。 - -1. Quick を submodule として追加. -2. プロジェクトで`.xcworkspace`を使っていなければ作成してください。 ([こちらを参照](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) -3. `Quick.xcodeproj` をプロジェクトの`.xcworkspace`に追加してください。 -4. `Nimble.xcodeproj` をプロジェクトの`.xcworkspace`に追加してください。 `Nimble.xcodeproj` は `path/to/Quick/Externals/Nimble` にあります。 Quick が依存している Niimble を追加することで Quick のバージョンと Nimble のバージョンを合わせられます。 - -5. `Quick.framework` と `Nimble.framework` を BuildPhase の "Link Binary with Libraries" でリンクします。 - -もしまだ git submodules 用のディレクトリを作っていなかったら、まず始めにディレクトリを作成します。 -`Vendor` という名前のディレクトリを用意しましょう。 - -**Step 1:** Quick と Nimble を Git submodules としてダウンロードする - -```sh -git submodule add git@github.com:Quick/Quick.git Vendor/Quick -git submodule add git@github.com:Quick/Nimble.git Vendor/Nimble -git submodule update --init --recursive -``` - -**Step 2:** `Quick.xcodeproj` と `Nimble.xcodeproj` をプロジェクトの `.xcworkspace` に追加してください。 -例として `Guanaco.xcworkspace` という workspace に Quick と Nimble を追加します。 - -![](http://f.cl.ly/items/2b2R0e1h09003u2f0Z3U/Screen%20Shot%202015-02-27%20at%202.19.37%20PM.png) - -**Step 3:** build phase の `Link Binary with Libraries` に `Quick.framework` を追加してください。 -2種類の `Quick.frameworks` が表示されますが 1 つは OS X 用で、もう 1 つが iOS 用です。 - -![](http://cl.ly/image/2L0G0H1a173C/Screen%20Shot%202014-06-08%20at%204.27.48%20AM.png) - -`Nimble.framework` も同様に追加してください。これで完了です! - -**Submodules をアップデートする:** Quick と Nimble を最新バージョンにアップデートしたい場合は Quick ディレクトリに入って master リポジトリから pull してください。 - -```sh -cd /path/to/your/project/Vendor/Quick -git checkout master -git pull --rebase origin master -``` - -あなたのプロジェクトの Git リポジトリは submodule の変更もトラッキングしているので Quick submodules の更新を commit しておきます。 - -```sh -cd /path/to/your/project -git commit -m "Updated Quick submodule" -``` - -**Quick Submodule を含んだ リポジトリを git clone する:** 他の開発者があなたのリポジトリを clone したあと、submodules を同様に pull してくる必要があります。`git submodule update` コマンドを実行することで pull できます。 - -```sh -git submodule update --init --recursive -``` - -git submodules に詳細な情報は[こちら](http://git-scm.com/book/en/Git-Tools-Submodules)です。 - -## CocoaPods - -CocoaPods でインストールする場合、バージョンは 0.36.0 以降である必要(CocoaPods が Swift をサポートしているバージョン)があります。 - -Podfile に Quick と Nimble を追加して下さい。 Swift では ```use_frameworks!``` も必要です。 - -```rb - -# Podfile - -use_frameworks! - -def testing_pods - pod 'Quick', '~> 0.9.0' - pod 'Nimble', '3.0.0' -end - -target 'MyTests' do - testing_pods -end - -target 'MyUITests' do - testing_pods -end -``` - -その後 pod install でダウンロード、リンクします。 - -```sh -pod install -``` - -### Swift 1.2 で使う - -Quick の最新版(0.4.0)は Swift 2 (Xcode 7) 用ですが、Nimble の最新版(1.0.0) は Swift 1.2 (Xcode 6) 用です。 - -もし Xcode6 で使いたい場合は下記のようにバージョン指定してください。 - -```sh -target 'MyTests' do - use_frameworks! - pod 'Quick', '~>0.3.0' - pod 'Nimble', '~>1.0.0' -end -``` - -## [Carthage](https://github.com/Carthage/Carthage) - -テストターゲットは "Embedded Binaries" section がないので framework はターゲットの "Link Binary With Libraries" に追加する必要があります。 build phase の "Copy Files" も同様にターゲットの framework destination を指定して下さい。 - - > Carthage は dynamic frameworks をビルドするので code signing identity に有効なものを設定しておく必要があります。 - -1. Quick を [`Cartfile.private`](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfileprivate) に追加してください。 - - ``` - github "Quick/Quick" - github "Quick/Nimble" - ``` - -2. `carthage update` を実行してください。 -3. `Carthage/Build/[platform]/` ディレクトリから Quick と Nimble をテストターゲットの "Link Binary With Libraries" に追加してください。 - ![](http://i.imgur.com/pBkDDk5.png) - -4. テストターゲットの build phase で "New Copy Files Phase" を選択してください。 - ![](http://i.imgur.com/jZATIjQ.png) - -5. "Destination" を "Frameworks" に設定して、2つの framework を追加してください。 - ![](http://i.imgur.com/rpnyWGH.png) - -Carthage の dependency の管理方法はこの方法だけではありません。 -詳細な情報はこちらを参照してください [Carthage documentation](https://github.com/Carthage/Carthage/blob/master/README.md) 。 - -### (非推奨) 実機で Quick のテストを走らせる - -Quick で書かれたテストを実機で走らせるためには `Quick.framework` と `Nimble.framework` を `Embedded Binaries` としてテストターゲットの `ホストアプリケーション` に追加されます。 Embedded binary として framework を追加すると Xcode が自動的にホストアプリケーションにリンクしてしまいます。 - -![](http://indiedev.kapsi.fi/images/embed-in-host.png) diff --git a/Carthage/Checkouts/Quick/Documentation/ja/MoreResources.md b/Carthage/Checkouts/Quick/Documentation/ja/MoreResources.md deleted file mode 100644 index 996f2df..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/MoreResources.md +++ /dev/null @@ -1,27 +0,0 @@ -# その他の参考資料 - -## Quick のテストのサンプル - -Quick は[GitHub](https://github.com/github)や[ReactiveCocoa](https://github.com/ReactiveCocoa)を含む多くの企業、OSS プロジェクト、個人で利用されています。 - -下記リポジトリを参考にしてみてください。 - -- https://github.com/ReactiveCocoa/ReactiveCocoa -- https://github.com/github/Archimedes -- https://github.com/libgit2/objective-git -- https://github.com/jspahrsummers/RXSwift -- https://github.com/artsy/eidolon -- https://github.com/Moya/Moya -- https://github.com/nerdyc/Squeal -- https://github.com/pepibumur/SugarRecord - -## OS X と iOS Apps のテストに関する参考資料 - -- **[Quality Coding](http://qualitycoding.org/)**: - ユニットテストにフォーカスした iOS 開発に関するブログ。 -- **[OCMock Tutorials](http://ocmock.org/support/)**: - テストでモックが必要な時に使用する OCMock のチュートリアル。 -- **[Nocilla: Stunning HTTP stubbing for iOS and Mac OS X](https://github.com/luisobo/Nocilla)**: - 通信を行うコードをテストする時はこのライブラリを使用して下さい。 -- **[Pivotal Labs: Writing Beautiful Specs with Jasmine Custom Matchers](http://pivotallabs.com/writing-beautiful-specs-jasmine-custom-matchers/)**: - Nimble の matcher の書き方に関するドキュメントはこちら([the Nimble documentation](https://github.com/Quick/Nimble)) diff --git a/Carthage/Checkouts/Quick/Documentation/ja/NimbleAssertions.md b/Carthage/Checkouts/Quick/Documentation/ja/NimbleAssertions.md deleted file mode 100644 index 8534a71..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/NimbleAssertions.md +++ /dev/null @@ -1,100 +0,0 @@ -# Nimble Assertions を使ってテストをより簡潔に - -テストが期待した通りに動作しない時、ユニットテストは **何が問題か** を明確にすべきです。 - -次の関数はサルの集団から馬鹿なサルだけを取得します。 - -```swift -public func silliest(monkeys: [Monkey]) -> [Monkey] { - return monkeys.filter { $0.silliness == .VerySilly } -} -``` - -ここでこの関数に対するテストを書いてみましょう。 - -```swift -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) - XCTAssertTrue(contains(sillyMonkeys, kiki)) -} -``` - -このテストは下記のメッセージとともに失敗します。 - -``` -XCTAssertTrue failed -``` - -![](http://f.cl.ly/items/1G17453p47090y30203d/Screen%20Shot%202015-02-26%20at%209.08.27%20AM.png) - -失敗した時は多くの情報を残すことが望ましいです。このメッセージのままではよく分かりません。 -true や false だけではそれがなにか分かりません。このままではテストコードから原因を見つけるまでに時間がかかってしまいます。 - -## 良い失敗メッセージを残す: Part 1: XCTAssert に手動でメッセージを渡す - -`XCTAssert` は失敗時にメッセージを指定することができます。 - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki)) -+ XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -} -``` - -しかし`XCTAssert`では自分でメッセージを指定しないといけません。 - -## 良い失敗メッセージを残す: Part 2: Nimble Failure Messages を使う - -Nimble は Assert, 失敗時のメッセージを読みやすくしてくれます。 - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -+ expect(sillyMonkeys).to(contain(kiki)) -} -``` - -Nimble では自分でメッセージを指定しなくても Nimble がとても読みやすいメッセージを返してくれます。 - -``` -expected to contain , - got <[Monkey(name: Jane, silliness: VerySilly)]> -``` - -![](http://f.cl.ly/items/3N2e3g2K3W123b1L1J0G/Screen%20Shot%202015-02-26%20at%2011.27.02%20AM.png) - -失敗メッセージは何が問題かを明確にします:ここでは `kiki` が `silliest()` の戻り値に含まれることを期待していますが -このテストでは `jane` しか含まれていません。Nimble からのメッセージで何が問題かが分かりやすく伝えられるので、簡単に直すことができます。 - -```diff -public func silliest(monkeys: [Monkey]) -> [Monkey] { -- return monkeys.filter { $0.silliness == .VerySilly } -+ return monkeys.filter { $0.silliness == .VerySilly || $0.silliness == .ExtremelySilly } -} -``` - -Nimble は具体的な失敗メッセージを返してくれる多くの種類の Assertion を提供します。 -`XCTAssert` と違って毎回自分でメッセージを指定することはありません。 - -Nimble の全ての assertion はこちらで確認できます: [Nimble README](https://github.com/Quick/Nimble) 。 -下記に幾つかの例を示します。 - -```swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` diff --git a/Carthage/Checkouts/Quick/Documentation/ja/QuickExamplesAndGroups.md b/Carthage/Checkouts/Quick/Documentation/ja/QuickExamplesAndGroups.md deleted file mode 100644 index 2ddad20..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/QuickExamplesAndGroups.md +++ /dev/null @@ -1,477 +0,0 @@ -# QuickのExamplesとExample Groupsで、たくさんのテストでも整理整頓 - -Quick では **examples** と **example groups** という特別な文法があります。 - -*[XCTestで役に立つテストを書く方法:Arrange(環境構築), Act(実行), and Assert(動作確認)](ArrangeActAssert.md)* では, -良いテスト名をつけることがとても重要だということを学びました。 -テストが失敗した時、テスト名はアプリケーションコードを直すべきかテストを修正すべきかを判断する際の重要な材料になります。 - -Quick の examples(テスト) と example groups(テストグループ) は二つの役に立ちます。 - -1. 記述的なテスト名を書くためことをサポートします -2. テスト中の "環境構築" 部分におけるコードを簡略化します - -## Examples の `it` - -Examples は `it` という「コードがどのように動作すべきかを宣言する」関数を持ちます。 -これは XCTest の test methods のようなものです。 - -`it` 関数は2つのパラメータ、example の名前と closure です。 -下記のテストでは `Sea.Dolphin` クラスがどのように動作すべきかを記述しています。 -この example では「新しく生成された Dolphin は smart で friendly であるべき」と書いています。 - -```swift -// Swift - -import Quick -import Nimble -import Sea - -class DolphinSpec: QuickSpec { - override func spec() { - it("is friendly") { - expect(Dolphin().isFriendly).to(beTruthy()) - } - - it("is smart") { - expect(Dolphin().isSmart).to(beTruthy()) - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -it(@"is friendly", ^{ - expect(@([[Dolphin new] isFriendly])).to(beTruthy()); -}); - -it(@"is smart", ^{ - expect(@([[Dolphin new] isSmart])).to(beTruthy()); -}); - -QuickSpecEnd -``` - -Examples が何をテストしているかを明確にするために Description を使います。 -Description は文字数制限がなくどの文字でも(絵文字さえも!)使うことができます。 -:v: :sunglasses: - -## Example Groups の `describe` と `context` - -Example groups では Example のグルーピングができ、 setup と teardown のコードを共有できます。 - -### `describe` を使ってクラスと関数について記述する - -`Dolphin` クラスの `click` 関数の動作を記述する際に、 -言い換えると関数が動作していることをテストする際に、 -複数の `it` example を `describe` を用いてグルーピングすることができます。 -似ている examples をまとめることで可読性が向上します。 - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - describe("its click") { - it("is loud") { - let click = Dolphin().click() - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - let click = Dolphin().click() - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - describe(@"its click", ^{ - it(@"is loud", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -Xcode でこれらの examples を実行すると`describe` と `it` の記述内容も表示されます。上記のテストの場合、下記のような出力になります。 - -1. `DolphinSpec.a_dolphin_its_click_is_loud` -2. `DolphinSpec.a_dolphin_its_click_has_a_high_frequency` - -それぞれの Example が何をテストしているかが明確ですね。 - -### `beforeEach` と `afterEach` を使って Setup/Teardown のコードを共有する - -Example groups はテストの内容をただ分かりやすくするだけでなく同一グループ内のsetup/teardownコードを共有することができます。 - -下記の例では`its click`の Example group のテストを実行する前に `beforeEach`を使って新しい Dolphin のインスタンスを生成しています。 -各 Example において "新しい" 状態でテストが行えます。 - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { - dolphin = Dolphin() - } - - describe("its click") { - var click: Click! - beforeEach { - click = dolphin.click() - } - - it("is loud") { - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ - dolphin = [Dolphin new]; - }); - - describe(@"its click", ^{ - __block Click *click = nil; - beforeEach(^{ - click = [dolphin click]; - }); - - it(@"is loud", ^{ - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -この例では setup を共有することはあまりメリットがないように見えるかもしれませんが -複数の複雑なオブジェクトを生成する時などコード量を節約することができます。 - -それぞれの Example を実行した後に実行したいコードについては`afterEach`を使います。 - -### `context` を使ってある条件での動作を記述する - -例の Dolphins(イルカ達) はエコーロケーションのために カチッと音を立てます(`click` 関数を呼び出します)。 -イルカ達は特に興味のあるものに近づく時、それが何かを調べるために連続してエコーロケーション(`click` 関数を呼び出します)を行います。 - -このシナリオにおいてテストが 異なる状況において `click` 関数の動作は異なる ということを表す必要があります。 - -基本的にイルカは一度音を鳴らすだけですが、イルカ達が興味があるものが近くにあると連続して音を鳴らします。 - -この状況について `context` 関数を使って表します。ある `context` では通常のケースで、もう一方の`context`ではイルカが興味あるものに近づいているケースです。 - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { dolphin = Dolphin() } - - describe("its click") { - context("when the dolphin is not near anything interesting") { - it("is only emitted once") { - expect(dolphin!.click().count).to(equal(1)) - } - } - - context("when the dolphin is near something interesting") { - beforeEach { - let ship = SunkenShip() - Jamaica.dolphinCove.add(ship) - Jamaica.dolphinCove.add(dolphin) - } - - it("is emitted three times") { - expect(dolphin.click().count).to(equal(3)) - } - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ dolphin = [Dolphin new]; }); - - describe(@"its click", ^{ - context(@"when the dolphin is not near anything interesting", ^{ - it(@"is only emitted once", ^{ - expect(@([[dolphin click] count])).to(equal(@1)); - }); - }); - - context(@"when the dolphin is near something interesting", ^{ - beforeEach(^{ - [[Jamaica dolphinCove] add:[SunkenShip new]]; - [[Jamaica dolphinCove] add:dolphin]; - }); - - it(@"is emitted three times", ^{ - expect(@([[dolphin click] count])).to(equal(@3)); - }); - }); - }); -}); - -QuickSpecEnd -``` - -厳密には `context` キーワードは `describe`と同じですがテストを理解しやすくなるので使い分けるとよいです。 - -### テストの可読性: Quick と XCTest - -*[XCTestで役に立つテストを書く方法:Arrange(環境構築), Act(実行), and Assert(動作確認)](ArrangeActAssert.md)*で各条件についてそれぞれテストを用意するのがテストを書く際の重要な方法と述べましたが -このアプローチで XCTest でテストを書くとテスト名が長くなってしまいます。 - -```swift -func testDolphin_click_whenTheDolphinIsNearSomethingInteresting_isEmittedThreeTimes() { - // ... -} -``` - -Quick を使うと条件について読みやすく、しかもそれぞれの Example group について環境構築が効率的に行えます。 - -```swift -describe("a dolphin") { - describe("its click") { - context("when the dolphin is near something interesting") { - it("is emitted three times") { - // ... - } - } - } -} -``` - -## 一時的に Examples や Example Groups を無効にする - -通っていない Example を一時的に無効にすることもできます。 -Example や Example Groups の先頭に `x` をつけると無効になります。 -Examples の名前がテスト結果の中に出力されますがテストは実行されなくなります。 - - -```swift -// Swift - -xdescribe("its click") { - // ...none of the code in this closure will be run. -} - -xcontext("when the dolphin is not near anything interesting") { - // ...none of the code in this closure will be run. -} - -xit("is only emitted once") { - // ...none of the code in this closure will be run. -} -``` - -```objc -// Objective-C - -xdescribe(@"its click", ^{ - // ...none of the code in this closure will be run. -}); - -xcontext(@"when the dolphin is not near anything interesting", ^{ - // ...none of the code in this closure will be run. -}); - -xit(@"is only emitted once", ^{ - // ...none of the code in this closure will be run. -}); -``` - -## 指定した Examples だけ一時的に実行する - -一部の Example だけ実行できると便利なこともあります。 -そのような時は実行したい Example を `fit` 関数を用いて指定します。 -特定の Example group だけ実行したい時は`fdescribe` か `fcontext` を記述します。 -※もともと書いてあるテストコードの先頭に `f` を追記するだけです。 - -```swift -fit("is loud") { - // ...only this focused example will be run. -} - -it("has a high frequency") { - // ...this example is not focused, and will not be run. -} - -fcontext("when the dolphin is near something interesting") { - // ...examples in this group are also focused, so they'll be run. -} -``` - -```objc -fit(@"is loud", { - // ...only this focused example will be run. -}); - -it(@"has a high frequency", ^{ - // ...this example is not focused, and will not be run. -}); - -fcontext(@"when the dolphin is near something interesting", ^{ - // ...examples in this group are also focused, so they'll be run. -}); -``` - -## `beforeSuite` と `afterSuite` を使ってテスト全体に対する Setup/Teardown を行う - -テストの環境構築の中にはどの Example よりも先に、または最後に実行したいものがある場合もあります。 -このような時は `beforeSuite` か `afterSuite` を使います。 - -下記の例では 全ての Example が実行される前に一度だけ海の全ての生物のデータベースが生成され、全ての Exmample が実行された後にデータベースを削除しています。 - -```swift -// Swift - -import Quick - -class DolphinSpec: QuickSpec { - override func spec() { - beforeSuite { - OceanDatabase.createDatabase(name: "test.db") - OceanDatabase.connectToDatabase(name: "test.db") - } - - afterSuite { - OceanDatabase.teardownDatabase(name: "test.db") - } - - describe("a dolphin") { - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickSpecBegin(DolphinSpec) - -beforeSuite(^{ - [OceanDatabase createDatabase:@"test.db"]; - [OceanDatabase connectToDatabase:@"test.db"]; -}); - -afterSuite(^{ - [OceanDatabase teardownDatabase:@"test.db"]; -}); - -describe(@"a dolphin", ^{ - // ... -}); - -QuickSpecEnd -``` - -`beforeSuite` and `afterSuite` は必要な数だけ定義することができます。 -全ての `beforeSuite` の closure は全てのテストが実行される前に実行され、 -全ての `afterSuite` の closure は全てのテストが実行された後に実行されます。 - -複数の `beforeSuite`(`afterSuite`) の closure を記述した場合、これらの実行順序は記述した順序で実行されるかは保証されません。 - -## 実行中の Example でメタデータにアクセスする - -実行中の Example の中で、Example名を知りたいケース、これまでに何件の Example を実行したかを知りたいケースがあるかもしれません。 -Quick ではこれらの情報に `beforeEach` と `afterEach` の closure の中からアクセスすることができます。 - -```swift -beforeEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) is about to be run.") -} - -afterEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) has run.") -} -``` - -```objc -beforeEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l is about to be run.", (long)exampleMetadata.exampleIndex); -}); - -afterEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l has run.", (long)exampleMetadata.exampleIndex); -}); -``` diff --git a/Carthage/Checkouts/Quick/Documentation/ja/QuickInObjectiveC.md b/Carthage/Checkouts/Quick/Documentation/ja/QuickInObjectiveC.md deleted file mode 100644 index 6d67044..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/QuickInObjectiveC.md +++ /dev/null @@ -1,48 +0,0 @@ -# Objective-C で Quick を使う - -Quick は Swift でも Objective-C でも問題なく動作します。 - -ですが、Objective-C で Quick を使う場合、2点気を付けておきべきことがあります。 - -## 簡略記法 - -Objective-C で Quick を import すると `it` と `itShouldBehaveLike` というマクロが定義されます。 -また、`context()` and `describe()`といった関数も同様に定義されます。 - -もしプロジェクトですでに同じ名前のシンボルを定義していた場合、重複のためビルドエラーになります。 -その場合は下記のように`QUICK_DISABLE_SHORT_SYNTAX`を定義してこの機能を無効にしてください。 - -```objc -#define QUICK_DISABLE_SHORT_SYNTAX 1 - -@import Quick; - -QuickSpecBegin(DolphinSpec) -// ... -QuickSpecEnd -``` - -`QUICK_DISABLE_SHORT_SYNTAX`マクロは Quick ヘッダを import する前に定義する必要があります。 - - -## Swift のファイルを テストターゲットに含める - -テストターゲットの中に Swift のファイルが含まれていないと Swift stlib が リンクされないため Quick が正しく実行されません。 - -Swift のファイルが含まれていないと下記のようなエラーが発生します。 - -``` -*** Test session exited(82) without checking in. Executable cannot be -loaded for some other reason, such as a problem with a library it -depends on or a code signature/entitlements mismatch. -``` - -修正するためには `SwiftSpec.swift` という名前の空のファイルをテストターゲットに追加してください。 - -```swift -// SwiftSpec.swift - -import Quick -``` - -> この問題に関する詳細情報はこちら https://github.com/Quick/Quick/issues/164. diff --git a/Carthage/Checkouts/Quick/Documentation/ja/README.md b/Carthage/Checkouts/Quick/Documentation/ja/README.md deleted file mode 100644 index 0c4f0d5..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# テストの書き方、Quickの使い方 - -Quickでテストを書くと、SwiftとObjective-Cで書かれたプログラムがどう動作しているか楽に確認できます。 - -ところが、有用なテストはQuickを使わなくても書けます。 -役に立つテストが書けるようになるには、Quickのようなフレームワークの使い方を覚える必要はありません。 - -このディレクトリにあるファイルは、QuickかXCTestかを問わず、 -「役に立つ」テストとは何か、そしてどうやってそういったテストが書けるか、 -それを拙文ながら説明しようとしています。 - -目次: - -(テストについて事前知識がまったくない方は、順に読んでいくことをオススメします。) - -- **[Xcodeでテストを用意しましょう](SettingUpYourXcodeProject.md)**: - アプリのコードがテスト・ファイルから参照できない場合や、 - その他スムーズにテストが動かない場合はこのファイルを読み返すといいかもしれません。 -- **[XCTestで役に立つテストを書く方法:Arrange(環境構築), Act(実行), and Assert(動作確認)](ArrangeActAssert.md)**: - 役に立つテストを書くための基本中の基本。これさえ覚えれば、 - XCTestを使ってあなたも正確に動作するコードをすばやく書けるようになります。 -- **[コードをテストするのではなく、動作の確認をしましょう](BehavioralTesting.md)**: - 同じ「テスト」でも、開発を進めやすくするテストと、邪魔ばかりするテストとがあります。 - 見分ける方法は、このファイルを読めば分かります。 -- **[Nimbleのassertでテストをより読みやすくしましょう](NimbleAssertions.md)**: - Nimbleを使って、テストが失敗したときわかりやすいエラーメッセージを出すようにしましょう。 - わかりやすいメッセージで、テストがなぜ失敗したのかが一瞬でわかって開発の速度があがります。 -- **[QuickのExamplesとExample Groupsで、たくさんのテストでも整理整頓](QuickExamplesAndGroups.md)**: - Quickを使う大きなメリットのひとつはexamplesとexample groupsです。 - これでより簡潔にたくさんのテストが書けるようになります。 -- **[OS XとiOSアプリのテスト](TestingApps.md)**: - AppKitとUIKitを使ったコードをどうやってテストできるか説明します。 -- **[Test doublesを使ったテスト](TestUsingTestDoubles.md)**: - Test doublesを使って対象のクラスのみをテストする方法を説明します。 -- **[assertの共有でボイラープレートコードをなくしましょう](SharedExamples.md)**: - どうやってassertを共有できるか、なぜそうするのが望ましいのか説明します。 -- **[Quickの挙動をカスタマイズしましょう](ConfiguringQuick.md)**: - Quickがテストを実行するときの挙動をどうやって変えられるか説明します。 -- **[Objective-CでQuickを使う方法・注意点](QuickInObjectiveC.md)**: - QuickをObjective-Cで使ったときに思わぬ不具合・トラブルがあった場合、 - これを読んでください。 -- **[Quickのインストール方法](InstallingQuick.md)**: - あなたのプロジェクトにQuickを導入する方法を説明します。Git submodules、 - CocoaPods、Carthage、全部サポートしています! -- **[Quickファイル・テンプレートのインストール方法](InstallingFileTemplates.md)**: - Quickテストをすばやく作成するためのファイル・テンプレートをインストールする方法を説明します。 -- **[その他の参考資料](MoreResources.md)**: - OS X・iOSのテストに関しての資料集を用意しています。 -- **[トラブルシューティング](Troubleshooting.md)**: - その他の不具合に遭遇した場合にこれを読んでください。 diff --git a/Carthage/Checkouts/Quick/Documentation/ja/SettingUpYourXcodeProject.md b/Carthage/Checkouts/Quick/Documentation/ja/SettingUpYourXcodeProject.md deleted file mode 100644 index 9258217..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/SettingUpYourXcodeProject.md +++ /dev/null @@ -1,77 +0,0 @@ -# テストの準備をする - -Xcode7 では Command Line Tool プロジェクトを除き、デフォルトで Unit test target が生成されます。 [参照:コマンドラインツールプロジェクトでテストの準備をする](#コマンドラインツールプロジェクトでテストの準備をする)。 -テストを書くためには Unit test targetから Main target のコードが使用できる必要があります。 - -## Swift のコードを Swift でテストする - -Swift で書かれたコードをテストするためには下記2つの作業を行います。 - -1. プロジェクトファイル `.xcodeproj` の "defines module" を `YES` に設定します。 - - * Xcode で対象のプロジェクトを開き、"Build Settings" の "Defines Modules" の 項目を "Yes" にします。 - -2. 各テストファイルで `@testable import YourAppModuleName` を追記します。 追記することで public, internal のシンボルにアクセスできるようになります。`private` シンボルはアクセスできないままです。 - -```swift -// MyAppTests.swift - -import XCTest -@testable import MyModule - -class MyClassTests: XCTestCase { - // ... -} -``` - -> Swift のファイルを Test target に含める、という方法もありますが、不具合を引き起こす([subtle, hard-to-diagnose -errors](https://github.com/Quick/Quick/issues/91)) ことがあるためお勧めしません。 - -## Objective-C のコードを Swift でテストする - -1. Bridging header を test target に追加します。 -2. Bridging header 内で テストしたいコードを import します。 - -```objc -// MyAppTests-BridgingHeader.h - -#import "MyClass.h" -``` - -これで `MyClass.h` のコードを Swift のテストコードから使用できるようになります。 - -## Swift のコードを Objective-C でテストする - -1. テストしたい Swift のクラスと関数に`@objc`属性を付加します。 -2. テストコードで Module の Swift header を import します。 - -```objc -@import XCTest; -#import "MyModule-Swift.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -## Objective-C のコードを Objective-C でテストする - -テストコード内でテスト対象を import します。 - -```objc -// MyAppTests.m - -@import XCTest; -#import "MyClass.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -### コマンドラインツールプロジェクトでテストの準備をする - -1. プロジェクトのペインからターゲットを追加(+ボタンを押下) -2. "OS X Unit Testing Bundle" または "iOS Unit Testing Bundle" を選択 -3. Main target で "Edit the scheme" を選択 -4. "Test" を選択, "Info" タブで "+" をクリックして追加した testing bundle を選択 diff --git a/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md b/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md deleted file mode 100644 index a1670d2..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md +++ /dev/null @@ -1,122 +0,0 @@ -# assertの共有でボイラープレートコードをなくしましょう - -複数のオブジェクトに対象して同じ内容のテストを行いたい場合があります。 - -例えば `Edible` という protocol があるとします。 -イルカ(dolphin)が何か食べられる(`Edible`な)ものを食べるとイルカが幸せになります。 -サバ(`Mackerel`)とタラ(`Cod`)は食べられる(`Edible`な)ものです。 - -Quick は「イルカがどちらかを食べて幸せになる」ということを簡単にテストすることできます。 - -下記で示すテストは "(何かを食べる)something edible" という共有できるテスト(Shared examples)を定義しています。 -また、この共有できるテストでサバ(Mackerel)とタラ(Cod)を食べることについてのテストを記述しています。 - -```swift -// Swift - -import Quick -import Nimble - -class EdibleSharedExamplesConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in - it("makes dolphins happy") { - let dolphin = Dolphin(happy: false) - let edible = sharedExampleContext()["edible"] - dolphin.eat(edible) - expect(dolphin.isHappy).to(beTruthy()) - } - } - } -} - -class MackerelSpec: QuickSpec { - override func spec() { - var mackerel: Mackerel! - beforeEach { - mackerel = Mackerel() - } - - itBehavesLike("something edible") { ["edible": mackerel] } - } -} - -class CodSpec: QuickSpec { - override func spec() { - var cod: Cod! - beforeEach { - cod = Cod() - } - - itBehavesLike("something edible") { ["edible": cod] } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickConfigurationBegin(EdibleSharedExamplesConfiguration) - -+ (void)configure:(Configuration *configuration) { - sharedExamples(@"something edible", ^(QCKDSLSharedExampleContext exampleContext) { - it(@"makes dolphins happy") { - Dolphin *dolphin = [[Dolphin alloc] init]; - dolphin.happy = NO; - id edible = exampleContext()[@"edible"]; - [dolphin eat:edible]; - expect(dolphin.isHappy).to(beTruthy()) - } - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(MackerelSpec) - -__block Mackerel *mackerel = nil; -beforeEach(^{ - mackerel = [[Mackerel alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": mackerel }; }); - -QuickSpecEnd - -QuickSpecBegin(CodSpec) - -__block Mackerel *cod = nil; -beforeEach(^{ - cod = [[Cod alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": cod }; }); - -QuickSpecEnd -``` - -Shared examples は `it`, `context` や `describe` のブロックをいくつでも含めることができます。 -これは異なる種類の対象についてテストをする際のコードを節約することができます。 - -あるケースでは context を追加する必要もありません。 -Swift では `sharedExamples` closure を使って共有できるテストを定義することができます。 -このテクニックはある時点での状態をテストしたい時などに役に立つかもしれません。 - -```swift -// Swift - -import Quick - -sharedExamples("everything under the sea") { - // ... -} - -itBehavesLike("everything under the sea") -``` - -> Objective-Cでは, `QCKDSLSharedExampleContext` を引数に取る block を渡すことができます。※QCKDSLSharedExampleContext を使う予定がなくても引数に取る block を用意してください。めんどくさくても。世の中そんなもんです。 :cookie: :bomb: - -`itBehavesLike` の先頭に `f` を加えて(`fitBehavesLike`) として共有できるテストのみ実行することもできます。 diff --git a/Carthage/Checkouts/Quick/Documentation/ja/TestUsingTestDoubles.md b/Carthage/Checkouts/Quick/Documentation/ja/TestUsingTestDoubles.md deleted file mode 100644 index 7251e2e..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/TestUsingTestDoubles.md +++ /dev/null @@ -1,138 +0,0 @@ -# Test doubles を使ったテスト - -## Test doubles - -テストを書いているとしばしば次のような問題にぶつかります。 `車`クラスが`タイヤ`クラスを使用している(依存している)とします。 - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesA.png) - -ここで 車Tests という (`タイヤ`に依存している)`車` のテストを用意します。ここで `タイヤ` にバグがあった場合、`車`に問題なくても 車Tests は失敗します。 -このような事が頻繁に起こるとバグの究明が難しくなります。 - -この問題を回避するには、`車`Tests において `タイヤ`の 代わりになるクラス`完璧タイヤ` クラス(代理、英語で `Stand-in`といいます)を用意する、という方法があります。 - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesAmock.png) - -この`完璧タイヤ`は実装は異なりますが`タイヤ`と同じメソッド、プロパティを持ちます。そのため 車Tests において `タイヤ` を `完璧タイヤ` と入れ替えることができます。 - -`完璧タイヤ`クラスのような差し替え可能なオブジェクトのことを一般に'test doubles(テストダブル)'と呼びます。 -'test doubles' にはいくつか種類があります。 - -- Mock object: テスト対象のクラスの出力の検証に用いる -- Stub object: テスト対象のクラスにデータを渡す(入力)際に用いる -- Fake object: 差し替え前のオブジェクトと近い振る舞いをする(実装がより簡単になっている) - -ここではモックを使ったテストの方法を紹介します。 - -## モックとは - -モックとはテスト対象のオブジェクト(クラス、構造体)が呼び出し先のオブジェクトと意図したとおりに協調動作するかどうかをテストするために使うオブジェクトのことです。 - -## Swift でモックを使ったテストを書く - -### サンプルアプリケーション - -ここでは例としてインターネット経由で取得したデータを表示するアプリケーションを考えます。 - -* DataProviderProtocolというプロトコルを実装したクラスがインターネット経由でデータを取得する -* 取得したデータをViewControllerで表示する - -ここで DataProviderProtocol を定義します。 - -```swift -// Swift -protocol DataProviderProtocol: class { - func fetch(callback: (data: String) -> Void) -} -``` - -DataProviderProtocol の `fetch()`関数でデータを取得し、callbackブロックでデータを渡します。 - -ここで DataProviderProtocol を実装する DataProvider クラスを定義します。 - -```swift -// Swift -class DataProvider: NSObject, DataProviderProtocol { - func fetch(callback: (data: String) -> Void) { - let url = NSURL(string: "http://example.com/")! - let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) - let task = session.dataTaskWithURL(url, completionHandler: { - (data, resp, err) in - let string = NSString(data:data!, encoding:NSUTF8StringEncoding) as! String - callback(data: string) - }) - task.resume() - } -} -``` - -ViewController の `viewDidLoad` 中にデータの取得(`fetch()`の呼び出し)を行います。 - -コードはこのようになります。 - -```swift -// Swift -class ViewController: UIViewController { - @IBOutlet weak var resultLabel: UILabel! - private var dataProvider: DataProviderProtocol? - - override func viewDidLoad() { - super.viewDidLoad() - - dataProvider = dataProvider ?? DataProvider() - - dataProvider?.fetch({ [unowned self] (data) -> Void in - self.resultLabel.text = data - }) - } -} -``` - -## DataProviderProtocol のモックを使ったテストを書く - -この例では ViewController は DataProviderProtocol に依存しています。 -テスト用に DataProviderProtocol を継承したクラス(モックとして使用します)をテストターゲット内に作成します。 - -モックを作成することで、 -- テストを速く実行できる -- インターネットに接続していなくてもテストができるようになる -- ViewController の動作のテストにフォーカスできる(実際のDataProviderをテスト対象から外すことが出来る) - -```swift -// Swift -class MockDataProvider: NSObject, DataProviderProtocol { - var fetchCalled = false - func fetch(callback: (data: String) -> Void) { - fetchCalled = true - callback(data: "foobar") - } -} -``` - -このモックの中で fetchCalled プロパティを定義しています。 fetchCalled は fetch 関数が呼ばれたら true になります。 -これで準備は完了です。 - -このモックを使ってテストをします。このテストで「 ViewController がロードされた時(viewDidLoad)に dataProvider を使って fetch() を実行するか」という動作をテストしています。 - -```swift -// Swift -override func spec() { - describe("view controller") { - it("fetch data with data provider") { - let mockProvier = MockDataProvider() - let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as! ViewController - viewController.dataProvier = mockProvier - - expect(mockProvier.fetchCalled).to(equal(false)) - - let _ = viewController.view - - expect(mockProvier.fetchCalled).to(equal(true)) - } - } -} -``` - -このようにオブジェクトのモックを作ることで動作をテストしやすくなります。 - -テストの書き方について、更に詳細を知りたい方はこちらのビデオを参考にしてください。 https://realm.io/jp/news/testing-in-swift/ 。 diff --git a/Carthage/Checkouts/Quick/Documentation/ja/TestingApps.md b/Carthage/Checkouts/Quick/Documentation/ja/TestingApps.md deleted file mode 100644 index db389ee..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/TestingApps.md +++ /dev/null @@ -1,174 +0,0 @@ -# Testing OS X and iOS Applications - -*[Xcodeでテストを用意しましょう](SettingUpYourXcodeProject.md)*では Objective-C や Swift の関数やクラスを -テストするために必要なことを述べました。ここでは `UIViewController` のサブクラスなどをテストする際のポイントを述べます。 - -> 関連する LT がありますので[こちら](https://vimeo.com/115671189#t=37m50s)も参考にしてください。 (37'50" から始まる部分です)。 - -## `UIViewController` のライフサイクルイベントを発火させる - -通常は UIKit が view controller のライフサイクルイベントを発火しますが、 -テストをする時は自分たちでライフサイクルイベントを発火させる必要があります。 -呼び出すには3つの方法があります。 - -1. `UIViewController.view`にアクセスする、すると `UIViewController.viewDidLoad()` のイベントが発火します。 -2. `UIViewController.beginAppearanceTransition()` を呼び出すとほとんどのライフサイクルイベントが発火します。。 -3. `UIViewController.viewDidLoad()` や `UIViewController.viewWillAppear()` などのライフサイクルに関わる関数を直接呼び出す。 - -```swift -// Swift - -import Quick -import Nimble -import BananaApp - -class BananaViewControllerSpec: QuickSpec { - override func spec() { - var viewController: BananaViewController! - beforeEach { - viewController = BananaViewController() - } - - describe(".viewDidLoad()") { - beforeEach { - // Method #1: Access the view to trigger BananaViewController.viewDidLoad(). - let _ = viewController.view - } - - it("sets the banana count label to zero") { - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal("0")) - } - } - - describe("the view") { - beforeEach { - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - viewController.beginAppearanceTransition(true, animated: false) - viewController.endAppearanceTransition() - } - // ... - } - - describe(".viewWillDisappear()") { - beforeEach { - // Method #3: Directly call the lifecycle event. - viewController.viewWillDisappear(false) - } - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; -#import "BananaViewController.h" - -QuickSpecBegin(BananaViewControllerSpec) - -__block BananaViewController *viewController = nil; -beforeEach(^{ - viewController = [[BananaViewController alloc] init]; -}); - -describe(@"-viewDidLoad", ^{ - beforeEach(^{ - // Method #1: Access the view to trigger -[BananaViewController viewDidLoad]. - [viewController view]; - }); - - it(@"sets the banana count label to zero", ^{ - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal(@"0")) - }); -}); - -describe(@"the view", ^{ - beforeEach(^{ - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - [viewController beginAppearanceTransition:YES animated:NO]; - [viewController endAppearanceTransition]; - }); - // ... -}); - -describe(@"-viewWillDisappear", ^{ - beforeEach(^{ - // Method #3: Directly call the lifecycle event. - [viewController viewWillDisappear:NO]; - }); - // ... -}); - -QuickSpecEnd -``` - -## Storyboard 内に定義した View Controller を初期化する - -Storyboard 内に定義した View Controller を初期化する際は **Storyboard ID** を定義しておく必要があります。 - -![](http://f.cl.ly/items/2X2G381K1h1l2B2Q0g3L/Screen%20Shot%202015-02-27%20at%2011.58.06%20AM.png) - -**Storyboard ID** を定義しておくとテストコードから ViewController を初期化することができます。 - -```swift -// Swift - -var viewController: BananaViewController! -beforeEach { - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - let storyboard = UIStoryboard(name: "Main", bundle: nil) - // 2. Use the storyboard to instantiate the view controller. - viewController = - storyboard.instantiateViewControllerWithIdentifier( - "BananaViewControllerID") as! BananaViewController -} -``` - -```objc -// Objective-C - -__block BananaViewController *viewController = nil; -beforeEach(^{ - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; - // 2. Use the storyboard to instantiate the view controller. - viewController = [storyboard instantiateViewControllerWithIdentifier:@"BananaViewControllerID"]; -}); -``` - -## ボタンをタップされた、などの UIControl Events を発火させる - -ボタンや他の `UIControl` を継承したクラスは Control イベントを発火させる関数を持っています。 -ボタンをタップされた時の動作をテストするにはこのように書くことができます: - -```swift -// Swift - -describe("the 'more bananas' button") { - it("increments the banana count label when tapped") { - viewController.moreButton.sendActionsForControlEvents( - UIControlEvents.TouchUpInside) - expect(viewController.bananaCountLabel.text).to(equal("1")) - } -} -``` - -```objc -// Objective-C - -describe(@"the 'more bananas' button", ^{ - it(@"increments the banana count label when tapped", ^{ - [viewController.moreButton sendActionsForControlEvents:UIControlEventTouchUpInside]; - expect(viewController.bananaCountLabel.text).to(equal(@"1")); - }); -}); -``` diff --git a/Carthage/Checkouts/Quick/Documentation/ja/Troubleshooting.md b/Carthage/Checkouts/Quick/Documentation/ja/Troubleshooting.md deleted file mode 100644 index 095dad3..0000000 --- a/Carthage/Checkouts/Quick/Documentation/ja/Troubleshooting.md +++ /dev/null @@ -1,9 +0,0 @@ -# トラブルシューティング - -Quick を使用するときによくぶつかる問題の解決策を紹介します。 - -## Cocoapods でインストールした時に「No such module 'Quick'」エラーが出る - -- すでに `pod install` を実行していた場合、一度 Xcode workspace を閉じて再度開いてみてください。それでも解決しない場合は次の手順を試してみてください。 -- `ModuleCache` を含む `~/Library/Developer/Xcode/DerivedData` をすべて削除してください。 -- `Manage Schemes`ダイアログから`Quick`、`Nimble`、`Pods-ProjectNameTests` ターゲットの Scheme が有効なことを確認して、明示的にビルド(`Cmd+B`)をやり直してみてください。 diff --git a/Carthage/Checkouts/Quick/Documentation/pt-br/BehavioralTesting.md b/Carthage/Checkouts/Quick/Documentation/pt-br/BehavioralTesting.md deleted file mode 100644 index 4e41676..0000000 --- a/Carthage/Checkouts/Quick/Documentation/pt-br/BehavioralTesting.md +++ /dev/null @@ -1,78 +0,0 @@ -# Não Teste o Código, Verifique Comportamento - -Testes devem falhar somente se a aplicação **se comportar diferente**. -Eles devem testar *o que* o código da aplicação faz, não *como* faz. - -- Testes que verificam *o que* a aplicação faz são **testes de comportamento**. -- Testes que quebram se o código da aplicação muda, mesmo que o comportamento seja mantido, são **teste frágeis**. - -Vamos supor que temos uma database de bananas, chamada `GorillaDB`. -`GorillaDB` é uma database baseada em chave-valor que guarda bananas. Nós podemos salvar bananas: - -```swift -let database = GorillaDB() -let banana = Banana() -database.save(banana: banana, key: "my-banana") -``` - -E podemos ler bananas: - -```swift -let banana = database.load(key: "my-banana") -``` - -## Testes Frágeis - -Como podemos testar esse comportamento? Um jeito seria checar o tamanho da database depois de salvar uma banana: - -```swift -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() - let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - - // Assert: The size of the database should have increased by one. - XCTAssertEqual(database.size, originalSize + 1) -} -``` - - -Imagine, no entanto, que o código fonte da `GorillaDB` mude. Para que a operação de leitura de bananas da database seja mais rápida, é mantido um cache com as bananas lidas com maior frequência. `GorillaDB.size` aumenta conforme o tamanho do cache aumenta, e nosso teste falha: - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/Screenshot_database_size_fail.png) - -## Testes de Comportamento - -O segredo para escrever testes de comportamento é determinar exatamente o que se espera que o código da aplicação faça. - -No contexto do teste `testSave_savesTheBananaToTheDatabase`: qual é o comportamento esperado quando uma banana é salva na database? "Salvar" implica que essa banana pode ser lida mais tarde. Então, ao invés de testar que o tamanho da database aumenta, nós devemos testar que é possível ler uma banana. - -```diff -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() -- let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - -- // Assert: The size of the database should have increased by one. -- XCTAssertEqual(database.size, originalSize + 1) -+ // Assert: The bananas saved to and loaded from the database should be the same. -+ XCTAssertEqual(database.load(key: "test-banana"), banana) -} -``` - -O segredo para escrever testes de comportamento é perguntar: - -- O que exatamente o código dessa aplicação deve fazer? -- O meu teste está verificando *apenas* esse comportamento? Ou o teste pode falhar devido à forma como o código funciona? \ No newline at end of file diff --git a/Carthage/Checkouts/Quick/Documentation/pt-br/README.md b/Carthage/Checkouts/Quick/Documentation/pt-br/README.md deleted file mode 100644 index c170942..0000000 --- a/Carthage/Checkouts/Quick/Documentation/pt-br/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Documentação - -Quick te ajuda a verificar como programas em Swift e Objective-C se comportam. - -Fazê-lo de forma eficaz não é apenas questão de saber como usar Quick. Os guias nesse diretório podem te ajudar a escrever testes eficazes --não apenas usando Quick, mas até mesmo XCTest ou outros framework de teste. - -Cada guia cobre um tópico em particular. Se você é completamente novo a teste unitário, considere lê-los na ordem que são introduzidos abaixo: - -- **[Configurar Testes no seu Xcode Project](SettingUpYourXcodeProject.md)**: - Leia isto se você esta com problemas para usar o código da sua aplicação de dentro dos seus arquivos de teste. -- **[Testes Eficazes Usando XCTest: Arrange, Act e Assert](ArrangeActAssert.md)**: - Leia isto para aprender como escrever `XCTestcase` testes que o ajudarão a escrever código mais rápido e mais eficaz. -- **[Não Teste o Código, Verifique Comportamento](BehavioralTesting.md)**: - Leia isto para aprender que tipos de testes te deixam mais rápido e quais os que só vão acabar te deixando mais devagar. -- **[Testes Limpos Usando Nimble Assertions](NimbleAssertions.md)**: - Leia isto para aprender a usar Nimble para gerar melhores mensagens de falha. - Melhores mensagens de falha ajudam a se mover mais rápido, gastando menos tempo tentando descobrir por que -    um teste falhou. -- **[Testes Organizados com Exemplos Quick e Grupos de Exemplo](QuickExamplesAndGroups.md)**: - Leia isto para aprender como Quick pode ajudar ainda mais a escrever testes eficazes, usando *exemplos* e *grupos de exemplos* -- **[Testando Aplicações OS X e iOS](TestingApps.md)**: - Leia isto para aprender mais sobre testar código que utiliza - AppKit e UIKit frameworks. -- **[Testando com testes dublês](TestUsingTestDoubles.md)**: - Leia isto para aprender o que são testes dublês e como usa-lôs. -- **[Reduzindo Teste Boilerplate com Assertions Compartilhados](SharedExamples.md)**: - Leia isto para aprender como compartilhar conjuntos de assertions entre seus testes. -- **[Configurando como Quick se Comporta](ConfiguringQuick.md)**: - Leia isto para aprender como você pode mudar como Quick se comporta quando roda os sua suite de testes. -- **[Usando Quick com Objective-C](QuickInObjectiveC.md)**: - Leia isto se você esta com problemas para usar Quick em Objective-C. -- **[Instalando Quick](InstallingQuick.md)**: - Leia isto para instruções de como adicionar Quick no seu projeto, usando Git submodules, CocoaPods, Carthage, ou Swift Package Manager. -- **[Instalando Arquivos Templates Quick](InstallingFileTemplates.md)**: -Leia isto para aprender como instalar arquivos templates que deixam escrever Quick specs mais rápidos. -- **[Mais Recursos](MoreResources.md)**: - Uma lista de recursos adicionais sobre testes OS X e iOS. -- **[Troubleshooting](Troubleshooting.md)**: - Leia isto quando você tiver outros problemas. diff --git a/Carthage/Checkouts/Quick/Documentation/pt-br/SharedExamples.md b/Carthage/Checkouts/Quick/Documentation/pt-br/SharedExamples.md deleted file mode 100644 index eabde35..0000000 --- a/Carthage/Checkouts/Quick/Documentation/pt-br/SharedExamples.md +++ /dev/null @@ -1,116 +0,0 @@ -# Reduzindo Teste Boilerplate com Assertions Compartilhados - -Em alguns casos, o mesmo conjunto de especificações se aplica a múltiplos objetos. - -Por exemplo, considere um protocol chamado `Edible` (comestível). Quando um golfinho come algo `Edible`, ele fica feliz. `Mackerel` (um tipo de peixe) e `Cod` (bacalhau) são comestíveis. Quick permite testar facilmente que um golfinho fica feliz quando come qualquer um desses peixes. - -O exemplo abaixo define um conjunto de "exemplos compartilhados" para "algo comestível", e especifica que tanto `Mackerel` quanto `Cod` se comportam como "algo comestível": - - -```swift -// Swift - -import Quick -import Nimble - -class EdibleSharedExamplesConfiguration: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in - it("makes dolphins happy") { - let dolphin = Dolphin(happy: false) - let edible = sharedExampleContext()["edible"] - dolphin.eat(edible) - expect(dolphin.isHappy).to(beTruthy()) - } - } - } -} - -class MackerelSpec: QuickSpec { - override func spec() { - var mackerel: Mackerel! - beforeEach { - mackerel = Mackerel() - } - - itBehavesLike("something edible") { ["edible": mackerel] } - } -} - -class CodSpec: QuickSpec { - override func spec() { - var cod: Cod! - beforeEach { - cod = Cod() - } - - itBehavesLike("something edible") { ["edible": cod] } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickConfigurationBegin(EdibleSharedExamplesConfiguration) - -+ (void)configure:(Configuration *configuration) { - sharedExamples(@"something edible", ^(QCKDSLSharedExampleContext exampleContext) { - it(@"makes dolphins happy") { - Dolphin *dolphin = [[Dolphin alloc] init]; - dolphin.happy = NO; - id edible = exampleContext()[@"edible"]; - [dolphin eat:edible]; - expect(dolphin.isHappy).to(beTruthy()) - } - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(MackerelSpec) - -__block Mackerel *mackerel = nil; -beforeEach(^{ - mackerel = [[Mackerel alloc] init]; -}); - -itBehavesLike(@"something edible", ^{ return @{ @"edible": mackerel }; }); - -QuickSpecEnd - -QuickSpecBegin(CodSpec) - -__block Mackerel *cod = nil; -beforeEach(^{ - cod = [[Cod alloc] init]; -}); - -itBehavesLike(@"something edible", ^{ return @{ @"edible": cod }; }); - -QuickSpecEnd -``` - -Exemplos compartilhados podem incluir qualquer número de blocos `it`, `context` e `describe`. Isso economiza *muito* quando deve-se escrever os mesmos testes para diferentes objetos. - -Em alguns casos, nenhum `context` adicional é necessário. Em Swift, é possível usar `sharedExamples` closures que não recebem parâmetros. Isso pode ser útil quando se esta algum estado global: - - -```swift -// Swift - -import Quick - -sharedExamples("everything under the sea") { - // ... -} - -itBehavesLike("everything under the sea") -``` - -> Em Objective-C, é necessário passar um bloco que recebe um `QCKDSLSharedExampleContext`, mesmo se esse argumento não for usado. Desculpe, mas é assim que a banda toca! :trumpet: :notes: - -Também é possível "focar" exemplos compartilhados usando a função `fitBehavesLike`. \ No newline at end of file diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/ArrangeActAssert.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/ArrangeActAssert.md deleted file mode 100644 index fda4f8a..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/ArrangeActAssert.md +++ /dev/null @@ -1,205 +0,0 @@ -# 编写高效的 XCTest 测试: Arrange,Act 和 Assert - -当你使用 XCTest,Quick 或者其他测试框架时,你可以遵循下面的模式来编写有效的单元测试: - -1. Arrange - 安排好所有先要条件和输入 -2. Act - 对要测试的对象或方法进行演绎 -3. Assert - 作出预测结果的断言 - -## Arrange, Act, and Assert 三部曲 - -举个例子,假设现在有一个叫 `Banana` 的类: - -```swift -// Banana/Banana.swift - -/** A delicious banana. Tastes better if you peel it first. */ -public class Banana { - private var isPeeled = false - - /** Peels the banana. */ - public func peel() { - isPeeled = true - } - - /** You shouldn't eat a banana unless it's been peeled. */ - public var isEdible: Bool { - return isPeeled - } -} -``` - -现在我们想验证一下 `Banana.peel()` 方法的行为是否跟我们设想的一样: - -```swift -// BananaTests/BananaTests.swift - -class BananaTests: XCTestCase { - func testPeel() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) - } -} -``` - -## 使用明确清晰的方法名字 - -我们的 `testPeel()` 函数可以确保如果 `Banana.peel()` 方法出了问题,我们可以第一时间知道。这通常发生在我们修改了应用的代码后,同时也意味着: - -1. 如果我们意外地写错了代码,我们需要修复它从而让代码正常工作。 -2. 或者我们可能为了增加一个新的功能而改变原有的代码 —— 因此我们需要更改现有的测试代码。 - -如果我们的测试开始出现失败,怎么才能知道是哪一个测试用例失败呢?这可能会让你吃惊,最好的办法是从 **测试方法的名字** 找出端倪。好的测试方法会: - -1. 明确什么是对正在被测试的对象。 -2. 明确什么时候测试应该通过,什么时候测试应该失败。 - -那我们上面的 `testPeel()` 方法的命名清晰吗?我们可以让它变得更清晰: - -```diff -// BananaTests.swift - --func testPeel() { -+func testPeel_makesTheBananaEdible() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) -} -``` - -新的方法命名: - -1. 明确了什么是正在被测试的对象:`testPeel` 指明了正在被测试的是 `Banana.peel()` 方法。 -2. 明确了测试通过的条件:`makesTheBananaEdible` 指明了只要这个测试方法被调用后,香蕉就已经被剥皮(可食用)。 - -## 对条件进行测试 - -假设我们现在可以向别人提供香蕉,有这样一个叫 `offer()` 的函数: - -```swift -// Banana/Offer.swift - -/** Given a banana, returns a string that can be used to offer someone the banana. */ -public func offer(banana: Banana) -> String { - if banana.isEdible { - return "Hey, want a banana?" - } else { - return "Hey, want me to peel this banana for you?" - } -} -``` - -我们的代码做了以下其中一件事: - -1. 给别人一个已经被剥过皮的香蕉。 -2. 或者给别人一个没剥皮的香蕉。 - -现在让我们为这两种情况编写测试: - -```swift -// BananaTests/OfferTests.swift - -class OfferTests: XCTestCase { - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { - // Arrange: Create a banana and peel it. - let banana = Banana() - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { - // Arrange: Create a banana. - let banana = Banana() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -我们的方法名字清晰地指明了测试通过时所应具备的**条件**:在 `whenTheBananaIsPeeled` 测试中,`offer()` 方法应该 `offersTheBanana`。那香蕉没被剥皮的情况呢?好吧,我们也写了另外一个测试来测试这种情况。 - -注意,我们为每个 `if` 条件单独写了一个测试。在我们写测试时,确保每个条件都能被测试,是一个好的模式。如果其中一个条件不再满足,或者需要修改,我们就很容易知道哪个测试需要处理。 - -## 用 `XCTestCase.setUp()` 来编写更简洁的 "Arrange" - -我们的两个 `OfferTests` 测试都包含了相同的 "Arrange" 代码:他们都初始化了一个香蕉。我们应该把初始化方法移到一个单独的地方。为什么? - -1. 现在,假设需要修改 `Banana` 的初始化方法,那么我们就要对每个方法进行修改。 -2. 我们的测试方法会更加简洁 —— 这对于我们是一件好事,当且**仅当**测试方法能更容易被人阅读的时候。 - -现在我们把 `Banana` 的初始化方法移到 `XCTestCase.setUp()` 方法里,这样当每个测试开始时,初始化方法都会被调用。 - -```diff -// OfferTests.swift - -class OfferTests: XCTestCase { -+ var banana: Banana! -+ -+ override func setUp() { -+ super.setUp() -+ banana = Banana() -+ } -+ - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { -- // Arrange: Create a banana and peel it. -- let banana = Banana() -+ // Arrange: Peel the banana. - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { -- // Arrange: Create a banana. -- let banana = Banana() -- - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -## 在不同的测试里共享 "Arrange" 代码 - -如果你发现你在很多地方都有相同重复的 "arrange" 方法,你可能想定义一个通用的 helper 函数: - -```swift -// BananaTests/BananaHelpers.swift - -internal func createNewPeeledBanana() -> Banana { - let banana = Banana() - banana.peel() - return banana -} -``` - -> 用一个通用函数来定义那些不能被抽象,或不会保存状态的方法。抽象的子类和可修改的状态会使你的测试难以阅读。 - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/BehavioralTesting.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/BehavioralTesting.md deleted file mode 100644 index 70a0b51..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/BehavioralTesting.md +++ /dev/null @@ -1,75 +0,0 @@ -# 别测试代码,而应该验证程序的行为 - -测试应该只在程序的**行为和预期的不一样**时,才不通过。测试应该测试程序的代码做了什么,而不是测试程序如何实现。 - -- 验证应用程序做了什么的,叫做**行为测试**。 -- 即使应用程序的行为不发生变化,只要应用程序的代码发生了变化,测试就不通过的,叫做**脆性测试**。 - -假设我们有一个香蕉数据库,叫做 `GorillaDB`。`GorillaDB` 是一个以键-值对来储存香蕉的数据库。我们可以用这样的方式储存香蕉: - -```swift -let database = GorillaDB() -let banana = Banana() -database.save(banana: banana, key: "my-banana") -``` - -之后可以从数据库里取回香蕉: - -```swift -let banana = database.load(key: "my-banana") -``` - -## 脆性测试 - -我们如何测试这个存取的行为呢?一种方式是每当我们储存一根香蕉后就检查数据库的大小: - -```swift -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { -// Arrange: Create a database and get its original size. -let database = GorillaDB() -let originalSize = database.size - -// Act: Save a banana to the database. -let banana = Banana() -database.save(banana: banana, key: "test-banana") - -// Assert: The size of the database should have increased by one. -XCTAssertEqual(database.size, originalSize + 1) -} -``` - -然而,设想一下 `GorillaDB` 的源代码发生了变化。为了从数据库里更快地取出香蕉,数据库预留了一部份缓存空间用于存放经常使用的香蕉。`GorillaDB.size` 就会随着缓存的增加而增加,这样我们的测试就不能通过了: - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/Screenshot_database_size_fail.png) - -## 行为测试 - -编写行为测试的关键,就是准确的定位你想让你的程序代码做什么。 - -在我们的 `testSave_savesTheBananaToTheDatabase` 的测试中:当我们在数据库中储存一根香蕉时,我们所希望程序完成的是一个怎样的行为呢?应该是保存香蕉,即之后可以取回香蕉。因此,我们不该测试数据库大小的增加,而应该测试我们能不能从数据库里取回香蕉。 - -```diff -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { -// Arrange: Create a database and get its original size. -let database = GorillaDB() -- let originalSize = database.size - -// Act: Save a banana to the database. -let banana = Banana() -database.save(banana: banana, key: "test-banana") - -- // Assert: The size of the database should have increased by one. -- XCTAssertEqual(database.size, originalSize + 1) -+ // Assert: The bananas saved to and loaded from the database should be the same. -+ XCTAssertEqual(database.load(key: "test-banana"), banana) -} -``` - -编写行为测试的关键,就在于思考这些问题: - -- 这段程序代码是用来做什么的? -- 我的测试只验证了程序的行为吗?它可能因为代码运行的其他原因而不通过吗? diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/ConfiguringQuick.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/ConfiguringQuick.md deleted file mode 100644 index fc5ba90..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/ConfiguringQuick.md +++ /dev/null @@ -1,102 +0,0 @@ -# 配置 Quick 的行为 - -你可以通过继承 `QuickConfiguration` 并且 -重写 `QuickConfiguration.Type.configure()` 类方法的方式来自定义 Quick 的行为。 - -```swift -// Swift - -import Quick - -class ProjectDataTestConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - // ...set options on the configuration object here. - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(ProjectDataTestConfiguration) - -+ (void)configure:(Configuration *configuration) { - // ...set options on the configuration object here. -} - -QuickConfigurationEnd -``` - -一个项目可能包含多个配置。Quick 不保证这些配置执行的先后顺序。 - -## 添加全局闭包 `beforeEach` 和 `afterEach` - -你可以通过使用 `QuickConfiguration.beforeEach` 和 `QuickConfiguration.afterEach` ,执行测试中每个例子运行前或运行后特定的闭包代码: - -```swift -// Swift - -import Quick -import Sea - -class FinConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { - Dorsal.sharedFin().height = 0 - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -#import "Dorsal.h" - -QuickConfigurationBegin(FinConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEach:^{ - [Dorsal sharedFin].height = 0; - }]; -} - -QuickConfigurationEnd -``` - -另外,Quick 允许你根据当前正在运行的例子,访问元数据: - -```swift -// Swift - -import Quick - -class SeaConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { exampleMetadata in - // ...use the example metadata object to access the current example name, and more. - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(SeaConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEachWithMetadata:^(ExampleMetadata *data) { - // ...use the example metadata object to access the current example name, and more. - }]; -} - -QuickConfigurationEnd -``` - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingFileTemplates.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingFileTemplates.md deleted file mode 100644 index 7e35365..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingFileTemplates.md +++ /dev/null @@ -1,26 +0,0 @@ -# 安装 Quick 文件模板 - -Quick 仓库包含了 Swift 和 Objective-C 规范的文件模板。 - -## Alcatraz - -Quick 模板可以通过 [Alcatraz](https://github.com/supermarin/Alcatraz) 安装,这是一个 Xcode 的包管理器。只需在包管理器里搜索 Quick : - -![](http://f.cl.ly/items/3T3q0G1j0b2t1V0M0T04/Screen%20Shot%202014-06-27%20at%202.01.10%20PM.png) - -## 使用 Rakefile 手动安装 - -如果想手动安装模板,那么只需克隆仓库并运行 rake 命令 `templates:install` : - -```sh -$ git clone git@github.com:Quick/Quick.git -$ rake templates:install -``` - -若要卸载模板,可以运行命令: - -```sh -$ rake templates:uninstall -``` - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md deleted file mode 100644 index 2f54b0a..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md +++ /dev/null @@ -1,157 +0,0 @@ -# 安装 Quick - -> **如果你的 Xcode 版本是7.1,** 请使用新的 Quick--`v0.9.0` 写测试代码。 -> 新发布的版本是基于 `swift-2.0` 这个分支开发的。 - - - -Quick 提供了定义例子和例子群的语法。 Nimble 提供了如 `expect(...).to` 的断言语法。 在写测试代码的时候,你可以使用它们中的任意一个或者同时使用它们。 - -下面是几种主要的方法,用来添加 Quick 支持: - -1. [Git Submodules](#git-submodules) -2. [CocoaPods](#cocoapods) -3. [Carthage](#carthage) -4. [Swift Package Manager (experimental)](#swift-package-manager) - -你可以选择其中一种方法,并按照下面的步骤进行。完成之后,就可以通过 `import Quick` 使你的测试支持 Quick 。 - -## Git Submodules - -通过以下步骤可以使用 Git 的子模块(submodules) 为项目添加 Quick 和 Nimble : - -1. 添加子模块 Quick。 -2. 为你的项目新建一个 `.xcworkspace` 文件,如果原本已经有这个文件,则跳过此步骤。 ([如何添加请看这里](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) -3. 把 `Quick.xcodeproj` 添加到项目的 `.xcworkspace`中。 -4. 把 `Nimble.xcodeproj` 添加到项目的 `.xcworkspace`中。它所在的目录是: `path/to/Quick/Externals/Nimble`。 通过从 Quick 的依赖库中添加 Nimble (而不是直接添加为子模块),可以确保无论所用的 Quick 是什么版本,都能使用正确版本的 Nimble 。 -5. 把 `Quick.framework` 和 `Nimble.framework` 添加到项目 "build phase" 选项页的 "Link Binary with Libraries" 列表中。 - -首先,你需要有一个 Git 子模块的目录,如果没有的话,就创建一个。假设这个目录的名称是 "Vendor" 。 - -**第一步:** 下载 Quick 和 Nimble 作为 Git 的子模块: - -```sh -git submodule add git@github.com:Quick/Quick.git Vendor/Quick -git submodule add git@github.com:Quick/Nimble.git Vendor/Nimble -git submodule update --init --recursive -``` - -**第二步:** 把下载完的 `Quick.xcodeproj` 和 `Nimble.xcodeproj` 文件添加到项目的 `.xcworkspace` 上。 例如:下图是 `Guanaco.xcworkspace` 已经添加了 Quick 和 Nimble : - -![](http://f.cl.ly/items/2b2R0e1h09003u2f0Z3U/Screen%20Shot%202015-02-27%20at%202.19.37%20PM.png) - -**第三步:** 把 `Quick.framework` 添加到测试目标(target)的 `Link Binary with Libraries` 列表中。你会发现有两个 `Quick.frameworks`;其中一个是 OS X 平台的,另一个是 iOS 平台的。 - -![](http://cl.ly/image/2L0G0H1a173C/Screen%20Shot%202014-06-08%20at%204.27.48%20AM.png) - -重复上面的步骤,添加 `Nimble.framework`。 - -**更新子模块:** 如果你想把 Quick 和 Nimble 模块升级到最新版本,你可以在 Quick 目录下使用 `pull` 来更新,如下: - -```sh -cd /path/to/your/project/Vendor/Quick -git checkout master -git pull --rebase origin master -``` - -你的 Git 仓库会自动同步更改到子模块中。如果你想确保已经更新了 Quick 子模块,那么可以这样: - -```sh -cd /path/to/your/project -git commit -m "Updated Quick submodule" -``` - -**克隆一个包含有 Quick 子模块的仓库:** 当其他人克隆了你的仓库后,他们会同时拥有这些子模块。 -他们可以运行 `git submodule update` 命令: - -```sh -git submodule update --init --recursive -``` - -更多关于子模块的内容,可以参考[这里](http://git-scm.com/book/en/Git-Tools-Submodules)。 - -## CocoaPods - -首先,请把 CocoaPods 升级到0.36或者更高的版本,这样才能在 Swift 下使用 CocoaPods 。 - -然后在你的 Podfile 中添加 Quick 和 Nimble 。并且为了在 Swift 中使用 CocoaPods ,记得加上这一行: ```use_frameworks!``` 。 - -```rb - -# Podfile - -use_frameworks! - -def testing_pods - pod 'Quick' - pod 'Nimble' -end - -target 'MyTests' do - testing_pods -end - -target 'MyUITests' do - testing_pods -end -``` - -最后,下载并将 Quick 和 Nimble 导入到你的测试中: - -```sh -pod install -``` - -### 使用 Swift 1.2 ? - -最近发布的 Quick (0.4.0) 适用于 Swift 2 (Xcode 7),但是 Nimble (1.0.0) 适用于 Swift 1.2 (Xcode 6)。 - -如果你想在 Xcode 6 中使用它们,请使用以下这段代码: - -```sh -target 'MyTests' do - use_frameworks! - pod 'Quick', '~>0.3.0' - pod 'Nimble', '~>1.0.0' -end -``` - -## [Carthage](https://github.com/Carthage/Carthage) - -在一个项目中,测试所在的目标(target)并没有 "Embedded Binaries" 这部分内容, 因此必须把框架添加到目标的 "Link Binary With Libraries" 里,并且在 build phase 选项页中新建一条 "Copy Files" 把它们复制到目标的框架列表中。 - - > 因为 Carthage 生成的是动态的框架,所以你需要有一个合法的身份标识。 - -1. 在 [`Cartfile.private`](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfileprivate) 中添加 Quick ,如下: - - ``` - github "Quick/Quick" - github "Quick/Nimble" - ``` - -2. 运行 `carthage update`。 -3. 从 `Carthage/Build/[platform]/` 目录下, 找到 Quick 框架和 Nimble 框架,把它们添加到测试目标的 "Link Binary With Libraries" 列表中: - ![](http://i.imgur.com/pBkDDk5.png) - -4. 在你的测试目标下新建一条 "Copy Files" : - ![](http://i.imgur.com/jZATIjQ.png) - -5. 将 "Destination" 设为 "Frameworks",然后添加这两个框架: - ![](http://i.imgur.com/rpnyWGH.png) - -注意,这并不是使用 Carthage 来管理依赖的唯一方法。更多的方法请参考 [Carthage documentation](https://github.com/Carthage/Carthage/blob/master/README.md)。 - -## [Swift Package Manager](https://github.com/apple/swift-package-manager) -随着 [swift.org](https://swift.org) 上一个开源项目的出现, Swift 现在有了一个官方的包管理器。 尽管它刚问世不久,但是它首次使在非苹果平台上使用 Quick 成为了可能。经过初期的开发,现在已经可以利用 Swift Package Manager 为测试项目添加 Quick 支持了。但是由于这个包管理器正在开发中,在使用的过程中可能会出现一些问题。 - -在更新的帮助文档发布之前,这个项目阐述了如何在 SwiftPM 的 `Package.swift` 中添加 Quick 。 - -https://github.com/Quick/QuickOnLinuxExample - -### (不建议) 在真实的iOS设备上运行用Quick书写的代码 - -为了在设备上运行 Quick 形式的代码,你需要把 `Quick.framework` 和 `Nimble.framework` 作为 `Embedded Binaries` 添加到项目目标的 `Host Application` 里。 当以二进制文件的形式把框架添加到 Xcode 中,Xcode 会自动为 App 添加 Quick 框架。 - -![](http://indiedev.kapsi.fi/images/embed-in-host.png) - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/MoreResources.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/MoreResources.md deleted file mode 100644 index 0a9ed84..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/MoreResources.md +++ /dev/null @@ -1,23 +0,0 @@ -# 更多资源 - -## Quick Specs 的例子 - -很多公司、开源项目和独立开发者都使用了 Quick ,包括 [GitHub](https://github.com/github) 和 [ReactiveCocoa](https://github.com/ReactiveCocoa)。具体例子请参考以下链接: - -- https://github.com/ReactiveCocoa/ReactiveCocoa -- https://github.com/github/Archimedes -- https://github.com/libgit2/objective-git -- https://github.com/jspahrsummers/RXSwift -- https://github.com/artsy/eidolon -- https://github.com/AshFurrow/Moya -- https://github.com/nerdyc/Squeal -- https://github.com/pepibumur/SugarRecord - -## 关于 OS X 和 iOS 应用单元测试的更多信息 - -- **[Quality Coding](http://qualitycoding.org/)**:一个关注单元测试的 iOS 开发博客。 -- **[OCMock Tutorials](http://ocmock.org/support/)**:当你需要在测试中使用伪对象时,使用 OCMock 。 -- **[Nocilla: Stunning HTTP stubbing for iOS and Mac OS X](https://github.com/luisobo/Nocilla)**:使用这个库来测试那些与互联网进行数据交换的代码。 -- **[Pivotal Labs: Writing Beautiful Specs with Jasmine Custom Matchers](http://pivotallabs.com/writing-beautiful-specs-jasmine-custom-matchers/)**:参考 [the Nimble documentation](https://github.com/Quick/Nimble) ,了解如何用 Nimble 编写自定义的匹配器。 - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/NimbleAssertions.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/NimbleAssertions.md deleted file mode 100644 index b64919c..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/NimbleAssertions.md +++ /dev/null @@ -1,100 +0,0 @@ -# 使用 Nimble 断言,让测试更清晰 - -当代码不能如预期那样正常运行时,单元测试应该能够反映出问题的所在。 - -例如,下面这个函数能够从所给的一组猴子中筛选并返回其中的傻猴子: - -```swift -public func silliest(monkeys: [Monkey]) -> [Monkey] { - return monkeys.filter { $0.silliness == .VerySilly } -} -``` - -现在有一个针对这个函数的单元测试: - -```swift -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) - XCTAssertTrue(contains(sillyMonkeys, kiki)) -} -``` - -这个测试运行失败,并返回以下信息: - -``` -XCTAssertTrue failed -``` - -![](http://f.cl.ly/items/1G17453p47090y30203d/Screen%20Shot%202015-02-26%20at%209.08.27%20AM.png) - -我们无法从失败信息中获得有用的东西,只能说:“好吧,原本预期为真的表达式,现在却为假。但这是为什么呢?” -像这样的困惑会降低我们的效率,因为我们现在不得不花时间理解这些测试代码。 - -## 更好的失败返回信息,第一部分:手动设定 `XCTAssert` 的返回信息 - -`XCTAssert` 这个断言(Assertion)允许我们设定运行失败时的返回信息(下面简称“返回信息”),这当然有一定的作用: - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki)) -+ XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -} -``` - -但是,我们就不得不亲自设置这些返回信息。 - -## 更好的失败返回信息,第二部分:Nimble 的返回信息 - -Nimble 能让你的测试断言及其返回信息更便于阅读: - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -+ expect(sillyMonkeys).to(contain(kiki)) -} -``` - -我们不需要再亲自设置返回信息,因为 Nimble 提供的信息已经非常清楚了: - -``` -expected to contain , - got <[Monkey(name: Jane, silliness: VerySilly)]> -``` - -![](http://f.cl.ly/items/3N2e3g2K3W123b1L1J0G/Screen%20Shot%202015-02-26%20at%2011.27.02%20AM.png) - -这个返回信息清楚地点明了出错的地方:预期中 `kiki` 应该包含在 `silliest()` 的返回值里面,但是实际的返回值只包含 `jane` 。现在我们知道问题出在哪了,因此很容易解决问题: - -```diff -public func silliest(monkeys: [Monkey]) -> [Monkey] { -- return monkeys.filter { $0.silliness == .VerySilly } -+ return monkeys.filter { $0.silliness == .VerySilly || $0.silliness == .ExtremelySilly } -} -``` - -Nimble 提供了很多种类的断言,每个断言都带有清晰的返回信息。与 `XCTAssert` 不同,你不需要每次都亲自设定返回信息。 - -完整的 Nimble 断言列表,请参考 [Nimble README](https://github.com/Quick/Nimble) 。 -下面是一些例子,先睹为快: - -```swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickExamplesAndGroups.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickExamplesAndGroups.md deleted file mode 100644 index f17281d..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickExamplesAndGroups.md +++ /dev/null @@ -1,461 +0,0 @@ -# 用 Quick 例子和例子群组织测试 - -Quick 使用特殊的语法定义**例子(examples)**和**例子群(example groups)**。 - -在*[编写高效的 XCTest 测试: Arrange,Act 和 Assert](ArrangeActAssert.md)*,我们了解了一个好的测试方法名称是至关重要的,尤其是当测试失败时。它能够帮助我们判断是修改程序代码或者是更新测试内容。 - -Quick 的例子和例子群主要有两个目的: - -1. 它们促使你使用具有描述性的测试名称。 -2. 它们极大地简化了 Arrange 步骤的测试代码。 - -## 例子:使用 `it` - -定义了 `it` 函数的例子,使用断言代码指明了程序应有的行为。这些就像 XCTest 中的测试方法一样。 - -`it` 函数有两个参数:例子的名称和闭包。下面这个例子具体说明了 `Sea.Dolphin` 类应有的行为。 -一只新的海豚(dolphin)应该是聪明(smart)且友好(friendly)的: - -```swift -// Swift - -import Quick -import Nimble -import Sea - -class DolphinSpec: QuickSpec { - override func spec() { - it("is friendly") { - expect(Dolphin().isFriendly).to(beTruthy()) - } - - it("is smart") { - expect(Dolphin().isSmart).to(beTruthy()) - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -it(@"is friendly", ^{ - expect(@([[Dolphin new] isFriendly])).to(beTruthy()); -}); - -it(@"is smart", ^{ - expect(@([[Dolphin new] isSmart])).to(beTruthy()); -}); - -QuickSpecEnd -``` - -用描述性的语言使例子所测试的内容清晰明了。 -描述性的语言可以是任意长度、任意字符的,涵盖了英语以及其他语言的字符,甚至可以是表情符号!:v: :sunglasses: - -## 例子群:使用 `describe` 和 `context` - -例子群是按一定逻辑关系组织的例子。例子群里可以共享配置(setup)和卸载(teardown)代码。 - -### 使用 `describe` 描述类和方法 - -为了具体说明 `Dolphin` 类中 `click` 方法的行为 —— 换句话说,为了验证这个方法可用 —— 我们可以把多个 `it` 例子用 `describe` 函数组织成为一个群。把相同的例子组织在一起能更方便阅读: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - describe("its click") { - it("is loud") { - let click = Dolphin().click() - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - let click = Dolphin().click() - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - describe(@"its click", ^{ - it(@"is loud", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -当这两个例子在 Xcode 中运行的时候,它们会从 `describe` 和 `it` 函数中输出一些描述性的语言: - -1. `DolphinSpec.a_dolphin_its_click_is_loud` -2. `DolphinSpec.a_dolphin_its_click_has_a_high_frequency` - -显然,这两个测试各自测试的内容都很清晰明了。 - -### 使用 `beforeEach` 和 `afterEach` 共享配置/卸载代码 - -例子群不仅使它包含的例子更清晰易懂,还有助于在群里共享配置和卸载的代码。 - -在下面的这个示例里,例子群中的每一个例子前面,都用 `beforeEach` 这个函数创建一种新类型的海豚以及它特定的叫声。 -这就保证了对每个例子进行了初始化: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { - dolphin = Dolphin() - } - - describe("its click") { - var click: Click! - beforeEach { - click = dolphin.click() - } - - it("is loud") { - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ - dolphin = [Dolphin new]; - }); - - describe(@"its click", ^{ - __block Click *click = nil; - beforeEach(^{ - click = [dolphin click]; - }); - - it(@"is loud", ^{ - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -对于海豚这个例子来说,像这样共享配置代码并不是一个很大的工程。但是对于更复杂的对象,共享代码能够省去大量写代码的时间! - -如果想在每个例子后面执行特定的代码,可以使用 `afterEach`。 - -### 使用 `context` 指定条件的行为 - -海豚使用叫声进行回声定位。当接近了它们感兴趣的东西时,海豚会发出一系列的超声波对其进行更准确的探测。 - -这个测试需要展示在不同环境下,`click` 方法的不同行为。通常,海豚只叫(click)一声。但是当海豚接近它们感兴趣的东西时,它会发出很多次叫声。 - -这种情况可以用 `context` 函数来表示:一个 `context` 代表正常情况,另一个 `context` 代表海豚接近感兴趣的东西: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { dolphin = Dolphin() } - - describe("its click") { - context("when the dolphin is not near anything interesting") { - it("is only emitted once") { - expect(dolphin!.click().count).to(equal(1)) - } - } - - context("when the dolphin is near something interesting") { - beforeEach { - let ship = SunkenShip() - Jamaica.dolphinCove.add(ship) - Jamaica.dolphinCove.add(dolphin) - } - - it("is emitted three times") { - expect(dolphin.click().count).to(equal(3)) - } - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ dolphin = [Dolphin new]; }); - - describe(@"its click", ^{ - context(@"when the dolphin is not near anything interesting", ^{ - it(@"is only emitted once", ^{ - expect(@([[dolphin click] count])).to(equal(@1)); - }); - }); - - context(@"when the dolphin is near something interesting", ^{ - beforeEach(^{ - [[Jamaica dolphinCove] add:[SunkenShip new]]; - [[Jamaica dolphinCove] add:dolphin]; - }); - - it(@"is emitted three times", ^{ - expect(@([[dolphin click] count])).to(equal(@3)); - }); - }); - }); -}); - -QuickSpecEnd -``` - -严格地说,`context` 是 `describe` 的一种同义的表达,但是像这样有目的地使用能够让你的代码更容易理解。 - -### 测试的可读性:Quick 和 XCTest - -在*[编写高效的 XCTest 测试: Arrange,Act 和 Assert](ArrangeActAssert.md)*里,我们知道了对每种情况进行一个测试能够很方便地组织测试代码。 -在 XCTest 里,这样做会导致出现冗长的测试方法名称: - -```swift -func testDolphin_click_whenTheDolphinIsNearSomethingInteresting_isEmittedThreeTimes() { - // ... -} -``` - -使用 Quick ,每种情况会更容易阅读,并且我们能够为每一个例子群进行配置: - -```swift -describe("a dolphin") { - describe("its click") { - context("when the dolphin is near something interesting") { - it("is emitted three times") { - // ... - } - } - } -} -``` - -## 临时禁用例子或例子群 - -你可以临时禁用那些测试不通过的例子和例子群。 -这些例子的名称会随着测试结果一起打印在控制台里,但它们并不运行。 - -通过添加前缀 `x` 就能禁用例子或例子群: - -```swift -// Swift - -xdescribe("its click") { - // ...none of the code in this closure will be run. -} - -xcontext("when the dolphin is not near anything interesting") { - // ...none of the code in this closure will be run. -} - -xit("is only emitted once") { - // ...none of the code in this closure will be run. -} -``` - -```objc -// Objective-C - -xdescribe(@"its click", ^{ - // ...none of the code in this closure will be run. -}); - -xcontext(@"when the dolphin is not near anything interesting", ^{ - // ...none of the code in this closure will be run. -}); - -xit(@"is only emitted once", ^{ - // ...none of the code in this closure will be run. -}); -``` - -## 临时运行一部分例子 - -在某些情况下,只关注一个或几个例子有助于测试。毕竟只运行一两个例子比运行整个测试快多了。通过使用 `fit` 函数,你可以只运行一两个例子。你还可以使用 `fdescribe` 或 `fcontext` 把测试重点放在一个例子群: - -```swift -fit("is loud") { - // ...only this focused example will be run. -} - -it("has a high frequency") { - // ...this example is not focused, and will not be run. -} - -fcontext("when the dolphin is near something interesting") { - // ...examples in this group are also focused, so they'll be run. -} -``` - -```objc -fit(@"is loud", { - // ...only this focused example will be run. -}); - -it(@"has a high frequency", ^{ - // ...this example is not focused, and will not be run. -}); - -fcontext(@"when the dolphin is near something interesting", ^{ - // ...examples in this group are also focused, so they'll be run. -}); -``` - -## 使用 `beforeSuite` 和 `afterSuite` 进行全局配置/卸载 - -有一些测试的配置需要在所有例子运行之前进行。对于这种情况,可以使用 `beforeSuite` 和 `afterSuite` 。 - -下面的示例展示了在所有其他例子运行之前,创建一个包含了海洋中所有生物的数据库。当所有例子运行结束的时候,这个数据库就被卸载: - -```swift -// Swift - -import Quick - -class DolphinSpec: QuickSpec { - override func spec() { - beforeSuite { - OceanDatabase.createDatabase(name: "test.db") - OceanDatabase.connectToDatabase(name: "test.db") - } - - afterSuite { - OceanDatabase.teardownDatabase(name: "test.db") - } - - describe("a dolphin") { - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickSpecBegin(DolphinSpec) - -beforeSuite(^{ - [OceanDatabase createDatabase:@"test.db"]; - [OceanDatabase connectToDatabase:@"test.db"]; -}); - -afterSuite(^{ - [OceanDatabase teardownDatabase:@"test.db"]; -}); - -describe(@"a dolphin", ^{ - // ... -}); - -QuickSpecEnd -``` - -你可以添加多个 `beforeSuite` 和 `afterSuite` 。所有的 -`beforeSuite` 闭包都会在其它测试运行前执行,同样,所有的 -`afterSuite` 闭包都会在其它测试运行结束后执行。 -但是这些闭包并不一定按先后顺序执行。 - -## 访问当前例子的元数据 - -在某些情况下,你会想知道当前运行的例子的名称,或者目前已经运行了多少例子。Quick 提供了闭包 `beforeEach` 和 `afterEach` ,通过这些闭包,可以访问元数据。 - -```swift -beforeEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) is about to be run.") -} - -afterEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) has run.") -} -``` - -```objc -beforeEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l is about to be run.", (long)exampleMetadata.exampleIndex); -}); - -afterEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l has run.", (long)exampleMetadata.exampleIndex); -}); -``` - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickInObjectiveC.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickInObjectiveC.md deleted file mode 100644 index 22318a0..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickInObjectiveC.md +++ /dev/null @@ -1,52 +0,0 @@ -# 在 Objective-C 中使用 Quick - -Quick 既支持 Swift ,也支持 Objective-C 。 - -但是,在 Objective-C 下使用 Quick 时,有以下两点需要注意。 - -## 可选的速记语法 - -在 Objective-C 文件中导入的 Quick 框架,包含了名为 `it` 和 -`itShouldBehaveLike` 的宏,还包含了名为 `context()` 和 `describe()` 的函数。 - -如果你在测试项目的时候,也定义了同名的量或者函数,那么就会出现错误。因此,这种情况下,你可以通过禁用 Quick 的可选速记语法来避免命名冲突: - -```objc -#define QUICK_DISABLE_SHORT_SYNTAX 1 - -@import Quick; - -QuickSpecBegin(DolphinSpec) -// ... -QuickSpecEnd -``` - -注意,必须在 `@import Quick;` 之前,定义宏:`QUICK_DISABLE_SHORT_SYNTAX` 。 - -当然,你也可以选择在测试目标(target)的设置里面定义宏: - -![](http://d.twobitlabs.com/VFEamhvixX.png) - -## 你的测试目标必需至少包含一个 Swift 文件 - -如果你的测试目标没有*至少包含一个 Swift 文件*,那么 Swift 标准库就不会链接到你的测试目标,因而会导致 Quick 无法正常编译。 - -当没有至少包含一个 Swift 文件时,测试运行后就会终止并且返回以下错误: - -``` -*** Test session exited(82) without checking in. Executable cannot be -loaded for some other reason, such as a problem with a library it -depends on or a code signature/entitlements mismatch. -``` - -只需要在测试目标下添加一个空的 Swift 文件,如 `SwiftSpec.swift` 就可以解决这个问题: - -```swift -// SwiftSpec.swift - -import Quick -``` - -> 更多关于这个问题的细节,请参考 https://github.com/Quick/Quick/issues/164 。 - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/README.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/README.md deleted file mode 100644 index 2c48f4c..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# 文档 - -Quick 能够帮助你验证你的 Swift 和 Objective-C 程序的行为。然而,能提高你的测试技巧的不仅仅是了解如何使用 Quick。下面这些指南能够帮助你更有效地写测试 —— 不仅是和 Quick 相关的,更包括 XCTest 还有其他的测试框架。 - -每份指南都有一个主题。如果你对单元测试完全陌生,建议你按照从上往下的顺序阅读。 - -- **[在项目中添加测试](SettingUpYourXcodeProject.md)**:如果你遇到在项目中构建测试的问题,请阅读这份指南。 -- **[编写高效的 XCTest 测试: Arrange,Act 和 Assert](ArrangeActAssert.md)**:阅读这份指南来了解如何更高效快速地编写 `XCTestCase` 测试。 -- **[不要测试代码,而应该测试行为](BehavioralTesting.md)**:通过这份指南你能学习到哪些是好的测试,哪些是不好的测试。 -- **[测试 OS X 和 iOS 应用](TestingApps.md)**:了解如何为使用 AppKit 和 UIKit 框架的代码编写测试。 -- **[使用测试替身进行测试](TestUsingTestDoubles.md)**:阅读这份指南来了解什么是测试替身,以及如何使用它们。 -- **[使用 Shared Assertion 来复用测试模板代码](SharedExamples.md)**:学习如何在测试中共享测试代码。 -- **[配置 Quick 的行为](ConfiguringQuick.md)**:阅读这份指南来了解如何在运行测试代码时改变 Quick 的行为。 -- **[在 Objective-C 中使用 Quick](QuickInObjectiveC.md)**:如果你在 Objective-C 项目使用 Quick 的过程中遇到了困难,请阅读这份指南。 -- **[安装 Quick](InstallingQuick.md)**:通过这份指南了解在项目中添加 Quick 的方法:Git submodules,CocoaPods,Carthage 和 Swift Package Manager 。 -- **[安装 Quick 文件模板](InstallingFileTemplates.md)**:阅读这份指南来了解如何安装文件模板以提高编写 Quick specs 的效率。 -- **[更多资料](MoreResources.md)**:更多关于 OS X 和 iOS 测试的资源。 -- **[常见的问题](Troubleshooting.md)**:当你遇到问题的时候,请阅读这份指南。 diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/SettingUpYourXcodeProject.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/SettingUpYourXcodeProject.md deleted file mode 100644 index e902c6f..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/SettingUpYourXcodeProject.md +++ /dev/null @@ -1,75 +0,0 @@ -# 在项目中添加测试 - -除了命令行项目以外,当你在 Xcode 7 中创建新项目时,单元测试 Target 默认是包含的。[为命令行项目设置测试 Target](#setting-up-a-test-target-for-a-command-line-tool-project) 要编写单元测试,你需要能够在测试 Target 中使用主 target 代码。 - -## 用 Swift 测试 Swift 项目代码 - -为了测试用 Swift 写的代码,你需要做以下两件事: - -1. 将 `.xcodeproj` 中的 "defines module" 设置为 `YES`。 - - * Xcode 中具体操作方法:选中你的项目,选择 "Build Settings" 选项列表,选中 "Defines Modules" 行,修改其值为 "Yes"。 - -2. 在单元测试中添加 `@testable import YourAppModuleName`。这会把所有 `public` 和 `internal` (默认访问修饰符) 修饰符暴露给测试代码。但 `private` 修饰符仍旧保持私有。 - -```swift -// MyAppTests.swift - -import XCTest -@testable import MyModule - -class MyClassTests: XCTestCase { - // ... -} -``` - -> 一些开发者提倡添加 Swift 源文件至测试 target。然而这会导致以下问题 [subtle, hard-to-diagnose errors](https://github.com/Quick/Quick/issues/91),所以并不推荐。 - -## 使用 Swift 测试 Objective-C 项目代码 - -1. 给你的测试 target 添加 bridging header 文件。 -2. 在 bridging header 文件中,引入待测试的代码文件。 - -```objc -// MyAppTests-BridgingHeader.h - -#import "MyClass.h" -``` - -现在就可以在 Swift 测试文件中使用 `MyClass.h` 中的代码了。 - -## 使用 Objective-C 测试 Swift 项目代码 - -1. 使用 `@objc` 桥接需要使用 Objective-C 测试的 Swift 类和方法。 -2. 在单元测试中引入模块的 Swift 头文件。 - -```objc -@import XCTest; -#import "MyModule-Swift.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -## 使用 Objective-C 测试 Objective-C 项目代码 - -在测试 target 中引入待测试的代码文件: - -```objc -// MyAppTests.m - -@import XCTest; -#import "MyClass.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -### 为命令行项目设置测试 Target - -1. 在项目窗格中添加一个项目target。 -2. 选择 "OS X Unit Testing Bundle"。 -3. 编辑主target的 scheme。 -4. 选中 "Test" 条目,单击 "Info" 下的 "+",选择需要测试的 bundle。 diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md deleted file mode 100644 index ec87138..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md +++ /dev/null @@ -1,113 +0,0 @@ -# 使用 Shared Assertion 来复用测试模板代码 - -在某种场合下,一些特定的测试代码可以应用在不同的对象上。 - -比如,假设有一个叫 `Edible` 的协议。当一只海豚吃了标识为 `Edible` 的食物时,它会变得高兴。`Mackerel` 和 `Cod` 都遵循 `Edible` 协议。这个时候,Quick 的 shared example(共享用例)能帮你更容易地测试 `Mackerel` 和 `Cod` 的行为。 - -下面的例子为一些 `Edible` 的食物定义了一组共享用例,以测试 mackerel 和 cod 的行为。 - -```swift -// Swift - -import Quick -import Nimble - -class EdibleSharedExamplesConfiguration: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in - it("makes dolphins happy") { - let dolphin = Dolphin(happy: false) - let edible = sharedExampleContext()["edible"] - dolphin.eat(edible) - expect(dolphin.isHappy).to(beTruthy()) - } - } - } -} - -class MackerelSpec: QuickSpec { - override func spec() { - var mackerel: Mackerel! - beforeEach { - mackerel = Mackerel() - } - - itBehavesLike("something edible") { ["edible": mackerel] } - } -} - -class CodSpec: QuickSpec { - override func spec() { - var cod: Cod! - beforeEach { - cod = Cod() - } - - itBehavesLike("something edible") { ["edible": cod] } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickConfigurationBegin(EdibleSharedExamplesConfiguration) - -+ (void)configure:(Configuration *configuration) { - sharedExamples(@"something edible", ^(QCKDSLSharedExampleContext exampleContext) { - it(@"makes dolphins happy") { - Dolphin *dolphin = [[Dolphin alloc] init]; - dolphin.happy = NO; - id edible = exampleContext()[@"edible"]; - [dolphin eat:edible]; - expect(dolphin.isHappy).to(beTruthy()) - } - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(MackerelSpec) - -__block Mackerel *mackerel = nil; -beforeEach(^{ - mackerel = [[Mackerel alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": mackerel }; }); - -QuickSpecEnd - -QuickSpecBegin(CodSpec) - -__block Mackerel *cod = nil; -beforeEach(^{ - cod = [[Cod alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": cod }; }); - -QuickSpecEnd -``` - -共享用例可以包括任意数量的 `it`, `context` 和 `describe` 代码块。当使用它们来测试不同对象的相同行为时,你可以少写*很多*不必要的重复代码。 - -一般来说,你使用共享用例进行测试时不需要依赖其他额外的对象。在 Swift 中,你可以简单地用一个不带参数的 `sharedExample` 闭包来使用共享用例。当你需要进行全局测试时,这很有用。 - -```swift -// Swift - -import Quick - -sharedExamples("everything under the sea") { - // ... -} - -itBehavesLike("everything under the sea") -``` -> 如果你使用 Objective-C 的话,你需要传入一个带 `QCKDSLSharedExampleContext` 参数的 block,即使你并不打算使用它。不好意思,你只能这样做,人生有时就是这么的无奈。:cookie: :bomb: - -你也可以使用 `fitBehavesLike` 函数来单独测试共享用例。 diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/TestUsingTestDoubles.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/TestUsingTestDoubles.md deleted file mode 100644 index 9e83ead..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/TestUsingTestDoubles.md +++ /dev/null @@ -1,131 +0,0 @@ -# 使用模拟对象进行测试 - -## 测试替身 - -下面的问题在写测试时经常出现。比如:`Car` 依赖于/使用 `Tire` 。 - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesA.png) - -`CarTests` 用来测试调用了 `Tire` 的 `Car` 。这时候,在 `Tire` 里出现的 bug 会导致 `CarTests` 测试失败(即使 `Car` 是没有错误的)。 - -这时候很难说清楚到底是什么出错了。为了避免这个问题,我们可以使用一个替身对象,来代替 `CarTests` 里面的 `Tire` 。对于这个问题,我们会为 `Tire` 创建一个替身对象,命名为 `PerfectTire` 。 - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesAmock.png) - -`PerfectTire` 具有和 `Tire` 一样的函数和属性。但是,这些函数和属性的实现可能会有所不同。 - -像 `PerfectTire` 这样的对象叫做“测试替身”。测试替身充当替身对象,用于独立测试多个相关对象的功能。以下是测试替身的几种类型: - -- 模拟对象:用于从测试类中接收输出。 -- 桩对象:用于为测试类提供输入。 -- 伪对象:具有与原来的类相似的行为。 - -我们先了解一下如何使用模拟对象。 - -## 模拟对象 - -模拟对象着眼于说明它与其它对象的正确交互,并且当出现错误时用来检测问题。模拟对象应该事先知道测试时会发生什么,并且该做出怎样的反应。 - -### 在 Swift 中使用模拟对象来写测试 - -#### 应用案例 - -例如,我们有一个应用,它会从互联网上获取数据。 - -* 在 `ViewController` 中展示从互联网上获取的数据。 -* 自定义类,实现 `DataProviderProtocol` ,负责获取数据。 - -`DataProviderProtocol` 如下定义: - -```swift -protocol DataProviderProtocol: class { - func fetch(callback: (data: String) -> Void) -} -``` - -`fetch()` 从互联网上获取数据,并通过闭包 `callback` 返回数据。 - -下面的 `DataProvider` 实现了 `DataProviderProtocol` 协议。 - -```swift -class DataProvider: NSObject, DataProviderProtocol { - func fetch(callback: (data: String) -> Void) { - let url = NSURL(string: "http://example.com/")! - let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) - let task = session.dataTaskWithURL(url, completionHandler: { - (data, resp, err) in - let string = NSString(data:data!, encoding:NSUTF8StringEncoding) as! String - callback(data: string) - }) - task.resume() - } -} -``` - -在我们这个场景里,`ViewController` 的 `viewDidLoad()` 里调用了 `fetch()` 。 - -```swift -class ViewController: UIViewController { - - // MARK: Properties - @IBOutlet weak var resultLabel: UILabel! - private var dataProvider: DataProviderProtocol? - - // MARK: View Controller Lifecycle - override func viewDidLoad() { - super.viewDidLoad() - - dataProvider = dataProvider ?? DataProvider() - - dataProvider?.fetch({ [unowned self] (data) -> Void in - self.resultLabel.text = data - }) - } -} -``` - -#### 用 `DataProviderProtocol` 协议的模拟对象进行测试 - -`ViewController` 依赖于 `DataProviderProtocol` 协议。为了测试这个 viewController ,要创建一个遵循 `DataProviderProtocol` 的模拟对象。 - -模拟对象是非常有用的。因为使用它,你可以: - -- 更快地运行测试。 -- 即使未联网也可以进行测试。 -- 对 `ViewController` 进行独立测试。 - -```swift -class MockDataProvider: NSObject, DataProviderProtocol { - var fetchCalled = false - func fetch(callback: (data: String) -> Void) { - fetchCalled = true - callback(data: "foobar") - } -} -``` - -当 `fetch()` 被调用的时候,`fetchCalled` 会被设为 `true` 。这样能使测试代码确认对象是否准备好进行测试。 - -下面的代码验证了当 `ViewController` 加载时,会运行 `dataProvider.fetch()` 。 - -```swift -override func spec() { - describe("view controller") { - it("fetch data with data provider") { - let mockProvier = MockDataProvider() - let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as! ViewController - viewController.dataProvier = mockProvier - - expect(mockProvier.fetchCalled).to(equal(false)) - - let _ = viewController.view - - expect(mockProvier.fetchCalled).to(equal(true)) - } - } -} -``` - -如果你对写测试感兴趣,想学习更多的内容,请参考 https://realm.io/news/testing-in-swift/ 。 - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/TestingApps.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/TestingApps.md deleted file mode 100644 index 59f68d8..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/TestingApps.md +++ /dev/null @@ -1,174 +0,0 @@ -# 测试 OS X 和 iOS 应用 - -*[在项目中添加测试](SettingUpYourXcodeProject.md)* 这篇文章详细介绍了有关如何测试 Objective-C 和 Swift 的函数和类的内容。 -本文将介绍一些额外的技巧,用来测试**类**,如 `UIViewController` 及其子类。 - -> 你可以参考这个简短的 [Lightning Talk](https://vimeo.com/115671189#t=37m50s)(从37分50秒开始),它涵盖了绝大多数这方面的话题。 - -## 触发 `UIViewController` 生命周期事件 - -通常,当你的视图控制器(view controller)呈现在应用中,UIKit 会自动触发生命周期事件。然而,在测试 `UIViewController` 的时候,你需要自己手动触发这些事件。你可以通过以下任意一种方法来实现它: - -1. 通过访问 `UIViewController.view` 来触发事件,如: `UIViewController.viewDidLoad()` 。 -2. 使用 `UIViewController.beginAppearanceTransition()` 来触发大多数生命周期事件。 -3. 直接调用方法,如:`UIViewController.viewDidLoad()` 或 `UIViewController.viewWillAppear()` 。 - -```swift -// Swift - -import Quick -import Nimble -import BananaApp - -class BananaViewControllerSpec: QuickSpec { - override func spec() { - var viewController: BananaViewController! - beforeEach { - viewController = BananaViewController() - } - - describe(".viewDidLoad()") { - beforeEach { - // Method #1: Access the view to trigger BananaViewController.viewDidLoad(). - let _ = viewController.view - } - - it("sets the banana count label to zero") { - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal("0")) - } - } - - describe("the view") { - beforeEach { - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - viewController.beginAppearanceTransition(true, animated: false) - viewController.endAppearanceTransition() - } - // ... - } - - describe(".viewWillDisappear()") { - beforeEach { - // Method #3: Directly call the lifecycle event. - viewController.viewWillDisappear(false) - } - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; -#import "BananaViewController.h" - -QuickSpecBegin(BananaViewControllerSpec) - -__block BananaViewController *viewController = nil; -beforeEach(^{ - viewController = [[BananaViewController alloc] init]; -}); - -describe(@"-viewDidLoad", ^{ - beforeEach(^{ - // Method #1: Access the view to trigger -[BananaViewController viewDidLoad]. - [viewController view]; - }); - - it(@"sets the banana count label to zero", ^{ - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal(@"0")) - }); -}); - -describe(@"the view", ^{ - beforeEach(^{ - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - [viewController beginAppearanceTransition:YES animated:NO]; - [viewController endAppearanceTransition]; - }); - // ... -}); - -describe(@"-viewWillDisappear", ^{ - beforeEach(^{ - // Method #3: Directly call the lifecycle event. - [viewController viewWillDisappear:NO]; - }); - // ... -}); - -QuickSpecEnd -``` - -## 初始化在故事板(Storyboard)中定义的视图控制器 - -为了初始化在故事板中定义的视图控制器,你需要先为它分配一个 **Storyboard ID** : - -![](http://f.cl.ly/items/2X2G381K1h1l2B2Q0g3L/Screen%20Shot%202015-02-27%20at%2011.58.06%20AM.png) - -为视图控制器分配 ID 后,就可以在测试中初始化了: - -```swift -// Swift - -var viewController: BananaViewController! -beforeEach { - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - let storyboard = UIStoryboard(name: "Main", bundle: nil) - // 2. Use the storyboard to instantiate the view controller. - viewController = - storyboard.instantiateViewControllerWithIdentifier( - "BananaViewControllerID") as! BananaViewController -} -``` - -```objc -// Objective-C - -__block BananaViewController *viewController = nil; -beforeEach(^{ - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; - // 2. Use the storyboard to instantiate the view controller. - viewController = [storyboard instantiateViewControllerWithIdentifier:@"BananaViewControllerID"]; -}); -``` - -## 触发 UIControl 事件(如:点击按钮) - -按钮以及其他继承自 `UIControl` 的 UIKit 类定义了一些方法,使我们能够通过程序代码发送控制事件,如:点击按钮。 -以下代码演示了如何测试点击按钮触发的行为: - -```swift -// Swift - -describe("the 'more bananas' button") { - it("increments the banana count label when tapped") { - viewController.moreButton.sendActionsForControlEvents( - UIControlEvents.TouchUpInside) - expect(viewController.bananaCountLabel.text).to(equal("1")) - } -} -``` - -```objc -// Objective-C - -describe(@"the 'more bananas' button", ^{ - it(@"increments the banana count label when tapped", ^{ - [viewController.moreButton sendActionsForControlEvents:UIControlEventTouchUpInside]; - expect(viewController.bananaCountLabel.text).to(equal(@"1")); - }); -}); -``` - - diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/Troubleshooting.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/Troubleshooting.md deleted file mode 100644 index c89e25e..0000000 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/Troubleshooting.md +++ /dev/null @@ -1,10 +0,0 @@ -# 常见的安装问题 - -这里有一些解决方案,用来处理使用框架时遇到的一些问题。 - -## No such module 'Quick' - -- 如果你已经运行了 `pod install` ,那么关闭并重新打开 Xcode workspace 。如果这样做还没解决问题,那么请接着进行下面的步骤。 -- 删除 `~/Library/Developer/Xcode/DerivedData` **整个**目录,这里面包含了 `ModuleCache` 。 -- 在 Manage Schemes 对话框中,勾选 `Quick` 、`Nimble` 、`Pods-ProjectnameTests` ,然后重新编译它们(`Cmd+B`)。 - diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.github/ISSUE_TEMPLATE b/Carthage/Checkouts/Quick/Externals/Nimble/.github/ISSUE_TEMPLATE deleted file mode 100644 index 85e591e..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.github/ISSUE_TEMPLATE +++ /dev/null @@ -1,36 +0,0 @@ -- [ ] I have read [CONTRIBUTING](https://github.com/Quick/Nimble/blob/master/CONTRIBUTING.md) and have done my best to follow them. - -### What did you do? - -Please replace this with what you did. - -### What did you expect to happen? - -Please replace this with what you expected to happen. - -### What actually happened instead? - -Please replace this with what happened instead. - -### Environment - -List the software versions you're using: - - - Quick: *?.?.?* - - Nimble: *?.?.?* - - Xcode Version: *?.? (????)* (Open Xcode; In menubar: Xcode > About Xcode) - - Swift Version: *?.?* (Open Xcode Preferences; Components > Toolchains. If none, use `Xcode Default`.) - -Please also mention which package manager you used and its version. Delete the -other package managers in this list: - - - Cocoapods: *?.?.?* (Use `pod --version` in Terminal) - - Carthage: *?.?* (Use `carthage version` in Terminal) - - Swift Package Manager *?.?.? (swiftpm-???)* (Use `swift build --version` in Terminal) - -### Project that demonstrates the issue - -Please link to a project we can download that reproduces the issue. Feel free -to delete this section if it's not relevant to the issue (eg - feature request). - -The project should be [short, self-contained, and correct example](http://sscce.org/). diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.github/PULL_REQUEST_TEMPLATE b/Carthage/Checkouts/Quick/Externals/Nimble/.github/PULL_REQUEST_TEMPLATE deleted file mode 100644 index 20e40c8..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.github/PULL_REQUEST_TEMPLATE +++ /dev/null @@ -1,14 +0,0 @@ -The PR should summarize what was changed and why. Here are some questions to -help you if you're not sure: - - - What behavior was changed? - - What code was refactored / updated to support this change? - - What issues are related to this PR? Or why was this change introduced? - -Checklist - While not every PR needs it, new features should consider this list: - - - [ ] Does this have tests? - - [ ] Does this have documentation? - - [ ] Does this break the public API (Requires major version bump)? - - [ ] Is this a new feature (Requires minor version bump)? - diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.gitignore b/Carthage/Checkouts/Quick/Externals/Nimble/.gitignore deleted file mode 100644 index e50906d..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -.DS_Store -**/xcuserdata/* -**/*.xccheckout -**/*.xcscmblueprint -build/ -.idea -DerivedData/ -Nimble.framework.zip - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -.build/ diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.hound.yml b/Carthage/Checkouts/Quick/Externals/Nimble/.hound.yml deleted file mode 100644 index b867fd9..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.hound.yml +++ /dev/null @@ -1,2 +0,0 @@ -swift: - config_file: .swiftlint.yml diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version b/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version deleted file mode 100644 index 9f55b2c..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version +++ /dev/null @@ -1 +0,0 @@ -3.0 diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.swiftlint.yml b/Carthage/Checkouts/Quick/Externals/Nimble/.swiftlint.yml deleted file mode 100644 index 489f196..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.swiftlint.yml +++ /dev/null @@ -1,19 +0,0 @@ -disabled_rules: - - todo - - variable_name - - force_try - - force_cast - -included: - - Sources - - Tests - -excluded: - - Sources/Lib - -trailing_comma: - mandatory_comma: true - -line_length: - ignores_comments: true - ignores_function_declarations: true diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml b/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml deleted file mode 100644 index 0b64ea7..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -osx_image: xcode8.3 -language: generic -matrix: - include: - - os: osx - sudo: required - env: TYPE=podspec - - os: osx - env: TYPE=ios NIMBLE_RUNTIME_IOS_SDK_VERSION=10.0 - - os: osx - env: TYPE=tvos NIMBLE_RUNTIME_TVOS_SDK_VERSION=10.0 - - os: osx - env: TYPE=macos - - os: osx - env: TYPE=macos - osx_image: xcode9 - - os: osx - env: TYPE=swiftpm - - os: osx - env: TYPE=swiftpm - osx_image: xcode9 - - os: linux - dist: trusty - sudo: required - env: TYPE=swiftpm - install: - - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/9f442512a46d7a2af7b850d65a7e9bd31edfb09b/swiftenv-install.sh)" -install: - - if [[ "$TYPE" == "podspec" ]]; then sudo gem install bundler; bundle install; fi -script: - - ./test $TYPE diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/CONTRIBUTING.md b/Carthage/Checkouts/Quick/Externals/Nimble/CONTRIBUTING.md deleted file mode 100644 index d9c4ba6..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/CONTRIBUTING.md +++ /dev/null @@ -1,120 +0,0 @@ - - - -- [Welcome to Nimble!](#welcome-to-nimble!) - - [Reporting Bugs](#reporting-bugs) - - [Building the Project](#building-the-project) - - [Pull Requests](#pull-requests) - - [Style Conventions](#style-conventions) - - [Core Members](#core-members) - - [Code of Conduct](#code-of-conduct) - - - -# Welcome to Nimble! - -We're building a testing framework for a new generation of Swift and -Objective-C developers. - -Nimble should be easy to use and easy to maintain. Let's keep things -simple and well-tested. - -**tl;dr:** If you've added a file to the project, make sure it's -included in both the OS X and iOS targets. - -## Reporting Bugs - -Nothing is off-limits. If you're having a problem, we want to hear about -it. - -- See a crash? File an issue. -- Code isn't compiling, but you don't know why? Sounds like you should - submit a new issue, bud. -- Went to the kitchen, only to forget why you went in the first place? - Better submit an issue. - -Be sure to include in your issue: - -- Your Xcode version (eg - Xcode 7.0.1 7A1001) -- Your version of Nimble (eg - v2.0.0 or git sha `20a3f3b4e63cc8d97c92c4164bf36f2a2c9a6e1b`) -- What are the steps to reproduce this issue? -- What platform are you using? (eg - OS X, iOS, watchOS, tvOS) -- If the problem is on a UI Testing Bundle, Unit Testing Bundle, or some other target configuration -- Are you using carthage or cocoapods? - -## Building the Project - -- Use `Nimble.xcodeproj` to work on Nimble. - -## Running the Swift Package Manager tests - -1. Install `swiftenv` by running a line from the build script (`.travis.yml`): - - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/02090c7ede5a637b76e6df1710e83cd0bbe7dcdf/swiftenv-install.sh)" - -2. Run `./test swiftpm` - -## Pull Requests - -- Nothing is trivial. Submit pull requests for anything: typos, - whitespace, you name it. -- Not all pull requests will be merged, but all will be acknowledged. If - no one has provided feedback on your request, ping one of the owners - by name. -- Make sure your pull request includes any necessary updates to the - README or other documentation. -- Be sure the unit tests for both the OS X and iOS targets of Nimble - before submitting your pull request. You can run all the OS X & iOS unit - tests using `./test`. -- If you've added a file to the project, make sure it's included in both - the OS X and iOS targets. -- The `master` branch will always support the stable Xcode version. Other - branches will point to their corresponding versions they support. -- If you're making a configuration change, make sure to edit both the xcode - project and the podspec file. - -### Style Conventions - -- Indent using 4 spaces. -- Keep lines 100 characters or shorter. Break long statements into - shorter ones over multiple lines. -- In Objective-C, use `#pragma mark -` to mark public, internal, - protocol, and superclass methods. - -## Core Members - -If a few of your pull requests have been merged, and you'd like a -controlling stake in the project, file an issue asking for write access -to the repository. - -### Code of Conduct - -Your conduct as a core member is your own responsibility, but here are -some "ground rules": - -- Feel free to push whatever you want to master, and (if you have - ownership permissions) to create any repositories you'd like. - - Ideally, however, all changes should be submitted as GitHub pull - requests. No one should merge their own pull request, unless no - other core members respond for at least a few days. - - If you'd like to create a new repository, it'd be nice if you created - a GitHub issue and gathered some feedback first. - -- It'd be awesome if you could review, provide feedback on, and close - issues or pull requests submitted to the project. Please provide kind, - constructive feedback. Please don't be sarcastic or snarky. - -### Creating a Release - -The process is relatively straight forward, but here's is a useful checklist for tagging: - -- Look at changes from the previously tagged release and write release notes: `git log v0.4.0...HEAD` -- Run the release script: `./script/release A.B.C release-notes-file` -- The script will prompt you to create a new [GitHub release](https://github.com/Quick/Nimble/releases). - - Use the same release notes you created for the tag, but tweak up formatting for GitHub. -- Update [Quick](https://github.com/Quick/Quick) - - Update Quick's submodule reference to the newly released Nimble version - - Update Nimble version in `README.md` and Documentation in [Quick](https://github.com/Quick/Quick) if it's not a patch version update. -- Announce! diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Dockerfile.test b/Carthage/Checkouts/Quick/Externals/Nimble/Dockerfile.test deleted file mode 100644 index a995ae2..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Dockerfile.test +++ /dev/null @@ -1,3 +0,0 @@ -FROM swift:latest -COPY . . -CMD ./test swiftpm diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile b/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile deleted file mode 100644 index 0211a92..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -# A sample Gemfile -source "https://rubygems.org" - -gem 'cocoapods', '1.2.0' diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock b/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock deleted file mode 100644 index edde6bb..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock +++ /dev/null @@ -1,73 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (2.3.5) - activesupport (4.2.8) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - claide (1.0.1) - cocoapods (1.2.0) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.1, < 2.0) - cocoapods-core (= 1.2.0) - cocoapods-deintegrate (>= 1.0.1, < 2.0) - cocoapods-downloader (>= 1.1.3, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.1.2, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored (~> 1.2) - escape (~> 0.0.4) - fourflusher (~> 2.0.1) - gh_inspector (~> 1.0) - molinillo (~> 0.5.5) - nap (~> 1.0) - ruby-macho (~> 0.2.5) - xcodeproj (>= 1.4.1, < 2.0) - cocoapods-core (1.2.0) - activesupport (>= 4.0.2, < 5) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.1) - cocoapods-downloader (1.1.3) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.0.0) - cocoapods-trunk (1.1.2) - nap (>= 0.8, < 2.0) - netrc (= 0.7.8) - cocoapods-try (1.1.0) - colored (1.2) - escape (0.0.4) - fourflusher (2.0.1) - fuzzy_match (2.0.4) - gh_inspector (1.0.3) - i18n (0.8.1) - minitest (5.10.1) - molinillo (0.5.6) - nanaimo (0.2.3) - nap (1.1.0) - netrc (0.7.8) - ruby-macho (0.2.6) - thread_safe (0.3.6) - tzinfo (1.2.2) - thread_safe (~> 0.1) - xcodeproj (1.4.2) - CFPropertyList (~> 2.3.3) - activesupport (>= 3) - claide (>= 1.0.1, < 2.0) - colored (~> 1.2) - nanaimo (~> 0.2.3) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods (= 1.2.0) - -BUNDLED WITH - 1.14.5 diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/LICENSE b/Carthage/Checkouts/Quick/Externals/Nimble/LICENSE deleted file mode 100644 index 82b84bf..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 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. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec deleted file mode 100644 index 5e0bab8..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec +++ /dev/null @@ -1,50 +0,0 @@ -Pod::Spec.new do |s| - s.name = "Nimble" - s.version = "7.0.1" - s.summary = "A Matcher Framework for Swift and Objective-C" - s.description = <<-DESC - Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by Cedar. - DESC - s.homepage = "https://github.com/Quick/Nimble" - s.license = { :type => "Apache 2.0", :file => "LICENSE" } - s.author = "Quick Contributors" - s.ios.deployment_target = "8.0" - s.osx.deployment_target = "10.10" - s.tvos.deployment_target = "9.0" - s.source = { :git => "https://github.com/Quick/Nimble.git", - :tag => "v#{s.version}" } - - s.source_files = "Sources/**/*.{swift,h,m,c}" - - s.osx.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPosix.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h", - ] - s.ios.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h", - ] - s.tvos.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift", - "Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift", - "Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m", - "Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h", - ] - - s.private_header_files = "Sources/NimbleObjectiveC/CurrentTestCaseTracker.h" - - s.exclude_files = "Sources/Nimble/Adapters/NonObjectiveC/*.swift" - s.weak_framework = "XCTest" - s.requires_arc = true - s.compiler_flags = '-DPRODUCT_NAME=Nimble/Nimble' - s.pod_target_xcconfig = { - 'ENABLE_BITCODE' => 'NO', - 'OTHER_LDFLAGS' => '-weak-lswiftXCTest', - 'OTHER_SWIFT_FLAGS' => '$(inherited) -suppress-warnings', - 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks"', - } -end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj deleted file mode 100644 index dd11b16..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2305 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXAggregateTarget section */ - A8F2B2541E79A4AB005BDD17 /* SwiftLint */ = { - isa = PBXAggregateTarget; - buildConfigurationList = A8F2B2571E79A4AC005BDD17 /* Build configuration list for PBXAggregateTarget "SwiftLint" */; - buildPhases = ( - A8F2B2581E79A4B0005BDD17 /* ShellScript */, - ); - dependencies = ( - ); - name = SwiftLint; - productName = SwiftLint; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 1F0648CC19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F0648CD19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F0648D41963AAB2001F9C46 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F0648D51963AAB2001F9C46 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F12BE941E778F70006952EC /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */; }; - 1F12BE951E778F70006952EC /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BE981E778F70006952EC /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8B1E778F70006952EC /* CwlBadInstructionException.swift */; }; - 1F12BE991E778F70006952EC /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8C1E778F70006952EC /* CwlCatchBadInstruction.swift */; }; - 1F12BE9B1E778F70006952EC /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8E1E778F70006952EC /* CwlDarwinDefinitions.swift */; }; - 1F12BE9D1E778F70006952EC /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE911E778F70006952EC /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BE9F1E778F8F006952EC /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */; }; - 1F12BEA01E778F90006952EC /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */; }; - 1F12BEA11E778FA9006952EC /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEA21E778FBA006952EC /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE881E778F70006952EC /* mach_excServer.c */; }; - 1F12BEA31E778FFA006952EC /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE911E778F70006952EC /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEA41E77900A006952EC /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8B1E778F70006952EC /* CwlBadInstructionException.swift */; }; - 1F12BEA51E77900A006952EC /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8C1E778F70006952EC /* CwlCatchBadInstruction.swift */; }; - 1F12BEA61E779012006952EC /* CwlCatchBadInstructionPOSIX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8D1E778F70006952EC /* CwlCatchBadInstructionPOSIX.swift */; }; - 1F12BEA71E779018006952EC /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE8E1E778F70006952EC /* CwlDarwinDefinitions.swift */; }; - 1F12BEA81E77902A006952EC /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE931E778F70006952EC /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEDC1E7791B9006952EC /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BED71E7791B9006952EC /* CwlCatchException.swift */; }; - 1F12BEDD1E7791B9006952EC /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BED71E7791B9006952EC /* CwlCatchException.swift */; }; - 1F12BEDF1E7791B9006952EC /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BED91E7791B9006952EC /* CwlCatchException.m */; }; - 1F12BEE01E7791B9006952EC /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BED91E7791B9006952EC /* CwlCatchException.m */; }; - 1F12BEE21E7791B9006952EC /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BEDB1E7791B9006952EC /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEE31E7791B9006952EC /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BEDB1E7791B9006952EC /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F12BEE91E779784006952EC /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F12BE881E778F70006952EC /* mach_excServer.c */; }; - 1F12BEEA1E77ABE3006952EC /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */; }; - 1F14FB64194180C5009F2A08 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F1871C51CA89EDB00A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871C61CA89EDB00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871C71CA89EDB00A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871C81CA89EDB00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871C91CA89EDB00A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871CA1CA89EDB00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871CB1CA89EDB00A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871CC1CA89EDB00A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871D21CA89EEE00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871D31CA89EEE00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871D41CA89EEE00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871D61CA89EEF00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871D71CA89EEF00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871D81CA89EEF00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871D91CA89EF100A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871DA1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871DB1CA89EF100A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871DC1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871DD1CA89EF500A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871DE1CA89EF500A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871DF1CA89EF500A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E01CA89EF600A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E11CA89EF600A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E21CA89EF600A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E41CA89FB600A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E61CA89FCD00A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1871E71CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E81CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E91CA8A18700A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1871EB1CA8A18800A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1A742F1940169200FFFC47 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1A74351940169200FFFC47 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F1A74291940169200FFFC47 /* Nimble.framework */; }; - 1F1B5AD41963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F299EAC19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F43728C1A1B343C00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F43728E1A1B343F00EB80F8 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F43728F1A1B344000EB80F8 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F4999A61DBF2DD100BF8877 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F4A56661A3B305F009E1637 /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - 1F4A56671A3B305F009E1637 /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - 1F4A566A1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - 1F4A566B1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - 1F4A566D1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - 1F4A566E1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - 1F4A56701A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - 1F4A56711A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - 1F4A56731A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - 1F4A56741A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - 1F4A56761A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - 1F4A56771A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - 1F4A56791A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - 1F4A567A1A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - 1F4A567C1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - 1F4A567D1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - 1F4A567F1A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - 1F4A56801A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - 1F4A56821A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - 1F4A56831A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - 1F4A56851A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - 1F4A56861A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - 1F4A56881A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - 1F4A56891A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - 1F4A568B1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - 1F4A568C1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - 1F4A568E1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - 1F4A568F1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - 1F4A56911A3B344A009E1637 /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - 1F4A56921A3B344A009E1637 /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - 1F4A56941A3B346F009E1637 /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - 1F4A56951A3B346F009E1637 /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - 1F4A56971A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - 1F4A56981A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - 1F4A569A1A3B3539009E1637 /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - 1F4A569B1A3B3539009E1637 /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - 1F4A569D1A3B3565009E1637 /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - 1F4A569E1A3B3565009E1637 /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - 1F4A56A01A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - 1F4A56A11A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - 1F4BB8B61DACA0E30048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8B71DACA0E40048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8B81DACAACF0048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F5DF15F1BDCA0CE00C3A531 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */; }; - 1F5DF16C1BDCA0F500C3A531 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1F5DF16D1BDCA0F500C3A531 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1F5DF16E1BDCA0F500C3A531 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1F5DF16F1BDCA0F500C3A531 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1F5DF1701BDCA0F500C3A531 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1F5DF1711BDCA0F500C3A531 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - 1F5DF1721BDCA0F500C3A531 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1F5DF1741BDCA0F500C3A531 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1F5DF1751BDCA0F500C3A531 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1F5DF1761BDCA0F500C3A531 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - 1F5DF1771BDCA0F500C3A531 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1F5DF1781BDCA0F500C3A531 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1F5DF1791BDCA0F500C3A531 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1F5DF17A1BDCA0F500C3A531 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1F5DF17B1BDCA0F500C3A531 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1F5DF17C1BDCA0F500C3A531 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1F5DF17D1BDCA0F500C3A531 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1F5DF17E1BDCA0F500C3A531 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1F5DF17F1BDCA0F500C3A531 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1F5DF1801BDCA0F500C3A531 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1F5DF1811BDCA0F500C3A531 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1F5DF1821BDCA0F500C3A531 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1F5DF1831BDCA0F500C3A531 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1F5DF1841BDCA0F500C3A531 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1F5DF1851BDCA0F500C3A531 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1F5DF1861BDCA0F500C3A531 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - 1F5DF1891BDCA0F500C3A531 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F5DF18C1BDCA0F500C3A531 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F5DF18E1BDCA0F500C3A531 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F5DF1921BDCA10200C3A531 /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F5DF1931BDCA10200C3A531 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F5DF1941BDCA10200C3A531 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - 1F5DF1951BDCA10200C3A531 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F5DF1961BDCA10200C3A531 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F5DF1971BDCA10200C3A531 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - 1F5DF1981BDCA10200C3A531 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F5DF1991BDCA10200C3A531 /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F5DF19A1BDCA10200C3A531 /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F5DF19B1BDCA10200C3A531 /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F5DF19C1BDCA10200C3A531 /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F5DF19D1BDCA10200C3A531 /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F5DF19E1BDCA10200C3A531 /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F5DF19F1BDCA10200C3A531 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - 1F5DF1A01BDCA10200C3A531 /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1F5DF1A11BDCA10200C3A531 /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F5DF1A21BDCA10200C3A531 /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F5DF1A31BDCA10200C3A531 /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F5DF1A41BDCA10200C3A531 /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F5DF1A51BDCA10200C3A531 /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F5DF1A61BDCA10200C3A531 /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F5DF1A71BDCA10200C3A531 /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F5DF1A81BDCA10200C3A531 /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 1F5DF1A91BDCA10200C3A531 /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - 1F5DF1AA1BDCA10200C3A531 /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F5DF1AB1BDCA10200C3A531 /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 1F8A37B01B7C5042001C8357 /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - 1F8A37B11B7C5042001C8357 /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - 1F91DD2D1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD2E1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD2F1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD311C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F91DD321C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F91DD331C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F925EB8195C0D6300ED456B /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F925EAD195C0D6300ED456B /* Nimble.framework */; }; - 1F925EC7195C0DD100ED456B /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F925EE2195C0DFD00ED456B /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F925EE6195C121200ED456B /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F925EE7195C121200ED456B /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F925EE9195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F925EEA195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F925EEC195C12C800ED456B /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F925EED195C12C800ED456B /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F925EEF195C136500ED456B /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F925EF0195C136500ED456B /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F925EF6195C147800ED456B /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F925EF7195C147800ED456B /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F925EF9195C175000ED456B /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F925EFA195C175000ED456B /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F925EFC195C186800ED456B /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F925EFD195C186800ED456B /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F925EFF195C187600ED456B /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F925F00195C187600ED456B /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F925F02195C189500ED456B /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F925F03195C189500ED456B /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F925F05195C18B700ED456B /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F925F06195C18B700ED456B /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F925F08195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F925F09195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F925F0B195C18E100ED456B /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F925F0C195C18E100ED456B /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F925F0E195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F925F0F195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F925F11195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F925F12195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F9DB8FB1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - 1F9DB8FC1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - 1FA0C3FF1E30B14500623165 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA0C3FE1E30B14500623165 /* Predicate.swift */; }; - 1FA0C4001E30B14500623165 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA0C3FE1E30B14500623165 /* Predicate.swift */; }; - 1FA0C4011E30B14500623165 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA0C3FE1E30B14500623165 /* Predicate.swift */; }; - 1FB90098195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1FB90099195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1FC494AA1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FC494AB1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FC494AC1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FCF914F1C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91501C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91511C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FCF91551C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1FD8CD2F1968AB07008ED995 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1FD8CD301968AB07008ED995 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1FD8CD311968AB07008ED995 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1FD8CD321968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1FD8CD331968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1FD8CD341968AB07008ED995 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1FD8CD351968AB07008ED995 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1FD8CD361968AB07008ED995 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1FD8CD371968AB07008ED995 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1FD8CD381968AB07008ED995 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1FD8CD391968AB07008ED995 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1FD8CD3A1968AB07008ED995 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1FD8CD3B1968AB07008ED995 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1FD8CD3C1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1FD8CD3D1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1FD8CD3E1968AB07008ED995 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1FD8CD3F1968AB07008ED995 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1FD8CD401968AB07008ED995 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1FD8CD411968AB07008ED995 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1FD8CD421968AB07008ED995 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1FD8CD431968AB07008ED995 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1FD8CD441968AB07008ED995 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1FD8CD451968AB07008ED995 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1FD8CD461968AB07008ED995 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1FD8CD471968AB07008ED995 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1FD8CD481968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1FD8CD491968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1FD8CD4A1968AB07008ED995 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1FD8CD4B1968AB07008ED995 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1FD8CD4C1968AB07008ED995 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1FD8CD4D1968AB07008ED995 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1FD8CD4E1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1FD8CD4F1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1FD8CD501968AB07008ED995 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1FD8CD511968AB07008ED995 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1FD8CD521968AB07008ED995 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1FD8CD531968AB07008ED995 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1FD8CD561968AB07008ED995 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1FD8CD571968AB07008ED995 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1FD8CD581968AB07008ED995 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1FD8CD591968AB07008ED995 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1FD8CD5A1968AB07008ED995 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1FD8CD5B1968AB07008ED995 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1FD8CD5E1968AB07008ED995 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1FD8CD5F1968AB07008ED995 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1FD8CD6A1968AB07008ED995 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1FD8CD6B1968AB07008ED995 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1FDBD8671AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1FDBD8681AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1FE661571E6574E30035F243 /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE661561E6574E20035F243 /* ExpectationMessage.swift */; }; - 1FE661581E6574E30035F243 /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE661561E6574E20035F243 /* ExpectationMessage.swift */; }; - 1FE661591E6574E30035F243 /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE661561E6574E20035F243 /* ExpectationMessage.swift */; }; - 29EA59631B551ED2002D767E /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 29EA59641B551ED2002D767E /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 472FD1351B9E085700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 472FD1391B9E0A9700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 472FD13A1B9E0A9F00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 472FD13B1B9E0CFE00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 4793854D1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - 4793854E1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - 6CAEDD0A1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 6CAEDD0B1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 6CAEDD0C1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 7A0A26231E7F52360092A34E /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0A26221E7F52360092A34E /* ToSucceed.swift */; }; - 7A6AB2C21E7F547E00A2F694 /* ToSucceedTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */; }; - 7A6AB2C31E7F547E00A2F694 /* ToSucceedTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */; }; - 7A6AB2C41E7F547E00A2F694 /* ToSucceedTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */; }; - 7A6AB2C51E7F628900A2F694 /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0A26221E7F52360092A34E /* ToSucceed.swift */; }; - 7A6AB2C61E7F628A00A2F694 /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0A26221E7F52360092A34E /* ToSucceed.swift */; }; - 7B13BA061DD360AA00C9098C /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */; }; - 7B13BA0B1DD361D200C9098C /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */; }; - 7B13BA0C1DD361D300C9098C /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */; }; - 7B13BA0D1DD361DE00C9098C /* ContainElementSatisfyingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */; }; - 7B13BA0E1DD361DF00C9098C /* ContainElementSatisfyingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */; }; - 7B13BA0F1DD361DF00C9098C /* ContainElementSatisfyingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */; }; - 7B13BA101DD361EA00C9098C /* ObjCContainElementSatisfying.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */; }; - 7B13BA111DD361EB00C9098C /* ObjCContainElementSatisfying.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */; }; - 7B13BA121DD361EB00C9098C /* ObjCContainElementSatisfying.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */; }; - 7B5358BA1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BB1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BC1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BE1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 7B5358BF1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 7B5358C01C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 964CFEFD1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 964CFEFE1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 964CFEFF1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 965B0D091B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - 965B0D0A1B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - 965B0D0C1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - 965B0D0D1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - AE4BA9AD1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE4BA9AE1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE4BA9AF1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE7ADE451C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE461C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE471C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE491C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - AE7ADE4A1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - AE7ADE4B1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - CD79C9A01D2CC839004B6F9A /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - CD79C9A11D2CC83B004B6F9A /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - CD79C9A21D2CC83E004B6F9A /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - CD79C9A31D2CC841004B6F9A /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - CD79C9A41D2CC848004B6F9A /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - CD79C9A51D2CC848004B6F9A /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - CD79C9A61D2CC848004B6F9A /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - CD79C9A71D2CC848004B6F9A /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - CD79C9A81D2CC848004B6F9A /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - CD79C9A91D2CC848004B6F9A /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - CD79C9AA1D2CC848004B6F9A /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - CD79C9AB1D2CC848004B6F9A /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - CD79C9AC1D2CC848004B6F9A /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - CD79C9AD1D2CC848004B6F9A /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - CD79C9AE1D2CC848004B6F9A /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - CD79C9AF1D2CC848004B6F9A /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - CD79C9B01D2CC848004B6F9A /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - CD79C9B11D2CC848004B6F9A /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - CD79C9B21D2CC848004B6F9A /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - CD79C9B31D2CC848004B6F9A /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - CD79C9B41D2CC848004B6F9A /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - CD79C9B51D2CC848004B6F9A /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - CD79C9B61D2CC848004B6F9A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - CD79C9B71D2CC848004B6F9A /* ObjCSatisfyAnyOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */; }; - CDD80B831F2030790002CD65 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - CDD80B841F20307A0002CD65 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - CDD80B851F20307B0002CD65 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - DA9E8C821A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - DA9E8C831A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - DD72EC641A93874A002F7651 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - DD72EC651A93874A002F7651 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - DD9A9A8F19CF439B00706F49 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - DD9A9A9019CF43AD00706F49 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - DDB1BC791A92235600F743C3 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - DDB1BC7A1A92235600F743C3 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - DDB4D5ED19FE43C200E9D9FE /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - DDB4D5F019FE442800E9D9FE /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - DDB4D5F119FE442800E9D9FE /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - DDEFAEB41A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - DDEFAEB51A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - F8A1BE2F1CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; - F8A1BE301CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; - F8A1BE311CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1F1A74361940169200FFFC47 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = "Nimble-iOS"; - }; - 1F5DF1601BDCA0CE00C3A531 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F5DF1541BDCA0CE00C3A531; - remoteInfo = "Nimble-tvOS"; - }; - 1F6BB82A1968BFF9009F1DBB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = "Nimble-iOS"; - }; - 1F925EA4195C0C8500ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = Nimble; - }; - 1F925EA6195C0C8500ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = Nimble; - }; - 1F925EB9195C0D6300ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-macOS"; - }; - 1F9B7BFD1968AD760094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-macOS"; - }; - 1F9B7BFF1968AD760094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-macOS"; - }; - 1F9B7C011968AD820094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-macOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectWithLazyProperty.swift; sourceTree = ""; }; - 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronousTests.swift; sourceTree = ""; }; - 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CwlMachBadInstructionHandler.m; sourceTree = ""; }; - 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlMachBadInstructionHandler.h; sourceTree = ""; }; - 1F12BE881E778F70006952EC /* mach_excServer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mach_excServer.c; sourceTree = ""; }; - 1F12BE891E778F70006952EC /* mach_excServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mach_excServer.h; sourceTree = ""; }; - 1F12BE8B1E778F70006952EC /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlBadInstructionException.swift; sourceTree = ""; }; - 1F12BE8C1E778F70006952EC /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchBadInstruction.swift; sourceTree = ""; }; - 1F12BE8D1E778F70006952EC /* CwlCatchBadInstructionPOSIX.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchBadInstructionPOSIX.swift; sourceTree = ""; }; - 1F12BE8E1E778F70006952EC /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlDarwinDefinitions.swift; sourceTree = ""; }; - 1F12BE911E778F70006952EC /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlPreconditionTesting.h; sourceTree = ""; }; - 1F12BE931E778F70006952EC /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlPreconditionTesting.h; sourceTree = ""; }; - 1F12BED71E7791B9006952EC /* CwlCatchException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchException.swift; sourceTree = ""; }; - 1F12BED91E7791B9006952EC /* CwlCatchException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CwlCatchException.m; sourceTree = ""; }; - 1F12BEDB1E7791B9006952EC /* CwlCatchException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlCatchException.h; sourceTree = ""; }; - 1F14FB63194180C5009F2A08 /* utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = utils.swift; sourceTree = ""; }; - 1F1871BC1CA89EDB00A34BF2 /* DSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DSL.h; sourceTree = ""; }; - 1F1871BD1CA89EDB00A34BF2 /* DSL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DSL.m; sourceTree = ""; }; - 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMBExceptionCapture.h; sourceTree = ""; }; - 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NMBExceptionCapture.m; sourceTree = ""; }; - 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMBStringify.h; sourceTree = ""; }; - 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NMBStringify.m; sourceTree = ""; }; - 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NMBExpectation.swift; sourceTree = ""; }; - 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NMBObjCMatcher.swift; sourceTree = ""; }; - 1F1871CD1CA89EE000A34BF2 /* ExceptionCapture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExceptionCapture.swift; sourceTree = ""; }; - 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncMatcherWrapper.swift; sourceTree = ""; }; - 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherFunc.swift; sourceTree = ""; }; - 1F1A74291940169200FFFC47 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F1A742D1940169200FFFC47 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F1A742E1940169200FFFC47 /* Nimble.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Nimble.h; sourceTree = ""; }; - 1F1A74341940169200FFFC47 /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F1A743A1940169200FFFC47 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAKindOfTest.swift; sourceTree = ""; }; - 1F2752D119445B8400052A26 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; lineEnding = 0; path = README.md; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.markdown; }; - 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeEmptyTest.swift; sourceTree = ""; }; - 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCAsyncTest.m; sourceTree = ""; }; - 1F4A56681A3B3074009E1637 /* NimbleSpecHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NimbleSpecHelper.h; sourceTree = ""; }; - 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeAnInstanceOfTest.m; sourceTree = ""; }; - 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeKindOfTest.m; sourceTree = ""; }; - 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeCloseToTest.m; sourceTree = ""; }; - 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeginWithTest.m; sourceTree = ""; }; - 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeGreaterThanTest.m; sourceTree = ""; }; - 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeGreaterThanOrEqualToTest.m; sourceTree = ""; }; - 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeIdenticalToTest.m; sourceTree = ""; }; - 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeLessThanTest.m; sourceTree = ""; }; - 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeLessThanOrEqualToTest.m; sourceTree = ""; }; - 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeTruthyTest.m; sourceTree = ""; }; - 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeFalsyTest.m; sourceTree = ""; }; - 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeTrueTest.m; sourceTree = ""; }; - 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeFalseTest.m; sourceTree = ""; }; - 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeNilTest.m; sourceTree = ""; }; - 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCContainTest.m; sourceTree = ""; }; - 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCEndWithTest.m; sourceTree = ""; }; - 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCEqualTest.m; sourceTree = ""; }; - 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCMatchTest.m; sourceTree = ""; }; - 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCRaiseExceptionTest.m; sourceTree = ""; }; - 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowAssertionTest.swift; sourceTree = ""; }; - 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCSyncTest.m; sourceTree = ""; }; - 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeVoidTest.swift; sourceTree = ""; }; - 1F91DD301C74BF61002C309F /* BeVoid.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeVoid.swift; sourceTree = ""; }; - 1F925EAD195C0D6300ED456B /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F925EE5195C121200ED456B /* AsynchronousTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsynchronousTest.swift; sourceTree = ""; }; - 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAnInstanceOfTest.swift; sourceTree = ""; }; - 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RaisesExceptionTest.swift; sourceTree = ""; }; - 1F925EEE195C136500ED456B /* BeLogicalTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLogicalTest.swift; sourceTree = ""; }; - 1F925EF5195C147800ED456B /* BeCloseToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeCloseToTest.swift; sourceTree = ""; }; - 1F925EF8195C175000ED456B /* BeNilTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeNilTest.swift; sourceTree = ""; }; - 1F925EFB195C186800ED456B /* BeginWithTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeginWithTest.swift; sourceTree = ""; }; - 1F925EFE195C187600ED456B /* EndWithTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndWithTest.swift; sourceTree = ""; }; - 1F925F01195C189500ED456B /* ContainTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainTest.swift; sourceTree = ""; }; - 1F925F04195C18B700ED456B /* EqualTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EqualTest.swift; sourceTree = ""; }; - 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThanTest.swift; sourceTree = ""; }; - 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThanTest.swift; sourceTree = ""; }; - 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThanOrEqualToTest.swift; sourceTree = ""; }; - 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThanOrEqualToTest.swift; sourceTree = ""; }; - 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeEmptyTest.m; sourceTree = ""; }; - 1FA0C3FE1E30B14500623165 /* Predicate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Predicate.swift; sourceTree = ""; }; - 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeIdenticalToTest.swift; sourceTree = ""; }; - 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleEnvironment.swift; sourceTree = ""; }; - 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostNotificationTest.swift; sourceTree = ""; }; - 1FCF91521C61C8A400B15DCB /* PostNotification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostNotification.swift; sourceTree = ""; }; - 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionRecorder.swift; sourceTree = ""; }; - 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdapterProtocols.swift; sourceTree = ""; }; - 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleXCTestHandler.swift; sourceTree = ""; }; - 1FD8CD081968AB07008ED995 /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSL.swift; sourceTree = ""; }; - 1FD8CD091968AB07008ED995 /* Expectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expectation.swift; sourceTree = ""; }; - 1FD8CD0A1968AB07008ED995 /* Expression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expression.swift; sourceTree = ""; }; - 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FailureMessage.swift; sourceTree = ""; }; - 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAnInstanceOf.swift; sourceTree = ""; }; - 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeAKindOf.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeCloseTo.swift; sourceTree = ""; }; - 1FD8CD101968AB07008ED995 /* BeEmpty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeEmpty.swift; sourceTree = ""; }; - 1FD8CD111968AB07008ED995 /* BeginWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeginWith.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeGreaterThan.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeGreaterThanOrEqualTo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeIdenticalTo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD151968AB07008ED995 /* BeLessThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLessThan.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLessThanOrEqual.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD171968AB07008ED995 /* BeLogical.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLogical.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD181968AB07008ED995 /* BeNil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeNil.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD1A1968AB07008ED995 /* Contain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Contain.swift; sourceTree = ""; }; - 1FD8CD1B1968AB07008ED995 /* EndWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndWith.swift; sourceTree = ""; }; - 1FD8CD1C1968AB07008ED995 /* Equal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Equal.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherProtocols.swift; sourceTree = ""; }; - 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RaisesException.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD251968AB07008ED995 /* Functional.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Functional.swift; sourceTree = ""; }; - 1FD8CD261968AB07008ED995 /* Async.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Async.swift; sourceTree = ""; }; - 1FD8CD271968AB07008ED995 /* SourceLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SourceLocation.swift; sourceTree = ""; }; - 1FD8CD281968AB07008ED995 /* Stringers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stringers.swift; sourceTree = ""; }; - 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionDispatcher.swift; sourceTree = ""; }; - 1FE661561E6574E20035F243 /* ExpectationMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpectationMessage.swift; sourceTree = ""; }; - 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowErrorTest.swift; sourceTree = ""; }; - 29EA59651B551EE6002D767E /* ThrowError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowError.swift; sourceTree = ""; }; - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestCaseProvider.swift; sourceTree = ""; }; - 472FD1341B9E085700C7B8DA /* HaveCount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCount.swift; sourceTree = ""; }; - 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCountTest.swift; sourceTree = ""; }; - 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCHaveCount.m; sourceTree = ""; }; - 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinuxSupport.swift; sourceTree = ""; }; - 7A0A26221E7F52360092A34E /* ToSucceed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToSucceed.swift; sourceTree = ""; }; - 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToSucceedTest.swift; sourceTree = ""; }; - 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainElementSatisfying.swift; sourceTree = ""; }; - 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCContainElementSatisfying.m; sourceTree = ""; }; - 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainElementSatisfyingTest.swift; sourceTree = ""; }; - 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SatisfyAnyOfTest.swift; sourceTree = ""; }; - 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SatisfyAnyOf.swift; sourceTree = ""; }; - 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCSatisfyAnyOfTest.m; sourceTree = ""; }; - 8DF1C3F61C94FC75004B2D36 /* ObjcStringersTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjcStringersTest.m; sourceTree = ""; }; - 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowAssertion.swift; sourceTree = ""; }; - 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCUserDescriptionTest.m; sourceTree = ""; }; - 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDescriptionTest.swift; sourceTree = ""; }; - AE4BA9AC1C88DDB500B73906 /* Errors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = ""; }; - AE7ADE441C80BF8000B94CD3 /* MatchError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchError.swift; sourceTree = ""; }; - AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchErrorTest.swift; sourceTree = ""; }; - DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DSL+Wait.swift"; sourceTree = ""; }; - DD72EC631A93874A002F7651 /* AllPassTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllPassTest.swift; sourceTree = ""; }; - DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeIdenticalToObjectTest.swift; sourceTree = ""; }; - DDB1BC781A92235600F743C3 /* AllPass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllPass.swift; sourceTree = ""; }; - DDB4D5EC19FE43C200E9D9FE /* Match.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Match.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchTest.swift; sourceTree = ""; }; - DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCAllPassTest.m; sourceTree = ""; }; - F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCTestObservationCenter+Register.m"; sourceTree = ""; }; - F8A1BE321CB3777F00031679 /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CurrentTestCaseTracker.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1F1A74251940169200FFFC47 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74311940169200FFFC47 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F1A74351940169200FFFC47 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1511BDCA0CE00C3A531 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15B1BDCA0CE00C3A531 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F5DF15F1BDCA0CE00C3A531 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EA9195C0D6300ED456B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB4195C0D6300ED456B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F925EB8195C0D6300ED456B /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1F12BE841E778F70006952EC /* CwlMachBadInstructionHandler */ = { - isa = PBXGroup; - children = ( - 1F12BE851E778F70006952EC /* CwlMachBadInstructionHandler.m */, - 1F12BE861E778F70006952EC /* include */, - 1F12BE881E778F70006952EC /* mach_excServer.c */, - 1F12BE891E778F70006952EC /* mach_excServer.h */, - ); - path = CwlMachBadInstructionHandler; - sourceTree = ""; - }; - 1F12BE861E778F70006952EC /* include */ = { - isa = PBXGroup; - children = ( - 1F12BE871E778F70006952EC /* CwlMachBadInstructionHandler.h */, - ); - path = include; - sourceTree = ""; - }; - 1F12BE8A1E778F70006952EC /* CwlPreconditionTesting */ = { - isa = PBXGroup; - children = ( - 1F12BE8B1E778F70006952EC /* CwlBadInstructionException.swift */, - 1F12BE8C1E778F70006952EC /* CwlCatchBadInstruction.swift */, - 1F12BE8D1E778F70006952EC /* CwlCatchBadInstructionPOSIX.swift */, - 1F12BE8E1E778F70006952EC /* CwlDarwinDefinitions.swift */, - 1F12BE901E778F70006952EC /* Mach */, - 1F12BE921E778F70006952EC /* Posix */, - ); - path = CwlPreconditionTesting; - sourceTree = ""; - }; - 1F12BE901E778F70006952EC /* Mach */ = { - isa = PBXGroup; - children = ( - 1F12BE911E778F70006952EC /* CwlPreconditionTesting.h */, - ); - path = Mach; - sourceTree = ""; - }; - 1F12BE921E778F70006952EC /* Posix */ = { - isa = PBXGroup; - children = ( - 1F12BE931E778F70006952EC /* CwlPreconditionTesting.h */, - ); - path = Posix; - sourceTree = ""; - }; - 1F12BED61E7791B9006952EC /* CwlCatchException */ = { - isa = PBXGroup; - children = ( - 1F12BED71E7791B9006952EC /* CwlCatchException.swift */, - ); - path = CwlCatchException; - sourceTree = ""; - }; - 1F12BED81E7791B9006952EC /* CwlCatchExceptionSupport */ = { - isa = PBXGroup; - children = ( - 1F12BED91E7791B9006952EC /* CwlCatchException.m */, - 1F12BEDA1E7791B9006952EC /* include */, - ); - path = CwlCatchExceptionSupport; - sourceTree = ""; - }; - 1F12BEDA1E7791B9006952EC /* include */ = { - isa = PBXGroup; - children = ( - 1F12BEDB1E7791B9006952EC /* CwlCatchException.h */, - ); - path = include; - sourceTree = ""; - }; - 1F14FB61194180A7009F2A08 /* Helpers */ = { - isa = PBXGroup; - children = ( - 1F14FB63194180C5009F2A08 /* utils.swift */, - 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */, - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 1F1871B91CA89E1B00A34BF2 /* NimbleObjectiveC */ = { - isa = PBXGroup; - children = ( - F8A1BE321CB3777F00031679 /* CurrentTestCaseTracker.h */, - 1F1871BC1CA89EDB00A34BF2 /* DSL.h */, - 1F1871BD1CA89EDB00A34BF2 /* DSL.m */, - 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */, - 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */, - 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */, - 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */, - F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */, - ); - name = NimbleObjectiveC; - path = Sources/NimbleObjectiveC; - sourceTree = ""; - }; - 1F1871BA1CA89E2500A34BF2 /* NonObjectiveC */ = { - isa = PBXGroup; - children = ( - 1F1871CD1CA89EE000A34BF2 /* ExceptionCapture.swift */, - ); - path = NonObjectiveC; - sourceTree = ""; - }; - 1F1A741F1940169200FFFC47 = { - isa = PBXGroup; - children = ( - 1F2752D119445B8400052A26 /* README.md */, - 1F1A742B1940169200FFFC47 /* Nimble */, - 1F1871B91CA89E1B00A34BF2 /* NimbleObjectiveC */, - 1F1A74381940169200FFFC47 /* NimbleTests */, - 9630C0081C6D0AB3000693EE /* Lib */, - 1F1A742A1940169200FFFC47 /* Products */, - ); - indentWidth = 4; - sourceTree = ""; - tabWidth = 4; - usesTabs = 0; - }; - 1F1A742A1940169200FFFC47 /* Products */ = { - isa = PBXGroup; - children = ( - 1F1A74291940169200FFFC47 /* Nimble.framework */, - 1F1A74341940169200FFFC47 /* NimbleTests.xctest */, - 1F925EAD195C0D6300ED456B /* Nimble.framework */, - 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */, - 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */, - 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 1F1A742B1940169200FFFC47 /* Nimble */ = { - isa = PBXGroup; - children = ( - 1FD8CD041968AB07008ED995 /* Adapters */, - 1FD8CD081968AB07008ED995 /* DSL.swift */, - DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */, - 1FD8CD091968AB07008ED995 /* Expectation.swift */, - 1FD8CD0A1968AB07008ED995 /* Expression.swift */, - 1FE661561E6574E20035F243 /* ExpectationMessage.swift */, - 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */, - 1F1A742D1940169200FFFC47 /* Info.plist */, - 1FD8CD0C1968AB07008ED995 /* Matchers */, - 1F1A742E1940169200FFFC47 /* Nimble.h */, - 1FD8CD241968AB07008ED995 /* Utils */, - ); - name = Nimble; - path = Sources/Nimble; - sourceTree = ""; - }; - 1F1A74381940169200FFFC47 /* NimbleTests */ = { - isa = PBXGroup; - children = ( - 1F925EE5195C121200ED456B /* AsynchronousTest.swift */, - 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */, - 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */, - 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */, - 1FFD729A1963FC8200CD29A2 /* objc */, - 1F14FB61194180A7009F2A08 /* Helpers */, - 1F925EE3195C11B000ED456B /* Matchers */, - 1F1A74391940169200FFFC47 /* Supporting Files */, - ); - name = NimbleTests; - path = Tests/NimbleTests; - sourceTree = ""; - }; - 1F1A74391940169200FFFC47 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 1F1A743A1940169200FFFC47 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 1F925EE3195C11B000ED456B /* Matchers */ = { - isa = PBXGroup; - children = ( - DD72EC631A93874A002F7651 /* AllPassTest.swift */, - 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */, - 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */, - 1F925EF5195C147800ED456B /* BeCloseToTest.swift */, - 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */, - 1F925EFB195C186800ED456B /* BeginWithTest.swift */, - 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */, - 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */, - DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */, - 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */, - 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */, - 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */, - 1F925EEE195C136500ED456B /* BeLogicalTest.swift */, - 1F925EF8195C175000ED456B /* BeNilTest.swift */, - 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */, - 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */, - 1F925F01195C189500ED456B /* ContainTest.swift */, - 1F925EFE195C187600ED456B /* EndWithTest.swift */, - 1F925F04195C18B700ED456B /* EqualTest.swift */, - 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */, - DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */, - 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */, - 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */, - 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */, - 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */, - AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */, - 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */, - 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */, - ); - path = Matchers; - sourceTree = ""; - }; - 1FD8CD041968AB07008ED995 /* Adapters */ = { - isa = PBXGroup; - children = ( - 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */, - 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */, - 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */, - 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */, - 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */, - 1F1871BA1CA89E2500A34BF2 /* NonObjectiveC */, - 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */, - 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */, - ); - path = Adapters; - sourceTree = ""; - }; - 1FD8CD0C1968AB07008ED995 /* Matchers */ = { - isa = PBXGroup; - children = ( - DDB1BC781A92235600F743C3 /* AllPass.swift */, - 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */, - 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */, - 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */, - 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */, - 1FD8CD101968AB07008ED995 /* BeEmpty.swift */, - 1FD8CD111968AB07008ED995 /* BeginWith.swift */, - 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */, - 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */, - 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */, - 1FD8CD151968AB07008ED995 /* BeLessThan.swift */, - 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */, - 1FD8CD171968AB07008ED995 /* BeLogical.swift */, - 1FD8CD181968AB07008ED995 /* BeNil.swift */, - 1F91DD301C74BF61002C309F /* BeVoid.swift */, - 1FD8CD1A1968AB07008ED995 /* Contain.swift */, - 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */, - 1FD8CD1B1968AB07008ED995 /* EndWith.swift */, - 1FD8CD1C1968AB07008ED995 /* Equal.swift */, - 472FD1341B9E085700C7B8DA /* HaveCount.swift */, - DDB4D5EC19FE43C200E9D9FE /* Match.swift */, - 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */, - 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */, - AE7ADE441C80BF8000B94CD3 /* MatchError.swift */, - 1FCF91521C61C8A400B15DCB /* PostNotification.swift */, - 1FA0C3FE1E30B14500623165 /* Predicate.swift */, - 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */, - 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */, - 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */, - 29EA59651B551EE6002D767E /* ThrowError.swift */, - 7A0A26221E7F52360092A34E /* ToSucceed.swift */, - ); - path = Matchers; - sourceTree = ""; - }; - 1FD8CD241968AB07008ED995 /* Utils */ = { - isa = PBXGroup; - children = ( - 1FD8CD251968AB07008ED995 /* Functional.swift */, - 1FD8CD261968AB07008ED995 /* Async.swift */, - 1FD8CD271968AB07008ED995 /* SourceLocation.swift */, - 1FD8CD281968AB07008ED995 /* Stringers.swift */, - AE4BA9AC1C88DDB500B73906 /* Errors.swift */, - ); - path = Utils; - sourceTree = ""; - }; - 1FFD729A1963FC8200CD29A2 /* objc */ = { - isa = PBXGroup; - children = ( - 1F4A56681A3B3074009E1637 /* NimbleSpecHelper.h */, - 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */, - 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */, - 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */, - 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */, - 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */, - 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */, - 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */, - 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */, - 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */, - 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */, - 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */, - 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */, - 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */, - 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */, - 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */, - 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */, - 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */, - 7B13BA071DD360C300C9098C /* ObjCContainElementSatisfying.m */, - 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */, - 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */, - 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */, - 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */, - 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */, - 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */, - 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */, - DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */, - 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */, - 8DF1C3F61C94FC75004B2D36 /* ObjcStringersTest.m */, - ); - path = objc; - sourceTree = ""; - }; - 9630C0081C6D0AB3000693EE /* Lib */ = { - isa = PBXGroup; - children = ( - 9630C0091C6D0ABA000693EE /* CwlPreconditionTesting */, - ); - name = Lib; - path = Sources/Lib; - sourceTree = ""; - }; - 9630C0091C6D0ABA000693EE /* CwlPreconditionTesting */ = { - isa = PBXGroup; - children = ( - 1F12BED61E7791B9006952EC /* CwlCatchException */, - 1F12BED81E7791B9006952EC /* CwlCatchExceptionSupport */, - 1F12BE841E778F70006952EC /* CwlMachBadInstructionHandler */, - 1F12BE8A1E778F70006952EC /* CwlPreconditionTesting */, - ); - path = CwlPreconditionTesting; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 1F1A74261940169200FFFC47 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F12BEA31E778FFA006952EC /* CwlPreconditionTesting.h in Headers */, - 1F12BEA11E778FA9006952EC /* CwlMachBadInstructionHandler.h in Headers */, - 1F1871C91CA89EDB00A34BF2 /* NMBStringify.h in Headers */, - 1F1871C51CA89EDB00A34BF2 /* DSL.h in Headers */, - 1F1871C71CA89EDB00A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F1A742F1940169200FFFC47 /* Nimble.h in Headers */, - 1F12BEE31E7791B9006952EC /* CwlCatchException.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1521BDCA0CE00C3A531 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F1871E21CA89EF600A34BF2 /* NMBStringify.h in Headers */, - 1F1871E01CA89EF600A34BF2 /* DSL.h in Headers */, - 1F1871E11CA89EF600A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F12BEA81E77902A006952EC /* CwlPreconditionTesting.h in Headers */, - 1F12BEEA1E77ABE3006952EC /* CwlMachBadInstructionHandler.h in Headers */, - 1F4999A61DBF2DD100BF8877 /* Nimble.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EAA195C0D6300ED456B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F12BE951E778F70006952EC /* CwlMachBadInstructionHandler.h in Headers */, - 1F1871DF1CA89EF500A34BF2 /* NMBStringify.h in Headers */, - 1F12BE9D1E778F70006952EC /* CwlPreconditionTesting.h in Headers */, - 1F1871DD1CA89EF500A34BF2 /* DSL.h in Headers */, - 1F1871DE1CA89EF500A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F925EC7195C0DD100ED456B /* Nimble.h in Headers */, - 1F12BEE21E7791B9006952EC /* CwlCatchException.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1F1A74281940169200FFFC47 /* Nimble-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F1A743F1940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOS" */; - buildPhases = ( - 1F1A74241940169200FFFC47 /* Sources */, - 1F1A74251940169200FFFC47 /* Frameworks */, - 1F1A74261940169200FFFC47 /* Headers */, - 1F1A74271940169200FFFC47 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-iOS"; - productName = "Nimble-iOS"; - productReference = 1F1A74291940169200FFFC47 /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F1A74331940169200FFFC47 /* Nimble-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F1A74421940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOSTests" */; - buildPhases = ( - 1F1A74301940169200FFFC47 /* Sources */, - 1F1A74311940169200FFFC47 /* Frameworks */, - 1F1A74321940169200FFFC47 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F1A74371940169200FFFC47 /* PBXTargetDependency */, - 1F925EA5195C0C8500ED456B /* PBXTargetDependency */, - 1F925EA7195C0C8500ED456B /* PBXTargetDependency */, - 1F6BB82B1968BFF9009F1DBB /* PBXTargetDependency */, - ); - name = "Nimble-iOSTests"; - productName = "Nimble-iOSTests"; - productReference = 1F1A74341940169200FFFC47 /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F5DF16A1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOS" */; - buildPhases = ( - 1F5DF1501BDCA0CE00C3A531 /* Sources */, - 1F5DF1511BDCA0CE00C3A531 /* Frameworks */, - 1F5DF1521BDCA0CE00C3A531 /* Headers */, - 1F5DF1531BDCA0CE00C3A531 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-tvOS"; - productName = "Nimble-tvOS"; - productReference = 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F5DF15D1BDCA0CE00C3A531 /* Nimble-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F5DF16B1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOSTests" */; - buildPhases = ( - 1F5DF15A1BDCA0CE00C3A531 /* Sources */, - 1F5DF15B1BDCA0CE00C3A531 /* Frameworks */, - 1F5DF15C1BDCA0CE00C3A531 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F5DF1611BDCA0CE00C3A531 /* PBXTargetDependency */, - ); - name = "Nimble-tvOSTests"; - productName = "Nimble-tvOSTests"; - productReference = 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F925EAC195C0D6300ED456B /* Nimble-macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F925EC0195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOS" */; - buildPhases = ( - 1F925EA8195C0D6300ED456B /* Sources */, - 1F925EA9195C0D6300ED456B /* Frameworks */, - 1F925EAA195C0D6300ED456B /* Headers */, - 1F925EAB195C0D6300ED456B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-macOS"; - productName = "Nimble-macOS"; - productReference = 1F925EAD195C0D6300ED456B /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F925EB6195C0D6300ED456B /* Nimble-macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F925EC3195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOSTests" */; - buildPhases = ( - 1F925EB3195C0D6300ED456B /* Sources */, - 1F925EB4195C0D6300ED456B /* Frameworks */, - 1F925EB5195C0D6300ED456B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F925EBA195C0D6300ED456B /* PBXTargetDependency */, - 1F9B7BFE1968AD760094EB8F /* PBXTargetDependency */, - 1F9B7C001968AD760094EB8F /* PBXTargetDependency */, - 1F9B7C021968AD820094EB8F /* PBXTargetDependency */, - ); - name = "Nimble-macOSTests"; - productName = "Nimble-OSXTests"; - productReference = 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 1F1A74201940169200FFFC47 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0900; - ORGANIZATIONNAME = "Jeff Hui"; - TargetAttributes = { - 1F1A74281940169200FFFC47 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0900; - }; - 1F1A74331940169200FFFC47 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0900; - TestTargetID = 1F1A74281940169200FFFC47; - }; - 1F5DF1541BDCA0CE00C3A531 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0900; - }; - 1F5DF15D1BDCA0CE00C3A531 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0900; - }; - 1F925EAC195C0D6300ED456B = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0900; - }; - 1F925EB6195C0D6300ED456B = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0900; - TestTargetID = 1F925EAC195C0D6300ED456B; - }; - A8F2B2541E79A4AB005BDD17 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 1F1A74231940169200FFFC47 /* Build configuration list for PBXProject "Nimble" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 1F1A741F1940169200FFFC47; - productRefGroup = 1F1A742A1940169200FFFC47 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1F925EAC195C0D6300ED456B /* Nimble-macOS */, - 1F925EB6195C0D6300ED456B /* Nimble-macOSTests */, - 1F1A74281940169200FFFC47 /* Nimble-iOS */, - 1F1A74331940169200FFFC47 /* Nimble-iOSTests */, - 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */, - 1F5DF15D1BDCA0CE00C3A531 /* Nimble-tvOSTests */, - A8F2B2541E79A4AB005BDD17 /* SwiftLint */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1F1A74271940169200FFFC47 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74321940169200FFFC47 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1531BDCA0CE00C3A531 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15C1BDCA0CE00C3A531 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EAB195C0D6300ED456B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB5195C0D6300ED456B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - A8F2B2581E79A4B0005BDD17 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1F1A74241940169200FFFC47 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1FD8CD401968AB07008ED995 /* BeCloseTo.swift in Sources */, - 1F12BEA51E77900A006952EC /* CwlCatchBadInstruction.swift in Sources */, - 1F1871C81CA89EDB00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1FD8CD361968AB07008ED995 /* Expectation.swift in Sources */, - 1FD8CD321968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */, - 1F43728F1A1B344000EB80F8 /* Stringers.swift in Sources */, - 1F12BEA41E77900A006952EC /* CwlBadInstructionException.swift in Sources */, - 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */, - 1FD8CD4E1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, - 1FDBD8671AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */, - AE4BA9AD1C88DDB500B73906 /* Errors.swift in Sources */, - 1FD8CD3C1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, - 7A6AB2C51E7F628900A2F694 /* ToSucceed.swift in Sources */, - 1FD8CD501968AB07008ED995 /* BeLogical.swift in Sources */, - 1F1871CB1CA89EDB00A34BF2 /* NMBExpectation.swift in Sources */, - DA9E8C821A414BB9002633C2 /* DSL+Wait.swift in Sources */, - DDB1BC791A92235600F743C3 /* AllPass.swift in Sources */, - 1FD8CD3E1968AB07008ED995 /* BeAKindOf.swift in Sources */, - DDB4D5ED19FE43C200E9D9FE /* Match.swift in Sources */, - 1F12BE9F1E778F8F006952EC /* CwlMachBadInstructionHandler.m in Sources */, - 1F91DD311C74BF61002C309F /* BeVoid.swift in Sources */, - 7B13BA0B1DD361D200C9098C /* ContainElementSatisfying.swift in Sources */, - 1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */, - 1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */, - 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */, - 1FD8CD5A1968AB07008ED995 /* Equal.swift in Sources */, - 1FD8CD4C1968AB07008ED995 /* BeLessThan.swift in Sources */, - 1F1871CC1CA89EDB00A34BF2 /* NMBObjCMatcher.swift in Sources */, - 1FD8CD461968AB07008ED995 /* BeGreaterThan.swift in Sources */, - F8A1BE2F1CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F12BEA21E778FBA006952EC /* mach_excServer.c in Sources */, - 1F1871C61CA89EDB00A34BF2 /* DSL.m in Sources */, - 1FD8CD301968AB07008ED995 /* AdapterProtocols.swift in Sources */, - 1F12BEA71E779018006952EC /* CwlDarwinDefinitions.swift in Sources */, - 1F12BEE01E7791B9006952EC /* CwlCatchException.m in Sources */, - AE7ADE451C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AA1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - CDD80B841F20307A0002CD65 /* MatcherProtocols.swift in Sources */, - 1FD8CD5E1968AB07008ED995 /* RaisesException.swift in Sources */, - 1FD8CD561968AB07008ED995 /* Contain.swift in Sources */, - 1FD8CD481968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */, - 1FD8CD441968AB07008ED995 /* BeginWith.swift in Sources */, - 1FD8CD4A1968AB07008ED995 /* BeIdenticalTo.swift in Sources */, - 1FE661581E6574E30035F243 /* ExpectationMessage.swift in Sources */, - 1F1871E61CA89FCD00A34BF2 /* MatcherFunc.swift in Sources */, - 1FD8CD421968AB07008ED995 /* BeEmpty.swift in Sources */, - 1F1871E41CA89FB600A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1F1871CA1CA89EDB00A34BF2 /* NMBStringify.m in Sources */, - 1FD8CD521968AB07008ED995 /* BeNil.swift in Sources */, - 1FD8CD6A1968AB07008ED995 /* Async.swift in Sources */, - 1FD8CD581968AB07008ED995 /* EndWith.swift in Sources */, - 1FD8CD341968AB07008ED995 /* DSL.swift in Sources */, - 1F12BEDD1E7791B9006952EC /* CwlCatchException.swift in Sources */, - 7B5358BE1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1FD8CD381968AB07008ED995 /* Expression.swift in Sources */, - 1FD8CD3A1968AB07008ED995 /* FailureMessage.swift in Sources */, - 472FD1351B9E085700C7B8DA /* HaveCount.swift in Sources */, - 1FA0C4001E30B14500623165 /* Predicate.swift in Sources */, - 964CFEFD1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74301940169200FFFC47 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4A569A1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, - 1F925EEC195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, - 1F925EFF195C187600ED456B /* EndWithTest.swift in Sources */, - 1F1B5AD41963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, - 1F925F0E195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, - 1F4A56661A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, - 1F925EFC195C186800ED456B /* BeginWithTest.swift in Sources */, - 1F14FB64194180C5009F2A08 /* utils.swift in Sources */, - DDB4D5F019FE442800E9D9FE /* MatchTest.swift in Sources */, - 1F4A56731A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */, - 1F4A56821A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 7B13BA0E1DD361DF00C9098C /* ContainElementSatisfyingTest.swift in Sources */, - 1F925F02195C189500ED456B /* ContainTest.swift in Sources */, - 1F4A56881A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */, - 1F4A568E1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */, - 1F925F11195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F925EEF195C136500ED456B /* BeLogicalTest.swift in Sources */, - 1F4A56A01A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */, - 1F925F0B195C18E100ED456B /* BeLessThanTest.swift in Sources */, - 1F9DB8FB1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */, - 1FB90098195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */, - 1F91DD2D1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 1F4A56761A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, - 1F925EF9195C175000ED456B /* BeNilTest.swift in Sources */, - 7A6AB2C31E7F547E00A2F694 /* ToSucceedTest.swift in Sources */, - 1F4A56701A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, - 1F4A56971A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */, - 1F4A567C1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */, - 965B0D0C1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */, - 1FCF914F1C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - 965B0D091B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */, - 1F4A56911A3B344A009E1637 /* ObjCBeNilTest.m in Sources */, - 1F8A37B01B7C5042001C8357 /* ObjCSyncTest.m in Sources */, - 1F4A56941A3B346F009E1637 /* ObjCContainTest.m in Sources */, - 1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */, - 7B13BA111DD361EB00C9098C /* ObjCContainElementSatisfying.m in Sources */, - 1F925EF6195C147800ED456B /* BeCloseToTest.swift in Sources */, - 1F4A56791A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - AE7ADE491C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 1F4A568B1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */, - DDEFAEB41A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */, - 1F4A567F1A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */, - 1F925EE6195C121200ED456B /* AsynchronousTest.swift in Sources */, - 1F0648CC19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */, - 1F4A56851A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */, - DD9A9A8F19CF439B00706F49 /* BeIdenticalToObjectTest.swift in Sources */, - 1F4BB8B71DACA0E40048464B /* ThrowAssertionTest.swift in Sources */, - 1F0648D41963AAB2001F9C46 /* SynchronousTests.swift in Sources */, - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 4793854D1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */, - 1F925F08195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, - 7B5358BA1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F925F05195C18B700ED456B /* EqualTest.swift in Sources */, - 1F4A566D1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */, - DD72EC641A93874A002F7651 /* AllPassTest.swift in Sources */, - 1F4A569D1A3B3565009E1637 /* ObjCMatchTest.m in Sources */, - 1F925EE9195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */, - 29EA59631B551ED2002D767E /* ThrowErrorTest.swift in Sources */, - 6CAEDD0A1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4A566A1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */, - 472FD13B1B9E0CFE00C7B8DA /* HaveCountTest.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1501BDCA0CE00C3A531 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F5DF1791BDCA0F500C3A531 /* BeCloseTo.swift in Sources */, - 1F5DF16C1BDCA0F500C3A531 /* AssertionRecorder.swift in Sources */, - 1F1871D71CA89EEF00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1F5DF16E1BDCA0F500C3A531 /* NimbleXCTestHandler.swift in Sources */, - 7A6AB2C61E7F628A00A2F694 /* ToSucceed.swift in Sources */, - 1F5DF1751BDCA0F500C3A531 /* FailureMessage.swift in Sources */, - 1F5DF1801BDCA0F500C3A531 /* BeLessThanOrEqual.swift in Sources */, - 1F1871E81CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */, - 1F5DF1891BDCA0F500C3A531 /* RaisesException.swift in Sources */, - 1F5DF1761BDCA0F500C3A531 /* AllPass.swift in Sources */, - AE4BA9AF1C88DDB500B73906 /* Errors.swift in Sources */, - 1F5DF1861BDCA0F500C3A531 /* HaveCount.swift in Sources */, - 1F5DF1811BDCA0F500C3A531 /* BeLogical.swift in Sources */, - 1F1871DB1CA89EF100A34BF2 /* NMBExpectation.swift in Sources */, - 1F5DF1741BDCA0F500C3A531 /* Expression.swift in Sources */, - 1F5DF1781BDCA0F500C3A531 /* BeAnInstanceOf.swift in Sources */, - 1F12BEA01E778F90006952EC /* CwlMachBadInstructionHandler.m in Sources */, - 1F5DF1771BDCA0F500C3A531 /* BeAKindOf.swift in Sources */, - 1F5DF17F1BDCA0F500C3A531 /* BeLessThan.swift in Sources */, - 1F5DF17C1BDCA0F500C3A531 /* BeGreaterThan.swift in Sources */, - 1F91DD331C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91551C61C8A400B15DCB /* PostNotification.swift in Sources */, - 1F5DF1831BDCA0F500C3A531 /* Contain.swift in Sources */, - 1F5DF1851BDCA0F500C3A531 /* Equal.swift in Sources */, - 1F1871DC1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */, - F8A1BE311CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1FE661591E6574E30035F243 /* ExpectationMessage.swift in Sources */, - 1FA0C4011E30B14500623165 /* Predicate.swift in Sources */, - 1F5DF1711BDCA0F500C3A531 /* DSL+Wait.swift in Sources */, - 1F1871D61CA89EEF00A34BF2 /* DSL.m in Sources */, - 1F5DF17D1BDCA0F500C3A531 /* BeGreaterThanOrEqualTo.swift in Sources */, - AE7ADE471C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AC1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1F5DF18E1BDCA0F500C3A531 /* Stringers.swift in Sources */, - 1F5DF16D1BDCA0F500C3A531 /* AdapterProtocols.swift in Sources */, - 1F5DF17B1BDCA0F500C3A531 /* BeginWith.swift in Sources */, - 1F5DF17E1BDCA0F500C3A531 /* BeIdenticalTo.swift in Sources */, - 1F1871E91CA8A18700A34BF2 /* MatcherFunc.swift in Sources */, - 1F5DF17A1BDCA0F500C3A531 /* BeEmpty.swift in Sources */, - 1F5DF18C1BDCA0F500C3A531 /* Async.swift in Sources */, - 1F1871D81CA89EEF00A34BF2 /* NMBStringify.m in Sources */, - 1F5DF1821BDCA0F500C3A531 /* BeNil.swift in Sources */, - 1F5DF16F1BDCA0F500C3A531 /* AssertionDispatcher.swift in Sources */, - 964CFEFF1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - 1F5DF1841BDCA0F500C3A531 /* EndWith.swift in Sources */, - 1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */, - 1F5DF1701BDCA0F500C3A531 /* DSL.swift in Sources */, - CDD80B851F20307B0002CD65 /* MatcherProtocols.swift in Sources */, - 1F5DF1721BDCA0F500C3A531 /* Expectation.swift in Sources */, - 7B5358C01C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 7B13BA0C1DD361D300C9098C /* ContainElementSatisfying.swift in Sources */, - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */, - 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */, - 1F12BEA61E779012006952EC /* CwlCatchBadInstructionPOSIX.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15A1BDCA0CE00C3A531 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CD79C9AD1D2CC848004B6F9A /* ObjCBeTrueTest.m in Sources */, - CD79C9B41D2CC848004B6F9A /* ObjCRaiseExceptionTest.m in Sources */, - 1F5DF1A31BDCA10200C3A531 /* BeLogicalTest.swift in Sources */, - 1F5DF1951BDCA10200C3A531 /* utils.swift in Sources */, - CD79C9B01D2CC848004B6F9A /* ObjCEndWithTest.m in Sources */, - CD79C9B21D2CC848004B6F9A /* ObjCHaveCount.m in Sources */, - CD79C9A41D2CC848004B6F9A /* ObjCBeFalsyTest.m in Sources */, - 1F5DF1981BDCA10200C3A531 /* BeAKindOfTest.swift in Sources */, - 1F5DF19B1BDCA10200C3A531 /* BeEmptyTest.swift in Sources */, - 7B5358BC1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F5DF1A11BDCA10200C3A531 /* BeLessThanOrEqualToTest.swift in Sources */, - 1F5DF1961BDCA10200C3A531 /* ObjectWithLazyProperty.swift in Sources */, - 1F5DF1AB1BDCA10200C3A531 /* ThrowErrorTest.swift in Sources */, - CD79C9A91D2CC848004B6F9A /* ObjCBeKindOfTest.m in Sources */, - 1F5DF1A51BDCA10200C3A531 /* ContainTest.swift in Sources */, - 7B13BA121DD361EB00C9098C /* ObjCContainElementSatisfying.m in Sources */, - AE7ADE4B1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 7B13BA0F1DD361DF00C9098C /* ContainElementSatisfyingTest.swift in Sources */, - CD79C9B31D2CC848004B6F9A /* ObjCMatchTest.m in Sources */, - 1F5DF19E1BDCA10200C3A531 /* BeGreaterThanTest.swift in Sources */, - 1F5DF1A21BDCA10200C3A531 /* BeLessThanTest.swift in Sources */, - CD79C9AB1D2CC848004B6F9A /* ObjCBeLessThanTest.m in Sources */, - CD79C9A81D2CC848004B6F9A /* ObjCBeIdenticalToTest.m in Sources */, - CD79C9AE1D2CC848004B6F9A /* ObjCBeTruthyTest.m in Sources */, - 1F5DF1921BDCA10200C3A531 /* AsynchronousTest.swift in Sources */, - 1F5DF1A91BDCA10200C3A531 /* MatchTest.swift in Sources */, - 1F5DF1A81BDCA10200C3A531 /* HaveCountTest.swift in Sources */, - 1F5DF1971BDCA10200C3A531 /* AllPassTest.swift in Sources */, - CD79C9A61D2CC848004B6F9A /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */, - 1FCF91511C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - CD79C9B51D2CC848004B6F9A /* ObjCUserDescriptionTest.m in Sources */, - 1F5DF19C1BDCA10200C3A531 /* BeginWithTest.swift in Sources */, - 1F5DF1A01BDCA10200C3A531 /* BeIdenticalToTest.swift in Sources */, - 1F5DF19A1BDCA10200C3A531 /* BeCloseToTest.swift in Sources */, - 1F5DF1A61BDCA10200C3A531 /* EndWithTest.swift in Sources */, - CD79C9A31D2CC841004B6F9A /* ObjCBeFalseTest.m in Sources */, - 1F5DF1A71BDCA10200C3A531 /* EqualTest.swift in Sources */, - CD79C9AA1D2CC848004B6F9A /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 1F5DF1931BDCA10200C3A531 /* SynchronousTests.swift in Sources */, - CD79C9A11D2CC83B004B6F9A /* ObjCBeCloseToTest.m in Sources */, - 1F5DF19D1BDCA10200C3A531 /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F5DF1A41BDCA10200C3A531 /* BeNilTest.swift in Sources */, - 7A6AB2C41E7F547E00A2F694 /* ToSucceedTest.swift in Sources */, - CD79C9A71D2CC848004B6F9A /* ObjCBeGreaterThanTest.m in Sources */, - CD79C9A51D2CC848004B6F9A /* ObjCBeginWithTest.m in Sources */, - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 1F5DF1AA1BDCA10200C3A531 /* RaisesExceptionTest.swift in Sources */, - 1F5DF1941BDCA10200C3A531 /* UserDescriptionTest.swift in Sources */, - CD79C9AF1D2CC848004B6F9A /* ObjCContainTest.m in Sources */, - 1F5DF19F1BDCA10200C3A531 /* BeIdenticalToObjectTest.swift in Sources */, - CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */, - 1F91DD2F1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 6CAEDD0C1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4BB8B81DACAACF0048464B /* ThrowAssertionTest.swift in Sources */, - CD79C9B71D2CC848004B6F9A /* ObjCSatisfyAnyOfTest.m in Sources */, - 1F5DF1991BDCA10200C3A531 /* BeAnInstanceOfTest.swift in Sources */, - CD79C9B11D2CC848004B6F9A /* ObjCEqualTest.m in Sources */, - CD79C9A21D2CC83E004B6F9A /* ObjCBeEmptyTest.m in Sources */, - CD79C9AC1D2CC848004B6F9A /* ObjCBeNilTest.m in Sources */, - CD79C9A01D2CC839004B6F9A /* ObjCBeAnInstanceOfTest.m in Sources */, - CD79C9B61D2CC848004B6F9A /* ObjCAllPassTest.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EA8195C0D6300ED456B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1FD8CD411968AB07008ED995 /* BeCloseTo.swift in Sources */, - 1F12BE991E778F70006952EC /* CwlCatchBadInstruction.swift in Sources */, - 1F1871D31CA89EEE00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1FD8CD371968AB07008ED995 /* Expectation.swift in Sources */, - 1FD8CD331968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */, - 1F43728E1A1B343F00EB80F8 /* Stringers.swift in Sources */, - 1F12BE981E778F70006952EC /* CwlBadInstructionException.swift in Sources */, - 1F43728C1A1B343C00EB80F8 /* SourceLocation.swift in Sources */, - 1FD8CD4F1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, - 1F1871E71CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1FDBD8681AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */, - AE4BA9AE1C88DDB500B73906 /* Errors.swift in Sources */, - 1FD8CD3D1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, - 1F12BEDF1E7791B9006952EC /* CwlCatchException.m in Sources */, - 1FD8CD511968AB07008ED995 /* BeLogical.swift in Sources */, - 1F1871D91CA89EF100A34BF2 /* NMBExpectation.swift in Sources */, - DA9E8C831A414BB9002633C2 /* DSL+Wait.swift in Sources */, - DDB1BC7A1A92235600F743C3 /* AllPass.swift in Sources */, - 1FD8CD3F1968AB07008ED995 /* BeAKindOf.swift in Sources */, - 1F12BE941E778F70006952EC /* CwlMachBadInstructionHandler.m in Sources */, - 1FD8CD2F1968AB07008ED995 /* AssertionRecorder.swift in Sources */, - 7B13BA061DD360AA00C9098C /* ContainElementSatisfying.swift in Sources */, - 1F91DD321C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */, - DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */, - 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */, - 1FD8CD5B1968AB07008ED995 /* Equal.swift in Sources */, - 1F12BEE91E779784006952EC /* mach_excServer.c in Sources */, - 1FD8CD4D1968AB07008ED995 /* BeLessThan.swift in Sources */, - 1FD8CD471968AB07008ED995 /* BeGreaterThan.swift in Sources */, - F8A1BE301CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F1871DA1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */, - 1FD8CD311968AB07008ED995 /* AdapterProtocols.swift in Sources */, - 1F1871D21CA89EEE00A34BF2 /* DSL.m in Sources */, - AE7ADE461C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AB1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1FD8CD5F1968AB07008ED995 /* RaisesException.swift in Sources */, - CDD80B831F2030790002CD65 /* MatcherProtocols.swift in Sources */, - 1FD8CD571968AB07008ED995 /* Contain.swift in Sources */, - 7A0A26231E7F52360092A34E /* ToSucceed.swift in Sources */, - 1FD8CD491968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */, - 1FE661571E6574E30035F243 /* ExpectationMessage.swift in Sources */, - 1FD8CD451968AB07008ED995 /* BeginWith.swift in Sources */, - 1F1871EB1CA8A18800A34BF2 /* MatcherFunc.swift in Sources */, - 1FD8CD4B1968AB07008ED995 /* BeIdenticalTo.swift in Sources */, - 1FD8CD431968AB07008ED995 /* BeEmpty.swift in Sources */, - 1F1871D41CA89EEE00A34BF2 /* NMBStringify.m in Sources */, - 1FD8CD531968AB07008ED995 /* BeNil.swift in Sources */, - 1F12BEDC1E7791B9006952EC /* CwlCatchException.swift in Sources */, - 1FD8CD6B1968AB07008ED995 /* Async.swift in Sources */, - 964CFEFE1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - 1FD8CD591968AB07008ED995 /* EndWith.swift in Sources */, - 1FD8CD351968AB07008ED995 /* DSL.swift in Sources */, - 7B5358BF1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1F12BE9B1E778F70006952EC /* CwlDarwinDefinitions.swift in Sources */, - 1FD8CD391968AB07008ED995 /* Expression.swift in Sources */, - 1FD8CD3B1968AB07008ED995 /* FailureMessage.swift in Sources */, - 1FA0C3FF1E30B14500623165 /* Predicate.swift in Sources */, - 472FD1391B9E0A9700C7B8DA /* HaveCount.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB3195C0D6300ED456B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4A569B1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, - 1F925EED195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, - 1F925F00195C187600ED456B /* EndWithTest.swift in Sources */, - 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, - 1F925F0F195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, - 1F4A56671A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, - 1F925EFD195C186800ED456B /* BeginWithTest.swift in Sources */, - 1F925EE2195C0DFD00ED456B /* utils.swift in Sources */, - DDB4D5F119FE442800E9D9FE /* MatchTest.swift in Sources */, - 1F4A56741A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */, - 1F4A56831A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 7B13BA0D1DD361DE00C9098C /* ContainElementSatisfyingTest.swift in Sources */, - 1F925F03195C189500ED456B /* ContainTest.swift in Sources */, - 1F4A56891A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */, - 1F4A568F1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */, - 1F925F12195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F925EF0195C136500ED456B /* BeLogicalTest.swift in Sources */, - 1F4A56A11A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */, - 1F925F0C195C18E100ED456B /* BeLessThanTest.swift in Sources */, - 1F9DB8FC1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */, - 1FB90099195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */, - 1F91DD2E1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 1F4A56771A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, - 1F925EFA195C175000ED456B /* BeNilTest.swift in Sources */, - 7A6AB2C21E7F547E00A2F694 /* ToSucceedTest.swift in Sources */, - 1F4A56711A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, - 1F4A56981A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */, - 1F4A567D1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */, - 965B0D0D1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */, - 1FCF91501C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - 965B0D0A1B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */, - 1F4A56921A3B344A009E1637 /* ObjCBeNilTest.m in Sources */, - 1F8A37B11B7C5042001C8357 /* ObjCSyncTest.m in Sources */, - 1F4A56951A3B346F009E1637 /* ObjCContainTest.m in Sources */, - 1F299EAC19627B2D002641AF /* BeEmptyTest.swift in Sources */, - 7B13BA101DD361EA00C9098C /* ObjCContainElementSatisfying.m in Sources */, - 1F925EF7195C147800ED456B /* BeCloseToTest.swift in Sources */, - 1F4A567A1A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - AE7ADE4A1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 1F4A568C1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */, - DDEFAEB51A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */, - 1F4A56801A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */, - 1F925EE7195C121200ED456B /* AsynchronousTest.swift in Sources */, - 1F0648CD19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */, - 1F4A56861A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */, - DD9A9A9019CF43AD00706F49 /* BeIdenticalToObjectTest.swift in Sources */, - 1F4BB8B61DACA0E30048464B /* ThrowAssertionTest.swift in Sources */, - 1F0648D51963AAB2001F9C46 /* SynchronousTests.swift in Sources */, - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 4793854E1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */, - 1F925F09195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, - 7B5358BB1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F925F06195C18B700ED456B /* EqualTest.swift in Sources */, - 1F4A566E1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */, - DD72EC651A93874A002F7651 /* AllPassTest.swift in Sources */, - 1F4A569E1A3B3565009E1637 /* ObjCMatchTest.m in Sources */, - 1F925EEA195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */, - 29EA59641B551ED2002D767E /* ThrowErrorTest.swift in Sources */, - 6CAEDD0B1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4A566B1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */, - 472FD13A1B9E0A9F00C7B8DA /* HaveCountTest.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1F1A74371940169200FFFC47 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F1A74361940169200FFFC47 /* PBXContainerItemProxy */; - }; - 1F5DF1611BDCA0CE00C3A531 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */; - targetProxy = 1F5DF1601BDCA0CE00C3A531 /* PBXContainerItemProxy */; - }; - 1F6BB82B1968BFF9009F1DBB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F6BB82A1968BFF9009F1DBB /* PBXContainerItemProxy */; - }; - 1F925EA5195C0C8500ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F925EA4195C0C8500ED456B /* PBXContainerItemProxy */; - }; - 1F925EA7195C0C8500ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F925EA6195C0C8500ED456B /* PBXContainerItemProxy */; - }; - 1F925EBA195C0D6300ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F925EB9195C0D6300ED456B /* PBXContainerItemProxy */; - }; - 1F9B7BFE1968AD760094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7BFD1968AD760094EB8F /* PBXContainerItemProxy */; - }; - 1F9B7C001968AD760094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7BFF1968AD760094EB8F /* PBXContainerItemProxy */; - }; - 1F9B7C021968AD820094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7C011968AD820094EB8F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1F1A743D1940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = NO; - 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_ERROR; - 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_ERROR; - 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; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 1F1A743E1940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = NO; - 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_ERROR; - 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_ERROR; - 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; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 1F1A74401940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F1A74411940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 1F1A74431940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F1A74441940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 1F5DF1661BDCA0CE00C3A531 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Debug; - }; - 1F5DF1671BDCA0CE00C3A531 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Release; - }; - 1F5DF1681BDCA0CE00C3A531 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Debug; - }; - 1F5DF1691BDCA0CE00C3A531 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = appletvos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Release; - }; - 1F925EC1195C0D6300ED456B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - FRAMEWORK_VERSION = A; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = macosx; - SKIP_INSTALL = YES; - VALID_ARCHS = x86_64; - }; - name = Debug; - }; - 1F925EC2195C0D6300ED456B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - FRAMEWORK_VERSION = A; - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALID_ARCHS = x86_64; - }; - name = Release; - }; - 1F925EC4195C0D6300ED456B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F925EC5195C0D6300ED456B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - A8F2B2551E79A4AB005BDD17 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = macosx; - }; - name = Debug; - }; - A8F2B2561E79A4AB005BDD17 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1F1A74231940169200FFFC47 /* Build configuration list for PBXProject "Nimble" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A743D1940169200FFFC47 /* Debug */, - 1F1A743E1940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F1A743F1940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A74401940169200FFFC47 /* Debug */, - 1F1A74411940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F1A74421940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A74431940169200FFFC47 /* Debug */, - 1F1A74441940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F5DF16A1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F5DF1661BDCA0CE00C3A531 /* Debug */, - 1F5DF1671BDCA0CE00C3A531 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F5DF16B1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F5DF1681BDCA0CE00C3A531 /* Debug */, - 1F5DF1691BDCA0CE00C3A531 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F925EC0195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F925EC1195C0D6300ED456B /* Debug */, - 1F925EC2195C0D6300ED456B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F925EC3195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F925EC4195C0D6300ED456B /* Debug */, - 1F925EC5195C0D6300ED456B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A8F2B2571E79A4AC005BDD17 /* Build configuration list for PBXAggregateTarget "SwiftLint" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A8F2B2551E79A4AB005BDD17 /* Debug */, - A8F2B2561E79A4AB005BDD17 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 1F1A74201940169200FFFC47 /* Project object */; -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a822b74..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme deleted file mode 100644 index 0cbad84..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme deleted file mode 100644 index 571a9f4..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme deleted file mode 100644 index dba65f1..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Package.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Package.swift deleted file mode 100644 index 2ef4037..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Package.swift +++ /dev/null @@ -1,12 +0,0 @@ -// swift-tools-version:3.0 - -import PackageDescription - -let package = Package( - name: "Nimble", - exclude: [ - "Sources/Lib", - "Sources/NimbleObjectiveC", - "Tests/NimbleTests/objc", - ] -) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/README.md b/Carthage/Checkouts/Quick/Externals/Nimble/README.md deleted file mode 100644 index a190ac6..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/README.md +++ /dev/null @@ -1,1764 +0,0 @@ -# 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). - -```swift -// Swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` - -# How to Use Nimble - - - -**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - -- [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 Safety](#type-safety) - - [Operator Overloads](#operator-overloads) - - [Lazily Computed Values](#lazily-computed-values) - - [C Primitives](#c-primitives) - - [Asynchronous Expectations](#asynchronous-expectations) - - [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) - - [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) - - [Using Nimble without XCTest](#using-nimble-without-xctest) - - - -# Some Background: Expressing Outcomes Using Assertions in XCTest - -Apple's Xcode includes the XCTest framework, which provides -assertion macros to test whether code behaves properly. -For example, to assert that `1 + 1 = 2`, XCTest has you write: - -```swift -// Swift - -XCTAssertEqual(1 + 1, 2, "expected one plus one to equal two") -``` - -Or, in Objective-C: - -```objc -// Objective-C - -XCTAssertEqual(1 + 1, 2, @"expected one plus one to equal two"); -``` - -XCTest assertions have a couple of drawbacks: - -1. **Not enough macros.** There's no easy way to assert that a string - contains a particular substring, or that a number is less than or - equal to another. -2. **It's hard to write asynchronous tests.** XCTest forces you to write - a lot of boilerplate code. - -Nimble addresses these concerns. - -# Nimble: Expectations Using `expect(...).to` - -Nimble allows you to express expectations using a natural, -easily understood language: - -```swift -// Swift - -import Nimble - -expect(seagull.squawk).to(equal("Squee!")) -``` - -```objc -// Objective-C - -@import Nimble; - -expect(seagull.squawk).to(equal(@"Squee!")); -``` - -> The `expect` function autocompletes to include `file:` and `line:`, - but these parameters are optional. Use the default values to have - Xcode highlight the correct line when an expectation is not met. - -To perform the opposite expectation--to assert something is *not* -equal--use `toNot` or `notTo`: - -```swift -// Swift - -import Nimble - -expect(seagull.squawk).toNot(equal("Oh, hello there!")) -expect(seagull.squawk).notTo(equal("Oh, hello there!")) -``` - -```objc -// Objective-C - -@import Nimble; - -expect(seagull.squawk).toNot(equal(@"Oh, hello there!")); -expect(seagull.squawk).notTo(equal(@"Oh, hello there!")); -``` - -## Custom Failure Messages - -Would you like to add more information to the test's failure messages? Use the `description` optional argument to add your own text: - -```swift -// Swift - -expect(1 + 1).to(equal(3)) -// failed - expected to equal <3>, got <2> - -expect(1 + 1).to(equal(3), description: "Make sure libKindergartenMath is loaded") -// failed - Make sure libKindergartenMath is loaded -// expected to equal <3>, got <2> -``` - -Or the *WithDescription version in Objective-C: - -```objc -// Objective-C - -@import Nimble; - -expect(@(1+1)).to(equal(@3)); -// failed - expected to equal <3.0000>, got <2.0000> - -expect(@(1+1)).toWithDescription(equal(@3), @"Make sure libKindergartenMath is loaded"); -// failed - Make sure libKindergartenMath is loaded -// expected to equal <3.0000>, got <2.0000> -``` - -## Type Safety - -Nimble makes sure you don't compare two types that don't match: - -```swift -// Swift - -// Does not compile: -expect(1 + 1).to(equal("Squee!")) -``` - -> Nimble uses generics--only available in Swift--to ensure - type correctness. That means type checking is - not available when using Nimble in Objective-C. :sob: - -## Operator Overloads - -Tired of so much typing? With Nimble, you can use overloaded operators -like `==` for equivalence, or `>` for comparisons: - -```swift -// Swift - -// Passes if squawk does not equal "Hi!": -expect(seagull.squawk) != "Hi!" - -// Passes if 10 is greater than 2: -expect(10) > 2 -``` - -> Operator overloads are only available in Swift, so you won't be able - to use this syntax in Objective-C. :broken_heart: - -## Lazily Computed Values - -The `expect` function doesn't evaluate the value it's given until it's -time to match. So Nimble can test whether an expression raises an -exception once evaluated: - -```swift -// Swift - -// Note: Swift currently doesn't have exceptions. -// Only Objective-C code can raise exceptions -// that Nimble will catch. -// (see https://github.com/Quick/Nimble/issues/220#issuecomment-172667064) -let exception = NSException( - name: NSInternalInconsistencyException, - reason: "Not enough fish in the sea.", - userInfo: ["something": "is fishy"]) -expect { exception.raise() }.to(raiseException()) - -// Also, you can customize raiseException to be more specific -expect { exception.raise() }.to(raiseException(named: NSInternalInconsistencyException)) -expect { exception.raise() }.to(raiseException( - named: NSInternalInconsistencyException, - reason: "Not enough fish in the sea")) -expect { exception.raise() }.to(raiseException( - named: NSInternalInconsistencyException, - reason: "Not enough fish in the sea", - userInfo: ["something": "is fishy"])) -``` - -Objective-C works the same way, but you must use the `expectAction` -macro when making an expectation on an expression that has no return -value: - -```objc -// Objective-C - -NSException *exception = [NSException exceptionWithName:NSInternalInconsistencyException - reason:@"Not enough fish in the sea." - userInfo:nil]; -expectAction(^{ [exception raise]; }).to(raiseException()); - -// Use the property-block syntax to be more specific. -expectAction(^{ [exception raise]; }).to(raiseException().named(NSInternalInconsistencyException)); -expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInternalInconsistencyException). - reason("Not enough fish in the sea")); -expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInternalInconsistencyException). - reason("Not enough fish in the sea"). - userInfo(@{@"something": @"is fishy"})); - -// You can also pass a block for custom matching of the raised exception -expectAction(exception.raise()).to(raiseException().satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(beginWith(NSInternalInconsistencyException)); -})); -``` - -## C Primitives - -Some testing frameworks make it hard to test primitive C values. -In Nimble, it just works: - -```swift -// Swift - -let actual: CInt = 1 -let expectedValue: CInt = 1 -expect(actual).to(equal(expectedValue)) -``` - -In fact, Nimble uses type inference, so you can write the above -without explicitly specifying both types: - -```swift -// Swift - -expect(1 as CInt).to(equal(1)) -``` - -> In Objective-C, Nimble only supports Objective-C objects. To - make expectations on primitive C values, wrap then in an object - literal: - -```objc -expect(@(1 + 1)).to(equal(@2)); -``` - -## Asynchronous Expectations - -In Nimble, it's easy to make expectations on values that are updated -asynchronously. Just use `toEventually` or `toEventuallyNot`: - -```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") -} -expect(ocean).toEventually(contain("dolphins", "whales")) -``` - - -```objc -// Objective-C - -dispatch_async(dispatch_get_main_queue(), ^{ - [ocean add:@"dolphins"]; - [ocean add:@"whales"]; -}); -expect(ocean).toEventually(contain(@"dolphins", @"whales")); -``` - -Note: toEventually triggers its polls on the main thread. Blocking the main -thread will cause Nimble to stop the run loop. This can cause test pollution -for whatever incomplete code that was running on the main thread. Blocking the -main thread can be caused by blocking IO, calls to sleep(), deadlocks, and -synchronous IPC. - -In the above example, `ocean` is constantly re-evaluated. If it ever -contains dolphins and whales, the expectation passes. If `ocean` still -doesn't contain them, even after being continuously re-evaluated for one -whole second, the expectation fails. - -Sometimes it takes more than a second for a value to update. In those -cases, use the `timeout` parameter: - -```swift -// Swift - -// 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 -// Objective-C - -// Waits three seconds for ocean to contain "starfish": -expect(ocean).withTimeout(3).toEventually(contain(@"starfish")); -``` - -You can also provide a callback by using the `waitUntil` function: - -```swift -// Swift - -waitUntil { done in - ocean.goFish { success in - expect(success).to(beTrue()) - done() - } -} -``` - -```objc -// Objective-C - -waitUntil(^(void (^done)(void)){ - [ocean goFishWithHandler:^(BOOL success){ - expect(success).to(beTrue()); - done(); - }]; -}); -``` - -`waitUntil` also optionally takes a timeout parameter: - -```swift -// Swift - -waitUntil(timeout: 10) { done in - ocean.goFish { success in - expect(success).to(beTrue()) - done() - } -} -``` - -```objc -// Objective-C - -waitUntilTimeout(10, ^(void (^done)(void)){ - [ocean goFishWithHandler:^(BOOL success){ - expect(success).to(beTrue()); - done(); - }]; -}); -``` - -Note: `waitUntil` triggers its timeout code on the main thread. Blocking the main -thread will cause Nimble to stop the run loop to continue. This can cause test -pollution for whatever incomplete code that was running on the main thread. -Blocking the main thread can be caused by blocking IO, calls to sleep(), -deadlocks, and synchronous IPC. - -In some cases (e.g. when running on slower machines) it can be useful to modify -the default timeout and poll interval values. This can be done as follows: - -```swift -// Swift - -// Increase the global timeout to 5 seconds: -Nimble.AsyncDefaults.Timeout = 5 - -// Slow the polling interval to 0.1 seconds: -Nimble.AsyncDefaults.PollInterval = 0.1 -``` - -## Objective-C Support - -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 or can be converted into - an `NSObject` equivalent: - - ```objc - // Objective-C - - @import Nimble; - - 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, - such as `-[NSException raise]`, use `expectAction` instead of - `expect`: - - ```objc - // 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 -`expect` function. To disable this shorthand in Objective-C, define the -`NIMBLE_DISABLE_SHORT_SYNTAX` macro somewhere in your code before -importing Nimble: - -```objc -#define NIMBLE_DISABLE_SHORT_SYNTAX 1 - -@import Nimble; - -NMB_expect(^{ return seagull.squawk; }, __FILE__, __LINE__).to(NMB_equal(@"Squee!")); -``` - -> Disabling the shorthand is useful if you're testing functions with - names that conflict with Nimble functions, such as `expect` or - `equal`. If that's not the case, there's no point in disabling the - shorthand. - -# Built-in Matcher Functions - -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': -expect(actual).to(equal(expected)) -expect(actual) == expected - -// Passes if 'actual' is not equivalent to 'expected': -expect(actual).toNot(equal(expected)) -expect(actual) != expected -``` - -```objc -// Objective-C - -// Passes if 'actual' is equivalent to 'expected': -expect(actual).to(equal(expected)) - -// Passes if 'actual' is not equivalent to 'expected': -expect(actual).toNot(equal(expected)) -``` - -Values must be `Equatable`, `Comparable`, or subclasses of `NSObject`. -`equal` will always fail when used to compare one or more `nil` values. - -## Identity - -```swift -// Swift - -// 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': -expect(actual).toNot(beIdenticalTo(expected)) -expect(actual) !== expected -``` - -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': -expect(actual).to(beIdenticalTo(expected)); - -// Passes if 'actual' does not have the same pointer address as 'expected': -expect(actual).toNot(beIdenticalTo(expected)); -``` - -## Comparisons - -```swift -// Swift - -expect(actual).to(beLessThan(expected)) -expect(actual) < expected - -expect(actual).to(beLessThanOrEqualTo(expected)) -expect(actual) <= expected - -expect(actual).to(beGreaterThan(expected)) -expect(actual) > expected - -expect(actual).to(beGreaterThanOrEqualTo(expected)) -expect(actual) >= expected -``` - -```objc -// Objective-C - -expect(actual).to(beLessThan(expected)); -expect(actual).to(beLessThanOrEqualTo(expected)); -expect(actual).to(beGreaterThan(expected)); -expect(actual).to(beGreaterThanOrEqualTo(expected)); -``` - -> Values given to the comparison matchers above must implement - `Comparable`. - -Because of how computers represent floating point numbers, assertions -that two floating point numbers be equal will sometimes fail. To express -that two numbers should be close to one another within a certain margin -of error, use `beCloseTo`: - -```swift -// Swift - -expect(actual).to(beCloseTo(expected, within: delta)) -``` - -```objc -// Objective-C - -expect(actual).to(beCloseTo(expected).within(delta)); -``` - -For example, to assert that `10.01` is close to `10`, you can write: - -```swift -// Swift - -expect(10.01).to(beCloseTo(10, within: 0.1)) -``` - -```objc -// Objective-C - -expect(@(10.01)).to(beCloseTo(@10).within(0.1)); -``` - -There is also an operator shortcut available in Swift: - -```swift -// Swift - -expect(actual) ≈ expected -expect(actual) ≈ (expected, delta) - -``` -(Type Option-x to get ≈ on a U.S. keyboard) - -The former version uses the default delta of 0.0001. Here is yet another way to do this: - -```swift -// Swift - -expect(actual) ≈ expected ± delta -expect(actual) == expected ± delta - -``` -(Type Option-Shift-= to get ± on a U.S. keyboard) - -If you are comparing arrays of floating point numbers, you'll find the following useful: - -```swift -// Swift - -expect([0.0, 2.0]) ≈ [0.0001, 2.0001] -expect([0.0, 2.0]).to(beCloseTo([0.1, 2.1], within: 0.1)) - -``` - -> Values given to the `beCloseTo` matcher must be coercable into a - `Double`. - -## Types/Classes - -```swift -// Swift - -// 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: -expect(instance).to(beAKindOf(aClass)) -``` - -```objc -// Objective-C - -// 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: -expect(instance).to(beAKindOf(aClass)); -``` - -> Instances must be Objective-C objects: subclasses of `NSObject`, - or Swift objects bridged to Objective-C with the `@objc` prefix. - -For example, to assert that `dolphin` is a kind of `Mammal`: - -```swift -// Swift - -expect(dolphin).to(beAKindOf(Mammal)) -``` - -```objc -// Objective-C - -expect(dolphin).to(beAKindOf([Mammal class])); -``` - -> `beAnInstanceOf` uses the `-[NSObject isMemberOfClass:]` method to - test membership. `beAKindOf` uses `-[NSObject isKindOfClass:]`. - -## Truthiness - -```swift -// 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): -expect(actual).to(beTrue()) - -// 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): -expect(actual).to(beFalse()) - -// 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: -expect(actual).to(beTruthy()); - -// 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: -expect(actual).to(beFalsy()); - -// Passes if 'actual' is only false (not nil or an object conforming to Boolean false): -expect(actual).to(beFalse()); - -// 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 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 'Error': -expect { try somethingThatThrows() }.to(throwError()) - -// 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 a particular error enum case: -expect { try somethingThatThrows() }.to(throwError(NSCocoaError.PropertyListReadCorruptError)) - -// Passes if 'somethingThatThrows()' throws an error of a particular type: -expect { try somethingThatThrows() }.to(throwError(errorType: NimbleError.self)) -``` - -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: Error = ... - -// Passes if 'actual' represents any error value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum.self)) - -// 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 one provided: -expect(actual).to(matchError(NSError(domain: "err", code: 123, userInfo: nil))) -``` - -Note: This feature is only available in Swift. - -## Exceptions - -```swift -// Swift - -// Passes if 'actual', when evaluated, raises an exception: -expect(actual).to(raiseException()) - -// 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: -expect(actual).to(raiseException(named: name, reason: reason)) - -// 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")) -}) -``` - -```objc -// Objective-C - -// Passes if 'actual', when evaluated, raises an exception: -expect(actual).to(raiseException()) - -// 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: -expect(actual).to(raiseException().named(name).reason(reason)) - -// 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. - -## Collection Membership - -```swift -// Swift - -// Passes if all of the expected values are members of 'actual': -expect(actual).to(contain(expected...)) - -// 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': -expect(actual).to(contain(expected)); - -// Passes if 'actual' is empty (i.e. it contains no elements): -expect(actual).to(beEmpty()); -``` - -> In Swift `contain` takes any number of arguments. The expectation - passes if all of them are members of the collection. In Objective-C, - `contain` only takes one argument [for now](https://github.com/Quick/Nimble/issues/27). - -For example, to assert that a list of sea creature names contains -"dolphin" and "starfish": - -```swift -// Swift - -expect(["whale", "dolphin", "starfish"]).to(contain("dolphin", "starfish")) -``` - -```objc -// Objective-C - -expect(@[@"whale", @"dolphin", @"starfish"]).to(contain(@"dolphin")); -expect(@[@"whale", @"dolphin", @"starfish"]).to(contain(@"starfish")); -``` - -> `contain` and `beEmpty` expect collections to be instances of - `NSArray`, `NSSet`, or a Swift collection composed of `Equatable` elements. - -To test whether a set of elements is present at the beginning or end of -an ordered collection, use `beginWith` and `endWith`: - -```swift -// Swift - -// 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': -expect(actual).to(endWith(expected...)) -``` - -```objc -// Objective-C - -// 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': -expect(actual).to(endWith(expected)); -``` - -> `beginWith` and `endWith` expect collections to be instances of - `NSArray`, or ordered Swift collections composed of `Equatable` - elements. - - 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': -expect(actual).to(contain(substring)) - -// Passes if 'actual' begins with 'prefix': -expect(actual).to(beginWith(prefix)) - -// Passes if 'actual' ends with 'suffix': -expect(actual).to(endWith(suffix)) - -// Passes if 'actual' represents the empty string, "": -expect(actual).to(beEmpty()) - -// Passes if 'actual' matches the regular expression defined in 'expected': -expect(actual).to(match(expected)) -``` - -```objc -// Objective-C - -// Passes if 'actual' contains 'substring': -expect(actual).to(contain(expected)); - -// Passes if 'actual' begins with 'prefix': -expect(actual).to(beginWith(prefix)); - -// Passes if 'actual' ends with 'suffix': -expect(actual).to(endWith(suffix)); - -// Passes if 'actual' represents the empty string, "": -expect(actual).to(beEmpty()); - -// Passes if 'actual' matches the regular expression defined in 'expected': -expect(actual).to(match(expected)) -``` - -## 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 - -// Providing a custom function: -expect([1, 2, 3, 4]).to(allPass { $0! < 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))); -``` - -## Collection Count - -```swift -// Swift - -// Passes if 'actual' contains the 'expected' number of elements: -expect(actual).to(haveCount(expected)) - -// Passes if 'actual' does _not_ contain the 'expected' number of elements: -expect(actual).notTo(haveCount(expected)) -``` - -```objc -// Objective-C - -// Passes if 'actual' contains the 'expected' number of elements: -expect(actual).to(haveCount(expected)) - -// Passes if 'actual' does _not_ contain the 'expected' number of elements: -expect(actual).notTo(haveCount(expected)) -``` - -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 must be one of the following classes, or their subclasses: - - - `NSArray`, - - `NSDictionary`, - - `NSSet`, or - - `NSHashTable`. - -## Notifications - -```swift -// Swift -let testNotification = Notification(name: "Foo", object: nil) - -// passes if the closure in expect { ... } posts a notification to the default -// notification center. -expect { - NotificationCenter.default.postNotification(testNotification) -}.to(postNotifications(equal([testNotification])) - -// passes if the closure in expect { ... } posts a notification to a given -// notification center -let notificationCenter = NotificationCenter() -expect { - notificationCenter.postNotification(testNotification) -}.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) -``` - -> This matcher is only available in Swift. - -## 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))) - -// can include any number of matchers -- the following will pass -// **be careful** -- too many matchers can be the sign of an unfocused test -expect(6).to(satisfyAnyOf(equal(2), equal(3), equal(4), equal(5), equal(6), equal(7))) - -// in Swift you also have the option to use the || operator to achieve a similar function -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))) - -// can include any number of matchers -- the following will pass -// **be careful** -- too many matchers can be the sign of an unfocused test -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. - -## Custom Validation - -```swift -// Swift - -// passes if .succeeded is returned from the closure -expect({ - guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { - return .failed(reason: "wrong enum case") - } - - return .succeeded -}).to(succeed()) - -// passes if .failed is returned from the closure -expect({ - guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { - return .failed(reason: "wrong enum case") - } - - return .succeeded -}).notTo(succeed()) -``` - -The `String` provided with `.failed()` is shown when the test fails. - -When using `toEventually()` be careful not to make state changes or run process intensive code since this closure will be ran many times. - -# Writing Your Own Matchers - -In Nimble, matchers are Swift functions that take an expected -value and return a `Predicate` closure. Take `equal`, for example: - -```swift -// Swift - -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 PredicateResult( - bool: actualValue == expectedValue!, - message: msg - ) - } else { - return PredicateResult( - status: .fail, - message: msg.appendedBeNilHint() - ) - } - } -} -``` - -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 - `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 -in an Xcode project you distribute to others. - -> If you write a matcher you think everyone can use, consider adding it - to Nimble's built-in set of matchers by sending a pull request! Or - distribute it yourself via GitHub. - -For examples of how to write your own matchers, just check out the -[`Matchers` directory](https://github.com/Quick/Nimble/tree/master/Sources/Nimble/Matchers) -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 -`expect` function. The expression can either be a closure or a value directly -passed to `expect(...)`. In order to determine whether that value matches, -custom matchers should call `actualExpression.evaluate()`: - -```swift -// Swift - -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 -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. - -## Type Checking via Swift Generics - -Using Swift's generics, matchers can constrain the type of the actual value -passed to the `expect` function by modifying the return type. - -For example, the following matcher, `haveDescription`, only accepts actual -values that implement the `Printable` protocol. It checks their `description` -against the one provided to the matcher function, and passes if they are the same: - -```swift -// Swift - -public func haveDescription(description: String) -> Predicate { - return Predicate.simple("have description") { actual in - return PredicateStatus(bool: actual.evaluate().description == description) - } -} -``` - -## Customizing Failure Messages - -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)>" -``` - -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 - -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) - } -} -``` - -In the example above, `msg` is defined based on the string given to -`Predicate.define`. The code looks akin to: - -```swift -// Swift - -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 - -To use a custom matcher written in Swift from Objective-C, you'll have -to extend the `NMBObjCMatcher` class, adding a new class method for your -custom matcher. The example below defines the class method -`+[NMBObjCMatcher beNilMatcher]`: - -```swift -// Swift - -extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualBlock, failureMessage, location in - let block = ({ actualBlock() as NSObject? }) - let expr = Expression(expression: block, location: location) - return beNil().matches(expr, failureMessage: failureMessage) - } - } -} -``` - -The above allows you to use the matcher from Objective-C: - -```objc -// Objective-C - -expect(actual).to([NMBObjCMatcher beNilMatcher]()); -``` - -To make the syntax easier to use, define a C function that calls the -class method: - -```objc -// Objective-C - -FOUNDATION_EXPORT id beNil() { - return [NMBObjCMatcher beNilMatcher]; -} -``` - -### Properly Handling `nil` in Objective-C Matchers - -When supporting Objective-C, make sure you handle `nil` appropriately. -Like [Cedar](https://github.com/pivotal/cedar/issues/100), -**most matchers do not match with nil**. This is to bring prevent test -writers from being surprised by `nil` values where they did not expect -them. - -Nimble provides the `beNil` matcher function for test writer that want -to make expectations on `nil` objects: - -```objc -// Objective-C - -expect(nil).to(equal(nil)); // fails -expect(nil).to(beNil()); // passes -``` - -If your matcher does not want to match with nil, you use `NonNilMatcherFunc` -and the `canMatchNil` constructor on `NMBObjCMatcher`. Using both types will -automatically generate expected value failure messages when they're nil. - -```swift - -public func beginWith(startingElement: T) -> NonNilMatcherFunc { - 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 - } -} - -extension NMBObjCMatcher { - public class func beginWithMatcher(expected: AnyObject) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = actualExpression.evaluate() - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return beginWith(expected).matches(expr, failureMessage: failureMessage) - } - } -} -``` - -## 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 - 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. - -## Installing Nimble as a Submodule - -To use Nimble as a submodule to test your macOS, iOS or tvOS applications, follow -these 4 easy steps: - -1. Clone the Nimble repository -2. Add Nimble.xcodeproj to the Xcode workspace for your project -3. Link Nimble.framework to your test target -4. Start writing expectations! - -For more detailed instructions on each of these steps, -read [How to Install Quick](https://github.com/Quick/Quick#how-to-install-quick). -Ignore the steps involving adding Quick to your project in order to -install just Nimble. - -## Installing Nimble via CocoaPods - -To use Nimble in CocoaPods to test your macOS, iOS or tvOS applications, add -Nimble to your podfile and add the ```use_frameworks!``` line to enable Swift -support for CocoaPods. - -```ruby -platform :ios, '8.0' - -source 'https://github.com/CocoaPods/Specs.git' - -# Whatever pods you need for your app go here - -target 'YOUR_APP_NAME_HERE_Tests', :exclusive => true do - use_frameworks! - pod 'Nimble', '~> 6.0.0' -end -``` - -Finally run `pod install`. - -## Using Nimble without XCTest - -Nimble is integrated with XCTest to allow it work well when used in Xcode test -bundles, however it can also be used in a standalone app. After installing -Nimble using one of the above methods, there are two additional steps required -to make this work. - -1. Create a custom assertion handler and assign an instance of it to the - global `NimbleAssertionHandler` variable. For example: - -```swift -class MyAssertionHandler : AssertionHandler { - func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) { - if (!assertion) { - print("Expectation failed: \(message.stringValue)") - } - } -} -``` -```swift -// Somewhere before you use any assertions -NimbleAssertionHandler = MyAssertionHandler() -``` - -2. Add a post-build action to fix an issue with the Swift XCTest support - library being unnecessarily copied into your app - * Edit your scheme in Xcode, and navigate to Build -> Post-actions - * Click the "+" icon and select "New Run Script Action" - * Open the "Provide build settings from" dropdown and select your target - * Enter the following script contents: -``` -rm "${SWIFT_STDLIB_TOOL_DESTINATION_DIR}/libswiftXCTest.dylib" -``` - -You can now use Nimble assertions in your code and handle failures as you see -fit. diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift deleted file mode 100644 index 196ee9a..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m deleted file mode 100644 index 8cf414f..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m +++ /dev/null @@ -1,37 +0,0 @@ -// -// 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)(void)) { - @try { - inBlock(); - } @catch (NSException *exception) { - if ([exception isKindOfClass:type]) { - return exception; - } else { - @throw; - } - } - return nil; -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h deleted file mode 100644 index ae48c23..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// 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)(void)); - diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m deleted file mode 100644 index 8183196..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h deleted file mode 100644 index 5755bfc..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h +++ /dev/null @@ -1,70 +0,0 @@ -// -// 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c deleted file mode 100644 index 733c564..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c +++ /dev/null @@ -1,537 +0,0 @@ -/* - * 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h deleted file mode 100644 index 52e53ae..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h +++ /dev/null @@ -1,321 +0,0 @@ -#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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift deleted file mode 100644 index 91e5d4d..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift deleted file mode 100644 index 6e84115..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift +++ /dev/null @@ -1,199 +0,0 @@ -// -// 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift deleted file mode 100644 index eb9bc19..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// CwlCatchBadInstructionPosix.swift -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 8/02/2016. -// 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 arch(x86_64) - - // This file is an alternative implementation to CwlCatchBadInstruction.swift that uses a SIGILL signal action and setenv/longjmp instead of a Mach exception handler and Objective-C exception raising. - // - // WARNING: - // This code is quick and dirty. It's a proof of concept for using a SIGILL handler and setjmp/longjmp where Mach exceptions and the Obj-C runtime aren't available. I ran the automated tests when I first wrote this code but I don't personally use it at all so by the time you're reading this comment, it probably broke and I didn't notice. - // Obvious limitations: - // * It doesn't work when debugging with lldb. - // * It doesn't scope correctly to the thread (it's global) - // * In violation of rules for signal handlers, it writes to the "red zone" on the stack - // * It isn't re-entrant - // * Plus all of the same caveats as the Mach exceptions version (doesn't play well with other handlers, probably leaks ARC memory, etc) - // Treat it like a loaded shotgun. Don't point it at your face. - - // This function is called from the signal handler to shut down the thread and return 1 (indicating a SIGILL was received). - private func callThreadExit() { - pthread_exit(UnsafeMutableRawPointer(bitPattern: 1)) - } - - // When called, this signal handler simulates a function call to `callThreadExit` - private func sigIllHandler(code: Int32, info: UnsafeMutablePointer<__siginfo>?, uap: UnsafeMutableRawPointer?) -> Void { - guard let context = uap?.assumingMemoryBound(to: ucontext64_t.self) else { return } - - // 1. Decrement the stack pointer - context.pointee.uc_mcontext64.pointee.__ss.__rsp -= __uint64_t(MemoryLayout.size) - - // 2. Save the old Instruction Pointer to the stack. - let rsp = context.pointee.uc_mcontext64.pointee.__ss.__rsp - if let ump = UnsafeMutablePointer<__uint64_t>(bitPattern: UInt(rsp)) { - ump.pointee = rsp - } - - // 3. Set the Instruction Pointer to the new function's address - var f: @convention(c) () -> Void = callThreadExit - withUnsafePointer(to: &f) { $0.withMemoryRebound(to: __uint64_t.self, capacity: 1) { ptr in - context.pointee.uc_mcontext64.pointee.__ss.__rip = ptr.pointee - } } - } - - /// Without Mach exceptions or the Objective-C runtime, there's nothing to put in the exception object. It's really just a boolean – either a SIGILL was caught or not. - public class BadInstructionException { - } - - /// Run the provided block. If a POSIX SIGILL is received, handle it and return a BadInstructionException (which is just an empty object in this POSIX signal version). 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 SIGILL is received, the block will be interrupted using a C `longjmp`. The risks associated with abrupt jumps apply here: most Swift functions are *not* interrupt-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 SIGILL is raised during the execution of `block` then a BadInstructionException will be returned, otherwise `nil`. - public func catchBadInstruction(block: @escaping () -> Void) -> BadInstructionException? { - // Construct the signal action - var sigActionPrev = sigaction() - let action = __sigaction_u(__sa_sigaction: sigIllHandler) - var sigActionNew = sigaction(__sigaction_u: action, sa_mask: sigset_t(), sa_flags: SA_SIGINFO) - - // Install the signal action - if sigaction(SIGILL, &sigActionNew, &sigActionPrev) != 0 { - fatalError("Sigaction error: \(errno)") - } - - defer { - // Restore the previous signal action - if sigaction(SIGILL, &sigActionPrev, nil) != 0 { - fatalError("Sigaction error: \(errno)") - } - } - - var b = block - let caught: Bool = withUnsafeMutablePointer(to: &b) { blockPtr in - // Run the block on its own thread - var handlerThread: pthread_t? = nil - let e = pthread_create(&handlerThread, nil, { arg in - (arg.assumingMemoryBound(to: (() -> Void).self).pointee)() - return nil - }, blockPtr) - precondition(e == 0, "Unable to create thread") - - // Wait for completion and get the result. It will be either `nil` or bitPattern 1 - var rawResult: UnsafeMutableRawPointer? = nil - let e2 = pthread_join(handlerThread!, &rawResult) - precondition(e2 == 0, "Thread join failed") - return Int(bitPattern: rawResult) != 0 - } - - return caught ? BadInstructionException() : nil - } - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift deleted file mode 100644 index 8d99d5e..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift +++ /dev/null @@ -1,55 +0,0 @@ -// -// 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h deleted file mode 100644 index f9dbedd..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h deleted file mode 100644 index 710afae..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Posix/CwlPreconditionTesting.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// 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[]; diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/README.md b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/README.md deleted file mode 100644 index a1a9a70..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# CwlPreconditionTesting - -A Mach exception handler, written in Swift and Objective-C, that allows `EXC_BAD_INSTRUCTION` (as raised by Swift's `assertionFailure`/`preconditionFailure`/`fatalError`) to be caught and tested. - -For an extended discussion of this code, please see the Cocoa with Love article: - -[Partial functions in Swift, Part 2: Catching precondition failures](http://cocoawithlove.com/blog/2016/02/02/partial-functions-part-two-catching-precondition-failures.html) - -## Usage - -The short version is: - -1. `git clone https://github.com/mattgallagher/CwlPreconditionTesting.git` -2. drag the "CwlPreconditionTesting.xcodeproj" file into your project's file tree in Xcode -3. go to your testing target's Build Phase settings and under "Target Dependencies" press the "+" button and select the relevant "CwlPreconditionTesting" target ("_iOS" or "_OSX", depending on your testing target's SDK) -4. write `import CwlPreconditionTesting` at the top of any test file where you want to use `catchBadInstruction` (Swift should handle the linkage automatically when you do this) -5. use the `catchBadInstruction` function as shown in the [CwlCatchBadInstructionTests.swift tests file](https://github.com/mattgallagher/CwlPreconditionTesting/blob/master/CwlPreconditionTestingTests/CwlCatchBadInstructionTests.swift?ts=4) - -### Project details - -The "CwlPreconditionTesting.xcodeproj" contains two targets: - -* CwlPreconditionTesting_OSX -* CwlPreconditionTesting_iOS - -both build a framework named "CwlPreconditionTesting.framework". If you're linking manually, be certain to select the "CwlPreconditionTesting.framework" from the appropriate target. - -Remember: the iOS build is useful only in the simulator. All Mach exception handling code will be conditionally excluded in any device build. - -### Static inclusion - -Due to the complications associated with needing to call into and out of Objective-C, static inclusion in other projects is not a single file nor a quick drag and drop. There's at least 7 files and you'll need to add some project settings. - -All of the following files: - -* CwlCatchBadInstruction.swift -* CwlCatchBadInstruction.h -* CwlCatchBadInstruction.m -* CwlCatchException.swift -* CwlCatchException.h -* CwlCatchException.m - -and either: - -* $(SDKROOT)/usr/include/mach/mach_exc.defs -* mach_excServer.c - -need to be added to the testing target for OS X projects or iOS projects, respectively. - -Your target will also need to have the following macros defined in the "Apple LLVM - Preprocessing" → "Preprocessor Macros" build setting: - - PRODUCT_NAME=$(PRODUCT_NAME) - -This lets the Objective-C file generate the include directive for the autogenerated Swift header so it can call back into Swift during the Mach exception handler callbacks. This macro should stay in sync if you change the target name but if you do anything else in your project that changes the name of the autogenerated Swift header independent of the target name (or you want to add spaces or other command-line complications to the target name), you'll want to update "CwlCatchBadInstruction.m" directly with the correct include directive. - -Additionally, you'll need a standard Objective-C "Bridging header" for your testing target and it will need to include the following import statements: - -``` -#if defined(__x86_64__) -#import -#endif - -#import -``` - -### Using POSIX signals and setjmp/longjmp - -For comparison or for anyone running this code on a platform without Mach exceptions or the Objective-C runtime, I've added a proof-of-concept implementation of `catchBadInstruction` that uses a POSIX SIGILL `sigaction` and `setjmp`/`longjmp` to perform the throw. - -In Xcode, you can simply select the CwlPreconditionTesting_POSIX target (instead of the OSX or iOS targets). If you're building without Xcode: all you need is the CwlCatchBadInstructionPOSIX.swift file (compared to the Mach exception handler, the code is tiny doesn't have any weird Objective-C/MiG file dependencies). - -**Warning No. 1**: on OS X, this approach can't be used when lldb is attached since lldb's Mach exception handler blocks the SIGILL from ever occurring (I've disabled the "Debug Executable" setting for the tests in Xcode - re-enable it to witness the problem). - -**Warning No. 2**: if you're switching between the CwlPreconditionTesting_OSX and CwlPreconditionTesting_POSIX targets, Xcode (as of Xcode 7.2.1) will not detect the change and will not remove the old framework correctly so you'll need to *clean your project* otherwise the old framework will hang around. - -Additional problems in decreasing severity include: - -* the signal handler is whole process (rather than correctly scoped to the thread where the "catch" occurs) -* the signal handler doesn't deal with re-entrancy whereas the mach exception handler remains deterministic in the face of multiple fatal errors -* the signal handler overwrites the "[red zone](https://en.wikipedia.org/wiki/Red_zone_(computing))" which is technically frowned upon in signal handlers (although unlikely to cause problems here) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift deleted file mode 100644 index 2e58fdf..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation - -/// Protocol for the assertion handler that Nimble uses for all expectations. -public protocol AssertionHandler { - func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) -} - -/// Global backing interface for assertions that Nimble creates. -/// Defaults to a private test handler that passes through to XCTest. -/// -/// If XCTest is not available, you must assign your own assertion handler -/// before using any matchers, otherwise Nimble will abort the program. -/// -/// @see AssertionHandler -public var NimbleAssertionHandler: AssertionHandler = { () -> AssertionHandler in - return isXCTestAvailable() ? NimbleXCTestHandler() : NimbleXCTestUnavailableHandler() -}() diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift deleted file mode 100644 index 94a9030..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift +++ /dev/null @@ -1,19 +0,0 @@ -/// AssertionDispatcher allows multiple AssertionHandlers to receive -/// assertion messages. -/// -/// @warning Does not fully dispatch if one of the handlers raises an exception. -/// This is possible with XCTest-based assertion handlers. -/// -public class AssertionDispatcher: AssertionHandler { - let handlers: [AssertionHandler] - - public init(handlers: [AssertionHandler]) { - self.handlers = handlers - } - - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - for handler in handlers { - handler.assert(assertion, message: message, location: location) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift deleted file mode 100644 index 740c392..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift +++ /dev/null @@ -1,100 +0,0 @@ -import Foundation - -/// A data structure that stores information about an assertion when -/// AssertionRecorder is set as the Nimble assertion handler. -/// -/// @see AssertionRecorder -/// @see AssertionHandler -public struct AssertionRecord: CustomStringConvertible { - /// Whether the assertion succeeded or failed - public let success: Bool - /// The failure message the assertion would display on failure. - public let message: FailureMessage - /// The source location the expectation occurred on. - public let location: SourceLocation - - public var description: String { - return "AssertionRecord { success=\(success), message='\(message.stringValue)', location=\(location) }" - } -} - -/// An AssertionHandler that silently records assertions that Nimble makes. -/// This is useful for testing failure messages for matchers. -/// -/// @see AssertionHandler -public class AssertionRecorder: AssertionHandler { - /// All the assertions that were captured by this recorder - public var assertions = [AssertionRecord]() - - public init() {} - - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - assertions.append( - AssertionRecord( - success: assertion, - message: message, - location: location)) - } -} - -/// Allows you to temporarily replace the current Nimble assertion handler with -/// the one provided for the scope of the closure. -/// -/// Once the closure finishes, then the original Nimble assertion handler is restored. -/// -/// @see AssertionHandler -public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler, closure: () throws -> Void) { - let environment = NimbleEnvironment.activeInstance - let oldRecorder = environment.assertionHandler - let capturer = NMBExceptionCapture(handler: nil, finally: ({ - environment.assertionHandler = oldRecorder - })) - environment.assertionHandler = tempAssertionHandler - capturer.tryBlock { - try! closure() - } -} - -/// Captures expectations that occur in the given closure. Note that all -/// expectations will still go through to the default Nimble handler. -/// -/// This can be useful if you want to gather information about expectations -/// that occur within a closure. -/// -/// @param silently expectations are no longer send to the default Nimble -/// assertion handler when this is true. Defaults to false. -/// -/// @see gatherFailingExpectations -public func gatherExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { - let previousRecorder = NimbleEnvironment.activeInstance.assertionHandler - let recorder = AssertionRecorder() - let handlers: [AssertionHandler] - - if silently { - handlers = [recorder] - } else { - handlers = [recorder, previousRecorder] - } - - let dispatcher = AssertionDispatcher(handlers: handlers) - withAssertionHandler(dispatcher, closure: closure) - return recorder.assertions -} - -/// Captures failed expectations that occur in the given closure. Note that all -/// expectations will still go through to the default Nimble handler. -/// -/// This can be useful if you want to gather information about failed -/// expectations that occur within a closure. -/// -/// @param silently expectations are no longer send to the default Nimble -/// assertion handler when this is true. Defaults to false. -/// -/// @see gatherExpectations -/// @see raiseException source for an example use case. -public func gatherFailingExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { - let assertions = gatherExpectations(silently: silently, closure: closure) - return assertions.filter { assertion in - !assertion.success - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift deleted file mode 100644 index 88d9406..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift +++ /dev/null @@ -1,187 +0,0 @@ -import Foundation - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - -private func from(objcPredicate: NMBPredicate) -> Predicate { - return Predicate { actualExpression in - let result = objcPredicate.satisfies(({ try! actualExpression.evaluate() }), - location: actualExpression.location) - return result.toSwift() - } -} - -internal struct ObjCMatcherWrapper: Matcher { - let matcher: NMBMatcher - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.matches( - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.doesNotMatch( - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) - } -} - -// Equivalent to Expectation, but for Nimble's Objective-C interface -public class NMBExpectation: NSObject { - internal let _actualBlock: () -> NSObject! - internal var _negative: Bool - internal let _file: FileString - internal let _line: UInt - internal var _timeout: TimeInterval = 1.0 - - @objc public init(actualBlock: @escaping () -> NSObject!, negative: Bool, file: FileString, line: UInt) { - self._actualBlock = actualBlock - self._negative = negative - self._file = file - self._line = line - } - - private var expectValue: Expectation { - return expect(_file, line: _line) { - self._actualBlock() as NSObject? - } - } - - @objc public var withTimeout: (TimeInterval) -> NMBExpectation { - return ({ timeout in self._timeout = timeout - return self - }) - } - - @objc public var to: (NMBMatcher) -> Void { - return ({ matcher in - if let pred = matcher as? NMBPredicate { - self.expectValue.to(from(objcPredicate: pred)) - } else { - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher)) - } - }) - } - - @objc public var toWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - if let pred = matcher as? NMBPredicate { - self.expectValue.to(from(objcPredicate: pred), description: description) - } else { - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher), description: description) - } - }) - } - - @objc public var toNot: (NMBMatcher) -> Void { - return ({ matcher in - if let pred = matcher as? NMBPredicate { - self.expectValue.toNot(from(objcPredicate: pred)) - } else { - self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher)) - } - }) - } - - @objc public var toNotWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - if let pred = matcher as? NMBPredicate { - self.expectValue.toNot(from(objcPredicate: pred), description: description) - } else { - self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher), description: description) - } - }) - } - - @objc public var notTo: (NMBMatcher) -> Void { return toNot } - - @objc public var notToWithDescription: (NMBMatcher, String) -> Void { return toNotWithDescription } - - @objc public var toEventually: (NMBMatcher) -> Void { - return ({ matcher in - 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 - ) - } - }) - } - - @objc public var toEventuallyWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - 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 - ) - } - }) - } - - @objc public var toEventuallyNot: (NMBMatcher) -> Void { - return ({ matcher in - 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 - ) - } - }) - } - - @objc public var toEventuallyNotWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - 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 - ) - } - }) - } - - @objc public var toNotEventually: (NMBMatcher) -> Void { - return toEventuallyNot - } - - @objc public var toNotEventuallyWithDescription: (NMBMatcher, String) -> Void { - return toEventuallyNotWithDescription - } - - @objc public class func failWithMessage(_ message: String, file: FileString, line: UInt) { - fail(message, location: SourceLocation(file: file, line: line)) - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift deleted file mode 100644 index 9ba2ffa..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift +++ /dev/null @@ -1,83 +0,0 @@ -import Foundation - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -// swiftlint:disable line_length -public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) -> Bool -public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) -> Bool -// swiftlint:enable line_length - -public class NMBObjCMatcher: NSObject, NMBMatcher { - let _match: MatcherBlock - let _doesNotMatch: MatcherBlock - let canMatchNil: Bool - - public init(canMatchNil: Bool, matcher: @escaping MatcherBlock, notMatcher: @escaping MatcherBlock) { - self.canMatchNil = canMatchNil - self._match = matcher - self._doesNotMatch = notMatcher - } - - public convenience init(matcher: @escaping MatcherBlock) { - self.init(canMatchNil: true, matcher: matcher) - } - - public convenience init(canMatchNil: Bool, matcher: @escaping MatcherBlock) { - self.init(canMatchNil: canMatchNil, matcher: matcher, notMatcher: ({ actualExpression, failureMessage in - return !matcher(actualExpression, failureMessage) - })) - } - - public convenience init(matcher: @escaping FullMatcherBlock) { - self.init(canMatchNil: true, matcher: matcher) - } - - public convenience init(canMatchNil: Bool, matcher: @escaping FullMatcherBlock) { - self.init(canMatchNil: canMatchNil, matcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, false) - }), notMatcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, true) - })) - } - - private func canMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - do { - if !canMatchNil { - if try actualExpression.evaluate() == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - return false - } - } - } catch let error { - failureMessage.actualValue = "an unexpected error thrown: \(error)" - return false - } - return true - } - - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let expr = Expression(expression: actualBlock, location: location) - let result = _match( - expr, - failureMessage) - if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { - return result - } else { - return false - } - } - - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let expr = Expression(expression: actualBlock, location: location) - let result = _doesNotMatch( - expr, - failureMessage) - if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { - return result - } else { - return false - } - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift deleted file mode 100644 index e1b5432..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Dispatch -import Foundation - -/// "Global" state of Nimble is stored here. Only DSL functions should access / be aware of this -/// class' existence -internal class NimbleEnvironment { - static var activeInstance: NimbleEnvironment { - get { - let env = Thread.current.threadDictionary["NimbleEnvironment"] - if let env = env as? NimbleEnvironment { - return env - } else { - let newEnv = NimbleEnvironment() - self.activeInstance = newEnv - return newEnv - } - } - set { - Thread.current.threadDictionary["NimbleEnvironment"] = newValue - } - } - - // TODO: eventually migrate the global to this environment value - var assertionHandler: AssertionHandler { - get { return NimbleAssertionHandler } - set { NimbleAssertionHandler = newValue } - } - - var suppressTVOSAssertionWarning: Bool = false - var awaiter: Awaiter - - init() { - let timeoutQueue: DispatchQueue - if #available(OSX 10.10, *) { - timeoutQueue = DispatchQueue.global(qos: .userInitiated) - } else { - timeoutQueue = DispatchQueue.global(priority: .high) - } - - awaiter = Awaiter( - waitLock: AssertionWaitLock(), - asyncQueue: .main, - timeoutQueue: timeoutQueue) - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift deleted file mode 100644 index 0ad8590..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift +++ /dev/null @@ -1,81 +0,0 @@ -import Foundation -import XCTest - -/// Default handler for Nimble. This assertion handler passes failures along to -/// XCTest. -public class NimbleXCTestHandler: AssertionHandler { - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - if !assertion { - recordFailure("\(message.stringValue)\n", location: location) - } - } -} - -/// Alternative handler for Nimble. This assertion handler passes failures along -/// to XCTest by attempting to reduce the failure message size. -public class NimbleShortXCTestHandler: AssertionHandler { - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - if !assertion { - let msg: String - if let actual = message.actualValue { - msg = "got: \(actual) \(message.postfixActual)" - } else { - msg = "expected \(message.to) \(message.postfixMessage)" - } - recordFailure("\(msg)\n", location: location) - } - } -} - -/// Fallback handler in case XCTest is unavailable. This assertion handler will abort -/// the program if it is invoked. -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 !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() - - private(set) var currentTestCase: XCTestCase? - - @objc func testCaseWillStart(_ testCase: XCTestCase) { - currentTestCase = testCase - } - - @objc func testCaseDidFinish(_ testCase: XCTestCase) { - currentTestCase = nil - } -} -#endif - -func isXCTestAvailable() -> Bool { -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - // XCTest is weakly linked and so may not be present - return NSClassFromString("XCTestCase") != nil -#else - return true -#endif -} - -private func recordFailure(_ message: String, location: SourceLocation) { -#if SWIFT_PACKAGE - XCTFail("\(message)", file: location.file, line: location.line) -#else - if let testCase = CurrentTestCaseTracker.sharedInstance.currentTestCase { - #if swift(>=4) - let line = Int(location.line) - #else - let line = location.line - #endif - testCase.recordFailure(withDescription: message, inFile: location.file, atLine: line, expected: true) - } else { - let msg = "Attempted to report a test failure to XCTest while no test case was running. " + - "The failure was:\n\"\(message)\"\nIt occurred at: \(location.file):\(location.line)" - NSException(name: .internalInconsistencyException, reason: msg, userInfo: nil).raise() - } -#endif -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift deleted file mode 100644 index 8f8d360..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) -// swift-corelibs-foundation doesn't provide NSException at all, so provide a dummy -class NSException {} -#endif - -// NOTE: This file is not intended to be included in the Xcode project. It -// is picked up by the Swift Package Manager during its build process. - -/// A dummy reimplementation of the `NMBExceptionCapture` class to serve -/// as a stand-in for build and runtime environments that don't support -/// Objective C. -internal class ExceptionCapture { - let finally: (() -> Void)? - - init(handler: ((NSException) -> Void)?, finally: (() -> Void)?) { - self.finally = finally - } - - func tryBlock(_ unsafeBlock: (() -> Void)) { - // We have no way of handling Objective C exceptions in Swift, - // so we just go ahead and run the unsafeBlock as-is - unsafeBlock() - - finally?() - } -} - -/// Compatibility with the actual Objective-C implementation -typealias NMBExceptionCapture = ExceptionCapture diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift deleted file mode 100644 index a84682f..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift +++ /dev/null @@ -1,116 +0,0 @@ -import Dispatch -import Foundation - -private enum ErrorResult { - case exception(NSException) - case error(Error) - case none -} - -/// Only classes, protocols, methods, properties, and subscript declarations can be -/// bridges to Objective-C via the @objc keyword. This class encapsulates callback-style -/// asynchronous waiting logic so that it may be called from Objective-C and Swift. -internal class NMBWait: NSObject { -// About these kind of lines, `@objc` attributes are only required for Objective-C -// support, so that should be conditional on Darwin platforms and normal Xcode builds -// (non-SwiftPM builds). -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objc - internal class func until( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) -> Void) { - return throwableUntil(timeout: timeout, file: file, line: line) { done in - action(done) - } - } -#else - internal class func until( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) -> Void) { - return throwableUntil(timeout: timeout, file: file, line: line) { done in - action(done) - } - } -#endif - - // Using a throwable closure makes this method not objc compatible. - internal class func throwableUntil( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) throws -> Void) { - let awaiter = NimbleEnvironment.activeInstance.awaiter - let leeway = timeout / 2.0 - // swiftlint:disable:next line_length - let result = awaiter.performBlock(file: file, line: line) { (done: @escaping (ErrorResult) -> Void) throws -> Void in - DispatchQueue.main.async { - let capture = NMBExceptionCapture( - handler: ({ exception in - done(.exception(exception)) - }), - finally: ({ }) - ) - capture.tryBlock { - do { - try action { - done(.none) - } - } catch let e { - done(.error(e)) - } - } - } - }.timeout(timeout, forcefullyAbortTimeout: leeway).wait("waitUntil(...)", file: file, line: line) - - switch result { - case .incomplete: internalError("Reached .incomplete state for waitUntil(...).") - case .blockedRunLoop: - fail(blockedRunLoopErrorMessageFor("-waitUntil()", leeway: leeway), - file: file, line: line) - case .timedOut: - let pluralize = (timeout == 1 ? "" : "s") - fail("Waited more than \(timeout) second\(pluralize)", file: file, line: line) - case let .raisedException(exception): - fail("Unexpected exception raised: \(exception)") - case let .errorThrown(error): - fail("Unexpected error thrown: \(error)") - case .completed(.exception(let exception)): - fail("Unexpected exception raised: \(exception)") - case .completed(.error(let error)): - fail("Unexpected error thrown: \(error)") - case .completed(.none): // success - break - } - } - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objc(untilFile:line:action:) - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) { - until(timeout: 1, file: file, line: line, action: action) - } -#else - 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 { - // swiftlint:disable:next line_length - return "\(fnName) timed out but was unable to run the timeout handler because the main thread is unresponsive (\(leeway) seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." -} - -/// Wait asynchronously until the done closure is called or the timeout has been reached. -/// -/// @discussion -/// Call the done() closure to indicate the waiting has completed. -/// -/// 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) { - NMBWait.until(timeout: timeout, file: file, line: line, action: action) -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift deleted file mode 100644 index e49bb0c..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation - -/// Make an expectation on a given actual value. The value given is lazily evaluated. -public func expect(_ expression: @autoclosure @escaping () throws -> T?, file: FileString = #file, line: UInt = #line) -> Expectation { - return Expectation( - expression: Expression( - expression: expression, - location: SourceLocation(file: file, line: line), - isClosure: true)) -} - -/// Make an expectation on a given actual value. The closure is lazily invoked. -public func expect(_ file: FileString = #file, line: UInt = #line, expression: @escaping () throws -> T?) -> Expectation { - return Expectation( - expression: Expression( - expression: expression, - location: SourceLocation(file: file, line: line), - isClosure: true)) -} - -/// Always fails the test with a message and a specified location. -public func fail(_ message: String, location: SourceLocation) { - let handler = NimbleEnvironment.activeInstance.assertionHandler - handler.assert(false, message: FailureMessage(stringValue: message), location: location) -} - -/// Always fails the test with a message. -public func fail(_ message: String, file: FileString = #file, line: UInt = #line) { - fail(message, location: SourceLocation(file: file, line: line)) -} - -/// Always fails the test. -public func fail(_ file: FileString = #file, line: UInt = #line) { - fail("fail() always fails", file: file, line: line) -} - -/// Like Swift's precondition(), but raises NSExceptions instead of sigaborts -internal func nimblePrecondition( - _ expr: @autoclosure() -> Bool, - _ name: @autoclosure() -> String, - _ message: @autoclosure() -> String, - file: StaticString = #file, - line: UInt = #line) { - let result = expr() - if !result { -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let e = NSException( - name: NSExceptionName(name()), - reason: message(), - userInfo: nil) - e.raise() -#else - preconditionFailure("\(name()) - \(message())", file: file, line: line) -#endif - } -} - -internal func internalError(_ msg: String, file: FileString = #file, line: UInt = #line) -> Never { - fatalError( - "Nimble Bug Found: \(msg) at \(file):\(line).\n" + - "Please file a bug to Nimble: https://github.com/Quick/Nimble/issues with the " + - "code snippet that caused this error." - ) -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift deleted file mode 100644 index e3f616a..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift +++ /dev/null @@ -1,132 +0,0 @@ -import Foundation - -// Deprecated -internal func expressionMatches(_ expression: Expression, matcher: U, to: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T { - let msg = FailureMessage() - msg.userDescription = description - msg.to = to - do { - let pass = try matcher.matches(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" - } - return (pass, msg) - } catch let 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 { - let msg = FailureMessage() - msg.userDescription = description - msg.to = toNot - do { - let pass = try matcher.doesNotMatch(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" - } - return (pass, msg) - } catch let 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 - - public func verify(_ pass: Bool, _ message: FailureMessage) { - let handler = NimbleEnvironment.activeInstance.assertionHandler - handler.assert(pass, message: message, location: expression.location) - } - - ////////////////// OLD API ///////////////////// - - /// DEPRECATED: Tests the actual value using a matcher to match. - public func to(_ matcher: U, description: String? = nil) - where U: Matcher, U.ValueType == T { - let (pass, msg) = expressionMatches(expression, matcher: matcher, to: "to", description: description) - verify(pass, msg) - } - - /// DEPRECATED: Tests the actual value using a matcher to not match. - public func toNot(_ matcher: U, description: String? = nil) - where U: Matcher, U.ValueType == T { - // swiftlint:disable:next line_length - let (pass, msg) = expressionDoesNotMatch(expression, matcher: matcher, toNot: "to not", description: description) - verify(pass, msg) - } - - /// 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 { - 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/ExpectationMessage.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/ExpectationMessage.swift deleted file mode 100644 index 992ee0e..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/ExpectationMessage.swift +++ /dev/null @@ -1,262 +0,0 @@ -import Foundation - -public indirect enum ExpectationMessage { - // --- Primary Expectations --- - /// includes actual value in output ("expected to , got ") - case expectedActualValueTo(/* message: */ String) - /// uses a custom actual value string in output ("expected to , got ") - case expectedCustomValueTo(/* message: */ String, /* actual: */ String) - /// excludes actual value in output ("expected to ") - case expectedTo(/* message: */ String) - /// allows any free-form message ("") - case fail(/* message: */ String) - - // --- Composite Expectations --- - // Generally, you'll want the methods, appended(message:) and appended(details:) instead. - - /// Not Fully Implemented Yet. - case prepends(/* Prepended Message */ String, ExpectationMessage) - - /// appends after an existing message (" (use beNil() to match nils)") - case appends(ExpectationMessage, /* Appended Message */ String) - - /// provides long-form multi-line explainations ("\n\n") - case details(ExpectationMessage, String) - - internal var sampleMessage: String { - let asStr = toString(actual: "", expected: "expected", to: "to") - let asFailureMessage = FailureMessage() - update(failureMessage: asFailureMessage) - // swiftlint:disable:next line_length - return "(toString(actual:expected:to:) -> \(asStr) || update(failureMessage:) -> \(asFailureMessage.stringValue))" - } - - /// Returns the smallest message after the "expected to" string that summarizes the error. - /// - /// Returns the message part from ExpectationMessage, ignoring all .appends and .details. - public var expectedMessage: String { - switch self { - case let .fail(msg): - return msg - case let .expectedTo(msg): - return msg - case let .expectedActualValueTo(msg): - return msg - case let .expectedCustomValueTo(msg, _): - return msg - case let .prepends(_, expectation): - return expectation.expectedMessage - case let .appends(expectation, msg): - return "\(expectation.expectedMessage)\(msg)" - case let .details(expectation, _): - return expectation.expectedMessage - } - } - - /// Appends a message after the primary expectation message - public func appended(message: String) -> ExpectationMessage { - switch self { - case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo, .appends, .prepends: - return .appends(self, message) - case let .details(expectation, msg): - return .details(expectation.appended(message: message), msg) - } - } - - /// Appends a message hinting to use beNil() for when the actual value given was nil. - public func appendedBeNilHint() -> ExpectationMessage { - return appended(message: " (use beNil() to match nils)") - } - - /// Appends a detailed (aka - multiline) message after the primary expectation message - /// Detailed messages will be placed after .appended(message:) calls. - public func appended(details: String) -> ExpectationMessage { - return .details(self, details) - } - - internal func visitLeafs(_ f: (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage { - switch self { - case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo: - return f(self) - case let .prepends(msg, expectation): - return .prepends(msg, expectation.visitLeafs(f)) - case let .appends(expectation, msg): - return .appends(expectation.visitLeafs(f), msg) - case let .details(expectation, msg): - return .details(expectation.visitLeafs(f), msg) - } - } - - /// Replaces a primary expectation with one returned by f. Preserves all composite expectations - /// that were built upon it (aka - all appended(message:) and appended(details:). - public func replacedExpectation(_ f: @escaping (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage { - func walk(_ msg: ExpectationMessage) -> ExpectationMessage { - switch msg { - case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo: - return f(msg) - default: - return msg - } - } - return visitLeafs(walk) - } - - /// Wraps a primary expectation with text before and after it. - /// Alias to prepended(message: before).appended(message: after) - public func wrappedExpectation(before: String, after: String) -> ExpectationMessage { - return prepended(expectation: before).appended(message: after) - } - - /// Prepends a message by modifying the primary expectation - public func prepended(expectation message: String) -> ExpectationMessage { - func walk(_ msg: ExpectationMessage) -> ExpectationMessage { - switch msg { - case let .expectedTo(msg): - return .expectedTo(message + msg) - case let .expectedActualValueTo(msg): - return .expectedActualValueTo(message + msg) - case let .expectedCustomValueTo(msg, actual): - return .expectedCustomValueTo(message + msg, actual) - default: - return msg.visitLeafs(walk) - } - } - return visitLeafs(walk) - } - - // TODO: test & verify correct behavior - internal func prepended(message: String) -> ExpectationMessage { - return .prepends(message, self) - } - - /// Converts the tree of ExpectationMessages into a final built string. - public func toString(actual: String, expected: String = "expected", to: String = "to") -> String { - switch self { - case let .fail(msg): - return msg - case let .expectedTo(msg): - return "\(expected) \(to) \(msg)" - case let .expectedActualValueTo(msg): - return "\(expected) \(to) \(msg), got \(actual)" - case let .expectedCustomValueTo(msg, actual): - return "\(expected) \(to) \(msg), got \(actual)" - case let .prepends(msg, expectation): - return "\(msg)\(expectation.toString(actual: actual, expected: expected, to: to))" - case let .appends(expectation, msg): - return "\(expectation.toString(actual: actual, expected: expected, to: to))\(msg)" - case let .details(expectation, msg): - return "\(expectation.toString(actual: actual, expected: expected, to: to))\n\n\(msg)" - } - } - - // Backwards compatibility: converts ExpectationMessage tree to FailureMessage - internal func update(failureMessage: FailureMessage) { - switch self { - case let .fail(msg): - 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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -public class NMBExpectationMessage: NSObject { - private let msg: ExpectationMessage - - internal init(swift msg: ExpectationMessage) { - self.msg = msg - } - - public init(expectedTo message: String) { - self.msg = .expectedTo(message) - } - public init(expectedActualValueTo message: String) { - self.msg = .expectedActualValueTo(message) - } - - public init(expectedActualValueTo message: String, customActualValue actual: String) { - self.msg = .expectedCustomValueTo(message, actual) - } - - public init(fail message: String) { - self.msg = .fail(message) - } - - public init(prepend message: String, child: NMBExpectationMessage) { - self.msg = .prepends(message, child.msg) - } - - public init(appendedMessage message: String, child: NMBExpectationMessage) { - self.msg = .appends(child.msg, message) - } - - public init(prependedMessage message: String, child: NMBExpectationMessage) { - self.msg = .prepends(message, child.msg) - } - - public init(details message: String, child: NMBExpectationMessage) { - self.msg = .details(child.msg, message) - } - - public func appendedBeNilHint() -> NMBExpectationMessage { - return NMBExpectationMessage(swift: msg.appendedBeNilHint()) - } - - public func toSwift() -> ExpectationMessage { return self.msg } -} - -extension ExpectationMessage { - func toObjectiveC() -> NMBExpectationMessage { - return NMBExpectationMessage(swift: self) - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift deleted file mode 100644 index 5a233fd..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift +++ /dev/null @@ -1,99 +0,0 @@ -import Foundation - -// Memoizes the given closure, only calling the passed -// closure once; even if repeat calls to the returned closure -internal func memoizedClosure(_ closure: @escaping () throws -> T) -> (Bool) throws -> T { - var cache: T? - return ({ withoutCaching in - if withoutCaching || cache == nil { - cache = try closure() - } - return cache! - }) -} - -/// Expression represents the closure of the value inside expect(...). -/// Expressions are memoized by default. This makes them safe to call -/// evaluate() multiple times without causing a re-evaluation of the underlying -/// closure. -/// -/// @warning Since the closure can be any code, Objective-C code may choose -/// to raise an exception. Currently, Expression does not memoize -/// exception raising. -/// -/// This provides a common consumable API for matchers to utilize to allow -/// Nimble to change internals to how the captured closure is managed. -public struct Expression { - internal let _expression: (Bool) throws -> T? - internal let _withoutCaching: Bool - public let location: SourceLocation - public let isClosure: Bool - - /// Creates a new expression struct. Normally, expect(...) will manage this - /// creation process. The expression is memoized. - /// - /// @param expression The closure that produces a given value. - /// @param location The source location that this closure originates from. - /// @param isClosure A bool indicating if the captured expression is a - /// closure or internally produced closure. Some matchers - /// may require closures. For example, toEventually() - /// requires an explicit closure. This gives Nimble - /// flexibility if @autoclosure behavior changes between - /// Swift versions. Nimble internals always sets this true. - public init(expression: @escaping () throws -> T?, location: SourceLocation, isClosure: Bool = true) { - self._expression = memoizedClosure(expression) - self.location = location - self._withoutCaching = false - self.isClosure = isClosure - } - - /// Creates a new expression struct. Normally, expect(...) will manage this - /// creation process. - /// - /// @param expression The closure that produces a given value. - /// @param location The source location that this closure originates from. - /// @param withoutCaching Indicates if the struct should memoize the given - /// closure's result. Subsequent evaluate() calls will - /// not call the given closure if this is true. - /// @param isClosure A bool indicating if the captured expression is a - /// closure or internally produced closure. Some matchers - /// may require closures. For example, toEventually() - /// requires an explicit closure. This gives Nimble - /// flexibility if @autoclosure behavior changes between - /// Swift versions. Nimble internals always sets this true. - public init(memoizedExpression: @escaping (Bool) throws -> T?, location: SourceLocation, withoutCaching: Bool, isClosure: Bool = true) { - self._expression = memoizedExpression - self.location = location - self._withoutCaching = withoutCaching - self.isClosure = isClosure - } - - /// Returns a new Expression from the given expression. Identical to a map() - /// on this type. This should be used only to typecast the Expression's - /// closure value. - /// - /// The returned expression will preserve location and isClosure. - /// - /// @param block The block that can cast the current Expression value to a - /// new type. - public func cast(_ block: @escaping (T?) throws -> U?) -> Expression { - return Expression( - expression: ({ try block(self.evaluate()) }), - location: self.location, - isClosure: self.isClosure - ) - } - - public func evaluate() throws -> T? { - return try self._expression(_withoutCaching) - } - - public func withoutCaching() -> Expression { - return Expression( - memoizedExpression: self._expression, - location: location, - withoutCaching: true, - isClosure: isClosure - ) - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/FailureMessage.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/FailureMessage.swift deleted file mode 100644 index 2bc57eb..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/FailureMessage.swift +++ /dev/null @@ -1,92 +0,0 @@ -import Foundation - -/// Encapsulates the failure message that matchers can report to the end user. -/// -/// This is shared state between Nimble and matchers that mutate this value. -public class FailureMessage: NSObject { - public var expected: String = "expected" - public var actualValue: String? = "" // empty string -> use default; nil -> exclude - public var to: String = "to" - public var postfixMessage: String = "match" - public var postfixActual: String = "" - /// 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? - public var userDescription: String? - - public var stringValue: String { - get { - if let value = _stringValueOverride { - return value - } else { - return computeStringValue() - } - } - set { - _stringValueOverride = newValue - } - } - - internal var _stringValueOverride: String? - internal var hasOverriddenStringValue: Bool { - return _stringValueOverride != nil - } - - public override init() { - } - - public init(stringValue: String) { - _stringValueOverride = stringValue - } - - internal func stripNewlines(_ str: String) -> String { - let whitespaces = CharacterSet.whitespacesAndNewlines - return str - .components(separatedBy: "\n") - .map { line in line.trimmingCharacters(in: whitespaces) } - .joined(separator: "") - } - - internal func computeStringValue() -> String { - var value = "\(expected) \(to) \(postfixMessage)" - if let actualValue = actualValue { - value = "\(expected) \(to) \(postfixMessage), got \(actualValue)\(postfixActual)" - } - value = stripNewlines(value) - - if let extendedMessage = extendedMessage { - value += "\n\(stripNewlines(extendedMessage))" - } - - 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Info.plist b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Info.plist deleted file mode 100644 index 6ac80b8..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSHumanReadableCopyright - Copyright © 2014 Jeff Hui. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift deleted file mode 100644 index 8affa62..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift +++ /dev/null @@ -1,121 +0,0 @@ -import Foundation - -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?) 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(_ elementMatcher: M) -> Predicate - where S: Sequence, M: Matcher, S.Iterator.Element == M.ValueType { - return createPredicate(elementMatcher.predicate) -} - -public func allPass(_ elementPredicate: Predicate) -> Predicate - where S: Sequence { - return createPredicate(elementPredicate) -} - -private func 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) - 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) - } - } - failure = failure.replacedExpectation({ expectation in - return .expectedTo(expectation.expectedMessage) - }) - return PredicateResult(status: .matches, message: failure) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc 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 { - var generator = NSFastEnumerationIterator(value) - while let obj = generator.next() { - if let nsObject = obj as? NSObject { - nsObjects.append(nsObject) - } else { - collectionIsUsable = false - break - } - } - } else { - collectionIsUsable = false - } - - if !collectionIsUsable { - return NMBPredicateResult( - status: NMBPredicateStatus.fail, - message: NMBExpectationMessage( - // swiftlint:disable:next line_length - fail: "allPass can only be used with types which implement NSFastEnumeration (NSArray, NSSet, ...), and whose elements subclass NSObject, got <\(actualValue?.description ?? "nil")>" - ) - ) - } - - let expr = Expression(expression: ({ nsObjects }), location: location) - let 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() - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift deleted file mode 100644 index 3cba8b0..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift +++ /dev/null @@ -1,236 +0,0 @@ -import Foundation - -/// If you are running on a slower machine, it could be useful to increase the default timeout value -/// or slow down poll interval. Default timeout interval is 1, and poll interval is 0.01. -public struct AsyncDefaults { - public static var Timeout: TimeInterval = 1 - public static var PollInterval: TimeInterval = 0.01 -} - -private func async(style: ExpectationStyle, predicate: Predicate, timeout: TimeInterval, poll: TimeInterval, fnName: String) -> Predicate { - return Predicate { actualExpression in - let uncachedExpression = actualExpression.withoutCaching() - let fnName = "expect(...).\(fnName)(...)" - var lastPredicateResult: PredicateResult? - let result = pollBlock( - pollInterval: poll, - timeoutInterval: timeout, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: fnName) { - lastPredicateResult = try predicate.satisfies(uncachedExpression) - return lastPredicateResult!.toBoolean(expectation: style) - } - switch result { - case .completed: return lastPredicateResult! - case .timedOut: 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: - // swiftlint:disable:next line_length - 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 { - let fullMatcher: U - let timeoutInterval: TimeInterval - let pollInterval: TimeInterval - - init(fullMatcher: U, timeoutInterval: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval) { - self.fullMatcher = fullMatcher - self.timeoutInterval = timeoutInterval - self.pollInterval = pollInterval - } - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let fnName = "expect(...).toEventually(...)" - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: fnName) { - try self.fullMatcher.matches(uncachedExpression, failureMessage: failureMessage) - } - switch result { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.stringValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventually(...).") - } - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: "expect(...).toEventuallyNot(...)") { - try self.fullMatcher.doesNotMatch(uncachedExpression, failureMessage: failureMessage) - } - switch result { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.stringValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventuallyNot(...).") - } - } -} - -private let toEventuallyRequiresClosureError = FailureMessage( - // swiftlint:disable:next line_length - stringValue: "expect(...).toEventually(...) requires an explicit closure (eg - expect { ... }.toEventually(...) )\nSwift 1.2 @autoclosure behavior has changed in an incompatible way for Nimble to function" -) - -extension Expectation { - /// Tests the actual value using a matcher to match by checking continuously - /// at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { - nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) - - let (pass, msg) = execute( - expression, - .toMatch, - async(style: .toMatch, predicate: predicate, timeout: timeout, poll: pollInterval, fnName: "toEventually"), - to: "to eventually", - description: description, - captureExceptions: false - ) - verify(pass, msg) - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventuallyNot(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { - nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) - - let (pass, msg) = execute( - expression, - .toNotMatch, - async( - style: .toNotMatch, - predicate: predicate, - timeout: timeout, - poll: pollInterval, - fnName: "toEventuallyNot" - ), - to: "to eventually not", - description: description, - captureExceptions: false - ) - verify(pass, msg) - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// Alias of toEventuallyNot() - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toNotEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { - return toEventuallyNot(predicate, timeout: timeout, pollInterval: pollInterval, description: description) - } -} - -// Deprecated -extension Expectation { - /// Tests the actual value using a matcher to match by checking continuously - /// at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T { - if expression.isClosure { - let (pass, msg) = expressionMatches( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - to: "to eventually", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventuallyNot(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T { - if expression.isClosure { - let (pass, msg) = expressionDoesNotMatch( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - toNot: "to eventually not", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// Alias of toEventuallyNot() - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toNotEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T { - return toEventuallyNot(matcher, timeout: timeout, pollInterval: pollInterval, description: description) - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift deleted file mode 100644 index 5674525..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Foundation - -private func matcherMessage(forType expectedType: T.Type) -> String { - return "be a kind of \(String(describing: expectedType))" -} -private func matcherMessage(forClass expectedClass: AnyClass) -> String { - return "be a kind of \(String(describing: expectedClass))" -} - -/// A Nimble matcher that succeeds when the actual value is an instance of the given class. -public func beAKindOf(_ expectedType: T.Type) -> 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>" - ) - - return PredicateResult( - bool: validInstance is T, - message: message - ) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -/// A Nimble matcher that succeeds when the actual value is an instance of the given class. -/// @see beAnInstanceOf if you want to match against the exact class -public func beAKindOf(_ expectedClass: AnyClass) -> Predicate { - return Predicate.define { actualExpression in - let message: ExpectationMessage - let status: PredicateStatus - - let instance = try actualExpression.evaluate() - if let validInstance = instance { - status = PredicateStatus(bool: instance != nil && instance!.isKind(of: expectedClass)) - message = .expectedCustomValueTo( - matcherMessage(forClass: expectedClass), - "<\(String(describing: type(of: validInstance))) instance>" - ) - } else { - status = .fail - message = .expectedCustomValueTo( - matcherMessage(forClass: expectedClass), - "" - ) - } - - return PredicateResult(status: status, message: message) - } -} - -extension NMBObjCMatcher { - @objc public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAKindOf(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift deleted file mode 100644 index 70c5661..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is an _exact_ instance of the given class. -public func beAnInstanceOf(_ expectedType: T.Type) -> 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) -> 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 { - actualString = "<\(String(describing: type(of: validInstance))) instance>" - } else { - actualString = "" - } - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let matches = instance != nil && instance!.isMember(of: expectedClass) - #else - let matches = instance != nil && type(of: instance!) == expectedClass - #endif - return PredicateResult( - status: PredicateStatus(bool: matches), - message: .expectedCustomValueTo(errorMessage, actualString) - ) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAnInstanceOf(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift deleted file mode 100644 index dfb4e28..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift +++ /dev/null @@ -1,126 +0,0 @@ -import Foundation - -public let DefaultDelta = 0.0001 - -internal func isCloseTo(_ actualValue: NMBDoubleConvertible?, - expectedValue: NMBDoubleConvertible, - delta: Double) - -> PredicateResult { - let errorMessage = "be close to <\(stringify(expectedValue))> (within \(stringify(delta)))" - return PredicateResult( - bool: actualValue != nil && - abs(actualValue!.doubleValue - expectedValue.doubleValue) < delta, - message: .expectedCustomValueTo(errorMessage, "<\(stringify(actualValue))>") - ) -} - -/// A Nimble matcher that succeeds when a value is close to another. This is used for floating -/// point values which can have imprecise results when doing arithmetic on them. -/// -/// @see equal -public func beCloseTo(_ expectedValue: Double, within delta: Double = DefaultDelta) -> Predicate { - return Predicate.define { actualExpression in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta) - } -} - -/// 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: NMBDoubleConvertible, within delta: Double = DefaultDelta) -> Predicate { - return Predicate.define { actualExpression in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { - var _expected: NSNumber - var _delta: CDouble - init(expected: NSNumber, within: CDouble) { - _expected = expected - _delta = within - } - - @objc public func matches(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.matches(expr, failureMessage: failureMessage) - } - - @objc public func doesNotMatch(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.doesNotMatch(expr, failureMessage: failureMessage) - } - - @objc public var within: (CDouble) -> NMBObjCBeCloseToMatcher { - return ({ delta in - return NMBObjCBeCloseToMatcher(expected: self._expected, within: delta) - }) - } -} - -extension NMBObjCMatcher { - @objc public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToMatcher { - return NMBObjCBeCloseToMatcher(expected: expected, within: within) - } -} -#endif - -public func beCloseTo(_ expectedValues: [Double], within delta: Double = DefaultDelta) -> 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() { - if actual.count != expectedValues.count { - return .doesNotMatch - } else { - for (index, actualItem) in actual.enumerated() { - if fabs(actualItem - expectedValues[index]) > delta { - return .doesNotMatch - } - } - return .matches - } - } - return .doesNotMatch - } -} - -// MARK: - Operators - -infix operator ≈ : ComparisonPrecedence - -public func ≈(lhs: Expectation<[Double]>, rhs: [Double]) { - lhs.to(beCloseTo(rhs)) -} - -public func ≈(lhs: Expectation, rhs: NMBDoubleConvertible) { - lhs.to(beCloseTo(rhs)) -} - -public func ≈(lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) -} - -public func == (lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) -} - -// make this higher precedence than exponents so the Doubles either end aren't pulled in -// unexpectantly -precedencegroup PlusMinusOperatorPrecedence { - higherThan: BitwiseShiftPrecedence -} - -infix operator ± : PlusMinusOperatorPrecedence -public func ±(lhs: NMBDoubleConvertible, rhs: Double) -> (expected: NMBDoubleConvertible, delta: Double) { - return (expected: lhs, delta: rhs) -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift deleted file mode 100644 index 3cbc15d..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift +++ /dev/null @@ -1,95 +0,0 @@ -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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualSeq = try actualExpression.evaluate() - if actualSeq == nil { - return .fail - } - var generator = actualSeq!.makeIterator() - 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualString = try actualExpression.evaluate() - 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualString = try actualExpression.evaluate() - return PredicateStatus(bool: actualString == nil || actualString!.length == 0) - } -} - -// Without specific overrides, beEmpty() is ambiguous for NSDictionary, NSArray, -// etc, since they conform to Sequence as well as NMBCollection. - -/// 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualDictionary = try actualExpression.evaluate() - 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actualArray = try actualExpression.evaluate() - 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() -> Predicate { - return Predicate.simple("be empty") { actualExpression in - let actual = try actualExpression.evaluate() - return PredicateStatus(bool: actual == nil || actual!.count == 0) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beEmptyMatcher() -> NMBPredicate { - return NMBPredicate { actualExpression in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - - if let value = actualValue as? NMBCollection { - let expr = Expression(expression: ({ value as NMBCollection }), location: location) - 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().satisfies(expr).toObjectiveC() - } else if let actualValue = actualValue { - // swiftlint:disable:next line_length - let badTypeErrorMsg = "be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings)" - return NMBPredicateResult( - status: NMBPredicateStatus.fail, - message: NMBExpectationMessage( - expectedActualValueTo: badTypeErrorMsg, - customActualValue: "\(String(describing: type(of: actualValue))) type" - ) - ) - } - return NMBPredicateResult( - status: NMBPredicateStatus.fail, - message: NMBExpectationMessage(expectedActualValueTo: "be empty").appendedBeNilHint() - ) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift deleted file mode 100644 index 8717f97..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift +++ /dev/null @@ -1,42 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is greater than the expected value. -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 PredicateStatus(bool: actual > expected) - } - return .fail - } -} - -/// A Nimble matcher that succeeds when the actual value is greater than the expected value. -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?) { - lhs.to(beGreaterThan(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThan(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift deleted file mode 100644 index 55d8e7b..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift +++ /dev/null @@ -1,44 +0,0 @@ -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?) -> 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?) -> 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) { - lhs.to(beGreaterThanOrEqualTo(rhs)) -} - -public func >=(lhs: Expectation, rhs: T) { - lhs.to(beGreaterThanOrEqualTo(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift deleted file mode 100644 index ad19def..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift +++ /dev/null @@ -1,46 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is the same instance -/// as the expected instance. -public func beIdenticalTo(_ expected: Any?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - #if os(Linux) - let actual = try actualExpression.evaluate() as? AnyObject - #else - let actual = try actualExpression.evaluate() as AnyObject? - #endif - failureMessage.actualValue = "\(identityAsString(actual))" - failureMessage.postfixMessage = "be identical to \(identityAsString(expected))" - #if os(Linux) - return actual === (expected as? AnyObject) && actual !== nil - #else - return actual === (expected as AnyObject?) && actual !== nil - #endif - }.requireNonNil -} - -public func === (lhs: Expectation, rhs: Any?) { - lhs.to(beIdenticalTo(rhs)) -} -public func !== (lhs: Expectation, rhs: Any?) { - lhs.toNot(beIdenticalTo(rhs)) -} - -/// A Nimble matcher that succeeds when the actual value is the same instance -/// as the expected instance. -/// -/// Alias for "beIdenticalTo". -public func be(_ expected: Any?) -> Predicate { - return beIdenticalTo(expected) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let aExpr = actualExpression.cast { $0 as Any? } - return try! beIdenticalTo(expected).matches(aExpr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift deleted file mode 100644 index 8047efd..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift +++ /dev/null @@ -1,41 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is less than the expected value. -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?) -> 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?) { - lhs.to(beLessThan(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThan(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift deleted file mode 100644 index 098a852..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift +++ /dev/null @@ -1,42 +0,0 @@ -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?) -> 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?) -> 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) { - lhs.to(beLessThanOrEqualTo(rhs)) -} - -public func <=(lhs: Expectation, rhs: T) { - lhs.to(beLessThanOrEqualTo(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil:false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift deleted file mode 100644 index 2b18b4c..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift +++ /dev/null @@ -1,167 +0,0 @@ -import Foundation - -extension Int8: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int8Value - } -} - -extension UInt8: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint8Value - } -} - -extension Int16: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int16Value - } -} - -extension UInt16: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint16Value - } -} - -extension Int32: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int32Value - } -} - -extension UInt32: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint32Value - } -} - -extension Int64: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int64Value - } -} - -extension UInt64: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint64Value - } -} - -extension Float: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).floatValue - } -} - -extension Double: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).doubleValue - } -} - -extension Int: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).intValue - } -} - -extension UInt: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uintValue - } -} - -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() -> 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() -> 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() -> 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. - // See: - // - https://bugs.swift.org/browse/SR-2290 - // - https://github.com/norio-nomura/Nimble/pull/5#issuecomment-237835873 - if let number = actualValue as? NSNumber { - return PredicateStatus(bool: number.boolValue == true) - } - - return PredicateStatus(bool: actualValue == (true as T)) - } - 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() -> 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. - // See: - // - https://bugs.swift.org/browse/SR-2290 - // - https://github.com/norio-nomura/Nimble/pull/5#issuecomment-237835873 - if let number = actualValue as? NSNumber { - return PredicateStatus(bool: number.boolValue == false) - } - - return PredicateStatus(bool: actualValue == (false as T)) - } - return PredicateStatus(bool: actualValue == nil) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beTruthyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTruthy().matches(expr, failureMessage: failureMessage) - } - } - - @objc public class func beFalsyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalsy().matches(expr, failureMessage: failureMessage) - } - } - - @objc public class func beTrueMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTrue().matches(expr, failureMessage: failureMessage) - } - } - - @objc public class func beFalseMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalse().matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift deleted file mode 100644 index a22e0f4..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is nil. -public func beNil() -> Predicate { - return Predicate.simpleNilable("be nil") { actualExpression in - let actualValue = try actualExpression.evaluate() - return PredicateStatus(bool: actualValue == nil) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - return try! beNil().matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift deleted file mode 100644 index f5bf22a..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is Void. -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: ()) { - lhs.to(beVoid()) -} - -public func != (lhs: Expectation<()>, rhs: ()) { - lhs.toNot(beVoid()) -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift deleted file mode 100644 index c2ab568..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift +++ /dev/null @@ -1,60 +0,0 @@ -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) -> 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 PredicateStatus(bool: actualGenerator.next() == startingElement) - } - 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) -> 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 .fail - } - #else - let collectionValue = collection.object(at: 0) as AnyObject - #endif - 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) -> Predicate { - return Predicate.simple("begin with <\(startingSubstring)>") { actualExpression in - if let actual = try actualExpression.evaluate() { - let range = actual.range(of: startingSubstring) - return PredicateStatus(bool: range != nil && range!.lowerBound == actual.startIndex) - } - return .fail - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func beginWithMatcher(_ expected: Any) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = try! actualExpression.evaluate() - if (actual as? String) != nil { - let expr = actualExpression.cast { $0 as? String } - return try! beginWith(expected as! String).matches(expr, failureMessage: failureMessage) - } else { - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! beginWith(expected).matches(expr, failureMessage: failureMessage) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift deleted file mode 100644 index f1afb72..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift +++ /dev/null @@ -1,95 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual sequence contains the expected value. -public func contain(_ items: T...) -> Predicate - where S.Iterator.Element == T { - return contain(items) -} - -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 { - return actual.contains($0) - } - } - return false - }.requireNonNil -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: String...) -> Predicate { - return contain(substrings) -} - -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 { - let range = actual.range(of: $0) - return range != nil && !range!.isEmpty - } - } - return false - }.requireNonNil -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: NSString...) -> Predicate { - return contain(substrings) -} - -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?...) -> Predicate { - return contain(items) -} - -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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func containMatcher(_ expected: [NSObject]) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - if let value = actualValue as? NMBContainer { - let expr = Expression(expression: ({ value as NMBContainer }), location: location) - - // A straightforward cast on the array causes this to crash, so we have to cast the individual items - let expectedOptionals: [Any?] = expected.map({ $0 as Any? }) - return try! contain(expectedOptionals).matches(expr, failureMessage: failureMessage) - } else if let value = actualValue as? NSString { - let expr = Expression(expression: ({ value as String }), location: location) - return try! contain(expected as! [String]).matches(expr, failureMessage: failureMessage) - } else if actualValue != nil { - // swiftlint:disable:next line_length - failureMessage.postfixMessage = "contain <\(arrayAsString(expected))> (only works for NSArrays, NSSets, NSHashTables, and NSStrings)" - } else { - failureMessage.postfixMessage = "contain <\(arrayAsString(expected))>" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift deleted file mode 100644 index ae0d854..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift +++ /dev/null @@ -1,60 +0,0 @@ -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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - extension NMBObjCMatcher { - @objc 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 { - // swiftlint:disable:next line_length - 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift deleted file mode 100644 index a6f9f91..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift +++ /dev/null @@ -1,72 +0,0 @@ -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) -> Predicate - where S.Iterator.Element == T { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingElement)>" - - if let actualValue = try actualExpression.evaluate() { - var actualGenerator = actualValue.makeIterator() - var lastItem: T? - var item: T? - repeat { - 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) -> 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 } - #if os(Linux) - guard let collectionValue = collection.object(at: collection.count - 1) as? NSObject else { - return false - } - #else - let collectionValue = collection.object(at: collection.count - 1) as AnyObject - #endif - - return collectionValue.isEqual(endingElement) - }.requireNonNil -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring -/// where the expected substring's location is the actual string's length minus the -/// expected substring's length. -public func endWith(_ endingSubstring: String) -> 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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func endWithMatcher(_ expected: Any) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = try! actualExpression.evaluate() - if (actual as? String) != nil { - let expr = actualExpression.cast { $0 as? String } - return try! endWith(expected as! String).matches(expr, failureMessage: failureMessage) - } else { - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! endWith(expected).matches(expr, failureMessage: failureMessage) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift deleted file mode 100644 index 9467154..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift +++ /dev/null @@ -1,220 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is equal to the expected value. -/// 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?) -> 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(status: PredicateStatus(bool: matches), message: msg) - } -} - -/// A Nimble matcher that succeeds when the actual value is equal to the expected value. -/// 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]?) -> 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 && actualValue != nil { - return PredicateResult( - status: .fail, - message: msg.appendedBeNilHint() - ) - } - return PredicateResult(status: .fail, message: msg) - } - 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]?) -> Predicate<[T]> { - return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in - let actualValue = try actualExpression.evaluate() - 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: expectedValue! == actualValue!, - message: msg - ) - } -} - -/// A Nimble matcher allowing comparison of collection with optional type -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 doesNotMatch - } - - for (index, item) in actualValue.enumerated() { - let otherItem = expectedValue[index] - if item == nil && otherItem == nil { - continue - } else if item == nil && otherItem != nil { - return doesNotMatch - } else if item != nil && otherItem == nil { - return doesNotMatch - } else if item! != otherItem! { - return doesNotMatch - } - } - - return PredicateResult( - status: .matches, - message: msg - ) - } else { - return PredicateResult( - status: .fail, - message: msg.appendedBeNilHint() - ) - } - } -} - -/// A Nimble matcher that succeeds when the actual set is equal to the expected set. -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?) -> Predicate> { - return equal(expectedValue, stringify: { - if let set = $0 { - return stringify(Array(set).sorted { $0 < $1 }) - } else { - return "nil" - } - }) -} - -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() { - errorMessage = .expectedCustomValueTo( - "equal <\(stringify(expectedValue))>", - "<\(stringify(actualValue))>" - ) - - if expectedValue == actualValue { - return PredicateResult( - status: .matches, - message: errorMessage - ) - } - - let missing = expectedValue.subtracting(actualValue) - if missing.count > 0 { - errorMessage = errorMessage.appended(message: ", missing <\(stringify(missing))>") - } - - let extra = actualValue.subtracting(expectedValue) - if extra.count > 0 { - errorMessage = errorMessage.appended(message: ", extra <\(stringify(extra))>") - } - return PredicateResult( - status: .doesNotMatch, - message: errorMessage - ) - } - return PredicateResult( - status: .fail, - message: errorMessage.appendedBeNilHint() - ) - } else { - return PredicateResult( - status: .fail, - message: errorMessage.appendedBeNilHint() - ) - } - } -} - -public func ==(lhs: Expectation, rhs: T?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation, rhs: T?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation<[T]>, rhs: [T]?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation<[T]>, rhs: [T]?) { - lhs.toNot(equal(rhs)) -} - -public func == (lhs: Expectation>, rhs: Set?) { - lhs.to(equal(rhs)) -} - -public func != (lhs: Expectation>, rhs: Set?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation>, rhs: Set?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation>, rhs: Set?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation<[T: C]>, rhs: [T: C]?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { - lhs.toNot(equal(rhs)) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! equal(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift deleted file mode 100644 index 93335a8..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation - -// The `haveCount` matchers do not print the full string representation of the collection value, -// instead they only print the type name and the expected count. This makes it easier to understand -// the reason for failed expectations. See: https://github.com/Quick/Nimble/issues/308. -// The representation of the collection content is provided in a new line as an `extendedMessage`. - -/// A Nimble matcher that succeeds when the actual Collection's count equals -/// the expected value -public func haveCount(_ expectedValue: T.IndexDistance) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - if let actualValue = try actualExpression.evaluate() { - // swiftlint:disable:next line_length - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" - let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result - } else { - return false - } - }.requireNonNil -} - -/// A Nimble matcher that succeeds when the actual collection's count equals -/// the expected value -public func haveCount(_ expectedValue: Int) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - if let actualValue = try actualExpression.evaluate() { - // swiftlint:disable:next line_length - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" - let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result - } else { - return false - } - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func haveCountMatcher(_ expected: NSNumber) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - if let value = actualValue as? NMBCollection { - let expr = Expression(expression: ({ value as NMBCollection}), location: location) - return try! haveCount(expected.intValue).matches(expr, failureMessage: failureMessage) - } else if let actualValue = actualValue { - failureMessage.postfixMessage = "get type of NSArray, NSSet, NSDictionary, or NSHashTable" - failureMessage.actualValue = "\(String(describing: type(of: actualValue)))" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift deleted file mode 100644 index 1e5762f..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual string satisfies the regular expression -/// described by the expected string. -public func match(_ expectedValue: String?) -> 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 - } - } - - return false - }.requireNonNil -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -extension NMBObjCMatcher { - @objc public class func matchMatcher(_ expected: NSString) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = actualExpression.cast { $0 as? String } - return try! match(expected.description).matches(actual, failureMessage: failureMessage) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift deleted file mode 100644 index 9c86fb7..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift +++ /dev/null @@ -1,58 +0,0 @@ -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) -> 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 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) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() - - setFailureMessageForError( - failureMessage, - postfixMessageVerb: "match", - actualError: actualError, - errorType: errorType - ) - var matches = false - if actualError as? T != nil { - matches = true - } - return matches - }.requireNonNil -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift deleted file mode 100644 index abcafa9..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift +++ /dev/null @@ -1,85 +0,0 @@ -/// 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 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 - - public init(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) { - self.matcher = matcher - } - - public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - return try matcher(actualExpression, failureMessage) - } - - 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) - } -} - -/// 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. -/// This applies regardless of using to() or toNot(). -/// -/// 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 NonNilMatcherFunc: Matcher { - public let matcher: (Expression, FailureMessage) throws -> Bool - - public init(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) { - self.matcher = matcher - } - - public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - let pass = try matcher(actualExpression, failureMessage) - if try attachNilErrorIfNeeded(actualExpression, failureMessage: failureMessage) { - return false - } - return pass - } - - public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - let pass = try !matcher(actualExpression, failureMessage) - if try attachNilErrorIfNeeded(actualExpression, failureMessage: failureMessage) { - return false - } - return pass - } - - internal func attachNilErrorIfNeeded(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - if try actualExpression.evaluate() == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - return true - } - 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift deleted file mode 100644 index fff3c77..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift +++ /dev/null @@ -1,154 +0,0 @@ -import Foundation -// `CGFloat` is in Foundation (swift-corelibs-foundation) on Linux. -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - import CoreGraphics -#endif - -/// Implement this protocol to implement a custom matcher for Swift -@available(*, deprecated, message: "Use Predicate instead") -public protocol Matcher { - associatedtype ValueType - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool -} - -extension Matcher { - var predicate: Predicate { - return Predicate.fromDeprecatedMatcher(self) - } - - var toClosure: (Expression, FailureMessage, Bool) throws -> Bool { - return ({ expr, msg, expectedResult in - if expectedResult { - return try self.matches(expr, failureMessage: msg) - } else { - return try self.doesNotMatch(expr, failureMessage: msg) - } - }) - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -/// Objective-C interface to the Swift variant of Matcher. -@objc public protocol NMBMatcher { - func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool - func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool -} -#endif - -/// Protocol for types that support contain() matcher. -public protocol NMBContainer { - func contains(_ anObject: Any) -> Bool -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -// FIXME: NSHashTable can not conform to NMBContainer since swift-DEVELOPMENT-SNAPSHOT-2016-04-25-a -//extension NSHashTable : NMBContainer {} // Corelibs Foundation does not include this class yet -#endif - -extension NSArray : NMBContainer {} -extension NSSet : NMBContainer {} - -/// Protocol for types that support only beEmpty(), haveCount() matchers -public protocol NMBCollection { - var count: Int { get } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NSHashTable : NMBCollection {} // Corelibs Foundation does not include these classes yet -extension NSMapTable : NMBCollection {} -#endif - -extension NSSet : NMBCollection {} -extension NSIndexSet : NMBCollection {} -extension NSDictionary : NMBCollection {} - -/// Protocol for types that support beginWith(), endWith(), beEmpty() matchers -public protocol NMBOrderedCollection: NMBCollection { - func object(at index: Int) -> Any -} - -extension NSArray : NMBOrderedCollection {} - -public protocol NMBDoubleConvertible { - var doubleValue: CDouble { get } -} - -extension Double : NMBDoubleConvertible { - public var doubleValue: CDouble { - return self - } -} - -extension Float : NMBDoubleConvertible { - public var doubleValue: CDouble { - return CDouble(self) - } -} - -extension CGFloat: NMBDoubleConvertible { - public var doubleValue: CDouble { - return CDouble(self) - } -} - -extension NSNumber : NMBDoubleConvertible { -} - -private let dateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSS" - formatter.locale = Locale(identifier: "en_US_POSIX") - - return formatter -}() - -extension Date: NMBDoubleConvertible { - public var doubleValue: CDouble { - return self.timeIntervalSinceReferenceDate - } -} - -extension NSDate: NMBDoubleConvertible { - public var doubleValue: CDouble { - return self.timeIntervalSinceReferenceDate - } -} - -extension Date: TestOutputStringConvertible { - public var testDescription: String { - return dateFormatter.string(from: self) - } -} - -extension NSDate: TestOutputStringConvertible { - public var testDescription: String { - return dateFormatter.string(from: Date(timeIntervalSinceReferenceDate: self.timeIntervalSinceReferenceDate)) - } -} - -/// Protocol for types to support beLessThan(), beLessThanOrEqualTo(), -/// beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers. -/// -/// Types that conform to Swift's Comparable protocol will work implicitly too -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -@objc public protocol NMBComparable { - func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult -} -#else -// This should become obsolete once Corelibs Foundation adds Comparable conformance to NSNumber -public protocol NMBComparable { - func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult -} -#endif - -extension NSNumber : NMBComparable { - public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { - return compare(otherObject as! NSNumber) - } -} -extension NSString : NMBComparable { - public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { - return compare(otherObject as! String) - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift deleted file mode 100644 index 8288bb0..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Foundation - -internal class NotificationCollector { - private(set) var observedNotifications: [Notification] - private let notificationCenter: NotificationCenter - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - private var token: AnyObject? - #else - private var token: NSObjectProtocol? - #endif - - required init(notificationCenter: NotificationCenter) { - self.notificationCenter = notificationCenter - self.observedNotifications = [] - } - - func startObserving() { - self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil) { [weak self] n in - // linux-swift gets confused by .append(n) - self?.observedNotifications.append(n) - } - } - - deinit { - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - if let token = self.token { - self.notificationCenter.removeObserver(token) - } - #else - if let token = self.token as? AnyObject { - self.notificationCenter.removeObserver(token) - } - #endif - } -} - -private let mainThread = pthread_self() - -public func postNotifications( - _ notificationsMatcher: T, - fromNotificationCenter center: NotificationCenter = .default) - -> Predicate - where T: Matcher, T.ValueType == [Notification] -{ - _ = mainThread // Force lazy-loading of this value - let collector = NotificationCollector(notificationCenter: center) - collector.startObserving() - var once: Bool = false - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - let collectorNotificationsExpression = Expression(memoizedExpression: { _ in - return collector.observedNotifications - }, location: actualExpression.location, withoutCaching: true) - - assert(pthread_equal(mainThread, pthread_self()) != 0, "Only expecting closure to be evaluated on main thread.") - if !once { - once = true - _ = try actualExpression.evaluate() - } - - let match = try notificationsMatcher.matches(collectorNotificationsExpression, failureMessage: failureMessage) - if collector.observedNotifications.isEmpty { - failureMessage.actualValue = "no notifications" - } else { - failureMessage.actualValue = "<\(stringify(collector.observedNotifications))>" - } - return match - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Predicate.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Predicate.swift deleted file mode 100644 index e48d164..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Predicate.swift +++ /dev/null @@ -1,348 +0,0 @@ -// 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 os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift deleted file mode 100644 index 60553bd..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift +++ /dev/null @@ -1,198 +0,0 @@ -import Foundation - -// This matcher requires the Objective-C, and being built by Xcode rather than the Swift Package Manager -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - -/// A Nimble matcher that succeeds when the actual expression raises an -/// exception with the specified name, reason, and/or userInfo. -/// -/// Alternatively, you can pass a closure to do any arbitrary custom matching -/// to the raised exception. The closure only gets called when an exception -/// is raised. -/// -/// nil arguments indicates that the matcher should not attempt to match against -/// that parameter. -public func raiseException( - named: String? = nil, - reason: String? = nil, - userInfo: NSDictionary? = nil, - closure: ((NSException) -> Void)? = nil) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - - var exception: NSException? - let capture = NMBExceptionCapture(handler: ({ e in - exception = e - }), finally: nil) - - capture.tryBlock { - _ = try! actualExpression.evaluate() - return - } - - setFailureMessageForException( - failureMessage, - exception: exception, - named: named, - reason: reason, - userInfo: userInfo, - closure: closure - ) - return exceptionMatchesNonNilFieldsOrClosure( - exception, - named: named, - reason: reason, - userInfo: userInfo, - closure: closure - ) - } -} - -// swiftlint:disable:next function_parameter_count -internal func setFailureMessageForException( - _ failureMessage: FailureMessage, - exception: NSException?, - named: String?, - reason: String?, - userInfo: NSDictionary?, - closure: ((NSException) -> Void)?) { - failureMessage.postfixMessage = "raise exception" - - if let named = named { - failureMessage.postfixMessage += " with name <\(named)>" - } - if let reason = reason { - failureMessage.postfixMessage += " with reason <\(reason)>" - } - if let userInfo = userInfo { - failureMessage.postfixMessage += " with userInfo <\(userInfo)>" - } - if closure != nil { - failureMessage.postfixMessage += " that satisfies block" - } - if named == nil && reason == nil && userInfo == nil && closure == nil { - failureMessage.postfixMessage = "raise any exception" - } - - if let exception = exception { - // swiftlint:disable:next line_length - failureMessage.actualValue = "\(String(describing: type(of: exception))) { name=\(exception.name), reason='\(stringify(exception.reason))', userInfo=\(stringify(exception.userInfo)) }" - } else { - failureMessage.actualValue = "no exception" - } -} - -internal func exceptionMatchesNonNilFieldsOrClosure( - _ exception: NSException?, - named: String?, - reason: String?, - userInfo: NSDictionary?, - closure: ((NSException) -> Void)?) -> Bool { - var matches = false - - if let exception = exception { - matches = true - - if let named = named, exception.name.rawValue != named { - matches = false - } - if reason != nil && exception.reason != reason { - matches = false - } - if let userInfo = userInfo, let exceptionUserInfo = exception.userInfo, - (exceptionUserInfo as NSDictionary) != userInfo { - matches = false - } - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(exception) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - - return matches -} - -public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { - internal var _name: String? - internal var _reason: String? - internal var _userInfo: NSDictionary? - internal var _block: ((NSException) -> Void)? - - internal init(name: String?, reason: String?, userInfo: NSDictionary?, block: ((NSException) -> Void)?) { - _name = name - _reason = reason - _userInfo = userInfo - _block = block - } - - @objc public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let block: () -> Any? = ({ _ = actualBlock(); return nil }) - let expr = Expression(expression: block, location: location) - - return try! raiseException( - named: _name, - reason: _reason, - userInfo: _userInfo, - closure: _block - ).matches(expr, failureMessage: failureMessage) - } - - @objc public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - return !matches(actualBlock, failureMessage: failureMessage, location: location) - } - - @objc public var named: (_ name: String) -> NMBObjCRaiseExceptionMatcher { - return ({ name in - return NMBObjCRaiseExceptionMatcher( - name: name, - reason: self._reason, - userInfo: self._userInfo, - block: self._block - ) - }) - } - - @objc public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionMatcher { - return ({ reason in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: reason, - userInfo: self._userInfo, - block: self._block - ) - }) - } - - @objc public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionMatcher { - return ({ userInfo in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, - userInfo: userInfo, - block: self._block - ) - }) - } - - @objc public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionMatcher { - return ({ block in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, - userInfo: self._userInfo, - block: block - ) - }) - } -} - -extension NMBObjCMatcher { - @objc public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionMatcher { - return NMBObjCRaiseExceptionMatcher(name: nil, reason: nil, userInfo: nil, block: nil) - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift deleted file mode 100644 index d02a0ff..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift +++ /dev/null @@ -1,109 +0,0 @@ -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...) -> Predicate - where U: Matcher, U.ValueType == T { - return satisfyAnyOf(matchers) -} - -/// 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)}")) - } - - failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "\(actualValue)" - } - - 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: 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) -> Predicate { - return satisfyAnyOf(left, right) -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NMBObjCMatcher { - @objc public class func satisfyAnyOfMatcher(_ matchers: [NMBMatcher]) -> NMBPredicate { - return NMBPredicate { actualExpression in - if matchers.isEmpty { - return NMBPredicateResult( - status: NMBPredicateStatus.fail, - message: NMBExpectationMessage( - fail: "satisfyAnyOf must be called with at least one matcher" - ) - ) - } - - var elementEvaluators = [Predicate]() - for matcher in matchers { - let elementEvaluator = Predicate { expression in - if let predicate = matcher as? NMBPredicate { - // swiftlint:disable:next line_length - return predicate.satisfies({ try! expression.evaluate() }, location: actualExpression.location).toSwift() - } else { - let failureMessage = FailureMessage() - // swiftlint:disable:next line_length - let success = matcher.matches({ try! expression.evaluate() }, failureMessage: failureMessage, location: actualExpression.location) - return PredicateResult(bool: success, message: failureMessage.toExpectationMessage()) - } - } - - elementEvaluators.append(elementEvaluator) - } - - return try! satisfyAnyOf(elementEvaluators).satisfies(actualExpression).toObjectiveC() - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift deleted file mode 100644 index a530c60..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation - -public func throwAssertion() -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - #if arch(x86_64) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !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 (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) conditional statement") - // swiftlint:disable:previous line_length - #endif - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift deleted file mode 100644 index 872ca5c..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift +++ /dev/null @@ -1,258 +0,0 @@ -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. -/// -/// Errors are tried to be compared by their implementation of Equatable, -/// otherwise they fallback to comparision by _domain and _code. -/// -/// Alternatively, you can pass a closure to do any arbitrary custom matching -/// to the thrown error. The closure only gets called when an error was thrown. -/// -/// nil arguments indicates that the matcher should not attempt to match against -/// that parameter. -public func throwError( - errorType: T.Type, - closure: ((T) -> Void)? = nil) -> Predicate { - return Predicate.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 - } - } - } - } - - 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 -/// error or when the passed closures' arbitrary custom matching succeeds. -/// -/// This duplication to it's generic adequate is required to allow to receive -/// values of the existential type `Error` in the closure. -/// -/// The closure only gets called when an error was thrown. -public func throwError(closure: @escaping ((T) -> Void)) -> Predicate { - return Predicate.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 - } - } - return matches - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ToSucceed.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ToSucceed.swift deleted file mode 100644 index 01369bb..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ToSucceed.swift +++ /dev/null @@ -1,37 +0,0 @@ -/** - 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/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h deleted file mode 100644 index bd45c5d..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import "NMBExceptionCapture.h" -#import "NMBStringify.h" -#import "DSL.h" - -#import "CwlPreconditionTesting.h" - -FOUNDATION_EXPORT double NimbleVersionNumber; -FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Async.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Async.swift deleted file mode 100644 index c77a8fc..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Async.swift +++ /dev/null @@ -1,377 +0,0 @@ -import CoreFoundation -import Dispatch -import Foundation - -#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) - import CDispatch -#endif - -private let timeoutLeeway = DispatchTimeInterval.milliseconds(1) -private let pollLeeway = DispatchTimeInterval.milliseconds(1) - -/// Stores debugging information about callers -internal struct WaitingInfo: CustomStringConvertible { - let name: String - let file: FileString - let lineNumber: UInt - - var description: String { - return "\(name) at \(file):\(lineNumber)" - } -} - -internal protocol WaitLock { - func acquireWaitingLock(_ fnName: String, file: FileString, line: UInt) - func releaseWaitingLock() - func isWaitingLocked() -> Bool -} - -internal class AssertionWaitLock: WaitLock { - private var currentWaiter: WaitingInfo? - init() { } - - func acquireWaitingLock(_ fnName: String, file: FileString, line: UInt) { - let info = WaitingInfo(name: fnName, file: file, lineNumber: line) - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let isMainThread = Thread.isMainThread - #else - let isMainThread = _CFIsMainThread() - #endif - nimblePrecondition( - isMainThread, - "InvalidNimbleAPIUsage", - "\(fnName) can only run on the main thread." - ) - nimblePrecondition( - currentWaiter == nil, - "InvalidNimbleAPIUsage", - "Nested async expectations are not allowed to avoid creating flaky tests.\n\n" + - "The call to\n\t\(info)\n" + - "triggered this exception because\n\t\(currentWaiter!)\n" + - "is currently managing the main run loop." - ) - currentWaiter = info - } - - func isWaitingLocked() -> Bool { - return currentWaiter != nil - } - - func releaseWaitingLock() { - currentWaiter = nil - } -} - -internal enum AwaitResult { - /// Incomplete indicates None (aka - this value hasn't been fulfilled yet) - case incomplete - /// TimedOut indicates the result reached its defined timeout limit before returning - case timedOut - /// BlockedRunLoop indicates the main runloop is too busy processing other blocks to trigger - /// the timeout code. - /// - /// This may also mean the async code waiting upon may have never actually ran within the - /// required time because other timers & sources are running on the main run loop. - case blockedRunLoop - /// The async block successfully executed and returned a given result - case completed(T) - /// When a Swift Error is thrown - case errorThrown(Error) - /// When an Objective-C Exception is raised - case raisedException(NSException) - - func isIncomplete() -> Bool { - switch self { - case .incomplete: return true - default: return false - } - } - - func isCompleted() -> Bool { - switch self { - case .completed: return true - default: return false - } - } -} - -/// Holds the resulting value from an asynchronous expectation. -/// This class is thread-safe at receiving an "response" to this promise. -internal class AwaitPromise { - private(set) internal var asyncResult: AwaitResult = .incomplete - private var signal: DispatchSemaphore - - init() { - signal = DispatchSemaphore(value: 1) - } - - deinit { - signal.signal() - } - - /// Resolves the promise with the given result if it has not been resolved. Repeated calls to - /// this method will resolve in a no-op. - /// - /// @returns a Bool that indicates if the async result was accepted or rejected because another - /// value was received first. - func resolveResult(_ result: AwaitResult) -> Bool { - if signal.wait(timeout: .now()) == .success { - self.asyncResult = result - return true - } else { - return false - } - } -} - -internal struct AwaitTrigger { - let timeoutSource: DispatchSourceTimer - let actionSource: DispatchSourceTimer? - let start: () throws -> Void -} - -/// Factory for building fully configured AwaitPromises and waiting for their results. -/// -/// This factory stores all the state for an async expectation so that Await doesn't -/// doesn't have to manage it. -internal class AwaitPromiseBuilder { - let awaiter: Awaiter - let waitLock: WaitLock - let trigger: AwaitTrigger - let promise: AwaitPromise - - internal init( - awaiter: Awaiter, - waitLock: WaitLock, - promise: AwaitPromise, - trigger: AwaitTrigger) { - self.awaiter = awaiter - self.waitLock = waitLock - self.promise = promise - self.trigger = trigger - } - - func timeout(_ timeoutInterval: TimeInterval, forcefullyAbortTimeout: TimeInterval) -> Self { - // = Discussion = - // - // There's a lot of technical decisions here that is useful to elaborate on. This is - // definitely more lower-level than the previous NSRunLoop based implementation. - // - // - // Why Dispatch Source? - // - // - // We're using a dispatch source to have better control of the run loop behavior. - // A timer source gives us deferred-timing control without having to rely as much on - // a run loop's traditional dispatching machinery (eg - NSTimers, DefaultRunLoopMode, etc.) - // which is ripe for getting corrupted by application code. - // - // And unlike dispatch_async(), we can control how likely our code gets prioritized to - // executed (see leeway parameter) + DISPATCH_TIMER_STRICT. - // - // This timer is assumed to run on the HIGH priority queue to ensure it maintains the - // highest priority over normal application / test code when possible. - // - // - // Run Loop Management - // - // In order to properly interrupt the waiting behavior performed by this factory class, - // this timer stops the main run loop to tell the waiter code that the result should be - // checked. - // - // In addition, stopping the run loop is used to halt code executed on the main run loop. - #if swift(>=4.0) - trigger.timeoutSource.schedule( - deadline: DispatchTime.now() + timeoutInterval, - repeating: .never, - leeway: timeoutLeeway - ) - #else - trigger.timeoutSource.scheduleOneshot( - deadline: DispatchTime.now() + timeoutInterval, - leeway: timeoutLeeway - ) - #endif - trigger.timeoutSource.setEventHandler { - guard self.promise.asyncResult.isIncomplete() else { return } - let timedOutSem = DispatchSemaphore(value: 0) - let semTimedOutOrBlocked = DispatchSemaphore(value: 0) - semTimedOutOrBlocked.signal() - let runLoop = CFRunLoopGetMain() - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let runLoopMode = CFRunLoopMode.defaultMode.rawValue - #else - let runLoopMode = kCFRunLoopDefaultMode - #endif - CFRunLoopPerformBlock(runLoop, runLoopMode) { - if semTimedOutOrBlocked.wait(timeout: .now()) == .success { - timedOutSem.signal() - semTimedOutOrBlocked.signal() - if self.promise.resolveResult(.timedOut) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - // potentially interrupt blocking code on run loop to let timeout code run - CFRunLoopStop(runLoop) - let now = DispatchTime.now() + forcefullyAbortTimeout - let didNotTimeOut = timedOutSem.wait(timeout: now) != .success - let timeoutWasNotTriggered = semTimedOutOrBlocked.wait(timeout: .now()) == .success - if didNotTimeOut && timeoutWasNotTriggered { - if self.promise.resolveResult(.blockedRunLoop) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - return self - } - - /// Blocks for an asynchronous result. - /// - /// @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 undesirable behavior. - /// - /// This method will return an AwaitResult in the following cases: - /// - /// - The main run loop is blocked by other operations and the async expectation cannot be - /// be stopped. - /// - The async expectation timed out - /// - The async expectation succeeded - /// - The async expectation raised an unexpected exception (objc) - /// - The async expectation raised an unexpected error (swift) - /// - /// The returned AwaitResult will NEVER be .incomplete. - func wait(_ fnName: String = #function, file: FileString = #file, line: UInt = #line) -> AwaitResult { - waitLock.acquireWaitingLock( - fnName, - file: file, - line: line) - - let capture = NMBExceptionCapture(handler: ({ exception in - _ = self.promise.resolveResult(.raisedException(exception)) - }), finally: ({ - self.waitLock.releaseWaitingLock() - })) - capture.tryBlock { - do { - try self.trigger.start() - } catch let error { - _ = self.promise.resolveResult(.errorThrown(error)) - } - 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) - } - - self.trigger.timeoutSource.cancel() - if let asyncSource = self.trigger.actionSource { - asyncSource.cancel() - } - } - - return promise.asyncResult - } -} - -internal class Awaiter { - let waitLock: WaitLock - let timeoutQueue: DispatchQueue - let asyncQueue: DispatchQueue - - internal init( - waitLock: WaitLock, - asyncQueue: DispatchQueue, - timeoutQueue: DispatchQueue) { - self.waitLock = waitLock - self.asyncQueue = asyncQueue - self.timeoutQueue = timeoutQueue - } - - private func createTimerSource(_ queue: DispatchQueue) -> DispatchSourceTimer { - return DispatchSource.makeTimerSource(flags: .strict, queue: queue) - } - - func performBlock( - file: FileString, - line: UInt, - _ closure: @escaping (@escaping (T) -> Void) throws -> Void - ) -> AwaitPromiseBuilder { - let promise = AwaitPromise() - let timeoutSource = createTimerSource(timeoutQueue) - var completionCount = 0 - let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: nil) { - try closure { - completionCount += 1 - 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) - } - } - } - - return AwaitPromiseBuilder( - awaiter: self, - waitLock: waitLock, - promise: promise, - trigger: trigger) - } - - func poll(_ pollInterval: TimeInterval, closure: @escaping () throws -> T?) -> AwaitPromiseBuilder { - let promise = AwaitPromise() - let timeoutSource = createTimerSource(timeoutQueue) - let asyncSource = createTimerSource(asyncQueue) - let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: asyncSource) { - let interval = DispatchTimeInterval.nanoseconds(Int(pollInterval * TimeInterval(NSEC_PER_SEC))) - #if swift(>=4.0) - asyncSource.schedule(deadline: .now(), repeating: interval, leeway: pollLeeway) - #else - asyncSource.scheduleRepeating(deadline: .now(), interval: interval, leeway: pollLeeway) - #endif - asyncSource.setEventHandler { - do { - if let result = try closure() { - if promise.resolveResult(.completed(result)) { - CFRunLoopStop(CFRunLoopGetCurrent()) - } - } - } catch let error { - if promise.resolveResult(.errorThrown(error)) { - CFRunLoopStop(CFRunLoopGetCurrent()) - } - } - } - asyncSource.resume() - } - - return AwaitPromiseBuilder( - awaiter: self, - waitLock: waitLock, - promise: promise, - trigger: trigger) - } -} - -internal func pollBlock( - pollInterval: TimeInterval, - timeoutInterval: TimeInterval, - file: FileString, - line: UInt, - fnName: String = #function, - expression: @escaping () throws -> Bool) -> AwaitResult { - let awaiter = NimbleEnvironment.activeInstance.awaiter - let result = awaiter.poll(pollInterval) { () throws -> Bool? in - if try expression() { - return true - } - return nil - }.timeout(timeoutInterval, forcefullyAbortTimeout: timeoutInterval / 2.0).wait(fnName, file: file, line: line) - - return result -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift deleted file mode 100644 index 074cb20..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation - -// Generic - -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, - postfixMessageVerb: String = "throw", - actualError: Error?, - error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) { - failureMessage.postfixMessage = "\(postfixMessageVerb) error" - - if let error = error { - failureMessage.postfixMessage += " <\(error)>" - } else if errorType != nil || closure != nil { - failureMessage.postfixMessage += " from type <\(T.self)>" - } - if closure != nil { - failureMessage.postfixMessage += " that satisfies block" - } - if error == nil && errorType == nil && closure == nil { - failureMessage.postfixMessage = "\(postfixMessageVerb) any error" - } - - if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" - } else { - failureMessage.actualValue = "no error" - } -} - -internal func errorMatchesExpectedError( - _ actualError: Error, - expectedError: T) -> Bool { - return actualError._domain == expectedError._domain - && actualError._code == expectedError._code -} - -// Non-generic - -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, - actualError: Error?, - closure: ((Error) -> Void)?) { - failureMessage.postfixMessage = "throw error" - - if closure != nil { - failureMessage.postfixMessage += " that satisfies block" - } else { - failureMessage.postfixMessage = "throw any error" - } - - if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" - } else { - failureMessage.actualValue = "no error" - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift deleted file mode 100644 index 6c5126a..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation - -extension Sequence { - internal func all(_ fn: (Iterator.Element) -> Bool) -> Bool { - for item in self { - if !fn(item) { - return false - } - } - return true - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/SourceLocation.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/SourceLocation.swift deleted file mode 100644 index 4e37aef..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/SourceLocation.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -// Ideally we would always use `StaticString` as the type for tracking the file name -// that expectations originate from, for consistency with `assert` etc. from the -// stdlib, and because recent versions of the XCTest overlay require `StaticString` -// when calling `XCTFail`. Under the Objective-C runtime (i.e. building on Mac), we -// have to use `String` instead because StaticString can't be generated from Objective-C -#if SWIFT_PACKAGE -public typealias FileString = StaticString -#else -public typealias FileString = String -#endif - -public final class SourceLocation: NSObject { - public let file: FileString - public let line: UInt - - override init() { - file = "Unknown File" - line = 0 - } - - init(file: FileString, line: UInt) { - self.file = file - self.line = line - } - - override public var description: String { - return "\(file):\(line)" - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift deleted file mode 100644 index cd6de20..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift +++ /dev/null @@ -1,212 +0,0 @@ -import Foundation - -internal func identityAsString(_ value: Any?) -> String { - let anyObject: AnyObject? -#if os(Linux) - anyObject = value as? AnyObject -#else - anyObject = value as AnyObject? -#endif - if let value = anyObject { - return NSString(format: "<%p>", unsafeBitCast(value, to: Int.self)).description - } else { - return "nil" - } -} - -internal func arrayAsString(_ items: [T], joiner: String = ", ") -> String { - return items.reduce("") { accum, item in - let prefix = (accum.isEmpty ? "" : joiner) - return accum + prefix + "\(stringify(item))" - } -} - -/// A type with a customized test output text representation. -/// -/// This textual representation is produced when values will be -/// printed in test runs, and may be useful when producing -/// error messages in custom matchers. -/// -/// - SeeAlso: `CustomDebugStringConvertible` -public protocol TestOutputStringConvertible { - var testDescription: String { get } -} - -extension Double: TestOutputStringConvertible { - public var testDescription: String { - return NSNumber(value: self).testDescription - } -} - -extension Float: TestOutputStringConvertible { - public var testDescription: String { - return NSNumber(value: self).testDescription - } -} - -extension NSNumber: TestOutputStringConvertible { - // This is using `NSString(format:)` instead of - // `String(format:)` because the latter somehow breaks - // 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. - // Maybe this will change in a future snapshot. - let decimalPlaces = NSString(string: NSString(string: description) - .components(separatedBy: ".")[1]) - - // SeeAlso: https://bugs.swift.org/browse/SR-1464 - switch decimalPlaces.length { - case 1: - return NSString(format: "%0.1f", self.doubleValue).description - case 2: - return NSString(format: "%0.2f", self.doubleValue).description - case 3: - return NSString(format: "%0.3f", self.doubleValue).description - default: - return NSString(format: "%0.4f", self.doubleValue).description - } - } - return self.description - } -} - -extension Array: TestOutputStringConvertible { - public var testDescription: String { - let list = self.map(Nimble.stringify).joined(separator: ", ") - return "[\(list)]" - } -} - -extension AnySequence: TestOutputStringConvertible { - public var testDescription: String { - 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)]" - } -} - -extension NSArray: TestOutputStringConvertible { - public var testDescription: String { - let list = Array(self).map(Nimble.stringify).joined(separator: ", ") - return "(\(list))" - } -} - -extension NSIndexSet: TestOutputStringConvertible { - public var testDescription: String { - let list = Array(self).map(Nimble.stringify).joined(separator: ", ") - return "(\(list))" - } -} - -extension String: TestOutputStringConvertible { - public var testDescription: String { - return self - } -} - -extension Data: TestOutputStringConvertible { - public var testDescription: String { - #if os(Linux) - // FIXME: Swift on Linux triggers a segfault when calling NSData's hash() (last checked on 03-11-16) - return "Data" - #else - return "Data" - #endif - } -} - -/// -/// Returns a string appropriate for displaying in test output -/// from the provided value. -/// -/// - parameter value: A value that will show up in a test's output. -/// -/// - returns: The string that is returned can be -/// customized per type by conforming a type to the `TestOutputStringConvertible` -/// protocol. When stringifying a non-`TestOutputStringConvertible` type, this -/// function will return the value's debug description and then its -/// normal description if available and in that order. Otherwise it -/// will return the result of constructing a string from the value. -/// -/// - SeeAlso: `TestOutputStringConvertible` -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) -} - -/// -SeeAlso: `stringify(value: T)` -public func stringify(_ value: T?) -> String { - if let unboxed = value { - return stringify(unboxed) - } - return "nil" -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -@objc public class NMBStringer: NSObject { - @objc public class func stringify(_ obj: Any?) -> String { - return Nimble.stringify(obj) - } -} -#endif - -// MARK: Collection Type Stringers - -/// Attempts to generate a pretty type string for a given value. If the value is of a Objective-C -/// collection type, or a subclass thereof, (e.g. `NSArray`, `NSDictionary`, etc.). -/// This function will return the type name of the root class of the class cluster for better -/// readability (e.g. `NSArray` instead of `__NSArrayI`). -/// -/// For values that don't have a type of an Objective-C collection, this function returns the -/// default type description. -/// -/// - parameter value: A value that will be used to determine a type name. -/// -/// - returns: The name of the class cluster root class for Objective-C collection types, or the -/// the `dynamicType` of the value for values of any other type. -public func prettyCollectionType(_ value: T) -> String { - switch value { - case is NSArray: - return String(describing: NSArray.self) - case is NSDictionary: - return String(describing: NSDictionary.self) - case is NSSet: - return String(describing: NSSet.self) - case is NSIndexSet: - return String(describing: NSIndexSet.self) - default: - return String(describing: value) - } -} - -/// Returns the type name for a given collection type. This overload is used by Swift -/// collection types. -/// -/// - parameter collection: A Swift `CollectionType` value. -/// -/// - returns: A string representing the `dynamicType` of the value. -public func prettyCollectionType(_ collection: T) -> String { - return String(describing: type(of: collection)) -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h deleted file mode 100644 index 5d416e4..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble22CurrentTestCaseTracker") -@interface CurrentTestCaseTracker : NSObject -+ (CurrentTestCaseTracker *)sharedInstance; -@end - -@interface CurrentTestCaseTracker (Register) @end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h deleted file mode 100644 index caa3f7c..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h +++ /dev/null @@ -1,383 +0,0 @@ -#import - -@class NMBExpectation; -@class NMBObjCBeCloseToMatcher; -@class NMBObjCRaiseExceptionMatcher; -@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 - - - -#define DEFINE_NMB_EXPECT_OVERLOAD(TYPE, EXPR) \ - NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - NMBExpectation *NMB_expect(TYPE(^actualBlock)(void), NSString *file, NSUInteger line) { \ - return NMB_expect(^id { return EXPR; }, file, line); \ - } - - NIMBLE_EXPORT NIMBLE_OVERLOADABLE - NMBExpectation *NMB_expect(id(^actualBlock)(void), 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)(void), NSString *file, NSUInteger line); - - - -#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_EXPORT_INLINE id beAnInstanceOf(Class expectedClass) { - return NMB_beAnInstanceOf(expectedClass); -} - -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass); -NIMBLE_EXPORT_INLINE id beAKindOf(Class expectedClass) { - return NMB_beAKindOf(expectedClass); -} - -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring); -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), - NMB_beIdenticalTo(expectedInstance)); - -NIMBLE_EXPORT id NMB_be(id expectedInstance); -NIMBLE_SHORT(id be(id expectedInstance), - NMB_be(expectedInstance)); - - -#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), - NMB_beTruthy()); - -NIMBLE_EXPORT id NMB_beFalsy(void); -NIMBLE_SHORT(id beFalsy(void), - NMB_beFalsy()); - -NIMBLE_EXPORT id NMB_beTrue(void); -NIMBLE_SHORT(id beTrue(void), - NMB_beTrue()); - -NIMBLE_EXPORT id NMB_beFalse(void); -NIMBLE_SHORT(id beFalse(void), - NMB_beFalse()); - -NIMBLE_EXPORT id NMB_beNil(void); -NIMBLE_SHORT(id beNil(void), - NMB_beNil()); - -NIMBLE_EXPORT id NMB_beEmpty(void); -NIMBLE_SHORT(id beEmpty(void), - NMB_beEmpty()); - -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) NS_REQUIRES_NIL_TERMINATION; -#define NMB_contain(...) NMB_containWithNilTermination(__VA_ARGS__, nil) -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#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)); - -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException(void); -NIMBLE_SHORT(NMBObjCRaiseExceptionMatcher *raiseException(void), - NMB_raiseException()); - -NIMBLE_EXPORT id NMB_match(id expectedValue); -NIMBLE_SHORT(id match(id expectedValue), - NMB_match(expectedValue)); - -NIMBLE_EXPORT id NMB_allPass(id matcher); -NIMBLE_SHORT(id allPass(id matcher), - NMB_allPass(matcher)); - -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers); -#define NMB_satisfyAnyOf(...) NMB_satisfyAnyOfWithMatchers(@[__VA_ARGS__]) -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#define satisfyAnyOf(...) NMB_satisfyAnyOf(__VA_ARGS__) -#endif - -// In order to preserve breakpoint behavior despite using macros to fill in __FILE__ and __LINE__, -// define a builder that populates __FILE__ and __LINE__, and returns a block that takes timeout -// and action arguments. See https://github.com/Quick/Quick/pull/185 for details. -typedef void (^NMBWaitUntilTimeoutBlock)(NSTimeInterval timeout, void (^action)(void (^)(void))); -typedef void (^NMBWaitUntilBlock)(void (^action)(void (^)(void))); - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line); - -NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line); -NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line); - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line); - -#define NMB_waitUntilTimeout NMB_waitUntilTimeoutBuilder(@(__FILE__), __LINE__) -#define NMB_waitUntil NMB_waitUntilBuilder(@(__FILE__), __LINE__) - -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#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") - - -#define waitUntilTimeout NMB_waitUntilTimeout -#define waitUntil NMB_waitUntil - -#undef NIMBLE_VALUE_OF - -#endif - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m deleted file mode 100644 index 5a145b8..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m +++ /dev/null @@ -1,160 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble7NMBWait") -@interface NMBWait : NSObject - -+ (void)untilTimeout:(NSTimeInterval)timeout file:(NSString *)file line:(NSUInteger)line action:(void (^ _Nonnull)(void (^ _Nonnull)(void)))action; -+ (void)untilFile:(NSString *)file line:(NSUInteger)line action:(void (^ _Nonnull)(void (^ _Nonnull)(void)))action; - -@end - - -NS_ASSUME_NONNULL_BEGIN - - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBExpectation *__nonnull NMB_expect(id __nullable(^actualBlock)(void), NSString *__nonnull file, NSUInteger line) { - return [[NMBExpectation alloc] initWithActualBlock:actualBlock - negative:NO - file:file - line:line]; -} - -NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSString *file, NSUInteger line) { - return NMB_expect(^id{ - actualBlock(); - return nil; - }, file, line); -} - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line) { - return [NMBExpectation failWithMessage:msg file:file line:line]; -} - -NIMBLE_EXPORT id NMB_beAnInstanceOf(Class expectedClass) { - return [NMBObjCMatcher beAnInstanceOfMatcher:expectedClass]; -} - -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass) { - return [NMBObjCMatcher beAKindOfMatcher:expectedClass]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beCloseToMatcher:expectedValue within:0.001]; -} - -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring) { - return [NMBObjCMatcher beginWithMatcher:itemElementOrSubstring]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanOrEqualToMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_beIdenticalTo(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; -} - -NIMBLE_EXPORT id NMB_be(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanOrEqualToMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_beTruthy() { - return [NMBObjCMatcher beTruthyMatcher]; -} - -NIMBLE_EXPORT id NMB_beFalsy() { - return [NMBObjCMatcher beFalsyMatcher]; -} - -NIMBLE_EXPORT id NMB_beTrue() { - return [NMBObjCMatcher beTrueMatcher]; -} - -NIMBLE_EXPORT id NMB_beFalse() { - return [NMBObjCMatcher beFalseMatcher]; -} - -NIMBLE_EXPORT id NMB_beNil() { - return [NMBObjCMatcher beNilMatcher]; -} - -NIMBLE_EXPORT id NMB_beEmpty() { - return [NMBObjCMatcher beEmptyMatcher]; -} - -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) { - NSMutableArray *itemOrSubstringArray = [NSMutableArray array]; - - if (itemOrSubstring) { - [itemOrSubstringArray addObject:itemOrSubstring]; - - va_list args; - va_start(args, itemOrSubstring); - id next; - while ((next = va_arg(args, id))) { - [itemOrSubstringArray addObject:next]; - } - va_end(args); - } - - 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 NIMBLE_OVERLOADABLE id NMB_equal(__nullable id expectedValue) { - return [NMBObjCMatcher equalMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_haveCount(id expectedValue) { - return [NMBObjCMatcher haveCountMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_match(id expectedValue) { - return [NMBObjCMatcher matchMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_allPass(id expectedValue) { - return [NMBObjCMatcher allPassMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers) { - return [NMBObjCMatcher satisfyAnyOfMatcher:matchers]; -} - -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException() { - return [NMBObjCMatcher raiseExceptionMatcher]; -} - -NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line) { - return ^(NSTimeInterval timeout, void (^ _Nonnull action)(void (^ _Nonnull)(void))) { - [NMBWait untilTimeout:timeout file:file line:line action:action]; - }; -} - -NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line) { - return ^(void (^ _Nonnull action)(void (^ _Nonnull)(void))) { - [NMBWait untilFile:file line:line action:action]; - }; -} - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h deleted file mode 100644 index e6e0272..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h +++ /dev/null @@ -1,11 +0,0 @@ -#import -#import - -@interface NMBExceptionCapture : NSObject - -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)(void))finally; -- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)(void))unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); - -@end - -typedef void(^NMBSourceCallbackBlock)(BOOL successful); diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m deleted file mode 100644 index 3381047..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m +++ /dev/null @@ -1,35 +0,0 @@ -#import "NMBExceptionCapture.h" - -@interface NMBExceptionCapture () -@property (nonatomic, copy) void(^ _Nullable handler)(NSException * _Nullable); -@property (nonatomic, copy) void(^ _Nullable finally)(void); -@end - -@implementation NMBExceptionCapture - -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)(void))finally { - self = [super init]; - if (self) { - self.handler = handler; - self.finally = finally; - } - return self; -} - -- (void)tryBlock:(void(^ _Nonnull)(void))unsafeBlock { - @try { - unsafeBlock(); - } - @catch (NSException *exception) { - if (self.handler) { - self.handler(exception); - } - } - @finally { - if (self.finally) { - self.finally(); - } - } -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.h deleted file mode 100644 index 7938bca..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.h +++ /dev/null @@ -1,18 +0,0 @@ -@class NSString; - -/** - * Returns a string appropriate for displaying in test output - * from the provided value. - * - * @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` - * protocol. When stringifying a non-`TestOutputStringConvertible` type, this - * function will return the value's debug description and then its - * normal description if available and in that order. Otherwise it - * will return the result of constructing a string from the value. - * - * @see `TestOutputStringConvertible` - */ -extern NSString *_Nonnull NMBStringify(id _Nullable anyObject) __attribute__((warn_unused_result)); diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.m b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.m deleted file mode 100644 index 329d39a..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.m +++ /dev/null @@ -1,6 +0,0 @@ -#import "NMBStringify.h" -#import - -NSString *_Nonnull NMBStringify(id _Nullable anyObject) { - return [NMBStringer stringify:anyObject]; -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m deleted file mode 100644 index 35f26fd..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m +++ /dev/null @@ -1,78 +0,0 @@ -#import "CurrentTestCaseTracker.h" -#import -#import - -#pragma mark - Method Swizzling - -/// Swaps the implementations between two instance methods. -/// -/// @param class The class containing `originalSelector`. -/// @param originalSelector Original method to replace. -/// @param replacementSelector Replacement method. -void swizzleSelectors(Class class, SEL originalSelector, SEL replacementSelector) { - Method originalMethod = class_getInstanceMethod(class, originalSelector); - Method replacementMethod = class_getInstanceMethod(class, replacementSelector); - - BOOL didAddMethod = - class_addMethod(class, - originalSelector, - method_getImplementation(replacementMethod), - method_getTypeEncoding(replacementMethod)); - - if (didAddMethod) { - class_replaceMethod(class, - replacementSelector, - method_getImplementation(originalMethod), - method_getTypeEncoding(originalMethod)); - } else { - method_exchangeImplementations(originalMethod, replacementMethod); - } -} - -#pragma mark - Private - -@interface XCTestObservationCenter (Private) -- (void)_addLegacyTestObserver:(id)observer; -@end - -@implementation XCTestObservationCenter (Register) - -/// Uses objc method swizzling to register `CurrentTestCaseTracker` as a test observer. This is necessary -/// because Xcode 7.3 introduced timing issues where if a custom `XCTestObservation` is registered too early -/// it suppresses all console output (generated by `XCTestLog`), breaking any tools that depend on this output. -/// This approach waits to register our custom test observer until XCTest adds its first "legacy" observer, -/// falling back to registering after the first normal observer if this private method ever changes. -+ (void)load { - if (class_getInstanceMethod([self class], @selector(_addLegacyTestObserver:))) { - // Swizzle -_addLegacyTestObserver: - swizzleSelectors([self class], @selector(_addLegacyTestObserver:), @selector(NMB_original__addLegacyTestObserver:)); - } else { - // Swizzle -addTestObserver:, only if -_addLegacyTestObserver: is not implemented - swizzleSelectors([self class], @selector(addTestObserver:), @selector(NMB_original_addTestObserver:)); - } -} - -#pragma mark - Replacement Methods - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -- (void)NMB_original__addLegacyTestObserver:(id)observer { - [self NMB_original__addLegacyTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -/// This method is only used if `-_addLegacyTestObserver:` is not impelemented. (added in Xcode 7.3) -- (void)NMB_original_addTestObserver:(id)observer { - [self NMB_original_addTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self NMB_original_addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/.swiftlint.yml b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/.swiftlint.yml deleted file mode 100644 index f003326..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/.swiftlint.yml +++ /dev/null @@ -1,2 +0,0 @@ -disabled_rules: - - line_length diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/LinuxMain.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/LinuxMain.swift deleted file mode 100644 index 16c6953..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/LinuxMain.swift +++ /dev/null @@ -1,37 +0,0 @@ -import XCTest -@testable import NimbleTests - -// This is the entry point for NimbleTests on Linux - -XCTMain([ - testCase(AsyncTest.allTests), - testCase(SynchronousTest.allTests), - testCase(UserDescriptionTest.allTests), - - // Matchers - testCase(AllPassTest.allTests), - testCase(BeAKindOfSwiftTest.allTests), - testCase(BeAnInstanceOfTest.allTests), - testCase(BeCloseToTest.allTests), - testCase(BeginWithTest.allTests), - testCase(BeGreaterThanOrEqualToTest.allTests), - testCase(BeGreaterThanTest.allTests), - testCase(BeIdenticalToObjectTest.allTests), - testCase(BeIdenticalToTest.allTests), - testCase(BeLessThanOrEqualToTest.allTests), - testCase(BeLessThanTest.allTests), - testCase(BeTruthyTest.allTests), - testCase(BeTrueTest.allTests), - testCase(BeFalsyTest.allTests), - testCase(BeFalseTest.allTests), - testCase(BeNilTest.allTests), - testCase(ContainTest.allTests), - testCase(EndWithTest.allTests), - testCase(EqualTest.allTests), - testCase(HaveCountTest.allTests), - testCase(MatchTest.allTests), - // testCase(RaisesExceptionTest.allTests), - testCase(ThrowErrorTest.allTests), - testCase(SatisfyAnyOfTest.allTests), - testCase(PostNotificationTest.allTests), -]) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift deleted file mode 100644 index 46e34ce..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift +++ /dev/null @@ -1,245 +0,0 @@ -import Dispatch -import Foundation -import XCTest -import Nimble - -final class AsyncTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AsyncTest) -> () throws -> Void)] { - return [ - ("testToEventuallyPositiveMatches", testToEventuallyPositiveMatches), - ("testToEventuallyNegativeMatches", testToEventuallyNegativeMatches), - ("testWaitUntilPositiveMatches", testWaitUntilPositiveMatches), - ("testToEventuallyWithCustomDefaultTimeout", testToEventuallyWithCustomDefaultTimeout), - ("testWaitUntilTimesOutIfNotCalled", testWaitUntilTimesOutIfNotCalled), - ("testWaitUntilTimesOutWhenExceedingItsTime", testWaitUntilTimesOutWhenExceedingItsTime), - ("testWaitUntilNegativeMatches", testWaitUntilNegativeMatches), - ("testWaitUntilDetectsStalledMainThreadActivity", testWaitUntilDetectsStalledMainThreadActivity), - ("testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed", testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed), - ("testWaitUntilErrorsIfDoneIsCalledMultipleTimes", testWaitUntilErrorsIfDoneIsCalledMultipleTimes), - ("testWaitUntilMustBeInMainThread", testWaitUntilMustBeInMainThread), - ("testToEventuallyMustBeInMainThread", testToEventuallyMustBeInMainThread), - ("testSubjectUnderTestIsReleasedFromMemory", testSubjectUnderTestIsReleasedFromMemory), - ] - } - - class Error: Swift.Error {} - let errorToThrow = Error() - - private func doThrowError() throws -> Int { - throw errorToThrow - } - - func testToEventuallyPositiveMatches() { - var value = 0 - deferToMainQueue { value = 1 } - expect { value }.toEventually(equal(1)) - - deferToMainQueue { value = 0 } - expect { value }.toEventuallyNot(equal(1)) - } - - func testToEventuallyNegativeMatches() { - let value = 0 - failsWithErrorMessage("expected to eventually not equal <0>, got <0>") { - expect { value }.toEventuallyNot(equal(0)) - } - failsWithErrorMessage("expected to eventually equal <1>, got <0>") { - expect { value }.toEventually(equal(1)) - } - failsWithErrorMessage("unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toEventually(equal(1)) - } - failsWithErrorMessage("unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toEventuallyNot(equal(0)) - } - } - - func testToEventuallyWithCustomDefaultTimeout() { - AsyncDefaults.Timeout = 2 - defer { - AsyncDefaults.Timeout = 1 - } - - var value = 0 - - let sleepThenSetValueTo: (Int) -> Void = { newValue in - Thread.sleep(forTimeInterval: 1.1) - value = newValue - } - - var asyncOperation: () -> Void = { sleepThenSetValueTo(1) } - - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect { value }.toEventually(equal(1)) - - asyncOperation = { sleepThenSetValueTo(0) } - - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect { value }.toEventuallyNot(equal(1)) - } - - func testWaitUntilPositiveMatches() { - waitUntil { done in - done() - } - waitUntil { done in - deferToMainQueue { - done() - } - } - } - - func testWaitUntilTimesOutIfNotCalled() { - failsWithErrorMessage("Waited more than 1.0 second") { - waitUntil(timeout: 1) { _ in return } - } - } - - func testWaitUntilTimesOutWhenExceedingItsTime() { - var waiting = true - failsWithErrorMessage("Waited more than 0.01 seconds") { - waitUntil(timeout: 0.01) { done in - let asyncOperation: () -> Void = { - Thread.sleep(forTimeInterval: 0.1) - done() - waiting = false - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - } - } - - // "clear" runloop to ensure this test doesn't poison other tests - repeat { - RunLoop.main.run(until: Date().addingTimeInterval(0.2)) - } while(waiting) - } - - func testWaitUntilNegativeMatches() { - failsWithErrorMessage("expected to equal <2>, got <1>") { - waitUntil { done in - Thread.sleep(forTimeInterval: 0.1) - expect(1).to(equal(2)) - done() - } - } - } - - func testWaitUntilDetectsStalledMainThreadActivity() { - let msg = "-waitUntil() timed out but was unable to run the timeout handler because the main thread is unresponsive (0.5 seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." - failsWithErrorMessage(msg) { - waitUntil(timeout: 1) { done in - Thread.sleep(forTimeInterval: 5.0) - done() - } - } - } - - func testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed() { - // Currently we are unable to catch Objective-C exceptions when built by the Swift Package Manager -#if !SWIFT_PACKAGE - let referenceLine = #line + 9 - var msg = "Unexpected exception raised: Nested async expectations are not allowed " - msg += "to avoid creating flaky tests." - msg += "\n\n" - msg += "The call to\n\t" - msg += "expect(...).toEventually(...) at \(#file):\(referenceLine + 7)\n" - msg += "triggered this exception because\n\t" - msg += "waitUntil(...) at \(#file):\(referenceLine + 1)\n" - msg += "is currently managing the main run loop." - failsWithErrorMessage(msg) { // reference line - waitUntil(timeout: 2.0) { done in - var protected: Int = 0 - DispatchQueue.main.async { - protected = 1 - } - - expect(protected).toEventually(equal(1)) - done() - } - } -#endif - } - - func testWaitUntilErrorsIfDoneIsCalledMultipleTimes() { - failsWithErrorMessage("waitUntil(..) expects its completion closure to be only called once") { - waitUntil { done in - deferToMainQueue { - done() - done() - } - } - } - } - - func testWaitUntilMustBeInMainThread() { -#if !SWIFT_PACKAGE - var executedAsyncBlock: Bool = false - let asyncOperation: () -> Void = { - expect { - waitUntil { done in done() } - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - executedAsyncBlock = true - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect(executedAsyncBlock).toEventually(beTruthy()) -#endif - } - - func testToEventuallyMustBeInMainThread() { -#if !SWIFT_PACKAGE - var executedAsyncBlock: Bool = false - let asyncOperation: () -> Void = { - expect { - expect(1).toEventually(equal(2)) - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - executedAsyncBlock = true - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect(executedAsyncBlock).toEventually(beTruthy()) -#endif - } - - final class ClassUnderTest { - var deinitCalled: (() -> Void)? - var count = 0 - deinit { deinitCalled?() } - } - - func testSubjectUnderTestIsReleasedFromMemory() { - var subject: ClassUnderTest? = ClassUnderTest() - - if let sub = subject { - expect(sub.count).toEventually(equal(0), timeout: 0.1) - expect(sub.count).toEventuallyNot(equal(1), timeout: 0.1) - } - - waitUntil(timeout: 0.5) { done in - subject?.deinitCalled = { - done() - } - - deferToMainQueue { subject = nil } - } - } - -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift deleted file mode 100644 index 26e5a98..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation - -class ObjectWithLazyProperty { - init() {} - lazy var value: String = "hello" - lazy var anotherValue: String = { return "world" }() -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift deleted file mode 100644 index 08a67c6..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest - -// XCTestCaseProvider should be adopted by all XCTestCase subclasses. It provides a -// mechanism for us to fail tests in Xcode which haven't been included in the `allTests` -// list for swift-corelibs-xctest which is unable to dynamically discover tests. Note -// that only `static var allTests` needs to be explicitly implemented, as `allTestNames` -// has a default implementation provided by a protocol extension. - -// Implementation note: This is broken down into two separate protocols because we need a -// protocol with no Self references to which we can cast XCTestCase instances in a non-generic context. - -public protocol XCTestCaseProviderStatic { - // This should be explicitly implemented by XCTestCase subclasses - static var allTests: [(String, (Self) -> () throws -> Void)] { get } -} - -public protocol XCTestCaseNameProvider { - // This does not need to be explicitly implemented because of the protocol extension below - var allTestNames: [String] { get } -} - -public protocol XCTestCaseProvider: XCTestCaseProviderStatic, XCTestCaseNameProvider {} - -extension XCTestCaseProvider { - var allTestNames: [String] { - return type(of: self).allTests.map({ name, _ in - return name - }) - } -} - -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) - -extension XCTestCase { - override open func tearDown() { - if let provider = self as? XCTestCaseNameProvider { - provider.assertContainsTest(invocation!.selector.description) - } - - super.tearDown() - } -} - -extension XCTestCaseNameProvider { - fileprivate func assertContainsTest(_ name: String) { - let contains = self.allTestNames.contains(name) - XCTAssert(contains, "Test '\(name)' is missing from the allTests array") - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/utils.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/utils.swift deleted file mode 100644 index 6a5f544..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/utils.swift +++ /dev/null @@ -1,100 +0,0 @@ -import Dispatch -import Foundation -@testable import Nimble -import XCTest - -func failsWithErrorMessage(_ messages: [String], file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () throws -> Void) { - var filePath = file - var lineNumber = line - - let recorder = AssertionRecorder() - withAssertionHandler(recorder, closure: closure) - - for msg in messages { - var lastFailure: AssertionRecord? - var foundFailureMessage = false - - for assertion in recorder.assertions where assertion.message.stringValue == msg && !assertion.success { - lastFailure = assertion - foundFailureMessage = true - break - } - - if foundFailureMessage { - continue - } - - if preferOriginalSourceLocation { - if let failure = lastFailure { - filePath = failure.location.file - lineNumber = failure.location.line - } - } - - let message: String - if let lastFailure = lastFailure { - message = "Got failure message: \"\(lastFailure.message.stringValue)\", but expected \"\(msg)\"" - } else { - let knownFailures = recorder.assertions.filter { !$0.success }.map { $0.message.stringValue } - let knownFailuresJoined = knownFailures.joined(separator: ", ") - message = "Expected error message (\(msg)), got (\(knownFailuresJoined))\n\nAssertions Received:\n\(recorder.assertions)" - } - NimbleAssertionHandler.assert(false, - message: FailureMessage(stringValue: message), - location: SourceLocation(file: filePath, line: lineNumber)) - } -} - -func failsWithErrorMessage(_ message: String, file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () -> Void) { - return failsWithErrorMessage( - [message], - file: file, - line: line, - preferOriginalSourceLocation: preferOriginalSourceLocation, - closure: closure - ) -} - -func failsWithErrorMessageForNil(_ message: String, file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () -> Void) { - failsWithErrorMessage("\(message) (use beNil() to match nils)", file: file, line: line, preferOriginalSourceLocation: preferOriginalSourceLocation, closure: closure) -} - -func deferToMainQueue(action: @escaping () -> Void) { - DispatchQueue.main.async { - Thread.sleep(forTimeInterval: 0.01) - action() - } -} - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE -public class NimbleHelper: NSObject { - @objc public class func expectFailureMessage(_ message: NSString, block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessage(String(describing: message), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } - - @objc public class func expectFailureMessages(_ messages: [NSString], block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessage(messages.map({String(describing: $0)}), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } - - @objc public class func expectFailureMessageForNil(_ message: NSString, block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessageForNil(String(describing: message), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } -} -#endif - -extension Date { - init(dateTimeString: String) { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - dateFormatter.locale = Locale(identifier: "en_US_POSIX") - let date = dateFormatter.date(from: dateTimeString)! - self.init(timeInterval:0, since:date) - } -} - -extension NSDate { - convenience init(dateTimeString: String) { - let date = Date(dateTimeString: dateTimeString) - self.init(timeIntervalSinceReferenceDate: date.timeIntervalSinceReferenceDate) - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Info.plist b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Info.plist deleted file mode 100644 index 6d32c15..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/LinuxSupport.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/LinuxSupport.swift deleted file mode 100644 index 03ff8e1..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/LinuxSupport.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -#if os(Linux) - extension NSNotification.Name { - init(_ rawValue: String) { - self.init(rawValue: rawValue) - } - } -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift deleted file mode 100644 index 2050881..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift +++ /dev/null @@ -1,126 +0,0 @@ -import XCTest -import Nimble - -/// Add operators to `Optional` for conforming `Comparable` that removed in Swift 3.0 -extension Optional where Wrapped: Comparable { - static func < (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l < r - case (nil, _?): - return true - default: - return false - } - } - - static func > (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l > r - default: - return rhs < lhs - } - } - - static func <= (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l <= r - default: - return !(rhs < lhs) - } - } - - static func >= (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l >= r - default: - return !(lhs < rhs) - } - } -} - -final class AllPassTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AllPassTest) -> () throws -> Void)] { - return [ - ("testAllPassArray", testAllPassArray), - ("testAllPassMatcher", testAllPassMatcher), - ("testAllPassCollectionsWithOptionalsDontWork", testAllPassCollectionsWithOptionalsDontWork), - ("testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer", testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer), - ("testAllPassSet", testAllPassSet), - ("testAllPassWithNilAsExpectedValue", testAllPassWithNilAsExpectedValue), - ] - } - - func testAllPassArray() { - expect([1, 2, 3, 4]).to(allPass({$0 < 5})) - expect([1, 2, 3, 4]).toNot(allPass({$0 > 5})) - - failsWithErrorMessage( - "expected to all pass a condition, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1, 2, 3, 4]).to(allPass({$0 < 3})) - } - failsWithErrorMessage("expected to not all pass a condition") { - expect([1, 2, 3, 4]).toNot(allPass({$0 < 5})) - } - failsWithErrorMessage( - "expected to all be something, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1, 2, 3, 4]).to(allPass("be something", {$0 < 3})) - } - failsWithErrorMessage("expected to not all be something") { - expect([1, 2, 3, 4]).toNot(allPass("be something", {$0 < 5})) - } - } - - func testAllPassMatcher() { - expect([1, 2, 3, 4]).to(allPass(beLessThan(5))) - expect([1, 2, 3, 4]).toNot(allPass(beGreaterThan(5))) - - failsWithErrorMessage( - "expected to all be less than <3>, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1, 2, 3, 4]).to(allPass(beLessThan(3))) - } - failsWithErrorMessage("expected to not all be less than <5>") { - expect([1, 2, 3, 4]).toNot(allPass(beLessThan(5))) - } - } - - func testAllPassCollectionsWithOptionalsDontWork() { - failsWithErrorMessage("expected to all be nil, but failed first at element in <[nil, nil, nil]>") { - expect([nil, nil, nil] as [Int?]).to(allPass(beNil())) - } - failsWithErrorMessage("expected to all pass a condition, but failed first at element in <[nil, nil, nil]>") { - expect([nil, nil, nil] as [Int?]).to(allPass({$0 == nil})) - } - } - - func testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer() { - expect([nil, nil, nil] as [Int?]).to(allPass({$0! == nil})) - expect([nil, 1, nil] as [Int?]).toNot(allPass({$0! == nil})) - expect([1, 1, 1] as [Int?]).to(allPass({$0! == 1})) - expect([1, 1, nil] as [Int?]).toNot(allPass({$0! == 1})) - expect([1, 2, 3] as [Int?]).to(allPass({$0! < 4})) - expect([1, 2, 3] as [Int?]).toNot(allPass({$0! < 3})) - expect([1, 2, nil] as [Int?]).to(allPass({$0! < 3})) - } - - func testAllPassSet() { - expect(Set([1, 2, 3, 4])).to(allPass({$0 < 5})) - expect(Set([1, 2, 3, 4])).toNot(allPass({$0 > 5})) - - failsWithErrorMessage("expected to not all pass a condition") { - expect(Set([1, 2, 3, 4])).toNot(allPass({$0 < 5})) - } - failsWithErrorMessage("expected to not all be something") { - expect(Set([1, 2, 3, 4])).toNot(allPass("be something", {$0 < 5})) - } - } - - func testAllPassWithNilAsExpectedValue() { - failsWithErrorMessageForNil("expected to all pass") { - expect(nil as [Int]?).to(allPass(beLessThan(5))) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift deleted file mode 100644 index 94137dc..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift +++ /dev/null @@ -1,89 +0,0 @@ -import Foundation -import XCTest -import Nimble - -private class TestNull: NSNull {} -private protocol TestProtocol {} -private class TestClassConformingToProtocol: TestProtocol {} -private struct TestStructConformingToProtocol: TestProtocol {} - -final class BeAKindOfSwiftTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAKindOfSwiftTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testFailureMessages", testFailureMessages), - ] - } - - enum TestEnum { - case one, two - } - - func testPositiveMatch() { - expect(1).to(beAKindOf(Int.self)) - expect(1).toNot(beAKindOf(String.self)) - expect("turtle string").to(beAKindOf(String.self)) - expect("turtle string").toNot(beAKindOf(TestClassConformingToProtocol.self)) - - expect(TestEnum.one).to(beAKindOf(TestEnum.self)) - - let testProtocolClass = TestClassConformingToProtocol() - expect(testProtocolClass).to(beAKindOf(TestClassConformingToProtocol.self)) - expect(testProtocolClass).to(beAKindOf(TestProtocol.self)) - expect(testProtocolClass).toNot(beAKindOf(TestStructConformingToProtocol.self)) - - let testProtocolStruct = TestStructConformingToProtocol() - expect(testProtocolStruct).to(beAKindOf(TestStructConformingToProtocol.self)) - expect(testProtocolStruct).to(beAKindOf(TestProtocol.self)) - expect(testProtocolStruct).toNot(beAKindOf(TestClassConformingToProtocol.self)) - } - - func testFailureMessages() { - failsWithErrorMessage("expected to not be a kind of Int, got ") { - expect(1).toNot(beAKindOf(Int.self)) - } - - let testClass = TestClassConformingToProtocol() - failsWithErrorMessage("expected to not be a kind of \(String(describing: TestProtocol.self)), got <\(String(describing: TestClassConformingToProtocol.self)) instance>") { - expect(testClass).toNot(beAKindOf(TestProtocol.self)) - } - - failsWithErrorMessage("expected to be a kind of String, got ") { - expect(1).to(beAKindOf(String.self)) - } - } -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -final class BeAKindOfObjCTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAKindOfObjCTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testFailureMessages", testFailureMessages), - ] - } - - func testPositiveMatch() { - expect(TestNull()).to(beAKindOf(NSNull.self)) - expect(NSObject()).to(beAKindOf(NSObject.self)) - expect(NSNumber(value:1)).toNot(beAKindOf(NSDate.self)) - } - - func testFailureMessages() { - failsWithErrorMessageForNil("expected to not be a kind of NSNull, got ") { - expect(nil as NSNull?).toNot(beAKindOf(NSNull.self)) - } - failsWithErrorMessageForNil("expected to be a kind of NSString, got ") { - expect(nil as NSString?).to(beAKindOf(NSString.self)) - } - failsWithErrorMessage("expected to be a kind of NSString, got <__NSCFNumber instance>") { - expect(NSNumber(value:1)).to(beAKindOf(NSString.self)) - } - failsWithErrorMessage("expected to not be a kind of NSNumber, got <__NSCFNumber instance>") { - expect(NSNumber(value:1)).toNot(beAKindOf(NSNumber.self)) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift deleted file mode 100644 index fe089dd..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift +++ /dev/null @@ -1,79 +0,0 @@ -import Foundation -import XCTest -import Nimble - -private protocol TestProtocol {} -private class TestClassConformingToProtocol: TestProtocol {} -private struct TestStructConformingToProtocol: TestProtocol {} - -final class BeAnInstanceOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAnInstanceOfTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testPositiveMatchSwiftTypes", testPositiveMatchSwiftTypes), - ("testFailureMessages", testFailureMessages), - ("testFailureMessagesSwiftTypes", testFailureMessagesSwiftTypes), - ] - } - - func testPositiveMatch() { - expect(NSNull()).to(beAnInstanceOf(NSNull.self)) - expect(NSNumber(value:1)).toNot(beAnInstanceOf(NSDate.self)) - } - - enum TestEnum { - case one, two - } - - func testPositiveMatchSwiftTypes() { - expect(1).to(beAnInstanceOf(Int.self)) - expect("test").to(beAnInstanceOf(String.self)) - - expect(TestEnum.one).to(beAnInstanceOf(TestEnum.self)) - - let testProtocolClass = TestClassConformingToProtocol() - expect(testProtocolClass).to(beAnInstanceOf(TestClassConformingToProtocol.self)) - expect(testProtocolClass).toNot(beAnInstanceOf(TestProtocol.self)) - expect(testProtocolClass).toNot(beAnInstanceOf(TestStructConformingToProtocol.self)) - - let testProtocolStruct = TestStructConformingToProtocol() - expect(testProtocolStruct).to(beAnInstanceOf(TestStructConformingToProtocol.self)) - expect(testProtocolStruct).toNot(beAnInstanceOf(TestProtocol.self)) - expect(testProtocolStruct).toNot(beAnInstanceOf(TestClassConformingToProtocol.self)) - } - - func testFailureMessages() { - failsWithErrorMessageForNil("expected to not be an instance of NSNull, got ") { - expect(nil as NSNull?).toNot(beAnInstanceOf(NSNull.self)) - } - failsWithErrorMessageForNil("expected to be an instance of NSString, got ") { - expect(nil as NSString?).to(beAnInstanceOf(NSString.self)) - } -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let numberTypeName = "__NSCFNumber" -#else - let numberTypeName = "NSNumber" -#endif - failsWithErrorMessage("expected to be an instance of NSString, got <\(numberTypeName) instance>") { - expect(NSNumber(value:1)).to(beAnInstanceOf(NSString.self)) - } - failsWithErrorMessage("expected to not be an instance of \(numberTypeName), got <\(numberTypeName) instance>") { - expect(NSNumber(value:1)).toNot(beAnInstanceOf(type(of: NSNumber(value:1)))) - } - } - - func testFailureMessagesSwiftTypes() { - failsWithErrorMessage("expected to not be an instance of Int, got ") { - expect(1).toNot(beAnInstanceOf(Int.self)) - } - - let testClass = TestClassConformingToProtocol() - failsWithErrorMessage("expected to be an instance of \(String(describing: TestProtocol.self)), got <\(String(describing: TestClassConformingToProtocol.self)) instance>") { - expect(testClass).to(beAnInstanceOf(TestProtocol.self)) - } - - failsWithErrorMessage("expected to be an instance of String, got ") { - expect(1).to(beAnInstanceOf(String.self)) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift deleted file mode 100644 index 81530f3..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift +++ /dev/null @@ -1,160 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeCloseToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeCloseToTest) -> () throws -> Void)] { - return [ - ("testBeCloseTo", testBeCloseTo), - ("testBeCloseToWithin", testBeCloseToWithin), - ("testBeCloseToWithNSNumber", testBeCloseToWithNSNumber), - ("testBeCloseToWithDate", testBeCloseToWithDate), - ("testBeCloseToWithNSDate", testBeCloseToWithNSDate), - ("testBeCloseToOperator", testBeCloseToOperator), - ("testBeCloseToWithinOperator", testBeCloseToWithinOperator), - ("testPlusMinusOperator", testPlusMinusOperator), - ("testBeCloseToOperatorWithDate", testBeCloseToOperatorWithDate), - ("testBeCloseToWithinOperatorWithDate", testBeCloseToWithinOperatorWithDate), - ("testPlusMinusOperatorWithDate", testPlusMinusOperatorWithDate), - ("testBeCloseToArray", testBeCloseToArray), - ("testBeCloseToWithCGFloat", testBeCloseToWithCGFloat), - ] - } - - func testBeCloseTo() { - expect(1.2).to(beCloseTo(1.2001)) - expect(1.2 as CDouble).to(beCloseTo(1.2001)) - expect(1.2 as Float).to(beCloseTo(1.2001)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 0.0001), got <1.2>") { - expect(1.2).toNot(beCloseTo(1.2001)) - } - } - - func testBeCloseToWithin() { - expect(1.2).to(beCloseTo(9.300, within: 10)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(1.2).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithNSNumber() { - expect(NSNumber(value:1.2)).to(beCloseTo(9.300, within: 10)) - expect(NSNumber(value:1.2)).to(beCloseTo(NSNumber(value:9.300), within: 10)) - expect(1.2).to(beCloseTo(NSNumber(value:9.300), within: 10)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(NSNumber(value:1.2)).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithCGFloat() { - expect(CGFloat(1.2)).to(beCloseTo(1.2001)) - expect(CGFloat(1.2)).to(beCloseTo(CGFloat(1.2001))) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(CGFloat(1.2)).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")).to(beCloseTo(Date(dateTimeString: "2015-08-26 11:43:05"), within: 10)) - - failsWithErrorMessage("expected to not be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")).toNot(beCloseTo(expectedDate, within: 0.006)) - } - } - - func testBeCloseToWithNSDate() { - expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).to(beCloseTo(NSDate(dateTimeString: "2015-08-26 11:43:05"), within: 10)) - - failsWithErrorMessage("expected to not be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = NSDate(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).toNot(beCloseTo(expectedDate, within: 0.006)) - } - } - - func testBeCloseToOperator() { - expect(1.2) ≈ 1.2001 - expect(1.2 as CDouble) ≈ 1.2001 - - failsWithErrorMessage("expected to be close to <1.2002> (within 0.0001), got <1.2>") { - expect(1.2) ≈ 1.2002 - } - } - - func testBeCloseToWithinOperator() { - expect(1.2) ≈ (9.300, 10) - expect(1.2) == (9.300, 10) - - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) ≈ (1.0, 0.1) - } - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) == (1.0, 0.1) - } - } - - func testPlusMinusOperator() { - expect(1.2) ≈ 9.300 ± 10 - expect(1.2) == 9.300 ± 10 - - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) ≈ 1.0 ± 0.1 - } - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) == 1.0 ± 0.1 - } - } - - func testBeCloseToOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ Date(dateTimeString: "2015-08-26 11:43:00") - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.0001), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ expectedDate - } - } - - func testBeCloseToWithinOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ (Date(dateTimeString: "2015-08-26 11:43:05"), 10) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == (Date(dateTimeString: "2015-08-26 11:43:05"), 10) - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ (expectedDate, 0.004) - } - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == (expectedDate, 0.004) - } - } - - func testPlusMinusOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ Date(dateTimeString: "2015-08-26 11:43:05") ± 10 - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == Date(dateTimeString: "2015-08-26 11:43:05") ± 10 - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ expectedDate ± 0.004 - } - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == expectedDate ± 0.004 - } - } - - func testBeCloseToArray() { - expect([0.0, 1.1, 2.2]) ≈ [0.0001, 1.1001, 2.2001] - expect([0.0, 1.1, 2.2]).to(beCloseTo([0.1, 1.2, 2.3], within: 0.1)) - - failsWithErrorMessage("expected to be close to <[0, 1]> (each within 0.0001), got <[0, 1.1]>") { - expect([0.0, 1.1]) ≈ [0.0, 1.0] - } - failsWithErrorMessage("expected to be close to <[0.2, 1.2]> (each within 0.1), got <[0, 1.1]>") { - expect([0.0, 1.1]).to(beCloseTo([0.2, 1.2], within: 0.1)) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift deleted file mode 100644 index 9562fe0..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift +++ /dev/null @@ -1,82 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeEmptyTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeEmptyTest) -> () throws -> Void)] { - return [ - ("testBeEmptyPositive", testBeEmptyPositive), - ("testBeEmptyNegative", testBeEmptyNegative), - ] - } - - func testBeEmptyPositive() { - expect([] as [Int]).to(beEmpty()) - expect([1]).toNot(beEmpty()) - - expect([] as [CInt]).to(beEmpty()) - expect([1] as [CInt]).toNot(beEmpty()) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSDictionary() as? [Int:Int]).to(beEmpty()) - expect(NSDictionary(object: 1, forKey: 1 as NSNumber) as? [Int:Int]).toNot(beEmpty()) -#endif - - expect([Int: Int]()).to(beEmpty()) - expect(["hi": 1]).toNot(beEmpty()) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray() as? [Int]).to(beEmpty()) - expect(NSArray(array: [1]) as? [Int]).toNot(beEmpty()) -#endif - - expect(NSSet()).to(beEmpty()) - expect(NSSet(array: [NSNumber(value: 1)])).toNot(beEmpty()) - - expect(NSIndexSet()).to(beEmpty()) - expect(NSIndexSet(index: 1)).toNot(beEmpty()) - - expect(NSString()).to(beEmpty()) - expect(NSString(string: "hello")).toNot(beEmpty()) - - expect("").to(beEmpty()) - expect("foo").toNot(beEmpty()) - } - - func testBeEmptyNegative() { - failsWithErrorMessageForNil("expected to be empty, got ") { - expect(nil as NSString?).to(beEmpty()) - } - failsWithErrorMessageForNil("expected to not be empty, got ") { - expect(nil as [CInt]?).toNot(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <()>") { - expect(NSArray()).toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got <[1]>") { - expect([1]).to(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <{()}>") { - expect(NSSet()).toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got <{(1)}>") { - expect(NSSet(object: NSNumber(value: 1))).to(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <()>") { - expect(NSIndexSet()).toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got <(1)>") { - expect(NSIndexSet(index: 1)).to(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <>") { - expect("").toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got ") { - expect("foo").to(beEmpty()) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift deleted file mode 100644 index b9bd642..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift +++ /dev/null @@ -1,54 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeGreaterThanOrEqualToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeGreaterThanOrEqualToTest) -> () throws -> Void)] { - return [ - ("testGreaterThanOrEqualTo", testGreaterThanOrEqualTo), - ("testGreaterThanOrEqualToOperator", testGreaterThanOrEqualToOperator), - ] - } - - func testGreaterThanOrEqualTo() { - expect(10).to(beGreaterThanOrEqualTo(10)) - expect(10).to(beGreaterThanOrEqualTo(2)) - expect(1).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value:1)).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value:2)).to(beGreaterThanOrEqualTo(NSNumber(value:2))) -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(1).to(beGreaterThanOrEqualTo(NSNumber(value:0))) -#endif - - failsWithErrorMessage("expected to be greater than or equal to <2>, got <0>") { - expect(0).to(beGreaterThanOrEqualTo(2)) - return - } - failsWithErrorMessage("expected to not be greater than or equal to <1>, got <1>") { - expect(1).toNot(beGreaterThanOrEqualTo(1)) - return - } - failsWithErrorMessageForNil("expected to be greater than or equal to <-2>, got ") { - expect(nil as Int?).to(beGreaterThanOrEqualTo(-2)) - } - failsWithErrorMessageForNil("expected to not be greater than or equal to <1>, got ") { - expect(nil as Int?).toNot(beGreaterThanOrEqualTo(1)) - } - } - - func testGreaterThanOrEqualToOperator() { - expect(0) >= 0 - expect(1) >= 0 - expect(NSNumber(value:1)) >= 1 - expect(NSNumber(value:1)) >= NSNumber(value:1) - expect(2.5) >= 2.5 - expect(2.5) >= 2 - expect(Float(2.5)) >= Float(2.5) - expect(Float(2.5)) >= 2 - - failsWithErrorMessage("expected to be greater than or equal to <2>, got <1>") { - expect(1) >= 2 - return - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift deleted file mode 100644 index ea024a3..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeGreaterThanTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeGreaterThanTest) -> () throws -> Void)] { - return [ - ("testGreaterThan", testGreaterThan), - ("testGreaterThanOperator", testGreaterThanOperator), - ] - } - - func testGreaterThan() { - expect(10).to(beGreaterThan(2)) - expect(1).toNot(beGreaterThan(2)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:3)).to(beGreaterThan(2)) -#else - expect(NSNumber(value:3)).to(beGreaterThan(2 as NSNumber)) -#endif - expect(NSNumber(value:1)).toNot(beGreaterThan(NSNumber(value:2))) - - failsWithErrorMessage("expected to be greater than <2>, got <0>") { - expect(0).to(beGreaterThan(2)) - } - failsWithErrorMessage("expected to not be greater than <0>, got <1>") { - expect(1).toNot(beGreaterThan(0)) - } - failsWithErrorMessageForNil("expected to be greater than <-2>, got ") { - expect(nil as Int?).to(beGreaterThan(-2)) - } - failsWithErrorMessageForNil("expected to not be greater than <0>, got ") { - expect(nil as Int?).toNot(beGreaterThan(0)) - } - } - - func testGreaterThanOperator() { - expect(1) > 0 - expect(NSNumber(value:1)) > NSNumber(value:0) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:1)) > 0 -#else - expect(NSNumber(value:1)) > 0 as NSNumber -#endif - expect(2.5) > 1.5 - expect(Float(2.5)) > Float(1.5) - - failsWithErrorMessage("expected to be greater than <2>, got <1>") { - expect(1) > 2 - return - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift deleted file mode 100644 index 923fa76..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeIdenticalToObjectTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeIdenticalToObjectTest) -> () throws -> Void)] { - return [ - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testFailsOnNils", testFailsOnNils), - ("testOperators", testOperators), - ] - } - - private class BeIdenticalToObjectTester {} - private let testObjectA = BeIdenticalToObjectTester() - private let testObjectB = BeIdenticalToObjectTester() - - func testBeIdenticalToPositive() { - expect(self.testObjectA).to(beIdenticalTo(testObjectA)) - } - - func testBeIdenticalToNegative() { - expect(self.testObjectA).toNot(beIdenticalTo(testObjectB)) - } - - func testBeIdenticalToPositiveMessage() { - let message = String(describing: NSString(format: "expected to be identical to <%p>, got <%p>", - unsafeBitCast(testObjectB, to: Int.self), unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessage(message) { - expect(self.testObjectA).to(beIdenticalTo(self.testObjectB)) - } - } - - func testBeIdenticalToNegativeMessage() { - let message = String(describing: NSString(format: "expected to not be identical to <%p>, got <%p>", - unsafeBitCast(testObjectA, to: Int.self), unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessage(message) { - expect(self.testObjectA).toNot(beIdenticalTo(self.testObjectA)) - } - } - - func testFailsOnNils() { - let message1 = String(describing: NSString(format: "expected to be identical to <%p>, got nil", - unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessageForNil(message1) { - expect(nil as BeIdenticalToObjectTester?).to(beIdenticalTo(self.testObjectA)) - } - - let message2 = String(describing: NSString(format: "expected to not be identical to <%p>, got nil", - unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessageForNil(message2) { - expect(nil as BeIdenticalToObjectTester?).toNot(beIdenticalTo(self.testObjectA)) - } - } - - func testOperators() { - expect(self.testObjectA) === testObjectA - expect(self.testObjectA) !== testObjectB - } - -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift deleted file mode 100644 index eb976e6..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Foundation -import XCTest -@testable import Nimble - -final class BeIdenticalToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeIdenticalToTest) -> () throws -> Void)] { - return [ - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testOperators", testOperators), - ("testBeAlias", testBeAlias), - ] - } - - func testBeIdenticalToPositive() { - let value = NSDate() - expect(value).to(beIdenticalTo(value)) - } - - func testBeIdenticalToNegative() { - expect(NSNumber(value:1)).toNot(beIdenticalTo(NSString(string: "yo"))) - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) - } - - func testBeIdenticalToPositiveMessage() { - let num1 = NSNumber(value:1) - let num2 = NSNumber(value:2) - let message = "expected to be identical to \(identityAsString(num2)), got \(identityAsString(num1))" - failsWithErrorMessage(message) { - expect(num1).to(beIdenticalTo(num2)) - } - } - - func testBeIdenticalToNegativeMessage() { - let value1 = NSArray(array: []) - let value2 = value1 - let message = "expected to not be identical to \(identityAsString(value2)), got \(identityAsString(value1))" - failsWithErrorMessage(message) { - expect(value1).toNot(beIdenticalTo(value2)) - } - } - - func testOperators() { - let value = NSDate() - expect(value) === value - expect(NSNumber(value:1)) !== NSNumber(value:2) - } - - func testBeAlias() { - let value = NSDate() - expect(value).to(be(value)) - expect(NSNumber(value:1)).toNot(be(NSString(string: "turtles"))) - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect([1]).toNot(be([1])) - #else - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) - #endif - - let value1 = NSArray(array: []) - let value2 = value1 - let message = "expected to not be identical to \(identityAsString(value1)), got \(identityAsString(value2))" - failsWithErrorMessage(message) { - expect(value1).toNot(be(value2)) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift deleted file mode 100644 index 1668223..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeLessThanOrEqualToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeLessThanOrEqualToTest) -> () throws -> Void)] { - return [ - ("testLessThanOrEqualTo", testLessThanOrEqualTo), - ("testLessThanOrEqualToOperator", testLessThanOrEqualToOperator), - ] - } - - func testLessThanOrEqualTo() { - expect(10).to(beLessThanOrEqualTo(10)) - expect(2).to(beLessThanOrEqualTo(10)) - expect(2).toNot(beLessThanOrEqualTo(1)) - - expect(NSNumber(value:2)).to(beLessThanOrEqualTo(10)) - expect(NSNumber(value:2)).toNot(beLessThanOrEqualTo(1)) -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(2).to(beLessThanOrEqualTo(NSNumber(value:10))) - expect(2).toNot(beLessThanOrEqualTo(NSNumber(value:1))) -#endif - - failsWithErrorMessage("expected to be less than or equal to <0>, got <2>") { - expect(2).to(beLessThanOrEqualTo(0)) - return - } - failsWithErrorMessage("expected to not be less than or equal to <0>, got <0>") { - expect(0).toNot(beLessThanOrEqualTo(0)) - return - } - failsWithErrorMessageForNil("expected to be less than or equal to <2>, got ") { - expect(nil as Int?).to(beLessThanOrEqualTo(2)) - return - } - failsWithErrorMessageForNil("expected to not be less than or equal to <-2>, got ") { - expect(nil as Int?).toNot(beLessThanOrEqualTo(-2)) - return - } - } - - func testLessThanOrEqualToOperator() { - expect(0) <= 1 - expect(1) <= 1 - - failsWithErrorMessage("expected to be less than or equal to <1>, got <2>") { - expect(2) <= 1 - return - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift deleted file mode 100644 index f1c3317..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeLessThanTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeLessThanTest) -> () throws -> Void)] { - return [ - ("testLessThan", testLessThan), - ("testLessThanOperator", testLessThanOperator), - ] - } - - func testLessThan() { - expect(2).to(beLessThan(10)) - expect(2).toNot(beLessThan(1)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:2)).to(beLessThan(10)) - expect(NSNumber(value:2)).toNot(beLessThan(1)) - - expect(2).to(beLessThan(NSNumber(value:10))) - expect(2).toNot(beLessThan(NSNumber(value:1))) -#else - expect(NSNumber(value:2)).to(beLessThan(10 as NSNumber)) - expect(NSNumber(value:2)).toNot(beLessThan(1 as NSNumber)) - - expect(2 as NSNumber).to(beLessThan(NSNumber(value:10))) - expect(2 as NSNumber).toNot(beLessThan(NSNumber(value:1))) -#endif - - failsWithErrorMessage("expected to be less than <0>, got <2>") { - expect(2).to(beLessThan(0)) - } - failsWithErrorMessage("expected to not be less than <1>, got <0>") { - expect(0).toNot(beLessThan(1)) - } - - failsWithErrorMessageForNil("expected to be less than <2>, got ") { - expect(nil as Int?).to(beLessThan(2)) - } - failsWithErrorMessageForNil("expected to not be less than <-1>, got ") { - expect(nil as Int?).toNot(beLessThan(-1)) - } - } - - func testLessThanOperator() { - expect(0) < 1 -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:0)) < 1 -#else - expect(NSNumber(value:0)) < 1 as NSNumber -#endif - failsWithErrorMessage("expected to be less than <1>, got <2>") { - expect(2) < 1 - return - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift deleted file mode 100644 index 947a1b4..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift +++ /dev/null @@ -1,270 +0,0 @@ -import XCTest -import Nimble -import Foundation - -enum ConvertsToBool: ExpressibleByBooleanLiteral, CustomStringConvertible { - case trueLike, falseLike - - typealias BooleanLiteralType = Bool - - init(booleanLiteral value: Bool) { - switch value { - case true: self = .trueLike - case false: self = .falseLike - } - } - - var boolValue: Bool { - switch self { - case .trueLike: return true - case .falseLike: return false - } - } - - var description: String { - switch self { - case .trueLike: return "TrueLike" - case .falseLike: return "FalseLike" - } - } -} - -final class BeTruthyTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeTruthyTest) -> () throws -> Void)] { - return [ - ("testShouldMatchNonNilTypes", testShouldMatchNonNilTypes), - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchNilTypes", testShouldNotMatchNilTypes), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ("testShouldMatchBoolConvertibleTypesThatConvertToTrue", testShouldMatchBoolConvertibleTypesThatConvertToTrue), - ("testShouldNotMatchBoolConvertibleTypesThatConvertToFalse", testShouldNotMatchBoolConvertibleTypesThatConvertToFalse), - ] - } - - func testShouldMatchNonNilTypes() { - expect(true as Bool?).to(beTruthy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(1 as Int8?).to(beTruthy()) - expect(1 as UInt8?).to(beTruthy()) - expect(1 as Int16?).to(beTruthy()) - expect(1 as UInt16?).to(beTruthy()) - expect(1 as Int32?).to(beTruthy()) - expect(1 as UInt32?).to(beTruthy()) - expect(1 as Int64?).to(beTruthy()) - expect(1 as UInt64?).to(beTruthy()) - expect(1 as Float?).to(beTruthy()) - expect(1 as Double?).to(beTruthy()) - expect(1 as Int?).to(beTruthy()) - expect(1 as UInt?).to(beTruthy()) - } - - func testShouldMatchTrue() { - expect(true).to(beTruthy()) - - failsWithErrorMessage("expected to not be truthy, got ") { - expect(true).toNot(beTruthy()) - } - } - - func testShouldNotMatchNilTypes() { - expect(false as Bool?).toNot(beTruthy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(nil as Bool?).toNot(beTruthy()) - expect(nil as Int8?).toNot(beTruthy()) - expect(nil as UInt8?).toNot(beTruthy()) - expect(nil as Int16?).toNot(beTruthy()) - expect(nil as UInt16?).toNot(beTruthy()) - expect(nil as Int32?).toNot(beTruthy()) - expect(nil as UInt32?).toNot(beTruthy()) - expect(nil as Int64?).toNot(beTruthy()) - expect(nil as UInt64?).toNot(beTruthy()) - expect(nil as Float?).toNot(beTruthy()) - expect(nil as Double?).toNot(beTruthy()) - expect(nil as Int?).toNot(beTruthy()) - expect(nil as UInt?).toNot(beTruthy()) - } - - func testShouldNotMatchFalse() { - expect(false).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(false).to(beTruthy()) - } - } - - func testShouldNotMatchNilBools() { - expect(nil as Bool?).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(nil as Bool?).to(beTruthy()) - } - } - - func testShouldMatchBoolConvertibleTypesThatConvertToTrue() { - expect(ConvertsToBool.trueLike).to(beTruthy()) - - failsWithErrorMessage("expected to not be truthy, got ") { - expect(ConvertsToBool.trueLike).toNot(beTruthy()) - } - } - - func testShouldNotMatchBoolConvertibleTypesThatConvertToFalse() { - expect(ConvertsToBool.falseLike).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(ConvertsToBool.falseLike).to(beTruthy()) - } - } -} - -final class BeTrueTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeTrueTest) -> () throws -> Void)] { - return [ - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ] - } - - func testShouldMatchTrue() { - expect(true).to(beTrue()) - - failsWithErrorMessage("expected to not be true, got ") { - expect(true).toNot(beTrue()) - } - } - - func testShouldNotMatchFalse() { - expect(false).toNot(beTrue()) - - failsWithErrorMessage("expected to be true, got ") { - expect(false).to(beTrue()) - } - } - - func testShouldNotMatchNilBools() { - failsWithErrorMessageForNil("expected to not be true, got ") { - expect(nil as Bool?).toNot(beTrue()) - } - - failsWithErrorMessageForNil("expected to be true, got ") { - expect(nil as Bool?).to(beTrue()) - } - } -} - -final class BeFalsyTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeFalsyTest) -> () throws -> Void)] { - return [ - ("testShouldMatchNilTypes", testShouldMatchNilTypes), - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ("testShouldNotMatchNonNilTypes", testShouldNotMatchNonNilTypes), - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldMatchNilBools", testShouldMatchNilBools), - ] - } - - func testShouldMatchNilTypes() { - expect(false as Bool?).to(beFalsy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(nil as Bool?).to(beFalsy()) - expect(nil as Int8?).to(beFalsy()) - expect(nil as UInt8?).to(beFalsy()) - expect(nil as Int16?).to(beFalsy()) - expect(nil as UInt16?).to(beFalsy()) - expect(nil as Int32?).to(beFalsy()) - expect(nil as UInt32?).to(beFalsy()) - expect(nil as Int64?).to(beFalsy()) - expect(nil as UInt64?).to(beFalsy()) - expect(nil as Float?).to(beFalsy()) - expect(nil as Double?).to(beFalsy()) - expect(nil as Int?).to(beFalsy()) - expect(nil as UInt?).to(beFalsy()) - } - - func testShouldNotMatchTrue() { - expect(true).toNot(beFalsy()) - - failsWithErrorMessage("expected to be falsy, got ") { - expect(true).to(beFalsy()) - } - } - - func testShouldNotMatchNonNilTypes() { - expect(true as Bool?).toNot(beFalsy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(1 as Int8?).toNot(beFalsy()) - expect(1 as UInt8?).toNot(beFalsy()) - expect(1 as Int16?).toNot(beFalsy()) - expect(1 as UInt16?).toNot(beFalsy()) - expect(1 as Int32?).toNot(beFalsy()) - expect(1 as UInt32?).toNot(beFalsy()) - expect(1 as Int64?).toNot(beFalsy()) - expect(1 as UInt64?).toNot(beFalsy()) - expect(1 as Float?).toNot(beFalsy()) - expect(1 as Double?).toNot(beFalsy()) - expect(1 as Int?).toNot(beFalsy()) - expect(1 as UInt?).toNot(beFalsy()) - } - - func testShouldMatchFalse() { - expect(false).to(beFalsy()) - - failsWithErrorMessage("expected to not be falsy, got ") { - expect(false).toNot(beFalsy()) - } - } - - func testShouldMatchNilBools() { - expect(nil as Bool?).to(beFalsy()) - - failsWithErrorMessage("expected to not be falsy, got ") { - expect(nil as Bool?).toNot(beFalsy()) - } - } -} - -final class BeFalseTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeFalseTest) -> () throws -> Void)] { - return [ - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ] - } - - func testShouldNotMatchTrue() { - expect(true).toNot(beFalse()) - - failsWithErrorMessage("expected to be false, got ") { - expect(true).to(beFalse()) - } - } - - func testShouldMatchFalse() { - expect(false).to(beFalse()) - - failsWithErrorMessage("expected to not be false, got ") { - expect(false).toNot(beFalse()) - } - } - - func testShouldNotMatchNilBools() { - failsWithErrorMessageForNil("expected to be false, got ") { - expect(nil as Bool?).to(beFalse()) - } - - failsWithErrorMessageForNil("expected to not be false, got ") { - expect(nil as Bool?).toNot(beFalse()) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift deleted file mode 100644 index 69f4185..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift +++ /dev/null @@ -1,28 +0,0 @@ -import XCTest -import Nimble - -final class BeNilTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeNilTest) -> () throws -> Void)] { - return [ - ("testBeNil", testBeNil), - ] - } - - func producesNil() -> [Int]? { - return nil - } - - func testBeNil() { - expect(nil as Int?).to(beNil()) - expect(1 as Int?).toNot(beNil()) - expect(self.producesNil()).to(beNil()) - - failsWithErrorMessage("expected to not be nil, got ") { - expect(nil as Int?).toNot(beNil()) - } - - failsWithErrorMessage("expected to be nil, got <1>") { - expect(1 as Int?).to(beNil()) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift deleted file mode 100644 index a8eefc1..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift +++ /dev/null @@ -1,32 +0,0 @@ -import XCTest -import Nimble - -final class BeVoidTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeVoidTest) -> () throws -> Void)] { - return [ - ("testBeVoid", testBeVoid), - ] - } - - func testBeVoid() { - expect(()).to(beVoid()) - expect(() as ()?).to(beVoid()) - expect(nil as ()?).toNot(beVoid()) - - expect(()) == () - expect(() as ()?) == () - expect(nil as ()?) != () - - failsWithErrorMessage("expected to not be void, got <()>") { - expect(()).toNot(beVoid()) - } - - failsWithErrorMessage("expected to not be void, got <()>") { - expect(() as ()?).toNot(beVoid()) - } - - failsWithErrorMessage("expected to be void, got ") { - expect(nil as ()?).to(beVoid()) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift deleted file mode 100644 index 276c7d0..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeginWithTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeginWithTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testNegativeMatches", testNegativeMatches), - ] - } - - func testPositiveMatches() { - expect([1, 2, 3]).to(beginWith(1)) - expect([1, 2, 3]).toNot(beginWith(2)) - - expect("foobar").to(beginWith("foo")) - expect("foobar").toNot(beginWith("oo")) - - expect("foobarfoo").to(beginWith("foo")) - - expect(NSString(string: "foobar").description).to(beginWith("foo")) - expect(NSString(string: "foobar").description).toNot(beginWith("oo")) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray(array: ["a", "b"])).to(beginWith("a")) - expect(NSArray(array: ["a", "b"])).toNot(beginWith("b")) -#endif - } - - func testNegativeMatches() { - failsWithErrorMessageForNil("expected to begin with , got ") { - expect(nil as NSArray?).to(beginWith(NSString(string: "b"))) - } - failsWithErrorMessageForNil("expected to not begin with , got ") { - expect(nil as NSArray?).toNot(beginWith(NSString(string: "b"))) - } - - failsWithErrorMessage("expected to begin with <2>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(beginWith(2)) - } - failsWithErrorMessage("expected to not begin with <1>, got <[1, 2, 3]>") { - expect([1, 2, 3]).toNot(beginWith(1)) - } - failsWithErrorMessage("expected to begin with , got ") { - expect("batman").to(beginWith("atm")) - } - failsWithErrorMessage("expected to not begin with , got ") { - expect("batman").toNot(beginWith("bat")) - } - } - -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift deleted file mode 100644 index a9fe80e..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift +++ /dev/null @@ -1,86 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class ContainElementSatisfyingTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ContainElementSatisfyingTest) -> () throws -> Void)] { - return [ - ("testContainElementSatisfying", testContainElementSatisfying), - ("testContainElementSatisfyingDefaultErrorMessage", testContainElementSatisfyingDefaultErrorMessage), - ("testContainElementSatisfyingSpecificErrorMessage", testContainElementSatisfyingSpecificErrorMessage), - ("testContainElementSatisfyingNegativeCase", - testContainElementSatisfyingNegativeCase), - ("testContainElementSatisfyingNegativeCaseDefaultErrorMessage", - testContainElementSatisfyingNegativeCaseDefaultErrorMessage), - ("testContainElementSatisfyingNegativeCaseSpecificErrorMessage", - testContainElementSatisfyingNegativeCaseSpecificErrorMessage), - ] - } - - func testContainElementSatisfying() { - var orderIndifferentArray = [1, 2, 3] - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 1 - })) - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 2 - })) - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 3 - })) - - orderIndifferentArray = [3, 1, 2] - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 1 - })) - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 2 - })) - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 3 - })) - } - - func testContainElementSatisfyingDefaultErrorMessage() { - let orderIndifferentArray = [1, 2, 3] - failsWithErrorMessage("expected to find object in collection that satisfies predicate") { - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 4 - })) - } - } - - func testContainElementSatisfyingSpecificErrorMessage() { - let orderIndifferentArray = [1, 2, 3] - failsWithErrorMessage("expected to find object in collection equal to 4") { - expect(orderIndifferentArray).to(containElementSatisfying({ number in - return number == 4 - }, "equal to 4")) - } - } - - func testContainElementSatisfyingNegativeCase() { - let orderIndifferentArray = ["puppies", "kittens", "turtles"] - expect(orderIndifferentArray).toNot(containElementSatisfying({ string in - return string == "armadillos" - })) - } - - func testContainElementSatisfyingNegativeCaseDefaultErrorMessage() { - let orderIndifferentArray = ["puppies", "kittens", "turtles"] - failsWithErrorMessage("expected to not find object in collection that satisfies predicate") { - expect(orderIndifferentArray).toNot(containElementSatisfying({ string in - return string == "kittens" - })) - } - } - - func testContainElementSatisfyingNegativeCaseSpecificErrorMessage() { - let orderIndifferentArray = ["puppies", "kittens", "turtles"] - failsWithErrorMessage("expected to not find object in collection equal to 'kittens'") { - expect(orderIndifferentArray).toNot(containElementSatisfying({ string in - return string == "kittens" - }, "equal to 'kittens'")) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift deleted file mode 100644 index a63c79d..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift +++ /dev/null @@ -1,95 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class ContainTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ContainTest) -> () throws -> Void)] { - return [ - ("testContain", testContain), - ("testContainSubstring", testContainSubstring), - ("testContainObjCSubstring", testContainObjCSubstring), - ("testVariadicArguments", testVariadicArguments), - ("testCollectionArguments", testCollectionArguments), - ] - } - - func testContain() { - expect([1, 2, 3]).to(contain(1)) - expect([1, 2, 3] as [CInt]).to(contain(1 as CInt)) - expect([1, 2, 3] as [CInt]).toNot(contain(4 as CInt)) - expect(["foo", "bar", "baz"]).to(contain("baz")) - expect([1, 2, 3]).toNot(contain(4)) - expect(["foo", "bar", "baz"]).toNot(contain("ba")) -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray(array: ["a"])).to(contain(NSString(string: "a"))) - expect(NSArray(array: ["a"])).toNot(contain(NSString(string:"b"))) - expect(NSArray(object: 1) as NSArray?).to(contain(1)) -#endif - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain("bar")) - } - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain("b")) - } - - failsWithErrorMessageForNil("expected to contain , got ") { - expect(nil as [String]?).to(contain("bar")) - } - failsWithErrorMessageForNil("expected to not contain , got ") { - expect(nil as [String]?).toNot(contain("b")) - } - } - - func testContainSubstring() { - expect("foo").to(contain("o")) - expect("foo").to(contain("oo")) - expect("foo").toNot(contain("z")) - expect("foo").toNot(contain("zz")) - - failsWithErrorMessage("expected to contain , got ") { - expect("foo").to(contain("bar")) - } - failsWithErrorMessage("expected to not contain , got ") { - expect("foo").toNot(contain("oo")) - } - } - - func testContainObjCSubstring() { - let str = NSString(string: "foo") - expect(str).to(contain(NSString(string: "o"))) - expect(str).to(contain(NSString(string: "oo"))) - expect(str).toNot(contain(NSString(string: "z"))) - expect(str).toNot(contain(NSString(string: "zz"))) - } - - func testVariadicArguments() { - expect([1, 2, 3]).to(contain(1, 2)) - expect([1, 2, 3]).toNot(contain(1, 4)) - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain("a", "bar")) - } - - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain("b", "a")) - } - } - - func testCollectionArguments() { - expect([1, 2, 3]).to(contain([1, 2])) - expect([1, 2, 3]).toNot(contain([1, 4])) - - let collection = Array(1...10) - let slice = Array(collection[3...5]) - expect(collection).to(contain(slice)) - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain(["a", "bar"])) - } - - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain(["b", "a"])) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift deleted file mode 100644 index 30e3b26..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class EndWithTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (EndWithTest) -> () throws -> Void)] { - return [ - ("testEndWithPositives", testEndWithPositives), - ("testEndWithNegatives", testEndWithNegatives), - ] - } - - func testEndWithPositives() { - expect([1, 2, 3]).to(endWith(3)) - expect([1, 2, 3]).toNot(endWith(2)) - expect([]).toNot(endWith(1)) - expect(["a", "b", "a"]).to(endWith("a")) - - expect("foobar").to(endWith("bar")) - expect("foobar").toNot(endWith("oo")) - expect("foobarfoo").to(endWith("foo")) - - expect(NSString(string: "foobar").description).to(endWith("bar")) - expect(NSString(string: "foobar").description).toNot(endWith("oo")) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray(array: ["a", "b"])).to(endWith("b")) - expect(NSArray(array: ["a", "b"])).toNot(endWith("a")) - expect(NSArray(array: [])).toNot(endWith("a")) - expect(NSArray(array: ["a", "b", "a"])).to(endWith("a")) -#endif - } - - func testEndWithNegatives() { - failsWithErrorMessageForNil("expected to end with <2>, got ") { - expect(nil as [Int]?).to(endWith(2)) - } - failsWithErrorMessageForNil("expected to not end with <2>, got ") { - expect(nil as [Int]?).toNot(endWith(2)) - } - - failsWithErrorMessage("expected to end with <2>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(endWith(2)) - } - failsWithErrorMessage("expected to not end with <3>, got <[1, 2, 3]>") { - expect([1, 2, 3]).toNot(endWith(3)) - } - failsWithErrorMessage("expected to end with , got ") { - expect("batman").to(endWith("atm")) - } - failsWithErrorMessage("expected to not end with , got ") { - expect("batman").toNot(endWith("man")) - } - } - -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift deleted file mode 100644 index 48f8c28..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift +++ /dev/null @@ -1,276 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class EqualTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (EqualTest) -> () throws -> Void)] { - return [ - ("testEquality", testEquality), - ("testArrayEquality", testArrayEquality), - ("testSetEquality", testSetEquality), - ("testDoesNotMatchNils", testDoesNotMatchNils), - ("testDictionaryEquality", testDictionaryEquality), - ("testDataEquality", testDataEquality), - ("testNSObjectEquality", testNSObjectEquality), - ("testOperatorEquality", testOperatorEquality), - ("testOperatorEqualityWithArrays", testOperatorEqualityWithArrays), - ("testOperatorEqualityWithDictionaries", testOperatorEqualityWithDictionaries), - ("testOptionalEquality", testOptionalEquality), - ("testArrayOfOptionalsEquality", testArrayOfOptionalsEquality), - ("testDictionariesWithDifferentSequences", testDictionariesWithDifferentSequences), - ] - } - - func testEquality() { - expect(1 as CInt).to(equal(1 as CInt)) - expect(1 as CInt).to(equal(1)) - expect(1).to(equal(1)) - expect("hello").to(equal("hello")) - expect("hello").toNot(equal("world")) - - expect { - 1 - }.to(equal(1)) - - failsWithErrorMessage("expected to equal , got ") { - expect("hello").to(equal("world")) - } - failsWithErrorMessage("expected to not equal , got ") { - expect("hello").toNot(equal("hello")) - } - } - - func testArrayEquality() { - expect([1, 2, 3]).to(equal([1, 2, 3])) - expect([1, 2, 3]).toNot(equal([1, 2])) - expect([1, 2, 3]).toNot(equal([1, 2, 4])) - - let array1: [Int] = [1, 2, 3] - let array2: [Int] = [1, 2, 3] - expect(array1).to(equal(array2)) - expect(array1).to(equal([1, 2, 3])) - expect(array1).toNot(equal([1, 2] as [Int])) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSArray(array: [1, 2, 3])).to(equal(NSArray(array: [1, 2, 3]))) -#endif - - failsWithErrorMessage("expected to equal <[1, 2]>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(equal([1, 2])) - } - } - - func testSetEquality() { - expect(Set([1, 2])).to(equal(Set([1, 2]))) - expect(Set()).to(equal(Set())) - expect(Set()) == Set() - expect(Set([1, 2])) != Set() - - failsWithErrorMessageForNil("expected to equal <[1, 2]>, got ") { - expect(nil as Set?).to(equal(Set([1, 2]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3]>, missing <[1]>") { - expect(Set([2, 3])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[1, 2, 3, 4]>, extra <[4]>") { - expect(Set([1, 2, 3, 4])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3, 4]>, missing <[1]>, extra <[4]>") { - expect(Set([2, 3, 4])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3, 4]>, missing <[1]>, extra <[4]>") { - expect(Set([2, 3, 4])) == Set([1, 2, 3]) - } - - failsWithErrorMessage("expected to not equal <[1, 2, 3]>, got <[1, 2, 3]>") { - expect(Set([1, 2, 3])) != Set([1, 2, 3]) - } - } - - func testDoesNotMatchNils() { - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as String?).to(equal(nil as String?)) - } - failsWithErrorMessageForNil("expected to not equal , got ") { - expect("foo").toNot(equal(nil as String?)) - } - failsWithErrorMessageForNil("expected to not equal , got ") { - expect(nil as String?).toNot(equal("bar")) - } - - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as [Int]?).to(equal(nil as [Int]?)) - } - failsWithErrorMessageForNil("expected to not equal <[1]>, got ") { - expect(nil as [Int]?).toNot(equal([1])) - } - failsWithErrorMessageForNil("expected to not equal , got <[1]>") { - expect([1]).toNot(equal(nil as [Int]?)) - } - - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as [Int: Int]?).to(equal(nil as [Int: Int]?)) - } - failsWithErrorMessageForNil("expected to not equal <[1: 1]>, got ") { - expect(nil as [Int: Int]?).toNot(equal([1: 1])) - } - failsWithErrorMessageForNil("expected to not equal , got <[1: 1]>") { - expect([1: 1]).toNot(equal(nil as [Int: Int]?)) - } - - failsWithErrorMessageForNil("expected to not equal , got <1>") { - expect(1).toNot(equal(nil)) - } - } - - func testDictionaryEquality() { - expect(["foo": "bar"]).to(equal(["foo": "bar"])) - expect(["foo": "bar"]).toNot(equal(["foo": "baz"])) - - let actual = ["foo": "bar"] - let expected = ["foo": "bar"] - let unexpected = ["foo": "baz"] - expect(actual).to(equal(expected)) - expect(actual).toNot(equal(unexpected)) - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString)).to(equal(["foo": "bar"])) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString) as? [String:String]).to(equal(expected)) -#endif - } - - func testDataEquality() { - let actual = "foobar".data(using: .utf8) - let expected = "foobar".data(using: .utf8) - let unexpected = "foobarfoo".data(using: .utf8) - - expect(actual).to(equal(expected)) - expect(actual).toNot(equal(unexpected)) - - #if os(Linux) - // FIXME: Swift on Linux triggers a segfault when calling NSData's hash() (last checked on 03-11) - let expectedErrorMessage = "expected to equal >, got >" - #else - let expectedErrorMessage = "expected to equal >," - + " got >" - #endif - - failsWithErrorMessage(expectedErrorMessage) { - expect(actual).to(equal(unexpected)) - } - } - - func testNSObjectEquality() { - expect(NSNumber(value:1)).to(equal(NSNumber(value:1))) - expect(NSNumber(value:1)) == NSNumber(value:1) - expect(NSNumber(value:1)) != NSNumber(value:2) - expect { NSNumber(value:1) }.to(equal(1)) - } - - func testOperatorEquality() { - expect("foo") == "foo" - expect("foo") != "bar" - - failsWithErrorMessage("expected to equal , got ") { - expect("hello") == "world" - return - } - failsWithErrorMessage("expected to not equal , got ") { - expect("hello") != "hello" - return - } - } - - func testOperatorEqualityWithArrays() { - let array1: [Int] = [1, 2, 3] - let array2: [Int] = [1, 2, 3] - let array3: [Int] = [1, 2] - expect(array1) == array2 - expect(array1) != array3 - } - - func testOperatorEqualityWithDictionaries() { - let dict1 = ["foo": "bar"] - let dict2 = ["foo": "bar"] - let dict3 = ["foo": "baz"] - expect(dict1) == dict2 - expect(dict1) != dict3 - } - - func testOptionalEquality() { - expect(1 as CInt?).to(equal(1)) - expect(1 as CInt?).to(equal(1 as CInt?)) - } - - func testArrayOfOptionalsEquality() { - let array1: [Int?] = [1, nil, 3] - let array2: [Int?] = [nil, 2, 3] - let array3: [Int?] = [1, nil, 3] - - expect(array1).toNot(equal(array2)) - expect(array1).to(equal(array3)) - expect(array2).toNot(equal(array3)) - - let allNils1: [String?] = [nil, nil, nil, nil] - let allNils2: [String?] = [nil, nil, nil, nil] - let notReallyAllNils: [String?] = [nil, nil, nil, "turtles"] - - expect(allNils1).to(equal(allNils2)) - expect(allNils1).toNot(equal(notReallyAllNils)) - - let noNils1: [Int?] = [1, 2, 3, 4, 5] - let noNils2: [Int?] = [1, 3, 5, 7, 9] - - expect(noNils1).toNot(equal(noNils2)) - - failsWithErrorMessage("expected to equal <[Optional(1), nil]>, got <[nil, Optional(2)]>") { - let arrayOfOptionalInts: [Int?] = [nil, 2] - let anotherArrayOfOptionalInts: [Int?] = [1, nil] - expect(arrayOfOptionalInts).to(equal(anotherArrayOfOptionalInts)) - return - } - } - - func testDictionariesWithDifferentSequences() { - // see: https://github.com/Quick/Nimble/issues/61 - // these dictionaries generate different orderings of sequences. - let result = ["how": 1, "think": 1, "didnt": 2, "because": 1, - "interesting": 1, "always": 1, "right": 1, "such": 1, - "to": 3, "say": 1, "cool": 1, "you": 1, - "weather": 3, "be": 1, "went": 1, "was": 2, - "sometimes": 1, "and": 3, "mind": 1, "rain": 1, - "whole": 1, "everything": 1, "weather.": 1, "down": 1, - "kind": 1, "mood.": 1, "it": 2, "everyday": 1, "might": 1, - "more": 1, "have": 2, "person": 1, "could": 1, "tenth": 2, - "night": 1, "write": 1, "Youd": 1, "affects": 1, "of": 3, - "Who": 1, "us": 1, "an": 1, "I": 4, "my": 1, "much": 2, - "wrong.": 1, "peacefully.": 1, "amazing": 3, "would": 4, - "just": 1, "grade.": 1, "Its": 2, "The": 2, "had": 1, "that": 1, - "the": 5, "best": 1, "but": 1, "essay": 1, "for": 1, "summer": 2, - "your": 1, "grade": 1, "vary": 1, "pretty": 1, "at": 1, "rain.": 1, - "about": 1, "allow": 1, "thought": 1, "in": 1, "sleep": 1, "a": 1, - "hot": 1, "really": 1, "beach": 1, "life.": 1, "we": 1, "although": 1, ] - - let storyCount = ["The": 2, "summer": 2, "of": 3, "tenth": 2, "grade": 1, - "was": 2, "the": 5, "best": 1, "my": 1, "life.": 1, "I": 4, - "went": 1, "to": 3, "beach": 1, "everyday": 1, "and": 3, - "we": 1, "had": 1, "amazing": 3, "weather.": 1, "weather": 3, - "didnt": 2, "really": 1, "vary": 1, "much": 2, "always": 1, - "pretty": 1, "hot": 1, "although": 1, "sometimes": 1, "at": 1, - "night": 1, "it": 2, "would": 4, "rain.": 1, "mind": 1, "rain": 1, - "because": 1, "cool": 1, "everything": 1, "down": 1, "allow": 1, - "us": 1, "sleep": 1, "peacefully.": 1, "Its": 2, "how": 1, - "affects": 1, "your": 1, "mood.": 1, "Who": 1, "have": 2, - "thought": 1, "that": 1, "could": 1, "write": 1, "a": 1, - "whole": 1, "essay": 1, "just": 1, "about": 1, "in": 1, - "grade.": 1, "kind": 1, "right": 1, "Youd": 1, "think": 1, - "for": 1, "such": 1, "an": 1, "interesting": 1, "person": 1, - "might": 1, "more": 1, "say": 1, "but": 1, "you": 1, "be": 1, "wrong.": 1, ] - - expect(result).to(equal(storyCount)) - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift deleted file mode 100644 index a0294c3..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble - -final class HaveCountTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (HaveCountTest) -> () throws -> Void)] { - return [ - ("testHaveCountForArray", testHaveCountForArray), - ("testHaveCountForDictionary", testHaveCountForDictionary), - ("testHaveCountForSet", testHaveCountForSet), - ] - } - - func testHaveCountForArray() { - expect([1, 2, 3]).to(haveCount(3)) - expect([1, 2, 3]).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Array with count 1, got 3\nActual Value: [1, 2, 3]") { - expect([1, 2, 3]).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Array with count 3, got 3\nActual Value: [1, 2, 3]") { - expect([1, 2, 3]).notTo(haveCount(3)) - } - } - - func testHaveCountForDictionary() { - let dictionary = ["1": 1, "2": 2, "3": 3] - expect(dictionary).to(haveCount(3)) - expect(dictionary).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Dictionary with count 1, got 3\nActual Value: \(stringify(dictionary))") { - expect(dictionary).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Dictionary with count 3, got 3" + - "\nActual Value: \(stringify(dictionary))") { - expect(dictionary).notTo(haveCount(3)) - } - } - - func testHaveCountForSet() { - let set = Set([1, 2, 3]) - expect(set).to(haveCount(3)) - expect(set).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Set with count 1, got 3" + - "\nActual Value: \(stringify(set))") { - expect(set).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Set with count 3, got 3" + - "\nActual Value: \(stringify(set))") { - expect(set).notTo(haveCount(3)) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift deleted file mode 100644 index 2d626f2..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift +++ /dev/null @@ -1,84 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class MatchErrorTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (MatchErrorTest) -> () throws -> Void)] { - return [ - ("testMatchErrorPositive", testMatchErrorPositive), - ("testMatchErrorNegative", testMatchErrorNegative), - ("testMatchNSErrorPositive", testMatchNSErrorPositive), - ("testMatchNSErrorNegative", testMatchNSErrorNegative), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testDoesNotMatchNils", testDoesNotMatchNils), - ] - } - - func testMatchErrorPositive() { - expect(NimbleError.laugh).to(matchError(NimbleError.laugh)) - expect(NimbleError.laugh).to(matchError(NimbleError.self)) - expect(EquatableError.parameterized(x: 1)).to(matchError(EquatableError.parameterized(x: 1))) - - expect(NimbleError.laugh as Error).to(matchError(NimbleError.laugh)) - } - - func testMatchErrorNegative() { - expect(NimbleError.laugh).toNot(matchError(NimbleError.cry)) - expect(NimbleError.laugh as Error).toNot(matchError(NimbleError.cry)) - expect(NimbleError.laugh).toNot(matchError(EquatableError.self)) - expect(EquatableError.parameterized(x: 1)).toNot(matchError(EquatableError.parameterized(x: 2))) - } - - func testMatchNSErrorPositive() { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 0, userInfo: nil) - - expect(error1).to(matchError(error2)) - } - - func testMatchNSErrorNegative() { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 1, userInfo: nil) - - expect(error1).toNot(matchError(error2)) - } - - func testMatchPositiveMessage() { - failsWithErrorMessage("expected to match error , got ") { - expect(EquatableError.parameterized(x: 1)).to(matchError(EquatableError.parameterized(x: 2))) - } - failsWithErrorMessage("expected to match error , got ") { - expect(NimbleError.laugh).to(matchError(NimbleError.cry)) - } - failsWithErrorMessage("expected to match error , got ") { - expect(CustomDebugStringConvertibleError.a).to(matchError(CustomDebugStringConvertibleError.b)) - } - - failsWithErrorMessage("expected to match error , got ") { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 1, userInfo: nil) - expect(error1).to(matchError(error2)) - } - } - - func testMatchNegativeMessage() { - failsWithErrorMessage("expected to not match error , got ") { - expect(NimbleError.laugh).toNot(matchError(NimbleError.laugh)) - } - - failsWithErrorMessage("expected to match error from type , got ") { - expect(NimbleError.laugh).to(matchError(EquatableError.self)) - } - } - - func testDoesNotMatchNils() { - failsWithErrorMessageForNil("expected to match error , got no error") { - expect(nil as Error?).to(matchError(NimbleError.laugh)) - } - - failsWithErrorMessageForNil("expected to not match error , got no error") { - expect(nil as Error?).toNot(matchError(NimbleError.laugh)) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift deleted file mode 100644 index a95ba56..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift +++ /dev/null @@ -1,46 +0,0 @@ -import XCTest -import Nimble - -final class MatchTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (MatchTest) -> () throws -> Void)] { - return [ - ("testMatchPositive", testMatchPositive), - ("testMatchNegative", testMatchNegative), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testMatchNils", testMatchNils), - ] - } - - func testMatchPositive() { - expect("11:14").to(match("\\d{2}:\\d{2}")) - } - - func testMatchNegative() { - expect("hello").toNot(match("\\d{2}:\\d{2}")) - } - - func testMatchPositiveMessage() { - let message = "expected to match <\\d{2}:\\d{2}>, got " - failsWithErrorMessage(message) { - expect("hello").to(match("\\d{2}:\\d{2}")) - } - } - - func testMatchNegativeMessage() { - let message = "expected to not match <\\d{2}:\\d{2}>, got <11:14>" - failsWithErrorMessage(message) { - expect("11:14").toNot(match("\\d{2}:\\d{2}")) - } - } - - func testMatchNils() { - failsWithErrorMessageForNil("expected to match <\\d{2}:\\d{2}>, got ") { - expect(nil as String?).to(match("\\d{2}:\\d{2}")) - } - - failsWithErrorMessageForNil("expected to not match <\\d{2}:\\d{2}>, got ") { - expect(nil as String?).toNot(match("\\d{2}:\\d{2}")) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift deleted file mode 100644 index ac7f9ec..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift +++ /dev/null @@ -1,91 +0,0 @@ -import XCTest -import Nimble -import Foundation - -final class PostNotificationTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (PostNotificationTest) -> () throws -> Void)] { - return [ - ("testPassesWhenNoNotificationsArePosted", testPassesWhenNoNotificationsArePosted), - ("testPassesWhenExpectedNotificationIsPosted", testPassesWhenExpectedNotificationIsPosted), - ("testPassesWhenAllExpectedNotificationsArePosted", testPassesWhenAllExpectedNotificationsArePosted), - ("testFailsWhenNoNotificationsArePosted", testFailsWhenNoNotificationsArePosted), - ("testFailsWhenNotificationWithWrongNameIsPosted", testFailsWhenNotificationWithWrongNameIsPosted), - ("testFailsWhenNotificationWithWrongObjectIsPosted", testFailsWhenNotificationWithWrongObjectIsPosted), - ("testPassesWhenExpectedNotificationEventuallyIsPosted", testPassesWhenExpectedNotificationEventuallyIsPosted), - ] - } - - let notificationCenter = NotificationCenter() - - func testPassesWhenNoNotificationsArePosted() { - expect { - // no notifications here! - return nil - }.to(postNotifications(beEmpty(), fromNotificationCenter: notificationCenter)) - } - - func testPassesWhenExpectedNotificationIsPosted() { - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - expect { - self.notificationCenter.post(testNotification) - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) - } - - func testPassesWhenAllExpectedNotificationsArePosted() { - let foo = NSNumber(value: 1) - let bar = NSNumber(value: 2) - let n1 = Notification(name: Notification.Name("Foo"), object: foo) - let n2 = Notification(name: Notification.Name("Bar"), object: bar) - expect { - self.notificationCenter.post(n1) - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1, n2]), fromNotificationCenter: notificationCenter)) - } - - func testFailsWhenNoNotificationsArePosted() { - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - failsWithErrorMessage("expected to equal <[\(testNotification)]>, got no notifications") { - expect { - // no notifications here! - return nil - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testFailsWhenNotificationWithWrongNameIsPosted() { - let n1 = Notification(name: Notification.Name("Foo"), object: nil) - let n2 = Notification(name: Notification.Name(n1.name.rawValue + "a"), object: nil) - failsWithErrorMessage("expected to equal <[\(n1)]>, got <[\(n2)]>") { - expect { - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testFailsWhenNotificationWithWrongObjectIsPosted() { - let n1 = Notification(name: Notification.Name("Foo"), object: nil) - let n2 = Notification(name: n1.name, object: NSObject()) - failsWithErrorMessage("expected to equal <[\(n1)]>, got <[\(n2)]>") { - expect { - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testPassesWhenExpectedNotificationEventuallyIsPosted() { - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - expect { - deferToMainQueue { - self.notificationCenter.post(testNotification) - } - return nil - }.toEventually(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) - #else - print("\(#function) is missing because toEventually is not implement on this platform") - #endif - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift deleted file mode 100644 index 9e6a6f5..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift +++ /dev/null @@ -1,166 +0,0 @@ -import XCTest -import Nimble - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - -final class RaisesExceptionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (RaisesExceptionTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testPositiveMatchesWithClosures", testPositiveMatchesWithClosures), - ("testNegativeMatches", testNegativeMatches), - ("testNegativeMatchesDoNotCallClosureWithoutException", testNegativeMatchesDoNotCallClosureWithoutException), - ("testNegativeMatchesWithClosure", testNegativeMatchesWithClosure), - ] - } - - var anException = NSException(name: NSExceptionName("laugh"), reason: "Lulz", userInfo: ["key": "value"]) - - func testPositiveMatches() { - expect { self.anException.raise() }.to(raiseException()) - expect { self.anException.raise() }.to(raiseException(named: "laugh")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) - } - - func testPositiveMatchesWithClosures() { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName("laugh"))) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("as")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("df")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("as")) - }) - } - - func testNegativeMatches() { - failsWithErrorMessage("expected to raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "foo")) - } - - failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "bar")) - } - - failsWithErrorMessage( - "expected to raise exception with name with reason with userInfo <{k = v;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["k": "v"])) - } - - failsWithErrorMessage("expected to raise any exception, got no exception") { - expect { self.anException }.to(raiseException()) - } - failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) - } - failsWithErrorMessage("expected to raise exception with name with reason , got no exception") { - expect { self.anException }.to(raiseException(named: "laugh", reason: "Lulz")) - } - - failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "bar", reason: "Lulz")) - } - failsWithErrorMessage("expected to not raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh")) - } - failsWithErrorMessage("expected to not raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz")) - } - - failsWithErrorMessage("expected to not raise exception with name with reason with userInfo <{key = value;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) - } - } - - func testNegativeMatchesDoNotCallClosureWithoutException() { - failsWithErrorMessage("expected to raise exception that satisfies block, got no exception") { - expect { self.anException }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName(rawValue:"foo"))) - }) - } - - failsWithErrorMessage("expected to raise exception with name that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo") { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to raise exception with name with reason that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "ha") { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to raise exception with name with reason with userInfo <{}> that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "Lulz", userInfo: [:]) { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) - } - } - - func testNegativeMatchesWithClosure() { - failsWithErrorMessage("expected to raise exception that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - let innerFailureMessage = "expected to begin with , got " - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "wrong") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{key = value;}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "Lulz", userInfo: [:]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift deleted file mode 100644 index 0bd9495..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble -import Foundation - -final class SatisfyAnyOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SatisfyAnyOfTest) -> () throws -> Void)] { - return [ - ("testSatisfyAnyOf", testSatisfyAnyOf), - ("testOperatorOr", testOperatorOr), - ] - } - - func testSatisfyAnyOf() { - expect(2).to(satisfyAnyOf(equal(2), equal(3))) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(satisfyAnyOf(equal(3), equal("turtles"))) -#else - expect(2 as NSNumber).toNot(satisfyAnyOf(equal(3 as NSNumber), equal("turtles" as NSString))) -#endif - expect([1, 2, 3]).to(satisfyAnyOf(equal([1, 2, 3]), allPass({$0 < 4}), haveCount(3))) - expect("turtle").toNot(satisfyAnyOf(contain("a"), endWith("magic"))) - expect(82.0).toNot(satisfyAnyOf(beLessThan(10.5), beGreaterThan(100.75), beCloseTo(50.1))) - expect(false).to(satisfyAnyOf(beTrue(), beFalse())) - expect(true).to(satisfyAnyOf(beTruthy(), beFalsy())) - - failsWithErrorMessage( - "expected to match one of: {equal <3>}, or {equal <4>}, or {equal <5>}, got 2") { - expect(2).to(satisfyAnyOf(equal(3), equal(4), equal(5))) - } - failsWithErrorMessage( - "expected to match one of: {all be less than 4, but failed first at element <5> in <[5, 6, 7]>}, or {equal <[1, 2, 3, 4]>}, got [5, 6, 7]") { - expect([5, 6, 7]).to(satisfyAnyOf(allPass("be less than 4", {$0 < 4}), equal([1, 2, 3, 4]))) - } - failsWithErrorMessage( - "expected to match one of: {be true}, got false") { - expect(false).to(satisfyAnyOf(beTrue())) - } - failsWithErrorMessage( - "expected to not match one of: {be less than <10.5>}, or {be greater than <100.75>}, or {be close to <50.1> (within 0.0001)}, got 50.10001") { - expect(50.10001).toNot(satisfyAnyOf(beLessThan(10.5), beGreaterThan(100.75), beCloseTo(50.1))) - } - } - - func testOperatorOr() { - expect(2).to(equal(2) || equal(3)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(equal(3) || equal("turtles")) -#else - expect(2 as NSNumber).toNot(equal(3 as NSNumber) || equal("turtles" as NSString)) -#endif - expect("turtle").toNot(contain("a") || endWith("magic")) - expect(82.0).toNot(beLessThan(10.5) || beGreaterThan(100.75)) - expect(false).to(beTrue() || beFalse()) - expect(true).to(beTruthy() || beFalsy()) - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift deleted file mode 100644 index 68086e0..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift +++ /dev/null @@ -1,62 +0,0 @@ -import Foundation -import XCTest -import Nimble - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - -final class ThrowAssertionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ThrowAssertionTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testErrorThrown", testErrorThrown), - ("testPostAssertionCodeNotRun", testPostAssertionCodeNotRun), - ("testNegativeMatch", testNegativeMatch), - ("testPositiveMessage", testPositiveMessage), - ("testNegativeMessage", testNegativeMessage), - ] - } - - func testPositiveMatch() { - expect { () -> Void in fatalError() }.to(throwAssertion()) - } - - func testErrorThrown() { - expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion()) - } - - func testPostAssertionCodeNotRun() { - var reachedPoint1 = false - var reachedPoint2 = false - - expect { - reachedPoint1 = true - precondition(false, "condition message") - reachedPoint2 = true - }.to(throwAssertion()) - - expect(reachedPoint1) == true - expect(reachedPoint2) == false - } - - func testNegativeMatch() { - var reachedPoint1 = false - - expect { reachedPoint1 = true }.toNot(throwAssertion()) - - expect(reachedPoint1) == true - } - - func testPositiveMessage() { - failsWithErrorMessage("expected to throw an assertion") { - expect { () -> Void? in return }.to(throwAssertion()) - } - } - - func testNegativeMessage() { - failsWithErrorMessage("expected to not throw an assertion") { - expect { () -> Void in fatalError() }.toNot(throwAssertion()) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift deleted file mode 100644 index f0e0f94..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift +++ /dev/null @@ -1,155 +0,0 @@ -import XCTest -import Nimble - -enum NimbleError: Error { - case laugh - case cry -} - -enum EquatableError: Error { - case parameterized(x: Int) -} - -extension EquatableError : Equatable { -} - -func == (lhs: EquatableError, rhs: EquatableError) -> Bool { - switch (lhs, rhs) { - case (.parameterized(let l), .parameterized(let r)): - return l == r - } -} - -enum CustomDebugStringConvertibleError: Error { - case a - case b -} - -extension CustomDebugStringConvertibleError : CustomDebugStringConvertible { - var debugDescription: String { - return "code=\(_code)" - } -} - -final class ThrowErrorTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ThrowErrorTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testPositiveMatchesWithClosures", testPositiveMatchesWithClosures), - ("testNegativeMatches", testNegativeMatches), - ("testPositiveNegatedMatches", testPositiveNegatedMatches), - ("testNegativeNegatedMatches", testNegativeNegatedMatches), - ("testNegativeMatchesDoNotCallClosureWithoutError", testNegativeMatchesDoNotCallClosureWithoutError), - ("testNegativeMatchesWithClosure", testNegativeMatchesWithClosure), - ] - } - - func testPositiveMatches() { - expect { throw NimbleError.laugh }.to(throwError()) - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh)) - expect { throw NimbleError.laugh }.to(throwError(errorType: NimbleError.self)) - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 1))) - expect { throw EquatableError.parameterized(x: 1) }.toNot(throwError(EquatableError.parameterized(x: 2))) - } - - func testPositiveMatchesWithClosures() { - // Generic typed closure - expect { throw EquatableError.parameterized(x: 42) }.to(throwError { error in - guard case EquatableError.parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Explicit typed closure - expect { throw EquatableError.parameterized(x: 42) }.to(throwError { (error: EquatableError) in - guard case .parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Typed closure over errorType argument - expect { throw EquatableError.parameterized(x: 42) }.to(throwError(errorType: EquatableError.self) { error in - guard case .parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Typed closure over error argument - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh) { (error: Error) in - expect(error._domain).to(beginWith("Nim")) - }) - // Typed closure over error argument - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh) { (error: Error) in - expect(error._domain).toNot(beginWith("as")) - }) - } - - func testNegativeMatches() { - // Same case, different arguments - failsWithErrorMessage("expected to throw error , got ") { - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 2))) - } - // Same case, different arguments - failsWithErrorMessage("expected to throw error , got ") { - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 2))) - } - // Different case - failsWithErrorMessage("expected to throw error , got ") { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.cry)) - } - // Different case with closure - failsWithErrorMessage("expected to throw error that satisfies block, got ") { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.cry) { _ in return }) - } - // Different case, implementing CustomDebugStringConvertible - failsWithErrorMessage("expected to throw error , got ") { - expect { throw CustomDebugStringConvertibleError.a }.to(throwError(CustomDebugStringConvertibleError.b)) - } - } - - func testPositiveNegatedMatches() { - // No error at all - expect { return }.toNot(throwError()) - // Different case - expect { throw NimbleError.laugh }.toNot(throwError(NimbleError.cry)) - } - - func testNegativeNegatedMatches() { - // No error at all - failsWithErrorMessage("expected to not throw any error, got ") { - expect { throw NimbleError.laugh }.toNot(throwError()) - } - // Different error - failsWithErrorMessage("expected to not throw error , got ") { - expect { throw NimbleError.laugh }.toNot(throwError(NimbleError.laugh)) - } - } - - func testNegativeMatchesDoNotCallClosureWithoutError() { - failsWithErrorMessage("expected to throw error that satisfies block, got no error") { - expect { return }.to(throwError { _ in - fail() - }) - } - - failsWithErrorMessage("expected to throw error that satisfies block, got no error") { - expect { return }.to(throwError(NimbleError.laugh) { _ in - fail() - }) - } - } - - func testNegativeMatchesWithClosure() { - let moduleName = "NimbleTests" - let innerFailureMessage = "expected to equal , got <\(moduleName).NimbleError>" - let closure = { (error: Error) in - expect(error._domain).to(equal("foo")) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(closure: closure)) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error from type that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(errorType: NimbleError.self, closure: closure)) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh, closure: closure)) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift deleted file mode 100644 index dde999a..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift +++ /dev/null @@ -1,36 +0,0 @@ -import XCTest -import Nimble - -final class ToSucceedTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ToSucceedTest) -> () throws -> Void)] { - return [ - ("testToSucceed", testToSucceed), - ] - } - - func testToSucceed() { - expect({ - return .succeeded - }).to(succeed()) - - expect({ - return .failed(reason: "") - }).toNot(succeed()) - - failsWithErrorMessageForNil("expected a closure, got ") { - expect(nil as (() -> ToSucceedResult)?).to(succeed()) - } - - failsWithErrorMessage("expected to succeed, got because ") { - expect({ - .failed(reason: "something went wrong") - }).to(succeed()) - } - - failsWithErrorMessage("expected to not succeed, got ") { - expect({ - return .succeeded - }).toNot(succeed()) - } - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTests.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTests.swift deleted file mode 100644 index ce8181b..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTests.swift +++ /dev/null @@ -1,128 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class SynchronousTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SynchronousTest) -> () throws -> Void)] { - return [ - ("testFailAlwaysFails", testFailAlwaysFails), - ("testUnexpectedErrorsThrownFails", testUnexpectedErrorsThrownFails), - ("testToMatchesIfMatcherReturnsTrue", testToMatchesIfMatcherReturnsTrue), - ("testToProvidesActualValueExpression", testToProvidesActualValueExpression), - ("testToProvidesAMemoizedActualValueExpression", testToProvidesActualValueExpression), - ("testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testToMatchAgainstLazyProperties", testToMatchAgainstLazyProperties), - ("testToNotMatchesIfMatcherReturnsTrue", testToNotMatchesIfMatcherReturnsTrue), - ("testToNotProvidesActualValueExpression", testToNotProvidesActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpression", testToNotProvidesAMemoizedActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testToNotNegativeMatches", testToNotNegativeMatches), - ("testNotToMatchesLikeToNot", testNotToMatchesLikeToNot), - ] - } - - class Error: Swift.Error {} - let errorToThrow = Error() - - private func doThrowError() throws -> Int { - throw errorToThrow - } - - func testFailAlwaysFails() { - failsWithErrorMessage("My error message") { - fail("My error message") - } - failsWithErrorMessage("fail() always fails") { - fail() - } - } - - func testUnexpectedErrorsThrownFails() { - failsWithErrorMessage("unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.to(equal(1)) - } - failsWithErrorMessage("unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toNot(equal(1)) - } - } - - func testToMatchesIfMatcherReturnsTrue() { - expect(1).to(MatcherFunc { _, _ in true }) - expect {1}.to(MatcherFunc { _, _ in true }) - } - - func testToProvidesActualValueExpression() { - var value: Int? - expect(1).to(MatcherFunc { expr, _ in value = try expr.evaluate(); return true }) - expect(value).to(equal(1)) - } - - func testToProvidesAMemoizedActualValueExpression() { - var callCount = 0 - expect { callCount += 1 }.to(MatcherFunc { expr, _ in - _ = try expr.evaluate() - _ = try expr.evaluate() - return true - }) - expect(callCount).to(equal(1)) - } - - func testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { - var callCount = 0 - expect { callCount += 1 }.to(MatcherFunc { expr, _ in - expect(callCount).to(equal(0)) - _ = try expr.evaluate() - return true - }) - expect(callCount).to(equal(1)) - } - - func testToMatchAgainstLazyProperties() { - expect(ObjectWithLazyProperty().value).to(equal("hello")) - expect(ObjectWithLazyProperty().value).toNot(equal("world")) - expect(ObjectWithLazyProperty().anotherValue).to(equal("world")) - expect(ObjectWithLazyProperty().anotherValue).toNot(equal("hello")) - } - - // repeated tests from to() for toNot() - func testToNotMatchesIfMatcherReturnsTrue() { - expect(1).toNot(MatcherFunc { _, _ in false }) - expect {1}.toNot(MatcherFunc { _, _ in false }) - } - - func testToNotProvidesActualValueExpression() { - var value: Int? - expect(1).toNot(MatcherFunc { expr, _ in value = try expr.evaluate(); return false }) - expect(value).to(equal(1)) - } - - func testToNotProvidesAMemoizedActualValueExpression() { - var callCount = 0 - expect { callCount += 1 }.toNot(MatcherFunc { expr, _ in - _ = try expr.evaluate() - _ = try expr.evaluate() - return false - }) - expect(callCount).to(equal(1)) - } - - func testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { - var callCount = 0 - expect { callCount += 1 }.toNot(MatcherFunc { expr, _ in - expect(callCount).to(equal(0)) - _ = try expr.evaluate() - return false - }) - expect(callCount).to(equal(1)) - } - - func testToNotNegativeMatches() { - failsWithErrorMessage("expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { _, _ in true }) - } - } - - func testNotToMatchesLikeToNot() { - expect(1).notTo(MatcherFunc { _, _ in false }) - } -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift deleted file mode 100644 index 9bb64b6..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift +++ /dev/null @@ -1,64 +0,0 @@ -import XCTest -import Nimble - -final class UserDescriptionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (UserDescriptionTest) -> () throws -> Void)] { - return [ - ("testToMatcher_CustomFailureMessage", testToMatcher_CustomFailureMessage), - ("testNotToMatcher_CustomFailureMessage", testNotToMatcher_CustomFailureMessage), - ("testToNotMatcher_CustomFailureMessage", testToNotMatcher_CustomFailureMessage), - ("testToEventuallyMatch_CustomFailureMessage", testToEventuallyMatch_CustomFailureMessage), - ("testToEventuallyNotMatch_CustomFailureMessage", testToEventuallyNotMatch_CustomFailureMessage), - ("testToNotEventuallyMatch_CustomFailureMessage", testToNotEventuallyMatch_CustomFailureMessage), - ] - } - - func testToMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to match, got <1>") { - expect(1).to(MatcherFunc { _, _ in false }, description: "These aren't equal!") - } - } - - func testNotToMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to not match, got <1>") { - expect(1).notTo(MatcherFunc { _, _ in true }, description: "These aren't equal!") - } - } - - func testToNotMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { _, _ in true }, description: "These aren't equal!") - } - } - - func testToEventuallyMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't eventually equal!\n" + - "expected to eventually equal <1>, got <0>") { - expect { 0 }.toEventually(equal(1), description: "These aren't eventually equal!") - } - } - - func testToEventuallyNotMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These are eventually equal!\n" + - "expected to eventually not equal <1>, got <1>") { - expect { 1 }.toEventuallyNot(equal(1), description: "These are eventually equal!") - } - } - - func testToNotEventuallyMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These are eventually equal!\n" + - "expected to eventually not equal <1>, got <1>") { - expect { 1 }.toEventuallyNot(equal(1), description: "These are eventually equal!") - } - } - -} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h deleted file mode 100644 index 282993d..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h +++ /dev/null @@ -1,15 +0,0 @@ -@import Nimble; -#import "NimbleTests-Swift.h" - -// Use this when you want to verify the failure message for when an expectation fails -#define expectFailureMessage(MSG, BLOCK) \ -[NimbleHelper expectFailureMessage:(MSG) block:(BLOCK) file:@(__FILE__) line:__LINE__]; - -#define expectFailureMessages(MSGS, BLOCK) \ -[NimbleHelper expectFailureMessages:(MSGS) block:(BLOCK) file:@(__FILE__) line:__LINE__]; - - -// Use this when you want to verify the failure message with the nil message postfixed -// to it: " (use beNil() to match nils)" -#define expectNilFailureMessage(MSG, BLOCK) \ -[NimbleHelper expectFailureMessageForNil:(MSG) block:(BLOCK) file:@(__FILE__) line:__LINE__]; diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m deleted file mode 100644 index 4bdc021..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m +++ /dev/null @@ -1,38 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCAllPassTest : XCTestCase - -@end - -@implementation ObjCAllPassTest - -- (void)testPositiveMatches { - expect(@[@1, @2, @3,@4]).to(allPass(beLessThan(@5))); - expect(@[@1, @2, @3,@4]).toNot(allPass(beGreaterThan(@5))); - - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).to(allPass(beLessThan(@5))); - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).toNot(allPass(beGreaterThan(@5))); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to all be less than <3>, but failed first at element" - " <3> in <[1, 2, 3, 4]>", ^{ - expect(@[@1, @2, @3, @4]).to(allPass(beLessThan(@3))); - }); - expectFailureMessage(@"expected to not all be less than <5>", ^{ - expect(@[@1, @2, @3, @4]).toNot(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"expected to not all be less than <5>", ^{ - expect([NSSet setWithArray:@[@1, @2, @3, @4]]).toNot(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"allPass can only be used with types which implement NSFastEnumeration " - "(NSArray, NSSet, ...), and whose elements subclass NSObject, got <3>", ^{ - expect(@3).to(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"allPass can only be used with types which implement NSFastEnumeration " - "(NSArray, NSSet, ...), and whose elements subclass NSObject, got <3>", ^{ - expect(@3).toNot(allPass(beLessThan(@5))); - }); -} -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m deleted file mode 100644 index f052e74..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m +++ /dev/null @@ -1,55 +0,0 @@ -#import -#import -#import "NimbleSpecHelper.h" - -@interface ObjCAsyncTest : XCTestCase - -@end - -@implementation ObjCAsyncTest - -- (void)testAsync { - __block id obj = @1; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - obj = nil; - }); - expect(obj).toEventually(beNil()); -} - - -- (void)testAsyncWithCustomTimeout { - __block id obj = nil; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - obj = @1; - }); - expect(obj).withTimeout(5).toEventuallyNot(beNil()); -} - -- (void)testAsyncCallback { - waitUntil(^(void (^done)(void)){ - done(); - }); - - expectFailureMessage(@"Waited more than 1.0 second", ^{ - waitUntil(^(void (^done)(void)){ /* ... */ }); - }); - - expectFailureMessage(@"Waited more than 0.01 seconds", ^{ - waitUntilTimeout(0.01, ^(void (^done)(void)){ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [NSThread sleepForTimeInterval:0.1]; - done(); - }); - }); - }); - - expectFailureMessage(@"expected to equal , got ", ^{ - waitUntil(^(void (^done)(void)){ - [NSThread sleepForTimeInterval:0.1]; - expect(@"hello").to(equal(@"goodbye")); - done(); - }); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m deleted file mode 100644 index f5fca2d..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m +++ /dev/null @@ -1,34 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeAnInstanceOfTest : XCTestCase -@end - -@implementation ObjCBeAnInstanceOfTest - -- (void)testPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(beAnInstanceOf([NSNull class])); - expect(@1).toNot(beAnInstanceOf([NSNull class])); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be an instance of NSNull, got <__NSCFNumber instance>", ^{ - expect(@1).to(beAnInstanceOf([NSNull class])); - }); - expectFailureMessage(@"expected to not be an instance of NSNull, got ", ^{ - expect([NSNull null]).toNot(beAnInstanceOf([NSNull class])); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be an instance of NSNull, got ", ^{ - expect(nil).to(beAnInstanceOf([NSNull class])); - }); - - expectNilFailureMessage(@"expected to not be an instance of NSNull, got ", ^{ - expect(nil).toNot(beAnInstanceOf([NSNull class])); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m deleted file mode 100644 index c33d643..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m +++ /dev/null @@ -1,47 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeCloseToTest : XCTestCase - -@end - -@implementation ObjCBeCloseToTest - -- (void)testPositiveMatches { - expect(@1.2).to(beCloseTo(@1.2001)); - expect(@1.2).to(beCloseTo(@2).within(10)); - expect(@2).toNot(beCloseTo(@1)); - expect(@1.00001).toNot(beCloseTo(@1).within(0.00000001)); - - expect(1.2).to(beCloseTo(1.2001)); - expect(1.2).to(beCloseTo(2).within(10)); - expect(2).toNot(beCloseTo(1)); - expect(1.00001).toNot(beCloseTo(1).within(0.00000001)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be close to <0> (within 0.001), got <1>", ^{ - expect(@1).to(beCloseTo(@0)); - }); - expectFailureMessage(@"expected to not be close to <0> (within 0.001), got <0.0001>", ^{ - expect(@(0.0001)).toNot(beCloseTo(@0)); - }); - expectFailureMessage(@"expected to be close to <0> (within 0.001), got <1>", ^{ - expect(1).to(beCloseTo(0)); - }); - expectFailureMessage(@"expected to not be close to <0> (within 0.001), got <0.0001>", ^{ - expect(0.0001).toNot(beCloseTo(0)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be close to <0> (within 0.001), got ", ^{ - expect(nil).to(beCloseTo(@0)); - }); - expectNilFailureMessage(@"expected to not be close to <0> (within 0.001), got ", ^{ - expect(nil).toNot(beCloseTo(@0)); - }); -} - - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m deleted file mode 100644 index 5e803cb..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m +++ /dev/null @@ -1,89 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeEmptyTest : XCTestCase -@end - -@implementation ObjCBeEmptyTest - -- (void)testPositiveMatches { - expect(@[]).to(beEmpty()); - expect(@"").to(beEmpty()); - expect(@{}).to(beEmpty()); - expect([NSSet set]).to(beEmpty()); - expect([NSIndexSet indexSet]).to(beEmpty()); - expect([NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]).to(beEmpty()); - - expect(@[@1, @2]).toNot(beEmpty()); - expect(@"a").toNot(beEmpty()); - expect(@{@"key": @"value"}).toNot(beEmpty()); - expect([NSSet setWithObject:@1]).toNot(beEmpty()); - expect([NSIndexSet indexSetWithIndex:1]).toNot(beEmpty()); - - NSHashTable *table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - expect(table).toNot(beEmpty()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be empty, got ", ^{ - expect(@"foo").to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <(1)>", ^{ - expect(@[@1]).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <{key = value;}>", ^{ - expect(@{@"key": @"value"}).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <{(1)}>", ^{ - expect([NSSet setWithObject:@1]).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <(1)>", ^{ - expect([NSIndexSet indexSetWithIndex:1]).to(beEmpty()); - }); - NSHashTable *table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - NSString *tableString = [[table description] stringByReplacingOccurrencesOfString:@"\n" withString:@""]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be empty, got <%@>", tableString]), ^{ - expect(table).to(beEmpty()); - }); - - expectFailureMessage(@"expected to not be empty, got <>", ^{ - expect(@"").toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <()>", ^{ - expect(@[]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <{}>", ^{ - expect(@{}).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <{()}>", ^{ - expect([NSSet set]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <()>", ^{ - expect([NSIndexSet indexSet]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got ", ^{ - expect([NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]).toNot(beEmpty()); - }); -} - -- (void)testItDoesNotMatchNil { - expectNilFailureMessage(@"expected to be empty, got ", ^{ - expect(nil).to(beEmpty()); - }); - expectNilFailureMessage(@"expected to not be empty, got ", ^{ - expect(nil).toNot(beEmpty()); - }); -} - -- (void)testItReportsTypesItMatchesAgainst { - expectFailureMessage(@"expected to be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings), got __NSCFNumber type", ^{ - expect(@1).to(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings), got __NSCFNumber type", ^{ - expect(@1).toNot(beEmpty()); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m deleted file mode 100644 index 5a5bce8..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m +++ /dev/null @@ -1,46 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeFalseTest : XCTestCase - -@end - -@implementation ObjCBeFalseTest - -- (void)testPositiveMatches { - expect(@NO).to(beFalse()); - expect(@YES).toNot(beFalse()); - - expect(false).to(beFalse()); - expect(true).toNot(beFalse()); - - expect(NO).to(beFalse()); - expect(YES).toNot(beFalse()); - - expect(10).toNot(beFalse()); -} - -- (void)testNegativeMatches { - expectNilFailureMessage(@"expected to be false, got ", ^{ - expect(nil).to(beFalse()); - }); - expectNilFailureMessage(@"expected to not be false, got ", ^{ - expect(nil).toNot(beFalse()); - }); - - expectFailureMessage(@"expected to be false, got <1>", ^{ - expect(true).to(beFalse()); - }); - expectFailureMessage(@"expected to not be false, got <0>", ^{ - expect(false).toNot(beFalse()); - }); - - expectFailureMessage(@"expected to be false, got <1>", ^{ - expect(YES).to(beFalse()); - }); - expectFailureMessage(@"expected to not be false, got <0>", ^{ - expect(NO).toNot(beFalse()); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m deleted file mode 100644 index f3f5c98..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m +++ /dev/null @@ -1,58 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeFalsyTest : XCTestCase - -@end - -@implementation ObjCBeFalsyTest - -- (void)testPositiveMatches { - expect(@NO).to(beFalsy()); - expect(@YES).toNot(beFalsy()); - expect(nil).to(beFalsy()); - - expect(true).toNot(beFalsy()); - expect(false).to(beFalsy()); - - expect(YES).toNot(beFalsy()); - expect(NO).to(beFalsy()); - - expect(10).toNot(beFalsy()); - expect(0).to(beFalsy()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to not be falsy, got ", ^{ - expect(nil).toNot(beFalsy()); - }); - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(@1).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(@NO).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(true).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(false).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(YES).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(NO).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <10>", ^{ - expect(10).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(0).toNot(beFalsy()); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m deleted file mode 100644 index 28862ba..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m +++ /dev/null @@ -1,44 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeGreaterThanOrEqualToTest : XCTestCase - -@end - -@implementation ObjCBeGreaterThanOrEqualToTest - -- (void)testPositiveMatches { - expect(@2).to(beGreaterThanOrEqualTo(@2)); - expect(@2).toNot(beGreaterThanOrEqualTo(@3)); - expect(2).to(beGreaterThanOrEqualTo(0)); - expect(2).to(beGreaterThanOrEqualTo(2)); - expect(2).toNot(beGreaterThanOrEqualTo(3)); - expect(2.5).to(beGreaterThanOrEqualTo(2)); - expect(2.5).to(beGreaterThanOrEqualTo(2.5)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be greater than or equal to <0>, got <-1>", ^{ - expect(@(-1)).to(beGreaterThanOrEqualTo(@0)); - }); - expectFailureMessage(@"expected to not be greater than or equal to <1>, got <2>", ^{ - expect(@2).toNot(beGreaterThanOrEqualTo(@(1))); - }); - expectFailureMessage(@"expected to be greater than or equal to <0>, got <-1>", ^{ - expect(-1).to(beGreaterThanOrEqualTo(0)); - }); - expectFailureMessage(@"expected to not be greater than or equal to <1>, got <2>", ^{ - expect(2).toNot(beGreaterThanOrEqualTo(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be greater than or equal to <-1>, got ", ^{ - expect(nil).to(beGreaterThanOrEqualTo(@(-1))); - }); - expectNilFailureMessage(@"expected to not be greater than or equal to <1>, got ", ^{ - expect(nil).toNot(beGreaterThanOrEqualTo(@(1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m deleted file mode 100644 index 5a57d54..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m +++ /dev/null @@ -1,42 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeGreaterThanTest : XCTestCase - -@end - -@implementation ObjCBeGreaterThanTest - -- (void)testPositiveMatches { - expect(@2).to(beGreaterThan(@1)); - expect(@2).toNot(beGreaterThan(@2)); - expect(@2).to(beGreaterThan(0)); - expect(@2).toNot(beGreaterThan(2)); - expect(2.5).to(beGreaterThan(1.5)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be greater than <0>, got <-1>", ^{ - expect(@(-1)).to(beGreaterThan(@(0))); - }); - expectFailureMessage(@"expected to not be greater than <1>, got <2>", ^{ - expect(@2).toNot(beGreaterThan(@(1))); - }); - expectFailureMessage(@"expected to be greater than <0>, got <-1>", ^{ - expect(-1).to(beGreaterThan(0)); - }); - expectFailureMessage(@"expected to not be greater than <1>, got <2>", ^{ - expect(2).toNot(beGreaterThan(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be greater than <-1>, got ", ^{ - expect(nil).to(beGreaterThan(@(-1))); - }); - expectNilFailureMessage(@"expected to not be greater than <1>, got ", ^{ - expect(nil).toNot(beGreaterThan(@(1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m deleted file mode 100644 index a9d9d51..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m +++ /dev/null @@ -1,68 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeIdenticalToTest : XCTestCase - -@end - -@implementation ObjCBeIdenticalToTest - -- (void)testPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(beIdenticalTo([NSNull null])); - expect(@2).toNot(beIdenticalTo(@3)); -} - -- (void)testNegativeMatches { - NSNull *obj = [NSNull null]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be identical to <%p>, got <%p>", obj, @2]), ^{ - expect(@2).to(beIdenticalTo(obj)); - }); - expectFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got <%p>", obj, obj]), ^{ - expect(obj).toNot(beIdenticalTo(obj)); - }); -} - -- (void)testNilMatches { - NSNull *obj = [NSNull null]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnonnull" - expectNilFailureMessage(@"expected to be identical to nil, got nil", ^{ - expect(nil).to(beIdenticalTo(nil)); - }); -#pragma clang diagnostic pop - expectNilFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got nil", obj]), ^{ - expect(nil).toNot(beIdenticalTo(obj)); - }); -} - -- (void)testAliasPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(be([NSNull null])); - expect(@2).toNot(be(@3)); -} - -- (void)testAliasNegativeMatches { - NSNull *obj = [NSNull null]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be identical to <%p>, got <%p>", obj, @2]), ^{ - expect(@2).to(be(obj)); - }); - expectFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got <%p>", obj, obj]), ^{ - expect(obj).toNot(be(obj)); - }); -} - -- (void)testAliasNilMatches { - NSNull *obj = [NSNull null]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnonnull" - expectNilFailureMessage(@"expected to be identical to nil, got nil", ^{ - expect(nil).to(be(nil)); - }); -#pragma clang diagnostic pop - expectNilFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got nil", obj]), ^{ - expect(nil).toNot(be(obj)); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m deleted file mode 100644 index 7eee261..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m +++ /dev/null @@ -1,34 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeKindOfTest : XCTestCase - -@end - -@implementation ObjCBeKindOfTest - -- (void)testPositiveMatches { - NSMutableArray *array = [NSMutableArray array]; - expect(array).to(beAKindOf([NSArray class])); - expect(@1).toNot(beAKindOf([NSNull class])); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be a kind of NSNull, got <__NSCFNumber instance>", ^{ - expect(@1).to(beAKindOf([NSNull class])); - }); - expectFailureMessage(@"expected to not be a kind of NSNull, got ", ^{ - expect([NSNull null]).toNot(beAKindOf([NSNull class])); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be a kind of NSNull, got ", ^{ - expect(nil).to(beAKindOf([NSNull class])); - }); - expectNilFailureMessage(@"expected to not be a kind of NSNull, got ", ^{ - expect(nil).toNot(beAKindOf([NSNull class])); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m deleted file mode 100644 index 4a738ec..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m +++ /dev/null @@ -1,43 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeLessThanOrEqualToTest : XCTestCase - -@end - -@implementation ObjCBeLessThanOrEqualToTest - -- (void)testPositiveMatches { - expect(@2).to(beLessThanOrEqualTo(@2)); - expect(@2).toNot(beLessThanOrEqualTo(@1)); - expect(2).to(beLessThanOrEqualTo(2)); - expect(2).toNot(beLessThanOrEqualTo(1)); - expect(2).toNot(beLessThanOrEqualTo(0)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be less than or equal to <1>, got <2>", ^{ - expect(@2).to(beLessThanOrEqualTo(@1)); - }); - expectFailureMessage(@"expected to not be less than or equal to <1>, got <1>", ^{ - expect(@1).toNot(beLessThanOrEqualTo(@1)); - }); - - expectFailureMessage(@"expected to be less than or equal to <1>, got <2>", ^{ - expect(2).to(beLessThanOrEqualTo(1)); - }); - expectFailureMessage(@"expected to not be less than or equal to <1>, got <1>", ^{ - expect(1).toNot(beLessThanOrEqualTo(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be less than or equal to <1>, got ", ^{ - expect(nil).to(beLessThanOrEqualTo(@1)); - }); - expectNilFailureMessage(@"expected to not be less than or equal to <-1>, got ", ^{ - expect(nil).toNot(beLessThanOrEqualTo(@(-1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m deleted file mode 100644 index 9750641..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m +++ /dev/null @@ -1,42 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeLessThanTest : XCTestCase - -@end - -@implementation ObjCBeLessThanTest - -- (void)testPositiveMatches { - expect(@2).to(beLessThan(@3)); - expect(@2).toNot(beLessThan(@2)); - expect(2).to(beLessThan(3)); - expect(2).toNot(beLessThan(2)); - expect(2).toNot(beLessThan(0)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be less than <0>, got <1>", ^{ - expect(@(1)).to(beLessThan(@0)); - }); - expectFailureMessage(@"expected to not be less than <1>, got <0>", ^{ - expect(@0).toNot(beLessThan(@1)); - }); - expectFailureMessage(@"expected to be less than <0>, got <1>", ^{ - expect(1).to(beLessThan(0)); - }); - expectFailureMessage(@"expected to not be less than <1>, got <0>", ^{ - expect(0).toNot(beLessThan(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be less than <-1>, got ", ^{ - expect(nil).to(beLessThan(@(-1))); - }); - expectNilFailureMessage(@"expected to not be less than <1>, got ", ^{ - expect(nil).toNot(beLessThan(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m deleted file mode 100644 index a43ee50..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m +++ /dev/null @@ -1,24 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeNilTest : XCTestCase - -@end - -@implementation ObjCBeNilTest - -- (void)testPositiveMatches { - expect(nil).to(beNil()); - expect(@NO).toNot(beNil()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be nil, got <1>", ^{ - expect(@1).to(beNil()); - }); - expectFailureMessage(@"expected to not be nil, got ", ^{ - expect(nil).toNot(beNil()); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m deleted file mode 100644 index c669475..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m +++ /dev/null @@ -1,47 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeTrueTest : XCTestCase - -@end - -@implementation ObjCBeTrueTest - -- (void)testPositiveMatches { - expect(@YES).to(beTrue()); - expect(@NO).toNot(beTrue()); - expect(nil).toNot(beTrue()); - - expect(true).to(beTrue()); - expect(false).toNot(beTrue()); - - expect(YES).to(beTrue()); - expect(NO).toNot(beTrue()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(@NO).to(beTrue()); - }); - expectFailureMessage(@"expected to be true, got ", ^{ - expect(nil).to(beTrue()); - }); - - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(false).to(beTrue()); - }); - - expectFailureMessage(@"expected to not be true, got <1>", ^{ - expect(true).toNot(beTrue()); - }); - - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(NO).to(beTrue()); - }); - - expectFailureMessage(@"expected to not be true, got <1>", ^{ - expect(YES).toNot(beTrue()); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m deleted file mode 100644 index 1ad7913..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m +++ /dev/null @@ -1,55 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeTruthyTest : XCTestCase - -@end - -@implementation ObjCBeTruthyTest - -- (void)testPositiveMatches { - expect(@YES).to(beTruthy()); - expect(@NO).toNot(beTruthy()); - expect(nil).toNot(beTruthy()); - - expect(true).to(beTruthy()); - expect(false).toNot(beTruthy()); - - expect(YES).to(beTruthy()); - expect(NO).toNot(beTruthy()); - - expect(10).to(beTruthy()); - expect(0).toNot(beTruthy()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be truthy, got ", ^{ - expect(nil).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(@1).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(@NO).to(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(false).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(true).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(NO).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(YES).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <10>", ^{ - expect(10).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(0).to(beTruthy()); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m deleted file mode 100644 index 5ca7be4..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m +++ /dev/null @@ -1,37 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeginWithTest : XCTestCase - -@end - -@implementation ObjCBeginWithTest - -- (void)testPositiveMatches { - expect(@"hello world!").to(beginWith(@"hello")); - expect(@"hello world!").toNot(beginWith(@"world")); - - NSArray *array = @[@1, @2]; - expect(array).to(beginWith(@1)); - expect(array).toNot(beginWith(@2)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to begin with , got ", ^{ - expect(@"foo").to(beginWith(@"bar")); - }); - expectFailureMessage(@"expected to not begin with , got ", ^{ - expect(@"foo").toNot(beginWith(@"foo")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to begin with <1>, got ", ^{ - expect(nil).to(beginWith(@1)); - }); - expectNilFailureMessage(@"expected to not begin with <1>, got ", ^{ - expect(nil).toNot(beginWith(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainElementSatisfying.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainElementSatisfying.m deleted file mode 100644 index b15d6c3..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainElementSatisfying.m +++ /dev/null @@ -1,64 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCContainElementSatisfyingTest : XCTestCase - -@end - -@implementation ObjCContainElementSatisfyingTest - -- (void)testPassingMatches { - NSArray *orderIndifferentArray = @[@1, @2, @3]; - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@1]; - })); - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@2]; - })); - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@3]; - })); - - orderIndifferentArray = @[@3, @1, @2]; - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@1]; - })); - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@2]; - })); - expect(orderIndifferentArray).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@3]; - })); - - NSSet *orderIndifferentSet = [NSSet setWithObjects:@"turtle test", @"turtle assessment", nil]; - expect(orderIndifferentSet).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToString:@"turtle assessment"]; - })); -} - -- (void)testFailingMatches { - expectFailureMessage(@"expected to find object in collection that satisfies predicate", ^{ - expect(@[@1]).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@2]; - })); - }); - expectFailureMessage(@"containElementSatisfying must be provided an NSFastEnumeration object", ^{ - expect((nil)).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@3]; - })); - }); - expectFailureMessage(@"containElementSatisfying must be provided an NSFastEnumeration object", ^{ - expect((@3)).to(containElementSatisfying(^BOOL(id object) { - return [object isEqualToNumber:@3]; - })); - }); -} - -- (void)testNegativeCases { - NSArray *orderIndifferentArray = @[@"puppies", @"kittens", @"turtles"]; - expect(orderIndifferentArray).toNot(containElementSatisfying(^BOOL(id object) { - return [object isEqualToString:@"armadillos"]; - })); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m deleted file mode 100644 index 8b954fe..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m +++ /dev/null @@ -1,67 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCContainTest : XCTestCase - -@end - -@implementation ObjCContainTest - -- (void)testPositiveMatches { - NSArray *array = @[@1, @2]; - expect(array).to(contain(@1)); - expect(array).toNot(contain(@"HI")); - expect(@"String").to(contain(@"Str")); - expect(@"Other").toNot(contain(@"Str")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to contain <3>, got <(1, 2)>", ^{ - expect((@[@1, @2])).to(contain(@3)); - }); - expectFailureMessage(@"expected to not contain <2>, got <(1, 2)>", ^{ - expect((@[@1, @2])).toNot(contain(@2)); - }); - - expectFailureMessage(@"expected to contain , got ", ^{ - expect(@"la").to(contain(@"hi")); - }); - expectFailureMessage(@"expected to not contain , got ", ^{ - expect(@"hihihi").toNot(contain(@"hi")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to contain <3>, got ", ^{ - expect(nil).to(contain(@3)); - }); - expectNilFailureMessage(@"expected to not contain <3>, got ", ^{ - expect(nil).toNot(contain(@3)); - }); - - expectNilFailureMessage(@"expected to contain , got ", ^{ - expect(nil).to(contain(@"hi")); - }); - expectNilFailureMessage(@"expected to not contain , got ", ^{ - expect(nil).toNot(contain(@"hi")); - }); -} - -- (void)testVariadicArguments { - NSArray *array = @[@1, @2]; - expect(array).to(contain(@1, @2)); - expect(array).toNot(contain(@"HI", @"whale")); - expect(@"String").to(contain(@"Str", @"ng")); - expect(@"Other").toNot(contain(@"Str", @"Oth")); - - - expectFailureMessage(@"expected to contain , got <(a, b, c)>", ^{ - expect(@[@"a", @"b", @"c"]).to(contain(@"a", @"bar")); - }); - - expectFailureMessage(@"expected to not contain , got <(a, b, c)>", ^{ - expect(@[@"a", @"b", @"c"]).toNot(contain(@"a", @"b")); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m deleted file mode 100644 index b960f01..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m +++ /dev/null @@ -1,37 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCEndWithTest : XCTestCase - -@end - -@implementation ObjCEndWithTest - -- (void)testPositiveMatches { - NSArray *array = @[@1, @2]; - expect(@"hello world!").to(endWith(@"world!")); - expect(@"hello world!").toNot(endWith(@"hello")); - expect(array).to(endWith(@2)); - expect(array).toNot(endWith(@1)); - expect(@1).toNot(contain(@"foo")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to end with , got ", ^{ - expect(@"hello world!").to(endWith(@"?")); - }); - expectFailureMessage(@"expected to not end with , got ", ^{ - expect(@"hello world!").toNot(endWith(@"!")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to end with <1>, got ", ^{ - expect(nil).to(endWith(@1)); - }); - expectNilFailureMessage(@"expected to not end with <1>, got ", ^{ - expect(nil).toNot(endWith(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m deleted file mode 100644 index 9d1361e..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m +++ /dev/null @@ -1,94 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCEqualTest : XCTestCase - -@end - -@implementation ObjCEqualTest - -- (void)testPositiveMatches { - expect(@1).to(equal(@1)); - expect(@1).toNot(equal(@2)); - expect(@1).notTo(equal(@2)); - expect(@"hello").to(equal(@"hello")); - expect("hello").to(equal("hello")); - expect(NSMakeRange(0, 10)).to(equal(NSMakeRange(0, 10))); - expect(NSMakeRange(0, 10)).toNot(equal(NSMakeRange(0, 5))); - expect((NSInteger)1).to(equal((NSInteger)1)); - expect((NSInteger)1).toNot(equal((NSInteger)2)); - expect((NSUInteger)1).to(equal((NSUInteger)1)); - expect((NSUInteger)1).toNot(equal((NSUInteger)2)); - expect(0).to(equal(0)); - expect(1).to(equal(1)); - expect(1).toNot(equal(2)); - expect(1.0).to(equal(1.0)); // Note: not recommended, use beCloseTo() instead - expect(1.0).toNot(equal(2.0)); // Note: not recommended, use beCloseTo() instead - expect((float)1.0).to(equal((float)1.0)); // Note: not recommended, use beCloseTo() instead - expect((float)1.0).toNot(equal((float)2.0)); // Note: not recommended, use beCloseTo() instead - expect((double)1.0).to(equal((double)1.0)); // Note: not recommended, use beCloseTo() instead - expect((double)1.0).toNot(equal((double)2.0)); // Note: not recommended, use beCloseTo() instead - expect((long long)1).to(equal((long long)1)); - expect((long long)1).toNot(equal((long long)2)); - expect((unsigned long long)1).to(equal((unsigned long long)1)); - expect((unsigned long long)1).toNot(equal((unsigned long long)2)); -} - -- (void)testNimbleCurrentlyBoxesNumbersWhichAllowsImplicitTypeConversions { - expect(1).to(equal(1.0)); - expect((long long)1).to(equal((unsigned long long)1)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(@1).to(equal(@2)); - }); - expectFailureMessage(@"expected to not equal <1>, got <1>", ^{ - expect(@1).toNot(equal(@1)); - }); - expectFailureMessage(@"expected to not equal , got ", ^{ - expect("bar").toNot(equal("bar")); - }); - expectFailureMessage(@"expected to equal , got ", ^{ - expect(NSMakeRange(0, 10)).to(equal(NSMakeRange(0, 5))); - }); - - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((NSInteger)1).to(equal((NSInteger)2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((NSUInteger)1).to(equal((NSUInteger)2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(1).to(equal(2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(1.0).to(equal(2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((float)1.0).to(equal((float)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((double)1.0).to(equal((double)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((long long)1.0).to(equal((long long)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((unsigned long long)1.0).to(equal((unsigned long long)2.0)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to equal , got ", ^{ - expect(NULL).to(equal(NULL)); - }); - expectNilFailureMessage(@"expected to equal , got ", ^{ - expect(nil).to(equal(nil)); - }); - expectNilFailureMessage(@"expected to not equal , got ", ^{ - expect(nil).toNot(equal(nil)); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m deleted file mode 100644 index 31053c8..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m +++ /dev/null @@ -1,174 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCHaveCountTest : XCTestCase - -@end - -@implementation ObjCHaveCountTest - -- (void)testHaveCountForNSArray { - expect(@[@1, @2, @3]).to(haveCount(@3)); - expect(@[@1, @2, @3]).notTo(haveCount(@1)); - - expect(@[]).to(haveCount(@0)); - expect(@[@1]).notTo(haveCount(@0)); - - expect(@[@1, @2, @3]).to(haveCount(3)); - expect(@[@1, @2, @3]).notTo(haveCount(1)); - - expect(@[]).to(haveCount(0)); - expect(@[@1]).notTo(haveCount(0)); - - expectFailureMessage(@"expected to have NSArray with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSArray with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSArray with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSArray with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSDictionary { - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(@3)); - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(@1)); - - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(3)); - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSDictionary with count 1, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSDictionary with count 3, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSDictionary with count 1, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSDictionary with count 3, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSHashtable { - NSHashTable *const table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - [table addObject:@2]; - [table addObject:@3]; - - expect(table).to(haveCount(@3)); - expect(table).notTo(haveCount(@1)); - - expect(table).to(haveCount(3)); - expect(table).notTo(haveCount(1)); - - NSString *msg = [NSString stringWithFormat: - @"expected to have NSHashTable {[2] 2[12] 1[13] 3}with count 1, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).to(haveCount(@1)); - }); - - msg = [NSString stringWithFormat: - @"expected to not have NSHashTable {[2] 2[12] 1[13] 3}with count 3, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).notTo(haveCount(@3)); - }); - - - msg = [NSString stringWithFormat: - @"expected to have NSHashTable {[2] 2[12] 1[13] 3}with count 1, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).to(haveCount(1)); - }); - - msg = [NSString stringWithFormat: - @"expected to not have NSHashTable {[2] 2[12] 1[13] 3}with count 3, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSSet { - NSSet *const set = [NSSet setWithArray:@[@1, @2, @3]]; - - expect(set).to(haveCount(@3)); - expect(set).notTo(haveCount(@1)); - expect(set).to(haveCount(3)); - expect(set).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSSet with count 1, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSSet with count 3, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSSet with count 1, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSSet with count 3, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSIndexSet { - NSIndexSet *const set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]; - - expect(set).to(haveCount(@3)); - expect(set).notTo(haveCount(@1)); - expect(set).to(haveCount(3)); - expect(set).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSIndexSet with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSIndexSet with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSIndexSet with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSIndexSet with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForUnsupportedTypes { - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFConstantString", ^{ - expect(@"string").to(haveCount(@6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFNumber", ^{ - expect(@1).to(haveCount(@6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFConstantString", ^{ - expect(@"string").to(haveCount(6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFNumber", ^{ - expect(@1).to(haveCount(6)); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m deleted file mode 100644 index 2342ae4..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m +++ /dev/null @@ -1,33 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCMatchTest : XCTestCase - -@end - -@implementation ObjCMatchTest - -- (void)testPositiveMatches { - expect(@"11:14").to(match(@"\\d{2}:\\d{2}")); - expect(@"hello").toNot(match(@"\\d{2}:\\d{2}")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to match <\\d{2}:\\d{2}>, got ", ^{ - expect(@"hello").to(match(@"\\d{2}:\\d{2}")); - }); - expectFailureMessage(@"expected to not match <\\d{2}:\\d{2}>, got <11:22>", ^{ - expect(@"11:22").toNot(match(@"\\d{2}:\\d{2}")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to match <\\d{2}:\\d{2}>, got ", ^{ - expect(nil).to(match(@"\\d{2}:\\d{2}")); - }); - expectNilFailureMessage(@"expected to not match <\\d{2}:\\d{2}>, got ", ^{ - expect(nil).toNot(match(@"\\d{2}:\\d{2}")); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m deleted file mode 100644 index 9b5a378..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m +++ /dev/null @@ -1,178 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCRaiseExceptionTest : XCTestCase - -@end - -@implementation ObjCRaiseExceptionTest - -- (void)testPositiveMatches { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectAction(^{ @throw exception; }).to(raiseException()); - expectAction(^{ [exception raise]; }).to(raiseException()); - expectAction(^{ [exception raise]; }).to(raiseException().named(NSInvalidArgumentException)); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food")); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"})); - - expectAction(^{ }).toNot(raiseException()); -} - -- (void)testPositiveMatchesWithBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectAction(^{ [exception raise]; }).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); -} - -- (void)testNegativeMatches { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - - expectFailureMessage(@"expected to raise any exception, got no exception", ^{ - expectAction(^{ }).to(raiseException()); - }); - - expectFailureMessage(@"expected to raise exception with name , got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(@"foo")); - }); - - expectFailureMessage(@"expected to raise exception with name with reason , got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"cakes")); - }); - - expectFailureMessage(@"expected to raise exception with name with reason with userInfo <{k = v;}>, got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"k": @"v"})); - }); - - expectFailureMessage(@"expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }", ^{ - expectAction(^{ [exception raise]; }).toNot(raiseException()); - }); -} - -- (void)testNegativeMatchesWithPassingBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectFailureMessage(@"expected to raise exception that satisfies block, got no exception", ^{ - expect(exception).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"LOL")); - })); - }); - - NSString *outerFailureMessage = @"expected to raise exception that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).toNot(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(@"foo"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"bar"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name with reason with userInfo <{}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); -} - -- (void)testNegativeMatchesWithNegativeBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - NSString *outerFailureMessage; - - NSString *const innerFailureMessage = @"expected to equal , got "; - outerFailureMessage = @"expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); - - - outerFailureMessage = @"expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); - - - outerFailureMessage = @"expected to raise exception with name with reason with userInfo <{key = value;}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m deleted file mode 100644 index 4c80abc..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m +++ /dev/null @@ -1,32 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCSatisfyAnyOfTest : XCTestCase - -@end - -@implementation ObjCSatisfyAnyOfTest - -- (void)testPositiveMatches { - expect(@2).to(satisfyAnyOf(equal(@2), equal(@3))); - expect(@2).toNot(satisfyAnyOf(equal(@3), equal(@16))); - expect(@[@1, @2, @3]).to(satisfyAnyOf(equal(@[@1, @2, @3]), allPass(beLessThan(@4)))); - expect(@NO).to(satisfyAnyOf(beTrue(), beFalse())); - expect(@YES).to(satisfyAnyOf(beTrue(), beFalse())); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to match one of: {equal <3>}, or {equal <4>}, or {equal <5>}, got 2", ^{ - expect(@2).to(satisfyAnyOf(equal(@3), equal(@4), equal(@5))); - }); - - expectFailureMessage(@"expected to match one of: {all be less than <4>, but failed first at element" - " <5> in <[5, 6, 7]>}, or {equal <(1, 2, 3, 4)>}, got (5,6,7)", ^{ - expect(@[@5, @6, @7]).to(satisfyAnyOf(allPass(beLessThan(@4)), equal(@[@1, @2, @3, @4]))); - }); - - expectFailureMessage(@"satisfyAnyOf must be called with at least one matcher", ^{ - expect(@"turtles").to(satisfyAnyOf()); - }); -} -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m deleted file mode 100644 index 2aae816..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m +++ /dev/null @@ -1,21 +0,0 @@ -#import -#import -#import "NimbleSpecHelper.h" - -@interface ObjCSyncTest : XCTestCase - -@end - -@implementation ObjCSyncTest - -- (void)testFailureExpectation { - expectFailureMessage(@"fail() always fails", ^{ - fail(); - }); - - expectFailureMessage(@"This always fails", ^{ - failWithMessage(@"This always fails"); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m deleted file mode 100644 index ffb5407..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m +++ /dev/null @@ -1,52 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCUserDescriptionTest : XCTestCase - -@end - -@implementation ObjCUserDescriptionTest - -- (void)testToWithDescription { - expectFailureMessage(@"These are equal!\n" - "expected to equal <2>, got <1>", ^{ - expect(@1).toWithDescription(equal(@2), @"These are equal!"); - }); -} - -- (void)testToNotWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to not equal <1>, got <1>", ^{ - expect(@1).toNotWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testNotToWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to not equal <1>, got <1>", ^{ - expect(@1).notToWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testToEventuallyWithDescription { - expectFailureMessage(@"These are equal!\n" - "expected to eventually equal <2>, got <1>", ^{ - expect(@1).toEventuallyWithDescription(equal(@2), @"These are equal!"); - }); -} - -- (void)testToEventuallyNotWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to eventually not equal <1>, got <1>", ^{ - expect(@1).toEventuallyNotWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testToNotEventuallyWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to eventually not equal <1>, got <1>", ^{ - expect(@1).toNotEventuallyWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m deleted file mode 100644 index 4ba2eae..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m +++ /dev/null @@ -1,31 +0,0 @@ -@import XCTest; -@import Nimble; - -@interface ObjcStringersTest : XCTestCase - -@end - -@implementation ObjcStringersTest - -- (void)testItCanStringifyArrays { - NSArray *array = @[@1, @2, @3]; - NSString *result = NMBStringify(array); - - expect(result).to(equal(@"(1, 2, 3)")); -} - -- (void)testItCanStringifyIndexSets { - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]; - NSString *result = NMBStringify(indexSet); - - expect(result).to(equal(@"(1, 2, 3)")); -} - -- (void)testItRoundsLongDecimals { - NSNumber *num = @291.123782163; - NSString *result = NMBStringify(num); - - expect(result).to(equal(@"291.1238")); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/script/release b/Carthage/Checkouts/Quick/Externals/Nimble/script/release deleted file mode 100755 index f61c0dc..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/script/release +++ /dev/null @@ -1,187 +0,0 @@ -#!/usr/bin/env sh -REMOTE_BRANCH=master -POD_NAME=Nimble -PODSPEC=Nimble.podspec - -POD=${COCOAPODS:-pod} - -function help { - echo "Usage: release VERSION RELEASE_NOTES [-f]" - echo - echo "VERSION should be the version to release, should not include the 'v' prefix" - echo "RELEASE_NOTES should be a file that lists all the release notes for this version" - echo " if file does not exist, creates a git-style commit with a diff as a comment" - echo - echo "FLAGS" - echo " -f Forces override of tag" - echo - echo " Example: ./release 1.0.0-rc.2 ./release-notes.txt" - echo - echo "HINT: use 'git diff ...HEAD' to build the release notes" - echo - exit 2 -} - -function die { - echo "[ERROR] $@" - echo - exit 1 -} - -if [ $# -lt 2 ]; then - help -fi - -VERSION=$1 -RELEASE_NOTES=$2 -FORCE_TAG=$3 - -VERSION_TAG="v$VERSION" - -echo "-> Verifying Local Directory for Release" - -if [ -z "`which $POD`" ]; then - die "Cocoapods is required to produce a release. Aborting." -fi -echo " > Cocoapods is installed" - -echo " > Is this a reasonable tag?" - -echo $VERSION_TAG | grep -q "^vv" -if [ $? -eq 0 ]; then - die "This tag ($VERSION) is an incorrect format. You should remove the 'v' prefix." -fi - -echo $VERSION_TAG | grep -q -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" -if [ $? -ne 0 ]; then - die "This tag ($VERSION) is an incorrect format. It should be in 'v{MAJOR}.{MINOR}.{PATCH}(-{PRERELEASE_NAME}.{PRERELEASE_VERSION})' form." -fi - -echo " > Is this version ($VERSION) unique?" -git describe --exact-match "$VERSION_TAG" > /dev/null 2>&1 -if [ $? -eq 0 ]; then - if [ -z "$FORCE_TAG" ]; then - die "This tag ($VERSION) already exists. Aborting. Append '-f' to override" - else - echo " > NO, but force was specified." - fi -else - echo " > Yes, tag is unique" -fi - -if [ ! -f "$RELEASE_NOTES" ]; then - echo " > Failed to find $RELEASE_NOTES. Prompting editor" - RELEASE_NOTES=/tmp/nimble.release.notes - LATEST_TAG=`git for-each-ref refs/tags --sort=-refname --format="%(refname:short)" | grep -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" | ruby -e 'puts STDIN.read.split("\n").sort { |a,b| Gem::Version.new(a.gsub(/^v/, "")) <=> Gem::Version.new(b.gsub(/^v/, "")) }.last'` - echo " > Latest tag ${LATEST_TAG}" - echo "${POD_NAME} v$VERSION" > $RELEASE_NOTES - echo "================" >> $RELEASE_NOTES - echo >> $RELEASE_NOTES - echo "# Changelog from ${LATEST_TAG}..HEAD" >> $RELEASE_NOTES - git log ${LATEST_TAG}..HEAD | sed -e 's/^/# /' >> $RELEASE_NOTES - $EDITOR $RELEASE_NOTES - diff -q $RELEASE_NOTES ${RELEASE_NOTES}.backup > /dev/null 2>&1 - STATUS=$? - rm ${RELEASE_NOTES}.backup - if [ $STATUS -eq 0 ]; then - rm $RELEASE_NOTES - die "No changes in release notes file. Aborting." - fi -fi -echo " > Release notes: $RELEASE_NOTES" - -if [ ! -f "$PODSPEC" ]; then - die "Cannot find podspec: $PODSPEC. Aborting." -fi -echo " > Podspec exists" - -git config --get user.signingkey > /dev/null || { - echo "[ERROR] No PGP found to sign tag. Aborting." - echo - echo " Creating a release requires signing the tag for security purposes. This allows users to verify the git cloned tree is from a trusted source." - echo " From a security perspective, it is not considered safe to trust the commits (including Author & Signed-off fields). It is easy for any" - echo " intermediate between you and the end-users to modify the git repository." - echo - echo " While not all users may choose to verify the PGP key for tagged releases. It is a good measure to ensure 'this is an official release'" - echo " from the official maintainers." - echo - echo " If you're creating your PGP key for the first time, use RSA with at least 4096 bits." - echo - echo "Related resources:" - echo " - Configuring your system for PGP: https://git-scm.com/book/tr/v2/Git-Tools-Signing-Your-Work" - echo " - Why: http://programmers.stackexchange.com/questions/212192/what-are-the-advantages-and-disadvantages-of-cryptographically-signing-commits-a" - echo - exit 2 -} -echo " > Found PGP key for git" - -# Verify cocoapods trunk ownership -pod trunk me | grep -q "$POD_NAME" || die "You do not have access to pod repository $POD_NAME. Aborting." -echo " > Verified ownership to $POD_NAME pod" - - -echo "--- Releasing version $VERSION (tag: $VERSION_TAG)..." - -function restore_podspec { - if [ -f "${PODSPEC}.backup" ]; then - mv -f ${PODSPEC}{.backup,} - fi -} - -echo "-> Ensuring no differences to origin/$REMOTE_BRANCH" -git fetch origin || die "Failed to fetch origin" -git diff --quiet HEAD "origin/$REMOTE_BRANCH" || die "HEAD is not aligned to origin/$REMOTE_BRANCH. Cannot update version safely" - - -echo "-> Setting podspec version" -cat "$PODSPEC" | grep 's.version' | grep -q "\"$VERSION\"" -SET_PODSPEC_VERSION=$? -if [ $SET_PODSPEC_VERSION -eq 0 ]; then - echo " > Podspec already set to $VERSION. Skipping." -else - sed -i.backup "s/s.version *= *\".*\"/s.version = \"$VERSION\"/g" "$PODSPEC" || { - restore_podspec - die "Failed to update version in podspec" - } - - git add ${PODSPEC} || { restore_podspec; die "Failed to add ${PODSPEC} to INDEX"; } - git commit -m "Bumping version to $VERSION" || { restore_podspec; die "Failed to push updated version: $VERSION"; } -fi - -if [ -z "$FORCE_TAG" ]; then - echo "-> Tagging version" - git tag -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin" - git push origin "$VERSION_TAG" || die "Failed to push tag '$VERSION_TAG' to origin" -else - echo "-> Tagging version (force)" - git tag -f -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin (force)" - git push origin "$VERSION_TAG" -f || die "Failed to push tag '$VERSION_TAG' to origin" -fi - -if [ $SET_PODSPEC_VERSION -ne 0 ]; then - git push origin "$REMOTE_BRANCH" || die "Failed to push to origin" - echo " > Pushed version to origin" -fi - -echo -echo "---------------- Released as $VERSION_TAG ----------------" -echo - -echo -echo "Pushing to pod trunk..." - -# NOTE: remove allow-warnings after v9.0.0 of Nimble -$POD trunk push "$PODSPEC" --allow-warnings - -echo -echo "================ Finalizing the Release ================" -echo -echo " - Opening GitHub to mark this as a release..." -echo " - Paste the contents of $RELEASE_NOTES into the release notes. Tweak for GitHub styling." -echo " - Announce!" - -open "https://github.com/Quick/Nimble/releases/new?tag=$VERSION_TAG" - -rm ${PODSPEC}.backup diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/test b/Carthage/Checkouts/Quick/Externals/Nimble/test deleted file mode 100755 index 0766351..0000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/test +++ /dev/null @@ -1,156 +0,0 @@ -#!/bin/bash - -GREEN="\033[0;32m" -CLEAR="\033[0m" - -if which xcodebuild > /dev/null; then - echo -e "Gathering ${GREEN}xcodebuild sdk versions${CLEAR}..." - BUILD_DIR=`pwd`/build - LATEST_IOS_SDK_VERSION=`xcodebuild -showsdks | grep iphonesimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_TVOS_SDK_VERSION=`xcodebuild -showsdks | grep appletvsimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_MACOS_SDK_VERSION=`xcodebuild -showsdks | grep 'macosx' | cut -d ' ' -f 3 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - BUILD_IOS_SDK_VERSION=${NIMBLE_BUILD_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - RUNTIME_IOS_SDK_VERSION=${NIMBLE_RUNTIME_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - BUILD_TVOS_SDK_VERSION=${NIMBLE_BUILD_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - RUNTIME_TVOS_SDK_VERSION=${NIMBLE_RUNTIME_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - BUILD_MACOS_SDK_VERSION=${NIMBLE_BUILD_MACOS_SDK_VERSION:-$LATEST_MACOS_SDK_VERSION} -fi - -set -e - -function color_if_overridden { - local actual=$1 - local env_var=$2 - if [ -z "$env_var" ]; then - printf "$actual" - else - printf "$GREEN$actual$CLEAR" - fi -} - -function print_env { - echo "=== Environment ===" - echo " iOS:" - echo " Latest iOS SDK: $LATEST_IOS_SDK_VERSION" - echo " Building with iOS SDK: `color_if_overridden $BUILD_IOS_SDK_VERSION $NIMBLE_BUILD_IOS_SDK_VERSION`" - echo " Running with iOS SDK: `color_if_overridden $RUNTIME_IOS_SDK_VERSION $NIMBLE_RUNTIME_IOS_SDK_VERSION`" - echo - echo " tvOS:" - echo " Latest tvOS SDK: $LATEST_TVOS_SDK_VERSION" - echo " Building with tvOS SDK: `color_if_overridden $BUILD_TVOS_SDK_VERSION $NIMBLE_BUILD_TVOS_SDK_VERSION`" - echo " Running with tvOS SDK: `color_if_overridden $RUNTIME_TVOS_SDK_VERSION $NIMBLE_RUNTIME_TVOS_SDK_VERSION`" - echo - echo " macOS:" - echo " Latest macOS SDK: $LATEST_MACOS_SDK_VERSION" - echo " Building with macOS SDK: `color_if_overridden $BUILD_MACOS_SDK_VERSION $NIMBLE_BUILD_MACOS_SDK_VERSION`" - echo - echo "======= END =======" - echo -} - -function run { - echo -e "$GREEN==>$CLEAR $@" - "$@" -} - -function test_ios { - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPad Air,OS=$RUNTIME_IOS_SDK_VERSION" build-for-testing test-without-building - - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPhone 5s,OS=$RUNTIME_IOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_tvos { - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -sdk "appletvsimulator$BUILD_TVOS_SDK_VERSION" -destination "name=Apple TV 1080p,OS=$RUNTIME_TVOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_macos { - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-macOS" -configuration "Debug" -sdk "macosx$BUILD_MACOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_podspec { - echo "Gathering CocoaPods installation information..." - run bundle exec pod --version - echo "Linting podspec..." - # Note: remove `--allow-warnings` once old Matcher API has been removed - run bundle exec pod lib lint Nimble.podspec --allow-warnings -} - -function test_swiftpm { - if [ -d .build ]; then - run swift build --clean - fi - run swift build && swift test -} - -function test_swiftpm_docker { - run docker build -t nimble-tests -f Dockerfile.test --no-cache . - run docker run -it --privileged=true nimble-tests -} - -function test() { - test_ios - test_tvos - test_macos - - if which swift-test; then - test_swiftpm - else - echo "Not testing with the Swift Package Manager because swift-test is not installed" - fi - - if which docker; then - test_swiftpm_docker - else - echo "Not testing linux in docker container since docker is not in PATH!" - fi -} - -function clean { - run rm -rf ~/Library/Developer/Xcode/DerivedData\; true -} - -function help { - echo "Usage: $0 COMMANDS" - echo - echo "COMMANDS:" - echo " all - Runs the all tests of macos, ios and tvos" - echo " clean - Cleans the derived data directory of Xcode. Assumes default location" - echo " help - Displays this help" - echo " ios - Runs the tests as an iOS device" - echo " macos - Runs the tests on macOS 10.10 (Yosemite and newer only)" - echo " podspec - Runs pod lib lint against the podspec to detect breaking changes" - echo " swiftpm - Runs the tests built by the Swift Package Manager" - echo " swiftpm_docker - Runs the tests built by the Swift Package Manager in a docker linux container" - echo " tvos - Runs the tests as an tvOS device" - echo - exit 1 -} - -function main { - print_env - for arg in $@ - do - case "$arg" in - clean) clean ;; - ios) test_ios ;; - tvos) test_tvos ;; - macos) test_macos ;; - podspec) test_podspec ;; - test) test ;; - all) test ;; - swiftpm) test_swiftpm ;; - swiftpm_docker) test_swiftpm_docker ;; - help) help ;; - esac - done - - if [ $# -eq 0 ]; then - clean - test - fi -} - -main $@ diff --git a/Carthage/Checkouts/Quick/Gemfile b/Carthage/Checkouts/Quick/Gemfile deleted file mode 100644 index 621b34e..0000000 --- a/Carthage/Checkouts/Quick/Gemfile +++ /dev/null @@ -1,5 +0,0 @@ -source "https://rubygems.org" - -gem 'cocoapods', '~> 1.1.0.rc.2' -gem 'danger' -gem 'danger-swiftlint' diff --git a/Carthage/Checkouts/Quick/Gemfile.lock b/Carthage/Checkouts/Quick/Gemfile.lock deleted file mode 100644 index 43c1ed9..0000000 --- a/Carthage/Checkouts/Quick/Gemfile.lock +++ /dev/null @@ -1,113 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (2.3.4) - activesupport (4.2.7.1) - i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.5.0) - public_suffix (~> 2.0, >= 2.0.2) - claide (1.0.1) - claide-plugins (0.9.2) - cork - nap - open4 (~> 1.3) - cocoapods (1.1.1) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.1, < 2.0) - cocoapods-core (= 1.1.1) - cocoapods-deintegrate (>= 1.0.1, < 2.0) - cocoapods-downloader (>= 1.1.2, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.1.1, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored (~> 1.2) - escape (~> 0.0.4) - fourflusher (~> 2.0.1) - gh_inspector (~> 1.0) - molinillo (~> 0.5.1) - nap (~> 1.0) - xcodeproj (>= 1.3.3, < 2.0) - cocoapods-core (1.1.1) - activesupport (>= 4.0.2, < 5) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.1) - cocoapods-downloader (1.1.3) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.0.0) - cocoapods-trunk (1.1.2) - nap (>= 0.8, < 2.0) - netrc (= 0.7.8) - cocoapods-try (1.1.0) - colored (1.2) - cork (0.2.0) - colored (~> 1.2) - danger (4.0.4) - claide (~> 1.0) - claide-plugins (>= 0.9.2) - colored (~> 1.2) - cork (~> 0.1) - faraday (~> 0.9) - faraday-http-cache (~> 1.0) - git (~> 1) - kramdown (~> 1.5) - octokit (~> 4.2) - terminal-table (~> 1) - danger-swiftlint (0.2.1) - danger - escape (0.0.4) - faraday (0.10.1) - multipart-post (>= 1.2, < 3) - faraday-http-cache (1.3.1) - faraday (~> 0.8) - fourflusher (2.0.1) - fuzzy_match (2.0.4) - gh_inspector (1.0.2) - git (1.3.0) - i18n (0.7.0) - json (1.8.3) - kramdown (1.13.2) - minitest (5.10.1) - molinillo (0.5.5) - multipart-post (2.0.0) - nanaimo (0.2.3) - nap (1.1.0) - netrc (0.7.8) - octokit (4.6.2) - sawyer (~> 0.8.0, >= 0.5.3) - open4 (1.3.4) - public_suffix (2.0.5) - sawyer (0.8.1) - addressable (>= 2.3.5, < 2.6) - faraday (~> 0.8, < 1.0) - terminal-table (1.7.3) - unicode-display_width (~> 1.1.1) - thread_safe (0.3.5) - tzinfo (1.2.2) - thread_safe (~> 0.1) - unicode-display_width (1.1.2) - xcodeproj (1.4.2) - CFPropertyList (~> 2.3.3) - activesupport (>= 3) - claide (>= 1.0.1, < 2.0) - colored (~> 1.2) - nanaimo (~> 0.2.3) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods (~> 1.1.0.rc.2) - danger - danger-swiftlint - -BUNDLED WITH - 1.13.2 diff --git a/Carthage/Checkouts/Quick/LICENSE b/Carthage/Checkouts/Quick/LICENSE deleted file mode 100644 index e900165..0000000 --- a/Carthage/Checkouts/Quick/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014, Quick Team - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Carthage/Checkouts/Quick/Package.swift b/Carthage/Checkouts/Quick/Package.swift deleted file mode 100644 index 07b93b4..0000000 --- a/Carthage/Checkouts/Quick/Package.swift +++ /dev/null @@ -1,47 +0,0 @@ -// swift-tools-version:3.1 - -import Foundation -import PackageDescription - -var isTesting: Bool { - guard let value = ProcessInfo.processInfo.environment["SWIFT_PACKAGE_TEST_Quick"] else { return false } - return NSString(string: value).boolValue -} - -var package = Package( - name: "Quick", - targets: { -#if os(macOS) - return [ - Target(name: "QuickSpecBase"), - Target(name: "Quick", dependencies: [ "QuickSpecBase" ]), - Target(name: "QuickTests", dependencies: [ "Quick" ]), - ] -#else - return [ - Target(name: "Quick"), - Target(name: "QuickTests", dependencies: [ "Quick" ]), - ] -#endif - }(), - exclude: { - var excludes = [ - "Sources/QuickObjectiveC", - "Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m", - "Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m", - "Tests/QuickTests/QuickTests/FunctionalTests/ObjC", - "Tests/QuickTests/QuickTests/Helpers", - "Tests/QuickTests/QuickTests/QuickConfigurationTests.m", - ] -#if !os(macOS) - excludes.append("Sources/QuickSpecBase") -#endif - return excludes - }() -) - -if isTesting { - package.dependencies.append(contentsOf: [ - .Package(url: "https://github.com/Quick/Nimble.git", majorVersion: 7), - ]) -} diff --git a/Carthage/Checkouts/Quick/Package@swift-4.swift b/Carthage/Checkouts/Quick/Package@swift-4.swift deleted file mode 100644 index 7f230fd..0000000 --- a/Carthage/Checkouts/Quick/Package@swift-4.swift +++ /dev/null @@ -1,40 +0,0 @@ -// swift-tools-version:4.0 - -import PackageDescription - -let package = Package( - name: "Quick", - products: [ - .library(name: "Quick", targets: ["Quick"]), - ], - dependencies: [ - .package(url: "https://github.com/Quick/Nimble.git", from: "7.0.1"), - ], - targets: { - var targets: [Target] = [ - .testTarget( - name: "QuickTests", - dependencies: [ "Quick", "Nimble" ], - exclude: [ - "QuickAfterSuiteTests/AfterSuiteTests+ObjC.m", - "QuickFocusedTests/FocusedTests+ObjC.m", - "QuickTests/FunctionalTests/ObjC", - "QuickTests/Helpers", - "QuickTests/QuickConfigurationTests.m", - ] - ), - ] -#if os(macOS) - targets.append(contentsOf: [ - .target(name: "QuickSpecBase", dependencies: []), - .target(name: "Quick", dependencies: [ "QuickSpecBase" ]), - ]) -#else - targets.append(contentsOf: [ - .target(name: "Quick", dependencies: []), - ]) -#endif - return targets - }(), - swiftLanguageVersions: [3] -) diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.h b/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.h deleted file mode 100644 index b934bcb..0000000 --- a/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -@import Quick; - -@interface ___FILEBASENAMEASIDENTIFIER___ : QuickConfiguration - -@end diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.m b/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.m deleted file mode 100644 index cd3f486..0000000 --- a/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.m +++ /dev/null @@ -1,17 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -#import "___FILEBASENAMEASIDENTIFIER___.h" - -@implementation ___FILEBASENAMEASIDENTIFIER___ - -+ (void)configure:(Configuration *)configuration { - -} - -@end diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Swift/___FILEBASENAME___.swift b/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Swift/___FILEBASENAME___.swift deleted file mode 100644 index ae0acbb..0000000 --- a/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Swift/___FILEBASENAME___.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -import Quick - -class ___FILEBASENAMEASIDENTIFIER___: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - - } -} diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateIcon.icns b/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateIcon.icns deleted file mode 100644 index 5cb4ae999f06c9d5b5f3152a034c65f23137821e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529473 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%0D_YWU3_}$$FJi-@LKlix9Xblc5@0Ulz3?A z%KUK;p&bs=#Mv{BeKT#7-5}csnRVa2D5xIXTCdj|(3fkIfg$S|Er0yN6ib>En1`O@MYqoAh4y zR#?-W3Ne`$+UmaQcCPiKpn5$%t;0%@Ne3eOXR@!e5hDT@L)^e-%`m&hn%#U!85Wm) zw*clDD%_eqGG{O(j?oF0B83~WY^_*DH%W5ahFff@_BT5MNX+lP6-PO6 zF)m2{=VF@KQc^GJ7jgsB_?3EQR3A*00Z6 zb@WldFE~8J^72z5cK9GLfMjM8Kt+<$RucfhBPXR#>+|x%aJhNlKjoH-@_|Kzz}%?V z&~}VyWe5ySCbK>cj{2_1R2dGyE?4&nY!o{Ab>f6Mx}KlR-euiXYITHc=4|dOzh=+J zgJz4pgKj`G5S=0&NQ6yF(YU#D-1N&eN{l))U2YG9Go=&{vk&{thc(aQ^=bO)S3UG`RtKoA)A0UD6r``pRj zS!;86s~${!%6h!YY%YNDc+fKy3k2Z$2Fmy$V16COJoTWr3*JpTeUkr~Zz-Cof+=-2 z9!l6u^V5{xvCV^Egly$ParFM{l^y_{fL;f%?Y+!v+I@clkX+9}uxlr9z2-dU*2V#G z1^8~zyYvd*Jdpl$0&aC-ET5C@?5!(5Ub&d7b>1Dc1I~$#00D)RHtA`p=R;e*+sj4( zkmy9oD|o0N{j`Aa?apm~nkn;7VF%sB(sWb`6dI&#xX2q;c+*$M!58a)ZHs*%@O1QR zeAC8T7oWr{af0(&JOTs z(D9k}2lD8VnmmW6L^)iogl1#`hch;mFY1u}=0%}rtf`D^d;F$g@0(k57_j&4g9fW_ zp6|M^lmEza;>Q)w6<7z5OcJ06j|+2e@59@iweezFI6EjGB<-{ca(**+y6u1i`i%_i z9kC*uJ3VyZ_7)RvnqL}?w^AuZ_M?MWK?1#CG|1QNh*Nij0$?v`33>5SQ9XZiLpD|b zoRoQ}qP!&9E23AhztE(m#6JN5@UWlo05Br#%ZHRP004L;VlF18C@m&Np=fVwVs2#& z07#*wCAfT6p2G_sX?fo=icLj9dr9PuOfk+c^%`C&RN7Y&6ckA3EROI27wfHx(Pt=7 zGMLIx0v9E~-(Uv$98^u%kX5uo_!58vUa z2K433Qo}tyXxGBV8SJ_N5nuw*)qv176BBsJTXE3jV~b#Na-mdD)%7v6uTj&&yEa8S zhv^re7^?STG>Cv#5>wm)-gNj|pg85KZbJ4K_<_s#x9mY|?08wo*~L^FU1e6+1>1~G z{Yi;*n^{Ea!-UP8>ETU^%PF*LIpOeGT1m94ra7KS#x0+vQvh2xZzd*gf64+_ag%k2 zcIdLKLfIv736De1K>%=E7jLsYde|MWSvtTq-*odke5kZRKGsZ<`POcq$^BWC@|^)2 zV_c`)T8OLc$YnKZBrCpenQejukXGF~*(~O$gyiT*eR|vMu5E6G%vtQ9MqPyo&m0M*MsFUW$dbbfTLqtc^< z9UfXa05dF^8F$}5Wcb?-v<30rBo7`xsPO0G3;R(^zveKO*vc=+mk}QtLPbv;F?zbe zeA$5Vn*ZtVeD^a0ihuTP_lweQ9CBc&87y(oPc53+=vAQ4)S3?gH$4)ecbX-xnUgNS z>l?3Py);svtsp>*8ji+B*d63`poz)$s;{-#tR$w)A&TAodFP%SMeDoGnyd(w^7b`q zl#xAc_B+Cyl|ZX@5Oy?@W9BPPKW0|YJ3TZKUk*FCWePx`uM{R+0vxjx$Q%M+DIzor z+k$MfK<5ApJHVu$`zXA;KervC7Q8AH%?<_CR}%6ns9lB?xa?;R_CLjZoh|Y!8ZQ?k zS#%ncSOe@PCZfoL3)d|c8jbk_ayLp>NWc*AD@#mK@RHh*s1d9kaG!}ZO2LWv1oR5T zN&-#jqs;Qx*AY^u@x?$lO?|5lmewdQp0s<%tz=v-*epB@WGhkRJ#F;S$QtmL z{uq=A6f{;epD~HRJK(24tPV~kzd{8^svu0aE-iz%6_K+d&C(=v^0BzmK{WWEXx=7Q z`+b(Spwgxjq-&v!?dLO+v?ox9=qQxZWKihRV*C(RjC(_etMHLTLUc}^_hSRZ4dN!2 z_X(}gW>W1}Qe&EiLW{W9M=uu1SdPSt#Et%v*xxah@dt?>v30@k^@m1vuP`2DEERw#n(m5%Ju4ZMj4?rZv{wdb35cMYL5l@CmVlRqvML z6JcI>Y9=5sVPTb; zX^wo=Fpl;QX3h5^by{`GE}{xDENU#eWlASmLP{AW8M$qeZJIs<&{2wcy)co~_QI_1 zS#A31`Z;Tc)W2eWk1^zE?-<4viZRph-WU*mbHJrb+T~kuTwBp=$*)NZDbQ;Q>tJ`Se)ueW1Bu>)zG6bUU?oj``0X&-a1IJ8{we+>6M_BM*R^^Q z`xs^;=5SqCyR6AC3-KEo2lqpAGZ8z^UDjPovx0L^^$&~~G8i$EVZE>dEIULaC^{jD zWvVf%WpzJp3{EUg3WWHCLWLrPa9W*Pe|xdq>OX;=obQ(|W=?nRXC4&bdEkqYcVFeg ze}Fv*g;3a$u@Ri$JKKTnP5$I8<|VHIl}FrPa9f|Csyi;;cfpl;HX z6!|QBB^6GSN*kb#Qe{!OY$|D-F`zVrwSBpnvS~9&+JDji;LT;i<>F-8>iit^2n$uT zL@)U^U8=RvAn&5x-ne$vdJttzVJ$UxI{0BQ!kBo)=KJ!bQl?UQtDafa$##!ugQ(J4 z3)8SBx>dK;YpbIrld2Mng+wZyu`7eY_3!Hnw2MCuR@A*z@0NzH1CLtruJayTR-M5v zi%WZr7i!4{>N<0yrK{Q{TSMpB=XFi0hpj65nqT!W%%hB=s@V%GTRxUqNKO^(=kEIv zMWt-F?0eK5rOo#)%(Sgo`%C~M;JT57$Z$!Tefn+`ElWhKyY&~>iaSRRviBR?Onr2H z#E+!TVn!stN#^x-L^)0IPtLqAd>_Z%5%Hs^V&iMC?bGU&mSA zR1KKQjKmDT{+Y^~;o^NR+Vkx!EEGSOPt{SVv3hent+c#!dC)JhOy{h@zG$K4;qgo2 zZ_`pgpHEORs^q|d+i67m|EufQ6wxSvGCg`ze4PK?L<`Vo_&-NYf#r$--ULAz zXZz>6|2JV2_<(bQ|3UEI`{@8d4S>^E&i2l1|7%Vtu>O*a`2UyWNNoQWj8G>p{6ztg-}I<4|!ni%QyI0Csy3yrwJjY8WzMT49>-_lDtW%a9wBWlE@r$9TdzqXCs612b^;sz$<;uH)2-Cyv=$y}0}K_%$=o zc*6I>$!km4H&-eZ)c$zU% z9}52t#FYq8?LW)Wceq zqk-*guEiVT6;?KhG&61ZLopqE zE2PaBX)OH@W4K0uyDp5EUMRJ#7gWpevC#eXOLAH?@P@*U+3dfwS$Y>f&2#^kBz}Jw zNr!!r1Dq~+KtwaIfNG(%Be|J9&v2|eCxd+3|18r!cyeczr~L!|fw-=VpWYSfj^MuM zPL2A1#K5dHY*c#mE}C>L65va;XjsCWO`3V!ly(>#w6JsLIp2w7b4+-?Tdg0qt^e*x z0YT7JpsH>vJI~lL$5wZ0U z{eSkOtN7n3z-k{-WI+dFD3Z;yVR*`t(og?M{XmT9(wD=0KHKB|r|$7Al=fcS?Z3<1 z3BHum32vdAH}-t6%Jw8o$ID4Oa52!B0W4&5L@B%*D>I(>A@RcIU1;q&6Cph9z5nlI zR{RwlVM{f06|`6(0ZH@5>Pykuk3l_W)))~2_i9m|lkLi*H{Ft|wzu_alB7a1|1tpr zP=O3)G1^`|Wi_f4Cs@7l9wbZllFbu%BSO08e9d^)9e8Cv&E1a~EteWL>%G7!K=_TeJ-3uj*HhJ&JDg1?dwter~ z!-W2_t;EXzY<|-ZFrkv}hGcXR3I%{r%hv(L+a*!<9qMFv^F4fK|K$-kc#WMQv$N5D zVK$N`mLU4$5(NLlAIxfY zVWNoM`f%Lz)b_Z=g7k7f(-!#*`ygw9=g@?H-9 zNeuWs_*?9@si}zv@^i9m)U4XoN4OwW>f&F1=mcwN%PCNGnrId{E!!?PH@t8A_~YT> z!PsD^Vd9bDxmJ*eXE#mnrn?5?^8UW@Rx-I1$7531=h>6xne2Ie-C*P_-|61#VUVS5 z@ey|5-epG?qhSLBFp>~*KH9x-3eWwANno<+uZR$U+nw7C6Y*`2s+%pU5K*d5+h~Iw z)3?0bm%Yr-Y`!Qi>|qE$+Fc(nHBmDGNX*LJR{I6zbpUpNgG`vY_~26K@_^)mL~7e4 zYD*UeazWA{z|5eKu5HZEu+j92%X zdZ5{k*tl9!d&f;1`}iaqo$&tR;^Kka=kZMC*+sX_+lhS8z}M<{7FJ$lCY43EmBh@C zkocGeS~@HLmVHH^qE_9CJpSz7)JrBP3cto0e*=2cZ`oA*A3;$3m%?IzN=oZT_;n~P z$hTQRbwR1j`p8zp^Z9W{nEd$(mY00Lu=0GpP5yG*>+%<{r)^^Ma_5{pP%BqVDCr2Do17Nq*(p1qHFAd3V$0u0Z%{&%X&EFE1bMX6lQKg7OZtd?0{? zaOTwpSA&gIrol3w(YB_rKIFuJf5viuwr25)&1Zr3KOzkb<8ugrdQN;52xf&8A-ye? z)Q%eqcgmN@4}D>aeerp|$XIzIkH;VvdbDK%cowuT5u^3Vv)Su|%Ffa^@XnSlQBoh8 z9-f*W_|cGW21Nk_*%z3$M4LK@%FgUV2Mqo10-$_2Nyh825G9EPzSf{mvq{5V6Ko@* zGd&A)YH)CV@8?+FH-&Pqvt?a;GG`cA zs;rQLZA^D>+YqY-|nBKE9RJmyzU);dnO%Tq$1M2)K%`>kXlu*N%$tAcs|-q^X)6;?~i|j z8+@*^oE#!0wO{zd$#I-zJwip3_>YW3k$_1Lo!!VkHcsGbM2s~1fN&)Gm~pM4U|UH~ z6r-^{=NFu%Mz{POfT!!r^V7?hrx$b9>o!g`j{?6r{&0ga3bvlGU*`+nXt(ZH4n3Nm zm4>ys_Z`-9ij{4E9C3+Arz6SRir!*wa~O|*Fy>%jNM}c3=68mx53_euXP%Eg97-I7 zr?bQe1U`6pvArYb7wS28_!%NHSYRAnOiPc)R?HD$omA%Jw7_>W?`XpY6t10>H{~(5 zQXV|u9-VOmtJ1AwCkCSq$%n8@loEL6jC7@!RK?#hg#qSEjc+9GUP^6m%AAm(Y2L@a zgIuY2@ojx4!uL-v71N;BzJ!(eRb{%D$_AxkI6-QC1$R8eW-z1?*WTcK1lgTgc(wr(2XKMS*uX@g( z@F;p-c1}-L31{7CZI#gkMBg0g%6N?_Pqp0TjG(=O4DxW?6y`@RVrM$W=ew9ru6-;H zxW1D}-TaS%LG+g`;o@*qaFLfX}g&2&!>^8_KJ=6cS*B5a?NAAJUE zS6Qi|M?$)dj6xY&-u4KpdhCT7W)gEg|B7{%}<6)%}>@FJd+g_q)rAOS(M(F zF|8afIR6q0l~V^`8dr|ww#=TtZgZtOO;jda*>zxQM_dYHr1Y^bL@ljBw0Io*rzImzpN z*-bZ4Ql&fDUNyztMZh@0^OL6;0ARAoex)wY&}S3(;)FG1v{ecqyg>80v zX{ek3EH679X7Q1i(g7)X`v&Rp=b@ryf3Q0pl+1FVv9|mTbP10BK6#E<(CAtgMf$z_ z@=#X#txqn24wz?}tMKQDu@6<-c{A{A>x;jDqT&cf{awb(9XT2IuI7_;SAo&4(UlEd ztXbZ=8Y6Gs*Z)`qe~n7kNF@y#P^!2uFx7Ny2?XT}1Ek7w8`6VPKR{x`ztLq6;gE%M zPQ0yE!b@{N#2Rzee_YpRUukEWy*sNaEt=o`}|VH)CiL*+9M8v_}jYu3q*0lM0v1ID#21{CHCNf?7tf2(Req z`A{~4qBD5&`_{qJ*rT8h;g%l0TETmA@Hc|Q+me7e6!=|DNlTe+wQF;2lA{?5oVIuW z$oFQ8zXsBmlV{bHyJ={9rWz8L?g2rw+Iw+LKBL=Tdh4T8d`T=9!0)9JK1*VSO(tAgi)+ zPR`g9QA$g7^Y}K_eoRJgaV6{-s3SC+$tVoO^r3w+)eaW2)L(ri%-ug|3C}erJd@oq z(x~$EuF0Xs=Lx1RpE8J?>tXqK`&%;Mj*6}0-Nk*6>!9+(XUD9^*e=Qm{*arURu-ca zB#e-e(ELWy@xMklfZp$Zr88NI)q8#!AB{Mtr0}jxdQOtwL$ztOizZjZt&Q*OTyytr3|MqiEV~PSmm+ z%po?j3#^iyWIl`8^p}P8vQ{RiEVGHo18Nt7&uOVik-BF3YQb)n=dU|ayVGaUG%s_7 zEwd{WOb6CBie@8jS%jRZKF~jVK2=zzz;lW9j7V?dM@V8%npQ4#aE@o%ldN<<9{92e zJ64o#glXb7Vmoq2OtcNlhs&C4POR`5nIhPDwXn3lvM*p6z<*#paH$~X0c*6<=n1D4 z;IC`$h|8p}@$6pLvFiB+jQ1aY4t!eb{FZpVw6sk6s|8TZhi2vRK<^HMBG=tn`j?W8 zgI)%O)8XuLjy|z5ulia1=y{5Gw`K2<*Z*WHw>k*&z3<=5kO1jWyB77o&@-Vok0~Hs z%PS}d@40~zGlYFiDE<0{D{P#YE_76CQv3K-3o+1P;Up;BHOo#c=#xSf^5_S+bv5$g z|2mlT4*ptfB@494qmh(QKqqmL2NZY(pdZlSPHRI{g{iFFtTI%iqEMvZ4+~4c_oh3@ zNU_8h?NA(awCRP|D81Cf4QjwK?sdT3or=H-bogOiCM>w?=Y3dIStg*#C)_kq!2TgF9hw3#WS)*A}LifGvfK$?4-e<{g8I+-dE?`zS zZ|YRr)ld#5?^$veaPyS)v+20D1-q`z3%(C!8_FGtC9Hg%DHCFxD*8Z1k});LR0DC= zVhqJc5&S`|Vt?H~SgpnkaJvXg(L&D%69(s`^WBc3e-i5xQE5qANcrui`A4~(S zyG85W?fJUup!JC%FjuD)4)-`9O!f)7P?!HuobOd3_FVjY^!lTHf6@RsUoE;_-q`+*Wbim1G7#VLMp60osbIL);&Nw^q{oA6_TrpuhQ2ycH_>iSS z5}{--lr0q5mE=?Ql&p;`QI^TR4^kmpB9a(OwuHtqV;z(+_9ZeHjO>iDZ!=?Nez*EQ z&vTyhJCAcX$2s%IJ@@^-uj_TauGj0jytC6Mhtrr=dOfV=QoNrRc?v3?R0L4R-)lG` ze$O7!xMvv*wr`7wOf$q^zQSo~7)9d!u4`4}`$6WEh-6bnLMN|Z%1!50zq4{*C0ZUT z#jA!aFF=WJ18iZYSE}44a-)L33Lsq;3i40;)MEoR`CX=j|dJH5j*c$|Z*nGQXa z%Yq|wE<3iq2wp+h_3YH`+jV+OvxB{%g+C3reNU!@OYG{~rjNc7hMb+2i{$R5<3lM# zB*ZzOppzb{yc!rWUA91f6l~r?U2mpCOFh7B3>^p6n?q4s?2MYXH?q-@%UZcbWm5%E$9o)|x=C}D(gyA5dc z+M6rQHQ%C~HMs)WnKTq;ItT}+N4X`a_iHnqnEfgR^drn)8q7&nO2sy6)+-6Td=n}0 z9Q_~#{u&b5z;Dy?4zGr$x?={CwfP^zUS2Oua;)QAQ0|TE2fNXOzH02Gz4C`G7Wkc# zQ8Q>S3}9bXB55zIK{qv+zH78`3Umg}HqR_v}>aal}AU=&@hEY7q}7_(-Hg^ z*2wb$XfqJrpsbD%W#Yfe?s3g6OtTev>TRFN-8V(6ZmYhf2n(pMPTQcBWwWT)xQGc!_(-TOo)52Jy_w8WgC|v+W0{>QHwpuO z@Sv(-ijQ;D2b|kNJP)qZDue(<{s~Qd;FS%;SYQSK>bYizxw8=)*8D?lY8NZ zz+9#Mng02o7ipjBnpXo~PxBek=-MQ@K8~-+X!@R4IXWH5ZeOH+99rZ-5?=C)I@E~h zJ*V5reBSwM+ROMkYSqiYi(^8%V4Hk)RrIE04Z2wtrdOK!kCu-*B2!PTRU4AbPH&)_ zt{>M~;85Sb#xBfujJ;dzwZ2Oj%(L$eGYCc9S57GN;=^00zWQR2X2zL6zz4ag(?8lE zKc3f^2%c9eO7nd3-Dd4x)+@V#ySA@w+{4>uL_eyWe-_6gA&<_DP>*i8_4!FzPe@`$ z%)>c8fdMA>oBYhj#^E&dRnBROO}489WlCSC8WDd-HmPzx<(#_KwYp^vL_DN_Ei>#C zd2QfDm2ZEjiG*$t`y!tE#TB6?^7q*X29G~oQ}*aAb$86N$zQM59uD`_9Ze4G)+Srx z-~U;6xj1^tN=6qpIg+KhcWKIZ76*+>_G(Kt8eJC#el8=`J1_5~pV${n3G!IKo=X?k zP+ocv=saEENvB_=?AKH250K=ae09Kr*ms@1uX#`G)f|6Oie?yZ7!(7g-n!-P_0mL; zDl>Lh6ZLdJ&HS)8&Vv^@_CQYbLR|Chm}_^Bnl#hPM^Us0qhT{~im7&kG6Puwvhdc3 zyzXYz`ssd9d+=I94-6y|&8|xA-1&+5^`E9(=I3MdKxbp?gFH!8)STp}L)cPe1cYP(R+a%xD8bWLZ(-r) zvO=L;^b>VUaH+TxSnG?^MW8Qt;>BedH{R*Ur(!Q7_dKhY&&2(>+?)szw|)DMnpZtK zP2FSZV=28N(>HI&St}1KDo=e^T8Gf`dzzb9XB7E=iX1fq9vnC1Q@FDHZCr`;$yn=c zmZY+oGTXqyYSai6SmtzZ*->m-FKLAFIE5+bvKU(8g0vS{bD!oz2^(#*rML^(X!YLx zBEy)v(Pz#b9^uTT)YT~+$FCl2+;Qc+lee0j89Mi(?;!GtW)8sz3#u@A zILFqDeOXHr&0?jU8t2%#RP2YadObpFr~R&fI8*2$wsD>-1}01fV`p7X+I_?B)vR6K z__ke!3r+m|`DcAya)Syc{=w$uiCpDJ7ag_JibzT%EDLzAEO7NYR=YNJ)$p)n{KjuV zhIxP5fKVKhBWL~mb5k&vgWONPbk~f3*BaY$;i$f3)wcj3kzUI&e)E@^`z;b94eFq4 zkFQi53mtY>9F<~ZccPqBWBCrhO|j-9{%sR_G0iNNAg12*gR{VgJrG@}Y|rxyLRn~; zP1>6iO?F+^4dGTyH-4>COm@GwsMKeF;4WJ27Gxxsv4_Xwdd$S0 z)vhX_LG&{!{y*8IR3^tsPOTNE^O7GRwA}t*neNxPrbReXCOQN@cLqWoT&C*3;F5GE zijo5srizw&Y>)=kzmd*cNZ~LQVQPG*+ClXUVmzku6IhZ3 zMC)+MzO{?6Ij+w0?dP(?r{3qA8<}NPcdPNPn%lJB91gHJIDk}8i z^#>aN302;;(`JmLgiI-KW?}NniE7Y{@Fsmef-Zlq06Ct0dE%F8D9-)8T*|B(k#jc* zK^ezhzgJFa>|YnkzEJFTt3QgGSd+Cp7Oovir|yS*I)E8G&Zfx+U#3VKt!dNua1cpv z_2Dn{Do=XzdwRi6=ytfcK!z<;;+un=*pOJne=6sa__VhR5z_sFIeBN~9}OnDUA@#L z@jlkXz?1r}Px&8(HhK?uc=pl(1`@lkj;D6|{my1(GvjmqXyY>eKIlCp^S_LPkS$JG zHIC3zMYu>7U3K~e5X)<~4_y0jR{FE!>Jy;_<*bbgbZh|EyV@rclV_?%Kd#fS9|+myxN8^fNf z4Yz-U2$q&(;n6d{>&I0_;AKPtqJ(p-EwGgAkQ5%zh4Tg?*7JOmh1!G6Bt&9dU+A!W zHx^aS{Rp|dPOwIc`LSalhuwZAY#_>b--G6~n znyJ<_ib$3@ofuOL;+3QJhkjx_V8nDK&^;MT$dCi!>&@mtZuBjbPnX zV^L9S4eZi#wozhg3{Sp2#k(3n0FFG{aG3S}f!}8f*q|nl0A|t&IyaGyuP3U@#SL=_ zpkFi^}EhcCp)O;Gg)Yn!oeP$@*uy&RX={HCy^Xj7 z$C_3~M%sKG$UM8VLGoauOi`JX-QC1x-_!i(ecoTN>VNErA55U8T1os5VaUMvDOJXa z%Q^eP6Q`h5*&9XEceysSa?RG$)7YEl5xR)w8RcgfBEo4&7AaWi#|CdywTKtSRcmy# zrS-F>_(<$h3^&jrigu~*?VhWDpgq_tTGHz#Frk%5%@$cO?o?)Gv%?wIigJTVnZY9G z=|=1N)W2lqhQm>&=4)`PaDpZIQ#s@SS_-R^jvrr-F0VZ9Yd2jb!izfAg&QmrtwvYKW(~|c~{4I$ixyr`M z(PcdfKYkGe{P$gkF=f*YcizrT$DQ!M>cw+_79si|BRpY|l`O1a?`5-Fsgu)5O$KvI zxoem$j;Uxcr2}bVUt6`^SaD5kBa3PDOw|2t?&aGM0dvACtKK4_#N{7adH7dSR>6mk<$6OsIpzqR<*2w1!5m@Ft z^^s%8l6DOv)P-1L&Sf6fIog|Wvfgg5sglbc&Q}8COd%woH-L9d|Cb2WUmxi+hS$2B zV5cJ$MPUe_`JVu1xLtjHJ#Y|tNjgf5<+i`!r{nI&7}-&FVvvl)u^)L#5W8PQeUY`H z4t1aPAuKA~W|UvN*z0X2wxtv=n(m%4gF_oa^9fNB#u8B?`N$ zT=2F+8g)l@znz!C6-#VG^zP3;r8=4-AuAv26N%6AOrZCC6iLzd`hYO*98id(YabrW zCWYX?{#Pzf+P&WVm`kde&FCPUdaybB0Y%luih;BlrhiBBZAtf^eAk=6%hdO<85Yy+ z*Z7!e<9fPumI}PU6f*_kjo~W|biT-P6v;bBb1xyG|G8xT>(pzo9R($s?=Jc3iJ&NE z$l6VO&!nlOco!7#@a@XUM5)~J;;o}qd=s7+gM0jdVWsO~#z;-E-5Dd1( z?V^zv!ngNImQ4j5Q9$vg#nXT&BOL6JQus0@(rRoTfhG1)2d5Ny9DCCFM~4+`Rs3wO zJ8wQI4zCHb6OK!oQcixqT@9I+i!jAxGe>y;8fI+ChBCbPO0H2B0tFVuQtQ06uwQ5b zyo^v_&lldgN*?Dk=!1T5iR8L)!4^pRA+n4U?~tpS$wggvaguAbQO~g6tF>$QWlBr< zcqA-{%~fnVHrf(?nU4M?e`Q?LW=Ai${%fVECLN~QmXQ3A1tTo6a+arSx+9b2RtJEs zY@%CyBft`%1;_VlZw$@?xZVWXz!gKew$(RI*}1-s=ap+`eIB2;TC=f})r-CAc*%Or zJ-__!VUzL{?+a<%)_I*trWbi6D*P+<(?s(u7lXdOKBP_Q+#-%HP&ZNeJvaK81Lh@T zz@V8%#v6zA6Hr^GmOk`eIo5ZTtiAxobpNZbZK96a2EFASxBYn{>rOP1PZK6pC?7P& zdp6^v8i`Uu8UA7$U%BkP&C{iZ78}d~!BUoDhKqg+rAR(Gy%C?b+(3bx_qt_)d1sjC z9S!oKiyO_rpE!WEc+6=QTjoY&6DOaZ!dlZQ_6W^&*2dos3|K7rJb@?F&aWv+4r;k5 z>moc76g2X;;uw8)1Q&_|z!ES3FPX%Gjt!syw)VI_#Tv^eIe!!_DaYITp`|MF)KDGz zik5MIvRDcd0{zbWtc|J4h89)kz6SZKwhDvf zA092axlC1T}gPj^KY8`jytNgJlC6hwEjn- z6n)y&h@2;5OqNNi6kJ(}Gx<#^s>shAg}{w4kj{=yZ`|&D-Q^%~LkGpTE8{M5fgX(k zbULbG`)h)1AfCC#%hT3upb#)B^v~}|$r(s9lxoes6WyuStTgSy91{Fmq?wMX03vdd z(S{95A#L`y)ju7XyXH}B+ij5Ip73Jg*JIk!K8%JlR$`S?M*j=5_k$94D?(D~Xhf4-FKMpLU-6Sz7KUQJ=El z*wDuYoOTubR?R83IRT=@A4fwZUL3b58hJsyHPMEWbWwdUg^ovs(`oACyqZHeM)|Xg z_c%{9jv%SvBYly0CYz>o1Uf=|^2CdR8`+2W635pfX0jA2#S*2ni$BjO_Y^zQBEehhK6 zyzLjLsDUaxb%!%I*!EXWCMxROur~5n)DM)#OipG0!u4*n|8SWQl;#oc*JTb!#HiXCuF0(BFZG zU6an1tKxon7`{(no<(1Kd?WT|Y-Oy|uc!YP_C9{}9Jwr&mbk@E%lG(I>DG_$<@${W zF11g$3Md5X{fcCfV?95YioK+Htz;+U0#jksuPOW8>85gh0B{eaeM7?Eh_yqC_4NqV z+9P|W?u3{ps1K{}PEq{4U2BkES4D{!tugH`Yt_;6kp$B3J-;S-PY>)P{O`R<$d-yQ zWeHjq!m2BX^P8z!w#8qM>mypbhO7Wci!i|7eAcDdD3pk=)a9k^%TLf>uYnGjoAFQz@m>Jqg;Hp41E_EQ&1BiqhqY6q zLwPL;J!>_`r(-od4I4E{iQZfA3+gKq$@W%8O*s)BV9`4ev+Sn&k{=$4V+BXAn8ocJ zzbR{lHsj1i#unpslp(a6YkFl0Ny4$#4~#9nnzNx9V2k-A=ocB)V|4H!thZdt!lUJE z`H6#1V6?V}Fl!_#%q0j<+tmtLqb_O)vnG(F9N`JAjo46PuEOfR?ZHqv#pQg+!l5OT zee$K$`^mId4WKWM@z$Py9(|@PGq$Mik^Sl7+S~&spuQT@7xEPKvF-Q>+_TI^)#-O0 z=kY1eq*4OP%c@muUYiwM*(+%)Q1kZ?+VVgf{8JX2ya8gj#<}4!)BovLyXm*2z+!Y$ zjU?suJc3g7n&)6b4C~z1d(dZ{12&%OPDxf5n&lS?$BAwgX+u!yXf0K0vau7a0hCx2 zN-DI|a0aJPHI2yqw@rReDfoXn1Xo##KuvsMtjD_crswA7bOIQB*;YlhyI&S}E?jIr zVQ}&YGGmW|sU1ElgI+E^9occgIp-&WkQL%VQUVdBm#R$`hX+w3z2}}@0&e@l=@?j+ zD!RIo4OWys5Y4;i*1^@=Un?$wm5 zm|i&(`RJ|AVI%0~VbALLV(FSelYt}txgEGE@tmUut5&tJPw{s7_QOf6X&J)>A;Q_n zB7E4sV8scU6hHKg3Lu2LIEobj86Rx{<(_0Pg)UYsGMyGuSBAw<%>n%(50cwM@>3`N z*VHgjElM6`uGkifqgIklQ;1?6Ut$F7IUvClhOo7;t%vx_19##4@!=F9Lm;?+1cLjW z4jxTz#wqQxg~6r;>K%O3?jQ46jLPAsgLOA`;A|xN#nA|*XOHI<1UQt*w;%r9sBHElT1>IHDwpp~ zge1|oJM_!i+9;^i|8L22muaR=WXpfQ?IbWK|GkzrqZdqXDkBJ{iKY1%&pnx{yD2QL zJ%ey)5JdhV`wZkBcDVe$07!!~9qTlUcbpYI1FM{`sPkz4Vr+>OVmz?G)50srG|K+E zd>goH@hvkb3`gGu_J>SxyvPNXC0Vs3J2e_boKUSeIoI^kp`kN8s1K0lVroKMBXw5# zgtd6V`+|}y(@j?+vPk0+|5V)WN8ezSzxvz_F3Xb)EFhmuR;_^oF^z%$qHy=lGhqc*jXTsT0u{G=m`<|f*yWlWP<8lk5fMFudm2+dyN++zM@!P-2i-exd77H{ z`0p>FCdd`O6%C``$gS_%HGkY3pBa0%e=8y{fCK2wl>Dwp2^yGZ@skn$0Q~lOc{qs# zta+1si_x3jmTx}vE;&IjSaIG;Dsy;Y({fY@-O~vgiYS&pUwCG>%ktWW8xs(p$;KA) zPZeSoUz$|cO!)pEM191q1)g?a-g$d^1JuTMV2PCZq3{J6=AoMv`Qt|v{hF!uJ9PW| z@W)IV_QdWyA$#oZ5||J(_I|f!_jHhZ^L%p|QC)sZ1>Yq+W-5#cr8vk*3qQ}~FWbxS zp#d}o&cDX9rveeaN>&Wwn7{Ew9E&ZaC~U2t92>xA92zk!7@98li!mtBM*x zaz{xy?=B5JHa1r0V2=@Cl+)WUFE8(E13xcfb)F%127H;DRr4R7)je6Jv}?yax_8#$ zoB70un!+y?;AMC$dQ@1P3<&lonQ=`sYE^4KcRVL^6e}d5UW`xNHAp%~bY6c_#Qr%- zduUG=WwmY}ERD3tHbbzl*W$+MMIA{fEH$8^@W=htxuP?sP)bE?h!qbOau~!5GNHTN z@4tQUIEC)hi8`~tv$NB50C5T^Nx)OLiSz`-7A1U=tHq5aqooRf%5w0+UHFOmuzL|J z{c5O(#ozv-vyIv#bT&JaF?c5OA(y44#z4*&_7^#&ECv)H5RG~;eOwy8)b(+q)>6oM ztT)c(Y{|bxE zem)Z}WBr(0>gZRyyaKu9IJ2(48Y;N<>!V_ai|`FM7vIgFYD29Yq&}OcvcTOr6DfHl z_{cuJ>b~+&Y&ud;IP61C2aK&uTa~#)HqfRckxJltH(6s;$o(r`5Eckf2q_b z5k@llEWEO}0>$jPO*#(SY$gYl;yyaG+}$xv3GI5)ZNUu~sf-KMlZnZPiEYBqT3g^5 zhv~4%*uA3|Z1a@ulH@+yyDvwius`$Bd-*|gH+Xxs;YL))yS|v+v9`F7>e#IS$SIq5tg9Qy(o{|8E&Z<%~MZX&nP|W@h5QpygbGi#xVzjWm4BxoIWgIUX;*!9R+0 zxSf%dBqh-A{cIBspQ=Uhq2jQ zrb2T?tgL4^)s@R9Q$NA}bHS2|k$q6p8T*u@RCOk@>=tl?5zhlwofJ`~o?;|thy5|j zsd^n7)&z~P7n9Ty$$bPI@%G0^~b5m;GCsMQI?u=pK%c-<;XGn zA-8Dg$wu<{_s>)pnyBFUAK@9b-J`=ndcwltX1v7ctvG+cHPS6M?RY9gIN+ZM!d>7b z=|)ipX5w>0iC-mNTT4r8!2jDKs1azfo`WgzvfhS#S@dAg5T7m$4Jw{a5IR3vXVCsJ zS3^?A`v7%91G@=Vd^*GzBIEhbk;qYF}!tyapG{xnf`i7SeZfh`<76D`Z?D~>! z3}h5Z=sKVX;3K!w?*~uu=Pc6g0R1qnVuwFs>mb|=Dh8ASP|NA8@}HC;X3!5xEG_$c zi0zMEoZ{-rucGZ6KfTC@-wAPM6sLaf_*(jb)Z)MObo>SDZob7WNeb-I{*8<=FKbph=XaA$5*_9=iKC)=!gG}vss9DzLfqNs%gEcDvjd8-3eHhs+Z-=}e@!sH5Pne(YIz8LS`fLQ-{HYqdZ zWW!KvZvxyJwFAAwIwxP^a>A^v|Jwl@c&_%yk$=`e;u4nodI24wkT zEs__Y$@+%9W^RER`Hl~yGlMuR00k|}#fcN&F@-npjya{wp9M@_0p`vbqurzKSDJHc z`{MdvlhUZ~%AK3vt|~ZS6;{-!J|%u>6}l>1N(uZ zKAcnDO6T)QEq_mK^02>WJ|eg8&LQePWoN8RJOEG?jP#0NC5hfONAdoi@6gd0tK zn3>1}nNSz&gJ1ajw*wl*9qtG>^ut=5y2oNY>haP(O?#*a7EU9Pf!nICrm9*uAkWe_ z-#rJrOZl)SGCFkqV<)|dm*Hx_pD(N2K3_sD?J#L-*zoS>D-9>V6Q!%Tbztc46CS5* z3Y39(@>uXF&#m|eVgCd^i4AoTVF@xozWwHGAdu+sc2%?>5$HBDUtO6fmz;wWtryjl z7jh50Ba;-jolh&)cnR!9&bS2WUpIZi6;akUX#WaA?`}E%X?|Yhdk@XFeL*zlhFp}( zcG(Tx`ZTI}7eW;I(5IN#iZ2)ub=j&a`SpBV0ryg`Y$C?h;uamUX52b^R z$lA}}(=Bjyh!9!c4YgK*F*xW&h5CA+8_3ZqJZ_!s>M(Bgn9P&>(W2bviDh|{?;zC% z|Co&rM{nK-QG@7{3}BE^{&_2d#00;>K}bx+EIQ7qOuTO<=E)gB8^eA%wfvbauCl)M3|szp=V< zO~+%Iy3*BIzRy01z%Jc-|E?yHg(7jVWWCpM88E`}p{o;R8r}rA~%Dbu~9Aydl{dA z29aVW7m*CCfLrCbs#gwAU}v+d`iIrqTBE5D$|mfw52rI0)d-+2!6wOR_#P<-D=tjH?qseHkd7a+mIdQ+RZLQIytVd;N> zOI>uh8u(-g$ulntx}jjdIl?zr(6t-@KKJX-ECU!u|JYmqQGSSKDg4G;cw5jde3Hg7 zkGO0%xj2fk-se|!7h7S z?V+^w%1VCmt?mOy{GwwJfze&i<7#V>C2xrzcU*?iH%D$hU~S-=EYg2O?pb|JXo0K! z43@$Fm>A))TEa2y{hCX0Y8#scni-K+F1)KeeDv9IiSzt?Q{Bp$LWh_x>`p zmJCNIg5jIsbz(!yPUmu=U!j@B&(o4{Gr**2M7YtBA6^{?w+^jN2(1=O$q%3)5_kl6 zrNp&%i%UIhG3_=xv5Gj}udVv}MF9+{MWSvkl_SLVi%o2=Z+I?Y7Pl2(HnSI(_ zh}fjM{rQ@BBiQ=82`@Lp=um4ljMc;Fru|*hcnjNZp%oXp!pdyX??fM$8E2@>V*^0) zB0c5U4ZKiKxP2_K+U?IbbvFkS=CN<<%6mM>qc0NsqVH;`t>(CQ6yva}(?4rcUS_>D zBssVIf%AfX8YX{YTYqm!g%exB=MG zQ1HrM@2{Na|Ly&?M1AYolf4J*=1b&AP;UF)liJUjNk~>)(P4FtQyZ_DsGiHaOV4HD zjm~3bzuI`bWm>Os;xTknr@RopxYY8B10~0P$j?*Rin-NPGu94o&6Gv_LF9P-1pG*O zb}ZTM8$1MS51U8q`m{EGaR?HAFo+4$T~J&|$|AzAL+C|cbUiqig`@#dt=R(gymM)_ z=ECAZXgL}6FE=^CJFlgnePB5g*jcBuky;Zj8tm?z?a~-p@TbyvrDDj|< zRXFBhc!PHIg$&~P<`)J-;uN=ad9)W@)E8&BFXMj^op;`#yaz9Tb0urM|h_N zU8mvxVr7>5%C#+XzvL(DalwuMjS1m8(T==7X{Moh9>cAi%g=E~*3A}a-6QxP9*tqs z%_3ITi>ia|9o%uc;z>r|^tD!|FCWPcN>xH_zvZ8z58S7;2fIfdj93}3xtHq;%mLn1 zVGoz)8+A!u-}4iv;+W8nqTcGVTt4rfst01Z>6Jo_lV=|tT~gtGfnC1Q_{`0_Pb8Uf zcTT%hl1u4{E4*hj%|bBB&r zPj)c%Qb~%qoB0<|<=C*r&^H{^^8RiG&n4X4%c~FXK`-LBE`Uh7cmR+Z`pxedsaV@;i`{4&n4dT z_iGgnV*C%r@rpRTW^0#BXIG*C0nXuI-edgxT$dk5+#G#mz<--g)W&{`RssV*xUufo@a0!u$9^2FVx zYG(HBFMbWrTKV4?t#jR%1C=buO%0j6)Y8uwD!BN?lFl9>*Kaq(_3EXkzaq!m%j$D+ zo$uBis{biTPalc+LG98GVNVna2+2vNfj^#GRmU~%cHa*r3X{gee_K^Jsu?%_cP9&X ztwwXW^3$CxVuFcB+(aE#ZAC7OHtzvqzdiG`DE*!z`1-&ng1XwtYb!kh+$zL`DV?!~|F9@4)f!Q`*BUYFpv1=Li(t+432rF|D+E+ZN$S6&P>s|KQ^u zAVtUAfG&l%wfMnoI?;exbo*t1ow7ssZX_$i1?f{201fk*83fz5Jbq({v9+XJ9P>-q zp!X-Jq6kI#wap!IZ0y34Ttr|PEK1Vid?WSzSFz_XU&=T0e~PY?N8sv1LZ8`FA?tK!r%kajV2*d=*@gMxD43bq%AyxqBy+_qZ*R!+Si=1EV}(HlQxQvv-rv(JHz}Z99y} z_cKy^?NN`y!b41e`e4!q084b;9jf0tB799Q5xQHqYPE&lr_5@!se~yfwS1)%A@&zv z8xErDo!9irst)UxEVcZ=FzNni1mVyq_Sm|IjNCyRM@XOZ*5a$4Dv*>jyP@Iii3*r! zm>KnfKtJ1!Gn&8Z-oZEzLi_EQ=E>R#*n1f4PTDD}3k^GCUo`%bB?(756M@KGG}A7# zyJA#^FF}X1cZ?2fKKI_J2&WR3j{YQP=XBpYKtWZoy*$-AQcS5KLR5Y*vh48G#LGGu}b^!4=3c+W{J?%HsmREdg}?Co79hdf!e_^azcCp z<5_<}o{bUFHlgO)bLzz^7(@~^#^o{o%m;rNAEBi`gWQr`CF01wpjx{j3rYbzS-bin zCWeTuAJslkpu2(>WBOkE$L!jose$Etu)N9h`1(Gr7tj81X-f`{Xz5m;g>-1Gtg8FQ z4~NCl4$!jW2=d^2bRg#+$ILxQ=eLj(*Jh3jQ*5xykm@9aNhCATE0n??AZH5E3b$Hp z{HDUOwG|5LQO~1pwF~LZMy29An5R7#Aeb@djcEJ zFlt0!jRMjKhR-&NdqxInQQ(f44jF*0}~Cj=Q(cJRoQirZA~Ofd&Hj0C|n z{DnM$-JXydg)eSn5NnIYW5#kz4uW+_9tYOZ?pgO2&o~aI;gkU5*7rrFskc!aTNbdD z8|BS+p3B&T2?MTg713=iUw15}n3yxlewO?w99rUr!+QDU5Z2(le~#3lDl#CRIw>S= z8v$B7bMTd*j$Lw-WdVAe@=^~PN2wv5VS@;b!nSD0jl1aBQykF$BbJje5iz;oFA#}h zV**Uqt8fp)va051$pnFwpUrgYx_&qXho1tbLC_D@l7OiY0iO<=2hs1)7d=x5Gq;6Y zu#ju{E?Xv4T45+RssdB@;b6W$Rj;)R*y9ZB!euiH zCbF)vY~8M-ZwHo&ZV!!jA(@`i-E{o+@F4f2Y?ihQ!0W_@mHO>1=j-k*%`EVHa-I*` zfuCAG7*uYDH#u|WCUMP*63YpWhAqXwvXLy3AI=sHQ=aq$mb?*Us)SP=v6;JT0UGkP z^uo~*|3Bx&9|>{32>ix;fV7UG3x!P12j;#e8PtSa!ntXJ-o1_#82eB`o%fMd-Iu96 z-criAeoc84%NX(KtOE#3HK zThI#ID*_;T&2h+jmi%lcyl0Mn6r%#@`ttxWO}F9BTK8=Y$&Z`9d`GTcB(1ZYU}{%s zuuC)MUJbF6^s8$tA9|R6*C;)UuP`$*B|}X_s)ej0xAl94vne%E~YalN_=eJd~I^>QFhpVhaetH5IAv1 z(C?2;_Oa7`8{>=b6jgaVUn6Di2SWH;8;m6S-0eLxE+aOo`&l3vvo`@vE!s5vU9x~c zDA;SYI6%nrrys6X6XQP_j7uWr7Y)-At4{ef$9T|0H{XOt`+Al-J6f$Go%f;;PG-&Q zbbbZ$xagkcp;ps;7==}pS$$i9lY%Q8$z8O0pnTw(B&(nbC9$IqHbzKQ=aPIVXDasM zRCB6~s^fxgtD?*ngJt79;y3*c6)4uthB!wL8SZ>f>@IwCDcYSpj+jW@>(LzxUBfa4 zm-w(B+}QAPymx9ul~)mcnH9df#FOrFY@>l5@M(k2khPTbsi*YvBq2N`q_dDY!UUMo zuhFVMpOQFaP$KW#KL`8Ek=A*N)M5dxNOW?=b^g|am+n{0D%eAkf@k!^$Yi#7DRGJa z%YG|=)QS$I2@063nq+VgM+AtN(AwGqMsr`X1^G6z1h$-aaFctOUP`79p|`@984ry4 zPyzhtJhmtCd=KXtSK~H5JA644HvF`%MQ<#I@;SJJ)6PKND!pM`1w3;nByhL+XTMsp z%4aco84{V{hYB5{H&)yGuIOz4{L~|}Mq_7~6d~1tJU95%{LmB!@J=cEy;#3}tSTmW zZqU5KSt0wX{4pcUTeWS|ZA2WrW_@8ihNw5CrEo{uQx;hKm-}%E5K9YD#qnM83(vLM zOT(TElGA$N?Mv? zVv;(h++N|VCZE>XEMYMz_Q@j#-R^>c31b2@p~`0aQo zHeF8?_uVTpQm*N*sZEiVt6-k$d?$h9oZ&vk*SN<#$5pu+IH-FtmN z`(C4tt3EOWG@f~n8r4kW80T5zt(m50h`0-NI#r~XLWHWg{oDNqt%~Nc^}pWx-Ba)s z@3Q!VnW;Dvg7BZ3xC8;N(KyB#3*FVj>`S&;0^&xkM|fS_4oA|7vT@- zR(!bTrI-8JWyTS4Yo>#*e|xZJ$S$oGDWkPy+HVcK$&p9Qv7hf~Vi(DC>n;+NKE{4{ z1z58NuvHlw>5onuk)mgK%rj?yui1uif3OfpD+!;R?yppf76rzL45p9DB_rMA&!jl= zjlWF_hfTm8=`u=w#%)(2g2UdvxQ2i?*!Aw-q~ot#a*G3fjAd3M%E7IexWd(dt&C(1z`9g*jE<=n$_!!aBhmcOPSh z5>~rzgOv{(lkmi#GtD1UPwlJqo9e4nN4*I>p)@D(>F!@9UHpiZRNSwZXD{4Q+=62P z3EW`$M!nRUo1=Hv>&*uO_(LTUJ56vd_eP-X8t^8F|MzWHlFx9QQz1Sp_SPe$njLlf7qzLcGR>Q&THj?ul$KZ_{2L) zDNts{!wn$~T3t+E9)4EY?A2FCQU*@M&z`}-9S$+mlXv1D?q5RK5%ORp*Cd%4z=S{^ z>FOuyP!6*sX`VxhhcZ6#)_16?aob9l(mT{uoWi`_m#Qd}E=8RKw(MA=Nfw@So6~|= z;>SEk7_Lui)5kvCJv3CrCl)RXl-^AbR#2aQ^>+xQNF`Mk{dlcBS$^3AyM+qgS?*Td z3psC-=RNU4atfX(U)~(>7R{*BdKbgP#^7?EHS4W>+|K=Nr6xj&d_V7uB&bm^mh}XM zY{%)p5}Z{?eO^bXiW-0aPwWc}S&#$CoEVl?j^oP>3&VkVLAQfc)&&0ik_9a>-lzxV z7?3Zdp1&FNPO-$+&6s8+zB9<9!N$pbb)zFHaDQK+(U=HzUiW1c|UZ%=@* zv|g;=_SO8QfOo}VIMGXP>f}+0E(e>iE!QE;Ea9NWC{-WYA-A$RgnhH!-WR$9ej~h1 zbPJI}Y$J?%%6>lv(DEK$SuNGk0Q2R`!|!^mWmJdB#%J-bzgfE@>o=>TlQah zFV0gZX*udW^+G{--`Nd}qrs(An-Gexyx6u~>8XLF8(UsKp<;ZCj$x@bi(%vS%0|xY zGF|H%59A%4X2ygc|AfhZg*~4QVu*ho2-@PJ4FRK_IVX@E;QK?c+?zcFbx@NJ;J%1$ zX+LUaBRdgqB5_%We~!6ry&N;jBS^00>fuDr_6pSR86i?8ix$4xx} ztHv0d#JHpSx+bULAV=GyW2bO~dUuQNNdTxpIbP@R5c%mXjGjg-arQ$gGTYoG)xc$RW5TL(9++Ql(U)!0hi(qB%ju zEXm_MJuMy~i=33$8bf@Xf+PoPM@1`$LS_{&B8?_ZLM<=84PF@!{BJsPjq%2aQgWc6 z2pdRGuB(jRC>znhgjz`lX|(KH$1#MC2kF`8&Y;)u25UBUGD*)~u$)sjSZ%SA@V|WI zupZ?-k{#RZwJmIIFz4xoZF&)oCZ`;ev)5jw7iQbfg|r5W3dON_?{c@yC)86>`JAU3v~)c! zqwn3P7kwwxvJB7aRqMMn1xcZKLL}_md5S$sGF57NcV!_Q z<&CR2*2UGHSd<@cjj-Cb0wRojm=9=u0l_rm(LpCpm6UNKl@O<%qei@TD?MWnz8xEj z07gXLLBa(qml+>TJ&_Melhw<){ynxtF=z0q7y?yKRsipRwY$F&| z;0<(=s`5%6#x}EEv3qWFaYje_!UDnFAU?9+1iVVR@e`(9aKrKqIc8Ss&CjA}=5UPk zD91(p$A;zClCKOy=U(*%yW1j9-P^nfxu1E^iW9 z&MJn3NxHhx0X@QaM?Y++g4DRS+uYRTG<2}UjijgKcS#!2kl109ma#E^Z%!Gz~;wZ?;A3RB&q5;;Q5r<%IWJveFd0p}5IX4uh*@t^*lTDVLa1~;Na`>1#%H8lJE_=tt=-S@0Vdv)c3t;h1S5%AJ z$2yU?m++0jJyDHgqZYB$w}*Me7c?@;ZS7UnG~N@XB;aX-!Q7(xwR{w=x5U8AGYtmD zQbqj*&-i5gLac><)m5`pRVD|6L(krp=X2Y6;%|GlAu`GyPET1NVlEaV;C-<#y{eb5 zK5Dj_&hf1*F;{(L^5>H}#02i$ybLqImV2Dq>%RDTbRK_=GZgOps~{kUXG(FAp#V}Z zY4f@ z>Mij5L&H^YICYo2z1WZW3SRo%x%jqIni*1K+M31K$db}Y&*o(~c#!&=(M-$AeaNKC zHjG@7;-9xDQqxl{RTOSrSsWl>hB&Fs8~(xa+0pb|lfMIYMMwLGc_afNU#7XWhQ&Wi zxsCbK>Rms?YV-UAaxWW$@P&FjTzz_B^`g99lypM%!h;9=zGnQdGUQ(#ZeKheq0YS8 z+pn_fCG5Z8!kboI(^`PF=OxtDde0f#yB4;5sTtfY^niU&Aoc`LI)*!Lj zmLi~npn?=>BGN>N6se&oA|g^06{STfQbRAHgQ$oIi1ZqeF47@%0@8bvmQX?`6bTS| zLf($&oO|xM@4kO;@S8FA&i=l&=9+7+xo)8pJ%trEcnzoe)rj%ioOUeA(iW^=G6f%tTL=xZK#Y!{0#fxl28oWImaJyW!s`1?z3Mi$)PU{!|glB2O)9Swy^eY^N=QR(QM(563p7)rBVu)i?)mu(lWbjm|QXGigK zpyy4jPscyU359MIF38FZ+<(h&iQ4iL=WAEJAkWKsu6q%#NRdN37RBV{HF76^Vd%|@ z<~0Rf0x&w)&uUp(>_DG*WJYKWXh%iJt2o;Z%%mIyJZ?R?vgSwkamL!Z{ z9a0E(A*L8UG>9~CFZ^>}L42lE_@L;s!;9oknRgW25#=FsoDOVmyQr?`)BnSF=8Ij- z>W|3ce!6lGyXnWf;Heu`Uth7g~~(~wh}nGa$$OEMU(fB9A)arB}h@2mcP;k zm2cJkD$5mLk*F{GL;F#~ug)@~)i}_;5B-N`x4(KBJxsqmm?QgaIfKRjo@&M)gnecx zdTN@wt>kz?E>^BU_r0ngSG7Z}!&SeN@s3aV=qG-Vjtc{4<$kN3M(lY6>MPy&I)3K( ze#irYj{R(;Z5w#lcd94Th$rXChFVBM;^D(0Qrg2oIjxX zU`7wBLGqUv|0r@QiSVPMQ*IXMPY4))N%s50m66No&1rZ_wcm~m)KU?kXUEHGxyLh% zeJ2zW#VzRUYXi4W?koaE{Tdog%={7c5ln@!U#*Ux`sm1RHrM>|{35|GDgP|vvC8Gl2w|% zyOq2<%Bj0loS=6V1YpMetI@c|c4^T*Z^8KXy29xn-rt)EwX=_Z_jSl@uA8@nX_iH; zrq|!Z0lMR9z`_{EEweR?L>?aRt!K~g;scbfV~+8FHh!FRdVmDAxe9exveFkV4qT@w zc*O2J*se(VELC(h7v3r_e+AAlm>l_FU(HH+ZF6LW7aC0-HsmIYfIXaY!?SwN`B=A1 zAA7%ZUSHnySLGC4+p%DCV+xS@p zS}&i>$j2pl`guk8*xi4m!-zS8A&lmkZAZvea*5qv1ouY*-fJZE#scs~(RIX_ z&z*66m4#dVxi!)^xmxSiSw))3DXsYw&M0G1r#H3w?iW=i##>v1YSpm8G=IThd-?aU z7Y2Rjs>8RJgI#&&$7}i$-q1VEzD#6r0gP&#LeRWpH{EnkFBNoxZe%|HJSRh2VNNu% zw!d>Xpoh87V!)g9z^=!7U`Nf|SGz&kY| z^7#3oL;z|_^zfTng#_RrFR|tg4E%2E$=B34=19c3-nCL*4!-3urk=<~_1K(i!<_NA z30LOxs{Td=kHgDZJ?hYHLsfq&J;w7-97q69{&+3BQITyl<#gU^o^-rkJWjR-kBVps zD=#m1ZCi?cSEX=TtsiJ!LGV!BZ%qc5n7OoDbeuE=dn)l>{jFuY8nL8~QR5XmINhHWXW3=>qo%rz!zdB@DGT<*a~v zyD&phZ%1IK$lp;y-4B7fe7l=oF1Z<{Iy@JWg+CLdzZ_r@TeD-OuWD7{a`%rIi-uH~ zxF1E6N)?ZOg?TdEILpE#lXMO&a1+V^n zhi|>{PWxEnM9Guf3e?TdX)5MkifJ|s<`B2#On;NKYKL*@cDH2wwC`_DW*oDzM1le zZ@Vrn`K}T2e9SLfHmY|`15Tq}X{&r4@e00EQ-8{0Jb3F`6BZxXbbX)lXgmBsve^Xn zTo=6b@e{BW;8lez1f9nn+D-M$>uh=isQt;*SinH(gQ!!}Jt-&|oE7-rlE5b|Ffv1B zhqtA)&irl&-Rz!d9^JvFv_00n_aufa1*|9Y0vO9J8wiDO#;4x|5B`$3amHUl&Qk|x zlwnNh-`eplUET~rntM?DowH4azQ}NIEDfl1h^+>Ye*J?p^D7~z<9mmR_t@4e0m1Eg z@Vf8144hwRrNqHu@lT%wKX+K9n9SZXd+UBHyemvW$XLLe_p@Bosf7)uJZnBWRk*^v<9@Vpe$ zgiT>qF}=z>x~b!^GK-1jB?;$#J72!>U`^q)XJ}V&=bC zg_led?^r7Kr66HvY|7`)(p97*ZypItCT|KS<4MQ;FTM`8wr=kJ-)>{N3Ze$ za(pdf+OUI=NKsCQz>i=AMHcFMME z{%xzVlke;=4{Hx0a+6J#ipTx|%lBK1?*Wss)p)}0bqsMNzRh*3YNfxpnADkAt(K|1 zn3(QG4LP2#Jz0`lofC`v4VG~a-5ga|Q)?7EiBY;hwZXQCM#poy5`6u(D|r{xNU?4z!}-5^b+!rB2A(J$ZLeXzpN30RHotHtWT; zE^su-P;kh&i{_oYT-mp?^*rPgw6tZXgH!I(u=UDHzqG!$HPFpX;k!GazOkehuQc`I z%zXN-o&ND)Nw?)fty&`B#(UMv>W^RT`bpKO?1A$q6cbmk#z{w0?v<+12Qi}r1qmGY zZZX<5^|ZY7tg7>^HB)xg{`U~(!s}`}+(yEufWJhXJR=M8r4Ucs{(k9C;XOKe8F7TC z(lFqZZVra(9h)gSr1rd=vfOKRw_myJ$6MexFBj*fzqS6btGQ-WdYNv^ylMMujo3jb z;3|d}kI-g#B)5D+LAdz*Z#9ZpBCdsL_Ra1o@g%Gmf;7FUtV6M`L^P|lYg}k0$$LkqI)1%4VhqQ|krJA9$dmw~%FTCt-EkKQZO?FJ-YSTGDn?#v8YNIijSQ*{i+R*@ST`?kcC@>tZ62q#Q>+W#qt zq_eMgVs`(dn-!Jo_*<-CeT+l4vcWNBP}4uF_EVt26UM32fvwZT-=a%(u21@~ApZxX z^7vRwE@#Y$8To*g2mCuxZ;JM!Ql%Il1RWe-@ex2q&-se>8*(M&}%W_?-+e# z2$RwrqRC4WlFnHrXJ5-VI+P3VerYK7d!$Lv47;-g@4Ry`Q>ar1DL4M8f_YHu~!m9 za84}a;xfqPlM(!IU7@kG!uPwsN5-dNvb8Kmo%}sPX0k=2=OAYcD;lfam?-fd>I(7+eqk(#6_v0g9i-u`Q`?Wg)-l79p$Q}&&U=dj3;-qA55WG9OF29@?1HAMFib4UE`Zk$S_wA?yH-bh0yOak|TVnP#Nv6 zni=bnvW)#MWHFQ9j)G}Vg!w14^NxyL-LA3snU3~J$&QWkMBH3U;^X>Em}%1mPx{p> zfw|w{z)GA%Bf5Q3z<&RGkqE9M^tuE)WFgUc5uo1eU~G_Txv; zas^99|FfA#p~H81_mn7Ua^C&qrK9-a)80T(@bpUm{jErnI)dQ~1Naxi7y3XAIcoz3 zdB>o(4=RKZqS{`58Df_qSn&z(dQEAd%)HAxYT+#Tn z3NBHsrdC78C$x}R6-4Q(FSc9YLJGA)TMN632z|pTvtrllFqu1>w$w_iuPU<%7Q&{B zbT+}Zj%wBXtuKSxg~Bgp1!?JC#h=`2HM_%zRyAk6PMrp|?(C0^aol^#Hj}~)>la&4 z9QSKSpR6lV3WI>XLw#&Czr0`2ksJkjifM3CG4QbVj0sTT?Lh86(yUe3 zr>bp~8nit3XeW$cU5;PQVMwd4r{wjgb$QGz>(YU@;+-{h=)E)u7TC;Rz}FO>=FYT$ z<#D*kTXJ9~63^7UE1Hu>UL%5PCgSe0v1#PTMz^JOr4Qe{uzTUgBc8B%yy7k&Xs@}v zkkPy0NBwPAbfy4YLMQo{>MHfF8rZ#Z6CA3{ijBwSQmt!I%#w9VvKHj^O60)_<(mP% zCnRSgc&Ue6>KScEoL@1+REyIe_B~=;^lisvHQxBDK1f}=b+(%2!5wkd?nUF(?C=;p zrjz-u@vRj9Zbn~=*A^Ha$=l)-fB3KlPF*b{Nw!LcJL67!%=*T&o$9N&F4Iz^axw3Zf!`qWj*ZzQmx5hFhzm+m8Fxk`G!k&v4wi8uV zn06Z|x6!C*MsSq`^i5N2A$x91z|c&+&%vKr8eMw-A}^uG*k0`M$c_=<}Dx#y5&RK2b_dMr}<#Mx~JO$*{F|pl!^+WQfMA5tZoL zhVk{*c!>gdg=s~1W&NFo7md(?$>$FJjc)k1QJcAMk$0xYUZ73Orn?bPw-tP7*jh&R zXm*44hU?_MTp3%uz4hsJqGgqTtWac#)EKE|h0&M)_Ezoe;a#244IlRpR7uYsSt zRnqmt^wQlm&7CFZpFH{Is%bkyZx~=5ukTP=c!(>A$C@G+x2p=HAS$>N9 zsoZ*LbqorK>$Kq}AjcFb_t&PWAaXdi%`6L@^Zu3&tlmS@(~w3lg+OJLKg z8SC@HHTGgk%d27AzGOW3<@r(?Ca;?xv;r%+insTO&pIrN0utGr(D(3pi(u%(0pEQ1 z?W46U?!#ey8Rx?q~#!AU9eOa5i<@VKY z(=tVzis&H9-J6f2mv7pH0tOps5m99!YQNAB|L#C$NMAB`&KR&oIJ-!H3R7%4m``C)Y)WC z{&FyeOldPNjtNO>dy3`H$zK+8eW5Jh?%>E@RwyNifZlT7%~xSsg%n3F(@ebBc^@H( z!d<3NuHUCpl|PJ2bM*40+0+=|t(R$!(d8oEIU0L0uu^2R?8jJiWOtIV({L)t%ath4 z>HeC;ha9XvlebfUGoHd{RSF)+>d&1HqZ_9?4e%QYAnP(%pW97r%-ZESk~YtD#TAMs4QiOaWLeO9Je6teCwf^n%2`;Is^1gL8$XSvQ=slSI@?s9naTh7 z$=AIF3RU;H%BA_SjHQ&yc(;?Q!3vVMC2`ltkImD1`^z=**#J`X19FO%*6dM(SAB$4h~N5yo0-W8Fcw+(&~S zWHdmZ2rc~-0$cf342Y11+(L;Zpa zHxwFP7iXI|4U|-d*5%BiI5){hL9rV+E7h6zRbI=2o65_s4bs-iu_(my^6XbmJl>)e z{=-!7no0@0sWGkXZh5H4_627e=aF_k)%x7B*7YtXl!N3~^Q7uA?)VU8|AvW8>Oub- zn>P>LHw!`nw()kxxYlUU%t$Pq@vwGH0meq3q;yrL=1h84O4;B};K!fwRH~172um44 zyvFG0d%NF@Ki1obV;$b}@R1XElyNjCEaK88;#a1vZXQ>D6m9Qyz)Y!lo5P$)A#%@8 zLZ#IQkt(!b#YjBUHE??i>AknM2P`!><@Dau2?PPo=v~gg+>Zzjwz3?}Ivywl& z17E(u?XH&M1E?zze7gU4=zNgcZV6qKhgS0Y z1)5VRtNF{FQWk2k>u`B#I5BMoA?@qhlw*j;CQQ;QjA1ycVE3Fi-sz7r3xb^8xgGbi zLkevI!!K}NIoKWcc~T+kjv;wQ>C86x9Mm-8iu-pv2rHydhD%$(BE-kcKP^Z_kyKn) zPV#VA97M8%V1G?!U5F|YuwNm_sX8>ae#i^r-)g(7(;l-6f2gSjf2R|vEMWlaW{?AJ zj#D2wncE5eId6OP+I}<+R=DAgKCE_FnuE5r}*H#^p5{h5)l{ULuZYfaPnZUM3FF$5H!#}#u6XXw+-KeF???i>IS6t$Fx zo+E|m#7;tpzqbR&j@4;-zP8jMf?jOwC~g4xd-X{Tc#s!tt-A1mPE2cO85cv>@wS*< zH!{8gAMNI3?trbcw(=EA+xH>rEAyGFLINAA=PLcOQ_GHl8rDM55;L$Jv)e&2dtr%GdxjT`4W)yloE+i0Nl(<2p&B!te86&{tRyGTzbC)@|>fc(^FjQ_~q z(BsgiZyjl}0*|l$NDi}KdH-(UMy%ki;T*g*=Ucwxhp6YcJ0}LEcPun${eO^uYq)K7 z!0Ihvt5SFHbja?59M-F|J1QKR#Ng4p>>RKg9CEW7#EXUasV~H96{@O{@3^;Vwwr6S z8RQ}gy|Ate>j~2bha6U%Byp4-qObW|@j6Oxt8ph1aw4>`Hxg_fslf|Q>C#Z%91XJH zm7rjPuj*BwdH4!?!+0UNJ;=ujNxk9DF=5T`u9PxT5l+iau|2*Sp#eHSM@A%|rL33A238m;&^5~#NT zq=H~5*|ygjwk@uCqos@bDF4-`E71I%Ye%+5FvvvSy6zSVUhZY&ze1>VBOI7v^d9t) zaJk~ZEAT90)btI|h@j)k27*us&A6$qRp@y1?3KRyv!%(fb^#@ux=++TC>Gs3CQJLO z!9zoZO@Xu>SINP67|MY5;mu@_}>rA$w-CI;ugv8-jTNn^FnSno;AIm1gc^<(9au=++L6BLlzn`NcN zDSv>Ay9JtfWD;~$wTK5K%WcM+9{-iwxA=`dcwSnp17}pWDM7TVlw{7lHEW6r(ntt$ zro^44gLd$pe1!)qddT)FEix<$eh+6ht>buf6gR#Wx!>6|kQPMn;bS|J-JLjXL^W2J zC;QoXxo(cVMO8-KO3l0m~%3vVDe=RTMLG0oLxncf#b#5hgn^q?h^ZQk7z<`F( zY^J=wYe_EuX3pslyj((KysAW~gX{a*=2%fwd6KLZlKG|Mb}@twb_8(61_JYMQo{lr z>y6SI(|1Z5xtvIVlbY`t%qu_VYdON5$IcY#wK$ZE^ZKAmKT50CFZ?byxgLooUn@n; z-AwnLmTXlqo@59mtfJv+5OBs0egc9|3RMct`*)u)7%Ngc$c(5CPuLq}32Dy+9>6I( za@o$+!@Z_f>)gdvT-{t&-pmFkNvGG0D$_|id3E2*9OSV);OO){aIru2NgLhVPKOrM zE&eUV>r)|+PUpkor}}^5SL%tRrJi{5#u~p@Zi1JiKhab8i(&A9HH>_oRv_C4S4vfR zF_T5XSGbmz7N8=RLQPtv+|Om(sH~v>!-0@-9>*K`WGVpxxg?YPHrxU`lu2{V>n#T0 z3_ekFAK<%11#!Mjm(k^<57lzhr_(hiKYtKcd24vDL|yT=l;HeDSs9G@e2c>X!XN+U zL>cqcx7Br&J(lk6=!@fEIMhir#GlcMXYkNb`HF(1D*i~&V|Dl`lF>>3QPk#@%{|xz z;)b}kTn9hnd0%JuEb7p3Iq&S;@#s3StEHe(C_#LWaz^{GpVIsWkJD$58urU@_7%{v zhr?~!)v=T}n8Vl{qCv4~!zuA#Hb5_$@?N%B5T>^ZC&xk4?B3d?k&Bv#@CUygutxC|1x{6kV#@LL$;NuX`X+hg6T~Y*XJ&B=2{^d=Fn=v-%{MnsB>`+A| zeZr~FKF^PUh3o#?ri8(`bYtL77d}j=Acw|yl6>2BaF2GaT zKUu|Vcie44HE=%&WU8SVE~+Pty5J+b>izQKeE!q~srHyj+O4*T zw9^%P3@_3cbIs0lG}sCm9jSy}PDWJVbJObI&!ftxgS9Hsly?quo{?Zk63eW-Uoomp znOT@{CxkQ~yV`Z|BV@EliWsjlbOKQHjbj0)2aJr2jZPR)WpsC+W^-}xz;|txOD}ii z@K&^PG5XWS7K%(8xWtO#_v)w^9%#$0`@EWU=NsRWZX!NzbT&nkfjI1G%j6~l(_l90 z`PEkPU0k=q_>%5$JTwk-IL3tbaNIJKNVP?WVdjt7P)wf5=ppbP$2tM1;t}7LY!snJ<+-xi`Lso&|Rz}}m z41`=T@*bAy4Vu!T~t%Kg7eZ4+`GtFMKJLWyW-wxsC-A; z&`wbFUXkVK(mg^6->}1wGcr9#Co(l{LXF^KYu?Z9xNtOhY_}V8YBVE`QaTy@sipj> zf$@2=T0_|?3gpCi^1=c$IToqMnGX`*;%oVG$Js1LTctefagSDw{8W8kv%C`Fs&0FF zeW@^i!v`f3%Q3eowYU8b93Ad1Tu$%a{b5YCkul&)Ww?eUfx*b(2@>cD%~!PAk-|%|p?@BA@Gb-h8(Zx6vTFh0|^C zYt=P+rJkcV4%aKei+cq+2=ZA!yj{|--XuFCriWy4dI@2yCT%ZhC{y8nHp*SpXR#p4 zQRtb#pfzAVqd#STB8P(|$tkX!oZ?cmUD&Sz>6`rLRGygl(9ofGI!jP&FV4wc94odR zx4}5G`8Hja&0G5W*VDoFZ?G>S&QkHtVQAiEu=F*@s{OCx7xE$y@?Wu_qwaHiDwtQa zy}V-E@9n${dkV~l%cB>5FE|#U!|s~E<_no%y`b}w&lpM1ZP$o9DODt-@6irs6I}%g z>*q^rQDCDW7&c*5NCa2CcnZ+@6{mGE7KF$c(Bc{LBEPgw8Mj3;nz74ThP{ zCb75V^JV4|f+a_Ts323I3a{W35+Bm$4msoORrl`Dq^zM8{hT3kR43xqJbJ%l3bBxk z_`2=%X?g~h;W(7D3B|a(AxiC3Nr6ArWBgfwtGT*4Bir7WuD$s0=PwF z4!n$-7x;#&K=)iOv^W<`D&?ocKM6W+Re7A>>HAx zihjRF;BuS+?u!}xfB5(}rvx0hl;G{t3wMo%Q%7E9=JvJjX*BkVgn*FE@RxIx<@?tA z1^(X9Z*7b+`7B2m_lwl_)~My3bmb1E=T6vs`Up~o;f6lwbi*ogU?NeUscWzkz{RY2 z@CuRCsdu8qAQUS8W23hSC{2&c#K~3{V%nX*K5>(u8|GlAAQvoZB%uN#s1MEj4kFD~ z2LMhCD@h&hX)4PqB#qxU0|E|lL0fc9W3zit0yE8cuPAe$YAq+gFZ`2icVzF4q=u<# z+&31!0FdoFU*Rq~nEy=jhc@Iu%yT;E6FBfNdr3{|$e?*-Yz!tQIilY5oa@45NGzoc ztyWujYf|rJ(hsn##G2(7FwfDrw{&v5vfvd$aG_@z-K;i38tWY(D6*%J5}W zz#>j_CjE&`0aGubS)bMiC&r;DjT(-jwADAg=e*biJ-}Qp%#Ezy9-Epco^tZ4&lY$D zl`~#BO==0i#{91cV6AM8p6>LiVt#!J3!!_-U?>NE_LkS>#Q_E<;oPJO`;{PW<$$yQ z4+N0;7XdtLx$}-(ZoqB=C3>()onp<9UAVQ6X3l7rj5o{1C!qk0Rn4pJ7I)XkzRGRa z$5T@W^MM_FZ;PzWBLehm{SwMu(WfhfnfDI8O+P1Yj4!5q=aMf`00>^qgTb!3&-4^1 zOs6e`w<5cFe1@gzs0YQKwE@Mrp7wP?4}a&#kFX7YhJYxf@a1R)zH12STgr;lV}WVW;RH;2Z(%6d&xV{PgGZDyxm8f3~{Mc-|CYtwYuxPoh)zMBTos&A|F zRz$}ADQybOuKzL9Qj#a(KF0q!uu7u=1}s6V>g{P!An-n$2Bo-C;n)?kg9}&OUo}C; zK_95)2~|u4gvs^z^8|rJ=O$!K(GWYw1eCU&rpaMf{%1G?;TgwkwUVA;R6$=`JGkDy z<>66W)f2AH&L;jo)&8xGcW%q|upOdNpimkisMsp7-tvz(OgBfCXE4hyL?%S!HHxyh zWsD`A&X4c@BD5f0kHdbI`Klzex!)MuHPEH}tkz3H8GR3H@L_S(xrfWHV@l+|V*=U* zM=sR+7v`on2ht3dF282-Tc#X*N+Jflst+Ds`7c=T>nLT;aQA~pPqeeaMFL`i=6 zqWak)AwuG+=}j8?v_)cmfzJEb>zftc6ia zsNWq+79f}RWeAYTFccaNa1fnMSIDQX=<82D1*_o${pST-Cd3)o8ex#Dop+~h{1M6TR84IiUvQ--x)%#MCd3-2`l!3T^i{|`RkTW8ihRUm|3 zj<^C3U|hS5QJ*uW(9_XktI=d7;BdGN#M~DTiHp&P7RA}A&f=yWG|lSbv@((*|qB< zq7!DWowTZT6PFFF`jLb?3CE!YxvvSkJ=67g)!5pjM z&<98vgzTs;M9H`7)UQv;^;dZ;`*RS8#p4k+x5gW{ zv6u;(9k`)0>eVo0xH&rh@M>}8?gSdzU#5aXP2J%2)g}r0t}sflhv?OPLBiT;!#`g* zzk7CC0WYQLFVgUD&L9}Fb>{G?3McHDW|G#AnetpljP*J?!D;=fsc3Uu< z-fy0BXHf5Kzoj6=6!U;5>O|KwI9pL>@qJRnmV;_f7h;qL2->zZ2nwZ6lLx{ zeknVpRvu|s<7zbWp27fO=5Kl!_PrsWnuK&F{h6*CxD#*pgZn?ohl}I?8!+j-VaXrE zOIQ6+^+>hov)*4Bz)p^FV+%#Yt<^01ou+u8MPMDt0Ine)&JNkEqd_W1-Y=65K6J%} zgvqB8)H79H+Aft8!)dHSn1L4)DK(hd&hyh06SQxOUb;nTCdsq7JY=IY3#Pgs zuPr#}vGXbXCNGZ+uBZJ&A7A~{wH(l*5oxfDT~|wr$8RLZZ1!^mClm3WKI^oApZm}g z-sxMz8I|=hb@X8Kp;>6h@7;VyOiBQDH7wV3UQ2n*ZKVJCwg7S>X*bmkdP8g>AyYK7 zakJppofEtLqIF&+-`#`J@;AoamCkv=DX{Lmf!RDVGAc!vH{^sxD0`hg8IGvW5`sRJ z3(!=6p>^u=VArx{H_JsgzmKo|l7-x}FgC{(YQN^L_J^HjY6viHQVxA^(3}nJL5hCb zk|&KX$?I&s9Lmj_bgtg7&mrvyc>}!%U?tW7X{NcknT?TTZGK&cK8i%VVf`MNWkLff54d8a=3#-kYf0v*^X6cB z%{UBxPULhX;7s5pvy2J_Gel5#$=y5}S5$?jBE&$JlOFYK@2mcU)Hp%zlVeq0@WN}# z9KmpP&Xdk}u1yB<9_#d`TFGaP8nYas`6xuTknzZXG0Tdd_)CavTcpb( zIEbi;nP)0~m2!yqjpDX36xxz=_SwAMLi(n<>d9llj~mg|7fs-OC``>yZoUEc^Xp*) zFaSF+x`}%MvwoPvEI~iXtDp({u$^CVq!?6$Rv1)d(?^-iM8BK4~6*ZWmVK`4m^NkusK|@H0Ur6XLqAwmlOQo|#lIVp{q; zF+pfTjNGtjCpRokc2;He#7&h`N@uEt_ zD_G(1OER7*V+Or2VU_vBE_OZfD#@w8FS1xbJ%5<89(-r73#u#~wr{i0!fw-2 z-Yvz5MbSK+qZT=QqT>g;ovzk%m_9U?Q{OdlL@&vDSY;CD+tdU5B(P*O1MN`QP-$RT z^!@HBpPTlJ&~sWzv_a!lmZaEl4t1D;72d`#G}e7q2JQS1;Q<-%HLA^I>7}4{z6+dC z?2ut%$5_tn3-hWA^;<3@DT-{~M8K^~H$wjYrFWtR6;^k02mFOfX881wjJO?OEkg05 z*7q)#aN&M;iBFr}_{n4brK>oeSN(6gijFStS7w?AWsBC~0OmLTt3il~0Fd*`epQES zQ&W@~)FL9$umMSe=@2W}iS0FUaSrK8d3(hmVB&tHI?vVp{E8qhLOxc}T$Rqx_SkmQ zCoq>6H>@nD?5%!c>NF_Bx*%nWZ!Sb-DgjJmkQS_(^c@NL5 zOB&4AtowmP#|%{a_{Ys79F>%;(QEr=dY&SlIAeHJ?wIk-oyjBke~>>9KGMYhk7f2L-}=bqe|l? z#1sPB!U5cRq-NZYW?f$Giq7HrY8Cgqk+|%oez*UWKKhTqPY{X~h_+0#1) zk?Z4Bjd8-%z*^(io4h-L0SK>O6Y4<$2)^3%(3-ACoI8PQd_Z}1hZw_s2r%uvWTyRF zi-Ll?5y$IG77`Y7ixkExj;`3iHM6z(EYgD#WzlJEmQK; z%9I9+KTpPe6UGIKR!H$e>{@bS`mm8aWS7vB&@|cKh-HVrePRJeIz0kYgo{*LpL7ub5}>I>0t@ z{F80!NjO-2V`nH`T43KssK>FX`{>i11}vOT*LlM2phfu}y#c3@dCyNzadXtOOsd8K z;~JC^pZ%U4x*dWN&HZIA`fp|=WcjvSqkh}*K|Lv(Z|m9$6};HuZwS1hEv!1jsuT9=R#0Xa0=d|z6!<<=A(&P7yUlF@BpGyBnc{h*ER@l0pojM z8P0v2DHy#GESrZalNcoHLSc|Y#J9Q4lZJx{l z1n5qcqJcM1u&@{)p=w)QB1|dkaJRJ3`TY3C;Sf3E{Lvyx6;gg&Z|3)~_V}>kk=8@w zb|!HqBt{jUsM*5i;T19FSmk*9k+B}33Ku7kD0=^%NLjwE?wFnJKc7Q-M9;Laol!Y-kRsJkPy#Kl@`dYx-z`L0MSp{KO<$!C7 zYQN0V#tzB!-or;#6kzQ3i_PphBN(P^$P`Cvj*pzr28UD7nK84fNsFNJ^wQN*nXIJ<3ETy&gHJrb2DN)&1Mfv z94W_D9EWmiC!h7h-mktZp46a4AMU+t(>jl`PYGq>5U0dx!NpdStt_k~%T5>)%x?)5 z3GFhHTh#p2K>6+Y%@g8EhdfRTZWS3w7^U7JWS}}?KFqK#5t8pVYN*ApNDU~ZeNeT= zMq4S;)Y`rGE@G<4#^#1&5vaqF+}nPMqOkccwk@n+@o0AH^U3vJ1;>uWUaXcCH_H~b zfBWl)j+e>7?;{jl$lb8zpVkBC;jB~SX4tp-f8sx5MF9Vq7cVb|%s1q-N7zQ_&}}}o zGD}Mtm?aL+F-V$Fv24(kxv7R!RW$uuu#)CR{w?x_%bQXyg2A7wxm7V*InZgV@yhaxi8sp8tD9nU z+`*^0>HqNc=HXEG|NFlsRF{N(CRAU=kDoIRHWS3oxo$N!Bgov1IgODU!_H_tj z-}fOi_B~@T##rWi>Av6h`~G}>-{1F`|LSlY9l7Rpov-uxIM3(ZASsL1cTNjwM1TmX z=?Zd}g$YMhIs6F{5O0|GyuL4lton#7tsnlSyP0byXlh6{R`6W-Tmo<3rP{c`$LBVt zYs#4x0m%!P5?kE*MJf*$nXMF0QF^xX9A#&lG7$HrC!nbu1cOX8J5m5QP!lr$FL~Hk zs`_=W<$ubVr-l*Q!hbkclCa{ScidmELN9k7*M>$cJ;!UCd@g4JP?R53yuZ0T;d4}jI;1lnltA6fpucn!GM z8;j7&p?t~FupVnT29;B;1=l^2*ncOP*Q;V7#pi?m1Zizw{IveMW4}w&54X%f(Suz9 z`G3nEtq2=%ZjJWl$>U+L3=={6Zz7!t2_7GAuy~#$F7THoX=W4Ge4a{B6N?%T{+Z1k z{UaM|gB{OL-EDXkka1$iEx4i?ULCjV#&^%b3a9snJ`~DtT2gDHioot!3^Iq&UFFC} z_Hn_r)hBMVYjZrYyr^{brt9n*8!e=F@9tAOG?>B9^#Uly0`M|mGaP#KJfOArZ+Un_>7BP}jN*iOimKj6QC&~SHR&DqZS_42^sD2h{V_IE!{Q=bK+ zE4f{k51D8S9p?Fj5UQ45q0;4>92oG)`AEk5d%0yin5Z1$c)=jsv2JZHj(Tq*Nz?kZ zHKaV>Ns``kI=mtfCl$RNYTTW3F)fwivkwn|_BH}LcFovRqiEv7|46{n`nlb732IZe zKw{|m^KO4Y-O*jf)MHRr0?aL|STZ`$Bg;|f!0N3<`8m*Vj~@B#_=I5P?(0u2VJf=d zTJ)tlh}z+C;)x)~H$elwRYo&AbJ_O%{71W7Da;&n_jlHJ%csxgz@8JSAy?(~MTv6z zBbnAbbN!^KQ)xtIL-cFKow$MmOEn|Ny5+>==3V`<^rDQi8E#I?v=ivgkTw;C3QRf= zbWx*|e|^6@Xtq^0-1d&cY)+5o&fsVOuGyLYHD{|K<-=X{j>vjrT+h~32MiFNQ1(Cu z@2%Ypd&P^4!#8dQr?^sO=!OgVEH%kUxY)CvlU%ZHL<+gu-wqgbajv8bqB++q|{=KK@Zn7qhD+&FxH!kQtuua;;W-+1tcb#OwdRVdARDYgGKvwlgIu zr*+4H+D!A~shfZj4A=%4X@Bix&A;#zm!{Q|>$40vcpqr~tpqdwD8Y|S;8)1bAVx06 z*fh0$O`s%a!r zuGmtWiVU!f1qK*;&>07Z4&z(4xeEBOG-`BUE`+#gwu;rkPOpEaI7m$nwZ;Z`YaW>F zxQa)&SD+vz{`58}kk**#s?bP68@@JEJgPk4zPvY)+nCo;CxcqFSuo(@5F??_yF8B( zq$pPJQ-4lUwzND8S<9z2WzuBYMJ#Ncu=dA@@Xy$r$!}5Bc5|8YnolC$~C{@~B6=1&(R&;bCg;zs9 zRX;1n|7f%aeZY(Utm^K)d~@qF2n-!t3}Si@wa5*1`i6eSI63r2T>~reeE>J8oI$!% zIl~AJ5C5ikFmCI}devX%Qu9M0J<@i>k*cN~i3l|jxVdJ_H~HEERDWKMh0JD83VILy zR;+z{)VsZwIOH6QMb_mF{8p%6CCfN3MfC0jw6`YxPU$x3M_4qeOV(%QrjATdXY-eS>1aMP{*eKqK<7p1IFJ& zv2Ssb6CA9+BYXMNZ$AG3&Q_ne&e*R$Pyh%u)Vq8^g@5JA6FyncbgC&R4 zR<)CU^lp%IGS?Sq>5eb18_Kl6Ugb;3$8t6fv!jFS;~E&XhHzlm#5t-%nHTKcy2e=U zZ6lbOa&w7oX=(iT_#^CC(7@2n_^H=lOx81+N)Vn5T*J@2>u31wRL$T6rFSPT%n2&% zN1hLi$mxlV`snx7JGn5jq+6fRyttiRGbNUGhI2kvf~B|WWVbOb=V;a5=-^AHPGJg9 z68Hq2nSQ=#>9J09M2-Y57FircMj4JOvu$YY$$gWPhbjGcLi(@)$SdLImA_nkQZ-hZ zQnqz|>fo~RNJ~$w6PXjZzyils%i!VTH_EU0IG1eGN0PhIuUfj^c}V#8nJo3S50uBr zgjxC(%!v4mU6)9YsFKDvPQ<$Ikn#_7fWg^YQ*>D5I{1yASz6!XX>jRi$kK-!-;NxU zJLM)ql%!qEIG4Kjvg8oqP~U;ySAXY`ZxQ9{TE}v#>W#y+DHA+%?ks$AUElca%NNa^ znY_U|5K_pc9A!+$g-lobXfJLB-^?`$S_jKots~w-(=uPNElc6k_ z^4vzPiRMIiXeapQI~V;^O;GU{zfObT=)2dREU|45>6deiYFVJ23Rf5=^k(j`UtyNp z2}f8!(1nh-9iL@Sj3|{GPL$qABYfcf6A4@4#5vpLl6Gq^yPr4xOA~qN*3X-?Y?yR% zIZTKw5#EY!nno_!vgo|AoldFu-7_AkfME6}tq&hhEf)D75D%;!>z?_Rt~E96bGAu! z@LYwNPKS4Djt$16zC`dyyMukVs13Ulb$p0_N2a2K6382r&Kce(YyO~yz)jMp1`j^f z^3xj^&2?S>R)hQu2c3Id`5%Hck0lXeK#B`0N_$OqQh0HuiAIQ*k7S(MdAGwd`kgqt zMf%OT^vB_XS8vW8yr;4f#Q-$5j*W!G5}D(hCC_cE>0#yrHbh`w$US3~rM7nU=-WmH z7$S2u$JKEeyEePz-i;<1ZNc&@n#Aen>bw|(@QQp}y$woy<-%zQT12y>qV^*<@EF3Z z1QyMDk3PlKeK+nS_%IHa<8Kpu$0kWCz27{MaU}YMEmkf%-n8t}DAu+ug$QCC7!Oc+ zdngS9E))#5JNHSMO|a7KuAko4(%MU!RbHB%RVqm=3QqZU$Cy-kl7tS-sL!1F7og2) zcER5?##5SRI6loqTtlKI2ZCRgNz>{2a4@ z^}}J+eYsV^FLtI~1+*z+^XbVqVLht;x{3n39y?J10bfP5zVhyo<3U+xQ0MozUoO*7 znL2RuC&=xiKlt0<-e=&kw!&ptr^`sjp|S7p`VPz~df2VGyDFiTx_9QQJ=|i>E5J;B zeV))Gz0p)Aih>6TJvYWYHB6P%i&Omr>{#n7Ap#z==Q?`5W(Y6o{K_*7Ud}Iq*SFo0 zk9-3@Zg^vyrpv4AE)0c=Oku(nkEl3bbY~yyM~C0*{{qO=qUn z(zwO($3skhed|zYB1A?SpZ?EGL^Hn5bVBaT*4MNBf0w=1SZOeR+-{M<*ti z&ifTQadV6Lpv{hvZ}_N><0vjIV1PxwIRbJR`}>o5@`?iWKo~K&If+#I4Uqo6Pf+Lk^j&q!7HIVRZB>LsLV!&5j!hb78Fi z@qnSHU)M(8n^?8;i{LfCCFa%j63Q@T80kQknO0!nk=$Y!a_Wg#qxBa9U+HN~a=6w8 zU~7Tv0smWQnwe>q*CPld98izfn%xVfMUFtG^2``!N3W>eaKRCjkUV6>|`S zA897{J0E0oF7HOpA7srt=J*Q>a(i~~kxV-kV>H7Zc1aF?0f-o59JheWvPy)<#BHn6 zGzL3%HBVf~Y@D;f!WqX2S;)cYj7+;~j@30xXJuq2gRZu5jfxE0n2;CC^gs~#k_=Bz z-H8Tvh}GAznb?qedwuyBHlS_%p4ab29YUQ6{i~@Ae#XFhPytvpc$dkH7 zgpmVsI_9p1fjtn37V;SwZjvAtx4)rjd*%4JC+dxdpg-8$>1XUzQ$|LK-nRNf$Eg>o zwQT(0ug$&G$)_bu?mMN^PC)wg_w$r7Y=RyZR66taW)#PZgDAI^W%U|-S$_mGQW`eN zI{Qu%ldRiWxnLDL)sb_U5M~;kK-5uQuK9@o0)qEmawjG?SKGk5i8_=KkLkj_jd5ra zSwj=$zWveQXPL6dAjT{i$=4psj(xo@-*sOpW8UAe61zy?>FAbLB4$plFunZDm zG2{94)O5ffeQJ0ZiWU%GzdvY07`mloji>7=`9RaP!^kK7o!ftbiw_|2)WTfj=zo`Z zNmtKDNS%623zfZ9K>A$AZh`*fS9`U(s<^Uhjq{?CWoYzwI=&XEQpx|D{dh3_KUlfy z1&;sPkH-P^i@KB@<${+qYs1C|I+Sa&*9MOLMb0huNg z-Ox)q5WLT--L-|_6W{wEF}H$`$6!*n2lI4mEcFNnC;{Cyb3#$GoK^h`tipF}mnsUz zemR2ixn`?y{M~+vX^5u2StVPD^r`URjxWsE+sn(06k`=D9*p$8`E14#IL^S4wmbah z+}hQ0-pul}w!E}za{rs_%i$GX^US2{(${5_1~~mTBgf>Zfjj{%Dw$~;Ev#tv(y=HH z_Pkf3HwFn>`Y8X%acz6M_}5^VZ~%)1)D%;Hx`02Un#g%Y0%U;9Blg>V_uqe=QaupV z*5rQp^Zm`OYzdf{zrc?tB$YHQ=}VoK>S%S;ftJ-aZI+c0Mr#fGWOQ?R+_lRWV((5K z;Dye!UIc)SmT9?>zAlcKJ)C#Q?t_)&-Oq|w{mC=w$7Uqa^6&iIVaIbIKUeGpUHdncdfP>8cNER_9h`X)7h$(T-VrSHaU-Ut~<4oH!Z2}!dWug=No-S_9j^7X#w zqTfvwp`G9;@}6luA)#8)*he5DCc<3&PMo*^UE2)f!z889vPu~EF=oVhBBB0-L8M7c zIIM@>gZ=4&d-!uR!#&542}Blmbgd(IMClN%3>@!AjEg=T8vRl<-|uAK0gzLF1ZR8J zJoW?N#pq9tZaN&eS4WqbxgUObzATQ!eOi^#w+{;ObSX*r1x1o1C+PTQ% z{sR$zgR83e_F0Y|2dCcW{tM{0w(|9u8Tk;?8PQ~~j0z4ajCSfsuN~Huo`;`+<%YM? zA-yG&kOgiI)op?|Y@6ghD+>HKyhpAwyInxMOkvwdw}7jbSP@TS-JNwy7l)B76uLzg z@@x=P8u-=!C+s7je8e>Lv#64kzY`N0F0a2pTB-ahst&mpRLZNd4rN*cL7GjE-OK(;J0O$beEwiWIImhMUotk8OIOz=Vy-FECVF8}$m2$)wp0 zwzsynoaU;}Gm0u3#(t}^3q>RgOx(79-N)Jrf^CaBrKg8<(teq`?BB!zqcJdc_>gk# zhelJy`Rd}Y?rNiI0amyk=@__7ICl_y72iC6$kdlYy7pqqxG6%tM^{< z{A+fa#%(vM@|(>a#k)uiK7kHb0~$)8-{CWT;utjjU4@xGgG;1rZmVLo?`)pIeSLHY zk*=M)n9ENjm!TM#3J}>JPw?Und}%#cOI&L-T5U=?(jwKQzWS2HpI z!AW6O23EALB7hD?{-on(L3xTIeh&P=E8u zZ9t9TO)Ov%^tfG#Q$rylNcN$`zc@W0I0XFu>#_o5>$;gL+uR-2DsY-cTb-}$tZ6T^ zblpx4ZRd9MmOzu;9+yNt#5jPa@h>0aRgKF8w52#1Vm?LvO4G3+UKO1afeRTmyteD%Lf$vIONfdFUe$V*^!|m5jGlFQC6`^!W?BCCa6a$ zV#&@IcATy8$$^gF1T zff-rWqfeQ+F$%O;rAkm|0ZWqwI2eGu1#g5>iMYf~zKNBS*=8Is)WfG~ssB%QR#PVf0C(S{>u@|sHfjhK4gk0&1UP68UI z@YAAy>=i9psa`YR(z(@3_WF&ZYi2DYF}$3We4u9HuK?d|DjkFqd@4u_k!vPA>(9PR9Zim{%(GB1|D?XBI2&HbV%cCtV<@MWV;K z<7zHc$WhQ}Uq*FX}(B(SgL#kDa`biem z;*k%7FAW5dn&}-t=j)ZW!zDtAu=wp;VOTGwnx*8b)$vyq2~BbV%aMuRtF&Yukb!q( zh16xM$;E}VKpm`<7^dWBjwJmRQuT^ycV^tH9M237!!Sxy62hNIG21yC3<^a7@}x>H z^wh1x3Vy672`hQ)0^f`zMKImf^_0s<^+CsUfPHKM?{9>Mq~Eaz;&8LcEL% z_9a2N&&WtNz)mx=o{Su)TB%iY9LaQ(`QMdg5o8-_ngc`63$*B-!dC#E!BtD~HQ z>e|J8CB`R(UHuity`zLovrf0M49xDg(=4ZRMwe$61lRj7^M+%@E zB-w7c&}Z~+##GjhA(taZfo`EVK$hdJ-ne;WbyG10bF&IcOI&Vfo~|nXAo5xUfUyE> z8}={}mOzWbMt_eClv@wu=);{6d~lPqZBHe~UAv(Zd;oy;_=#9TeqA|m0_?7dz}xjZ zYx2NS73Z-72{Y-=?uW^l6~u+P^hLw3NDps=I=eT{WuOMxPxdcf;qO(YFEOXT`j#=3RQoB8mdU=M_n_(aJyz5Nr4bBMDtYw<1CXdUrGf^Z?X) z;yAGeuBI_N>*>cz!dP=4)(LZLyZ&cNAx(q1OONSR_oK$m#GgT3lka<7^VWLouZZE; z)Ay2ZFJ za0h6;x}ngDeBSNSPI6mDnju3mv*I4cW<4Icd3!a!E7aeTO}H+*of~g))H`n>`m#<+ zQvm?a&;~&A(4LzI$)VYHMIX=UyivGuBE8oCkbKLGO*VI^kz%yDS4OoUggxKzS81Oz zd!V%WE8B&%RQ5w46|iGhRe9+}6R|@Lf59JL;DT~RKsQj&@waUDwetCwJ}L{U zuz)Lvmc{tKUJELgo7ywINgggTG6SKYY`C%?j}!d`wM|p)1aHMXRX;9H+{SQh<;_Jp zh^vn>ZCA==Cv11S=T@fH+FJ*1Z{2xni;N48Fu{sZlck@0b^2S|}#j zbpbdB_Z^1{>Vwd@q))zt4~_Ifus$Vab1l?OHEubO1Dfup3|TE9R$9Dp$McJnsUN4E zJ3<=YHm_p{cnPDj}{qaDD z06zuTVLUBDn^@TDX@D==t~!B39i1$`Klit)cy?c+7|cP7_tVe=A-xSB*=j3WGXOUE z)noBr5j*mHTj@r_=hjz^`PZ>e9$Giuwk}R5m@$eav!{EoL&RX-D)zhMIn(>o)9XP`_y3~+7mmc zxFCDudeBd`&BHA=(JcJjYyz&ivs_}liSlo?r14kUs*l`A4+2O_IwpRwrpzTx1@Z23 zFI`jQO^iETV)>VAu8Knzj?I$D;s+wF#Nzol>GP;^}csNwF2nZX}2ZHDzGG0vgq-AItzuhZiZx9PSR*}-nr2pb{sU6J#?dj zV4jNpY&PN|2ww+WV!(7MilJU$al^-w(t!XGt_3&{Z=l7VDg(pAouT!d2`bnE3kbGW#HI~74U2wIUw%hZ5 z5;!K)irYBJC43}Kl@F!2P8&|W#PuMVl+n+h#{kEKJFwQtf7DWH$mRx}FC)~)TUlo*d7m#wH4@fD*C1ws(Y*_ zwAw6?Tbxw(Kf`^F1~P@r{#7ynO*lT9dZP-vxer$aHS*m`dDZW5%3&b?LU($RFwN@F}ed z#gskel09Gj1D~aKLwMBmfQwPKI@1wBO_0;a<*2J@*u2Zc% zwfZ{zyf6BZ=TnYCbn%|Ub(oq|Hb_2W_8?}KccgZ%gi?EBUTxa>Ti|oJerWjr&=h{b zT_U8lSLXIVB$l~AE*}9Y(caJ!zGylL$^o)&h+yAJC?hlDLp^qO4qoe*>ZM$beyLzfxzAr4%9>MhJ_l`q8Xw```SbgckMi!K?_) z-Yexl`NNzpxd&y?h{JCys=PNQs6kT`5Wch& zIq8_KV7|qaAOwsAa6mZ8^B%fz4L#Ei5tcMBZnch52y9BYc~Qq?D|NHtN8J(8YQeEc zo9H$}4mX`4hLq_gYs?0X#OdEl1*7|?fIIN5_{m)YOX}w?;}bwl!Kg=>vTddeCEfMZ zqxnB1R9~-L*f04>if(PlN-JZMP>DW?&uuZl&(uZ!fTOndtp)CTByD}-1-!;_5FXP0 zoHtdP7P5x;=Juyb_qf~%s4Do#K9LYpo47bLKBs z3Jatf7F}%YN7u3mIgExd}-7Qi1o~_j)s6TE)*grLaq!h{#Dqx@Zx7RTBdMkh$ zTN(K+jS6yw91+d0Oc)8a{kz{c?(Em!oV$co4F5pvZ)?rWThcDA$M1!gDfnq8pi$xP z4`3Ct$ZELHCYP2f0I|RtbQC8FJ(}5wDBvkIVPD^Ml-Tqo=x6umWLMinlM*b9I}BEc zj>m=p2NV z;aGxRmgc;Lj@dVL-V!#?G%lcRB}oK zF<@!5$W(bYt++iy%8T#eIpUt_;SL*8joD-C`#SKEZRelZ`Gc*Ee6o%WJTXwLsQv`L zdw+KW-qc$NmTgV@Yq$rGen$$yXjYd0IeiYeVs$z0dFM0x%%UM}z+W}goDg?WKTDaluo@g@GotQhePat`fz;xpRfSpgGIL$U^t+G@ zS!vu5vcC4CE~0p&ziH&AK@os_EASpg5ElU0n%ZNhGy<7V6|>woVS>-qd8(gsy zH3=-f$gGL#dOCBrTqY+rK`C1V#trYtlvK*eiIzL!3E-|1N-P`0NiO%clrg8Kd_u58 z1FQ{`{IB{f1QE=i$6}Zql)@V3F(I0jcWb{)p%n&rnOuv zod023bzJ44`x<~C{8b+`>ETbB;GbUsDrpj%%S!V$`=_1?N^v5t!zR7_C&(hgmee-g zo~Ps-g_#WwPkzYk`{Lrlo_2C`VC96v?P)*nS23>V!WbHe&L3bO-8+D2cn=<+^$Y#kcn{5&WhTi+WDlX5@e_ zWy{O-i?1!8mD+|v&6pk?zs-~2B6QGI)IrXzRu%_S!Z-y!te~sJcJyV1W5MpcaPu}c zaBT#*Sr3_ezugcQ=7?itL@@s8^_56S_}d?FI4%h>zGSa^cxpcv!t`Wcqc zB(V(NqWs$*K%8In&1ngIx&sL5{T8gGJigK{?tY#B)hWqrdg^37QbHN6KUCcW*Ak+X z3v`}T{;6tHc(Co_uFPrv_}RBz)?xf{9qnJAzFsN@F0s3lfMId-^v%uizS=D9Cd1*o zrr3N57>lMNb}{U0w-6QB&_IGAl9$_*CW!lnw1IDZ`p#0W3_j1c!L@hu{?&y^sfVUB z@2v-#NB<(0%iT}&{dar-{$!@2$@`lkI;FZ3;+%WOrVy_<*RxNo#Q_%v?~Jd(H)L5z zh%G6@=xe}N9ruBG?BvURCVYb}tLl74Ptz|jBc1;;{%eBqwQ~q%+;Qao_ygGU110eA z3YgwAc*06-YBE_J-h<|;i?Y>bsdjMe2wHZ!mlJz$rjUo*%xIA6_eVR)iDFfscC0I0U8Q zV>@gCx_*6D8*bDW&Hy25o3mdF4qm$>7&@*ki`@YJZTVKXnRdUc3t{~qg7@2lA{b*r z)AJ=xI#NLnj;Ah_X?#qD$CCkNOL~8>H8w6GjQzNfKUn!UQziYWiK%N*`zi0i<-?xu za~Ym+0A(mG6BpcgiPBSy9aML~!e`$7 zx!`}wgaW*~!~;bC_l^GTScyCdepLx*w`*bh=Sm+UugrN})v7Tf&}-rmg!Ht;h2(7C z&cM%c0(S4-e$O8x_u6n%zll{)SbcmLToIQe$?<@T;+lTDvk4w3aTb|;e)bKxW3Wx- zz4Z*Sr<(@2y3dbk4m?fa?`Nd_TT5JNt-%4hFCS48U> z#ccG)ukIxL=cg53b<)?s0Nfb~1hMu9`x7AU5;&P`QOLaBs!0*5vKy;=uG|AJ$sIxUUJu znIL*^Bul?k@pLq%_1&VvcI=QwGoDLcT?GwWK>A{CFsSUmzE-O@>K%%?qsN<3>X;`2 zd>>c1K(IWwv2?0+Mwo}Ot>PF!1G&X!MDflwq5==)pW;h1OdKEY(Ea+Hs^=We5*V>p(v)xaPx;Peu~Frd*K74WZm6$c)qes z_=a%6=!RD7hOpH4dHN&IwTTL#`j?!VnbUPHFqM?B_Dd*w%*Pan>EMQ{jsvO!93BIdzMm~aGHnin7 zj}J#$xST2SAw7?!{KraOkI6s6;5UF^ao1}0qJHJwng8^Dv+lu&mq-mb@O@tLF4DHO zs5Rsb=&)4UeOvE0c%m8gq+(NX6twJP=d>=EY22B~EV<=eAN)NTe+6gIS7L@i(0hn` z!HBQ;cqM4R;>h=qfhy`|M)>&Pk*jFI-ttGjpo=9>7W^faAvdRV_`9}rx&XRi!}5qz zQc6~tXX6-Wz?@`1F8L?=0CK=V2|2=}@O=+x`QKw02$LtFrt!VXaSz_7f#wp-<(D#b z&Kn&FUN?}S2(o27fLkCpy-kv=Wcusy*8v|h@i=y!*vv$j?V$p}uSTe_FD3W}L6f7h zf=iZzjy>t)kBN;y+Fi1ip%MaUZB3=-e@TB~qTD9BoYQ?#eI;CSbHpkVXx|&#qK>+i z$mlgQqKEB%@0eAcGb^YX!qrmCbF;UWYiPNN$RA!e+n%z$w z4Mn&YB_|%H-%2b#)g8&=pK~nr6totv6Jw+snyUF`l4+IJ%ZJqbFP^d=qCE)K&Y414)RnU}Hq_ow% zFR$*KFHy=&`$2kL!1H6lPG_w&j%BJtQ&;;dkITpP8x5c2Dtu?1mEsdiCI_E-X>rH_ z_y4&Rpndb7l3?=sT^-)FKRRLd?()SFeQAGx^H_26*0+aNQ;+epXhN6ZwjAF%%YoE+ z``RhpUR+V!6h9p&c+e_m%M*g z&<59A>`T;;*`ayFZ3WFvXP-;<7cMFSjhZRLE&{!<{XHfBUqKWJ}eY~#Vkfx!L0_;_(`}&d! z4;T?r(SI!~VEo1A|7h9-`ONm>$`$u}ynsScI8L{WJ(mv41?t=QRv>e^5?36~Ud%&A z{7mZ6U5KlIx$j;en41MTsl+A(xbPhSi;g@L-g9eAXlZ=3%3UXJOD}d6R#A-heJ5cx z`2qVg8Y61;uY$TR8f3k@?7|{OQ+z4t;pIn0nw?%Vh*U|^aD~^8Uxc`vgOgtzXV51f z`disXA-z77Ft0s@Wn-J?X|pZWA$wsBH>Qwv$%N$ka*O-p?CJV3!*Fx)afd?9^N!Dm796QM&0n&bvl zqH!>k`x1@|s0ccssU+qF;BU@Da^-fv*6+g&Q3T3CFZ^f=)P+bw@UY@A-SW# zxR0wbOrFWSsmJVuL=pZrw4UwPM%n|jgLPA1ZpvJUbG!GWzLjobSAz}x0(FDUyDtqU zT~soGe3uFIy;}Zx=^+xnGe+{e@x8C?VEgyqe;3~vo7iq=P~oF#EJ-6qY`$bs$voLO zEr+r*%f`t>z$|Zqt>#3XQ_4d-s9D1bS+39a2HM*)6CE{K2{Cudn1`Z|x(kbU%m*Sh z6cmxt`zn^)?O)P9bUj@r5s@dH`b8cYBRA#Y?S<|qkOUR?-=72e$bMV9J$Y&_QwjEHb=>xE0A-;9=5e9^HaO@OmAUpSzj$irgKJEXJAK3qi?kLxA2IS0bvE$g zW0tpkA0+Wk;}Qp(`$wBOq4hDB{drme{t4Qg!Y8emy(XRxIRXBqgV=JYS+~#+(kyig zP4DUGN?eF$D+k>tSB*iXGm4(mYPt+}=-Ur1bz?5{uLvsjoa;eHe~;99`8oDb$*|r}-P>_l(G^ z=$Sps3Xfz&`FDT0Pq{r?+Zj_o#{Znyx(O7=`QuCbXUj?*EeAIj$$g-`U0+o`xkD=P z0Zy}H;fFyKfHFKhS>Iiv)qeVClH_^xP13|@$-Hwl1}xvBx*+`HKtMn)LyR$cuUFVq z&YOMhi}>mM4Gf`tZ(FtBTJNfo?R&=z)6}d=jk1mbHb=>ASK@P?nvJ}nY~W8H zi0g{gUN7QMn87bAe zN36o87d3<5)PhcOu&(^1ews|?rRKO`K)FgqOQvChb{oYgdBZJ14s#B zl48YMF4}Ymr!~@!NyS-S-yZYE8Qh40yKWXrfXC7_5$T;%v-5%;STKsYeSegZWx`Xm>?9-Dj4{*GEi= zb@Mxz{kFpP2JX%IQ-!neIojmNFr~I=_bJy{hAt@;J;8b?eo z(D6y-pFb3{L~Y*1uH|_++GrdmAb@@_kho_ogEkXUai`k=&A`kH+un|2cn@0_0hy6U zIBr_~C@16BqR%L9zMdh#XmioJ?$fU?yy^iRp7-0UQSp|1(c^z5Fg%cKyrWfy9XZ(N zC_e^gP?YrwEOO|O0L!;^eh}47$$7Q0YQC)b%WVAM2Gpm><3_K5u90EQ^PKLNY$OEkLuQ}Zn zSW3n_{V>N)a;g)b)<&r+q7jp1Q7S?Ni_dnW5zkjpD?ltTt-bx4Zg+s~Qt* zCOgzBN+HWYWs>ho8?8=wqqia7ZZIVMsYr%{#z1L^32FOm%0Ne>yQ2}Z_$&&{aj6EO z$M++EZsCAx>_vTTZeU%3@ZMhb!jdMKQUm?q zFFGDARN=U-`341QWl>h*?a@5eKkCfF-4Pc+xp5st^_y}*d5o|6 zzDr5Hqv~!3JHh%E!+6i+eQ1(=D^qwf11(>W&q+2iPIax%7t}VIs1MWbGGh#ndXaKF zfK|l*bfw4oSILj>A(dpDzBq>Mg;AP{`<1Q(LeN(xk9UXZQ6?k;d+;w!@7+dxy~cu0?Bj_&!UN|_~~r3 z`GGfNpjejZW{!RPi}||jc|IZ7j$K4wM})k+rr~Y>*x9UL-3;z9X+qG_z;2}C-U1z$ zH$lgY8wRXBr6eF=jyvy;?m?DBY2TyX*-AY-oC%}Sc8F9_=7^>Zx|@UHIdSlafvWek zvbYJDoD&Lf&~A*I**YJjF0}QPCBMkNJBHkt)0{Xp`mxZ6gK=nddpwDAtg8V+HTJNd ztulfWch6D781s7HI-R}P`Z?RT;qq)Oo!#2CC8rec^sJGYx+mo68rC*z)qC7O^SY!w zN7FY2XK7CspP{8gt%x84X!UI#e?w$7mXsda`HbIV@BvPS_tB9d^(r}BR}Z>!T(8*f ze@PE~z082oir*GN9!clSG{^pcIi;f7(q|{7M(3(zgxfSKPy+*LwYNSMUmPWhPT+ym zT_aX37u$i^NCwO3t2J0#&GJy0oA@?o>PHER z=iJcDriXz~*KMEf)dh*rr9FYmia%ShXonO$2qWETY-#%1(<`uj78IUr6x4IjJIa6r z-c0xgk%qM+SL>jbP@0FvNfCV)OXFC>a5*Myd}NZocel6vx@U87E;IUV`BTpH z^EGI}*Y_T8eD@pyZL+@r-S^*4jh>^K*AS6d8d_tNy({O_SM(f$OUM%8=Q*6qyYx_@ z&rY|0A_=G;0ix`Fq)Z(-oFYmEGM- zsCQOy57REM+xT=<;OOJ#Q9d7`m z{?df@cviMkL`7g;_XZ6W-{^GrawkGEZ8-V_K_*z@8Gi>_{a|E66S5D`JbR@h_xa9g zld6Xc1Xj&yhvPxpE>xx)!g(wZ*KM0b&M^gAKnHF-(P~T#p6H}v{K$AYhNfGGF=lD+ zRe<)D%hs&=Hd)cv;_14WbtFD7JvRAhvXt$>&)p2;&k}J29&M*<8tP#*%@rV!=%s@1 zu#CVsY^I>3iHYTkYU?S3y_uDXH)(qrskL)ga}L2@fJ-WSW(~*uIbl>7HwOeC*(pbJ zxqQxtD!r$zJRl^^HN#fH)jm=oP_&2In{7^9yxTjnPO+h{9+cjuFj^L0Zj@9XOcb|Y z>ewPnzr+`*!||t{a7-z+ko+F`De~Psee@j-dJXOQsK)MR5R2IEoUv~`+O->tFEAdM z6Jo9vNxo_2l!+VsraTe$PQ*Pu`n5w~pUEIrzrt1xAjdcn-rOOu!n0sXZG?6|^tPjJ zwqV5q2v{dJySisQyEErkx+dd4p|Td&nicG4;uk$f*4H+`EIjt{*4xW>>g>HRN8R75 zJj*CixSlC>zk<2zv>DR7bM#H0tWNZ^Z@{a3?{SM4aGC1GQoB(V^)V9u+@r?KMiq}r zt(1qJQ$?JEpRH{8$*8!eMd{nEbDEih)gN}}P+?bu$N*~H^e^FcJD*hwwXGC>hOmR>J z3`o&+l*>2wG^y?fr7NZ%>i!?H-aD$Pu50@ZL_wuQ1wjlD6cv#sAiV_TMnt42DxIiw zLg>;%KtxokQX(A$1PeWcPUyXN0z&9rdJ7@>Huv+q?>Xl?WBtt-z}|bUHRrsp--SqC z6ZwE4t3TKOAZi{6Iaq2}&W^C}vsW#;$>I~PAS-vu4s1BBD{B5l;GK2QgT$d15I+ve zRQ+q{71t<_yIbni&AEDIn7^55u(py_#$h9N8yFQ_FudG*#^q{&CDVd@no;ORJXn`idf z!MWR!WzFR6dI((DWt_1z_UVvZX!7vLwew<1leN6xmR}kBUbjz)a|ytEIj78NHVI)2kKv?*0`KfgkLLV~E z+R1QSx&nu69N>oDbHa~z`nwN&H>VrN$k%HszIY)DVRmaXFG=RDB92GcuHbJ3u_vr_ z2fu2%r4TyqjNtK?l^W8uSggTUgX=#??5PlD71RwDE}?Q^2YkTt#+|vz(lU*JEFIobyI$kl zrEbS~sIXg@DrR}aJtML|ytI6I!$~)Iy&V%1s5#7mB0o4C>=*Y9GcCQ|yPp`W ztrlTdvFrF-Lq=y&{O>bVP0^xpvKy+;kvDRT<@ceDYkIOf&QY;vjcq%i^B9JqYywG( z3-AT#acHA5(_nMNT|RtAiujqZUibTMmpz)zlKuP*H`LPL&+^2m41Ft1^6tf*lyA#m z`O}EDI2{}IwSFBUSy)kcb~l;av5=~H*qvI@)6v3TIZUtWHsLjHP;6X721k@=V0 z>%2VrcHZPU~2$Q!Ivyy zU6_WRwiy|l%Psh2lqm*s^0NmqE^D)*G`kB*}NR&8K&y9cTY+B;hVbZXHNFD{T!%ss1P(R z>HHB{O?{klk3Y7f*z1uIpx~LvfP&8_3}j5HPR^dEY4o$Y&jo7AKNhx>zK{c1&~Ra~^R;>+tqCLSV= zRDOxuj1>$qx~+-3Phe_|eOjCyzx_;y5ufc8|LC}%&1q3!TxR;kJRI4P%$^h&FxPzi zXkD%I7o;(7Y&om@`Q)=BRA&X|)vuxE{gd?1sB%Vv2*$BZG=ZjbdUDvcA8RBzO2NER z3ah*Byqy$jV9&3epdp+S>L6d!W`Kqqz)+gum}8?{=MiWQw|l1zh;(}CAfY*iRciy@sT;Q^Ym$M z1@aB|X)Exla7D#qP;c7JFxi|PPNgxGBj&sXIH!w6Z`mV_lm@M<+Dx8%>gC=W+>%a9 zdxM+cE0T(HizRYMSAQj&*};NdM)dcm1NFIn@0#eiFTL)~bzVxSo=OnkiwySc<8%$I zzY0`eBWZljfiwjosigA%@9B2F{G zItr*I#`seAzw{kc3qt50W%N3A_qAjb`ZaV((=ks61^)a*bZL5{(l0emlFyZq_r}6y z)J|lY9pZ}bx$Pcg^yQ=w6G=1c7G2WSD6}&*D?;tyqF9sk)7rda8_S&vOK{l}u2J6B z5;xxnN;`7>0>78N0A!q707z-6EXm<^Yo3&Wh3cJ2@ewo!h36{nrtNPbO~_L7 zJc@z|lsfnxf;|jOC%sG2;=@1=z7z92CfdB{&IRn&alveC6zPkcNTSl$^=X9> zm6Z}18~UEvJEvq#-K(6&DN1cnFek6Q$*Io;rTMih zORv?-3vs6GZ2R{#S{}T&Gd31ZZUFOKx#ZJU8zuJ6n$mEuwnV%(>b(+bku6zPo{V?A zkLvk*$-D<9p=8wOZkBRq{%(eP<=0Hf zep3lxC-dU&Wv}xup@uW`*HZ2}*>edhFp{O1v%Y4s!T5JM z9;@ncTv_|wW_yI^6A%5gSxiaRju=|rC06-qg1y5u`yb%dOU>`}-Ru6ztm~uFY#cAW z9R_yxQfZF&!Mmr{O6G|SsEcvfX6n7xG@+aaK|QG#0qdh2sE3o04n9CvTeRh2MCpH> z!a;qN<@1!HqXuwaJ2Y}G2!{^2>MNWgdwxk=`q3YVELS?z@KNFV$_Rqk6%y~ZlP&zf;aW|m5SA%j)K{$kP~L)Ggfo#e&$ruK zq*8KUPaB4x`^>hxDgKiPyNAa2Q01ELlkYVW#77YJ7QI$|AEMr(4@Pvwj#8Oj-(7RG z9nf6gXQNNwUm)YI z!;Hp&neEgqhD8)tulLRij~t~oCHeG%r6t_mH$hF2E+1C_-j|l#`m1qFs)BlkW<9IK zxU1moS>B#RXPS}Fl73kd+~F&Q17ta>Y73Lwh{xnTq8UE-6C-KV3e2r*OijofveU6~ z8FR|KWHw><;-{9d&E5BSEeTFIc_;~j@${15Ndd61N_yM<`*T-=e{zRJFhTE*DgXY( zm}GZvs8PeXFBQocuXY7*8u{n)BIH&wH9x=@}XG(0j>#Hqbozniq^^ zzc^N(y!*J)@97C@rLqM}pc09n^H{F#;DQwQaH`P6LlEwE6w1c1x60mj%?|NF$s9J? z^ne2hmv0Ps;kKcQXl>8l@g&~q!bO$ov3kb5H6w#$lDXSIqbxgKF%?Vo1&4PSnf6yj zRC2dBED5biX9@OiAs}0pcd{E5nITQ zR()KJ+eyHE%(LceexYH*;evW1ZMzjtXEk2sIrJaM_R$Gs8xT}=>p%mCxrPf8Fx5=j z8t@!m%1)GQ<@$4pdDZ4Sg@4lbZ5kxM!Q@}8iHjO$g45V^w$Kby)Yfr-#&=zk=Smfw znA{5=si#aI84(V5&D|=v9qwW`CrGF4k zr+tuCBc{ekC{4TdhC$3h9?@S^d_%G@N&2Rr&cCh8rJ62>KWogh)Ae=Hmv|wviX#X7 zvOSTnUYR?8TT|aRv`?*7g~)wk`i`F}tGU;Iv&Zhm=XxvAZ@69XpHGOH`v_yj)C=(A zJGn!mg-tq-TLeQyjsx^onY=evySetsc_T$cv9Yt8oz2r>rpaEJsNesnRpMg$@w(;b zkJ#OA5hdZu6#7=Np30?m0}ilHbt+N~foTYgnC0SBTx@u#!R7ptV{8Y(U5yX@L*)-d zTLvgy*=oB01WeuB+WT0&sA|kLsVwU~&*(+@Yy7eG5$lJ>GSK7X(({DrI^Hk?tFk!e z*+jaM>!KpfX-Tj)lS_LPTP8DdY_gLkP2M+8?I;v6)9c`K421$fodH!WewdpuRZFnZ zE$u4f)Z1CuZIJplsrGXJHM2$qvqLC8*$vL08j<)XS>pWR;E2 zbjvl2tGsXHb{?8pZ66l2 zG!$~adAEElktjkp|N9gVKwTT_`V7lWv_blY>3`l7I6s*V_Ch#P*O2f2aCPC`ZmIOG-%+!JKH^)X-x0sXy_76+ zD>;Q9ECYz02fBu-o^3>RARS20Y~q6zBBsCT3iqhpn@G*kSplWZ7flBl5f&$bWXNAS z7#{VPZEt6WefT{ix~t;k?o7L)bfZ$7IgYOn5158Vv=8_H6kBopL^H#Q?OyUHJQs%9 zC2w}oD&DRyPaOLktML&aHPc%@hhF;on;x0X^C_512L@>0dh)Yw$Hx{9e|hQI$%Eg= zp+9t$x2!|%XL3&GW{i)j?G-D{;iYM|>PctUbx%h6JXd~mE!VfIh|nWY4-7W4MITjH zYyy_jWXETuGQk^qyR@SA`5MBtz~*o2nHw)NU~Xys-)}A4Wbl4rVes;!Am>94a~s8H zQ{A0s?|L58vPODXe@KztSg?9(YH@2M;DHo_@9U_`TXZ0v-4PJ9`}HD7Y_I;Zl0{mM znB|Ag1Ay+9aIh$bB7@&qrQ`=Do5x8P(n49Jwj+3K6lHrbE{}p3An1^S5$$BZ*&FYI zMWvS*(OFuVBl_geasgS~1-gR7z+lDGP*MjB1=5?mT)@wB<+R~q!-pI^pU!H_Rd9xt zaL?y{9i;id5CeHOSsI_jud=`({Xr-BI8uie$2iX}ciT;3d4U7}aXb`Eo4~P@^5%k!4oPxUE7Ph1o7& z(Lt&o0XBPef&UfD)s;NI68UuryU&q(FBiN}IeZCu?Jnd;nKa3k&E~V!k;I)focGo$ zrah}lOvhLW%1?amW@J3_P=TMjYIf8;JZDr($!RQ<>+ti2gJmm~9Qegk2Fgww*G*;0^Z1Bx@I80p<;8L4hNa@DcSeHwX~piCjJP|E5!Zqu+S!FY`;|)L;@1W;ltC zX$6r?LY4T}u=wNFGJYK%3#+nGX4wfPu??cQ6D3Hgs=Y^ag;1>2hwY+VTweKE~xPg5d;r17gO4$2^VVUYOvl^L#kY=(`4iR zdlsC7i1u=Hn+(wSn7o|ut^ykXpljF7D3a500X|7|oE%p}y0go51vOtA*!)%`@zvKo z$h^fgAi70rWkW=}i?zIBOjbkm%!TxKz2)6B_>+1Kpb47p_)s&rBDQk6cQBU}*QSMp z4r5Z>oR%5{S$TL|P#Q{eMjw9PT@Cv=6Q>IgehXao?`Ms`W?~$*?f3cQe?YWr@nl=h z@h@(+A`PtDA#Z)hu-w=e9sr=Bqe}T5QM&5_j>a$B7nqwT5~t==Z6XNnic6NLG#5n{ zu$8#lqVEw9!{>DQ(iec%yM^~lRV=jm!~ybL}@ClQb~boY6>)#>pa!Su-~*l zq0%SvM4SO(aCV>av-DT1vFo-61Fg6lye^(HDUIh6m%m@+;sBVFpM$iuj7QQ7^KA*4 zBIhcwxT~gDq&I9Uf`|ef(z(s>9{5+relg)3C1hh zv}Ms^-$TyzlzvXT*==y~`=1NRTOtmjB7dZ%!!jAy93vP-LL~ST+VI|euyfb<(+iuR zOD69p+N)-UW=xy*-dH9@HT1RzZq~A`AFeLlF3IF!txW$P7QnyNnVAle?S2->P<5+3 zK)bT1Ox-Be5>CXspoD+)ujsU8{oebl&_NZ@CXDS_x_mA><%sHiKe6?cbzG{^GgU6{ zE9}{u{JHTqxfs959QOb=cWPE;ZEi%9 z-+e~L-R)zNUB@1q;U`x{1)|D(JUJYE*K3;msC*_6ZC{suodl3f40P1D zS?aJy1h_CJ7SFE)wgL55(rkvJX7sd=dC&SfJw&aqY z#^YA_vm5*cB8Y^5n^Z#CIUi2YF=o~9$0o0ezJVNK0f_F6bwc1LEKSj*teZr|End7G(QHnL>$Y+A{UHzZ4_Zw?-Bb@Ue~_Xxw#1@njn zlcmknwf_cbE5T9BxGIM#ztUh`??R%em+UIfb+hw1pgQ($4z(Zf3N?mJ)Je{<_ycMP z$MeaZtT6ad&mN|6w~pA>9qYFh#_yU~KyE!pE;6nmEF<%1BW;_nxFy!-KUMZ}dd8_9 z*YnE^bWCaOOn&tze{&=YSfdcOQJfYv#jivQRHE`RfWo&ar-4ia5u$n z;pe6e7WrVjG@vJYB-JLkjHyeiQL5<}Ten;HCY!ql`RK}8a$ciK)$h${+o|Vn`Dwfb zA4~B2wh1Z8_T3H<-yPc1|MVG+CWp%3ce^;ukROJS11f+J0r*^o!o14*a1>yY``(pT4u0!_PI|tmMOW3{9ci7CwNuMi8o?nAZe*m(T`J26NT( zE5^xxKJ8`LthaM8f-2Luy!OXH4n1iBV?$z`{`-KnXx< zVYGR_pD&Sbd^eVno%gSxVs?IuuAxP?at+AzL*(g&tBgrxn&CsH*{S!-^$H0Btc+&W zzFyTI-(|tpUN^Ixt3-z|Wrk#Vlbb~`bY})QC5(@UyUsYwS!W3F&fx!>9 z7(0I^J)sqcRYMJ&mWWq}XOk!an)>0TEzok31{PZuL~wk<@j=8_&%Y;;aVP0A@$l8} z23A0C+cTV-Fc69`Jjz2Y{m_|AQs^^=*+O~Mj1Qdr?jtpckCQiN;M)}Q4e+8Y!b@l z8B>@kMw7q~mf1Z%BKIkqUr#RYh{4rt>3W|W`)e+5QyulE+8h9q>o8CxzWxF36T zc{phQ%Iwr;u8`Ey{JBM`xVyfq#yxr-8RiIeipcTjUj-=yY;^5?f zIPpQQi$3a!o|+Pd_4Mjv!{}UU_UIV6++4xuSiFu&l7J@HJmp)ZF3<6K4|20iV|5rg zFX_TR2xt{0bjPS%x+4ZPyAy!^xrY0E%uvFoS({r1dP)*x>TnK*XrWWd8eptC>)2sH z68e+$Qw|_UrUYs-8)JJ_ai-sIkM4>*JKwPkV;_fA6^^XII2=)WXAR&mNP8Pb2gE9_ zK?(A0VD(Lbh~SP@bK;F=2Wn;(+N}&9^?(~U_6eXF5l4WZTnzS`N$z`xhbFL%39G58w z9;mK-H{B92_P18*BvPRH^g}>Cy2ErPY$Zf1aTq+zRxJJUE0v8#2u~a~BFEB^ zUr|fJe;&QPXwj>D*E1*VBr18wre|L;xTmqHrRzghWuyUHw>y%5?xN!naw77A`c2o4 zul-icxYIZZN7;trr1MGfFoCWMUY6?`gO=9@s&+Ly;mU98DyZ#<(;U8fen?`~u}81Y z@_EuRVC?rc0%XF*7~{k5tLznie5Bb~rEQ#jegLgb5t#M4T)WYbhXMw_JW{rRV)XQE z-c$U|D&@S_KFcPOCtE=L*~Dc@aBvqWBq)S6Qtbo%J9WD6vD`6GS zp2jdB5m{+$FW|EGW*nR6^rYm(`dkGTYCb9;!;fAn)?b>3!CG!*b-&yAY96k0KNsrB z4wPh9H3zHj&XqdIR=(@H$|;>~B5A*RD_3jebA;kxXJ)lPtNG_`%)cjNNj-#rO)u#lA3T&rwT-1W0`$ zc#7J~+N?}k;o@qo@+E4S@0O~+qaAB?Ek+4JK@4(A!6(^MKGsywD5iYDfJ)-8?IB_( zMBTX%l!MU8S6ltX`KJ2X-z&qtYoiG`{`QkkwU91uN^zArU)SPC!to(kx6f4fod`tf zoG%C4xjSq8>D-iATbV=RJ@?7Jeo`7=NcdQvFlWbg zhj2fqC-!DE)+r3@qTe{&RF)*!WdFEBD4C^?q0%me-SIF%MP+aWQn6|V>yx;g-n zVoVvNtFi4pRH%jAXm(_bq;+j8;tW|#3n}@rL@; z>JFj)o=tu+mqhJ<+pey6?ppn<#kKT<7?)y^tp}8{G8sJxdl%TBQGR2;YHa*^5&n4Y zeM0eE_ug?A$h`Y)hbk|`N3^CVqdxr++s|KJ$6W(!dk!L58}1PJ!aebuv9XL*>Uvb= z`!08X#tAtsD0^*?K&D<@m^?bKv+L%pkWm4b;un9nDdWpWMrNcmc%k^W5@~gpp16gY z=mM6AHe$`yyqW8;Gbz{dc9q6fxb9#d23Qv)NwhMqZw??W9lzz!b_7{4T_GG-nA{*| z-s0_v?Oi~9zAF{8u)7YTXr(5+@w=5@ePd%Y15o0;*EvI>9<8@S4hPp?+ydWCLtx+! z)UACjp6%0mEfS8M&RW zUekdH2k%57C4iJI<>Lj+&3!GE7mmCAWY+`OAs`oO$uOvLLW)mo%!8*7_9?%yGs|uE z3j;dkt@ba0oXmCeb)OcCaBu1`IpA+RwYpph3dG&718=*^7_#QX<`o^S#XZr&=z_Ei zgE(5~CjeX8V#qI7u7{$zMjK<>B3ho$kAizv8f{GKRt~Px!qd+C^aYVeiVxp`QkZ3P zFmJt@5U1+$q@$M1HxHWq;e!$M$~k#-ia!nyv;9KP^9Igc1upSHqHbO|!Htr(*vClM z_K8{8lap@m1(qh}xjS5>n{8l`$-ub>XR9j;lEtQl?G;IdErGCUE6mr$teAujeeTtevncl!lj9TSX+7(3AEzFFzVAhGZfIhrU5_~LGG zZ{~j#jhU8x#3->4H>0xZl+tm?5`lbMmh3H(y!nA&wKlg@aY@B9UAcu3ua?jtnk+%& z9t{>jps%Y3;*w9LhWKs(|j| zs4z>45ix+cAx4`s*$AeQ^Jw1s(g)2TDjjLb5m4q-&zkA8!d=hk(l~0gut5oV>>Ggr zl&~8qpheX5pVEc2dmsJuqL1De@bB1Xt;YJbX;WfP>N5wqss2BmRy9zu5Gl-@>h5{} z)A6T+m+5uxl6p#Cb-55EYc4BLDV8mr3oV9V) znUc++QkJQsoJ%9mAT}3tZiO@dH!I6Bd~cEXHdt#L1yx#fI6wf?+rfmhEv|euh`cAY zYeL?(!IbN$S3@CpEi;))4wTAb@p&w}x%B<&zX%XW+-H*rnJm zqH+N|#MNd+b5;$ux?gg5ih@cf)bEs2+}({|os*}w{?M?yCR-5%>TaIE?pc5R!Ff{} zq!FXPzfvN#;CBRMp?1Ea!!j1=G=&_1*I+u(OI4pygv0n~LQi0dBNfYC|_% z3*;A5xT|ZytY4t?hV|dxod0!gw&o~0hw?Y7CJvRtUAy8x<_Jb!Et!RUdR`t(hEAN6 znWe_i+3x_7w%xO+fR0fD@s;V>Ik&k)C~od-%;%CbCR>)8!(T;h-Stc=4mj5Zb2cO4 zZj>AXZgOj5GW}jjMm0{g7VT0phY_OY7#JUMvB_>@zrn7$D*uuof`6vq8V#yiw#kvA z1CX_bIi_LHw((O9dDT9pxED=$aY5@NiSwrGO3QO!an;dfB8!*zDa8c}>XA}^6Mg#n zV)y25un#A%@tUOX?tE@8iNVKw)?33jD^)S$~yf&9yg)Ln(Xy z6)TAmK%N29tvsUdf544}@_No?omWIgO-UK{tUeBSlDDNzq z7SH8MQ8{T^%8DTt#w@%uE7@I3s(9q|Vlf&YwrVKQ#R`dR{dh)fOfW)N?U;A{@${NuN%<6m}p#^XB@Ebg&_I96f;0G7q zN`{dSQiBombc#%#W7@o)Lj1Imscb}(mgudPkL?K?P5?gT;jg|ixgVkCh0@9!mBWH5 z)zX#ut%=g~}3G!=YcRin()Q9IG&`iaz6w(S1Qp%_>UmHZ(J0Qe1OY6c3jI@G9 zb{SSZg#zS3*sgNni9JU0hb$U5#+*)~Wa>#x(MvY2pL>~t&93y_j6I_tymB^}YXd-T z6DGPk%Bb6?Y4{)_LsRF}nWx(+I-tb%OWojrEH#W_41s#|EK;N6Y|TnMroEYp zG@}|Io*bsl3nDlV3?wL)q^zGI_QkMu<T%yGq(B@2Hwn^}HcC&v^ z{O27A9fz;Get&AogsC=ck37iLp2_6zqc%>YR_a zesM(3PHz#K(`NpGO-Jyuu_I-ZP6{;h$sJSSv$R76hV z&Vhy`L8Bt?a6Ah!pN{phK_y2wySI-uPZqR|V93$vyJknk_Ky-Z$+;8}(_MAx5lJrK zW@qj5L-K3)**5yLqopfusjch9X`NeZo>pB%=Wl=dI$rg$VZ}@UkpS1%y^GBc#=bjh zv{%2imU{1PB@$zK!Nd=mI{#X$s5$YBF#g=z;hEJeYircr>- z#sFQ-mh(`26h(`a<=wyHe5~CVj5%IGP(UErsX28s)0X+0DIJPE5)csYVokS0H*?2- zmx(m^Q02EnpG!TzlI`+iPa43rj_@v*7W;pBJ*qB`UA8IOw07;Dp9F*4j13`YNyW;M zF{0Jy!&fuIa!}T#$jaz3&gO|0t3I}7JnB`S(IlXLa!Bv2v{_&PQU=%ec9i^r&|9Uf z$=WMNwC)vvubZYae`6eA7_w;4a?TV;^=kW5TBMi zv0oF{<4;Ubrv31w|NQRUjtt8Iucb;S>f3+TS@2#5%ZYwOjynekh&tBA1*ih4Tl=`G z?(wlc0&5D3tn1_>6Eh}aPFUaJ``*%kjUPY@GB6A-3&r?d&-V*NO>GN;s_niO+LH#@ z>U74M3T{b@wMorp#(96tT8*!E$#EFF>7WU`jMe4Xpe3PAoa9!@)^r_u=kro)R<38; zjcO}ZIai^9@A>nPl--3H%7W{A7Ig1HDXl*q2+yW$Hm9^tU;*XHQZV3mXs?^Zb_A2d zJ`L}RU4s4WBry0+vw?OUL4Nc#_fF^XfP@KxFBN&RlUP?0aa7O~>`>Y4KMqPKwbqcH zABMY7)HfSrX_TC{N?Qgr;I3xS&y9Ws|8bgj(62FD_(t1 z3X+Ce{5+kooLLD(2)Nb$CvC~0q70iW;+C%wx@GgLnLww4Ioz5%bYvbCU9KkBp`kz4p64`KorRuEP!S_W}EleeO;I|iv1fDe`oV4yo4^C=MXnm*o3sS zKKg$ygdH^}tD5U&FG6UozCM0c3;0JF&v3PCHBA=%>62)RwGKsY+?KZ$I~L&a4Fg^T znp85`IGxn;ly!Kwg)&G2b;}#5CS8q6@ z=T$$JR-Sbf16LJjth?GvK-u7K3`6s<%A7+P;AFQlstn^He+U*O z_*d8+@8WkF@xu0PFmDAz_ywW<#htZK4>a7Io@j zfWTHBk86!gVlf6Uvma;NWRh)G*;QWrz+ww4lUmfGG9N~cPZ>n zGyr-tOOF5Bn|U9u3X-<#@!wJR+B5F?(YKn1T2<9lvT1%M@nYtYQJzlQ8dx$V$Cqq4 z6E>R~;h9r4W}i^B6Nd|p^BUXlKiY+9kHS=Eur@La#E})`ZOk`Q!3hq zd^<%lrkuS&SV}ZJs&pLLgrd~pEPexE2WX$aZS&Wt*h1u<-d}@_C-4t>&Cp%QXfj1) zr)WHRLl88773y2fx>2@V7&+*P7BxdV&G&BuNF&{sT8#pyc_nSfSbXq~S9g}CM^3s1 z;i!MC6d5}~GHqsqXPFYSeycFa$2MeY$^Pf>8D;+cN0W3|lk*4Y4!1p)?NXV~i!quh zE-XSHah3i(Nd33{QN`VQFHdXuuqep8Z|aHMnN;t!I{oj`mOs&rZ~^Hv-l$$PO#~9D z{=t6whbHWSWrpMz!a4LT|I)`S$f5{9WfuM6AuL<4I}PpqSm7zK%iX@taHlL5bM80c ztS@yKsG(+P)ODKQ&&}DZ`%D6-b}wC`-j2jDZZy+PiMPr=&gbwpn@wUn*Q(*=9G`rV z4Nm;m8o~oOsNYDE=DI~BsL@PW&mm1q`z%>XhUNao#pBJ(dh!xbzSv3etrXU;ouNM zUBDb5Z+@TJpx0Mf2SAws z9Rcg-fQj+`zsjzTCnC^wr4FE#mFB(@*7tW8obrj~le7&`o@@cu`F*1U0Mjz#-*#@d z+4YQC1uz6%%Hdvn@&ta^_ip3jdh1P*xsRBPv1OCYDyxcSr0uA-Z;HXt?6Bw2$cyjA z=FnTY_H}Iv>y^fF?;J=lEbmeI2}PvxsBE4TED!QD+gVUMdbS-&rj|_l9YH*MzY<|s>cd~%q}xaX!njfP3i0>BTDwop0Qj!=|G;+_0(ec0H-OW3 zx#vZMHB%dK0gPQ>BDP$GbRkYZtt}2Xae~_7qvj>sua){d(axqkyb0iHHISR19fUlx z_u>h$>J^!5&|q)5p&U_(@HblnRp&(BY^+tjbr6=)k0sCvw~QTD_9K259h#mP)GyS) zgu-dLa5_)Z1X>C(HPNaqQNtisAt(ICV20QX!QwQ1wgCv0%%n)z1@|@A09KtRh9b>U;d%rk0if%XW&^%noUaJhx*DK zj^n1DP#_4KXFCHykTvJ12@Tx}ydr{!IlRqSv*CkV~{n>kzX?ckZcAJ{DLA;5L-wR z(W&0Eu@0zi9Q&f-v(J*Xp1vDpQetjS<6#8yu=N%g{~DW81N>)ulF5jFW8q7TZ>-AMBAw!`tURCFlw%3bt zv0v0oX)@(ZWAINH(yUsL>*fTu4)Fs0;=s1^iE{2+W=O>g={-(J$KZ!=i0b=2QO@S9 zI*J1V-pnU9lIA<-B;P|@K{DM>8ejdn&Pk}t5DASeIN7QGv-aCT`))vEdD}1daUaLr z;np8X5>fG-MT)qquaESQXIq2?9&o8GypQvsjSi@S`(SG>XKJqABL_RCunp@o6`uzF zAO*`WtP`=H!(RLqEgn&BLG6DrEW?p&_aH5M^j#BD}@s#M^@8Y+{?$3!b6{nj4)~mw%M|MZjubRI4`Rrs^ zhGzW9H`l2Q`MMKR*12fmD?pSjn;_zx%bgnaXS|$U`e!}W;hX~6 zmuysF=mvs8(fHiSkyoMUExFgp?3CW|lm6~GnSbp5Fk^3vKJx>rw3C(41=>%060m^Q zjQjUE_bg?$sAg-fxABcmm~kz2zB4&o&{8TZos)C{jgZ?xzkg`llg$k>kh|{Wz^93V zoZ0vlD&Et?p$0qK2xM*j$m+1<+w+zdGoL9hRH7N!IZf5^P+thy{bk%@{?O8&uWz&x1o|Oem{`BND)6^F+{y!N4$@6Iuo`N1W zis<;Gj7-7>(>Rf87mdQVyPJa*H@V~778P+03iOo`Ro-TMF!gvcq!N(cCi)n4s?!^D#Z9Pn&9 z=;N&FgNN$qgSLlyGGqKkLauCUs|X~4(?`g45RX@vBR1zs?*XQ&L{61tR9K*vU$22; zh+Cb)QC3X)H4)n7nss{LY`J#2n*Mm#XaOmhZOV|Z1-zxMP5q4W^W&!&mc=I8>wC&k z;@6k-|FrzdtKu*lbU<3;6;8H;q>RUXf4WuvEXG3lLvCYso9}DAq03DebLsyLCArY2 zK>fTUxU;rZEUe?WN|9V6@g*kwMWK>+wq?3Hl@sF#=)#>lmWj~uzy?XSK0|Enn9n5? zWOwlYXJRP27m+LCIdZ*gAWf&oi#N^b3~BpgVGTKNFY}QqLscl7F^3oaWB28>+L8?W zJ|7p69BWl#fyz;|x%1+PM6iA_Dsj04wZP)*wIp*$s*nbE&ZlTmL%wYe``gbVZ=?N8 zw$DtAk%ii@r!m=b4G?<2Z`bru776NhD#F( z_c|gO@9h^j^Th2;PUD8jjNP44fpQMpwr zcayo~I?Qd%Mk)zgayKlwB_a3w5avE|H}~t9`(@Y+zd7gg{XO0f{ArK(-tYJ8^?bfw zujeyuC^|^JM=v3oFAmDp6V#~HUwZJ@-e|ptgE}FSME%KSYu@wuKwWlPK`#1;j zn@nkZo&U+~mX-TuvhpoAnK-MkY_4j4YS){ZGh zvLp9-(0p3!^WZNgcDCop!v^K<*TQ&!8{2S;gJLh-#(0SfO1mP4S9np!Uh__h9|i5Z zxdpFx=b+yX68631{P%Ilo%5ZajNn{wr5CUfgIKodd(^+tA`3h3<4ygGb8m(+HT3)R zd+HftKk5b}G&z;&PvB#Yk8x2~neZIq}ocHX4SF%%Y@$Q2}uNtIp(S5lE>!CSUxqsW(Bje6i%sUSG>xsRrT9h9!^s}skHyS zeGuy@-r^-1-hV@S<3U##+gSrf5-_sCX41MDCg9)O)=~G&whn7^R-Wl}J&+!(`R_hh z9q$Fwrp{mavscjH+~%go_GVAnYZpgK*PkL+za{4iFUyN3j3{z4(*$ifvx122VNWyP zh9EulQYNBC37?qd5E0owTkN>><0$XzvfC@AX-^-8OZ?~#Uc9hMRQc=QrUE# zYG-g0vWu+O9bUvQU;WK6-nl*hkRLy~a7G$?@D|}?ldZ6Ooc*fJ()QHhELoc@NhOIo z!@KpqI5s9)r~LA;0zF2 zeErj&$s<~#%o2u?<$}gom3h>2QrompO;v z5q)!$tFkuFv=iNjQ`Yru>LOIK*s>58zal?wE;7A&_fiREpo61DK3F#B{U#p&;WsNQ zm~HaK6@#o2cL`RjZx5Wr@n++=R@d$$OF7e|2J z4VlG|--}yb2(5Gs0zo;X=|>7hTU zYJu;&g{@z4Q_Jc@p`O09ZOaf&L5LRE+~TWuggSik@!De9W?CuIkMYd8&5o<* zeBSUYS200bz8`}G7B%1Z(sKyQKHsf^L)$H|(%RwCQ}ylLxA2{~S_ZplRJdlK1d}tQ zJq=-jQcU1L;12^<78!h$_odHb=YqzW>Z0lDGeWz0a_o9GGXSgHA>xTMzqR^>T={=^**@ZbcsYAU{*%z5ALkAO z%(5NA)1~l&S`voGzu!wWt&4G5l)T2X+^V7DC#60uXLowI(7xQJn_rd}f@3M?n9Q?imQgu6LZvM`r>x!S6MaK5)s`vCai$yi| z$91%n&_rvWYi#2zW0PBflbZL(hN^)nV&~o3R`oo6W*9%x7KFV_ssdh3O7QO72aPMly~fPPd2Tlu8ZfErj?2}K2q#6E2B(93YF6{o zAL*H+A=?p#P4)O-YY_a=%@pNOh`$Y(9vklAz>m<&j|uqh;xQ{w3ba}t-TU3Hs*=YP zZ;ACTmSHM_ZvLMl==cWbF@N24`~I6r*UiQJ7|kH2F|~{;&zbZQiS6&v+w6EPv-s4s zpWDt$QVwbr={NL`Tr0N`%R1K-$=x@JDY=o$wu?jF)zUd(h(-A!yk>rA^FuPrB%Hd^ zMNMLWsRt;V@tAy{CVwz&(W0|L{nJt2{E%45#*y(>M7{Mj-V63`Lv=V!(}!KJZse++ z$jp5;xRVHy+aKy42o7ex*!A4BgVkREUDr|J6W#M#q)Q7ePx~Eg?fj2pkCOc7LFZ|$ zC52-fs(1W?3v)bqo*oj&)RzV?tNbZmTO&ndTT#WK>Pbwi228*_Q))&TYrmnG)2*#) zGqu5(EcyJI8>o8bn9uY59cR13>AlY zJ*C^G%}%>sSCpvP<%A6Q4)`5A!FF>zDiMrnCpLdmzeA7uq9Ix{>Kw+_bXHBKMV_?` zbTx2wkdHdr_>ZgdapIRLueyRN<8qU?iTsHj1jyE<5#|1m9xmsa4e0lWVm@duwuwl8 za#+OM2Ug557O7r1UO!)a&)KWp^uS zvoOF!xavYGohdqac$Ws#a*t~@3z?t$xUZ`;bL={u|?J!fV~0$x&`xse%818uJvZz3jUtn!q=Bw)i~!IAE<3cn!()tK*x=`x}8&Y&Ucu;DiNi30)EeQ-H#Z1?nu1bs>I^^ zoXTMNx}f{bK%q9JFDV$jFr!U<%rXnxNZ@2^Rv*QlV>a}4UeNm=bNl}p+*TH>GKgYP z`}-h^&a-NyKV?E;4bX@Z=T-War5olXzo=%q3FRv@cz_6#I9Zk%u2em)Wg=9O9Xs&* znWdH|!d|dd!@ieSSMZGqleE4Z$9y1c*Yow>ObZTPLZg}G$nlS8E>#4SmL*p6Z7mYy zd4@i%rs8xjAlxR;(Z^;@e4+786LPx0cFvH6DjC&W)uwWUaT?#EvViEk0jG0F6;rk4 ztjQv0>U2ooiu{398aL*g5b3)mea>T#j^Ce%bg#?F|HHKZmAA{yIeZ`4Z?*2$sIdgv ziI@cAGF&8}@5q@F?z1C1ErhF!xm_io8_ZE_LV6OywUPMRsoDAQ3NrWkdHd+#ruosj|^lC4K!Mp+XyAYwLx@1yR^ zCwftH7Kaj4o+Gld+bqXs`ldB-$YYM{wXhj9CSna59i;vS{>}=H zl3yN6GvQr8O>0kiyV?+6lFX4FS)BV@oGB4YfrTOQZ}gfBtfJHHC596wY28wp1a zovE06Pd=bd8PC5IIiZ?sAeuZNoa0c8U=M6{FZj-!P+&$8M2`gW`Z31UmitRS{J--E zX$$1#PmA|8j<-z;N~m>rogAey{;Dk*><#eEHA+!-s`qzJ_N8asF5fYudyUZhP^2hr{aMYlQ!!mkA+E|?p3Ro0eR}aqaxGtY z7ZUj0zrKWjEsoY15kA%0zsba|p@q56u>xmyo} zEF75zb+5_^hMDgPV?Ej{(a?h%ya%Ofg~MrSIR{Im#o>@x&~vTYHkORjbFUlD*5qXV4TpmGxiK}QU)Y2pbLmYrh;b$@l-78gw=01*8P(qKIBjh3xK|E3wN7&4QUpS)Z_%f*G<6=_7Pd;JFKRZ z>%5}^exAOKTH%v|*S!7dB-ZDDGDxp@ze8Qx4NJ3lI}cC&;WM}?J)!tH5t+^!s{K(K z_&s^#0R&{6x^epa71%$O@SYE}hD)HLZmpERWm3zPYf9;D!k2q6|2EmQ6}!v@wx;Em zjvz6fexA+p@aaWO)3at1rTw;}@RMXgCG)#<7t#9Vo!?S~5D2h8v(U!#jX!>D%AcapZeQl%JZ7QJHg-o zM=<~UmxY&V()y8?etPNZK@K-^vu=tlci$#9;xv}$78X3NQJRd69f-x7`Q_(|_);G0 zd;}|&J!Z>#U}Pi+zwfz-BBUUEFT9y-)d_I9{d=Pjs$bAAMPJ(ZGSCYE(Os7BTleI7 zzL|XGA_et7Sz<5zV3tp8al(gg$}FGi%`8Td_bP~tn=%@CfE1Lx;@Kk$?DVY5JnlkfWz78V?1<5@&izc^Ij~i+8a19Qx z|M#T+?_s?nIQcr+$N9jwjCbw66jten%T?Au2{7rEoAXUdDr#71i^m^%g2gg+o2fB7 zx#xKH-Yp^XnP)^r)w4>78NLwW)ep)o4N>`c#Nz!=G`2WS{nWJ!3nu*2tL&8?j}6Sn z(nI--3?`5#iq=}JF()j5q;cO;njZ3Bb3Ef_`nQj4iB zY(6n^I4s@rPqt*Cc^@VR%1~s%oisi?@hef7%ZWy-f?y-N8M-=4DV zxw6s>17A%+C9z?lLiNu7(vAOXlNzny>f3?>>=v$B8cnI3E3@|0>^{pYinaRWT{`RU zJ@AI~Qha2OAa*auWp)HpbuB-svgNUkZ|NFvL?Bp#S2$7851}~J_<+mx_n)G=wCBvB zlYQiEaKgK33iYdddl9oquhTd(Rpyn=x`wbx-+S#0wRRJZ0gu-pd81iUVVCbM|C^6= zYvNO1I=8Q}M$0JD!`k1rR~m}RWdr(ExuY+aFLORMud4B`g1_(v4-udvLt8+$%NH*<89e$c*n`rm zXgSwE$iaAJBuI^XJkr{XLjGp4G&`mMtX}PHHkvU@lZ30%ypQ$rc-mIKZu`gOtTopk1AoVoB{P2Qhr&OV6b^&*qZaGjWQl zPuB6tqh%M?Jz>ngK28=u+=v7G{{sCfdAA(~?2_?x$eDi5hFnhFIi9)Q(&c#hX?}x= zBV3J-)0d3ao+3vazNQvxs+Q}34Zg0atqZv;P-b;y=F-et983I0)gEUDd!~Qh-E#J# zb0@B*Ya~W$^+Lwf)DA>;&!PU_%tpXmFfAQFI+SfH)>cYlYnK+JzWr{vRwS3qFGq{U zeOhZGlqq4wXyFd}fKFbOgD02`)OR&1`Urt#@QN(b@J_mbYZ<$l#U%e9wrxEV*Eg*`>kFNIx8Rhw-~t_=k-O8Oe* ztcY2c5hW{6QRhXKC67Z|iZObmAYg!a`f$9qBH{4*q+t~73yT5j#IHXZP`{hqHYq33 zUN!#=Zg2M&z0_izGwk~Pca#BblJ|R^FN@p#$PaDb>;7A=?3;GhMjn8)0D!tp5K+^G zoF@j@1|H4wWufS; z*S61D0ca|>m*GcqaJCtoFzgr}U7ytz9b|7LuH{0?wE1zax*Q}JylX?TGSD{CRVPXD z8|CwZ6Dk+MTt6)5CBz?g36S(ZY_I`4XV`JP)g+&41K14gx)K`CcVDQWF=DRz&&8;> zxeC;;_nMs))rLV;0pv>{e`V|Wvdj=yN%2oNd(>MFB z5n1H$P1I3+2&3RB(vjS_KQN(y4`4Ls>~LkPJ$B?hnHV1xvHC$sIly<4!^!4L)#TsW z6C1N)89nn+>4CC+ps)2QKTgcB)@9$Ky<_~c`sLd(7!IFa2O=NL2^iKipINpLQ9e`E ztx9ULelXs6^4?H`lpE3McN;e``bq)spT$l>bwM06muc7;9=}%`;Et2zSb%OLi%>W)Uyr zwurQL&DMw%0T3(+VNhz5&pfPKFH?kUXX$Laniu+?W#;C0OXP8J`3L-vXI%*aYB&rC zsQFs=d>zdXa#zhzy)Y>yo(j5h-wxr?FaWDlit62I*b9$&`6(RnrY*C6UYpl2rEoR| zDv0s!2N5iYU5#7)7 z=j|<9=5mN6rGQ=Q1z0DF{=L9s#?A1kpIiW$|D4a0RkOvWgQwhXeGUx;=V0V0(bUIy zx}KnFX}_qD&5m%prUR)fEmuSdOWrwHG|C6prufc0iY%(P59Wq~p5OJ$M=tb3k%`5F2K z_z!|Uts%01qQF~a*X7Zh%B!^T#-u}ht;pJ<)ZyiU7g;l)gVXm_eEurXASa(dYTZxq zT?Z<%JGA-xT@p#CE`7QZIo1dY;6|n%pS}mLIjYTBFNx=I!wZ7CHVUbq!_SQ7ov1J^ zm%CotW?b@Z|FA{3NK@>E7OodbO`$o={9u#(kRbc2;HV5@p=XD4*0go{Z-f z6_A6E_C}5zo=50UoM0KBuh)Frd^b6AhFj_`vrF-pTZ8j|AM@YelO9stt{?d&%EZm? zRYK}b(N1zbHffNq;(F)J=k9O16z4+Loq&HYwer>%$0X{I#4)PPq{k)p4gZk)J#CnJ zi{@Mbp1%8P+#)t6@&H`a12QMQM(cK>>=c#TK*!Abywpqrr)M#ez3_t?w_{nRA?7i) zpbJmgB?zkT5s17j;&zJLHkF6sEH-ySvUd^CyUWG7jyk^mLNoq9j^9p$_hPTL*|q++ zE=kqZ?6w{FjHCqEDZ37-OSJ}bl%E4TIu+i)LN)?qrD+K3Rqv(Jd{K(XgKQBjWm}S2 zNk$8Ql9qE>$MK%(hC!gt+f<49jR#`mdFDUvfZ$nyogp0EiM+~$-~q(8`>B2d`topY z)7{#XF_5kqC92|$y-27`{_VxY+f@CgL34Rz%(0Ov;+(GS45A&9Mf50omAf&FP7M zLMrVH#3pB>JQQj70DCP%z7@0(qgWw1h7Evchu)A^T3nB_P?@!Qilt2(2#dJOQgP=k zuqtv(q@2@*3jWRm%l;sPcT`In`Q3W@-@zd`j&V-)bUC=OvdS6j{aoX^9seos=NaxW8(45B8MzepCA z$QQ1BCzb|Dafo7=a@nZ)yAYLkNng7{mO5Wd?#Iria5>`+64#2sy=Gqo%^cC;ts|=( z?Y?lXKVHEZcx3v*Z3X9ERKLzqi(DxLfb4%|K{lKVmj_V&{VpyI-^c_R^J+7_jY&T= zBMR><{>Yd18|DkK$M+HQhjf^(5`X*eu8t82V6|CiV(tEF)k7dJ$HIc6wljSF7DV@& zIzA)N4s8WbnuOo|%qzRCZN3Q$7n>IC?TcI8iu5BazHa*p#3|>MW`}jS_xEDT{U(R& zVzR>!+)Kk*xgLm*O9sP1eZg}dP;yTAy;m&y=hw+AL$#;4RAuN?+_>}5Nou5|&83#zYH5))C(T!o$F7zp z`l0?ja%K6o{CN6p+hJGf*ncGI4W?=VoCkkL)jt01RO%#WebpdY1PPnI7qQ43Fh1m< zDhy-~2thUl{>7>OjcZ@Vm%jXVimJqU5V#x^4 z3ZUHR;gOvQr7)Vo1Ao^CP~lv2N;o#yCGT?4J6XC*0!^}pVjo=?hT=K^HT9Zvj$Q81x@7Taz)4$#_{oWEoKFF<>< zR~I7)h!+jvu0G8eGcC#e<6PyrpRvmR94(bB-svFf z$LJNO!S(^KWOk!-TmQgPNY~XGcm7J=hC3pe;#6{y1ySl=(tGWGel81hOucpG`REIH zSIUM=tdP%MpEl=&E2BWuRht6}(anl9nCD()V{t=Z*&r+1Hxw?-%*Nf(V_+ z0&g*MCGA*H}D(U6|AQkm<^@K)@ZVfaibFv87`dV7cd)nU~Etk3~wyMeQfW90U1NRl4+gkYno;`EHpZNn&92?-z5c_VYf!a)&xc ziqp@8&=gYQ{esbFRDYkD)yo33sD)>T=Ioxz^7m{bnk0G!cA0+fZHN|e!W`l=q0?_uXCD_kSOP7p6wLD#u9tk!ByII}G8 z#&lf8#_zYSNKel*q9nXU#G(vb$0u`S2$L^k{nnj}UBVY#cZREbOX~UM5`{b=Ho{bD z@NH(u51!&P+p{$CiMTA3JR3)NsXY-Yk)OnPLwtr1%f)X8ixdinEf%#kc4>4*#cv8W zoBILN;uK@L3dn|ZQO4X0<_#`Sf&lG2v@fntKT(p24Yj?jQ?5)>`5>Mdz^fxf-FYq9 zY)^j~8;|5OgoZi>n^%c`FgLGhoNVf6D+-$9{!)IyY^CYeN-Lkdt95@f$#`G!Po8P} zuQ0JQmisaslWpnQU$!2Dye9oiUy>DPN`{;YM;cYLTn41z)&uS`n67!@tj_CIqFv3q z5V8`WmEe_z?R5%cRrqTZR3Oy!rO%%BPI#D<^m({pnI!HKm0zh-*tfJni2ar(v)IF^ z+wIKfFS6ce7##%6Y#VLmKoA*t*f{^SIS1Tc1$^d95kh93#KB(WXx6NTBR7Vl-ndd^ z=Kcv-UT7(jrVj*s_oXksmdq;k_H;nY%N&$nx~6HM>eYL6V_gTvW`78}mkldPp}eGN z3YMuZRk7&adBvNmA!f!-U<+*aZq&l_{y1UTl93>6%xh%tu<;a+$vnC&(cHQeH8k90 zpcipRZJ^fs`HEmsc~1^ka?;52U`0&!vF&P2Q- z0K%0VtnkRu<-DO-B7**QFmp59CHq?Ji=)uitlRLpxck`#12^Ghqk^AJFxPaZ@|e~@ zuXSO)PtuW9zfqN!lfdj8nBf#(A+S8Iu{vopZ>RmYT;TZD4!#TgJB6B%v( zrK`G$uc~V_A{pK)6`Ux;#N}Y+uIk*dVt~D3Wl6S7?xtY`PmkhhkkxzEc$hZcy%F~oz*{RMB$IjnG=QV3rMc>(=q+nOW));@Hx{~S&cUte0t79flT`^J^Xq?nujI9_ZNf75yQb$(259 zXg#CjYKTl;GE`_cP1jW=CwaiB!bYD)(YgnXKe%Tqw6;3@feRt9_?b~BwW=R+?&!$W zDm(v=)r4LS#{du4M%XxIUN}crEIW8iHi9l)k}@Hh84x3zXWYNC_~u%ZI6UCK(;-D; z&JYZm%a(9;NyY!hgv&N_J#oHE=?lDG z#cOk9waW626Yiz+Je&pvC(Mmawms_8c`QH2X!32nJ?j;u&m|Tflf$OpE9OpPxdN!0 z&SrbHr89BJohmDb$=EYI&&jy!9f5I}w_2unv|6G%RBAIH9c*`YhJlT)^C)maBr>_U zDwGv!10Y+nV1gnH7=oJqlgq2HDa_ghe}<(iJfD4(x08q>HW(AnCX}3nA=_dS*vMc} zvF#t|ndrr}t35x3z^O441$s5k3nsNcv&kdv{4)8Lwa78YA=lry+G>!iC005gU?Ac=u($XDsG#i z>)WN(UcmVw*l%E@gOr8k#+_j6ltBOEbXfr0mlr@GZMMj1qpiuQ)|rPzM*Px8+1*{>ZLl1ytk7VzQI{ zIu=g?mqCfJzr|=7svUwA^dUEACGA{3SU>;0rLa5kC6l}7!QBSAC)c}_P*{DYje>y@ zbfRn`NDPk?eYe)X>?Xw z6rF&I=xN;}NjG-I28Ok;4m;8cU5#`N= zIwx|;@Qkzhtmgm=@<>>s=>umVjpY(tkzkH0JclDzG*BZ_YQcN`0A4{jKcA=Rgl|uL zE_df?r5TwimH9jB)?>xzt~r?@zw*->k#Gfg@Ab! zU+)&H=@OfkxiSFR81P5&1g}@Q z3d+N`t^h8}!EK-3U7A_@>g8$KCZd@gr?9{7j`R&tpB@tI1qDosC;13gSK)cSvjq@? zV|GACjgz68GkYGQ0;m%+oRt8VJsTwPnJCK8b!CsFG(dQAW<1J)(@Q$ERV6>Y?JMEQ zZTPH?@^r{TdRN<0)^zxR$UV0nFajJfIK5T`Zd(#S+&N4XTP}|I0dAgD z<4S_`IW0I{dniLoNgn!A15%P^=%+TX6(FO&V3kRWgC#Olsji_3bz6d$%jff)f^<6a zX!D>y2a}%%`%dmDV#9xXS57EZ?9p_CWabGVRgs~KM}JjzNzaH*8;C5gCpQ}i_LWmI zbPqENN+vW-gw3zq(lfLTy-{lbl6mDIyBGEH7}l9chNNW~vr0GWB!`uqO;a|HUbzjj zY;juY%lAe9k^S&Og>ajA(Wf3Zb$|6iYPbNs)fX^Dz1FWS5@y8oC!{H>!4nrg4l+6+@TL)(K+Wz8H}jJzu8F`x?I3oa;alj*;t31 z==oSHd^-Z{S?@gi50~lYg7H@P4a_P8O3cvC=HnKuZk{corv|(BYR1jOZQhHEwP44a zy}7m(7PSrp{cr!OXs4?f%-aLhC6%`=&3^k=`b5zDwMWO{POB}mYs$?58y-ArVUsBEk4x^ibuxiHTFp34|7)THPS(6TQ@&399wt*bTk)pX z1Yx0DqtTVPT;jDS2+X|e7G8ek;k1kC{mc?AM3~a&0EwmvAOA*|C zK^>g9oC_o;F&WJQ@g*83jQAArVc;f|{y7_xv>p00MSVd~b7CQAm=bYX?r!4YRDsWJ z_AFWCas<#OV$xx9KxDayt{}3JoQxXRSHO??tqD6Zx_?st0eJCaFDNSSJBCN79Z=Fj zvSn^)dAqb;6d^WSinhFInJrQKV7DBA|7Zwn9eU~gNOUL*Q@q%uLjxf@0i}S}GQwzF zRdWGJ(0_67)d8e={-H1p67UrzG=go+Q53A*1m<~%CscX8S``>sZUc%=FZeO)J`eY? z>Ik{#D=ajO2&O??=h={<5f#!3OTVt8xJn#=`e3%9`Oi7Lh91@TYJ$|?9w&^L$tw{T z#9py`xWlG`KSkyGS`#1qe9mvge^HTjVfKWxu#KnU8`qxb#kc}|crs+Wm>r-mO)sVuYmf7fv(aDV=TlI&V@SEP+819tl>%UyjP|bOaOK znL2A72=7JL1JV+;bIjbp>Br%P5V$t^Y8|!q)mH3mIw9ob<|VVklU9BJR^O%hmICqo z47wTT_S8yvQ8s5Llnmu&h_DP|YEeUVVN1Lg;N*8%SKId{lhzb%yxrzGGQx74R3TxS z{kiwNW;+K9UL2vJPvRIe`4T!@DZn9$KoTwIT0iH^&l+SOB&o7Z=Di$%EaByfHq=fi zmgv<_hCQFL*Oi_26P9}U3Zq_{#GAr5zq%$jlQALT;)qyp+?IUk{WzD{Op@2O@k*jg zYSyCbwS+DzWgZ`Y+5XFwX(zB}+%~*qXF2#pJHiU9XDp{aSKR%ZYz-aM7ug73R7n@s$^EAHKvQ)chT1iM^DJVz>!M`7TQz zGpKJGAPCrK?6IdmQgx9+cKCK4C5o-Im?8C!G7D8dG}Eu-Te@2JKn_x#*T$v6A4B;t zGcy%8n#5FV0exlD;fsy=9t3a3UKOVS3^eFjDc4!3iBg7UBmH->(^O^2rSC#>;y{Hw z)6b~|aYo*8eGJ}+P<--?63O;Bq`x|#Y%CFu1Pl>rSU~|K7wB{y0|WqgnAjEuuK*ZuoZDq z&RTvj7q?QN;hH5*sS6Y06vQWmRkpZTUG(A7^LMWM2)SlZdB@gjVaY%w;5igsQwy1< z$n+bif#y&HW1{|$4$s)MvXTTqdrPkR?jZR)itx_IGR3}Q1iBcg&6&^~S?OWEv}V*s z4b4-6u?^zz{R;d`YbBaOnADAfF|1Rm+DW<4fT=`Z=TG%^-HpsBe7cX`EtBH zJqQ0i4iv3X@CQZLN!Hvurt*o|z3tf{k!;kZk{bt&QO(*=b6LopsWxg>$_uzinE&lm zVgE`zMYfrf3~mzabw~j({O+9_83r!WR1%QlH9NU1)jAH6gOYU#sO7K~)wrG^`&t{H zo5+#9{pGmLH{N)v*hT5^;a=y7hlW+fkrVbg<6rInt)*oC<|&IaW0n4KJG_SbR*~Ja zuSG3XMVW=khNd|8{8Y`Z%;b%ldauaNp;7ZeA?JW^m^&6`HsjG-7v0eoL#=EU)y8p+k9j=SHspJSStA-T8$4X5-`z zo$#4JnalCOP`$T1nyOx(v$azex+mi<@95ltQ5NIbWFw>=s?#!Lm1~6SO5%1rjH9UA z1`$*b0O4w3$>m*}kiF|jlJsyo8tAlSZ00ac%F^XhLvz;(Sw9B)D9O;q0*x|7O05_? z?zt^9TtuTIjRSE$-$Z;$85H+g2N>{hvS?+kH@%n^6j3vcrb=B5+4&VMvq9 zmd7i%)GaXC6mzwWbjo${e39nwbfZjHYQs>bi*?&qZk*`J`y<`xN0zrZGH!sb;f_YL ziuAT&W`8XYl0f?kBNA7Icv(^!U*l^Z`vq0xbHz$K13EcT=AIP^a~x4?sUekuukp7% zJTGaxT8o&SMJ#ZF(XFQ~9g`Y+h*-1jZOz-4TrSy8SHL~4Ngg@C^%Do_X1K_e6`4h8J5Gw+B2#vk2F-C-LpI7HFf!TJ;SYn`h2pVwe924^tg zsz7N

y}_&oE@a2C=#ou=2;uX&~0Gob_$lB|^iR5ja4>3v#6hNr_Td)iddt{iDI( z0hxuLCfNOoe2h+!bNN-~-H{AA%5?dyb~xa=qtNU-;kYc|pQvz>tg|fA)kDittbQ2K zGjgg3loUK0OO-VuH*50vBCe!m)OMH%daMBRi#Y*CXrOz~zETYE3NImgS32oCZp zS1VBi$w_2V%i8^vqXBmC9#!OS=zbM>W0%ps*Elug&xqi?Vej!^o(T`<*5p9&I*kws zyxe!-O?h?9)#8v0VX?-NYr$nVWMVyWDA<5O#=uE6TW0LdFHEr{wP;c!Rm>+d7 z3RfqhBubiAo0@5rjcdhgC+>@Zhqp6a+T>hI456ouQVyHaj~h@T?%B3NYSY9&@cB-v4NUFyBs?J6D{Zn;*dH z63o-H*z@iaa0sKiRU4P7pV7iYH85us)LZdsL@W~P;T~+PGCUc!#1@Bawl3k1hVF!+g=+@} z=vT^<0hO(V`Q>lt_}tB!!j3J}0uh5W3m9SC*?z7Kf$p z>~$zjCaLuClA_#QzWSq6<>xLn3veCv84IdTsaZuDM(U7W1H^q{jpUF|1r^29ujO_!m?#Jdh{Q%+mI zKk4Er;Ts9Z^`WGSx`qSWmw{nF#<2R5XH)nQ(nQK*|Mzl{m{p0-sla3Ytm`~bzufiuwqsv*>Q^26uANQjV)t&@a8of zZ^!$soY&zIfM=Wk@QisLXbvOvXVQ4BlfC>=cn}Ty(AViUP85P>zPbRu@@Qq=3_iU z5p>IDA8Cr?JZLGoatnzrlvX2@0~q!?iLPext4|gkJ%h-5wWVT|1f!RDKZhhcy23k{ zd_b509PwFJ(Yy0>!eO*5QF>LOjy4)iG4T5?Ms3vtxg={7CFd|fYn@@$O={Aik}zZk z4n(qjb(}eN%qZJ=&7bkzu(`UWb^aFdz30T=A$iKA$Gyy=5n2RL(b5yryQ38+ThYgZ zmO=cg-}zvo7LXRzx%bq%O2a2A&y|va(L9isU|?~FCgJN-9Gy+4xl)V?-=jwx+dP#s*MReV z3K?;sbipSXj&}s4f}g8@SL&Owj)>`}n+j3pM_X}wq`GTaL7{{3ZO>grCFL_=Zs92S z^lOOzQ_LN|d$2_9ErA;6Y(v{@BRE8`td06U1=0UHX~TbW#M-F{Y?wkHW48A)%Ua_SxHLl?K&Jdhj za!=bWk!qTl@29gFggNu`nAb7RA%0eCJLCK8oj6#c;o;C(_qOxBpn^V&X)5>J->v`& zSCD_TK-f2npFJ5v&65dC-+7^4^RLzm4l_&uFQI2?=0NY?wW+2>9*&**sL>19v3@?? zqCuK$_Y_R^!Ktz5$z|+pYE4XUXrVk1YzeBZr=Y)Km|4W}Svy zoZ}dIH1nvj#)&VT+3OtuI78(_n}j8tkmZ^r?~NFQwTyOPCMp_lp(u=$x9Uz+_XhoR zW4FwL?RqdmaF%WO<(#a1eG;W1e*TI6 zy?O6P%%+lMD$bbl8<+O7HiW>;kIgI{An0DRqme+P1o({!KfOwB`;;h*U02Se-fOw! z?O!9?r!laTHv(?VDNR4O?SzP7M=PQb@HUZkCY1sI&XmBd99__ljdP>D0;zr1@A)I zT8A&eOe+B|j`&IiJE9Ufr$Zg&7ufQdMU3@2-tI?hOP3J}(lBRbnT0z(D)@LNbNR=|z4~XQJJ_U%n_W9Zu|}%7I${Ww@Xj60}cOSnSuCfCkFZ{Ey#SZ`|xTrx}io||%~61u*JACefa3TvaAK(~|F z6uwjC0id05$JBR6HMMPD z1BzG>yrKfqtYD=|heR(|xL%ry3QCC@1Q9}!4haFd5|I)Vr3HwHfJlk-9zaUy#ZW^D zHKB(P5=bHWg75iz-#BLs{)5Bbd$qaenrp5nxLsaW?j*K2Q1qz2Fo@P&dEaj=U|YY; z()*wK_R9$67E4&*;%NrUV&XhtN3ot{WQdG8CKG~;!#B!Z4$lSzrGlTvHg1et#nxSg zMV)UMzH1c$Vy3UXze1g(XMh~*#`|r5(2J0ane6Vm-E)~meh$>s+a(wDX zTa3PT%lN5a3Gp7`cRe%l+HYo#-JTSFOI0)HjYBtX_=XG~r?$OD`Jd1Z0Ng~$HcE|c z%uLQUuD?@Y6t`{u6<9 z{}Yd7{xKYArQ#!X**QPW;286e{JlQgtGfH}x&+7CrCyQkdH(b;yb?=c%sStzH1(`H zE%dH6uIFQsde0x)^&>BksWwpDrU{ndNuvZwj-@W{F@zo6+$AiW z-5SZuGk~4)3Aa*)&QwJV&l^$<7A)hVQTY>pa(pm$bdUwXaw$gH@X!mapW6&u1L&*mEiyvlEMkxhU;9RA>p?EwX{Obr7! zAsezHfsPA=#2#~)C~Nx{gNO^(aXNB*>Z!5wjcJl*{k}_*(kB$PoUR3^1l@W!fAh#g zNUk^%AcuB;6giue+Bdr|1v(<&eHM+9d-_FXn~<7Q+L740U5rwynnvssj}?=OGN|g8 z4W`A2d3Q0@l=QR~To487u+Q-{V-tO!_HfFgqL^CTqR3>ok^!sjdj=l*J+w|o&*x;I zr@^P0C3TgP;GLu4MN%(0OX3_k#L~^NW7qhEQb}uI?c_u#l>HKrK%!+VYLyI;y3IQO zy@3*^&%}37fn?PKV%tvuUln^t^k8l%a)k%6l*xNe7@%$~^w5|zXKP}8Kp?#dHEa#4 z57CeVe<$|_O6~y!gnAE>7^EdOrp=3eI%o*Ntb^)$I8C>-H)@f~4dthno-|c$&j^dZ z3J`{RdvCiH_U4dR$D#dhpl*6&dCaz#d0L)k=nOpfv=KrapUF*+($JbMSzV(XNebyk zk56NsQa|D2#nqaGp zG3m3B*0J!D%sNyog;Am!ebqM{fNT!~hic*?z2Er@bb~T=<><_T>rXsT_>okr49H4V zh+UJed#W~PtyeJV5abN!a|PzdpPqqeY0!5LFoyG+*ez)R@ zt!a=C^p%e{AOwve<8Kx}KirX&35acMjD_%tYti5x^q=*KMo)WAtIfWmd(QFsR0VqX zAK>oS$Lb=34+B~6za@gnIii4RkwcKR36MjY7R%yh9Y?F)ihf50IlSG&dSVfXcM zZCi_9Z7=%G8B>@?_$#LIAV&$`L%1jB=F$bi^5^Fm(5K`~`@?Zcb=oR0xf@lU0o1ss z%F3%%W;^MeBW`Hqtco4tFW5OfKBRtD_x9QDrppaCyILZJJ7fY?vXxJEtgi?oqZ}Ab znQJd*_MoqXPPYBo9uq73kC@w^s{#Edg7s~*+&u8>&e{=y(osde$Gkp^KA`E=nFvESxu{*73 zJr!-Vhz`@mb&6rA@M1iD2IbVVct?7f@?j6ng-3XIpzI-OYq&SaeI`RT9I{Fl&qjgX z-LH^K@LM5)b#ttiKTywXMzn+g{I;Jz_WpUsQtFZw*4(8%>iww5qr=G`oTHq3%e8fe z_UbJgRfuDBM9M?nO#XBc|I49N z*MFi{12tO4wqFrr$>6uoQ9L`gbkr@#O0eTHMrqQ5SSk|2X^&#lb!2ZT*}Q*hwykWjYM^p~ho>0;qF&79R(T zm|1cLe7Sz-(fzWMluGKG67yCi^W8?XWxE7;@_FSul=i}uG%@g~EnkRDG5s2BE5J?Hxa~PB z{M8LSXuj-5Z>$BMHm-y_*ae*{y79o4o|77IZ6~q zA)%&gnI1q?ogn$7j>@rV!*o(h083<|+1TTyX16`umTeCla!ar*w>qD&WMcTPTgL6F zh41|R=iA*j!V13Yx(P{!a!eA(boVu zD@qmVe(?(1yBl?uR;4<|7hX=BbKUFMk(E2kdDngxQ++=Hyh%%W@N7_){mPrv~19{J@_2JOkrY+Ahsf$I>1#9Q;i{ z@}C-%&P5qFNgw6>h54DR=mEM{yvr27#RgyZ$ytb|Xv&*37;>n-F?Ix~rSSy&+Pc8b9}pJM*)2xIzkXQ~!HDv2>I; z;EsZKrpummSMKPmSmukx2EVv16G+P|&5iS9tM&Syw8XvsR^Gn}Cpk;^MO%Y#vB~k8 zA7`4FDoi77{h(;b&_9pnm+mXfRAjO2-?}<1v~Tgt-JlKFND2j3-sW)>2;uKcE1iHI zIZre7ecWR>dKcEWx`?j!ldnHtKX*O04!U-xKC4z)kZ4^G!;${docjC%mnAvcY;o*G zrLONTerRRwvt2WMu(I#^!+;eBQ3*?cWbS6swdB(I`!6{7X?oVxN*OcS^$2?Xnugtr(gRWpG}5o62=8$J7Bf4>_WIPafA+hdKaAKTIp52y?iV{IGnLweNs zZI6-BRSOER9altGePd5mz?H9ubabgo`)@l=ZL9WDLT2f{a)hgcgS}Wcc<;na?iNjD zWTO=LL;%8r4{{&qpkzKbi;*KYZ!7nAH3My)lN+run8J{stU=2YIkbt-a~BV8)Q*6F zFShcQ)v40^3ub>u6o6eIll~O65F!V{-x!G+#8b!~&~?EM5ANU=-q&S_=|dmJ!u0i%Hc=(wGEJkLujneR zP0>1ehU4RrOmDp38y<>L`OXbH zF0EviP5P#)#SMBbVKe?D_aPCG?YtGHUNuqp|BcXj=c zr3PRiLWPqlQkZsZJUuW;No!_(YJ{b{PgQFK`bI&AW}I!Qy}-JT2+4L#`&TI*HhM9s_j{HHN$>R_p9kHu`*%;u5D zA`^0+<}W1c?bqM@FruC`rMvm;+vEet1-i z%ka8UOsmQ6sH73Ts7znh;Zkl~)AF7dZcyey{YrYPc2UfGO#o3$^G-5bZCtnmXj&ACj^P2G_SYZw4#<#lEfu*n||0Lh+(NcpQI7j&{9>^TEvB zWoz_}&0nxb*AAui=0vQ{N?Uxc} z=YqMH%CqYg^FoGN2a({f(B4UJkerk&&XX%p$cf z-fCTT{TWITA+g>eZBjLjjl`+u-gmUppVZ@ zDw3(W6Hv{>LqBK?y0-@wssV{>`P6((nU)#RWi2aLO*0l#DU8naQ8MaPvf=4 z_iv|rzYy>c-I1L^168J6kKy4%3iZjr;!R{4?k`z6m|0ahCfS=N&ShBzA6gsG=_!D- zo{-}VT+z+xt4Rk5>r{taFUP+si5MKh z1CN=4ntM_jWyI4pQ#DUa+6`E*)$IuxG)iO(LgE_nE=!G>CU}+Fph%^CA>aID>PMU= zHFHv(Kf0Li1nDj$&YrHHJL?7Q*Y?9Bc$&cnJxuJecc0ywHVOXpYxx(#q+KRzg&Z2j zZC(nN1{d8ENs+qaom#7|9Lo%CH1~9frZ1E3*eJDbEFqsUqNlLW69bAGXrA0p*Y#2M#z11LDQ$K zu$dZ`w*Lj@a8;d$-y&aBetLMA`k32ZgNdAcpyM#g^Q1>1X~a2;tit)piDkJR3RJLpMowEmrj%rFX2q z#rS>;T0~U$9Yuw9BhMT7?&JCVDrG0Y@OK(pGY?%H_FE-DukKf$?`W=Euf7q{dsEbY zX4HQBr-+tYAyv>rHn;lLyFqh!=lUaI>7s?&Vsp-xLb-w`P720ZuUK*8g6abe=WmG7 zh!wruzU0jlFTLIG#y>WbNPIgTuhnvvlpTICeAwckG5891iKLXo+#o}FxyH0qS}qz2+(rkVbvSh!2$qpdhIS|j)h9@*lLzr7 z`~2%hLYLR5zqJ4uR)Bv!f;}f+bf5)mq5Xi5^@jUZ z6F2KV#Ow96d)*~tzl3}2IL8hmLXILNK{RB#*Hq34@gq{SBgUZU#Fsa;2>jSy9%VpQ*9}ngP8A_LT;E|m7 zF&nt+u7)pqy1Yv7grR=jl(@`COoSJNN}4ZL9c`&c`AdHOXW4e3{dKoi&~2WXV0wsI z9%Wx&g&H12dM4^Xb>6e0{|D6OGv|!UL)GQfURaNvqdD%&ZX>MxGhz7+`r3F^kz%?= z>w5|xUI`p+may_8`dn3V9PQRr3m_ILI15)T+vU1Y@N- zQdTfU^21>)^^K*sK?@ODT&HF7Z{YWDzEwNGdTxtFA&=I}>+adMrtI9VmkSX6Pus4% zop8tn@krigMF?042j3d@$JK91LbD@ddiQS!u{6HB7(SQmbYAT(w$Cdp({jC8c&Jce zY5e$kgtsOX9qdrY*?MwOyS`a0SA;bxUX-gxu!chN5Bq?O5bPr-XpY?rc&#?>f{-)1~mRF7GbvtSk72}|?RjR-Vy!@TAovO{6p6vBa=aUN&3gH>d zzb{Rx9JeIE0aKeA31 z_^)|HAG8Y+t{kB_tb5cn>YB9JsZduRrHnwpOA^2;!MXy_s)jZAe73yL0c&TpUEM!L zHMtPFFG`J8vCj~g?7VSbQo)^-X3aX0=a&eW)TWdXKtYgJ4r7;;H3G`apzgms^=kTz zSJ&&l*KMfqtf(tGdYb#dkhvJlVZZgIwBlx~=<+IO8gFJkYSCNh4NmA_Rya*sfY}Jo z>3Xug+gZ2!R1yyw%$}zBx?;Y&w?b_F=((`hk8O_?W~mq6Ds-KC%3tee1$w@nRddzQ zC7o^CP9ROk*9~SgkBsrM(w_-fyB;j#@6#0{d2T}|)K=Tg%33BjDE=;|PZ@^Tu2yVr z88&ibZxlPZR-u33Qh29>|97Gi4|?ADQX;T^Ynz!7fN)T)dS3i}yMn5$J{5RF*xAkO zZo3rz@+!ou{+EEJY}0noU^KnVvvwdYtjqg;pg+xhmaF+EIg=aXiz0%f+q=2z%j?8LRm(La6MjeN&4)@7qKbt~skJJ56u0 zitN9}$rVwH_QtdBvGvL=TI0VZZp`)1riZhU4o&H6J1D)$oa-(N_sr~{$0Vx<(DEyb zN!+gq+&5{|ck@!Xo;}!(21eO=8QOJaG`93C*5IYjYO*aszR}81-|1oZ9MV(wp5?qYw! zZ%Dj4T%!W;e)Qu01DG1=HR@ZU?+@*u-1ra!Kx8sf>!K0b0;cViuBjXU9jpw>Rlm5= zFYmcqeThIljbCVE1SB;<%)&$MDZ{muGiOy|34zl-qUNF~*|V0wj!zp4sh<}yKOLYd zjOP2iW4fXWyLr;?BaRUo)8Dx2oPeKz28Mp8Wrt?RE${bpSDnfeT^T4Sw306Aa6hWQ z^8}7!zO$rTdsmzHXj4J6&qD4S7aHdGJaLKk2x5ii*jiI=G?#hJc8>U~Tx!|}qfj;x z1}MN$Q~4UiBxBx&oJy;Tfv}`G^S?ayIGBCTnRKQ<^U8kq$tcs_6Z!r(CJ;|dY=16K zvtJtAi}gsK``NW;GU@L3{@(%x>9>UmT!gjGm{x&#b%}-GN5i}J8bQk)_7D1E=5n7- z`h`3cf7!wLmY+z&ZV%#$xWQ_@VaZCgcNnj@{^W3j>LvCMbAUh}E(PS9E|ewa+Wn|- zQFIi)+nlrRgWPH9O^rfZMrI)_SaHHm#Fj)G#DZ)JJ|n30gZvBa&EKD)Tq%T)crv-7 z(OGT05nw{uo=v)Yzuli7+}QcMO=IXm zg`(aEf|4R%QM~H!o?+#v{fDApL}5GB4N9R9+>V>g6X&gf*7ow&W)W#rso%l^UB|ac zgKIfUy!d)1%KZDp8%|pNwo}f%dfGC@uNBNU@WkV7Y#r^cNI7&T!w%ich6>9)jHRZt z?)yPEgDe+Q*Z;kOdup7kPQ76w%-4wKS60~{W&FgkLUyYBBpfaII6y!C9q6-o$d9v) zzuR%|gk@feQ=!+iCu;+0h-bbpfAHPFYM-C;Ec6>=-a(DcRrE5B@G5ix>=|_48teQP z;ay~Ih4C<{UeT7uOmbw$PFsC#1nW8Yr!DjU`QhUV)E);x$^BX!j$HDDh=AQO+Wn9K z)!+_>{qhi`|7@1&OuPKq)pe@m7CAq%Ko8Uj8C<_UZLaTwyCaETErFGn6zRm zswQtKQMPB$UBY(k(OJ)+rmDTA9*5JG(ujK-d^U1zH^?bV>%rN-S}-rIcm@NHPrWjB zz7xRX?rds?QYPzaLiSIQ(lO*t~h~(9R@*Y+)8fbw|-H^@$GBy z=PR5cGUI+ZA7`K7lJsgHiWMd{*~k|bolwGz6$%8J5Hd@-*O5~C90Gt>IR zE6a5Gn+{{cB@e`}_=la^0lvWoeyqA&WIFM!^jWHrn%j6o7Hq>1bg}+0ys&yIaV<(` zvPR7b8&dLzN}ngC6_(aLyH!ZJqc{`Ucr!^aPJ!j`Kuei9=mRzrlhTCSQ z$A%==Lt{Q6n;RFp*Q_$}-TFRF8s)B9i#k%9Uc2Ou06UzkWAJ0)S{>Hj(VKfy*UtQC z=|KoZ{;^LQ#y8d9PtJp|av}Ge@sULhK}Et;Ik3{(&8jXLI;1r&vSXV$@uc7K`$v*>TU`Rvsr)7ev&M^r#pZ=;SuzBmAP)h`zB> z4FK6~T4Qukx9`naba|_ZB6`D$S~s#73|e{78{pk@%`e@NrpDcSDk|s(hi^JJM7+(O zVNZGYFZ-fTZ7m&>#JZ}DkWL1~9CrF;FT0jA<#I1HMhqqERAVnLZLtg<1NErS)x>B9 zKz8in7hTLnq}7H9DLVjtsCTcYgaXNTTlEiZ$kh$ni7sS*lk)jiTL( zTATkTLGvpE|66#xL8X5d-z8$)J{#!;I~Aw5>yS#NWH$3#rzn}b2NQM=)@%?gY^S>a z9C~1HgK@CV@ogY?i9Foy>Bgn@atG;BPO=4QFQXg(V_Tz_)-muIgiz0E!tyj;-i2_m zOo6w)yhTfJ5%Rd%t%e1ktW$LJ-pz(`iS+YJ z8sCZ^@`;gNyTMu}(On7vQrb%)=JbkI z4(Wx2r^|Sb&qW}-+=IS}29}BFm(sQDTu?<4^&Wub$FY%e@kG9Q*v3iMTSSAbh5lt5 zgPqS{Neq~J!yk?)#tvl5D}=x~Zuxg=I`ej;Ng&Rr>$#PnvU^4+Gb{HaC_>a_mx(Xggnqk>x&<3)=EFXOLdKY6t&NPy-7CV zsXmZ&hG^<)K7_~EknTK-_E@ebdp}0z?C$NX?gPH^7XLafrl*BSc{^__uy9TJ?Nr;K zVITc=P1Hd*cXi5{fj4Tu(^MN_0Bp{R*9SorGiakZk_EkzE6z0_=H$>Qf8NodS52>` zBxi?g(DO=DZ3=8RD$zAk30-Zvonk>47{42V)U&8(2e{GUwm{P&b>k%|$*z&7cb~Pb zw$&;brDFh@;i963@}g}yDgh~gERAZmw|TY`>2ks`CLnD9m;j>1MC)ED(@fSHtk)FA zs6+PErS67;MDHtQUS3xMs=a1bb5fQ|diS1Wi(`ofqR%;-*98cyDgs3N zqU)BVt2(*lOFUoL=0@VWW|}67f8&aC)x68UEOU3;pXj4*T;^{F)*sT+<~(iAlwi+y zCQ2MPLhuDgW*vLh6@X<3;nbu8O%I7~h3?K{vrRa0>)x@*x0Wf#(zjjB?Og`#zsUp< zKAlA~2z=GODroPCWWRxmoJ>plroYIC@OOqrAt9gc60*zmQ~7DHp5mTj{vL*Yl-fMQ z$6q12HGCeJ%4Y%a(ck$dKXbnuR{nA3MD5PhT58Pwa8%Ov=QB+ae zSs9ak!WV}UIS%@Ht5#A*A-8FJ#BYt$?z}1}xRF(LI`h8nZ1XzBpkaD($`!Zvt&YaS z<4DUl^>y`an;G2c*~$Z=&s9*UGi!&R8;aWTmcpLd{;(ng zn5ov?dqy8|U5okMOlqZBAsZbD&j<5Dq{pZk*lRm4qRasE;Y34n0fJ7il~mYN|KQmWbQU*T%mHt!$FJ0VpW@Urqn$kHltnN;gE?&lJ_P86^feAYrXS zv)@4Lxf)>eK(kK}SLP85n3fvxha?XuS-6{d#yQm}vM~xsSsR^rEFXUL-TIlKb{?sK4+tB64?j#uMiza5I z5b`-lrcV=YIGVys=R%6gf;LGg%;uzTVb{mh7d^>J3PXHpp99efn*ObLvH*0ce$SJi z&ibQJKljeCCYrwMo0OPtr(U zsBhzQu7$Xj*24c>=~n@nsBY{xNMT{%L0X%Zttn2OB0T=r)h9DcixRTYg|X^iS>u?t z9L{a7Rym?oC&!^62K<$yJ4+ne!pbVJsZ|hI#LmvII)%tWE;xS`khDKxp~Zo|UCFb? zWVZ-K7g2=PXS!O^O5J=S<|#v}#uq)i*#9aD@qvrKgb9dm74%~BXS8ks$oaHZiJ@SD zz9zA+|GKKnTww0$D!e})PyqQ(&6_NHqN*KJ5M{(sX*mL-WyDfHl|5J(3Buk5`j$QX zOrXE~TZVo#-sAxi$+{g#M`p~;L%+CSC@^MDw{8H4BBNm%vWvw6WfL9YMphvETVAl_t#=pyiH~;wPgocdmTCr!NEQCCWOxpNlJ&wXQQOCtTPw>~3zd z^CeeBr66dkHCNq};&E3I31Qi9WCDE5;TI)WgSnRzxMlIA9XYAl#XN!01#g0v80pr~ z)Mmw5*Ckp(=Z1uUogqrzb2S~`3@9B;B80`GypJZPR0Pf7ex5{oF~B>%o7x}I=N^7- z)_2-d9km;2{O`>FG26qBm(k`}4<3dO*|d3`?(POwN?L#Aq**@REBk*DKH%Q*k;&N- z-xPTP&97JUhGh=rG(AEUh+6raNH41+d76EywO$zIPf%WaZ!xo8m!N0JJn8p0bY-jC z>uLle7i?FQRpnBXja*HsQyW^S-dXKImQ^A;mN7BH$1I)KY>0RUNtbTY)S3;FSlT>V56+!F^tp1q(U4%3O1F zWtg_~?F)7|ogLZeY{nOy3%t_JN!)?EoV-RXeUi1W#?)sfD?_bydCifA&!F-qY zKu;!U^1xK3V(aS)f9lP8gf;uWXwHAYy64A}Kn!BSD~#ayV|wO#wjwsD7ei6Ln)w;%1L~F`9y6RF&C@uLmt(aP{3*qS4_@$dF zYRpp0w70+nFN|`e8YNY~SXQI=8_$LW*f22P&GzsEUIBrj$ERjUmsyBx1lCX`7C`_i z)>U7ZO$k;$GxQZPO@Z@a2Q7E9OdfEDfih|mt=kPnA`imqxvXvrV;-Hz-12YbQ7z%Y z&YUw^_x5w?!|<}Rye2rc*RK`6(T(wM1+Q0LT4%JZxpH}PzHB!+;GR!c1$m1(*7_3v ztga3Po6O(g699wbuO}=!EnP60q-9KC*)sH>Te{2?*H(=B#=;YFm&f*G!SwDBMP z4u;P*-P)s8GadShJ`$b1|It+|IKau!{o+stPAv=NwMiOzJnCrPC->j8U)gog%+!4h zT>PkbkhAGk;$9q5PNo{f``f=cPhV+Kb+RuJy%H-A#pK4T@4U@|^h$0?l@A=Z%`}8B zp!RS#FGkqqFR7R3A`5HPzv>ik4&!gF3>Xx}sGQ#iog}8}tr<~=^|g|1ht5$Okq2+{ zeb(bt5lL%7<+pX+ywj3KZmR|cHo^PXr4E@KUV*Y3*;^D04l#hxb?p@zvvn*`C~E>% zzzg#K5B%oe2ba#1mL4vU>3d`6?V(E*KTD^%j_s1gP=R>Aby`!dU!l8L z{jrA|(Y^f%8(Il8zwt~qbkl7g!{?V^V;UItGr5}Dl*>6S`6XVlXy%H7z$ZU5cZX}# zMv?tLo3n2)y`m{k^$rh1w>CYZ-l?RC2=MU^R4f|jiS{7B1x#S9o5e=A@CEWwWRBQd z-YN>T23@hLxjG{Gw9Q0Vxm*aBzT=j@ zF=~huDePiv(*{p`6JspUAN3aIR76OdJo4RYu_@kzOW*|an>Yvayrd~n6D86k&vtQv z%KX_t=aT8qi?2;4scGknjC!(<9);C@SA;M4*o`x;zCy5qF9dbD=9VNAhf8lJTJv@!1iTakRMVH%4if=5 zBf#%^uK&1a=Y_ht_QDDO0FYOmMZ%w<_<%U&-bz+JKh*AAG72elN^kzqYeRY}cUNnh zcK?(7A>^Jv@}Wj62J|AfVE6&mc#%UJ`#cbuF<>bK^t z^=FCDogjZs%i4A)qw(|T_L0)G2SOpdC$wA_nJf@@y(yLjg7Q{-wk@$-de1f_`0vC5 zZgyT`%Oi_52xqh5-!-tSQ}FE^c?@|5)=UA&c3in{U;&m5N0F6T^d{jdJ1ekQ!} z3I+A8QOv8>wWyh^i!<^L?@lUI{?PIln{G$2qY3B=rb!dU!gmQYeDR<$*|XKMazErvt0 z&|)6J6t@~jZkNg@R0hSrGUIt>zJbQUgEXrCri0 zccF;LLwe&e2gkF8?BYiMrggBkh;Ses`Z4X0URn&Vli@dGjd8FC?iCoGJj@bbz1pbKG5fFi&5#ft)p}FFTFxz+rF*T!r@B@Rc+{Cfli#pQz>nkG%_Yyd zdq2Gk^e`|K8p*$vb5+!JsB|BFoW%%d>NY!{bkr=nX#KI`#i9&$IKk6bqas~d%8*`q z+}gyzH&|U&rW*UFc!D}Ee{s>u)~9iC&_eEOxnY|8P>H!2U}pvwYd0Azk0X4GpOq)_ z83EpZUtxYw+N~w2{MK?bdxdHbQ|-Z?fVauRcjGS(E{YTFxh<%YZYMgg5iM!KhhB-e z2|I?@5fy1gFnf1*g@)G*79t@*c1yiml4R zhvs{?7$UFzCmbH}S_VyX*c%&@0x3{>Mm||QxiZK_Ts*xvSK z)i@TERDAx0*sXrwR45&-XUbLBlkVFMZA?D9^~_Mtacarsa<(}>m`}ge|F)scSydx^ z+OpsEzF1_#8{VnQQ^Ij`?=kI#?cdyE@rAe=L1&2`+tmz!z~hphA6Mp|iizJu^z56k zUYKqvYXr)`VegGdVJh16<_HY8JxYp&_8}zj9@?r9ii?uhY|d^}iii9LbqlZC`jX(N zt2Ya8SY{aK=en+z({&Qz8yoT&iJ4x5%iTrJ!+4pI?#tgXt@1f26R8Ab)$U;j1A@+O zMHPfbU6%3DnxYE|NcdZ!B?Gml`G)8lzUHK$s};R0)DVzsDZ_~wmr9nADhNz+U&?OW z{td;cUi$tZj1F5*nXhYqIZ<%yl(*dKV$~XJ3a~n8g44V&Y6zL;cd*sxIdS+CAzT9s z+Jm@3Qh?%2E1aReny;MFO+O-}0K1ho_J;Sr4iwKD$31Vns&4no>~%uP?9)3eE9Y^v zLDs0>nT8e@2p|h!sbLnaO#qbc7fbJlpIw04|3h<(E~(Z@euA9rB`l>YH=XWOi~JH2 zU!>^NdHB)CtVtL(8Pq+kthJy?lG?3C41OVZ;$)j>Gh<;u-gWoB%V-(z!z~-r*WHKm zCV!fnw*FMQCkq_E4&A|{?SOBtGm3T|Hu5WI^0(`CKwfVM#bfPXmPvgD+mHdL;OeW+ zVi@{A4oTHskoijFwR@~~eT((~*IA0wuL8%;maU)*L5<^gPKGO4g~7RttAjK~kw7oO zS-`;6;}p9W#965I2Gs~`IvQS4w;OwmAY?vShHh{_0aPFJv60Sym$&2oR*(ydC!>cj0&^VO1lU~jY-pL&)GSeu7}%L z#0Sz^(iNCk_J)g4|kLpzL~u0i_NfPHTL`kKY(u~mE= z#;$L~vqo^MiBYK&Y$bp!B<^pJg849gLa;*XC=YBhKc+x8czjexu?B->z4-BFb|$%q zcKTJ|?Z>`vqJR*U&)fgQF8Ro%OG%?i>xSs#l5#nTZNRYn(|Fq5yy6sBIcp$6Wijls zm83#syJ<`qK*|vEF)B|f{a#x0T-og8=l@^qV`}tcq;5#`K$Xfo_MQaY!xe+Rq4N8} zO|8U)PiGZLZ2S^JRHvG z1bz76hup4o_^@G6G|e9wngM$W(N`kzta&XSvRlb=`S-P7qMx&WEId&i-}F+|Tp8sqI4X=MA)^^KiG74Bq-Lf*uEaO&$6tU%j?=pvorr24h-4 z(oJP%7o*DInYP&9hTaY>ut|{ak|Jz;4-N2<*P9DRwEG29;tTivCakDl>cccR(U5Uv z=f~DAoM&rS))1b30W%mI89!Rltt1ejdDvCa)!k#~p1*m7MH(-X7LF$4-tz@b&!d`)F!oFcY?=Ji#n3pq1jOQ?SsZ?Z%n8{S%>*tS91!Nu zX1`Sv=wH;SCI!}}xNkpPhv@@1%Cf~bSFVWZYa5O$l>sKs`MQ4@;)sv_MkpmP4L=k) zk=DKZB$fA)bU&X5DsHH)TUNTzB z=YVC}*gBa3M~z3UHvQ_yT}Sq}tw%m+xOpiz>xj1m<<%U?VX0N_U~3-ZDJyQq7Hd+} zDf9Lssg#aR7w`dHR3rXhxz1<1-4kXQmaf&a;m+XUv44v~sui2I2uCOJb*^2yy2z8n zaazcyCDjKQC7EBB)c?aoGllezuV)K(IHie?c8U|MdVb`|I@mdL(s+^}s280@Up}yr zCh&M>VQLSXK#z%)f%_CX)Yb+uYU>UO)R2}FF(B%`&>_aeE%Se7ar_lQywu=`)YI{4 zZ#i4_JQ4j_v|A5R&Qnz0TsVX=;g3`tez!1TJ+*9!^3Q-U+Ti^F55+M`E$a*dneLp{ zlOW^hsB7%;$Xk2g{e+N&ZPdsWX7vFFvMp@fKSUGFM}Y$V+4T$QKl|mqVb_j7o_3^e zS+Q@)cEv`USIY!=(ML*a`bC<=#RVInIs(GOA^<$5h$h&Ob0XfRBfElYd4s9;U*h8K zK6YPfAiOV#&0EouX&W1Hl1Ik$raTIlZ>_CV_{7)Yn86*DzZ70KdvG)MnfTeOR4-Y| z_9??SPkxx)qkH6R%pJi?4Z@@5Ix;>EjpUiG2vo(owVXD^p$)bS)RFN|K{JqD=Db8u zNMOsbzziB8w4Eb^PU6oyt_tE!@A$f{09%cOHgSh|R*^X5Zn)bWFNG|7*4b0Tm^Gke z62^Pq(aeHY=K|S*u+|J4P|zmM&K*|a9$L6tg2yC?w3v0JSf1d6=;xU z!Ch)N&LAQ0MOWFkgab*T2hIr@s3=XRpELq{q-;X?GpL~}2XYWlyw*08tLM1YL-)!tk+eU)K5 z3}pK&4U`JG)WBWDXvHe*J@3&eau$nwI#RV_J#;dF-zkD3CICfcPC{tnc39zH= zFW{PHT8CIcT^EP#_G$U)p|#0u%Z5V&cwno3+Ud!^X0WS`n}=VFad9N^EAOJgMl;C2 zWZUc0+s=3oRQ1P337By&l3xi*3MO%yL@dj{--JW;r{)tK+?Q5($uE(LcR9;X;r13s zRUF_Q8RU8ME1x}S`wvVxm(DPnK)jfuz>OUc6`5TwgFoXb8TIdz8Z3it)G+<+$o5K9 z)H&vQ-Kd7!d(Tf{-p94mWiq4nJ`9*hFT?Z*KFrth)u$B*pw&$I>XB9{wL4LIgc*ZE z0NAZG+)R5rkN#SYO=lwHFc)tR#{e!MshK@mrXxkM?|1Hy%&2DSq}G zX=jN0z*Vbn@X{*W@Q^yz%{yRkt$=3$uImrWBmrU^l{5xD2;^O=$M)mJE<8>1yWsV* zRsI>&+oaucCsUOB7%2y$I>T83+nb~e2QRx#nv;;?<6m!FZ>OfbPL5cbQQ%|&9b~NK z$E%6;kTxz?3j?2@5)K6$ZlrI0Juub$=B7a5C)}a1fS+G#6~kkL5|XY#7J(hNbFSiI zi}mLvPBIYVsNDm{e^*{L=#f)K5ai+%QR-cb8vCv%T>xF4)Y)f`Ux^ERzY`JUcr)-r zW9!(e#8lDZ+h$yTR2Q|aPQa5tY)8ZJh)}?+d=L#=kURbn?NVK!V^H|t-z$4YFrE1B z-y(T()Z1C6m;@ z9wNgw<_^j&-%(&U2bC`7nV^ff$vC8U1!L9sA!X>!A3BK$k)2!*X8ARq2b2uxuwez{x*@ zPkJiaS0uM;L%|mu4Ttc}z=^+AQ`WBzL?;PY1Q}4T$|$nGD~zr5N?an8Myj{;WB6~^*=6O>VbxEg9>T%4YCdM#i)Ao>Eh zojFbKM%=X`z0~9X4b?R8VzODZz+`IG^1!-rx4rN4Oa-`JocKnRUl9hoXob**J4}5w zx3=>V9sZAbnmu+Any)P%>CjzC(l#VtI+PkdJh31Hut8!MWXSNL%yc?H&g}(uRB~Q# zXF5K3Q!`u7p{4t>bkUH|?6NE_j-FzVh#qeUql;NZnSY88l@!qHw^92`KuHAqM~UoG z$y=@saYWT)#cX_3QNP&frI@bc$cT75uchT?iT7y%J+~F4x_r~uaM^mH(3sg~H607^ z6rArjcHhUSy&cR*a;oq6jI8DWf0ltS$0O6y8v4P%JIt#o*0;GSB--4!sDQ!u4-1m# zee~q%(T9drHDy>WWx~rVo$mo7P6q+EcNo3(fXG+5*H+eq@CH>2;tBiOSD#$z@}09 zLN8kIiwY}4Io4=GG9B2I%$qx?AM!NrMwP)oLjE1g7uV0~ z0U?{VSWUrg44iI#mrVxnss`kF=Y0+i#~eOjP@QV%o9-TfeH#4nC@c_=PhZ9lt_;7U zx73?KjduR98aAk&^O85xDx+RB0@>|(oGD6Qh#x+2XP=C_{mUh7<#+#Xt-Pu6pvZvO zxmOEg*17lVj4!R6u+8s%y!_C-VQ?m&9_6?B$FoNmW@vN`0huK?8%w`G8&Ajgr5)OzW-8h^ zbYJ4D#JbS+w5Tja&&zu~??wlU3cWN;?mOXk$3*wUk?%(u#snUR%iRJv=3B)cwWTeF zNcaABDrWBldj0ddt}+?}PuQBDm@jpWR@$^o^@lvNO7n*lA{6uF^xG;G2vAwd65kxY z>uGGMhSmM?_)PEnJ+7z?n;#LxQ;!cAPEKWjBlWaC*hpP}IQE1%LL~;)XD|LfbPaor zZ-kPU3;!Qm-vQKA`n??@idhv-Aq(lLw7exi6 z*H9BwAQYw7P=eGzXn_zyAjx;LtGoWb`Oh$!D|k!Jd&={i@?M*O$+f<9RWwa zC};O4pPDIFCHpvm#cxUgZc&w6SAXg*WXk>ov~i*RrG(n#Zi$2j)(IYZ2n5j#v5BsJ zxLLr+^O*@)-o&>=_i@08-@(v*Vd-&Id;aK^vHk&AH~hUB5HV?nJvhxV%&YmpMwj!AD13RvIIG^&`oRE}sr9%NkxXS4@p&&6 zkZ+sUmj~|zp+&=7Dz2l9E7!5UEMXiV)*GZ1Z2e8UquJ;8J<7kJ^tXGF4$l$EUa$o{ zFHgR`X(8xvbYxkbPwbx1wu*9>xrh!h`>SBy3D{q?F5p4O=A1mlOOLXobC!t&>P*vt zcQ}8%%%>*FQ#!*Es$BbS_7cdj8p{~1aE#?R4{oNLvNk;nO>}A0Oc}j`S#P=Ci2U#~ z&h+Sq;aJ<+eUPvr>9W~c85fUxmG!UquU^O`m?2*I03{>At+Bk}*4WS_UVlE#>150; z2_=h&GE~QSpleUk)*b4Y-$|yIi=9z!H!Iw1eRGji66cZHm;-GLXR)f(jP78w+UIheKKrF9LO$qJ;_!ZK`+I2T2J)1wl0r04?tUVa+WSRuyb2r`98NE4ux@sc%L^#E{ZB4yC zB^O11bX@%1Uyi~3bW;DFjx3$d!_h?8*v*gv(w!3xLp?G*an*S`X?ZhX?L--Ia{gif z?9y2A#&J74sRK?~o%K|sIG$@*;KC{g+u^hWlxq(=;mjvyA4wpdgYN6Ly7?L2(qEWK9ktkRlGuj7hUgrd`z>#T6v z{1j}M&`>1R6siGuvgApbtr&4FkVnV0fmiQ0`{9Wr>mQHQiZjv`sjc*0HtOkKM>sjW zq1xE`Tn2qO&-54asqm@tZVG(Emr!y(=LF4ht6@m6yMgqlgA&c7{=~wa=%%hz6tn|A>?i|y% z_-SZBC_l@RzPYPtB}5uEbp(rh)&L6ZS%c|%m8P|M9d5z;+;{4;?Zsg$UFw~W&(os8 zqV&yKYxkojK1h!ACg{#9#CzV5?If6)bNzkrnCN=xc84!kN_5&I?Rw9 zA0?`;=2IwN>2#VjW`WOBUxzRKc&*$HMh?9G;5*yCchF-Y^Z}uGdh#Bc)Tb-4y@vBR zv2Pj)mOfy&ei{^2|BnwCQ3`*%Ifa^un%QbOu~N5`IzF^)Q_)`S6a%BZB}A9Fgpwc{ z#U@NJOKN9LlpSdiAlpqSOS~D2OVF!c8K%cY0?;CE!8G_I+cn|LWm^H`&yX+?r%#{W#nHATS8);2D}tVb7u+tvy_x@(ahQyPnP^B|RJ zoyXP{r?^Eag)VKRqjMIVc`#)ozJ*GPho8mQ0Ww~F;3(IOE$=|I%0&}CCG2WBYIVfR z;2y$FvS-EFIjWX4e9Ck6a=k9juPjLe3 zF~x~UwNngNVM!OQ_e)++fMH85b?K1?ZO`0)(IIIVSbKOM@>TYx>N5xRKVCY0>oxE# zDzvouz!<*naMzr|_IHz8E5~{WPuhe4CfU|&slMT){zut_h%Z9+)Pf480~G5>=M%x09$5&wV*;S`Zgu30hhGB z<3xp^Gm%FOiH=}|sG#8*rprDv3%~g!DjrH>vkthKP1eE1o?vMJmktj(n7t($mAypvrJ{vViJQ z3DawPX|K1_N*u)-`F?6hsW$jrM#W!VQ|ZdHcKxhK+2y`>4z_&dyeD0gXg}%^)>(00 zE+G#w8Gco=*ukYL%}CL&>C|eVJTr3O$N{Q349{GAyiO0%@C9gc;8g=N&0t7OY1(|e zU(tfqW}};n-?db`OEgP%1>t4O_@FhN?qzB4r6%ADEmbq}{8P8Wt2lZ%$HyMj4s1=A z8NBsaQ5%CMx0G>|%8!rnxc5>sk2!{1fXQPUT)MW4 zz(P671sJ5pQsghqa7M~oy<@e#gDwq}Gw8nXn7PF4-3On8|1 zuu~?7X0`M^QfxxxhyY_XQ%)a8$SK2z?kG9WJyrAzy(uq`+KSW%5KAO%kDu0jaQ#S1 zG$=qMPC`b{1owVa{12?pt1!1EC&V#DS7YeyH|}EM77YRaEUI+4)3K)7vTCC^pK}C- zdP!a`CDE`#33G9Gp3E)#(yZ2=acPErwdF2ORB>A&JRi`brU69hg1;wgz%6@kE4B77 z;;UZqFDp213=JM|qdu>5Si&!eg*jXsZT*`9HnEZofmZiPM$H&c*$K506X!a&7$+fd zPd(;(=;@64Xz+lQKNHPC1lGoHkn(Ej(hk$_C!78faCP}<(YnWaHj^_e-dXwTvfr;z zfLtakaMvpf^2n`vjo(wZtS-v}Y`c(oxk8;#-Oc&jfsmX#$a-Z6p2vMHp=o(+KV=^G z3`ZYx>=AS^nA-RY?yzZ19~n-Ih47ybU!%Q{GAv^vcH`Y|1&L9Z5kBpO#C!1=m5aH< zd^MUsKB~64$YSd)GQtG2+Ds4}*j`Pnt-V``;P(rpDFKm9scX|GIQE8JKbQ_IylokS z-ZqKW#A;g$LK>xA9_^5<1c#5azOBR0b{H{*XCxGAIQdgDOo}|kb8sMjHTCfMGtf5s zh8Y`MgK?)XiVFqa)t0GEi2zHmxuMhVBNMK1tS4bkFp_-pr#*PSWS!1!EbD4tPq4z9 z=DO?6^(ZubJjAvnv{HjRai}$nXqO>GmXpLcq%@f_<7%N!t5-@>9HcPV`yLV(mut8E z&z0B!MP7LG*7W7Lq@9m>q+S1r;tC>=V+U^=5js@>)jk+V;w4z36yv+m9XN`Oq#^GZ z-;vV#F5qpWE0C9KUA3$3SaJgxKv;#K&W{CL>wN7?-&)7_N&Go}V~BtF7SYYYPV?T% z2#V0DnfSz-+^3tr@(jX%EZi^zAE9DVyR@}y+$u-C`|Wzi=YB#Y$}rKTF7>?ZO@>iq zkTt`B>Nk2`bI_yftwu@TmmKmDmR1$gw!smd^y#A*#_j8jqQ*qjM_+)wHAL-Y6pwqc~;C~3$AzGQ^39SvL3`q zF7xV|6xQ?fYwFvW11ea0A)agp*0~%O4bqW!FdY23(&F0LZ)yx4cnfgli>)Z|))`O! z=&SD@OzQGk}5TZsO{MsYYt-leL@(-wM zdaTuu876IIoaf$q_VzoC<}$?6B_)$#Vb0O=;KXo$dv;6L90V3<=kDb3C?r_CiG|W* z9KP$!D(nyK^e&t5W9pR}|B8cw7LIf}SyNzTn(w4NaFG$r+=XL3!F}#B$2lg%*Qb~M zg22~ZP^wh`R?!ysWbCOwWt91&)vDk#fW3^xzTz4o?uc3$o`K*=Cq=LY2D|l*Fz_pA zLyo}q3L;=c@U=<$kw?^%apX_YFv~1)Kuh#CYl80n8}^w8rSjqTZkZ;0J~d}|L+~h< zzd@>7>p%K0!%T3?2)K3slH=b=rAk)YcP9yllOalv3XPRMmY)cY@%UDTQMObHKg$d| z#}S_v?0=yF8!($*wp2KO@Wu$Y8hg7N2JIA*MrMmRB~)5lbOhbh#Ngbwbe=De@{wiX zbGZx&DlYBKgu^>5s+H@c_a|_icaY!4hZZYhtj7vQc2Crq;t*WaBKaOy{xOhzkobY#imqn&X)#n8GCl1S$S5T(%owQ3CObLo>IN zzg@%x4In;PMQgMw&X3ro7pFBHXX^h8ok1Vje>n3`=BxlYEVk}aH{qnz{4HZ&S<&X( zbU#V`sbpr(A~}vMIRD9`)T<59nnzcZ$wmUZzbH3wdblQ-81$~}Tvn-1gh7eSyT+xF z?m6*o_IyG9^?@LpOg(h1K0Xe-=ryg({O>?!b? z@8MR=dAREpl1)^M${tH|;&4-h}gVdWMkQO(`7D^0< z=X^3WEm7ptNfmMO+s7WWEsAHCA{r(n^!T)pEaE6uT|cn9NUr-5j+C~!GUntbgM z1HqY?m=uX-&3t+0mkx0_vt8z;9@8RowqF+eP+(%Sr_bX?`csa0V>xMEEg_w^f}N$`=@oqr-(`DzJq`CPXJ3bVHcbzSI`)B z^m105V!@jN>T<zINUTBr;@n-RO9yA zhn);U2JZSjKaqI&SF9CJs@9Xt0{O=r3R@RrE zv1e7%|JX=wYgJv)nMZ!Nw$oNyjT!y`NpAW#gZi7+0@)0GK?ObW+P{Q!gO`aOCvl3@ zuR6n;Z)R!=ln=lUmX$7!wbH3TBW~RaC*Vr`l(C)H4&u}9ski63XS~dTk`S7AOg4p9 z-XdVPO$a6BzSKO#9juAT&Ua8lj2JE?&VK5-QjJ8WePk>C6b~;u6Ck6klEu*lmfYy>p!j zipupM49^n`DWA0&ZGZTB^os)-E+--D?ymoIi#-g)HEp)^rFjVihURgm#Q2F7y|k-$ zqsJt8_Qt8rNdoniyUaZCU`lP|FOv07_|;-#(VtTLc2%tSg7nRg;ePFdU2a@FBESm8 z5c8BjRzXM^p43MK_L@)Kn!B0;Gcz6PV}MJ0IMes*_BL{0V#pywV)`LVS8bt{J8X@} zucw=4qT+qKw8mZz+gJKKfssr|kA$(RqacM^*=tYwa?Sk?HeQR;!CKQ6ZOB+jp@XLmqtj_7COC*IJXv#z6W?Ekra8;`bK;6FZC}P26Wwx66 zRhFM?X{xP00^cBnZ@N#67>U3Z^gU@}sR| z_Xee*=tOHwTs+q1 zh*|9Fm-~qv{}wBcN_hPIh0~X9Kk{*L<4sNYki!yM^Vg)!5R+}=dm^t_2HW}5fq#65 z_IbiA0hei-l)n2D;r&Y96<*GMGjf#;c*npuUmy~#FaZ(S6q^89PS?U+uP{Wq+648* zYTiK>8jk$}hXau2O|kit-6{XMJm7i4Et%&Qw_!^l{KDY@7vKFb@l`@Pf2th|7G76a z3lfX%qnEqh0@9Q^SEfGi1ZI}tN@O{Z=`;exppt>u5s?>#lim0ENaC9=?drD z%U@c?w89;ZwUpJi&&@D)UVRh( z{ertHTjfk>^jiUXPn8`9@AlWMw~o?UfVu4pD_j*18{DKkDD)Vb&`9b(?*q2%N+=o< zlYSI_OVVq|cO}$Zczv#|(1mUaNk{`u2%86tgl>BdXN3`MTox2!JxUhGK5c^`F+D;p(dq7PcGu;5K2L-_gP z&RJ_0V&aYZo~=0OQXkXmG^y09S!G?6J*pTa2?kuaM+c+&KTFIk$mNMuzx2YH3k$Zf ziZjDDmquyk8;EO!)~=|9`3kP}8u|WD{M|2>?buC-@9}nVeml|Th%3uVIW7PlwIo5v zpK@Y#nODvO^inJK1v6yd0aG1N0kB&uHa`p?4cqj_3@XxxOW7VwrN3X%&Kx^#H@w+- ze4(a29eZd)X_ES=vhT`c02(ecJ*!PB>v|rW$A9thpYDjiKe;5PJV1JTpx~h2|J-@> zc~%TYHF&e%8=%l#bKfJ@)??F7qEB75cSdQyU!u0D4>`G^M7_p80J*tc3L=R7gIw*L zPFHpOGy3VzD|xQ7I=3H^Xc2w3qJ7>Y6Lb?nSM-R&+aVt2HlYn*;w^hFYL)idu*5P0 zzRLP)2iH34CCx3n9wmQ*A~U>v=fy@amu>uyaK|JQq--&pLb$fDXBuSS)Vd0ZC-PXH zFPA7e0zOo4y4BJ%?4L3Vypwu|(C^zKIH!8z(N|4E#dDgiMjX;rqxEUfcx1@sG2bN^ zJqJ4S_Is=^_NJgN_VVaozMcXbGR>$SJ?(d~jIIv&C*5c6dXE7c7Wd-Ofc&<=;rfu~ z=D&s(lcN3v*ww;@IIorX^&;YF1QMdP=|5QP-V(h~bCV22j0e=6839VHzeR4A48C*SVQqI8(ECFGc zr;I%s6R_?~v2X^EPeVn3H=ilFwwi7dM^}s%%|*iuxLE*h;m4QX2$buVQ^P!1MilPv z{#&*A&nJZ+M$UKTJ$+SKUsNSo{!k?kX|1;+^1e zH&yx+Nb%==!y(6bR2gyfJylPZe)v|!H$&12Ia^4bF)@8T`glE0$DaSit(uS^mZ_RJ zq$7~$l0F4SQ>kfAiq!fAZSGh36@22-GGId~DG9}#C_~3i57YV^@ijFdMxnnz3X10$ z)omB`o1=oB+vhl>rmnqp%(5$ z`4lZ)kOK&s6$qbWm+_l4!XV#(ML$0Tc^<{fTy*bbP|9Ng0{$sgR!!$Q?5t0qw${$& zYC4s1BsYI3Bm#3AQMlmnAH)7v3BtqBESxqq&j0f#W0CAEO6$(WT-@E~f2RR}RZ><5 zo31so4)@RT+uy%jr#N-BNu#Xxelq#D9cHx#E*Mfv_W(x z7QM66{eg@O9W?n!-VXVSxwR{l1ni=>9X}cCbu?gO`mg=7+XYYTo*aRn-BRSZp+`|* zm*PBg6sbQ|3ZYDpOA%Q)|0xO3K&RC=nv`hZ{w4DzQy$Avz!xZ$=n?#tyJYeg8!YSe zyDNo0Lwl+ke@n*)JauCg@R}k(IW_6GM5aEg`|fvmKe2P4H(T|^h;aH{KsT9Y(DdUd zk1AR)Xj+53a|EMAO2w{h9hxSLMZV*!4^3vc@5E&wX4F)O;4tg`YGN-hRT;Km_TOQZ4RZxOXnOE9!1nqsu+TD@IWl=^M5>?RM z4^kh=85Q3O_M9K}F=nM`H=G%<=w01>*j>q!Gh{YRsxQzF7pX}U$fs%GC`a;PlP971 z6C<+W{+Z}&g0#@ro-rk_ghp>pr_mbQvnEcj>L*Zsh&svK))7O)d!BoJh7tyxM!CP< zwBGu#qKPYQe6tM|D0$y@DCv{=nfcdP(ZG z6_|`Q_SmCz1DgY*N%#!;xqAQAkA8&HcfvF0O(>%&p?k?&&}}}3@D5|qnqlvZCVY+< zpub(CUUp{m!l#38?M_HFCSu(SuWE5Deb~E^bj#-s4XX~)o?iDj>-$B+O0MKW1BVKE>t{*t=kKN>tyJ9(% zZ~k%CR(c3w)=k4#xv-L#$S-M5F2i)+hQYBKrSb);L$OHYAg%siCe-8yk@kuhHeEQQ zhc9jVtm<1fPCC2Wn?wMd0p<#T2{6758e>sM@xfZhB+pY%930aA{PfjUP<_%*$1`vc zKl3WcBsXMo2X60{GkjTlO?PF?T|Jbp{&c;sF*v`` zX{P1%9_>5&m>xQJc<1y6NfhUhzIyRO29|qv8ojlhx#d5b!h*t}dQ16A;gMe5dbuh}AC;^RYo%9ZgbrP(54nYk!(r2%%N;^EwzSiM?hpnFH6)Z`H#%mIM0;axC|7NwH|-*v#RbOm7XVxfhB% zCcA~MNcy-n1DCL#OQ)B7AZP9TfW~9jg6CcjXp&o#GUpu)EIQ?cgFIen`UQw2!*{;y z9(?C{u>LeBSE#_(L##KN-F|B}`N#SH{mBmszZZYfftcXjk+Tf?i09-;23h-f{b6*% zIyzCuY@T}6<VAS_tRI==$5{DAW(4FQi`CwgXjfhG`N08HP`3|CBtsvmonHCA8G{(CSw1Om$sj%|A1PNC{UCH3 zg)(^J;JbGjOV6nJjn!(j4OkAy1-)=wiZu$!H8i->Frjc@U@Q*ZZJotlCTuWqYHe)5 zYRnRL^w7-x{OaDTzC3JvuBIkw4%jMGRe-Z>98M{Y3ebNTtVk_{30d~+@Vv=d(OMyP zh^;sGBf}()lN=hq4%q%e(BT?Kr-tdT_9`-;#SxyDX(~;tOe}0)cIyRkTPc-w9lKgs z@!s`^jaB$$8YJd55Oi9D?D>DW#J{n^Bv22mK4S;Ck28q!#{Em-aq)nvB&%EdEAWyM z``KkZfTm9?kTB#|yT&hTG?!?4k{I{50euz67Q|^XiF%<9u&@L#A1UAgIeBW(Juj&c z3)IVC`j-FloFJ70O&FYAchOwW9GLW-$#C59A7ach*3s`z32C6Ot$6QG!Ul1W(HCfp zqP5*sdxliV0`k3IgYc8-EJia@oYu`4%DuJg7&?QzwOhHR2ZFKa?#d$#=Tbm(#}syk z9S>Kob$_RmI3D78SrJmQI3e05{8TKk*=vu`jTQK6JxZ=BcapN4BjNO7At>ZHyxi|A z;Aj*f_}$=`4<939f-5I{1)`67VFIcs#l@r;rHW{oVd{!%C;;_={A8Fl+rQY8c_6Ko z{igJa+1~rqjWc|n9$T3QAA*G zrF(1PR(TfroHg;mbR6~Dn)tcexdxS|IuRa>4!EeIzZLxSb~+;pO+kN@fo~W2-`btM z9J*~Ke%x9YA8>)n*kkOCwd1VmPti$OC}{XZotTV81DjOqZfNsJlU`SS32k#m= z6ErC2kYb@uib)T>v@%LI9>z+sZ}GA&Y^ZHBdKr5r)1DI60fdzS`Y@UiY#i(y+ugW% zUcY_K5Q4$;@y$Ou*X@B%{Xp9`qhHc~xh&*RCHyeA?rkVDk%xB9T~T%~ED*r{Od-o| zO#pQhjPehUhlm-UqguN;v8;l8tslCtN+-z(zUlcagvAFNb!ChgMIKfS$q?La4BkGO zb*AhyqXXh!OS*(EE;187SaPQ-+N+>zWro=|IiuW_`2kW0wBnh1!^D&n|E&@69A(Mu zf5loZ_|?w)ATYE5eHw&ocv&cND)I<7ByoQNtUT<(N-b!8d9>mIOIYI^YUJmoZVH89a= zVS@}I32;k-o6ihtRvRtEp-fqyi@6a~ryheGynq+i>`)7Ko)};v5ASy1uI3%F8D&Ow z8&YH&%kMB8Am)&VUrut}9t;O_4W+s#C32dK%bdVoTduWZ0cC9fjsM=R&tJ=K_3}`J zxJI~`Q5sSi2|#USO|Xg7gYBc<^B%O-1v9sfwC)!VrU~9&oJt{2rQC&fdv|EKve|S&d8{6UC$C$%W)vhxZ=!m^< zAOS|)xCngcg%ZO+PB1MI$)81q)^^b%0}g*j&oM-Ihabw1tL5$_(ia%>xEuYS_dAY< z&a$DT6gg1zQ5{3}Q1(nFA(LilNILZ@PA%RAg)w3`eCbsdmPrIQY@g@gqcQ{Y5uXK#?VkJ5Wd3Mb@_iLTFP%F` z60~jxs(dUZX^?Gz8>p8LcVnh&tFK`Zzulqf9xEj_H$GH>_G(YM{a)u=wW2G+;u&QI zj_TsOnwolrDe5z4ce}Ho9w=voDzpgmmHaSTb$T|JT9|W0VAs?Ayvydt7)?B%-Nmbt zq|ZE+M^sLn;Z#$kT;v0O$#JOJAnT=6_02(#@XycSI`&v%$3pe(A}S6+eOfHqD;+2&TB#b`{F7z_%dR+e3f z=YV@fE`N?-`);7I%XYaqwdpG0KueEm`cEo^>*Gii@rDZJ$S&`lH)9!3%cL-K{K<-L z5_3lti#x7pk55w5$2UuwW;00}yqA`(mTGBzd;SqE4_D@)lrKrQaPT!awS9m-t%fiT z#tUxqU(k#)bu$j$%AH)Dd~KZkNcqm>mrbfFA|NPLAhAES% z`baL?R*GVD1!m&ln{XQLEQ+In>g>$;fn!+a!yd*OqBF8sdQ|x%72k?PBe#MiH`nS9 z4=iuZ%WM|(s9BZUUeI)XV=(3WAUtxw|oOw|J@>-R-;GQ3B6-=NNX9nYKja%pb} zJpaO!M{QXx0si>wm>K~ujXQzMKI>>Rl;1BadsSoAnLw^Q*f!W-DZVhuL?6F?_(3e8 zf2kYtzlsrd+Nib$>;3ULbBl)s(eB1CB;G4?U1tL!KosWHId(*CS#Lc*LNH2UtTYOu ze#~DKPl{4a2&7)+i-K}0uV}N4<(2FG1cp>K%DLqxxaj<&W8mc8q^cIDa;RyDd*!AW9vU zJ7bvA^Z|ZVyUKat5&M{LG8xNwS^<&a>esO+%(+ovP(OI zgN`aObaQLi+&djb-_2sY9$;=wIyd01Bp>S3dE~kFb{;{4Jm-9tuxJD)c4`S$x#uwBW1BYoA(q8V5RcIR?6_7fpgGU~_Ywl6GwgDf z^=_oVQr*EGrDwk4(hmT1%Cp()<@(=MfM&lhxu32zJhHoVSb*R>LtZ`DYF|@7zXFl#?qb^_=)qg$#!@uA1vc9w8T>(F#RN^{6}f>RjF(X&Vh8chKW( z1Ir&c5NAVAu1y0YY@jC5B-O-`9~{s>+Z5krd#Jx(v)Z|C6$hF4#D|HdDc{xSUa?RL zcVkw=70+NX4t=&2Ai|QX&C^@7Y%xPuzr7;qIo*oR%DNL8W~)b*-y*|6Zu`U8!}p>q&YvD6!&*M#3X} z%>_-G6icfNo&%!k7t)7_-@prbQ=Umu=Xu7?s0iwA@!FYKTBp&bl6*&U*cHcZGh~zc zPrWQTkt-+F-TYe(aH{9v_^k8b?2GHs;?j|d-?d}8$7@?u9d?y9d6J@3blc7#vZ%&! z6rM5Pz_2s!ELv&hHJ%{z$`pJ~TrAyggJblRn~YUagc#B^_uJfmRfOMieLQEwlRagc z&)CWSAuwmus)@09d}y>(P`CW;k+Jiixw71SOi+5{SD>6O0bnrl5Ibq1kCpuuK*`vN zc`6Tn5xRda82;g)a4#a*0u+`Web9pQdAla}{)b<^^TXZj!GEK&qk_jH?ZIr?!s7*j z(lRBS4*`>vYSY+S(nb9-LKX0Dl&JUR2=IFz9aEE$u|S4~Y#QB0E(IAj*7Wz9Z!d3N z!nc<3d!`uH*44>e(cdyNZ|&T!%t{|0haWU14!tOGd$mj08$`2bHz+kOSg*AY6MaMH z{*dRY8}iGv4y?OVodn4!4p5&ArJmo}^?)yVK)a`ThB~1&n8=cb&Q(Lpgy=bwLD+2o0z~Q9*LEkwudE^1CC}#XU>hC24J+?t4g8&Sz{g*7V%8W`>ju^J0Ik3+yKMw9owyl z7tKm4Sp){r)@GRyM1leg#-t}-6Y+{X67Sq`)WdBuk;oN52?k%MkOO_I0P5mgqEzGIJEm*?|N~`I$PONnY7ckw)UzI?MbFg@}2ep75O-Q(` zGFWu7FK=ZllYz7j7HKI!9#1j`QdJs@RJG-~4Utj8g^l5&gog3WBHEVVx;ODCa{Tet z)+7)qa~oeU!N;v_dy04tahHvkaXDZ~gH$x^lWCA*$sqEOq_%rHmk(41%!VIGMBui3 z;|#qltsR3^EF8kd(JjUz$5BO&;5N`)xuX6~32j>H0~x)u50{2bLqWwHUF0=)KI|Qi z$!`=Y3U9Uqhrb?KR+b zGBy+Hw^tPpfl7mk(=F}5*j$3Cot|i)Ow_Z(QSyodPC3#0^r}yxgSV~jX@$iRPuHS> zmte(21240_nYAdHmc?T)M4lOWDYAo6I?S`re#FtP+x?gj*5!3Ss|HHsBY_@x=TC~^Wj0`XLH<^*Xkgy(SVz%zS0-^ z`)%}W^ugDtkD|+yrHut0u>LRH#9Q^=$-tLi8b1?FRkL5#PBVK9-3@{d7{NnBa~Fkn zz4@gzpwM%NSd?&ogq^2etapj_TQ3P7@ZTvNXH{g5?(0M9{+D4SHyJ>rRpPG89fOH3 z=nbV%X1GEJdLvZ_PR)QpTcl3!`5A*7OFQih*RuO>YJ7l^B(lRO8(7hc{az%Ha$1fD z9^CKxFiPLXmX-9z!%YbLC~|dY*!QXo36oJuVP&#O$s_4I2a=(@Llmxmx)OpOe1$;Fau7E<3CYbaVGLnEF&uQ+d*@Yt+v0=U|k- zrW~sGhyIJ*F19U@E?3iar+%)sWCN70;rO$kun8D=8B<2G@6>$XT$3%kU{~=~yVP!2 zX}Bs`Vxfa-wxjZe!l}hyP&323kCK8uQ@_}0&5I8{c%N|^G_&~FGp!_}IQhH~H}I8W z2m#6`xkgTgzvXJ~(NYf2L&!DigtWD{kxY_y{JU_Ww4&qp3I5Gn-+Si+vUTh#Wfybzjg4y@?TSo47Y zrMOK$9F{93*-t^!T4x4O#*!V40+Qjzum@MKH&Cm|yY1gny&G_4R-65~5wKla`TPg- zp#^xG5>?W!UxQlupbehIMp{Y3DNYY>J66uXVMMo2Uv*0wH@BYGc5AjHW-bfnxui81 zwQ}@Ki7eej;K13EaaDS-JnI+_UU+rN|Is)t9SF9Bu+LrdG_~G;fJ@}>Zq;hbxF%K1 z1C{Rjs!QWu)(-MrDYV`sS?a|!Bq%RVQBvQ=7*NI$Ky81Peg7d-O@fet_^)SXrmyHf zlRld}A*c7f}D<=D$fwf<)7-MW-@R z)3TCK5X_Q|i1Qs|W}e(`R&sDD9|P~Ok8f-$?z~y(HR=hb3&9rMqF!y2zBkv3ef)41 zq4jX$RuQeL2$_e>R1w~`cVP^zeT&wHT@Aw`SC1ym4A1zH&mi zcRIAIrfQ}i^x*<=QSRtFkAcW(uC*3T%y6b5%F$}Yyg^>ri9ooR#rt;C*lO-jXZy?) z#e464aEd#5ySB5^X*yhJwI7Qrs}pF|#wLD%lrIRc`%H z05*-*a(RUeh$;_I1I-y#4`r_cP5jcTOg1rb%1i5asURkW9zh^izYn zcibWaeP8bj5k+&w)i>=bHe#&T76nlfYQfOKw8V18NvyI)Vqw3wtMRKd#7M&{+Zc=LSEJ% zMK+<|OBe}5YoDSSLwmEl?A{HUTht`kFbyOf-QAdSwIQcFy{%uj+C3(#Y4LSKrqbcS z3DM{9Bz$+!g+xt(s+DiY+$AP++^Nn%kp}hxevK zM0EGQgd?4pb*M^2iQ~UHZ$Jr4MZ=Q;e^)Oj^X%`cJR+cX+u!cNz##!=5{kUfa8U=n$yi+e>1|j%9h_#gZ8Uk#_^S-WGX7 z>+E=ogw3J+E*)%#;Y`0HXXU)e6HTpn}3kQJTD$T@%|O6|x#DzwCx) zytf%2Ne&b2rqJKP5Akt4U}H{;5Vx!k4Z^t;{(5tPx#2=*eEI)2*XSi`U094MPkwYu z(1ELE+9{=JmYI$4jvV0neeMF7pBG213lR9DAu>Q%0oVv2jaFu1&QAG{xX-^q8k@7= zs%AC60ic1TIG;efb|GTy&%<4Y?$El4hbBU>;mrsJ3byq;cQB_Fx{*5Ms*!dQ2m=Fo zrqv4IDy5Vn6{)y}I+T8D!ET*kLwk^K7EGhKc*F7?0v8hht;BpgQNq`0Hh4193OaZ4 zw1;=^8GYXpWQe2n2VV_otzAJllH%ea6&`Npu! z#(-DY?KRi!_~|N%?gR!d9=#pB5E|zNmj7{e<=#8mcH_yg)NcISPUsw<*vpupEOtdg zoFOCaO%>5aX4symUbm~pnGWPBR$iW^J0-dwh zST_VZlrM^H4easUB7W@Sr| zHbgm@MKP(W_6?=Rgvm8JS??i39j*AQDSrq7Av!XeTl)KW$($fuU`iCXS)^`01GzcZ zAN1hzIj#MtSN@ziSCV(!$oB*l(lwbc!oYk8OV>*s7_BYzUvppUuzzCj8 z5An)y*)n@Fffix_gGB%VgM4w+?tg&UQ>|UUlf2ct?h&n?%Ta-D_fK_sE)y}PE?d|= zVROHdoyu=OE%6y}s=H~8Ul^;iMAV&+WsBE0sxj6M#r36w!O2PjGdEUu;2URfcIuCe za*2m=5m_Qb^f_k{KD@?w-$iSVAVl3GXm9Y}!Ui=;SU>Xs@Xu%Ds`N13Sr{2sP=9yN zIU8{B)NTKu)HUKz@ch=>!$lMaaPF}%O_6Nh5PNV@@VBiw;hBs!xx>$_psI9Xjw9FR zbLoj$)M4%zK_OUUW`_pFLo+b`Ic#b$$vC*b6}Oi$oDfYW8aOMlr-#vDt&5db^+sk( z)X76zH-)@>`+l)>pW}uWu6gd9g&R6OPmKlBF`|NY` zA!c+1Hq5aB?=m3=>?WD#cU>3vZ2Dyudat~(0_&9mbr8KcK;+{7*ECN37v7cS0Wr9q z;L3yD>tf})Y9PyfN6@TZW+lXg`BsD@EaJw`MK`Fqn_}9v|zX9!m z5DO%*Mwxc;Y4LN8ZJiK+47Tfk=^HRlHQz4fn2gAZ{K~6%{h2|zZ86dYIo)smO#$WI z+C9^$@#DJLNvdA>>7xnbsAF&})I90XNuqdU3D2w`;DQRi23+hvEJmyfxTc;fixLcT zsf|P{WNx_cS0)|acjOGx9AmOa(CC|smr{F4c@%mfco7#w`vX@|u_-?}X1FP*8t)z3 zx~95HrY{`^U{CMVDs!g>c|ZW?V>^D4fqw#PsU|Z*a1uyu|G=KV7v?`K z_*+5wI%l5PyqE2@Z%JiQFtVADkL&L2R2gtH=1|bh1>40}oII-6S5JQZID;eS?hE>V zWW9Gh+i&+j9%-y`_}=n;5l9skT;)AZG2og_hcTQ(LRGsaYdhn-Z%wvA5a; z!7uu`-}l}3_xF#-LmtWNb&YeLXI$qzuim{oWnA^ESL=(EL#!xf-X5n;ujbWy{kLZ1 zR_4py%IDNL_3vh3CBMx)Tv5#*4QZ>QlBZ!M2g7^&TfMuYK26IF_fXYRfzo)EsKv4y zrpel5(hcyMF}+<^sdp!9Dvgsi7n0pXhi6qscSG;at%uISGMRt!%prYVch=s^_M&=I zu={#35SC-B>0)Rj$z!u7b^P>aCUaEj3IDMTwJQB7BalhQf|=4D5eisn zr9q?$f;QfkCo$`~e)db5NZHr@W}5TDlBwZqIk%!!ME>{-zKoVYCQkP@Z>4wN|F31P zk-_5lRJJAf-wM(8k3ulyesEKa=zA#~&~)um&Bl65|4$$I12hTvjf;;0)X2Ln%f6+N z^s3Iq5VnnB+p6JUY!wl<C3d2H%(=K# zb!w>k*Av;1Wd3TgSD>OOUB^MLw^y#6Ya5E5htH_rGRAiWSI!!h&`Jh0FX{}>>jI_~ zA)@$og4Y%`;wRmEf;M5YOr2bt&sP72%qsQpd`5osSa;-Wsar&%*R_f7z21)f zVw*qO^PkOgPyxl1n;;q+^;yajc*x1(I}Q#G+JOyhNpgN7^eWW_kTu=wsvv{Q^Rrx% znsMQtY}h_B?%4EQ+f{#t__M8uELNN334Zf)ZFwhTj{S49&5P{#%iinpC~zLivje$RucC_c4Mpu4h!9v475Zi=D}^!4-Q@A}QqsM1S#l%wB2 z`JmD{z#|ZM)eHiE%fSV@_K4^d&SJ~`0+z3j{5`d5ito%32C=Gokjc{7kBsLQlcKXe z65MiRMt%HX+p1)zoCz)Bme_neKFoe5K7X1ydn`Fkr2ULlFL~^x7G(g4g@UL0a7?A+ zwAa=6<4N(RWl4?5fOq9%`fcc?5d}>69!~MG7sgd$eHQqc(x_l4$5-8tSba6Vnu-@` zp$Qj*`ZlcvzCK6}X6eGZJL=(euChZpkDCe9J|YYO);`OTjslM!)N6vMp?cXTbG@62 zi&l~Bi&$b@W*oIcYH&*HgDJ`^LzV+5{6gamN*sw~P zy#Y@};If*8?+x;~A~Pked9wMKF6M_|^t2?xWw?HcySw5&U&O>v<3~DlV+RWv9Zs)zuGIdiX?MvKeKIH7kFkw zex0QV%skg39GSgqUHQg>h>{B_En_DV;QbHp0gNrXn>+3mOVKv~K*3=38C&CFHL?1! z8MUuVB#mv-m*JDj%UsFTkT|EFE+SS6AjhhR4#)^$wxB=ueoVOfazKE7gK<$U72Dqv zaC9B(NZS4W+re-k0>#jFJgKPxWE%^3nmYBmal^7w{C}|37_rmq;G@I!-@Xng>FPNT8Ar51_E3xNl+oNM7&H!zvA0ys%+HeKwd=1{3 zN7Kcl4&g$b!Y&#d^R@oHyBmfIT&+ZidG9mVKw5{ViHG_T{izM#yk?X=L?co?`f6rBasF8i z_F@Q{FAY1V>LO8Pq|lv@QNbhak)aQysyn>Fms0heEJ2}MXB{V99NII_(|t9VqUv6D zo)C2qW<^Acb$t^$3xz$QKG%3Jv@y-07|LSkS_Pxt=9D88T?LGOYZv8t$hQsoC8Qgp z{(;?9uJW_{49HCxYo{9Wtx;I|rvQU2jvq&|^&+XbRA$SE;9T>!cg$qA3;%QQZxbM` zs-r^j+5li=5=KVTpPYtyc=s%vbz|B}o6ERWAlm}mle4Hshn(SNw8$`{RWU1H)xiWx z^?Y9RsK}2pi-@eWR7YTsc7)cDRJrs5u+@Urfpv-8rt6~c#p~iFM|w)dzXU;1Zm!Vh zP2cS=yYcMm$`%Le$#%m{(%aGBSm47dF8gIL8%hoa?4;e7_p?fFAuMiQv zuOpbm0n1o?*w0}>tJ*)IAX@bue3B;V>*$C6h->2^!m!es5{p?B#Tl z?aJrVywkCOci?4VOZVQ#(cTFkh53XkzpAqXGGAMLQrbYd+c_Verd{n;zq+Jcec=s@ z_WFlr73-$~KnvQJvHi`*lh)y&JE08Z4-)p+HwUo9g+G;|j7i|dFN4XHxt7;xgb!iB zi2URWhE-zfv$4ZnT=BI^r*^N$gkS+smQ^$-BnpRatHS!Nny3wxxUZv4 zLI|nTPa;S~$Zc2)bUGFd@z~8CbS7o!nB>4<%Ya%wU*q;jaOZbAW}K$yfOi~IZ1E1y zhUSk~a&hsNzcJgYXPWxjCDz5e8lDDktPCmMT7AaN{gFqXTc%Y1HG(-qY>`O=G&wSF z>T?8n6ma|y=mgmIUULRG_0~Ok`4;)xMJOmb1mrI@ER8>KiakQQpB3?`HloODmzqEf z;S`$g^PvaywWd*urDfCyZ)cFwf5^t*@TtUD!6`jl(rEdGWS`=diD{kSxkT$IDmVfK zl*muEeAL{#DUlVteDXth!f)Okr8@JtG2aEY58~x@u!npKH9cQiIvPXS%r5RpMbjyB zkijuh7b<*BBR;@LG1CEodijND777|Oj(SEbg>*koi*(;PX0~w+61w9xe6M5qw^5Q& zL5?XA4|B}*T=nPt>1@|%4q9uO%bjCyh@FARS=Poi3O-a+E;X)$ZGYkjJUkYWf_-z} zF&s{u9)#HXEWS-SGHN;DY0RpiANg|M_n}%+w?p*pW@3Jpjc)?x*NwYX=Pr-WHO=HM ztt-mJ-fxp!XYq+o#zmd}=h3Br0*ZR$5`-V7vSO4RQj3{%je$3*QaPwci$bDnLe2gttdf?lG{%FR=QN05AELqW|&$zmPB94cOxss-dF9W=v2}w4AuDqa?%Vs)8fq!_oD3 zj>f8^UufjI7Xx&v=ojDh|5a!_Hc0k4Zj z{GQGgijpQeKRdYE;=-g=<&uyaA9tRT67t2#kJP`6CKH>6H-U`r_71aZ@n6$Jnw=)e!gmRI=s#2+#MX`LKOP^uk zzE!jMJd;d=%W9%i+}2JkbG}4?t#_hEo$u>3Ix*#~5Z5Y2LeY3XzZcO$wsXNmfCMYu zbcjveV5V(SNWn_FSF$k3V~Zj5h=yoPb?*2&7jZo9ZAva80z@7l1-0#V7KQOds?&*X zDmjG<34ipXD@WjnL<(Yw}@H>@#{N=-Q|(Vg_P7yYEP6PM%Z)m26DEi~lIvt8Jek zOns)EXoYQjbT7^u6BHa(Nmh)VLcK6)-~AOYym|@NOR$H93U$v zAdt=04TQeFKkXjlL?<2%mNKzlDst%RPafyGejDI8{CAjz0Ht&-hI3$vRs}1fx*wZ0 zghYiptCnh5aI3bYW*=~&BRD%k#V|RLjqzOgsK$$6vgQ;_o*G?e_ANh0h!h#T3*8Md z8yI$9T#~*F6|gp#!WU!>wgTocW8r-edr>jrXP?vJQxfR;GCYLd)&4);|8=Crjl+BwmE z9bW-UJj$x!4qTVA;$8VEUZD&VGt%qjPbwT3^-lYxPZ{sxarEWFmFMYEEUwQNxNWW7 zWHS9(!{LU;j)u061zGl^;aHhQFZFL7T(u6hXUSYfb-Ffkl()SGbCCp=N66nqCEU*q z$L{YkRqC2a&+Nll>GC-T=Z;c@my240e-GL>H3zzH9kPwI|D1UZ(LmYGZS z%DFFK)`=<@PdocXz6?{1N5S~?%Gy=o)h{mMGJ1k1w}J(96u~3al1sg3c0k`w$})B= zkw*-2WjM3wU#AmTzDm~bt?%I#%!3v~!DQY1Cn*HENFiYs1=Y{%!W}qtlRDWRml#iL z9Dilc!(kS^xZQ$#B5OVQ>5e^5yM8VI>JIOv6h^(}5R6bkg%E9*mYqA>bikF&THnx@ zk5>CC9bj2k_}Q-W!o!0O+-&9ez>TdeQ=^H+u5PxDgzr1=qTqKLaoBR%7Yq?GgKB>>BUv$KOQbV{B zHL6Kxab|a_bPl7c?N5-*YY%bu2RUm@_zxohxMcC+6J27mcB>Q)558kYLS?)?zeAI} zV;7Gl!54+&67_J4V`Wpa<400gYR#+A=~_b)$-SD`e@dB zphJ7s(_S)yag}|qB9NCA)ox)Uhv>%xtJaa?n=Evw&vRNdZpn!!o%!{lbL>|PDFAcv zPJWZo_?SMbx%jJe-}zep)F#Sg(jTZt3oRXS$J}`mqZ9ZQ4#85t59hH*GIRXbrh-2z zKJPy~)7S#BfNnAo9zyf48`@fhF@;Qn^1xm?Wj=S7-0{zHaX-a+JFxW!s#?0yXPO&p z(WbP@VkS>$XyRcTceoIlNRLGk10ulg7|TT>mTwv3{@aLg$&MNPyd$VCogDcT|tjUU&P&L#0>+Jj?@n1<;{Zahi% z6CkF?!CVx0FDH#REge+YG&H&|aL zIP==%u|N_u)KS;1egB;CM)JP!fJf(@xR$iV6Z5$xeG(&!X89v#zKAcsJ1vJ8BubJpn> z>=}%%^|^5(zo4V56nwPy`j!%tqx4=fTBQ%{KP0AQKI+X#QbwIEPZz7zJdA5J0E?NiWTW4`*HStYpvGU9xeZ zNstbkVpi}6anJYBFWh_krcW`G^f_lEKG(>GT+-Tpj`q+&7wa>xUIwyjB{-lLs%khGfDSXrX?lHGxQT0Oen z58b-+Y^UDis=XgXt-OUT#$wKkVkI|V`4ZEfpA@?JJTAY{IJ#M>8S1&5`02^5h|tUD zCXFdnFAJn#G=AlS;FUXOhd782H#Wwz^CV5uE+po4+CcbR_`#Dk3WN=!LGFoqv~So;?b1eb(2&cs)uCN5>%#@loK&dE^~Q(j35#k{yO`?3ylHET`UAPyIuDToR&uCadEI0b zM*;XOC`xc-o#?8xA7VF%PAG-lZDdi6+ScBy0m~xpz=2JN zJ8&rWIR3AE=$bkucKL8u*?BsqYoGiirLDu1@>swV8+xRcR|eYsifm2+JruPdgjWro zRl?+<75$e6m)`@sr4}|T!~KlNx2Ya33+!2Bh;1t(u2rGq`mUQrh(grB|6ComX8=O; z=`;%<2qz9cDdBx=6T8N&Y`#GAGyRR~i`2RywhfL=E~_%Xvoo8Q!U#Ery2g5CqHmk0 zJ8#|&aw{Z^4}P2;c%*);i>LT3(J4XoSl3A=U>nO3jz#x?)@yKY6*G()1t~n6TXD*# z|1|rqEcv!mxXV=c0Kh5wIOfzy;(h=g_Zb)U^S?TW{FOyxabNXz1bqI*v0E`silwk9f-u8S$$=s0!2Qw%6*&ZhcslGjYDs^tVF2V~d zfbNEvsaLnaR+HIwi(ov+|Uc>eQ2<>(dzb{|T1#CZ;m8#-_k^4R(QQ(F-`Ov#} z+=NRM4B%ZbzPr8f^QXB}mx%D_JdybM0LfvMaRw{QES+`vwJfUo2-}RR=~nGHqIl{p z(r%aucGNl+mxtG4N)lY_yeXI6K2WxIYK9WwA2%joFRw*DpKH!=T6YL@cV0{L8q9zN zH*UpfjIH%PWHC&*P}_rRZk1LfHycfj^wz>ld+N01;RZkN)Ai;ybP%8KOZR{B!Coow zQnsT6^Fl#I!NAkQq997Bfdh5%+Z~FyJlh;I!#UVs2A_53ZBZwoiT;N7D7#*led^o4{{K8Fa-pXRHf3oxhOACF`t=)S7Hff-$#XeO27AX zj0L%NWrvHKakxgi8POgM7{9xUt9mTvAZ;LgSY(@!2i|-vo@mVb?ctzew}^wz?!yp1 z!=EOKHUo^uskfa*b(!G4k`0<~#U>qXsuqb)e=45H(dS8SIELHyOZI%T$@}1XY~h_M zcsyU1FrQ+AlU?5CXXsWeg5pv>4o^1pTCW^m^k>RJyi74^WdiIg@!onA>Nm*jXkU|S z&jXOwBJc;o%KMWI-`nKQNiI19wk>?$Voaqh&{vA_ z6Sqpjjod`SFAv6oxGqD=zj+!^07`qJ_6jRxD~kHCE5>Av_}i0GA?2X#=>EO8*!iWe z?QZBzdY}j*1jD>ktthK~`rh6K1KRPeb>=ic6^E>WSk4YnCIR=UEHYu5>7U0(N3 zx%Z&PE=&%}SxWelP0zQQc6|Ay`Z~jJ5T2V&@U4hb;JqdS1fk?lX}mRTD2M=S(R7u$ z4ctO~z!v=)GzGwf+lvJqz7vut6%L|y-O^zQ+4n>Q8Hje=#w=K4Rl%@f{5TZ@lknMq z-u$_l`}1@Udw-*+K{Kg?02HJo@WXE`9a}N_Z2a#3_VP%?gDbIb=y#((yVyhxnhnQH>xWkmsFDZ|dvQxX{i1Eh1 zQ#u{;5su2LDa0hQ;1Ryc!x!GrG7b^Yo=B-$L`!-duH~~7_HFt*wfT>iC)<}NQ`!4{ z2Z(iap^?a)e6$t$#S?0nrsOh54vcy;(xDxW9qF4QrM$*)*lL_ZIKbU0eqkSIC`*#Cj zP-T5qdw9Ni>v;I~4`RXbg~wv$AEj>8Og)FmfU+zJ}i#{G+qazf-_$B6C@_CBhjA`0$ zvq~Ry20})EQH0J=!F<$DCxwLd#Tzfr`rZPTZXdjGBJ~e_GmMO z+^&JuXR7eio@Tdc&!tWm*?r35$a+Idk(@R>nq#vDjS$|+=Lnm6 zWoSgjO}%l-qyn=}V9P}<%J2LalNVffsUG?}SuyvDmRCi!4=ByKw|)`+f|tw(o!vYx zjJm~PmWS0^p)TWx)_rF=QI{X*M8f0TxK|f{q5?QG5}m;*@GnA_mEX6kci$fuw;gGv zo?CH(DQ79MUGPQ;>hHZn28jUP{#$>7L?b$&NC2$!eYmH@2&bJ_0F+`k@0%w0Y0Q+x z%UGqa8A%~BTyMDt(0Z4ze^)Zp_O#0xS52}V=XkP`9HyW4g&!WseWlu8@VuN5^!Y(i z>(ox3-sDPuVwh)W7H(cv{a|&h=fUio^99cp=Zc>|=~EY{WEvg5{I6EGFYOx@>Ct#;@mJ5wl}ffw>gj5!Yu8X8SXyu z@KJx#4XO>VR&B6K3N(ssZ1?JOD;A^|!bDc~>sWC2kaCBm+G!QgFRQw@@@+iFrz~%e z@|qquS3bA=s_L5vQ-DVhDnsmXq%)j4Ud0s!-Ey_T?hdi&S!IdPfcyIW;DvZ>AuV(? z&n{8Sw|Izs5^E@TTYxRPy0qeaS!#e|{qSc3bGXN*Mof9le97JFiv=1*}+30<3 zp8}-TYBI#S6!xY2Vqu%Y?W6r`9cj4DVSv~wrJ07*L*2Td4Xs)-_Gab1s)P_M(*ugf z2081o7>QA=Dd1=V{Fm`*l+~Ze2?Kw8mCAl*wPcg9FX;1@qAh&m`P*qJ&9EnF+h3EY zxD`sZA6+IPk{YE6N+a_@eD6)74Hy$-*{6sI|s`R_+x}ncMuybvt^+*{AZdn$4O{c6eJ9aKS zSZGxfUHDFaA*(3*!zkm{I96#4X&%!ZVLRAA)yOpWZ*rY2O5_#`X(d#Um~K&;4Qg%b z05~Ml<^6|N8_Qe6j+-h8{DUv%qk}@FdRE9WFBWFrFb1o4g?Z{TSegzbmL#H)zCWv$ zp;Z-wC$a(k2b8`e8Wh{lwGo9V_lCAsN}}dM&)Qu{K2((mS8e6<=CK%TLyz_}J+=}H zTiMC(Pp%h#_YvXuE%Nkn?^ynyLE1O6vWZ!{wj1SGhHSE`+ZgclzF1>;;5_cSF?!2^ z@F^ld-0tGSBU@kXt?pfs`)NO+N#RF1wqaE-c4HuE|d z>eo^NOm3xjjGmoG^pi9;6Ve>cJ&_8R z?71U6S)C!)A9-;$`9^NatoPY@Sq~)dX}`QJEl83a z>~s`-pVkQl&^uJ0B_S#?>4-g=q6U#%dQ=p2F)Y0%&(3gc>cImxZ_;(tZ$mr-rJ5YQJ@^M_WJOu5?L=iDcRm+m zK%jJPs3ikSS_s8$DL|4X^I)DlelrdM8lVu8WW_8qX6MhttAk$X^~9Xy&1(KceGt`B zSn<*>(X1|f(>AL?N{ysub~bBEA*CK%Ayu#)uWW4NB=K9eZY6-4TG|J1f5%?OL%g^K z@eAy%AT_e9QEKLR80uLUY^)cj?n0cJz}EAwMZHx?T7UJaXv?zE=U@5CtT==#DXAjM zFDETeTv{GSy-c%hkO(#g%LX`sk5KrTB!Sy`6+k2KPMDb>P@#nY1bk;$A;%(CseITN zznC{3DvBq9CJcwf4=cuM$w`s~baDb#5|_$tnfU1jZNCmY>)A*M6F7?iuQfu~*n(^! zB`jg`Rn92zNXkz5wsw*Ol@ui>*VjE$@PXeMIcKG_z-l^4v{7@2_HM z1YVM#rl1sUdXe8QvyV>j!3%4MP4%n=3o7vo11MxVkc>e!?sp6i@p{PO1yyc>EZ|c~ z)?HLf!M{O3b0Vf-WL3UBs-z1Q5}CqUx{sh(h{fp zO2*)J@9J)^InUzPNM05PYsc(b^)@SArS3el!$dB*F&dSanHzQUoTxOg6<&0B5N<~Tn`oH-C?yAve+H!*+%6{${ zjs`iYc(?$eg#yP&=<+L@{I!J#jw3S9%|Cql{28NS8YsNX>G5%DB=5YyNo$2w=0I=! z@C2t+#)w1>i6kLWR~tXwiOAcqV`iFdIF;0^dY}veK@tHn%?~5Ki8IlUD{I8?YS`)< z9G@y>S*1aA6-pQ^WqXSb9Z{{~>Dtsu?VNo=2A|Gu6a}|z{oYLG({}u%z6Rjc(E2!G zZZO5sd(+=GdrdIHpOhbn^ap&sP!u=-D;}u%q4y4!g27V3SC0|_A3S|79o@RO9)=vT z73nBR&zf38)$^$GC%I*^X`Vv(c{8cCw414@_&DdNb4O!H_iM&oZbs?PH)O|#KNMg2 zNUF1Vi6j@$dG!EbV(ZF*V{&pemyfqqtAUoQ39uMI2HCxwfYQj z8hx^TyG`hLwaayjQFo?^VRnzEq@0wHM1N4y<*9#WHo4TjuSbe=45bb9!OsrdGBx)W z4;z}JEcSUF8XD^AzMb_VFui;v@I7R+LWXt@sP0B@1>q~_;r6c9XPNGK-i;lpwGOtp zEfmr&q~cGEX4P}Q*d1=znTXlv-Oh;A7m-TCW)gH7{a4WO7F>xan6>+nVr5oj&mmjFvr7IZM9Sk9ftPi;NAwsC!{mlFHMJ#qE>sQ++{Ck0F z&3@+;jaO`M?VUBH^`vz0_aG66v<+P?wh|sUb~smTXKhbQ0OJ&KyqyG8ILzg?p#38- z{Dp>w9%$u(e+r#=q$U6i@e47#0<%}V;@j$GIbNTs0r4WQzikAHXvt(~iGY*(DZ$+$ zZ)CpmH6nG}D>%I{xzkl|OEyukg{v%x%EdSn`Q8h73?ttrW^HM8jJb3m*S`a<0_-=1 z`SXQoi?HZi%FLG?F08B^pDistisBVbX=4ks5MT=r3an6jD>FrZp9^rj`$>o8&nqQB zI*)@RiCKklBtp%uws8F=iEshufbstukw2-2H^CvxU8kt+zPVfy!@1r}Cz#>rVcEQy zdgkmSN8h=k{ha57`&TqsZN z4vq&$q+@mU8riN_ias0=;R?~+gy|iso{q;apjpsY%0Dl`^kCYc7e=RkY)F>z4{wSA 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�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

#OaG=$jQXJIUFE~t-iL6<6w#8rj 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 diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateInfo.plist b/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateInfo.plist deleted file mode 100755 index 146a6df..0000000 --- a/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateInfo.plist +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Kind - Xcode.IDEKit.TextSubstitutionFileTemplateKind - Description - A QuickConfiguration subclass. - Summary - A QuickConfiguration subclass, overload +configure: to configure the behaviour when running specs, shared examples that are used across spec files. - SortOrder - 1 - BuildableType - Test - DefaultCompletionName - Spec - Options - - - Description - Name of the Quick Configuration - Identifier - productName - Name - QuickConfiguration Name: - NotPersisted - - Required - - Type - text - - - AllowedTypes - - Swift - - public.swift-source - - Objective-C - - public.objective-c-source - public.objective-c-plus-plus-source - - - Default - Swift - Description - The implementation language - Identifier - languageChoice - MainTemplateFiles - - Objective-C - ___FILEBASENAME___.m - Swift - ___FILEBASENAME___.swift - - Name - Language: - Required - Yes - Type - popup - Values - - Swift - Objective-C - - - - - diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m b/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m deleted file mode 100644 index 3e8da5b..0000000 --- a/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -#import -#import - -QuickSpecBegin(___FILEBASENAMEASIDENTIFIER___) - -QuickSpecEnd diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Swift/___FILEBASENAME___.swift b/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Swift/___FILEBASENAME___.swift deleted file mode 100644 index a8371cf..0000000 --- a/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Swift/___FILEBASENAME___.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -import Quick -import Nimble - -class ___FILEBASENAMEASIDENTIFIER___: QuickSpec { - override func spec() { - - } -} diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateIcon.icns b/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateIcon.icns deleted file mode 100644 index 5cb4ae999f06c9d5b5f3152a034c65f23137821e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529473 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%0D_YWU3_}$$FJi-@LKlix9Xblc5@0Ulz3?A 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%0Dl`^kCYc7e=RkY)F>z4{wSA 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�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

#OaG=$jQXJIUFE~t-iL6<6w#8rj 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 diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateInfo.plist b/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateInfo.plist deleted file mode 100755 index 7b8088f..0000000 --- a/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateInfo.plist +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Kind - Xcode.IDEKit.TextSubstitutionFileTemplateKind - Description - A class implementing a Quick spec. - Summary - A class implementing a Quick spec - SortOrder - 1 - BuildableType - Test - DefaultCompletionName - Spec - Options - - - Description - Name of the Quick spec class - Identifier - productName - Name - Spec Name: - NotPersisted - - Required - - Type - text - - - AllowedTypes - - Swift - - public.swift-source - - Objective-C - - public.objective-c-source - public.objective-c-plus-plus-source - - - Default - Swift - Description - The implementation language - Identifier - languageChoice - MainTemplateFiles - - Objective-C - ___FILEBASENAME___.m - Swift - ___FILEBASENAME___.swift - - Name - Language: - Required - Yes - Type - popup - Values - - Swift - Objective-C - - - - - diff --git a/Carthage/Checkouts/Quick/Quick.podspec b/Carthage/Checkouts/Quick/Quick.podspec deleted file mode 100644 index 0e2bc09..0000000 --- a/Carthage/Checkouts/Quick/Quick.podspec +++ /dev/null @@ -1,38 +0,0 @@ -Pod::Spec.new do |s| - s.name = "Quick" - s.version = "1.2.0" - s.summary = "The Swift (and Objective-C) testing framework." - - s.description = <<-DESC - Quick is a behavior-driven development framework for Swift and Objective-C. Inspired by RSpec, Specta, and Ginkgo. - DESC - - s.homepage = "https://github.com/Quick/Quick" - s.license = { :type => "Apache 2.0", :file => "LICENSE" } - - s.author = "Quick Contributors" - s.ios.deployment_target = "7.0" - s.osx.deployment_target = "10.9" - s.tvos.deployment_target = '9.0' - - s.source = { :git => "https://github.com/Quick/Quick.git", :tag => "v#{s.version}" } - s.source_files = "Sources/**/*.{swift,h,m}" - - s.public_header_files = [ - 'Sources/QuickObjectiveC/Configuration/QuickConfiguration.h', - 'Sources/QuickObjectiveC/DSL/QCKDSL.h', - 'Sources/QuickObjectiveC/Quick.h', - 'Sources/QuickObjectiveC/QuickSpec.h', - ] - - s.exclude_files = [ - 'Sources/Quick/Configuration/QuickConfiguration.swift', - 'Sources/Quick/QuickSpec.swift', - 'Sources/Quick/QuickMain.swift', - ] - - s.framework = "XCTest" - s.requires_arc = true - s.user_target_xcconfig = { 'FRAMEWORK_SEARCH_PATHS' => '$(PLATFORM_DIR)/Developer/Library/Frameworks' } - s.pod_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' } -end diff --git a/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj b/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj deleted file mode 100644 index 5d90840..0000000 --- a/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2700 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXAggregateTarget section */ - 732D8D691E516780008558BD /* SwiftLint */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 732D8D6A1E516780008558BD /* Build configuration list for PBXAggregateTarget "SwiftLint" */; - buildPhases = ( - 732D8D6D1E516789008558BD /* ShellScript */, - ); - dependencies = ( - ); - name = SwiftLint; - productName = SwiftLint; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 1F118CDF1BDCA4AB005013A2 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118CD51BDCA4AB005013A2 /* Quick.framework */; }; - 1F118CF51BDCA4BB005013A2 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118CD51BDCA4AB005013A2 /* Quick.framework */; }; - 1F118CFB1BDCA536005013A2 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */; }; - 1F118CFC1BDCA536005013A2 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA169E4719FF5DF100619816 /* Configuration.swift */; }; - 1F118CFD1BDCA536005013A2 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E519FCAEE8002858A7 /* World+DSL.swift */; }; - 1F118CFE1BDCA536005013A2 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E219FCAEE8002858A7 /* DSL.swift */; }; - 1F118CFF1BDCA536005013A2 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E419FCAEE8002858A7 /* QCKDSL.m */; }; - 1F118D001BDCA536005013A2 /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BDF19FF5599005DF92A /* Closures.swift */; }; - 1F118D011BDCA536005013A2 /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE019FF5599005DF92A /* ExampleHooks.swift */; }; - 1F118D021BDCA536005013A2 /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE119FF5599005DF92A /* SuiteHooks.swift */; }; - 1F118D031BDCA536005013A2 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A619515CA700CE1B99 /* World.swift */; }; - 1F118D041BDCA536005013A2 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759E19515CA700CE1B99 /* Example.swift */; }; - 1F118D051BDCA536005013A2 /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA02C91819A8073100093156 /* ExampleMetadata.swift */; }; - 1F118D061BDCA536005013A2 /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */; }; - 1F118D071BDCA536005013A2 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759C19515CA700CE1B99 /* Callsite.swift */; }; - 1F118D081BDCA536005013A2 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6B30171A4DB0D500FFB148 /* Filter.swift */; }; - 1F118D091BDCA536005013A2 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A519515CA700CE1B99 /* QuickSpec.m */; }; - 1F118D0C1BDCA543005013A2 /* QuickConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */; }; - 1F118D0D1BDCA547005013A2 /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - 1F118D0E1BDCA547005013A2 /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - 1F118D0F1BDCA54B005013A2 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */; }; - 1F118D101BDCA556005013A2 /* Configuration+AfterEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */; }; - 1F118D111BDCA556005013A2 /* Configuration+AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */; }; - 1F118D121BDCA556005013A2 /* ItTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7AE6F019FC493F000AFDCE /* ItTests.swift */; }; - 1F118D131BDCA556005013A2 /* ItTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */; }; - 1F118D141BDCA556005013A2 /* FailureTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */; }; - 1F118D151BDCA556005013A2 /* FailureUsingXCTAssertTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */; }; - 1F118D161BDCA556005013A2 /* BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA87078219F48775008C04AC /* BeforeEachTests.swift */; }; - 1F118D171BDCA556005013A2 /* BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */; }; - 1F118D181BDCA556005013A2 /* AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA05D60F19F73A3800771050 /* AfterEachTests.swift */; }; - 1F118D191BDCA556005013A2 /* AfterEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */; }; - 1F118D1A1BDCA556005013A2 /* PendingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA63EA219F7637300CD0A3B /* PendingTests.swift */; }; - 1F118D1B1BDCA556005013A2 /* PendingTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */; }; - 1F118D1C1BDCA556005013A2 /* BeforeSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */; }; - 1F118D1D1BDCA556005013A2 /* BeforeSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */; }; - 1F118D201BDCA556005013A2 /* SharedExamplesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */; }; - 1F118D211BDCA556005013A2 /* SharedExamplesTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */; }; - 1F118D221BDCA556005013A2 /* SharedExamples+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */; }; - 1F118D231BDCA556005013A2 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */; }; - 1F118D241BDCA561005013A2 /* FocusedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9876BF1A4C87200004AA17 /* FocusedTests.swift */; }; - 1F118D251BDCA561005013A2 /* FocusedTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */; }; - 1F118D261BDCA5AF005013A2 /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC81B110699006F61EC /* World+DSL.h */; }; - 1F118D271BDCA5AF005013A2 /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC21B1105BC006F61EC /* World.h */; }; - 1F118D291BDCA5B6005013A2 /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F118D2A1BDCA5B6005013A2 /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3124E319FCAEE8002858A7 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F118D2B1BDCA5B6005013A2 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB6B931943873100289F44 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F118D2C1BDCA5B6005013A2 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 34F375A419515CA700CE1B99 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F118D351BDCA657005013A2 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118D341BDCA657005013A2 /* Nimble.framework */; }; - 1F118D371BDCA65C005013A2 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118D361BDCA65C005013A2 /* Nimble.framework */; }; - 1F118D381BDCA6E1005013A2 /* Configuration+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */; }; - 1F118D391BDCA6E6005013A2 /* Configuration+BeforeEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */; }; - 1FD0CFAD1AFA0B8C00874CC1 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - 34C586011C4ABD3F00D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586021C4ABD3F00D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586031C4ABD4000D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586041C4ABD4000D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586051C4ABD4100D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586061C4ABD4100D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586081C4AC5E500D4F057 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */; }; - 34C586091C4AC5E500D4F057 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */; }; - 34C5860A1C4AC5E500D4F057 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */; }; - 34F375A719515CA700CE1B99 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759C19515CA700CE1B99 /* Callsite.swift */; }; - 34F375A819515CA700CE1B99 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759C19515CA700CE1B99 /* Callsite.swift */; }; - 34F375AB19515CA700CE1B99 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759E19515CA700CE1B99 /* Example.swift */; }; - 34F375AC19515CA700CE1B99 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759E19515CA700CE1B99 /* Example.swift */; }; - 34F375AD19515CA700CE1B99 /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */; }; - 34F375AE19515CA700CE1B99 /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */; }; - 34F375B719515CA700CE1B99 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 34F375A419515CA700CE1B99 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 34F375B819515CA700CE1B99 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 34F375A419515CA700CE1B99 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 34F375B919515CA700CE1B99 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A519515CA700CE1B99 /* QuickSpec.m */; }; - 34F375BA19515CA700CE1B99 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A519515CA700CE1B99 /* QuickSpec.m */; }; - 34F375BB19515CA700CE1B99 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A619515CA700CE1B99 /* World.swift */; }; - 34F375BC19515CA700CE1B99 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A619515CA700CE1B99 /* World.swift */; }; - 470D6ECB1A43442400043E50 /* AfterEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */; }; - 470D6ECC1A43442900043E50 /* AfterEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */; }; - 471590401A488F3F00FBA644 /* PendingTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */; }; - 471590411A488F3F00FBA644 /* PendingTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */; }; - 4728253B1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */; }; - 4728253C1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */; }; - 4748E8941A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */; }; - 4748E8951A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */; }; - 47876F7D1A49AD63002575C7 /* BeforeSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */; }; - 47876F7E1A49AD71002575C7 /* BeforeSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */; }; - 479C31E31A36171B00DA8718 /* ItTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */; }; - 479C31E41A36172700DA8718 /* ItTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */; }; - 47FAEA361A3F49E6005A1D2F /* BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */; }; - 47FAEA371A3F49EB005A1D2F /* BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */; }; - 5A5D118719473F2100F6D13D /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A5D117C19473F2100F6D13D /* Quick.framework */; }; - 5A5D11A7194740E000F6D13D /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB6B931943873100289F44 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 64076CEF1D6D7C2000E2B499 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEB6B8E1943873100289F44 /* Quick.framework */; }; - 64076CF01D6D7C2000E2B499 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - 64076D021D6D7CD600E2B499 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A5D117C19473F2100F6D13D /* Quick.framework */; }; - 64076D031D6D7CD600E2B499 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - 64076D141D6D7CEA00E2B499 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118CD51BDCA4AB005013A2 /* Quick.framework */; }; - 64076D151D6D7CEA00E2B499 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118D361BDCA65C005013A2 /* Nimble.framework */; }; - 64076D211D6D7E4D00E2B499 /* AfterSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */; }; - 64076D221D6D7E5B00E2B499 /* AfterSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */; }; - 64076D231D6D7E6B00E2B499 /* AfterSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */; }; - 64076D261D6D80B500E2B499 /* AfterSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */; }; - 64076D271D6D80B500E2B499 /* AfterSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */; }; - 7B44ADBE1C5444940007AF2E /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */; }; - 7B44ADBF1C5444940007AF2E /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */; }; - 7B44ADC01C5444940007AF2E /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */; }; - 7B5358CE1C3D4FBC00A23FAA /* ContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */; }; - 7B5358CF1C3D4FBE00A23FAA /* ContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */; }; - 7B5358D01C3D4FC000A23FAA /* ContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */; }; - 8D010A571C11726F00633E2B /* DescribeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D010A561C11726F00633E2B /* DescribeTests.swift */; }; - 8D010A581C11726F00633E2B /* DescribeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D010A561C11726F00633E2B /* DescribeTests.swift */; }; - 8D010A591C11726F00633E2B /* DescribeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D010A561C11726F00633E2B /* DescribeTests.swift */; }; - 96327C631C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */ = {isa = PBXBuildFile; fileRef = 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */; }; - 96327C641C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */ = {isa = PBXBuildFile; fileRef = 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */; }; - 96327C651C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */ = {isa = PBXBuildFile; fileRef = 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */; }; - 96327C661C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */ = {isa = PBXBuildFile; fileRef = 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */; }; - 96327C671C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */ = {isa = PBXBuildFile; fileRef = 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */; }; - 96327C681C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */ = {isa = PBXBuildFile; fileRef = 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */; }; - AE4E58131C73097A00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58141C73097A00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58151C73097C00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58161C73097C00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58171C73097E00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58181C73097E00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AED9C8631CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */; }; - AED9C8641CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */; }; - AED9C8651CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */; }; - CD264DBD1DDA147A0038B0EB /* AfterSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */; }; - CE175D4E1E8D6B4900EB5E84 /* Behavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE175D4D1E8D6B4900EB5E84 /* Behavior.swift */; }; - CE175D4F1E8D6B4900EB5E84 /* Behavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE175D4D1E8D6B4900EB5E84 /* Behavior.swift */; }; - CE175D501E8D6B4900EB5E84 /* Behavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE175D4D1E8D6B4900EB5E84 /* Behavior.swift */; }; - CE4A578A1EA5DC270063C0D4 /* BehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4A57891EA5DC270063C0D4 /* BehaviorTests.swift */; }; - CE4A578E1EA7251C0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4A578D1EA7251C0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift */; }; - CE4A57911EA7252E0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4A578D1EA7251C0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift */; }; - CE4A57921EA725300063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4A578D1EA7251C0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift */; }; - CE4A57931EA725420063C0D4 /* BehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4A57891EA5DC270063C0D4 /* BehaviorTests.swift */; }; - CE4A57941EA725440063C0D4 /* BehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4A57891EA5DC270063C0D4 /* BehaviorTests.swift */; }; - CE57CEDD1C430BD200D63004 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */; }; - CE57CEDE1C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */; }; - CE57CEDF1C430BD200D63004 /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */; }; - CE57CEE01C430BD200D63004 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDB1C430BD200D63004 /* URL+FileName.swift */; }; - CE57CEE11C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */; }; - CE590E1A1C431FE300253D19 /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */; }; - CE590E1B1C431FE300253D19 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */; }; - CE590E1C1C431FE300253D19 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */; }; - CE590E1D1C431FE300253D19 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDB1C430BD200D63004 /* URL+FileName.swift */; }; - CE590E1E1C431FE300253D19 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */; }; - CE590E1F1C431FE400253D19 /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */; }; - CE590E201C431FE400253D19 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */; }; - CE590E211C431FE400253D19 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */; }; - CE590E221C431FE400253D19 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDB1C430BD200D63004 /* URL+FileName.swift */; }; - CE590E231C431FE400253D19 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */; }; - DA02C91919A8073100093156 /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA02C91819A8073100093156 /* ExampleMetadata.swift */; }; - DA02C91A19A8073100093156 /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA02C91819A8073100093156 /* ExampleMetadata.swift */; }; - DA05D61019F73A3800771050 /* AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA05D60F19F73A3800771050 /* AfterEachTests.swift */; }; - DA05D61119F73A3800771050 /* AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA05D60F19F73A3800771050 /* AfterEachTests.swift */; }; - DA07722E1A4E5B7B0098839D /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - DA07722F1A4E5B7C0098839D /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - DA169E4819FF5DF100619816 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA169E4719FF5DF100619816 /* Configuration.swift */; }; - DA169E4919FF5DF100619816 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA169E4719FF5DF100619816 /* Configuration.swift */; }; - DA3124E619FCAEE8002858A7 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E219FCAEE8002858A7 /* DSL.swift */; }; - DA3124E719FCAEE8002858A7 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E219FCAEE8002858A7 /* DSL.swift */; }; - DA3124E819FCAEE8002858A7 /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3124E319FCAEE8002858A7 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA3124E919FCAEE8002858A7 /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3124E319FCAEE8002858A7 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA3124EA19FCAEE8002858A7 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E419FCAEE8002858A7 /* QCKDSL.m */; }; - DA3124EB19FCAEE8002858A7 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E419FCAEE8002858A7 /* QCKDSL.m */; }; - DA3124EC19FCAEE8002858A7 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E519FCAEE8002858A7 /* World+DSL.swift */; }; - DA3124ED19FCAEE8002858A7 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E519FCAEE8002858A7 /* World+DSL.swift */; }; - DA3E7A341A1E66C600CCE408 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - DA3E7A351A1E66CB00CCE408 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - DA408BE219FF5599005DF92A /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BDF19FF5599005DF92A /* Closures.swift */; }; - DA408BE319FF5599005DF92A /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BDF19FF5599005DF92A /* Closures.swift */; }; - DA408BE419FF5599005DF92A /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE019FF5599005DF92A /* ExampleHooks.swift */; }; - DA408BE519FF5599005DF92A /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE019FF5599005DF92A /* ExampleHooks.swift */; }; - DA408BE619FF5599005DF92A /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE119FF5599005DF92A /* SuiteHooks.swift */; }; - DA408BE719FF5599005DF92A /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE119FF5599005DF92A /* SuiteHooks.swift */; }; - DA5663EE1A4C8D8500193C88 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEB6B8E1943873100289F44 /* Quick.framework */; }; - DA5663F41A4C8D9A00193C88 /* FocusedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9876BF1A4C87200004AA17 /* FocusedTests.swift */; }; - DA6B30181A4DB0D500FFB148 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6B30171A4DB0D500FFB148 /* Filter.swift */; }; - DA6B30191A4DB0D500FFB148 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6B30171A4DB0D500FFB148 /* Filter.swift */; }; - DA7AE6F119FC493F000AFDCE /* ItTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7AE6F019FC493F000AFDCE /* ItTests.swift */; }; - DA7AE6F219FC493F000AFDCE /* ItTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7AE6F019FC493F000AFDCE /* ItTests.swift */; }; - DA8940F01B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */; }; - DA8940F11B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */; }; - DA8C00211A01E4B900CE58A6 /* QuickConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */; }; - DA8C00221A01E4B900CE58A6 /* QuickConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */; }; - DA8F919919F31680006F6675 /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - DA8F919A19F31680006F6675 /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - DA8F919D19F31921006F6675 /* FailureTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */; }; - DA8F919E19F31921006F6675 /* FailureTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */; }; - DA8F91A519F3208B006F6675 /* BeforeSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */; }; - DA8F91A619F3208B006F6675 /* BeforeSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */; }; - DA8F91AB19F3299E006F6675 /* SharedExamplesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */; }; - DA8F91AC19F3299E006F6675 /* SharedExamplesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */; }; - DA8F91AE19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */; }; - DA8F91AF19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */; }; - DA9876B81A4C70EB0004AA17 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A5D117C19473F2100F6D13D /* Quick.framework */; }; - DA9876C11A4C87200004AA17 /* FocusedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9876BF1A4C87200004AA17 /* FocusedTests.swift */; }; - DAA63EA319F7637300CD0A3B /* PendingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA63EA219F7637300CD0A3B /* PendingTests.swift */; }; - DAA63EA419F7637300CD0A3B /* PendingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA63EA219F7637300CD0A3B /* PendingTests.swift */; }; - DAA7C0D719F777EB0093D1D9 /* BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA87078219F48775008C04AC /* BeforeEachTests.swift */; }; - DAB0136F19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */; }; - DAB0137019FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */; }; - DAB067E919F7801C00F970AC /* BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA87078219F48775008C04AC /* BeforeEachTests.swift */; }; - DAD297651AA8129D001D25CD /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - DAE714F019FF65D3005905B8 /* Configuration+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */; }; - DAE714F119FF65D3005905B8 /* Configuration+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */; }; - DAE714F319FF65E7005905B8 /* Configuration+BeforeEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */; }; - DAE714F419FF65E7005905B8 /* Configuration+BeforeEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */; }; - DAE714F719FF6812005905B8 /* Configuration+AfterEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */; }; - DAE714F819FF6812005905B8 /* Configuration+AfterEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */; }; - DAE714FA19FF682A005905B8 /* Configuration+AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */; }; - DAE714FB19FF682A005905B8 /* Configuration+AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */; }; - DAE714FE19FF6A62005905B8 /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAE714FF19FF6A62005905B8 /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAE7150019FF6A62005905B8 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */; }; - DAE7150119FF6A62005905B8 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */; }; - DAEB6B941943873100289F44 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB6B931943873100289F44 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAEB6B9A1943873100289F44 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEB6B8E1943873100289F44 /* Quick.framework */; }; - DAED1EC41B1105BC006F61EC /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC21B1105BC006F61EC /* World.h */; }; - DAED1EC51B1105BC006F61EC /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC21B1105BC006F61EC /* World.h */; }; - DAED1ECA1B110699006F61EC /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC81B110699006F61EC /* World+DSL.h */; }; - DAED1ECB1B110699006F61EC /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC81B110699006F61EC /* World+DSL.h */; }; - DAF28BC31A4DB8EC00A5D9BF /* FocusedTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */; }; - DAF28BC41A4DB8EC00A5D9BF /* FocusedTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */; }; - DED3036B1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED3036A1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift */; }; - DED3036C1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED3036A1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift */; }; - DED3036D1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED3036A1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift */; }; - DED3037D1DF6CF140041394E /* BundleModuleNameTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED3037C1DF6CF140041394E /* BundleModuleNameTests.swift */; }; - DED3037E1DF6CF140041394E /* BundleModuleNameTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED3037C1DF6CF140041394E /* BundleModuleNameTests.swift */; }; - DED3037F1DF6CF140041394E /* BundleModuleNameTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED3037C1DF6CF140041394E /* BundleModuleNameTests.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 047655511949F4CB00B288BB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 047655531949F4CB00B288BB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04765555194A327000B288BB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97E4194B4A6000CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97E6194B4A6000CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97E8194B4B7E00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97EA194B4B9B00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97F0194B82DB00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97F2194B82DE00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97F6194B831200CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97F8194B834000CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97FA194B834100CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97FC194B834B00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97FE194B835E00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC9800194B836100CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC9802194B836300CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC9804194B838400CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC9806194B838700CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC9808194B838B00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 1F118CE01BDCA4AB005013A2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F118CD41BDCA4AB005013A2; - remoteInfo = "Quick-tvOS"; - }; - 1F118CF61BDCA4BB005013A2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F118CD41BDCA4AB005013A2; - remoteInfo = "Quick-tvOS"; - }; - 5A5D118819473F2100F6D13D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 5A5D11EF194741B500F6D13D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 5A5D11F1194741B500F6D13D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 64076CE71D6D7C2000E2B499 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = "Quick-OSX"; - }; - 64076CFA1D6D7CD600E2B499 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 64076D0C1D6D7CEA00E2B499 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F118CD41BDCA4AB005013A2; - remoteInfo = "Quick-tvOS"; - }; - 93625F381951DDC8006B1FE1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - DA5663EF1A4C8D8500193C88 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = "Quick-OSX"; - }; - DA9876B91A4C70EB0004AA17 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - DAEB6B9B1943873100289F44 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1F118CD51BDCA4AB005013A2 /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F118CDE1BDCA4AB005013A2 /* Quick - tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Quick - tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F118CF01BDCA4BB005013A2 /* QuickFocused - tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickFocused - tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F118D341BDCA657005013A2 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = "Externals/Nimble/build/Debug-appletvos/Nimble.framework"; sourceTree = ""; }; - 1F118D361BDCA65C005013A2 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = "Externals/Nimble/build/Debug-appletvos/Nimble.framework"; sourceTree = ""; }; - 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = XCTestCaseProvider.swift; path = ../../QuickTestHelpers/XCTestCaseProvider.swift; sourceTree = ""; }; - 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorUtility.swift; sourceTree = ""; }; - 34F3759C19515CA700CE1B99 /* Callsite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Callsite.swift; sourceTree = ""; }; - 34F3759E19515CA700CE1B99 /* Example.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Example.swift; sourceTree = ""; }; - 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExampleGroup.swift; sourceTree = ""; }; - 34F375A419515CA700CE1B99 /* QuickSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickSpec.h; sourceTree = ""; }; - 34F375A519515CA700CE1B99 /* QuickSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuickSpec.m; sourceTree = ""; }; - 34F375A619515CA700CE1B99 /* World.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = World.swift; sourceTree = ""; }; - 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AfterEachTests+ObjC.m"; sourceTree = ""; }; - 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "PendingTests+ObjC.m"; sourceTree = ""; }; - 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SharedExamplesTests+ObjC.m"; sourceTree = ""; }; - 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SharedExamples+BeforeEachTests+ObjC.m"; sourceTree = ""; }; - 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "BeforeSuiteTests+ObjC.m"; sourceTree = ""; }; - 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ItTests+ObjC.m"; sourceTree = ""; }; - 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "BeforeEachTests+ObjC.m"; sourceTree = ""; }; - 5A5D117C19473F2100F6D13D /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5A5D118619473F2100F6D13D /* Quick - iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Quick - iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 64076CF51D6D7C2000E2B499 /* QuickAfterSuite - macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickAfterSuite - macOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 64076D081D6D7CD600E2B499 /* QuickAfterSuite - iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickAfterSuite - iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 64076D1A1D6D7CEA00E2B499 /* QuickAfterSuite - tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickAfterSuite - tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AfterSuiteTests.swift; sourceTree = ""; }; - 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AfterSuiteTests+ObjC.m"; sourceTree = ""; }; - 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HooksPhase.swift; sourceTree = ""; }; - 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContextTests.swift; sourceTree = ""; }; - 8D010A561C11726F00633E2B /* DescribeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DescribeTests.swift; sourceTree = ""; }; - 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QuickSpec+QuickSpec_MethodList.h"; sourceTree = ""; }; - 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QuickSpec+QuickSpec_MethodList.m"; sourceTree = ""; }; - AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCTestObservationCenter+QCKSuspendObservation.m"; sourceTree = ""; }; - AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrossReferencingSpecs.swift; sourceTree = ""; }; - CD261AC81DEC8B0000A8863C /* QuickConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickConfiguration.swift; sourceTree = ""; }; - CD3451461E4703D4000C8633 /* QuickMain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickMain.swift; sourceTree = ""; }; - CD3451471E4703D4000C8633 /* QuickSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickSpec.swift; sourceTree = ""; }; - CE175D4D1E8D6B4900EB5E84 /* Behavior.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Behavior.swift; sourceTree = ""; }; - CE4A57891EA5DC270063C0D4 /* BehaviorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BehaviorTests.swift; sourceTree = ""; }; - CE4A578D1EA7251C0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FunctionalTests_BehaviorTests_Behaviors.swift; sourceTree = ""; }; - CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; - CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; - CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickTestSuite.swift; sourceTree = ""; }; - CE57CEDB1C430BD200D63004 /* URL+FileName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URL+FileName.swift"; sourceTree = ""; }; - CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; - DA02C91819A8073100093156 /* ExampleMetadata.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExampleMetadata.swift; sourceTree = ""; }; - DA05D60F19F73A3800771050 /* AfterEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AfterEachTests.swift; sourceTree = ""; }; - DA169E4719FF5DF100619816 /* Configuration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = ""; }; - DA3124E219FCAEE8002858A7 /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSL.swift; sourceTree = ""; }; - DA3124E319FCAEE8002858A7 /* QCKDSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QCKDSL.h; sourceTree = ""; }; - DA3124E419FCAEE8002858A7 /* QCKDSL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QCKDSL.m; sourceTree = ""; }; - DA3124E519FCAEE8002858A7 /* World+DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "World+DSL.swift"; sourceTree = ""; }; - DA408BDF19FF5599005DF92A /* Closures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Closures.swift; sourceTree = ""; }; - DA408BE019FF5599005DF92A /* ExampleHooks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExampleHooks.swift; sourceTree = ""; }; - DA408BE119FF5599005DF92A /* SuiteHooks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SuiteHooks.swift; sourceTree = ""; }; - DA5663E81A4C8D8500193C88 /* QuickFocused - macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickFocused - macOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - DA6B30171A4DB0D500FFB148 /* Filter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Filter.swift; sourceTree = ""; }; - DA7AE6F019FC493F000AFDCE /* ItTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItTests.swift; sourceTree = ""; }; - DA87078219F48775008C04AC /* BeforeEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeforeEachTests.swift; sourceTree = ""; }; - DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FailureUsingXCTAssertTests+ObjC.m"; sourceTree = ""; }; - DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuickConfigurationTests.m; sourceTree = ""; }; - DA8F919519F31680006F6675 /* QCKSpecRunner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QCKSpecRunner.h; sourceTree = ""; }; - DA8F919619F31680006F6675 /* QCKSpecRunner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QCKSpecRunner.m; sourceTree = ""; }; - DA8F919719F31680006F6675 /* QuickTestsBridgingHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickTestsBridgingHeader.h; sourceTree = ""; }; - DA8F919819F31680006F6675 /* XCTestObservationCenter+QCKSuspendObservation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "XCTestObservationCenter+QCKSuspendObservation.h"; sourceTree = ""; }; - DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FailureTests+ObjC.m"; sourceTree = ""; }; - DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeforeSuiteTests.swift; sourceTree = ""; }; - DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedExamplesTests.swift; sourceTree = ""; }; - DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FunctionalTests_SharedExamplesTests_SharedExamples.swift; sourceTree = ""; }; - DA9876B21A4C70EB0004AA17 /* QuickFocused - iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickFocused - iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - DA9876BF1A4C87200004AA17 /* FocusedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FocusedTests.swift; sourceTree = ""; }; - DA9876C01A4C87200004AA17 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DAA63EA219F7637300CD0A3B /* PendingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PendingTests.swift; sourceTree = ""; }; - DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SharedExamples+BeforeEachTests.swift"; sourceTree = ""; }; - DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Configuration+BeforeEachTests.swift"; sourceTree = ""; }; - DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Configuration+BeforeEach.swift"; sourceTree = ""; }; - DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Configuration+AfterEach.swift"; sourceTree = ""; }; - DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Configuration+AfterEachTests.swift"; sourceTree = ""; }; - DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickConfiguration.h; sourceTree = ""; }; - DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuickConfiguration.m; sourceTree = ""; }; - DAEB6B8E1943873100289F44 /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DAEB6B921943873100289F44 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DAEB6B931943873100289F44 /* Quick.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Quick.h; sourceTree = ""; }; - DAEB6B991943873100289F44 /* Quick - macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Quick - macOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - DAEB6B9F1943873100289F44 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DAED1EC21B1105BC006F61EC /* World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = World.h; sourceTree = ""; }; - DAED1EC81B110699006F61EC /* World+DSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "World+DSL.h"; sourceTree = ""; }; - DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FocusedTests+ObjC.m"; sourceTree = ""; }; - DED3036A1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSString+C99ExtendedIdentifier.swift"; sourceTree = ""; }; - DED3037C1DF6CF140041394E /* BundleModuleNameTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BundleModuleNameTests.swift; sourceTree = ""; }; - F8100E901A1E4447007595ED /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1F118CD11BDCA4AB005013A2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CDB1BDCA4AB005013A2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118CDF1BDCA4AB005013A2 /* Quick.framework in Frameworks */, - 1F118D351BDCA657005013A2 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CED1BDCA4BB005013A2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118CF51BDCA4BB005013A2 /* Quick.framework in Frameworks */, - 1F118D371BDCA65C005013A2 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D117819473F2100F6D13D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D118319473F2100F6D13D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5A5D118719473F2100F6D13D /* Quick.framework in Frameworks */, - DA3E7A351A1E66CB00CCE408 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076CEE1D6D7C2000E2B499 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076CEF1D6D7C2000E2B499 /* Quick.framework in Frameworks */, - 64076CF01D6D7C2000E2B499 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D011D6D7CD600E2B499 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D021D6D7CD600E2B499 /* Quick.framework in Frameworks */, - 64076D031D6D7CD600E2B499 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D131D6D7CEA00E2B499 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D141D6D7CEA00E2B499 /* Quick.framework in Frameworks */, - 64076D151D6D7CEA00E2B499 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA5663E51A4C8D8500193C88 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DA5663EE1A4C8D8500193C88 /* Quick.framework in Frameworks */, - 1FD0CFAD1AFA0B8C00874CC1 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA9876AF1A4C70EB0004AA17 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DA9876B81A4C70EB0004AA17 /* Quick.framework in Frameworks */, - DAD297651AA8129D001D25CD /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B8A1943873100289F44 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B961943873100289F44 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DA3E7A341A1E66C600CCE408 /* Nimble.framework in Frameworks */, - DAEB6B9A1943873100289F44 /* Quick.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1F118D331BDCA645005013A2 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1F118D361BDCA65C005013A2 /* Nimble.framework */, - 1F118D341BDCA657005013A2 /* Nimble.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 64076D1C1D6D7D0B00E2B499 /* QuickAfterSuiteTests */ = { - isa = PBXGroup; - children = ( - 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */, - 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */, - ); - name = QuickAfterSuiteTests; - path = Tests/QuickTests/QuickAfterSuiteTests; - sourceTree = ""; - }; - 6C3983EE1D1E930D00637469 /* QuickObjectiveC */ = { - isa = PBXGroup; - children = ( - 6C3983EF1D1E93B700637469 /* Configuration */, - 6C3983F01D1E93CE00637469 /* DSL */, - DAEB6B931943873100289F44 /* Quick.h */, - DAED1EC21B1105BC006F61EC /* World.h */, - 34F375A419515CA700CE1B99 /* QuickSpec.h */, - 34F375A519515CA700CE1B99 /* QuickSpec.m */, - CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */, - ); - name = QuickObjectiveC; - path = Sources/QuickObjectiveC; - sourceTree = ""; - }; - 6C3983EF1D1E93B700637469 /* Configuration */ = { - isa = PBXGroup; - children = ( - DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */, - DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */, - ); - path = Configuration; - sourceTree = ""; - }; - 6C3983F01D1E93CE00637469 /* DSL */ = { - isa = PBXGroup; - children = ( - DAED1EC81B110699006F61EC /* World+DSL.h */, - DA3124E319FCAEE8002858A7 /* QCKDSL.h */, - DA3124E419FCAEE8002858A7 /* QCKDSL.m */, - ); - path = DSL; - sourceTree = ""; - }; - CDB2AA5E1D6C84CF005600C3 /* ObjC */ = { - isa = PBXGroup; - children = ( - 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */, - 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */, - 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */, - DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */, - DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */, - 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */, - 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */, - 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */, - 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */, - ); - path = ObjC; - sourceTree = ""; - }; - DA169E4619FF5DF100619816 /* Configuration */ = { - isa = PBXGroup; - children = ( - DA169E4719FF5DF100619816 /* Configuration.swift */, - CD261AC81DEC8B0000A8863C /* QuickConfiguration.swift */, - ); - path = Configuration; - sourceTree = ""; - }; - DA3124E119FCAEE8002858A7 /* DSL */ = { - isa = PBXGroup; - children = ( - DA3124E519FCAEE8002858A7 /* World+DSL.swift */, - DA3124E219FCAEE8002858A7 /* DSL.swift */, - ); - path = DSL; - sourceTree = ""; - }; - DA408BDE19FF5599005DF92A /* Hooks */ = { - isa = PBXGroup; - children = ( - DA408BDF19FF5599005DF92A /* Closures.swift */, - DA408BE019FF5599005DF92A /* ExampleHooks.swift */, - DA408BE119FF5599005DF92A /* SuiteHooks.swift */, - 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */, - ); - path = Hooks; - sourceTree = ""; - }; - DA8F919419F31680006F6675 /* Helpers */ = { - isa = PBXGroup; - children = ( - DA8F919719F31680006F6675 /* QuickTestsBridgingHeader.h */, - DA8F919519F31680006F6675 /* QCKSpecRunner.h */, - DA8F919619F31680006F6675 /* QCKSpecRunner.m */, - 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */, - DA8F919819F31680006F6675 /* XCTestObservationCenter+QCKSuspendObservation.h */, - 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */, - 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */, - AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */, - ); - path = Helpers; - sourceTree = ""; - }; - DA8F919B19F3189D006F6675 /* FunctionalTests */ = { - isa = PBXGroup; - children = ( - DAE714E919FF65A6005905B8 /* Configuration */, - CDB2AA5E1D6C84CF005600C3 /* ObjC */, - DA7AE6F019FC493F000AFDCE /* ItTests.swift */, - 8D010A561C11726F00633E2B /* DescribeTests.swift */, - DA87078219F48775008C04AC /* BeforeEachTests.swift */, - DA05D60F19F73A3800771050 /* AfterEachTests.swift */, - DAA63EA219F7637300CD0A3B /* PendingTests.swift */, - DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */, - DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */, - DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */, - 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */, - AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */, - DED3037C1DF6CF140041394E /* BundleModuleNameTests.swift */, - CE4A57891EA5DC270063C0D4 /* BehaviorTests.swift */, - ); - path = FunctionalTests; - sourceTree = ""; - }; - DA9876BE1A4C87200004AA17 /* QuickFocusedTests */ = { - isa = PBXGroup; - children = ( - DA9876BF1A4C87200004AA17 /* FocusedTests.swift */, - DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */, - DA9876C31A4C87310004AA17 /* Supporting Files */, - ); - name = QuickFocusedTests; - path = Tests/QuickTests/QuickFocusedTests; - sourceTree = ""; - }; - DA9876C31A4C87310004AA17 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DA9876C01A4C87200004AA17 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - DAE714E919FF65A6005905B8 /* Configuration */ = { - isa = PBXGroup; - children = ( - DAE714F519FF67FF005905B8 /* AfterEach */, - DAE714EA19FF65A6005905B8 /* BeforeEach */, - ); - path = Configuration; - sourceTree = ""; - }; - DAE714EA19FF65A6005905B8 /* BeforeEach */ = { - isa = PBXGroup; - children = ( - DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */, - DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */, - ); - path = BeforeEach; - sourceTree = ""; - }; - DAE714F519FF67FF005905B8 /* AfterEach */ = { - isa = PBXGroup; - children = ( - DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */, - DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */, - ); - path = AfterEach; - sourceTree = ""; - }; - DAEB6B841943873100289F44 = { - isa = PBXGroup; - children = ( - DAEB6B901943873100289F44 /* Quick */, - 6C3983EE1D1E930D00637469 /* QuickObjectiveC */, - DAEB6B9D1943873100289F44 /* QuickTests */, - DA9876BE1A4C87200004AA17 /* QuickFocusedTests */, - 64076D1C1D6D7D0B00E2B499 /* QuickAfterSuiteTests */, - DAEB6B8F1943873100289F44 /* Products */, - 1F118D331BDCA645005013A2 /* Frameworks */, - ); - indentWidth = 4; - sourceTree = ""; - tabWidth = 4; - }; - DAEB6B8F1943873100289F44 /* Products */ = { - isa = PBXGroup; - children = ( - DAEB6B8E1943873100289F44 /* Quick.framework */, - DAEB6B991943873100289F44 /* Quick - macOSTests.xctest */, - 5A5D117C19473F2100F6D13D /* Quick.framework */, - 5A5D118619473F2100F6D13D /* Quick - iOSTests.xctest */, - DA9876B21A4C70EB0004AA17 /* QuickFocused - iOSTests.xctest */, - DA5663E81A4C8D8500193C88 /* QuickFocused - macOSTests.xctest */, - 1F118CD51BDCA4AB005013A2 /* Quick.framework */, - 1F118CDE1BDCA4AB005013A2 /* Quick - tvOSTests.xctest */, - 1F118CF01BDCA4BB005013A2 /* QuickFocused - tvOSTests.xctest */, - 64076CF51D6D7C2000E2B499 /* QuickAfterSuite - macOSTests.xctest */, - 64076D081D6D7CD600E2B499 /* QuickAfterSuite - iOSTests.xctest */, - 64076D1A1D6D7CEA00E2B499 /* QuickAfterSuite - tvOSTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - DAEB6B901943873100289F44 /* Quick */ = { - isa = PBXGroup; - children = ( - DA169E4619FF5DF100619816 /* Configuration */, - DA3124E119FCAEE8002858A7 /* DSL */, - DA408BDE19FF5599005DF92A /* Hooks */, - CD3451461E4703D4000C8633 /* QuickMain.swift */, - CD3451471E4703D4000C8633 /* QuickSpec.swift */, - 34F375A619515CA700CE1B99 /* World.swift */, - 34F3759E19515CA700CE1B99 /* Example.swift */, - DA02C91819A8073100093156 /* ExampleMetadata.swift */, - 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */, - 34F3759C19515CA700CE1B99 /* Callsite.swift */, - DA6B30171A4DB0D500FFB148 /* Filter.swift */, - CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */, - CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */, - CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */, - DED3036A1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift */, - CE57CEDB1C430BD200D63004 /* URL+FileName.swift */, - 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */, - DAEB6B911943873100289F44 /* Supporting Files */, - CE175D4D1E8D6B4900EB5E84 /* Behavior.swift */, - ); - name = Quick; - path = Sources/Quick; - sourceTree = ""; - }; - DAEB6B911943873100289F44 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DAEB6B921943873100289F44 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - DAEB6B9D1943873100289F44 /* QuickTests */ = { - isa = PBXGroup; - children = ( - DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */, - DA8F919419F31680006F6675 /* Helpers */, - DAEB6BCD194387D700289F44 /* Fixtures */, - DA8F919B19F3189D006F6675 /* FunctionalTests */, - F8100E941A1E4469007595ED /* Frameworks */, - DAEB6B9E1943873100289F44 /* Supporting Files */, - ); - name = QuickTests; - path = Tests/QuickTests/QuickTests; - sourceTree = ""; - }; - DAEB6B9E1943873100289F44 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DAEB6B9F1943873100289F44 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - DAEB6BCD194387D700289F44 /* Fixtures */ = { - isa = PBXGroup; - children = ( - DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */, - CE4A578D1EA7251C0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift */, - ); - path = Fixtures; - sourceTree = ""; - }; - F8100E941A1E4469007595ED /* Frameworks */ = { - isa = PBXGroup; - children = ( - F8100E901A1E4447007595ED /* Nimble.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 1F118CD21BDCA4AB005013A2 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118D2B1BDCA5B6005013A2 /* Quick.h in Headers */, - 1F118D261BDCA5AF005013A2 /* World+DSL.h in Headers */, - 96327C651C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */, - 1F118D271BDCA5AF005013A2 /* World.h in Headers */, - 1F118D2A1BDCA5B6005013A2 /* QCKDSL.h in Headers */, - 1F118D2C1BDCA5B6005013A2 /* QuickSpec.h in Headers */, - 1F118D291BDCA5B6005013A2 /* QuickConfiguration.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D117919473F2100F6D13D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DAE714FF19FF6A62005905B8 /* QuickConfiguration.h in Headers */, - 96327C641C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */, - DA3124E919FCAEE8002858A7 /* QCKDSL.h in Headers */, - DAED1ECB1B110699006F61EC /* World+DSL.h in Headers */, - DAED1EC51B1105BC006F61EC /* World.h in Headers */, - 34F375B819515CA700CE1B99 /* QuickSpec.h in Headers */, - 5A5D11A7194740E000F6D13D /* Quick.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B8B1943873100289F44 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DAE714FE19FF6A62005905B8 /* QuickConfiguration.h in Headers */, - 96327C631C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */, - DA3124E819FCAEE8002858A7 /* QCKDSL.h in Headers */, - DAED1ECA1B110699006F61EC /* World+DSL.h in Headers */, - DAED1EC41B1105BC006F61EC /* World.h in Headers */, - 34F375B719515CA700CE1B99 /* QuickSpec.h in Headers */, - DAEB6B941943873100289F44 /* Quick.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F118CE61BDCA4AB005013A2 /* Build configuration list for PBXNativeTarget "Quick-tvOS" */; - buildPhases = ( - 1F118CD01BDCA4AB005013A2 /* Sources */, - 1F118CD11BDCA4AB005013A2 /* Frameworks */, - 1F118CD21BDCA4AB005013A2 /* Headers */, - 1F118CD31BDCA4AB005013A2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Quick-tvOS"; - productName = "Quick-tvOS"; - productReference = 1F118CD51BDCA4AB005013A2 /* Quick.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F118CDD1BDCA4AB005013A2 /* Quick - tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F118CE91BDCA4AB005013A2 /* Build configuration list for PBXNativeTarget "Quick - tvOSTests" */; - buildPhases = ( - 1F118CDA1BDCA4AB005013A2 /* Sources */, - 1F118CDB1BDCA4AB005013A2 /* Frameworks */, - 1F118CDC1BDCA4AB005013A2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F118CE11BDCA4AB005013A2 /* PBXTargetDependency */, - ); - name = "Quick - tvOSTests"; - productName = "Quick-tvOSTests"; - productReference = 1F118CDE1BDCA4AB005013A2 /* Quick - tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F118CEF1BDCA4BB005013A2 /* QuickFocused - tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F118CF81BDCA4BC005013A2 /* Build configuration list for PBXNativeTarget "QuickFocused - tvOSTests" */; - buildPhases = ( - 1F118CEC1BDCA4BB005013A2 /* Sources */, - 1F118CED1BDCA4BB005013A2 /* Frameworks */, - 1F118CEE1BDCA4BB005013A2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F118CF71BDCA4BB005013A2 /* PBXTargetDependency */, - ); - name = "QuickFocused - tvOSTests"; - productName = "QuickFocused-tvOSTests"; - productReference = 1F118CF01BDCA4BB005013A2 /* QuickFocused - tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 5A5D117B19473F2100F6D13D /* Quick-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5A5D119319473F2100F6D13D /* Build configuration list for PBXNativeTarget "Quick-iOS" */; - buildPhases = ( - 5A5D117719473F2100F6D13D /* Sources */, - 5A5D117819473F2100F6D13D /* Frameworks */, - 5A5D117919473F2100F6D13D /* Headers */, - 5A5D117A19473F2100F6D13D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Quick-iOS"; - productName = "Quick-iOS"; - productReference = 5A5D117C19473F2100F6D13D /* Quick.framework */; - productType = "com.apple.product-type.framework"; - }; - 5A5D118519473F2100F6D13D /* Quick - iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5A5D119419473F2100F6D13D /* Build configuration list for PBXNativeTarget "Quick - iOSTests" */; - buildPhases = ( - 5A5D118219473F2100F6D13D /* Sources */, - 5A5D118319473F2100F6D13D /* Frameworks */, - 5A5D118419473F2100F6D13D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5A5D118919473F2100F6D13D /* PBXTargetDependency */, - 5A5D11F0194741B500F6D13D /* PBXTargetDependency */, - 5A5D11F2194741B500F6D13D /* PBXTargetDependency */, - 04DC97E9194B4B7E00CE00B6 /* PBXTargetDependency */, - 04DC97EB194B4B9B00CE00B6 /* PBXTargetDependency */, - 04DC97F3194B82DE00CE00B6 /* PBXTargetDependency */, - 04DC97F7194B831200CE00B6 /* PBXTargetDependency */, - 04DC97FB194B834100CE00B6 /* PBXTargetDependency */, - 04DC97FF194B835E00CE00B6 /* PBXTargetDependency */, - 04DC9803194B836300CE00B6 /* PBXTargetDependency */, - 04DC9807194B838700CE00B6 /* PBXTargetDependency */, - ); - name = "Quick - iOSTests"; - productName = "Quick-iOSTests"; - productReference = 5A5D118619473F2100F6D13D /* Quick - iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 64076CE51D6D7C2000E2B499 /* QuickAfterSuite - macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 64076CF21D6D7C2000E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite - macOSTests" */; - buildPhases = ( - 64076CE81D6D7C2000E2B499 /* Sources */, - 64076CEE1D6D7C2000E2B499 /* Frameworks */, - 64076CF11D6D7C2000E2B499 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 64076CE61D6D7C2000E2B499 /* PBXTargetDependency */, - ); - name = "QuickAfterSuite - macOSTests"; - productName = "QuickFocused-macOSTests"; - productReference = 64076CF51D6D7C2000E2B499 /* QuickAfterSuite - macOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 64076CF81D6D7CD600E2B499 /* QuickAfterSuite - iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 64076D051D6D7CD600E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite - iOSTests" */; - buildPhases = ( - 64076CFB1D6D7CD600E2B499 /* Sources */, - 64076D011D6D7CD600E2B499 /* Frameworks */, - 64076D041D6D7CD600E2B499 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 64076CF91D6D7CD600E2B499 /* PBXTargetDependency */, - ); - name = "QuickAfterSuite - iOSTests"; - productName = "QuickFocused-iOSTests"; - productReference = 64076D081D6D7CD600E2B499 /* QuickAfterSuite - iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 64076D0A1D6D7CEA00E2B499 /* QuickAfterSuite - tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 64076D171D6D7CEA00E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite - tvOSTests" */; - buildPhases = ( - 64076D0D1D6D7CEA00E2B499 /* Sources */, - 64076D131D6D7CEA00E2B499 /* Frameworks */, - 64076D161D6D7CEA00E2B499 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 64076D0B1D6D7CEA00E2B499 /* PBXTargetDependency */, - ); - name = "QuickAfterSuite - tvOSTests"; - productName = "QuickFocused-tvOSTests"; - productReference = 64076D1A1D6D7CEA00E2B499 /* QuickAfterSuite - tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - DA5663E71A4C8D8500193C88 /* QuickFocused - macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DA5663F31A4C8D8500193C88 /* Build configuration list for PBXNativeTarget "QuickFocused - macOSTests" */; - buildPhases = ( - DA5663E41A4C8D8500193C88 /* Sources */, - DA5663E51A4C8D8500193C88 /* Frameworks */, - DA5663E61A4C8D8500193C88 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - DA5663F01A4C8D8500193C88 /* PBXTargetDependency */, - ); - name = "QuickFocused - macOSTests"; - productName = "QuickFocused-macOSTests"; - productReference = DA5663E81A4C8D8500193C88 /* QuickFocused - macOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - DA9876B11A4C70EB0004AA17 /* QuickFocused - iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DA9876BD1A4C70EB0004AA17 /* Build configuration list for PBXNativeTarget "QuickFocused - iOSTests" */; - buildPhases = ( - DA9876AE1A4C70EB0004AA17 /* Sources */, - DA9876AF1A4C70EB0004AA17 /* Frameworks */, - DA9876B01A4C70EB0004AA17 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - DA9876BA1A4C70EB0004AA17 /* PBXTargetDependency */, - ); - name = "QuickFocused - iOSTests"; - productName = "QuickFocused-iOSTests"; - productReference = DA9876B21A4C70EB0004AA17 /* QuickFocused - iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - DAEB6B8D1943873100289F44 /* Quick-macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = DAEB6BA41943873200289F44 /* Build configuration list for PBXNativeTarget "Quick-macOS" */; - buildPhases = ( - DAEB6B891943873100289F44 /* Sources */, - DAEB6B8A1943873100289F44 /* Frameworks */, - DAEB6B8B1943873100289F44 /* Headers */, - DAEB6B8C1943873100289F44 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Quick-macOS"; - productName = Quick; - productReference = DAEB6B8E1943873100289F44 /* Quick.framework */; - productType = "com.apple.product-type.framework"; - }; - DAEB6B981943873100289F44 /* Quick - macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DAEB6BA71943873200289F44 /* Build configuration list for PBXNativeTarget "Quick - macOSTests" */; - buildPhases = ( - DAEB6B951943873100289F44 /* Sources */, - DAEB6B961943873100289F44 /* Frameworks */, - DAEB6B971943873100289F44 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - DAEB6B9C1943873100289F44 /* PBXTargetDependency */, - 047655521949F4CB00B288BB /* PBXTargetDependency */, - 047655541949F4CB00B288BB /* PBXTargetDependency */, - 04765556194A327000B288BB /* PBXTargetDependency */, - 04DC97E5194B4A6000CE00B6 /* PBXTargetDependency */, - 04DC97E7194B4A6000CE00B6 /* PBXTargetDependency */, - 04DC97F1194B82DB00CE00B6 /* PBXTargetDependency */, - 04DC97F9194B834000CE00B6 /* PBXTargetDependency */, - 04DC97FD194B834B00CE00B6 /* PBXTargetDependency */, - 04DC9801194B836100CE00B6 /* PBXTargetDependency */, - 04DC9805194B838400CE00B6 /* PBXTargetDependency */, - 04DC9809194B838B00CE00B6 /* PBXTargetDependency */, - 93625F391951DDC8006B1FE1 /* PBXTargetDependency */, - ); - name = "Quick - macOSTests"; - productName = QuickTests; - productReference = DAEB6B991943873100289F44 /* Quick - macOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - DAEB6B851943873100289F44 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0810; - LastUpgradeCheck = 0900; - ORGANIZATIONNAME = "Brian Ivan Gesiak"; - TargetAttributes = { - 1F118CD41BDCA4AB005013A2 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 1F118CDD1BDCA4AB005013A2 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 1F118CEF1BDCA4BB005013A2 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 5A5D117B19473F2100F6D13D = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - }; - 5A5D118519473F2100F6D13D = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - TestTargetID = 5A5D117B19473F2100F6D13D; - }; - 732D8D691E516780008558BD = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - }; - DA5663E71A4C8D8500193C88 = { - CreatedOnToolsVersion = 6.2; - LastSwiftMigration = 0800; - }; - DA9876B11A4C70EB0004AA17 = { - CreatedOnToolsVersion = 6.2; - LastSwiftMigration = 0800; - }; - DAEB6B8D1943873100289F44 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - }; - DAEB6B981943873100289F44 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - TestTargetID = DAEB6B8D1943873100289F44; - }; - }; - }; - buildConfigurationList = DAEB6B881943873100289F44 /* Build configuration list for PBXProject "Quick" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = DAEB6B841943873100289F44; - productRefGroup = DAEB6B8F1943873100289F44 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - DAEB6B8D1943873100289F44 /* Quick-macOS */, - DAEB6B981943873100289F44 /* Quick - macOSTests */, - DA5663E71A4C8D8500193C88 /* QuickFocused - macOSTests */, - 64076CE51D6D7C2000E2B499 /* QuickAfterSuite - macOSTests */, - 5A5D117B19473F2100F6D13D /* Quick-iOS */, - 5A5D118519473F2100F6D13D /* Quick - iOSTests */, - DA9876B11A4C70EB0004AA17 /* QuickFocused - iOSTests */, - 64076CF81D6D7CD600E2B499 /* QuickAfterSuite - iOSTests */, - 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */, - 1F118CDD1BDCA4AB005013A2 /* Quick - tvOSTests */, - 1F118CEF1BDCA4BB005013A2 /* QuickFocused - tvOSTests */, - 64076D0A1D6D7CEA00E2B499 /* QuickAfterSuite - tvOSTests */, - 732D8D691E516780008558BD /* SwiftLint */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1F118CD31BDCA4AB005013A2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CDC1BDCA4AB005013A2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CEE1BDCA4BB005013A2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D117A19473F2100F6D13D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D118419473F2100F6D13D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076CF11D6D7C2000E2B499 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D041D6D7CD600E2B499 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D161D6D7CEA00E2B499 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA5663E61A4C8D8500193C88 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA9876B01A4C70EB0004AA17 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B8C1943873100289F44 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B971943873100289F44 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 732D8D6D1E516789008558BD /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1F118CD01BDCA4AB005013A2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 96327C681C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */, - 1F118D031BDCA536005013A2 /* World.swift in Sources */, - CE590E201C431FE400253D19 /* QuickSelectedTestSuiteBuilder.swift in Sources */, - 1F118CFC1BDCA536005013A2 /* Configuration.swift in Sources */, - 1F118D021BDCA536005013A2 /* SuiteHooks.swift in Sources */, - 1F118CFB1BDCA536005013A2 /* QuickConfiguration.m in Sources */, - 34C5860A1C4AC5E500D4F057 /* ErrorUtility.swift in Sources */, - 1F118D041BDCA536005013A2 /* Example.swift in Sources */, - 1F118CFF1BDCA536005013A2 /* QCKDSL.m in Sources */, - DED3036D1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift in Sources */, - CE590E211C431FE400253D19 /* NSBundle+CurrentTestBundle.swift in Sources */, - 1F118D071BDCA536005013A2 /* Callsite.swift in Sources */, - CE590E231C431FE400253D19 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, - 1F118D081BDCA536005013A2 /* Filter.swift in Sources */, - 1F118CFD1BDCA536005013A2 /* World+DSL.swift in Sources */, - CE590E221C431FE400253D19 /* URL+FileName.swift in Sources */, - 1F118CFE1BDCA536005013A2 /* DSL.swift in Sources */, - 7B44ADC01C5444940007AF2E /* HooksPhase.swift in Sources */, - 1F118D001BDCA536005013A2 /* Closures.swift in Sources */, - 1F118D051BDCA536005013A2 /* ExampleMetadata.swift in Sources */, - 1F118D061BDCA536005013A2 /* ExampleGroup.swift in Sources */, - CE175D501E8D6B4900EB5E84 /* Behavior.swift in Sources */, - CE590E1F1C431FE400253D19 /* QuickTestSuite.swift in Sources */, - 1F118D091BDCA536005013A2 /* QuickSpec.m in Sources */, - 1F118D011BDCA536005013A2 /* ExampleHooks.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CDA1BDCA4AB005013A2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118D381BDCA6E1005013A2 /* Configuration+BeforeEachTests.swift in Sources */, - 1F118D121BDCA556005013A2 /* ItTests.swift in Sources */, - 1F118D1C1BDCA556005013A2 /* BeforeSuiteTests.swift in Sources */, - 1F118D1D1BDCA556005013A2 /* BeforeSuiteTests+ObjC.m in Sources */, - 1F118D0E1BDCA547005013A2 /* QCKSpecRunner.m in Sources */, - CE4A57931EA725420063C0D4 /* BehaviorTests.swift in Sources */, - 1F118D141BDCA556005013A2 /* FailureTests+ObjC.m in Sources */, - CE4A57911EA7252E0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift in Sources */, - DED3037F1DF6CF140041394E /* BundleModuleNameTests.swift in Sources */, - 1F118D0F1BDCA54B005013A2 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */, - 1F118D101BDCA556005013A2 /* Configuration+AfterEach.swift in Sources */, - 1F118D1A1BDCA556005013A2 /* PendingTests.swift in Sources */, - 1F118D171BDCA556005013A2 /* BeforeEachTests+ObjC.m in Sources */, - 1F118D231BDCA556005013A2 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */, - 1F118D151BDCA556005013A2 /* FailureUsingXCTAssertTests+ObjC.m in Sources */, - 1F118D131BDCA556005013A2 /* ItTests+ObjC.m in Sources */, - 1F118D191BDCA556005013A2 /* AfterEachTests+ObjC.m in Sources */, - 1F118D221BDCA556005013A2 /* SharedExamples+BeforeEachTests.swift in Sources */, - AE4E58171C73097E00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - AED9C8651CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */, - 1F118D211BDCA556005013A2 /* SharedExamplesTests+ObjC.m in Sources */, - 1F118D201BDCA556005013A2 /* SharedExamplesTests.swift in Sources */, - 1F118D0C1BDCA543005013A2 /* QuickConfigurationTests.m in Sources */, - 1F118D391BDCA6E6005013A2 /* Configuration+BeforeEach.swift in Sources */, - 1F118D181BDCA556005013A2 /* AfterEachTests.swift in Sources */, - 1F118D1B1BDCA556005013A2 /* PendingTests+ObjC.m in Sources */, - 34C586051C4ABD4100D4F057 /* XCTestCaseProvider.swift in Sources */, - 8D010A591C11726F00633E2B /* DescribeTests.swift in Sources */, - 1F118D111BDCA556005013A2 /* Configuration+AfterEachTests.swift in Sources */, - 1F118D161BDCA556005013A2 /* BeforeEachTests.swift in Sources */, - 7B5358D01C3D4FC000A23FAA /* ContextTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CEC1BDCA4BB005013A2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118D0D1BDCA547005013A2 /* QCKSpecRunner.m in Sources */, - 34C586061C4ABD4100D4F057 /* XCTestCaseProvider.swift in Sources */, - 1F118D241BDCA561005013A2 /* FocusedTests.swift in Sources */, - 1F118D251BDCA561005013A2 /* FocusedTests+ObjC.m in Sources */, - AE4E58181C73097E00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D117719473F2100F6D13D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 96327C671C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */, - CE590E1B1C431FE300253D19 /* QuickSelectedTestSuiteBuilder.swift in Sources */, - DA3124EB19FCAEE8002858A7 /* QCKDSL.m in Sources */, - DA408BE319FF5599005DF92A /* Closures.swift in Sources */, - DA02C91A19A8073100093156 /* ExampleMetadata.swift in Sources */, - 34C586091C4AC5E500D4F057 /* ErrorUtility.swift in Sources */, - DA408BE719FF5599005DF92A /* SuiteHooks.swift in Sources */, - 34F375BA19515CA700CE1B99 /* QuickSpec.m in Sources */, - DED3036C1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift in Sources */, - CE590E1C1C431FE300253D19 /* NSBundle+CurrentTestBundle.swift in Sources */, - DAE7150119FF6A62005905B8 /* QuickConfiguration.m in Sources */, - CE590E1E1C431FE300253D19 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, - 34F375A819515CA700CE1B99 /* Callsite.swift in Sources */, - 34F375AE19515CA700CE1B99 /* ExampleGroup.swift in Sources */, - CE590E1D1C431FE300253D19 /* URL+FileName.swift in Sources */, - 34F375BC19515CA700CE1B99 /* World.swift in Sources */, - DA169E4919FF5DF100619816 /* Configuration.swift in Sources */, - 7B44ADBF1C5444940007AF2E /* HooksPhase.swift in Sources */, - DA3124ED19FCAEE8002858A7 /* World+DSL.swift in Sources */, - DA408BE519FF5599005DF92A /* ExampleHooks.swift in Sources */, - 34F375AC19515CA700CE1B99 /* Example.swift in Sources */, - CE175D4F1E8D6B4900EB5E84 /* Behavior.swift in Sources */, - CE590E1A1C431FE300253D19 /* QuickTestSuite.swift in Sources */, - DA3124E719FCAEE8002858A7 /* DSL.swift in Sources */, - DA6B30191A4DB0D500FFB148 /* Filter.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D118219473F2100F6D13D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DAE714F819FF6812005905B8 /* Configuration+AfterEach.swift in Sources */, - DAA7C0D719F777EB0093D1D9 /* BeforeEachTests.swift in Sources */, - DA8F919A19F31680006F6675 /* QCKSpecRunner.m in Sources */, - DA8940F11B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m in Sources */, - 4728253C1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m in Sources */, - DAE714F119FF65D3005905B8 /* Configuration+BeforeEachTests.swift in Sources */, - DED3037E1DF6CF140041394E /* BundleModuleNameTests.swift in Sources */, - DA05D61119F73A3800771050 /* AfterEachTests.swift in Sources */, - DAB0137019FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */, - DA8F91A619F3208B006F6675 /* BeforeSuiteTests.swift in Sources */, - DA8C00221A01E4B900CE58A6 /* QuickConfigurationTests.m in Sources */, - CE4A578A1EA5DC270063C0D4 /* BehaviorTests.swift in Sources */, - DAA63EA419F7637300CD0A3B /* PendingTests.swift in Sources */, - DA8F91AC19F3299E006F6675 /* SharedExamplesTests.swift in Sources */, - DA7AE6F219FC493F000AFDCE /* ItTests.swift in Sources */, - 4748E8951A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */, - CE4A578E1EA7251C0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift in Sources */, - DA8F91AF19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */, - DAE714FB19FF682A005905B8 /* Configuration+AfterEachTests.swift in Sources */, - AE4E58151C73097C00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - AED9C8641CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */, - 471590411A488F3F00FBA644 /* PendingTests+ObjC.m in Sources */, - DA8F919E19F31921006F6675 /* FailureTests+ObjC.m in Sources */, - DAE714F419FF65E7005905B8 /* Configuration+BeforeEach.swift in Sources */, - 479C31E41A36172700DA8718 /* ItTests+ObjC.m in Sources */, - 34C586031C4ABD4000D4F057 /* XCTestCaseProvider.swift in Sources */, - 8D010A581C11726F00633E2B /* DescribeTests.swift in Sources */, - 47FAEA371A3F49EB005A1D2F /* BeforeEachTests+ObjC.m in Sources */, - 470D6ECC1A43442900043E50 /* AfterEachTests+ObjC.m in Sources */, - 47876F7E1A49AD71002575C7 /* BeforeSuiteTests+ObjC.m in Sources */, - 7B5358CF1C3D4FBE00A23FAA /* ContextTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076CE81D6D7C2000E2B499 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D211D6D7E4D00E2B499 /* AfterSuiteTests.swift in Sources */, - CD264DBD1DDA147A0038B0EB /* AfterSuiteTests+ObjC.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076CFB1D6D7CD600E2B499 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D221D6D7E5B00E2B499 /* AfterSuiteTests.swift in Sources */, - 64076D261D6D80B500E2B499 /* AfterSuiteTests+ObjC.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D0D1D6D7CEA00E2B499 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D231D6D7E6B00E2B499 /* AfterSuiteTests.swift in Sources */, - 64076D271D6D80B500E2B499 /* AfterSuiteTests+ObjC.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA5663E41A4C8D8500193C88 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DA07722E1A4E5B7B0098839D /* QCKSpecRunner.m in Sources */, - 34C586021C4ABD3F00D4F057 /* XCTestCaseProvider.swift in Sources */, - DA5663F41A4C8D9A00193C88 /* FocusedTests.swift in Sources */, - DAF28BC31A4DB8EC00A5D9BF /* FocusedTests+ObjC.m in Sources */, - AE4E58141C73097A00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA9876AE1A4C70EB0004AA17 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DA07722F1A4E5B7C0098839D /* QCKSpecRunner.m in Sources */, - 34C586041C4ABD4000D4F057 /* XCTestCaseProvider.swift in Sources */, - DA9876C11A4C87200004AA17 /* FocusedTests.swift in Sources */, - DAF28BC41A4DB8EC00A5D9BF /* FocusedTests+ObjC.m in Sources */, - AE4E58161C73097C00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B891943873100289F44 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 96327C661C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */, - CE57CEDE1C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift in Sources */, - DA3124EA19FCAEE8002858A7 /* QCKDSL.m in Sources */, - DA408BE219FF5599005DF92A /* Closures.swift in Sources */, - CE57CEDD1C430BD200D63004 /* NSBundle+CurrentTestBundle.swift in Sources */, - DA02C91919A8073100093156 /* ExampleMetadata.swift in Sources */, - CE57CEDF1C430BD200D63004 /* QuickTestSuite.swift in Sources */, - 34C586081C4AC5E500D4F057 /* ErrorUtility.swift in Sources */, - DED3036B1DF6C66B0041394E /* NSString+C99ExtendedIdentifier.swift in Sources */, - DA408BE619FF5599005DF92A /* SuiteHooks.swift in Sources */, - 34F375B919515CA700CE1B99 /* QuickSpec.m in Sources */, - CE57CEE11C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, - DAE7150019FF6A62005905B8 /* QuickConfiguration.m in Sources */, - 34F375A719515CA700CE1B99 /* Callsite.swift in Sources */, - CE57CEE01C430BD200D63004 /* URL+FileName.swift in Sources */, - 34F375AD19515CA700CE1B99 /* ExampleGroup.swift in Sources */, - 34F375BB19515CA700CE1B99 /* World.swift in Sources */, - DA169E4819FF5DF100619816 /* Configuration.swift in Sources */, - 7B44ADBE1C5444940007AF2E /* HooksPhase.swift in Sources */, - DA3124EC19FCAEE8002858A7 /* World+DSL.swift in Sources */, - DA408BE419FF5599005DF92A /* ExampleHooks.swift in Sources */, - CE175D4E1E8D6B4900EB5E84 /* Behavior.swift in Sources */, - 34F375AB19515CA700CE1B99 /* Example.swift in Sources */, - DA3124E619FCAEE8002858A7 /* DSL.swift in Sources */, - DA6B30181A4DB0D500FFB148 /* Filter.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B951943873100289F44 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DAE714F719FF6812005905B8 /* Configuration+AfterEach.swift in Sources */, - DAB067E919F7801C00F970AC /* BeforeEachTests.swift in Sources */, - DA8F919919F31680006F6675 /* QCKSpecRunner.m in Sources */, - DA8940F01B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m in Sources */, - 4728253B1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m in Sources */, - CE4A57941EA725440063C0D4 /* BehaviorTests.swift in Sources */, - DAE714F019FF65D3005905B8 /* Configuration+BeforeEachTests.swift in Sources */, - CE4A57921EA725300063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift in Sources */, - DED3037D1DF6CF140041394E /* BundleModuleNameTests.swift in Sources */, - DA05D61019F73A3800771050 /* AfterEachTests.swift in Sources */, - DAB0136F19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */, - DA8F91A519F3208B006F6675 /* BeforeSuiteTests.swift in Sources */, - DA8C00211A01E4B900CE58A6 /* QuickConfigurationTests.m in Sources */, - DAA63EA319F7637300CD0A3B /* PendingTests.swift in Sources */, - DA8F91AB19F3299E006F6675 /* SharedExamplesTests.swift in Sources */, - DA7AE6F119FC493F000AFDCE /* ItTests.swift in Sources */, - 4748E8941A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */, - DA8F91AE19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */, - DAE714FA19FF682A005905B8 /* Configuration+AfterEachTests.swift in Sources */, - AE4E58131C73097A00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - AED9C8631CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */, - 471590401A488F3F00FBA644 /* PendingTests+ObjC.m in Sources */, - DA8F919D19F31921006F6675 /* FailureTests+ObjC.m in Sources */, - DAE714F319FF65E7005905B8 /* Configuration+BeforeEach.swift in Sources */, - 479C31E31A36171B00DA8718 /* ItTests+ObjC.m in Sources */, - 34C586011C4ABD3F00D4F057 /* XCTestCaseProvider.swift in Sources */, - 8D010A571C11726F00633E2B /* DescribeTests.swift in Sources */, - 47FAEA361A3F49E6005A1D2F /* BeforeEachTests+ObjC.m in Sources */, - 470D6ECB1A43442400043E50 /* AfterEachTests+ObjC.m in Sources */, - 47876F7D1A49AD63002575C7 /* BeforeSuiteTests+ObjC.m in Sources */, - 7B5358CE1C3D4FBC00A23FAA /* ContextTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 047655521949F4CB00B288BB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 047655511949F4CB00B288BB /* PBXContainerItemProxy */; - }; - 047655541949F4CB00B288BB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 047655531949F4CB00B288BB /* PBXContainerItemProxy */; - }; - 04765556194A327000B288BB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04765555194A327000B288BB /* PBXContainerItemProxy */; - }; - 04DC97E5194B4A6000CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97E4194B4A6000CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97E7194B4A6000CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97E6194B4A6000CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97E9194B4B7E00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97E8194B4B7E00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97EB194B4B9B00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97EA194B4B9B00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F1194B82DB00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97F0194B82DB00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F3194B82DE00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97F2194B82DE00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F7194B831200CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97F6194B831200CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F9194B834000CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97F8194B834000CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97FB194B834100CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97FA194B834100CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97FD194B834B00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97FC194B834B00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97FF194B835E00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97FE194B835E00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9801194B836100CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC9800194B836100CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9803194B836300CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC9802194B836300CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9805194B838400CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC9804194B838400CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9807194B838700CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC9806194B838700CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9809194B838B00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC9808194B838B00CE00B6 /* PBXContainerItemProxy */; - }; - 1F118CE11BDCA4AB005013A2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */; - targetProxy = 1F118CE01BDCA4AB005013A2 /* PBXContainerItemProxy */; - }; - 1F118CF71BDCA4BB005013A2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */; - targetProxy = 1F118CF61BDCA4BB005013A2 /* PBXContainerItemProxy */; - }; - 5A5D118919473F2100F6D13D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 5A5D118819473F2100F6D13D /* PBXContainerItemProxy */; - }; - 5A5D11F0194741B500F6D13D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 5A5D11EF194741B500F6D13D /* PBXContainerItemProxy */; - }; - 5A5D11F2194741B500F6D13D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 5A5D11F1194741B500F6D13D /* PBXContainerItemProxy */; - }; - 64076CE61D6D7C2000E2B499 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 64076CE71D6D7C2000E2B499 /* PBXContainerItemProxy */; - }; - 64076CF91D6D7CD600E2B499 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 64076CFA1D6D7CD600E2B499 /* PBXContainerItemProxy */; - }; - 64076D0B1D6D7CEA00E2B499 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */; - targetProxy = 64076D0C1D6D7CEA00E2B499 /* PBXContainerItemProxy */; - }; - 93625F391951DDC8006B1FE1 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 93625F381951DDC8006B1FE1 /* PBXContainerItemProxy */; - }; - DA5663F01A4C8D8500193C88 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = DA5663EF1A4C8D8500193C88 /* PBXContainerItemProxy */; - }; - DA9876BA1A4C70EB0004AA17 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = DA9876B91A4C70EB0004AA17 /* PBXContainerItemProxy */; - }; - DAEB6B9C1943873100289F44 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = DAEB6B9B1943873100289F44 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1F118CE71BDCA4AB005013A2 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Sources/Quick/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Quick; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 1F118CE81BDCA4AB005013A2 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Sources/Quick/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Quick; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 1F118CEA1BDCA4AB005013A2 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 1F118CEB1BDCA4AB005013A2 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 1F118CF91BDCA4BC005013A2 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 1F118CFA1BDCA4BC005013A2 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 5A5D118F19473F2100F6D13D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/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"; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Quick; - PRODUCT_NAME = Quick; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 5A5D119019473F2100F6D13D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/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"; - METAL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Quick; - PRODUCT_NAME = Quick; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 5A5D119119473F2100F6D13D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 5A5D119219473F2100F6D13D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 64076CF31D6D7C2000E2B499 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 64076CF41D6D7C2000E2B499 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 64076D061D6D7CD600E2B499 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 64076D071D6D7CD600E2B499 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 64076D181D6D7CEA00E2B499 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 64076D191D6D7CEA00E2B499 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 732D8D6B1E516780008558BD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 732D8D6C1E516780008558BD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - DA5663F11A4C8D8500193C88 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - DA5663F21A4C8D8500193C88 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - DA9876BB1A4C70EB0004AA17 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - DA9876BC1A4C70EB0004AA17 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - DAEB6BA21943873200289F44 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_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_ERROR; - 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_ERROR; - 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; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - DAEB6BA31943873200289F44 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_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_ERROR; - 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_ERROR; - 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; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - DAEB6BA51943873200289F44 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = Sources/Quick/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.9; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Quick; - PRODUCT_NAME = Quick; - SKIP_INSTALL = YES; - SWIFT_OBJC_BRIDGING_HEADER = ""; - VALID_ARCHS = x86_64; - }; - name = Debug; - }; - DAEB6BA61943873200289F44 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = Sources/Quick/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.9; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Quick; - PRODUCT_NAME = Quick; - SKIP_INSTALL = YES; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALID_ARCHS = x86_64; - }; - name = Release; - }; - DAEB6BA81943873200289F44 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - METAL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - DAEB6BA91943873200289F44 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - METAL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1F118CE61BDCA4AB005013A2 /* Build configuration list for PBXNativeTarget "Quick-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F118CE71BDCA4AB005013A2 /* Debug */, - 1F118CE81BDCA4AB005013A2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F118CE91BDCA4AB005013A2 /* Build configuration list for PBXNativeTarget "Quick - tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F118CEA1BDCA4AB005013A2 /* Debug */, - 1F118CEB1BDCA4AB005013A2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F118CF81BDCA4BC005013A2 /* Build configuration list for PBXNativeTarget "QuickFocused - tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F118CF91BDCA4BC005013A2 /* Debug */, - 1F118CFA1BDCA4BC005013A2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5A5D119319473F2100F6D13D /* Build configuration list for PBXNativeTarget "Quick-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5A5D118F19473F2100F6D13D /* Debug */, - 5A5D119019473F2100F6D13D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5A5D119419473F2100F6D13D /* Build configuration list for PBXNativeTarget "Quick - iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5A5D119119473F2100F6D13D /* Debug */, - 5A5D119219473F2100F6D13D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 64076CF21D6D7C2000E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite - macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 64076CF31D6D7C2000E2B499 /* Debug */, - 64076CF41D6D7C2000E2B499 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 64076D051D6D7CD600E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite - iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 64076D061D6D7CD600E2B499 /* Debug */, - 64076D071D6D7CD600E2B499 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 64076D171D6D7CEA00E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite - tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 64076D181D6D7CEA00E2B499 /* Debug */, - 64076D191D6D7CEA00E2B499 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 732D8D6A1E516780008558BD /* Build configuration list for PBXAggregateTarget "SwiftLint" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 732D8D6B1E516780008558BD /* Debug */, - 732D8D6C1E516780008558BD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DA5663F31A4C8D8500193C88 /* Build configuration list for PBXNativeTarget "QuickFocused - macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DA5663F11A4C8D8500193C88 /* Debug */, - DA5663F21A4C8D8500193C88 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DA9876BD1A4C70EB0004AA17 /* Build configuration list for PBXNativeTarget "QuickFocused - iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DA9876BB1A4C70EB0004AA17 /* Debug */, - DA9876BC1A4C70EB0004AA17 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DAEB6B881943873100289F44 /* Build configuration list for PBXProject "Quick" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DAEB6BA21943873200289F44 /* Debug */, - DAEB6BA31943873200289F44 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DAEB6BA41943873200289F44 /* Build configuration list for PBXNativeTarget "Quick-macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DAEB6BA51943873200289F44 /* Debug */, - DAEB6BA61943873200289F44 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DAEB6BA71943873200289F44 /* Build configuration list for PBXNativeTarget "Quick - macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DAEB6BA81943873200289F44 /* Debug */, - DAEB6BA91943873200289F44 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = DAEB6B851943873100289F44 /* Project object */; -} diff --git a/Carthage/Checkouts/Quick/Quick.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Quick/Quick.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a459aa8..0000000 --- a/Carthage/Checkouts/Quick/Quick.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-iOS.xcscheme b/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-iOS.xcscheme deleted file mode 100644 index 64426f2..0000000 --- a/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-iOS.xcscheme +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme b/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme deleted file mode 100644 index d7e1b02..0000000 --- a/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-tvOS.xcscheme b/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-tvOS.xcscheme deleted file mode 100644 index 54c1661..0000000 --- a/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-tvOS.xcscheme +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Quick/Quick.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Quick/Quick.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 48af53a..0000000 --- a/Carthage/Checkouts/Quick/Quick.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Carthage/Checkouts/Quick/README.md b/Carthage/Checkouts/Quick/README.md deleted file mode 100644 index e6dc0ad..0000000 --- a/Carthage/Checkouts/Quick/README.md +++ /dev/null @@ -1,88 +0,0 @@ -![](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). - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/QuickSpec%20screenshot.png) - -```swift -// Swift - -import Quick -import Nimble - -class TableOfContentsSpec: QuickSpec { - override func spec() { - describe("the 'Documentation' directory") { - it("has everything you need to get started") { - let sections = Directory("Documentation").sections - expect(sections).to(contain("Organized Tests with Quick Examples and Example Groups")) - expect(sections).to(contain("Installing Quick")) - } - - context("if it doesn't have what you're looking for") { - it("needs to be updated") { - let you = You(awesome: true) - expect{you.submittedAnIssue}.toEventually(beTruthy()) - } - } - } - } -} -``` -#### Nimble -Quick comes together with [Nimble](https://github.com/Quick/Nimble) — a matcher framework for your tests. You can learn why `XCTAssert()` statements make your expectations unclear and how to fix that using Nimble assertions [here](./Documentation/en-us/NimbleAssertions.md). - -## Swift Version - -Certain versions of Quick and Nimble only support certain versions of Swift. Depending on which version of Swift your project uses, you should use specific versions of Quick and Nimble. Use the table below to determine which versions of Quick and Nimble are compatible with your project. - -|Swift version |Quick version |Nimble version | -|:--------------------|:---------------|:--------------| -|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 - -All documentation can be found in the [Documentation folder](./Documentation), including [detailed installation instructions](./Documentation/en-us/InstallingQuick.md) for CocoaPods, Carthage, Git submodules, and more. For example, you can install Quick and [Nimble](https://github.com/Quick/Nimble) using CocoaPods by adding the following to your Podfile: - -```rb -# Podfile - -use_frameworks! - -target "MyApp" do - # Normal libraries - - abstract_target 'Tests' do - inherit! :search_paths - target "MyAppTests" - target "MyAppUITests" - - pod 'Quick' - pod 'Nimble' - end -end -``` - -## Projects using Quick - -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/Carthage/Checkouts/Quick/Rakefile b/Carthage/Checkouts/Quick/Rakefile deleted file mode 100644 index a5214a4..0000000 --- a/Carthage/Checkouts/Quick/Rakefile +++ /dev/null @@ -1,67 +0,0 @@ -def run(env = {}, command) - system(env, command) or raise "RAKE TASK FAILED: #{command}" -end - -def has_xcodebuild - system "which xcodebuild >/dev/null" -end - -def xcode_action - ENV["XCODE_ACTION"] || "build test" -end - -namespace "podspec" do - desc "Run lint for podspec" - task :lint do - run "bundle exec pod lib lint" - end -end - -namespace "test" do - desc "Run unit tests for all iOS targets" - task :ios do |t| - run "xcodebuild -workspace Quick.xcworkspace -scheme Quick-iOS -destination 'platform=iOS Simulator,name=iPhone 6' clean #{xcode_action}" - end - - desc "Run unit tests for all tvOS targets" - task :tvos do |t| - run "xcodebuild -workspace Quick.xcworkspace -scheme Quick-tvOS -destination 'platform=tvOS Simulator,name=Apple TV 1080p' clean #{xcode_action}" - end - - desc "Run unit tests for all macOS targets" - task :macos do |t| - run "xcodebuild -workspace Quick.xcworkspace -scheme Quick-macOS clean #{xcode_action}" - end - - desc "Run unit tests for the current platform built by the Swift Package Manager" - task :swiftpm do |t| - env = { "SWIFT_PACKAGE_TEST_Quick" => "true" } - run env, "swift package clean && swift test" - end -end - -namespace "templates" do - install_dir = File.expand_path("~/Library/Developer/Xcode/Templates/File Templates/Quick") - src_dir = File.expand_path("../Quick Templates", __FILE__) - - desc "Install Quick templates" - task :install do - if File.exists? install_dir - raise "RAKE TASK FAILED: Quick templates are already installed at #{install_dir}" - else - mkdir_p install_dir - cp_r src_dir, install_dir - end - end - - desc "Uninstall Quick templates" - task :uninstall do - rm_rf install_dir - end -end - -if has_xcodebuild then - task default: ["test:ios", "test:tvos", "test:macos"] -else - task default: ["test:swiftpm"] -end diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Behavior.swift b/Carthage/Checkouts/Quick/Sources/Quick/Behavior.swift deleted file mode 100644 index 1d98702..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Behavior.swift +++ /dev/null @@ -1,17 +0,0 @@ -/** - A `Behavior` encapsulates a set of examples that can be re-used in several locations using the `itBehavesLike` function with a context instance of the generic type. - */ - -open class Behavior { - - open static var name: String { return String(describing: self) } - /** - override this method in your behavior to define a set of reusable examples. - - This behaves just like an example group defines using `describe` or `context`--it may contain any number of `beforeEach` - and `afterEach` closures, as well as any number of examples (defined using `it`). - - - parameter aContext: A closure that, when evaluated, returns a `Context` instance that provide the information on the subject. - */ - open class func spec(_ aContext: @escaping () -> Context) {} -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift b/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift deleted file mode 100644 index f5e3711..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Foundation - -// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` -// does not work as expected. -#if swift(>=3.2) - #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objcMembers - public class _CallsiteBase: NSObject {} - #else - public class _CallsiteBase: NSObject {} - #endif -#else -public class _CallsiteBase: NSObject {} -#endif - -/** - An object encapsulating the file and line number at which - a particular example is defined. -*/ -final public class Callsite: _CallsiteBase { - /** - The absolute path of the file in which an example is defined. - */ - public let file: String - - /** - The line number on which an example is defined. - */ - public let line: UInt - - internal init(file: String, line: UInt) { - self.file = file - self.line = 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/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift b/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift deleted file mode 100644 index dbb95f1..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift +++ /dev/null @@ -1,161 +0,0 @@ -import Foundation - -/** - A closure that temporarily exposes a Configuration object within - the scope of the closure. -*/ -public typealias QuickConfigurer = (_ configuration: Configuration) -> Void - -/** - A closure that, given metadata about an example, returns a boolean value - indicating whether that example should be run. -*/ -public typealias ExampleFilter = (_ example: Example) -> Bool - -/** - A configuration encapsulates various options you can use - to configure Quick's behavior. -*/ -final public class Configuration: NSObject { - internal let exampleHooks = ExampleHooks() - internal let suiteHooks = SuiteHooks() - internal var exclusionFilters: [ExampleFilter] = [ { example in - if let pending = example.filterFlags[Filter.pending] { - return pending - } else { - return false - } - }] - internal var inclusionFilters: [ExampleFilter] = [ { example in - if let focused = example.filterFlags[Filter.focused] { - return focused - } else { - return false - } - }] - - /** - Run all examples if none match the configured filters. True by default. - */ - public var runAllWhenEverythingFiltered = true - - /** - Registers an inclusion filter. - - All examples are filtered using all inclusion filters. - The remaining examples are run. If no examples remain, all examples are run. - - - parameter filter: A filter that, given an example, returns a value indicating - whether that example should be included in the examples - that are run. - */ - public func include(_ filter: @escaping ExampleFilter) { - inclusionFilters.append(filter) - } - - /** - Registers an exclusion filter. - - All examples that remain after being filtered by the inclusion filters are - then filtered via all exclusion filters. - - - parameter filter: A filter that, given an example, returns a value indicating - whether that example should be excluded from the examples - that are run. - */ - public func exclude(_ filter: @escaping ExampleFilter) { - exclusionFilters.append(filter) - } - - /** - Identical to Quick.Configuration.beforeEach, except the closure is - provided with metadata on the example that the closure is being run - prior to. - */ -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - @objc(beforeEachWithMetadata:) - public func beforeEach(_ closure: @escaping BeforeExampleWithMetadataClosure) { - exampleHooks.appendBefore(closure) - } -#else - public func beforeEach(_ closure: @escaping BeforeExampleWithMetadataClosure) { - exampleHooks.appendBefore(closure) - } -#endif - - /** - Like Quick.DSL.beforeEach, this configures Quick to execute the - given closure before each example that is run. The closure - passed to this method is executed before each example Quick runs, - globally across the test suite. You may call this method multiple - times across mulitple +[QuickConfigure configure:] methods in order - to define several closures to run before each example. - - Note that, since Quick makes no guarantee as to the order in which - +[QuickConfiguration configure:] methods are evaluated, there is no - guarantee as to the order in which beforeEach closures are evaluated - either. Mulitple beforeEach defined on a single configuration, however, - will be executed in the order they're defined. - - - parameter closure: The closure to be executed before each example - in the test suite. - */ - public func beforeEach(_ closure: @escaping BeforeExampleClosure) { - exampleHooks.appendBefore(closure) - } - - /** - Identical to Quick.Configuration.afterEach, except the closure - is provided with metadata on the example that the closure is being - run after. - */ -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - @objc(afterEachWithMetadata:) - public func afterEach(_ closure: @escaping AfterExampleWithMetadataClosure) { - exampleHooks.appendAfter(closure) - } -#else - public func afterEach(_ closure: @escaping AfterExampleWithMetadataClosure) { - exampleHooks.appendAfter(closure) - } -#endif - - /** - Like Quick.DSL.afterEach, this configures Quick to execute the - given closure after each example that is run. The closure - passed to this method is executed after each example Quick runs, - globally across the test suite. You may call this method multiple - times across mulitple +[QuickConfigure configure:] methods in order - to define several closures to run after each example. - - Note that, since Quick makes no guarantee as to the order in which - +[QuickConfiguration configure:] methods are evaluated, there is no - guarantee as to the order in which afterEach closures are evaluated - either. Mulitple afterEach defined on a single configuration, however, - will be executed in the order they're defined. - - - parameter closure: The closure to be executed before each example - in the test suite. - */ - public func afterEach(_ closure: @escaping AfterExampleClosure) { - exampleHooks.appendAfter(closure) - } - - /** - Like Quick.DSL.beforeSuite, this configures Quick to execute - the given closure prior to any and all examples that are run. - The two methods are functionally equivalent. - */ - public func beforeSuite(_ closure: @escaping BeforeSuiteClosure) { - suiteHooks.appendBefore(closure) - } - - /** - Like Quick.DSL.afterSuite, this configures Quick to execute - the given closure after all examples have been run. - The two methods are functionally equivalent. - */ - public func afterSuite(_ closure: @escaping AfterSuiteClosure) { - suiteHooks.appendAfter(closure) - } -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift b/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift deleted file mode 100644 index ee7664b..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift +++ /dev/null @@ -1,39 +0,0 @@ -import Foundation -import XCTest - -// NOTE: This file is not intended to be included in the Xcode project or CocoaPods. -// It is picked up by the Swift Package Manager during its build process. - -#if SWIFT_PACKAGE - -open class QuickConfiguration: NSObject { - open class func configure(_ configuration: Configuration) {} -} - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - -internal func qck_enumerateSubclasses(_ klass: T.Type, block: (T.Type) -> Void) { - var classesCount = objc_getClassList(nil, 0) - - guard classesCount > 0 else { - return - } - - let classes = UnsafeMutablePointer.allocate(capacity: Int(classesCount)) - classesCount = objc_getClassList(AutoreleasingUnsafeMutablePointer(classes), classesCount) - - var subclass: AnyClass! - for i in 0.. Void) { - World.sharedWorld.sharedExamples(name) { _ in closure() } -} - -/** - Defines a group of shared examples. These examples can be re-used in several locations - by using the `itBehavesLike` function. - - - parameter name: The name of the shared example group. This must be unique across all shared example - groups defined in a test suite. - - parameter closure: A closure containing the examples. This behaves just like an example group defined - 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`). - - The closure takes a SharedExampleContext as an argument. This context is a function - that can be executed to retrieve parameters passed in via an `itBehavesLike` function. -*/ -public func sharedExamples(_ name: String, closure: @escaping SharedExampleClosure) { - World.sharedWorld.sharedExamples(name, closure: closure) -} - -/** - Defines an example group. Example groups are logical groupings of examples. - Example groups can share setup and teardown code. - - - parameter description: An arbitrary string describing the example group. - - 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: () -> Void) { - World.sharedWorld.describe(description, flags: flags, closure: closure) -} - -/** - Defines an example group. Equivalent to `describe`. -*/ -public func context(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { - World.sharedWorld.context(description, flags: flags, closure: closure) -} - -/** - Defines a closure to be run prior to each example in the current example - group. This closure is not run for pending or otherwise disabled examples. - An example group may contain an unlimited number of beforeEach. They'll be - run in the order they're defined, but you shouldn't rely on that behavior. - - - parameter closure: The closure to be run prior to each example. -*/ -public func beforeEach(_ closure: @escaping BeforeExampleClosure) { - World.sharedWorld.beforeEach(closure) -} - -/** - Identical to Quick.DSL.beforeEach, except the closure is provided with - metadata on the example that the closure is being run prior to. -*/ -public func beforeEach(_ closure: @escaping BeforeExampleWithMetadataClosure) { - World.sharedWorld.beforeEach(closure: closure) -} - -/** - Defines a closure to be run after each example in the current example - group. This closure is not run for pending or otherwise disabled examples. - An example group may contain an unlimited number of afterEach. They'll be - run in the order they're defined, but you shouldn't rely on that behavior. - - - parameter closure: The closure to be run after each example. -*/ -public func afterEach(_ closure: @escaping AfterExampleClosure) { - World.sharedWorld.afterEach(closure) -} - -/** - Identical to Quick.DSL.afterEach, except the closure is provided with - metadata on the example that the closure is being run after. -*/ -public func afterEach(_ closure: @escaping AfterExampleWithMetadataClosure) { - World.sharedWorld.afterEach(closure: closure) -} - -/** - Defines an example. Examples use assertions to demonstrate how code should - behave. These are like "tests" in XCTest. - - - parameter description: An arbitrary string describing what the example is meant to specify. - - parameter closure: A closure that can contain assertions. - - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. - Empty by default. - - parameter file: The absolute path to the file containing the 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 () -> Void) { - World.sharedWorld.it(description, flags: flags, file: file, line: line, closure: closure) -} - -/** - Inserts the examples defined using a `sharedExamples` function into the current example group. - The shared examples are executed at this location, as if they were written out manually. - - - parameter name: The name of the shared examples group to be executed. This must be identical to the - name of a shared examples group defined using `sharedExamples`. If there are no shared - examples that match the name given, an exception is thrown and the test suite will crash. - - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. - Empty by default. - - parameter file: The absolute path to the file containing the current example group. A sensible default is provided. - - parameter line: The line containing the current example group. A sensible default is provided. -*/ -public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line) { - itBehavesLike(name, flags: flags, file: file, line: line, sharedExampleContext: { return [:] }) -} - -/** - Inserts the examples defined using a `sharedExamples` function into the current example group. - The shared examples are executed at this location, as if they were written out manually. - This function also passes those shared examples a context that can be evaluated to give the shared - examples extra information on the subject of the example. - - - parameter name: The name of the shared examples group to be executed. This must be identical to the - name of a shared examples group defined using `sharedExamples`. If there are no shared - examples that match the name given, an exception is thrown and the test suite will crash. - - parameter sharedExampleContext: A closure that, when evaluated, returns key-value pairs that provide the - shared examples with extra information on the subject of the example. - - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. - Empty by default. - - parameter file: The absolute path to the file containing the current example group. A sensible default is provided. - - parameter line: The line containing the current example group. A sensible default is provided. -*/ -public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, sharedExampleContext: @escaping SharedExampleContext) { - World.sharedWorld.itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) -} - -/** - Inserts the examples defined using a `Behavior` into the current example group. - The shared examples are executed at this location, as if they were written out manually. - This function also passes a strongly-typed context that can be evaluated to give the shared examples extra information on the subject of the example. - - - parameter behavior: The type of `Behavior` class defining the example group to be executed. - - parameter context: A closure that, when evaluated, returns an instance of `Behavior`'s context type to provide its example group with extra information on the subject of the example. - - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. - Empty by default. - - parameter file: The absolute path to the file containing the current example group. A sensible default is provided. - - parameter line: The line containing the current example group. A sensible default is provided. - */ -public func itBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, context: @escaping () -> C) { - World.sharedWorld.itBehavesLike(behavior, context: context, flags: flags, file: file, line: line) -} - -/** - Defines an example or example group that should not be executed. Use `pending` to temporarily disable - examples or groups that should not be run yet. - - - 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: () -> Void) { - World.sharedWorld.pending(description, closure: 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: () -> Void) { - World.sharedWorld.xdescribe(description, flags: flags, closure: 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: () -> Void) { - xdescribe(description, flags: flags, closure: 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 () -> Void) { - World.sharedWorld.xit(description, flags: flags, file: file, line: line, closure: closure) -} - -/** - Use this to quicklu mark an `itBehavesLike` closure as pending. - This disables the example group defined by this behavior and ensures the code within is never run. -*/ -public func xitBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, context: @escaping () -> C) { - World.sharedWorld.xitBehavesLike(behavior, context: context, flags: flags, file: file, line: line) -} -/** - Use this to quickly focus a `describe` closure, focusing the examples in the closure. - If any examples in the test suite are focused, only those examples are executed. - 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: () -> 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: () -> Void) { - fdescribe(description, flags: flags, closure: closure) -} - -/** - Use this to quickly focus an `it` closure, focusing the example. - If any examples in the test suite are focused, only those examples are executed. -*/ -public func fit(_ description: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, closure: @escaping () -> Void) { - 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) -} - -/** - Use this to quickly focus on `itBehavesLike` closure. - */ -public func fitBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, context: @escaping () -> C) { - World.sharedWorld.fitBehavesLike(behavior, context: context, flags: flags, file: file, line: line) -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift b/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift deleted file mode 100644 index 5249027..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift +++ /dev/null @@ -1,205 +0,0 @@ -import Foundation - -/** - Adds methods to World to support top-level DSL functions (Swift) and - macros (Objective-C). These functions map directly to the DSL that test - writers use in their specs. -*/ -extension World { - internal func beforeSuite(_ closure: @escaping BeforeSuiteClosure) { - suiteHooks.appendBefore(closure) - } - - internal func afterSuite(_ closure: @escaping AfterSuiteClosure) { - suiteHooks.appendAfter(closure) - } - - internal func sharedExamples(_ name: String, closure: @escaping SharedExampleClosure) { - registerSharedExample(name, closure: 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'. ") - } - guard currentExampleGroup != nil else { - raiseError("Error: example group was not created by its parent QuickSpec spec. Check that describe() or context() was used in QuickSpec.spec() and not a more general context (i.e. an XCTestCase test)") - } - let group = ExampleGroup(description: description, flags: flags) - currentExampleGroup.appendExampleGroup(group) - performWithCurrentExampleGroup(group, closure: 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: () -> Void) { - var focusedFlags = flags - focusedFlags[Filter.focused] = true - self.describe(description, flags: focusedFlags, closure: closure) - } - - internal func xdescribe(_ description: String, flags: FilterFlags, closure: () -> Void) { - var pendingFlags = flags - pendingFlags[Filter.pending] = true - self.describe(description, flags: pendingFlags, closure: closure) - } - - internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { - guard currentExampleMetadata == nil else { - raiseError("'beforeEach' cannot be used inside '\(currentPhase)', 'beforeEach' may only be used inside 'context' or 'describe'. ") - } - currentExampleGroup.hooks.appendBefore(closure) - } - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objc(beforeEachWithMetadata:) - internal func beforeEach(closure: @escaping BeforeExampleWithMetadataClosure) { - currentExampleGroup.hooks.appendBefore(closure) - } -#else - internal func beforeEach(closure: @escaping BeforeExampleWithMetadataClosure) { - currentExampleGroup.hooks.appendBefore(closure) - } -#endif - - internal func afterEach(_ closure: @escaping AfterExampleClosure) { - guard currentExampleMetadata == nil else { - raiseError("'afterEach' cannot be used inside '\(currentPhase)', 'afterEach' may only be used inside 'context' or 'describe'. ") - } - currentExampleGroup.hooks.appendAfter(closure) - } - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objc(afterEachWithMetadata:) - internal func afterEach(closure: @escaping AfterExampleWithMetadataClosure) { - currentExampleGroup.hooks.appendAfter(closure) - } -#else - internal func afterEach(closure: @escaping AfterExampleWithMetadataClosure) { - currentExampleGroup.hooks.appendAfter(closure) - } -#endif - - 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'. ") - } - if aftersCurrentlyExecuting { - raiseError("'it' cannot be used inside 'afterEach', 'it' may only be used inside 'context' or 'describe'. ") - } - guard currentExampleMetadata == nil else { - raiseError("'it' cannot be used inside 'it', 'it' may only be used inside 'context' or 'describe'. ") - } - let callsite = Callsite(file: file, line: line) - let example = Example(description: description, callsite: callsite, flags: flags, closure: closure) - currentExampleGroup.appendExample(example) - } - - 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 () -> Void) { - var pendingFlags = flags - pendingFlags[Filter.pending] = true - self.it(description, flags: pendingFlags, file: file, line: line, closure: closure) - } - - internal func itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { - guard currentExampleMetadata == nil else { - raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") - } - let callsite = Callsite(file: file, line: line) - let closure = World.sharedWorld.sharedExample(name) - - let group = ExampleGroup(description: name, flags: flags) - currentExampleGroup.appendExampleGroup(group) - performWithCurrentExampleGroup(group) { - closure(sharedExampleContext) - } - - group.walkDownExamples { (example: Example) in - example.isSharedExample = true - example.callsite = callsite - } - } - - 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) - } - - internal func itBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: String, line: UInt) { - guard currentExampleMetadata == nil else { - raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") - } - let callsite = Callsite(file: file, line: line) - let closure = behavior.spec - let group = ExampleGroup(description: behavior.name, flags: flags) - currentExampleGroup.appendExampleGroup(group) - performWithCurrentExampleGroup(group) { - closure(context) - } - - group.walkDownExamples { (example: Example) in - example.isSharedExample = true - example.callsite = callsite - } - } - - internal func fitBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: String, line: UInt) { - var focusedFlags = flags - focusedFlags[Filter.focused] = true - self.itBehavesLike(behavior, context: context, flags: focusedFlags, file: file, line: line) - } - - internal func xitBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: String, line: UInt) { - var pendingFlags = flags - pendingFlags[Filter.pending] = true - self.itBehavesLike(behavior, context: context, flags: pendingFlags, file: file, line: line) - } - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objc(itWithDescription:flags:file:line:closure:) - 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 () -> Void) { - fit(description, flags: flags, file: file, line: line, closure: closure) - } - - @objc(xitWithDescription:flags:file:line:closure:) - private func objc_xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { - xit(description, flags: flags, file: file, line: line, closure: closure) - } - - @objc(itBehavesLikeSharedExampleNamed:sharedExampleContext:flags:file:line:) - private func objc_itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { - itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) - } -#endif - - internal func pending(_ description: String, closure: () -> Void) { - print("Pending: \(description)") - } - - private var currentPhase: String { - if beforesCurrentlyExecuting { - return "beforeEach" - } else if aftersCurrentlyExecuting { - return "afterEach" - } - - return "it" - } -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/ErrorUtility.swift b/Carthage/Checkouts/Quick/Sources/Quick/ErrorUtility.swift deleted file mode 100644 index 155fefd..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/ErrorUtility.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -internal func raiseError(_ message: String) -> Never { -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - NSException(name: .internalInconsistencyException, reason: message, userInfo: nil).raise() -#endif - - // This won't be reached when ObjC is available and the exception above is raisd - fatalError(message) -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Example.swift b/Carthage/Checkouts/Quick/Sources/Quick/Example.swift deleted file mode 100644 index c15b31a..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Example.swift +++ /dev/null @@ -1,131 +0,0 @@ -import Foundation - -private var numberOfExamplesRun = 0 -private var numberOfIncludedExamples = 0 - -// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` -// does not work as expected. -#if swift(>=3.2) - #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objcMembers - public class _ExampleBase: NSObject {} - #else - public class _ExampleBase: NSObject {} - #endif -#else -public class _ExampleBase: NSObject {} -#endif - -/** - Examples, defined with the `it` function, use assertions to - demonstrate how code should behave. These are like "tests" in XCTest. -*/ -final public class Example: _ExampleBase { - /** - A boolean indicating whether the example is a shared example; - i.e.: whether it is an example defined with `itBehavesLike`. - */ - public var isSharedExample = false - - /** - The site at which the example is defined. - This must be set correctly in order for Xcode to highlight - the correct line in red when reporting a failure. - */ - public var callsite: Callsite - - weak internal var group: ExampleGroup? - - private let internalDescription: String - private let closure: () -> Void - private let flags: FilterFlags - - 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 - } - - /** - The example name. A name is a concatenation of the name of - the example group the example belongs to, followed by the - description of the example itself. - - The example name is used to generate a test method selector - to be displayed in Xcode's test navigator. - */ - public var name: String { - guard let groupName = group?.name else { return description } - return "\(groupName), \(description)" - } - - /** - Executes the example closure, as well as all before and after - closures defined in the its surrounding example groups. - */ - public func run() { - let world = World.sharedWorld - - if numberOfIncludedExamples == 0 { - numberOfIncludedExamples = world.includedExampleCount - } - - if numberOfExamplesRun == 0 { - world.suiteHooks.executeBefores() - } - - let exampleMetadata = ExampleMetadata(example: self, exampleIndex: numberOfExamplesRun) - world.currentExampleMetadata = exampleMetadata - - world.exampleHooks.executeBefores(exampleMetadata) - group!.phase = .beforesExecuting - for before in group!.befores { - before(exampleMetadata) - } - group!.phase = .beforesFinished - - closure() - - group!.phase = .aftersExecuting - for after in group!.afters { - after(exampleMetadata) - } - group!.phase = .aftersFinished - world.exampleHooks.executeAfters(exampleMetadata) - - numberOfExamplesRun += 1 - - if !world.isRunningAdditionalSuites && numberOfExamplesRun >= numberOfIncludedExamples { - world.suiteHooks.executeAfters() - } - } - - /** - Evaluates the filter flags set on this example and on the example groups - this example belongs to. Flags set on the example are trumped by flags on - the example group it belongs to. Flags on inner example groups are trumped - by flags on outer example groups. - */ - internal var filterFlags: FilterFlags { - var aggregateFlags = flags - for (key, value) in group!.filterFlags { - aggregateFlags[key] = value - } - return aggregateFlags - } -} - -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/Carthage/Checkouts/Quick/Sources/Quick/ExampleGroup.swift b/Carthage/Checkouts/Quick/Sources/Quick/ExampleGroup.swift deleted file mode 100644 index 129bed0..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/ExampleGroup.swift +++ /dev/null @@ -1,99 +0,0 @@ -import Foundation - -/** - Example groups are logical groupings of examples, defined with - the `describe` and `context` functions. Example groups can share - setup and teardown code. -*/ -final public class ExampleGroup: NSObject { - weak internal var parent: ExampleGroup? - internal let hooks = ExampleHooks() - - internal var phase: HooksPhase = .nothingExecuted - - private let internalDescription: String - private let flags: FilterFlags - private let isInternalRootExampleGroup: Bool - private var childGroups = [ExampleGroup]() - private var childExamples = [Example]() - - internal init(description: String, flags: FilterFlags, isInternalRootExampleGroup: Bool = false) { - self.internalDescription = description - self.flags = flags - self.isInternalRootExampleGroup = isInternalRootExampleGroup - } - - public override var description: String { - return internalDescription - } - - /** - Returns a list of examples that belong to this example group, - or to any of its descendant example groups. - */ - public var examples: [Example] { - return childExamples + childGroups.flatMap { $0.examples } - } - - internal var name: String? { - guard let parent = parent else { - return isInternalRootExampleGroup ? nil : description - } - - guard let name = parent.name else { return description } - return "\(name), \(description)" - } - - internal var filterFlags: FilterFlags { - var aggregateFlags = flags - walkUp { group in - for (key, value) in group.flags { - aggregateFlags[key] = value - } - } - return aggregateFlags - } - - internal var befores: [BeforeExampleWithMetadataClosure] { - var closures = Array(hooks.befores.reversed()) - walkUp { group in - closures.append(contentsOf: Array(group.hooks.befores.reversed())) - } - return Array(closures.reversed()) - } - - internal var afters: [AfterExampleWithMetadataClosure] { - var closures = hooks.afters - walkUp { group in - closures.append(contentsOf: group.hooks.afters) - } - return closures - } - - internal func walkDownExamples(_ callback: (_ example: Example) -> Void) { - for example in childExamples { - callback(example) - } - for group in childGroups { - group.walkDownExamples(callback) - } - } - - internal func appendExampleGroup(_ group: ExampleGroup) { - group.parent = self - childGroups.append(group) - } - - internal func appendExample(_ example: Example) { - example.group = self - childExamples.append(example) - } - - private func walkUp(_ callback: (_ group: ExampleGroup) -> Void) { - var group = self - while let parent = group.parent { - callback(parent) - group = parent - } - } -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift b/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift deleted file mode 100644 index 3dd28ab..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift +++ /dev/null @@ -1,37 +0,0 @@ -import Foundation - -// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` -// does not work as expected. -#if swift(>=3.2) - #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objcMembers - public class _ExampleMetadataBase: NSObject {} - #else - public class _ExampleMetadataBase: NSObject {} - #endif -#else -public class _ExampleMetadataBase: NSObject {} -#endif - -/** - A class that encapsulates information about an example, - including the index at which the example was executed, as - well as the example itself. -*/ -final public class ExampleMetadata: _ExampleMetadataBase { - /** - The example for which this metadata was collected. - */ - public let example: Example - - /** - The index at which this example was executed in the - test suite. - */ - public let exampleIndex: Int - - internal init(example: Example, exampleIndex: Int) { - self.example = example - self.exampleIndex = exampleIndex - } -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift b/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift deleted file mode 100644 index da137f8..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation - -// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` -// does not work as expected. -#if swift(>=3.2) - #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objcMembers - public class _FilterBase: NSObject {} - #else - public class _FilterBase: NSObject {} - #endif -#else -public class _FilterBase: NSObject {} -#endif - -/** - A mapping of string keys to booleans that can be used to - filter examples or example groups. For example, a "focused" - example would have the flags [Focused: true]. -*/ -public typealias FilterFlags = [String: Bool] - -/** - A namespace for filter flag keys, defined primarily to make the - keys available in Objective-C. -*/ -final public class Filter: _FilterBase { - /** - Example and example groups with [Focused: true] are included in test runs, - excluding all other examples without this flag. Use this to only run one or - two tests that you're currently focusing on. - */ - public class var focused: String { - return "focused" - } - - /** - Example and example groups with [Pending: true] are excluded from test runs. - Use this to temporarily suspend examples that you know do not pass yet. - */ - public class var pending: String { - return "pending" - } -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Hooks/Closures.swift b/Carthage/Checkouts/Quick/Sources/Quick/Hooks/Closures.swift deleted file mode 100644 index 9c7d310..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Hooks/Closures.swift +++ /dev/null @@ -1,35 +0,0 @@ -// MARK: Example Hooks - -/** - A closure executed before an example is run. -*/ -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) -> Void - -/** - A closure executed after an example is run. -*/ -public typealias AfterExampleClosure = BeforeExampleClosure - -/** - A closure executed after an example is run. The closure is given example metadata, - which contains information about the example that has just finished running. -*/ -public typealias AfterExampleWithMetadataClosure = BeforeExampleWithMetadataClosure - -// MARK: Suite Hooks - -/** - A closure executed before any examples are run. -*/ -public typealias BeforeSuiteClosure = () -> Void - -/** - A closure executed after all examples have finished running. -*/ -public typealias AfterSuiteClosure = BeforeSuiteClosure diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Hooks/ExampleHooks.swift b/Carthage/Checkouts/Quick/Sources/Quick/Hooks/ExampleHooks.swift deleted file mode 100644 index 449cbfc..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Hooks/ExampleHooks.swift +++ /dev/null @@ -1,42 +0,0 @@ -/** - A container for closures to be executed before and after each example. -*/ -final internal class ExampleHooks { - internal var befores: [BeforeExampleWithMetadataClosure] = [] - internal var afters: [AfterExampleWithMetadataClosure] = [] - internal var phase: HooksPhase = .nothingExecuted - - internal func appendBefore(_ closure: @escaping BeforeExampleWithMetadataClosure) { - befores.append(closure) - } - - internal func appendBefore(_ closure: @escaping BeforeExampleClosure) { - befores.append { (_: ExampleMetadata) in closure() } - } - - internal func appendAfter(_ closure: @escaping AfterExampleWithMetadataClosure) { - afters.append(closure) - } - - internal func appendAfter(_ closure: @escaping AfterExampleClosure) { - afters.append { (_: ExampleMetadata) in closure() } - } - - internal func executeBefores(_ exampleMetadata: ExampleMetadata) { - phase = .beforesExecuting - for before in befores { - before(exampleMetadata) - } - - phase = .beforesFinished - } - - internal func executeAfters(_ exampleMetadata: ExampleMetadata) { - phase = .aftersExecuting - for after in afters { - after(exampleMetadata) - } - - phase = .aftersFinished - } -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Hooks/HooksPhase.swift b/Carthage/Checkouts/Quick/Sources/Quick/Hooks/HooksPhase.swift deleted file mode 100644 index 2440158..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Hooks/HooksPhase.swift +++ /dev/null @@ -1,11 +0,0 @@ -/** - A description of the execution cycle of the current example with - respect to the hooks of that example. - */ -internal enum HooksPhase { - case nothingExecuted - case beforesExecuting - case beforesFinished - case aftersExecuting - case aftersFinished -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Hooks/SuiteHooks.swift b/Carthage/Checkouts/Quick/Sources/Quick/Hooks/SuiteHooks.swift deleted file mode 100644 index b39292b..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Hooks/SuiteHooks.swift +++ /dev/null @@ -1,32 +0,0 @@ -/** - A container for closures to be executed before and after all examples. -*/ -final internal class SuiteHooks { - internal var befores: [BeforeSuiteClosure] = [] - internal var afters: [AfterSuiteClosure] = [] - internal var phase: HooksPhase = .nothingExecuted - - internal func appendBefore(_ closure: @escaping BeforeSuiteClosure) { - befores.append(closure) - } - - internal func appendAfter(_ closure: @escaping AfterSuiteClosure) { - afters.append(closure) - } - - internal func executeBefores() { - phase = .beforesExecuting - for before in befores { - before() - } - phase = .beforesFinished - } - - internal func executeAfters() { - phase = .aftersExecuting - for after in afters { - after() - } - phase = .aftersFinished - } -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Info.plist b/Carthage/Checkouts/Quick/Sources/Quick/Info.plist deleted file mode 100644 index 9667430..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSHumanReadableCopyright - Copyright © 2014 - present, Quick Team. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift b/Carthage/Checkouts/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift deleted file mode 100644 index d7a1442..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift +++ /dev/null @@ -1,25 +0,0 @@ -#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) - -import Foundation - -extension Bundle { - - /** - Locates the first bundle with a '.xctest' file extension. - */ - internal static var currentTestBundle: 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/Carthage/Checkouts/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift b/Carthage/Checkouts/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift deleted file mode 100644 index ef73762..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift +++ /dev/null @@ -1,33 +0,0 @@ -#if os(macOS) || 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/Carthage/Checkouts/Quick/Sources/Quick/QuickMain.swift b/Carthage/Checkouts/Quick/Sources/Quick/QuickMain.swift deleted file mode 100644 index eb9aba5..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/QuickMain.swift +++ /dev/null @@ -1,38 +0,0 @@ -import XCTest - -// NOTE: This file is not intended to be included in the Xcode project or CocoaPods. -// It is picked up by the Swift Package Manager during its build process. - -#if SWIFT_PACKAGE && os(Linux) - -/// When using Quick with swift-corelibs-xctest, automatic discovery of specs and -/// configurations is not available. Instead, you should create a standalone -/// executable and call this function from its main.swift file. This will execute -/// the specs and then terminate the process with an exit code of 0 if the tests -/// passed, or 1 if there were any failures. -/// -/// Quick is known to work with the DEVELOPMENT-SNAPSHOT-2016-02-08-a Swift toolchain. -/// -/// - parameter specs: An array of QuickSpec subclasses to run -/// - parameter configurations: An array QuickConfiguration subclasses for setting up -// global suite configuration (optional) -/// - parameter testCases: An array of XCTestCase test cases, just as would be passed -/// info `XCTMain` if you were using swift-corelibs-xctest directly. -/// This allows for mixing Quick specs and XCTestCase tests in one run. -public func QCKMain(_ specs: [QuickSpec.Type], - configurations: [QuickConfiguration.Type] = [], - testCases: [XCTestCaseEntry] = []) -> Never { - let world = World.sharedWorld - - // Perform all configurations (ensures that shared examples have been discovered) - world.configure { configuration in - for configurationClass in configurations { - configurationClass.configure(configuration) - } - } - world.finalizeConfiguration() - - XCTMain(specs.flatMap { testCase($0.allTests) } + testCases) -} - -#endif diff --git a/Carthage/Checkouts/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift b/Carthage/Checkouts/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift deleted file mode 100644 index 415b680..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift +++ /dev/null @@ -1,74 +0,0 @@ -#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) -import Foundation - -/** - Responsible for building a "Selected tests" suite. This corresponds to a single - spec, and all its examples. - */ -internal class QuickSelectedTestSuiteBuilder: QuickTestSuiteBuilder { - - /** - The test spec class to run. - */ - let testCaseClass: AnyClass! - - /** - For Objective-C classes, returns the class name. For Swift classes without, - an explicit Objective-C name, returns a module-namespaced class name - (e.g., "FooTests.FooSpec"). - */ - var testSuiteClassName: String { - return NSStringFromClass(testCaseClass) - } - - /** - Given a test case name: - - FooSpec/testFoo - - Optionally constructs a test suite builder for the named test case class - in the running test bundle. - - If no test bundle can be found, or the test case class can't be found, - initialization fails and returns `nil`. - */ - init?(forTestCaseWithName name: String) { - guard let testCaseClass = testCaseClassForTestCaseWithName(name) else { - self.testCaseClass = nil - return nil - } - - self.testCaseClass = testCaseClass - } - - /** - Returns a `QuickTestSuite` that runs the associated test case class. - */ - func buildTestSuite() -> QuickTestSuite { - return QuickTestSuite(forTestCaseClass: testCaseClass) - } - -} - -/** - Searches `Bundle.allBundles()` for an xctest bundle, then looks up the named - test case class in that bundle. - - Returns `nil` if a bundle or test case class cannot be found. - */ -private func testCaseClassForTestCaseWithName(_ name: String) -> AnyClass? { - func extractClassName(_ name: String) -> String? { - return name.components(separatedBy: "/").first - } - - guard let className = extractClassName(name) else { return nil } - guard let bundle = Bundle.currentTestBundle else { return nil } - - if let testCaseClass = bundle.classNamed(className) { return testCaseClass } - - let moduleName = bundle.moduleName - - return NSClassFromString("\(moduleName).\(className)") -} - -#endif diff --git a/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift b/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift deleted file mode 100644 index 072ece1..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift +++ /dev/null @@ -1,122 +0,0 @@ -import XCTest - -// NOTE: This file is not intended to be included in the Xcode project or CocoaPods. -// It is picked up by the Swift Package Manager during its build process. - -#if SWIFT_PACKAGE - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -import QuickSpecBase - -public typealias QuickSpecBase = _QuickSpecBase -#else -public typealias QuickSpecBase = XCTestCase -#endif - -open class QuickSpec: QuickSpecBase { - open func spec() {} - -#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) - public required init() { - super.init(name: "", testClosure: { _ in }) - } - public required init(name: String, testClosure: @escaping (XCTestCase) throws -> Swift.Void) { - super.init(name: name, testClosure: testClosure) - } -#else - public required override init() { - super.init() - } - - /// This method is used as a hook for the following two purposes - /// - /// 1. Performing all configurations - /// 2. Gathering examples for each spec classes - /// - /// On Linux, those are done in `LinuxMain.swift` and `Quick.QCKMain`. But - /// SwiftPM on macOS does not have the mechanism (test cases are automatically - /// discovered powered by Objective-C runtime), so we needed the alternative - /// way. - override open class func defaultTestSuite() -> XCTestSuite { - let world = World.sharedWorld - - if !world.isConfigurationFinalized { - // Perform all configurations (ensures that shared examples have been discovered) - world.configure { configuration in - qck_enumerateSubclasses(QuickConfiguration.self) { configurationClass in - configurationClass.configure(configuration) - } - } - world.finalizeConfiguration() - } - - // Let's gather examples for each spec classes. This has the same effect - // as listing spec classes in `LinuxMain.swift` on Linux. - _ = allTests - - return super.defaultTestSuite() - } - - override open class func _qck_testMethodSelectors() -> [_QuickSelectorWrapper] { - let examples = World.sharedWorld.examples(self) - - var selectorNames = Set() - return examples.map { example in - let selector = addInstanceMethod(for: example, classSelectorNames: &selectorNames) - return _QuickSelectorWrapper(selector: selector) - } - } - - private static func addInstanceMethod(for example: Example, classSelectorNames selectorNames : inout Set) -> Selector { - let block: @convention(block) (QuickSpec) -> Void = { _ in - example.run() - } - let implementation = imp_implementationWithBlock(block as Any) - - let originalName = example.name - var selectorName = originalName - var i: UInt = 2 - - while selectorNames.contains(selectorName) { - selectorName = String(format: "%@_%tu", originalName, i) - i += 1 - } - - selectorNames.insert(selectorName) - - let selector = NSSelectorFromString(selectorName) - class_addMethod(self, selector, implementation, "v@:") - - return selector - } -#endif - - static var allTestsCache = [String: [(String, (XCTestCase) -> () throws -> Void)]]() - - public class var allTests: [(String, (XCTestCase) -> () throws -> Void)] { - if let cached = allTestsCache[String(describing: self)] { - return cached - } - - gatherExamplesIfNeeded() - - let examples = World.sharedWorld.examples(self) - let result = examples.map { example -> (String, (XCTestCase) -> () throws -> Void) in - return (example.name, { _ in { example.run() } }) - } - allTestsCache[String(describing: self)] = result - return result - } - - internal static func gatherExamplesIfNeeded() { - let world = World.sharedWorld - let rootExampleGroup = world.rootExampleGroupForSpecClass(self) - if rootExampleGroup.examples.isEmpty { - world.currentExampleGroup = rootExampleGroup - self.init().spec() - world.currentExampleGroup = nil - } - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Sources/Quick/QuickTestSuite.swift b/Carthage/Checkouts/Quick/Sources/Quick/QuickTestSuite.swift deleted file mode 100644 index 0fe76a7..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/QuickTestSuite.swift +++ /dev/null @@ -1,52 +0,0 @@ -#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) - -import XCTest - -/** - This protocol defines the role of an object that builds test suites. - */ -internal protocol QuickTestSuiteBuilder { - - /** - Construct a `QuickTestSuite` instance with the appropriate test cases added as tests. - - Subsequent calls to this method should return equivalent test suites. - */ - func buildTestSuite() -> QuickTestSuite - -} - -/** - A base class for a class cluster of Quick test suites, that should correctly - build dynamic test suites for XCTest to execute. - */ -public class QuickTestSuite: XCTestSuite { - - private static var builtTestSuites: Set = Set() - - /** - Construct a test suite for a specific, selected subset of test cases (rather - than the default, which as all test cases). - - If this method is called multiple times for the same test case class, e.g.. - - FooSpec/testFoo - FooSpec/testBar - - It is expected that the first call should return a valid test suite, and - all subsequent calls should return `nil`. - */ - @objc - public static func selectedTestSuite(forTestCaseWithName name: String) -> QuickTestSuite? { - guard let builder = QuickSelectedTestSuiteBuilder(forTestCaseWithName: name) else { return nil } - - let (inserted, _) = builtTestSuites.insert(builder.testSuiteClassName) - if inserted { - return builder.buildTestSuite() - } else { - return nil - } - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Sources/Quick/URL+FileName.swift b/Carthage/Checkouts/Quick/Sources/Quick/URL+FileName.swift deleted file mode 100644 index 23c4781..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/URL+FileName.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation - -extension URL { - - /** - Returns the path file name without file extension. - */ - var fileName: String { - return self.deletingPathExtension().lastPathComponent - } - -} diff --git a/Carthage/Checkouts/Quick/Sources/Quick/World.swift b/Carthage/Checkouts/Quick/Sources/Quick/World.swift deleted file mode 100644 index 127239a..0000000 --- a/Carthage/Checkouts/Quick/Sources/Quick/World.swift +++ /dev/null @@ -1,247 +0,0 @@ -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 = () -> [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) -> Void - -// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` -// does not work as expected. -#if swift(>=3.2) - #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - @objcMembers - internal class _WorldBase: NSObject {} - #else - internal class _WorldBase: NSObject {} - #endif -#else -internal class _WorldBase: NSObject {} -#endif - -/** - A collection of state Quick builds up in order to work its magic. - World is primarily responsible for maintaining a mapping of QuickSpec - classes to root example groups for those classes. - - It also maintains a mapping of shared example names to shared - example closures. - - You may configure how Quick behaves by calling the -[World configure:] - method from within an overridden +[QuickConfiguration configure:] method. -*/ -final internal class World: _WorldBase { - /** - The example group that is currently being run. - The DSL requires that this group is correctly set in order to build a - correct hierarchy of example groups and their examples. - */ - internal var currentExampleGroup: ExampleGroup! - - /** - The example metadata of the test that is currently being run. - This is useful for using the Quick test metadata (like its name) at - runtime. - */ - - internal var currentExampleMetadata: ExampleMetadata? - - /** - A flag that indicates whether additional test suites are being run - within this test suite. This is only true within the context of Quick - functional tests. - */ -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - // Convention of generating Objective-C selector has been changed on Swift 3 - @objc(isRunningAdditionalSuites) - internal var isRunningAdditionalSuites = false -#else - internal var isRunningAdditionalSuites = false -#endif - - private var specs: [String: ExampleGroup] = [:] - private var sharedExamples: [String: SharedExampleClosure] = [:] - private let configuration = Configuration() - - internal private(set) var isConfigurationFinalized = false - - internal var exampleHooks: ExampleHooks {return configuration.exampleHooks } - internal var suiteHooks: SuiteHooks { return configuration.suiteHooks } - - // MARK: Singleton Constructor - - private override init() {} - - static let sharedWorld = World() - - // MARK: Public Interface - - /** - Exposes the World's Configuration object within the scope of the closure - so that it may be configured. This method must not be called outside of - an overridden +[QuickConfiguration configure:] method. - - - parameter closure: A closure that takes a Configuration object that can - be mutated to change Quick's behavior. - */ - internal func configure(_ closure: QuickConfigurer) { - assert(!isConfigurationFinalized, - "Quick cannot be configured outside of a +[QuickConfiguration configure:] method. You should not call -[World configure:] directly. Instead, subclass QuickConfiguration and override the +[QuickConfiguration configure:] method.") - closure(configuration) - } - - /** - Finalizes the World's configuration. - Any subsequent calls to World.configure() will raise. - */ - internal func finalizeConfiguration() { - isConfigurationFinalized = true - } - - /** - Returns an internally constructed root example group for the given - QuickSpec class. - - A root example group with the description "root example group" is lazily - initialized for each QuickSpec class. This root example group wraps the - top level of a -[QuickSpec spec] method--it's thanks to this group that - users can define beforeEach and it closures at the top level, like so: - - override func spec() { - // These belong to the root example group - beforeEach {} - it("is at the top level") {} - } - - - parameter cls: The QuickSpec class for which to retrieve the root example group. - - returns: The root example group for the class. - */ - internal func rootExampleGroupForSpecClass(_ cls: AnyClass) -> ExampleGroup { - let name = String(describing: cls) - - if let group = specs[name] { - return group - } else { - let group = ExampleGroup( - description: "root example group", - flags: [:], - isInternalRootExampleGroup: true - ) - specs[name] = group - return group - } - } - - /** - Returns all examples that should be run for a given spec class. - There are two filtering passes that occur when determining which examples should be run. - That is, these examples are the ones that are included by inclusion filters, and are - not excluded by exclusion filters. - - - parameter specClass: The QuickSpec subclass for which examples are to be returned. - - returns: A list of examples to be run as test invocations. - */ - internal func examples(_ specClass: AnyClass) -> [Example] { - // 1. Grab all included examples. - let included = includedExamples - // 2. Grab the intersection of (a) examples for this spec, and (b) included examples. - let spec = rootExampleGroupForSpecClass(specClass).examples.filter { included.contains($0) } - // 3. Remove all excluded examples. - return spec.filter { example in - !self.configuration.exclusionFilters.reduce(false) { $0 || $1(example) } - } - } - -#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) - @objc(examplesForSpecClass:) - private func objc_examples(_ specClass: AnyClass) -> [Example] { - return examples(specClass) - } -#endif - - // MARK: Internal - - internal func registerSharedExample(_ name: String, closure: @escaping SharedExampleClosure) { - raiseIfSharedExampleAlreadyRegistered(name) - sharedExamples[name] = closure - } - - internal func sharedExample(_ name: String) -> SharedExampleClosure { - raiseIfSharedExampleNotRegistered(name) - return sharedExamples[name]! - } - - internal var includedExampleCount: Int { - return includedExamples.count - } - - internal var beforesCurrentlyExecuting: Bool { - let suiteBeforesExecuting = suiteHooks.phase == .beforesExecuting - let exampleBeforesExecuting = exampleHooks.phase == .beforesExecuting - var groupBeforesExecuting = false - 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 - var groupAftersExecuting = false - if let runningExampleGroup = currentExampleMetadata?.example.group { - groupAftersExecuting = runningExampleGroup.phase == .aftersExecuting - } - - return suiteAftersExecuting || exampleAftersExecuting || groupAftersExecuting - } - - internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { - let previousExampleGroup = currentExampleGroup - currentExampleGroup = group - - closure() - - currentExampleGroup = previousExampleGroup - } - - private var allExamples: [Example] { - var all: [Example] = [] - for (_, group) in specs { - group.walkDownExamples { all.append($0) } - } - return all - } - - private var includedExamples: [Example] { - let all = allExamples - let included = all.filter { example in - return self.configuration.inclusionFilters.reduce(false) { $0 || $1(example) } - } - - if included.isEmpty && configuration.runAllWhenEverythingFiltered { - return all - } else { - return included - } - } - - private func raiseIfSharedExampleAlreadyRegistered(_ name: String) { - if sharedExamples[name] != nil { - raiseError("A shared example named '\(name)' has already been registered.") - } - } - - private func raiseIfSharedExampleNotRegistered(_ name: String) { - if sharedExamples[name] == nil { - raiseError("No shared example named '\(name)' has been registered. Registered shared examples: '\(Array(sharedExamples.keys))'") - } - } -} diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.h b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.h deleted file mode 100644 index 5646199..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.h +++ /dev/null @@ -1,30 +0,0 @@ -#import - -@class Configuration; - -/** - Subclass QuickConfiguration and override the +[QuickConfiguration configure:] - method in order to configure how Quick behaves when running specs, or to define - shared examples that are used across spec files. - */ -@interface QuickConfiguration : NSObject - -/** - This method is executed on each subclass of this class before Quick runs - any examples. You may override this method on as many subclasses as you like, but - there is no guarantee as to the order in which these methods are executed. - - You can override this method in order to: - - 1. Configure how Quick behaves, by modifying properties on the Configuration object. - Setting the same properties in several methods has undefined behavior. - - 2. Define shared examples using `sharedExamples`. - - @param configuration A mutable object that is used to configure how Quick behaves on - a framework level. For details on all the options, see the - documentation in Configuration.swift. - */ -+ (void)configure:(Configuration *)configuration; - -@end diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m deleted file mode 100644 index 937b818..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m +++ /dev/null @@ -1,83 +0,0 @@ -#import "QuickConfiguration.h" -#import "World.h" -#import - -typedef void (^QCKClassEnumerationBlock)(Class klass); - -/** - Finds all direct subclasses of the given class and passes them to the block provided. - The classes are iterated over in the order that objc_getClassList returns them. - - @param klass The base class to find subclasses of. - @param block A block that takes a Class. This block will be executed once for each subclass of klass. - */ -void qck_enumerateSubclasses(Class klass, QCKClassEnumerationBlock block) { - Class *classes = NULL; - int classesCount = objc_getClassList(NULL, 0); - - if (classesCount > 0) { - classes = (Class *)calloc(sizeof(Class), classesCount); - classesCount = objc_getClassList(classes, classesCount); - - Class subclass, superclass; - for(int i = 0; i < classesCount; i++) { - subclass = classes[i]; - superclass = class_getSuperclass(subclass); - if (superclass == klass && block) { - block(subclass); - } - } - - free(classes); - } -} - -@implementation QuickConfiguration - -#pragma mark - Object Lifecycle - -/** - QuickConfiguration is not meant to be instantiated; it merely provides a hook - for users to configure how Quick behaves. Raise an exception if an instance of - QuickConfiguration is created. - */ -- (instancetype)init { - NSString *className = NSStringFromClass([self class]); - NSString *selectorName = NSStringFromSelector(@selector(configure:)); - [NSException raise:NSInternalInconsistencyException - format:@"%@ is not meant to be instantiated; " - @"subclass %@ and override %@ to configure Quick.", - className, className, selectorName]; - return nil; -} - -#pragma mark - NSObject Overrides - -/** - Hook into when QuickConfiguration is initialized in the runtime in order to - call +[QuickConfiguration configure:] on each of its subclasses. - */ -+ (void)initialize { - // Only enumerate over the subclasses of QuickConfiguration, not any of its subclasses. - if ([self class] == [QuickConfiguration class]) { - - // Only enumerate over subclasses once, even if +[QuickConfiguration initialize] - // were to be called several times. This is necessary because +[QuickSpec initialize] - // manually calls +[QuickConfiguration initialize]. - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - qck_enumerateSubclasses([QuickConfiguration class], ^(__unsafe_unretained Class klass) { - [[World sharedWorld] configure:^(Configuration *configuration) { - [klass configure:configuration]; - }]; - }); - [[World sharedWorld] finalizeConfiguration]; - }); - } -} - -#pragma mark - Public Interface - -+ (void)configure:(Configuration *)configuration { } - -@end diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.h b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.h deleted file mode 100644 index c5f3152..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.h +++ /dev/null @@ -1,234 +0,0 @@ -#import - -@class ExampleMetadata; - -/** - Provides a hook for Quick to be configured before any examples are run. - Within this scope, override the +[QuickConfiguration configure:] method - to set properties on a configuration object to customize Quick behavior. - For details, see the documentation for Configuraiton.swift. - - @param name The name of the configuration class. Like any Objective-C - class name, this must be unique to the current runtime - environment. - */ -#define QuickConfigurationBegin(name) \ - @interface name : QuickConfiguration; @end \ - @implementation name \ - - -/** - Marks the end of a Quick configuration. - Make sure you put this after `QuickConfigurationBegin`. - */ -#define QuickConfigurationEnd \ - @end \ - - -/** - Defines a new QuickSpec. Define examples and example groups within the space - between this and `QuickSpecEnd`. - - @param name The name of the spec class. Like any Objective-C class name, this - must be unique to the current runtime environment. - */ -#define QuickSpecBegin(name) \ - @interface name : QuickSpec; @end \ - @implementation name \ - - (void)spec { \ - - -/** - Marks the end of a QuickSpec. Make sure you put this after `QuickSpecBegin`. - */ -#define QuickSpecEnd \ - } \ - @end \ - -typedef NSDictionary *(^QCKDSLSharedExampleContext)(void); -typedef void (^QCKDSLSharedExampleBlock)(QCKDSLSharedExampleContext); -typedef void (^QCKDSLEmptyBlock)(void); -typedef void (^QCKDSLExampleMetadataBlock)(ExampleMetadata *exampleMetadata); - -#define QUICK_EXPORT FOUNDATION_EXPORT - -QUICK_EXPORT void qck_beforeSuite(QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_afterSuite(QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_sharedExamples(NSString *name, QCKDSLSharedExampleBlock closure); -QUICK_EXPORT void qck_describe(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_context(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_beforeEach(QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_beforeEachWithMetadata(QCKDSLExampleMetadataBlock closure); -QUICK_EXPORT void qck_afterEach(QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_afterEachWithMetadata(QCKDSLExampleMetadataBlock closure); -QUICK_EXPORT void qck_pending(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_xdescribe(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_xcontext(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_fdescribe(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_fcontext(NSString *description, QCKDSLEmptyBlock closure); - -#ifndef QUICK_DISABLE_SHORT_SYNTAX -/** - Defines a closure to be run prior to any examples in the test suite. - You may define an unlimited number of these closures, but there is no - guarantee as to the order in which they're run. - - If the test suite crashes before the first example is run, this closure - will not be executed. - - @param closure The closure to be run prior to any examples in the test suite. - */ -static inline void beforeSuite(QCKDSLEmptyBlock closure) { - qck_beforeSuite(closure); -} - - -/** - Defines a closure to be run after all of the examples in the test suite. - You may define an unlimited number of these closures, but there is no - guarantee as to the order in which they're run. - - If the test suite crashes before all examples are run, this closure - will not be executed. - - @param closure The closure to be run after all of the examples in the test suite. - */ -static inline void afterSuite(QCKDSLEmptyBlock closure) { - qck_afterSuite(closure); -} - -/** - Defines a group of shared examples. These examples can be re-used in several locations - by using the `itBehavesLike` function. - - @param name The name of the shared example group. This must be unique across all shared example - groups defined in a test suite. - @param closure A closure containing the examples. This behaves just like an example group defined - 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`). - */ -static inline void sharedExamples(NSString *name, QCKDSLSharedExampleBlock closure) { - qck_sharedExamples(name, closure); -} - -/** - Defines an example group. Example groups are logical groupings of examples. - Example groups can share setup and teardown code. - - @param description An arbitrary string describing the example group. - @param closure A closure that can contain other examples. - */ -static inline void describe(NSString *description, QCKDSLEmptyBlock closure) { - qck_describe(description, closure); -} - -/** - Defines an example group. Equivalent to `describe`. - */ -static inline void context(NSString *description, QCKDSLEmptyBlock closure) { - qck_context(description, closure); -} - -/** - Defines a closure to be run prior to each example in the current example - group. This closure is not run for pending or otherwise disabled examples. - An example group may contain an unlimited number of beforeEach. They'll be - run in the order they're defined, but you shouldn't rely on that behavior. - - @param closure The closure to be run prior to each example. - */ -static inline void beforeEach(QCKDSLEmptyBlock closure) { - qck_beforeEach(closure); -} - -/** - Identical to QCKDSL.beforeEach, except the closure is provided with - metadata on the example that the closure is being run prior to. - */ -static inline void beforeEachWithMetadata(QCKDSLExampleMetadataBlock closure) { - qck_beforeEachWithMetadata(closure); -} - -/** - Defines a closure to be run after each example in the current example - group. This closure is not run for pending or otherwise disabled examples. - An example group may contain an unlimited number of afterEach. They'll be - run in the order they're defined, but you shouldn't rely on that behavior. - - @param closure The closure to be run after each example. - */ -static inline void afterEach(QCKDSLEmptyBlock closure) { - qck_afterEach(closure); -} - -/** - Identical to QCKDSL.afterEach, except the closure is provided with - metadata on the example that the closure is being run after. - */ -static inline void afterEachWithMetadata(QCKDSLExampleMetadataBlock closure) { - qck_afterEachWithMetadata(closure); -} - -/** - Defines an example or example group that should not be executed. Use `pending` to temporarily disable - examples or groups that should not be run yet. - - @param description An arbitrary string describing the example or example group. - @param closure A closure that will not be evaluated. - */ -static inline void pending(NSString *description, QCKDSLEmptyBlock closure) { - qck_pending(description, closure); -} - -/** - Use this to quickly mark a `describe` block as pending. - This disables all examples within the block. - */ -static inline void xdescribe(NSString *description, QCKDSLEmptyBlock closure) { - qck_xdescribe(description, closure); -} - -/** - Use this to quickly mark a `context` block as pending. - This disables all examples within the block. - */ -static inline void xcontext(NSString *description, QCKDSLEmptyBlock closure) { - qck_xcontext(description, closure); -} - -/** - Use this to quickly focus a `describe` block, focusing the examples in the block. - If any examples in the test suite are focused, only those examples are executed. - This trumps any explicitly focused or unfocused examples within the block--they are all treated as focused. - */ -static inline void fdescribe(NSString *description, QCKDSLEmptyBlock closure) { - qck_fdescribe(description, closure); -} - -/** - Use this to quickly focus a `context` block. Equivalent to `fdescribe`. - */ -static inline void fcontext(NSString *description, QCKDSLEmptyBlock closure) { - qck_fcontext(description, closure); -} - -#define it qck_it -#define xit qck_xit -#define fit qck_fit -#define itBehavesLike qck_itBehavesLike -#define xitBehavesLike qck_xitBehavesLike -#define fitBehavesLike qck_fitBehavesLike -#endif - -#define qck_it qck_it_builder(@{}, @(__FILE__), __LINE__) -#define qck_xit qck_it_builder(@{Filter.pending: @YES}, @(__FILE__), __LINE__) -#define qck_fit qck_it_builder(@{Filter.focused: @YES}, @(__FILE__), __LINE__) -#define qck_itBehavesLike qck_itBehavesLike_builder(@{}, @(__FILE__), __LINE__) -#define qck_xitBehavesLike qck_itBehavesLike_builder(@{Filter.pending: @YES}, @(__FILE__), __LINE__) -#define qck_fitBehavesLike qck_itBehavesLike_builder(@{Filter.focused: @YES}, @(__FILE__), __LINE__) - -typedef void (^QCKItBlock)(NSString *description, QCKDSLEmptyBlock closure); -typedef void (^QCKItBehavesLikeBlock)(NSString *description, QCKDSLSharedExampleContext context); - -QUICK_EXPORT QCKItBlock qck_it_builder(NSDictionary *flags, NSString *file, NSUInteger line); -QUICK_EXPORT QCKItBehavesLikeBlock qck_itBehavesLike_builder(NSDictionary *flags, NSString *file, NSUInteger line); diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m deleted file mode 100644 index 10e8a3d..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m +++ /dev/null @@ -1,79 +0,0 @@ -#import "QCKDSL.h" -#import "World.h" -#import "World+DSL.h" - -void qck_beforeSuite(QCKDSLEmptyBlock closure) { - [[World sharedWorld] beforeSuite:closure]; -} - -void qck_afterSuite(QCKDSLEmptyBlock closure) { - [[World sharedWorld] afterSuite:closure]; -} - -void qck_sharedExamples(NSString *name, QCKDSLSharedExampleBlock closure) { - [[World sharedWorld] sharedExamples:name closure:closure]; -} - -void qck_describe(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] describe:description flags:@{} closure:closure]; -} - -void qck_context(NSString *description, QCKDSLEmptyBlock closure) { - qck_describe(description, closure); -} - -void qck_beforeEach(QCKDSLEmptyBlock closure) { - [[World sharedWorld] beforeEach:closure]; -} - -void qck_beforeEachWithMetadata(QCKDSLExampleMetadataBlock closure) { - [[World sharedWorld] beforeEachWithMetadata:closure]; -} - -void qck_afterEach(QCKDSLEmptyBlock closure) { - [[World sharedWorld] afterEach:closure]; -} - -void qck_afterEachWithMetadata(QCKDSLExampleMetadataBlock closure) { - [[World sharedWorld] afterEachWithMetadata:closure]; -} - -QCKItBlock qck_it_builder(NSDictionary *flags, NSString *file, NSUInteger line) { - return ^(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] itWithDescription:description - flags:flags - file:file - line:line - closure:closure]; - }; -} - -QCKItBehavesLikeBlock qck_itBehavesLike_builder(NSDictionary *flags, NSString *file, NSUInteger line) { - return ^(NSString *name, QCKDSLSharedExampleContext context) { - [[World sharedWorld] itBehavesLikeSharedExampleNamed:name - sharedExampleContext:context - flags:flags - file:file - line:line]; - }; -} - -void qck_pending(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] pending:description closure:closure]; -} - -void qck_xdescribe(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] xdescribe:description flags:@{} closure:closure]; -} - -void qck_xcontext(NSString *description, QCKDSLEmptyBlock closure) { - qck_xdescribe(description, closure); -} - -void qck_fdescribe(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] fdescribe:description flags:@{} closure:closure]; -} - -void qck_fcontext(NSString *description, QCKDSLEmptyBlock closure) { - qck_fdescribe(description, closure); -} diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h deleted file mode 100644 index a3b8524..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -@interface World (SWIFT_EXTENSION(Quick)) -- (void)beforeSuite:(void (^ __nonnull)(void))closure; -- (void)afterSuite:(void (^ __nonnull)(void))closure; -- (void)sharedExamples:(NSString * __nonnull)name closure:(void (^ __nonnull)(NSDictionary * __nonnull (^ __nonnull)(void)))closure; -- (void)describe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)context:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)fdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)xdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)beforeEach:(void (^ __nonnull)(void))closure; -- (void)beforeEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)afterEach:(void (^ __nonnull)(void))closure; -- (void)afterEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)itWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)fitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)xitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)itBehavesLikeSharedExampleNamed:(NSString * __nonnull)name sharedExampleContext:(NSDictionary * __nonnull (^ __nonnull)(void))sharedExampleContext flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line; -- (void)pending:(NSString * __nonnull)description closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Quick.h b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Quick.h deleted file mode 100644 index 87dad10..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Quick.h +++ /dev/null @@ -1,11 +0,0 @@ -#import - -//! Project version number for Quick. -FOUNDATION_EXPORT double QuickVersionNumber; - -//! Project version string for Quick. -FOUNDATION_EXPORT const unsigned char QuickVersionString[]; - -#import "QuickSpec.h" -#import "QCKDSL.h" -#import "QuickConfiguration.h" diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.h b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.h deleted file mode 100644 index 105a97e..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.h +++ /dev/null @@ -1,50 +0,0 @@ -#import - -/** - QuickSpec is a base class all specs written in Quick inherit from. - They need to inherit from QuickSpec, a subclass of XCTestCase, in - order to be discovered by the XCTest framework. - - XCTest automatically compiles a list of XCTestCase subclasses included - in the test target. It iterates over each class in that list, and creates - a new instance of that class for each test method. It then creates an - "invocation" to execute that test method. The invocation is an instance of - NSInvocation, which represents a single message send in Objective-C. - The invocation is set on the XCTestCase instance, and the test is run. - - Most of the code in QuickSpec is dedicated to hooking into XCTest events. - First, when the spec is first loaded and before it is sent any messages, - the +[NSObject initialize] method is called. QuickSpec overrides this method - to call +[QuickSpec spec]. This builds the example group stacks and - registers them with Quick.World, a global register of examples. - - Then, XCTest queries QuickSpec for a list of test methods. Normally, XCTest - automatically finds all methods whose selectors begin with the string "test". - However, QuickSpec overrides this default behavior by implementing the - +[XCTestCase testInvocations] method. This method iterates over each example - registered in Quick.World, defines a new method for that example, and - returns an invocation to call that method to XCTest. Those invocations are - the tests that are run by XCTest. Their selector names are displayed in - the Xcode test navigation bar. - */ -@interface QuickSpec : XCTestCase - -/** - Override this method in your spec to define a set of example groups - and examples. - - @code - override func spec() { - describe("winter") { - it("is coming") { - // ... - } - } - } - @endcode - - See DSL.swift for more information on what syntax is available. - */ -- (void)spec; - -@end diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m deleted file mode 100644 index 4891679..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m +++ /dev/null @@ -1,141 +0,0 @@ -#import "QuickSpec.h" -#import "QuickConfiguration.h" -#import "World.h" -#import - -static QuickSpec *currentSpec = nil; - -@interface QuickSpec () -@property (nonatomic, strong) Example *example; -@end - -@implementation QuickSpec - -#pragma mark - XCTestCase Overrides - -/** - The runtime sends initialize to each class in a program just before the class, or any class - that inherits from it, is sent its first message from within the program. QuickSpec hooks into - this event to compile the example groups for this spec subclass. - - If an exception occurs when compiling the examples, report it to the user. Chances are they - included an expectation outside of a "it", "describe", or "context" block. - */ -+ (void)initialize { - [QuickConfiguration initialize]; - - World *world = [World sharedWorld]; - [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ - QuickSpec *spec = [self new]; - - @try { - [spec spec]; - } - @catch (NSException *exception) { - [NSException raise:NSInternalInconsistencyException - format:@"An exception occurred when building Quick's example groups.\n" - @"Some possible reasons this might happen include:\n\n" - @"- An 'expect(...).to' expectation was evaluated outside of " - @"an 'it', 'context', or 'describe' block\n" - @"- 'sharedExamples' was called twice with the same name\n" - @"- 'itBehavesLike' was called with a name that is not registered as a shared example\n\n" - @"Here's the original exception: '%@', reason: '%@', userInfo: '%@'", - exception.name, exception.reason, exception.userInfo]; - } - [self testInvocations]; - }]; -} - -/** - 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 *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; - NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; - - NSMutableSet *selectorNames = [NSMutableSet set]; - - for (Example *example in examples) { - SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; - - NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; - invocation.selector = selector; - - [invocations addObject:invocation]; - } - - return invocations; -} - -#pragma mark - Public Interface - -- (void)spec { } - -#pragma mark - Internal Methods - -/** - QuickSpec uses this method to dynamically define a new instance method for the - given example. The instance method runs the example, catching any exceptions. - The exceptions are then reported as test failures. - - In order to report the correct file and line number, examples must raise exceptions - containing following keys in their userInfo: - - - "SenTestFilenameKey": A String representing the file name - - "SenTestLineNumberKey": An Int representing the line number - - These keys used to be used by SenTestingKit, and are still used by some testing tools - in the wild. See: https://github.com/Quick/Quick/pull/41 - - @return The selector of the newly defined instance method. - */ -+ (SEL)addInstanceMethodForExample:(Example *)example classSelectorNames:(NSMutableSet *)selectorNames { - IMP implementation = imp_implementationWithBlock(^(QuickSpec *self){ - self.example = example; - currentSpec = self; - [example run]; - }); - - const char *types = [[NSString stringWithFormat:@"%s%s%s", @encode(void), @encode(id), @encode(SEL)] UTF8String]; - - NSString *originalName = example.name.qck_c99ExtendedIdentifier; - NSString *selectorName = originalName; - NSUInteger i = 2; - - while ([selectorNames containsObject:selectorName]) { - selectorName = [NSString stringWithFormat:@"%@_%tu", originalName, i++]; - } - - [selectorNames addObject:selectorName]; - - SEL selector = NSSelectorFromString(selectorName); - class_addMethod(self, selector, implementation, types); - - return selector; -} - -/** - This method is used to record failures, whether they represent example - expectations that were not met, or exceptions raised during test setup - and teardown. By default, the failure will be reported as an - XCTest failure, and the example will be highlighted in Xcode. - */ -- (void)recordFailureWithDescription:(NSString *)description - inFile:(NSString *)filePath - atLine:(NSUInteger)lineNumber - expected:(BOOL)expected { - if (self.example.isSharedExample) { - filePath = self.example.callsite.file; - lineNumber = self.example.callsite.line; - } - [currentSpec.testRun recordFailureWithDescription:description - inFile:filePath - atLine:lineNumber - expected:expected]; -} - -@end diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/World.h b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/World.h deleted file mode 100644 index e638cf6..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/World.h +++ /dev/null @@ -1,18 +0,0 @@ -#import - -@class ExampleGroup; -@class ExampleMetadata; - -SWIFT_CLASS("_TtC5Quick5World") -@interface World - -@property (nonatomic) ExampleGroup * __nullable currentExampleGroup; -@property (nonatomic) ExampleMetadata * __nullable currentExampleMetadata; -@property (nonatomic) BOOL isRunningAdditionalSuites; -+ (World * __nonnull)sharedWorld; -- (void)configure:(void (^ __nonnull)(Configuration * __nonnull))closure; -- (void)finalizeConfiguration; -- (ExampleGroup * __nonnull)rootExampleGroupForSpecClass:(Class __nonnull)cls; -- (NSArray * __nonnull)examplesForSpecClass:(Class __nonnull)specClass; -- (void)performWithCurrentExampleGroup:(ExampleGroup * __nonnull)group closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m deleted file mode 100644 index e49939e..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m +++ /dev/null @@ -1,40 +0,0 @@ -#import -#import -#import - -@interface XCTestSuite (QuickTestSuiteBuilder) -@end - -@implementation XCTestSuite (QuickTestSuiteBuilder) - -/** - In order to ensure we can correctly build dynamic test suites, we need to - replace some of the default test suite constructors. - */ -+ (void)load { - Method testCaseWithName = class_getClassMethod(self, @selector(testSuiteForTestCaseWithName:)); - Method hooked_testCaseWithName = class_getClassMethod(self, @selector(qck_hooked_testSuiteForTestCaseWithName:)); - method_exchangeImplementations(testCaseWithName, hooked_testCaseWithName); -} - -/** - The `+testSuiteForTestCaseWithName:` method is called when a specific test case - class is run from the Xcode test navigator. If the built test suite is `nil`, - Xcode will not run any tests for that test case. - - Given if the following test case class is run from the Xcode test navigator: - - FooSpec - testFoo - testBar - - XCTest will invoke this once per test case, with test case names following this format: - - FooSpec/testFoo - FooSpec/testBar - */ -+ (nullable instancetype)qck_hooked_testSuiteForTestCaseWithName:(nonnull NSString *)name { - return [QuickTestSuite selectedTestSuiteForTestCaseWithName:name]; -} - -@end diff --git a/Carthage/Checkouts/Quick/Sources/QuickSpecBase/QuickSpecBase.m b/Carthage/Checkouts/Quick/Sources/QuickSpecBase/QuickSpecBase.m deleted file mode 100644 index 10b6f7e..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickSpecBase/QuickSpecBase.m +++ /dev/null @@ -1,55 +0,0 @@ -#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/Carthage/Checkouts/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h b/Carthage/Checkouts/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h deleted file mode 100644 index 8881ca0..0000000 --- a/Carthage/Checkouts/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h +++ /dev/null @@ -1,11 +0,0 @@ -#import -#import - -@interface _QuickSelectorWrapper : NSObject -- (instancetype)initWithSelector:(SEL)selector; -@end - -@interface _QuickSpecBase : XCTestCase -+ (NSArray<_QuickSelectorWrapper *> *)_qck_testMethodSelectors; -- (instancetype)init NS_DESIGNATED_INITIALIZER; -@end diff --git a/Carthage/Checkouts/Quick/Tests/LinuxMain.swift b/Carthage/Checkouts/Quick/Tests/LinuxMain.swift deleted file mode 100644 index 2a67c4a..0000000 --- a/Carthage/Checkouts/Quick/Tests/LinuxMain.swift +++ /dev/null @@ -1,45 +0,0 @@ -import XCTest -import Quick - -@testable import QuickTests - -Quick.QCKMain([ - FunctionalTests_AfterEachSpec.self, - AfterSuiteTests.self, - FunctionalTests_BeforeEachSpec.self, - FunctionalTests_BeforeSuite_BeforeSuiteSpec.self, - FunctionalTests_BeforeSuite_Spec.self, - FunctionalTests_ItSpec.self, - FunctionalTests_PendingSpec.self, - FunctionalTests_SharedExamples_BeforeEachSpec.self, - FunctionalTests_SharedExamples_Spec.self, - FunctionalTests_SharedExamples_ContextSpec.self, - Configuration_AfterEachSpec.self, - Configuration_BeforeEachSpec.self, - FunctionalTests_CrossReferencingSpecA.self, - FunctionalTests_CrossReferencingSpecB.self, - _FunctionalTests_FocusedSpec_Focused.self, - _FunctionalTests_FocusedSpec_Unfocused.self -], -configurations: [ - FunctionalTests_SharedExamples_BeforeEachTests_SharedExamples.self, - FunctionalTests_SharedExamplesTests_SharedExamples.self, - FunctionalTests_Configuration_AfterEach.self, - FunctionalTests_Configuration_BeforeEach.self, - FunctionalTests_FocusedSpec_SharedExamplesConfiguration.self -], -testCases: [ - testCase(AfterEachTests.allTests), - testCase(BeforeEachTests.allTests), - testCase(BeforeSuiteTests.allTests), - // testCase(DescribeTests.allTests), - testCase(ItTests.allTests), - testCase(PendingTests.allTests), - testCase(SharedExamples_BeforeEachTests.allTests), - testCase(SharedExamplesTests.allTests), - testCase(Configuration_AfterEachTests.allTests), - testCase(Configuration_BeforeEachTests.allTests), - testCase(FocusedTests.allTests), - testCase(FunctionalTests_CrossReferencingSpecA.allTests), - testCase(FunctionalTests_CrossReferencingSpecB.allTests) -]) diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m deleted file mode 100644 index cd3522d..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m +++ /dev/null @@ -1,32 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -static BOOL afterSuiteFirstTestExecuted = NO; -static BOOL afterSuiteTestsWasExecuted = NO; - -@interface AfterSuiteTests_ObjC : QuickSpec - -@end - -@implementation AfterSuiteTests_ObjC - -- (void)spec { - it(@"is executed before afterSuite", ^{ - expect(@(afterSuiteTestsWasExecuted)).to(beFalsy()); - }); - - afterSuite(^{ - afterSuiteTestsWasExecuted = YES; - }); -} - -+ (void)tearDown { - if (afterSuiteFirstTestExecuted) { - assert(afterSuiteTestsWasExecuted); - } else { - afterSuiteFirstTestExecuted = true; - } -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests.swift deleted file mode 100644 index ea4fc3e..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests.swift +++ /dev/null @@ -1,26 +0,0 @@ -import XCTest -import Quick -import Nimble - -var afterSuiteFirstTestExecuted = false -var afterSuiteTestsWasExecuted = false - -class AfterSuiteTests: QuickSpec { - override func spec() { - afterSuite { - afterSuiteTestsWasExecuted = true - } - - it("is executed before afterSuite") { - expect(afterSuiteTestsWasExecuted).to(beFalsy()) - } - } - - override class func tearDown() { - if afterSuiteFirstTestExecuted { - assert(afterSuiteTestsWasExecuted, "afterSuiteTestsWasExecuted needs to be true") - } else { - afterSuiteFirstTestExecuted = true - } - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/Info.plist b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m deleted file mode 100644 index 5069f2b..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m +++ /dev/null @@ -1,56 +0,0 @@ -@import Quick; -@import Nimble; -@import XCTest; - -#import "QCKSpecRunner.h" - -QuickConfigurationBegin(FunctionalTests_SharedExamplesConfiguration_ObjC) - -+ (void)configure:(Configuration *)configuration { - sharedExamples(@"two passing shared examples (Objective-C)", ^(QCKDSLSharedExampleContext exampleContext) { - it(@"has an example that passes (4)", ^{}); - it(@"has another example that passes (5)", ^{}); - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(FunctionalTests_FocusedSpec_Focused_ObjC) - -it(@"has an unfocused example that fails, but is never run", ^{ XCTFail(); }); -fit(@"has a focused example that passes (1)", ^{}); - -fdescribe(@"a focused example group", ^{ - it(@"has an example that is not focused, but will be run, and passes (2)", ^{}); - fit(@"has a focused example that passes (3)", ^{}); -}); - -fitBehavesLike(@"two passing shared examples (Objective-C)", ^NSDictionary *{ return @{}; }); - -QuickSpecEnd - -QuickSpecBegin(FunctionalTests_FocusedSpec_Unfocused_ObjC) - -it(@"has an unfocused example thay fails, but is never run", ^{ XCTFail(); }); - -describe(@"an unfocused example group that is never run", ^{ - beforeEach(^{ [NSException raise:NSInternalInconsistencyException format:@""]; }); - it(@"has an example that fails, but is never run", ^{ XCTFail(); }); -}); - -QuickSpecEnd - -@interface FocusedTests_ObjC: XCTestCase -@end - -@implementation FocusedTests_ObjC - -- (void)testOnlyFocusedExamplesAreExecuted { - XCTestRun *result = qck_runSpecs(@[ - [FunctionalTests_FocusedSpec_Focused_ObjC class], - [FunctionalTests_FocusedSpec_Unfocused_ObjC class] - ]); - XCTAssertEqual(result.executionCount, 5); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift deleted file mode 100644 index 132b748..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Quick -import Nimble -import XCTest - -class FunctionalTests_FocusedSpec_SharedExamplesConfiguration: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("two passing shared examples") { - it("has an example that passes (4)") {} - it("has another example that passes (5)") {} - } - } -} - -class FunctionalTests_FocusedSpec_Behavior: Behavior { - override static func spec(_ aContext: @escaping () -> Void) { - it("pass once") { expect(true).to(beTruthy()) } - it("pass twice") { expect(true).to(beTruthy()) } - it("pass three times") { expect(true).to(beTruthy()) } - } -} - -// The following `QuickSpec`s will be run in a same test suite with other specs -// on SwiftPM. We must avoid that the focused flags below affect other specs, so -// the examples of the two specs must be gathered lastly. That is the reason why -// the two specs have underscore prefix (and are listed at the bottom of `QCKMain`s -// `specs` array). - -class _FunctionalTests_FocusedSpec_Focused: QuickSpec { - override func spec() { - it("has an unfocused example that fails, but is never run") { fail() } - fit("has a focused example that passes (1)") {} - - fdescribe("a focused example group") { - it("has an example that is not focused, but will be run, and passes (2)") {} - fit("has a focused example that passes (3)") {} - } - - fitBehavesLike("two passing shared examples") - fitBehavesLike(FunctionalTests_FocusedSpec_Behavior.self) { () -> Void in } - } -} - -class _FunctionalTests_FocusedSpec_Unfocused: QuickSpec { - override func spec() { - it("has an unfocused example that fails, but is never run") { fail() } - - describe("an unfocused example group that is never run") { - beforeEach { assert(false) } - it("has an example that fails, but is never run") { fail() } - } - } -} - -final class FocusedTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (FocusedTests) -> () throws -> Void)] { - return [ - ("testOnlyFocusedExamplesAreExecuted", testOnlyFocusedExamplesAreExecuted) - ] - } - - func testOnlyFocusedExamplesAreExecuted() { - let result = qck_runSpecs([ - _FunctionalTests_FocusedSpec_Focused.self, - _FunctionalTests_FocusedSpec_Unfocused.self - ]) - XCTAssertEqual(result?.executionCount, 8) - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/Info.plist b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/SpecRunner.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/SpecRunner.swift deleted file mode 100644 index 66dec1b..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/SpecRunner.swift +++ /dev/null @@ -1,30 +0,0 @@ -@testable import Quick -import Nimble - -@discardableResult -public func qck_runSpec(_ specClass: QuickSpec.Type) -> TestRun? { - return qck_runSpecs([specClass]) -} - -@discardableResult -public func qck_runSpecs(_ specClasses: [QuickSpec.Type]) -> TestRun? { - Quick.World.sharedWorld.isRunningAdditionalSuites = true - - var executionCount: UInt = 0 - var hadUnexpectedFailure = false - - let fails = gatherFailingExpectations(silently: true) { - for specClass in specClasses { - for (_, test) in specClass.allTests { - do { - try test(specClass.init())() - } catch { - hadUnexpectedFailure = true - } - executionCount += 1 - } - } - } - - return TestRun(executionCount: executionCount, hasSucceeded: fails.isEmpty && !hadUnexpectedFailure) -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/TestRun.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/TestRun.swift deleted file mode 100644 index 3ef0d6c..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/TestRun.swift +++ /dev/null @@ -1,9 +0,0 @@ -public struct TestRun { - public var executionCount: UInt - public var hasSucceeded: Bool - - public init(executionCount: UInt, hasSucceeded: Bool) { - self.executionCount = executionCount - self.hasSucceeded = hasSucceeded - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/XCTestCaseProvider.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/XCTestCaseProvider.swift deleted file mode 100644 index 304eb30..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/XCTestCaseProvider.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest - -// XCTestCaseProvider should be adopted by all XCTestCase subclasses. It provides a -// mechanism for us to fail tests in Xcode which haven't been included in the `allTests` -// list for swift-corelibs-xctest which is unable to dynamically discover tests. Note -// that only `static var allTests` needs to be explicitly implemented, as `allTestNames` -// has a default implementation provided by a protocol extension. - -// Implementation note: This is broken down into two separate protocols because we need a -// protocol with no Self references to which we can cast XCTestCase instances in a non-generic context. - -public protocol XCTestCaseProviderStatic { - // This should be explicitly implemented by XCTestCase subclasses - static var allTests: [(String, (Self) -> () throws -> Void)] { get } -} - -public protocol XCTestCaseNameProvider { - // This does not need to be explicitly implemented because of the protocol extension below - var allTestNames: [String] { get } -} - -public protocol XCTestCaseProvider: XCTestCaseProviderStatic, XCTestCaseNameProvider {} - -public extension XCTestCaseProvider where Self: XCTestCaseProviderStatic { - var allTestNames: [String] { - return type(of: self).allTests.map { name, _ in - return name - } - } -} - -#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) - - extension XCTestCase { - override open func tearDown() { - if let provider = self as? XCTestCaseNameProvider { - provider.assertContainsTest(invocation!.selector.description) - } - - super.tearDown() - } - } - - extension XCTestCaseNameProvider { - fileprivate func assertContainsTest(_ name: String) { - let contains = self.allTestNames.contains(name) - XCTAssert(contains, "Test '\(name)' is missing from the allTests array") - } - } - -#endif diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_BehaviorTests_Behaviors.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_BehaviorTests_Behaviors.swift deleted file mode 100644 index 7e004d1..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_BehaviorTests_Behaviors.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation -import Quick -import Nimble - -class FunctionalTests_BehaviorTests_Behavior: Behavior { - override static func spec(_ aContext: @escaping () -> String) { - it("passed the correct parameters via the context") { - let callsite = aContext() - expect(callsite).to(equal("BehaviorSpec")) - } - } -} - -class FunctionalTests_BehaviorTests_Behavior2: Behavior { - override static func spec(_ aContext: @escaping () -> Void) { - it("passes once") { expect(true).to(beTruthy()) } - it("passes twice") { expect(true).to(beTruthy()) } - it("passes three times") { expect(true).to(beTruthy()) } - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_SharedExamplesTests_SharedExamples.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_SharedExamplesTests_SharedExamples.swift deleted file mode 100644 index e5eed68..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_SharedExamplesTests_SharedExamples.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation -import Quick -import Nimble - -class FunctionalTests_SharedExamplesTests_SharedExamples: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("a group of three shared examples") { - it("passes once") { expect(true).to(beTruthy()) } - it("passes twice") { expect(true).to(beTruthy()) } - it("passes three times") { expect(true).to(beTruthy()) } - } - - sharedExamples("shared examples that take a context") { (sharedExampleContext: @escaping SharedExampleContext) in - it("is passed the correct parameters via the context") { - let callsite = sharedExampleContext()["callsite"] as? String - expect(callsite).to(equal("SharedExamplesSpec")) - } - } - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift deleted file mode 100644 index 45f6203..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift +++ /dev/null @@ -1,92 +0,0 @@ -import XCTest -import Quick -import Nimble - -private enum AfterEachType { - case outerOne - case outerTwo - case outerThree - case innerOne - case innerTwo - case noExamples -} - -private var afterEachOrder = [AfterEachType]() - -class FunctionalTests_AfterEachSpec: QuickSpec { - override func spec() { - describe("afterEach ordering") { - afterEach { afterEachOrder.append(.outerOne) } - afterEach { afterEachOrder.append(.outerTwo) } - afterEach { afterEachOrder.append(.outerThree) } - - it("executes the outer afterEach closures once, but not before this closure [1]") { - // No examples have been run, so no afterEach will have been run either. - // The list should be empty. - expect(afterEachOrder).to(beEmpty()) - } - - it("executes the outer afterEach closures a second time, but not before this closure [2]") { - // The afterEach for the previous example should have been run. - // The list should contain the afterEach for that example, executed from top to bottom. - expect(afterEachOrder).to(equal([.outerOne, .outerTwo, .outerThree])) - } - - context("when there are nested afterEach") { - afterEach { afterEachOrder.append(.innerOne) } - afterEach { afterEachOrder.append(.innerTwo) } - - it("executes the outer and inner afterEach closures, but not before this closure [3]") { - // The afterEach for the previous two examples should have been run. - // The list should contain the afterEach for those example, executed from top to bottom. - expect(afterEachOrder).to(equal([ - .outerOne, .outerTwo, .outerThree, - .outerOne, .outerTwo, .outerThree - ])) - } - } - - context("when there are nested afterEach without examples") { - afterEach { afterEachOrder.append(.noExamples) } - } - } -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - describe("error handling when misusing ordering") { - it("should throw an exception when including afterEach in it block") { - expect { - afterEach { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'afterEach' cannot be used inside 'it', 'afterEach' may only be used inside 'context' or 'describe'. ")) - }) - } - } -#endif - } -} - -final class AfterEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AfterEachTests) -> () throws -> Void)] { - return [ - ("testAfterEachIsExecutedInTheCorrectOrder", testAfterEachIsExecutedInTheCorrectOrder) - ] - } - - func testAfterEachIsExecutedInTheCorrectOrder() { - afterEachOrder = [] - - qck_runSpec(FunctionalTests_AfterEachSpec.self) - let expectedOrder: [AfterEachType] = [ - // [1] The outer afterEach closures are executed from top to bottom. - .outerOne, .outerTwo, .outerThree, - // [2] The outer afterEach closures are executed from top to bottom. - .outerOne, .outerTwo, .outerThree, - // [3] The inner afterEach closures are executed from top to bottom, - // then the outer afterEach closures are executed from top to bottom. - .innerOne, .innerTwo, .outerOne, .outerTwo, .outerThree - ] - XCTAssertEqual(afterEachOrder, expectedOrder) - - afterEachOrder = [] - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift deleted file mode 100644 index 6709051..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift +++ /dev/null @@ -1,75 +0,0 @@ -import XCTest -import Quick -import Nimble - -private enum BeforeEachType { - case outerOne - case outerTwo - case innerOne - case innerTwo - case innerThree - case noExamples -} - -private var beforeEachOrder = [BeforeEachType]() - -class FunctionalTests_BeforeEachSpec: QuickSpec { - override func spec() { - - describe("beforeEach ordering") { - beforeEach { beforeEachOrder.append(.outerOne) } - beforeEach { beforeEachOrder.append(.outerTwo) } - - it("executes the outer beforeEach closures once [1]") {} - it("executes the outer beforeEach closures a second time [2]") {} - - context("when there are nested beforeEach") { - beforeEach { beforeEachOrder.append(.innerOne) } - beforeEach { beforeEachOrder.append(.innerTwo) } - beforeEach { beforeEachOrder.append(.innerThree) } - - it("executes the outer and inner beforeEach closures [3]") {} - } - - context("when there are nested beforeEach without examples") { - beforeEach { beforeEachOrder.append(.noExamples) } - } - } -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - describe("error handling when misusing ordering") { - it("should throw an exception when including beforeEach in it block") { - expect { - beforeEach { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'beforeEach' cannot be used inside 'it', 'beforeEach' may only be used inside 'context' or 'describe'. ")) - }) - } - } -#endif - } -} - -final class BeforeEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeforeEachTests) -> () throws -> Void)] { - return [ - ("testBeforeEachIsExecutedInTheCorrectOrder", testBeforeEachIsExecutedInTheCorrectOrder) - ] - } - - func testBeforeEachIsExecutedInTheCorrectOrder() { - beforeEachOrder = [] - - qck_runSpec(FunctionalTests_BeforeEachSpec.self) - let expectedOrder: [BeforeEachType] = [ - // [1] The outer beforeEach closures are executed from top to bottom. - .outerOne, .outerTwo, - // [2] The outer beforeEach closures are executed from top to bottom. - .outerOne, .outerTwo, - // [3] The outer beforeEach closures are executed from top to bottom, - // then the inner beforeEach closures are executed from top to bottom. - .outerOne, .outerTwo, .innerOne, .innerTwo, .innerThree - ] - XCTAssertEqual(beforeEachOrder, expectedOrder) - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift deleted file mode 100644 index df39126..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift +++ /dev/null @@ -1,39 +0,0 @@ -import XCTest -import Quick -import Nimble - -var beforeSuiteWasExecuted = false - -class FunctionalTests_BeforeSuite_BeforeSuiteSpec: QuickSpec { - override func spec() { - beforeSuite { - beforeSuiteWasExecuted = true - } - } -} - -class FunctionalTests_BeforeSuite_Spec: QuickSpec { - override func spec() { - it("is executed after beforeSuite") { - expect(beforeSuiteWasExecuted).to(beTruthy()) - } - } -} - -final class BeforeSuiteTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeforeSuiteTests) -> () throws -> Void)] { - return [ - ("testBeforeSuiteIsExecutedBeforeAnyExamples", testBeforeSuiteIsExecutedBeforeAnyExamples) - ] - } - - func testBeforeSuiteIsExecutedBeforeAnyExamples() { - // Execute the spec with an assertion before the one with a beforeSuite - let result = qck_runSpecs([ - FunctionalTests_BeforeSuite_Spec.self, - FunctionalTests_BeforeSuite_BeforeSuiteSpec.self - ]) - - XCTAssert(result!.hasSucceeded) - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BehaviorTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BehaviorTests.swift deleted file mode 100644 index 21dadfe..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BehaviorTests.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation -import Quick -import Nimble -import XCTest - -class FunctionalTests_BehaviorTests_Spec: QuickSpec { - override func spec() { - itBehavesLike(FunctionalTests_BehaviorTests_Behavior2.self) { () -> Void in } - } -} - -class FunctionalTests_BehaviorTests_ContextSpec: QuickSpec { - override func spec() { - itBehavesLike(FunctionalTests_BehaviorTests_Behavior.self) { - "BehaviorSpec" - } - } -} - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE -class FunctionalTests_BehaviorTests_ErrorSpec: QuickSpec { - override func spec() { - describe("error handling when misusing ordering") { - it("should throw an exception when including itBehavesLike in it block") { - expect { - itBehavesLike(FunctionalTests_BehaviorTests_Behavior2.self) { () } - } - .to(raiseException {(exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'itBehavesLike' cannot be used inside 'it', 'itBehavesLike' may only be used inside 'context' or 'describe'. ")) - }) - } - } - } -} -#endif - -final class BehaviorTests: XCTestCase, XCTestCaseProvider { - - static var allTests: [(String, (BehaviorTests) -> () throws -> Void)] { - return [ - ("testBehaviorPassContextToExamples", - testBehaviorPassContextToExamples), - ("testBehaviorExecutesThreeExamples", - testBehaviorExecutesThreeExamples) - ] - } - - func testBehaviorExecutesThreeExamples() { - let result = qck_runSpec(FunctionalTests_BehaviorTests_Spec.self) - XCTAssert(result!.hasSucceeded) - XCTAssertEqual(result!.executionCount, 3) - } - - func testBehaviorPassContextToExamples() { - let result = qck_runSpec(FunctionalTests_BehaviorTests_ContextSpec.self) - XCTAssert(result!.hasSucceeded) - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BundleModuleNameTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BundleModuleNameTests.swift deleted file mode 100644 index 4f99689..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BundleModuleNameTests.swift +++ /dev/null @@ -1,30 +0,0 @@ -#if !SWIFT_PACKAGE - -import XCTest -@testable import Quick -import Nimble - -class BundleModuleNameSpecs: QuickSpec { - override func spec() { - describe("Bundle module name") { - it("should repalce invalid characters with underscores") { - let bundle = Bundle.currentTestBundle - let moduleName = bundle?.moduleName - expect(moduleName?.contains("Quick_")).to(beTrue()) - } - - it("should be the correct module name to be able to retreive classes") { - guard let bundle = Bundle.currentTestBundle else { - XCTFail("test bundle not found") - return - } - - let moduleName = bundle.moduleName - let className: AnyClass? = NSClassFromString("\(moduleName).BundleModuleNameSpecs") - expect(className).to(be(BundleModuleNameSpecs.self)) - } - } - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEach.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEach.swift deleted file mode 100644 index c3f6717..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEach.swift +++ /dev/null @@ -1,11 +0,0 @@ -import Quick - -public var FunctionalTests_Configuration_AfterEachWasExecuted = false - -class FunctionalTests_Configuration_AfterEach: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - configuration.afterEach { - FunctionalTests_Configuration_AfterEachWasExecuted = true - } - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift deleted file mode 100644 index d7c2105..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift +++ /dev/null @@ -1,31 +0,0 @@ -import XCTest -import Quick -import Nimble - -class Configuration_AfterEachSpec: QuickSpec { - override func spec() { - beforeEach { - FunctionalTests_Configuration_AfterEachWasExecuted = false - } - it("is executed before the configuration afterEach") { - expect(FunctionalTests_Configuration_AfterEachWasExecuted).to(beFalsy()) - } - } -} - -final class Configuration_AfterEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (Configuration_AfterEachTests) -> () throws -> Void)] { - return [ - ("testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted", testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted) - ] - } - - func testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted() { - FunctionalTests_Configuration_AfterEachWasExecuted = false - - qck_runSpec(Configuration_BeforeEachSpec.self) - XCTAssert(FunctionalTests_Configuration_AfterEachWasExecuted) - - FunctionalTests_Configuration_AfterEachWasExecuted = false - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEach.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEach.swift deleted file mode 100644 index 228ab98..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEach.swift +++ /dev/null @@ -1,11 +0,0 @@ -import Quick - -public var FunctionalTests_Configuration_BeforeEachWasExecuted = false - -class FunctionalTests_Configuration_BeforeEach: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - configuration.beforeEach { - FunctionalTests_Configuration_BeforeEachWasExecuted = true - } - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift deleted file mode 100644 index ddf1509..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift +++ /dev/null @@ -1,28 +0,0 @@ -import XCTest -import Quick -import Nimble - -class Configuration_BeforeEachSpec: QuickSpec { - override func spec() { - it("is executed after the configuration beforeEach") { - expect(FunctionalTests_Configuration_BeforeEachWasExecuted).to(beTruthy()) - } - } -} - -final class Configuration_BeforeEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (Configuration_BeforeEachTests) -> () throws -> Void)] { - return [ - ("testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted", testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted) - ] - } - - func testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted() { - FunctionalTests_Configuration_BeforeEachWasExecuted = false - - qck_runSpec(Configuration_BeforeEachSpec.self) - XCTAssert(FunctionalTests_Configuration_BeforeEachWasExecuted) - - FunctionalTests_Configuration_BeforeEachWasExecuted = false - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift deleted file mode 100644 index ab619be..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift +++ /dev/null @@ -1,20 +0,0 @@ -import XCTest -import Quick -import Nimble - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE -class QuickContextTests: QuickSpec { - override func spec() { - describe("Context") { - it("should throw an exception if used in an it block") { - expect { - context("A nested context that should throw") { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'context' cannot be used inside 'it', 'context' may only be used inside 'context' or 'describe'. ")) - }) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/CrossReferencingSpecs.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/CrossReferencingSpecs.swift deleted file mode 100644 index 5fc3d7b..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/CrossReferencingSpecs.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Quick -import Nimble - -// This is a functional test ensuring that no crash occurs when a spec class -// references another spec class during its spec setup. - -class FunctionalTests_CrossReferencingSpecA: QuickSpec { - override func spec() { - _ = FunctionalTests_CrossReferencingSpecB() - it("does not crash") {} - } -} - -class FunctionalTests_CrossReferencingSpecB: QuickSpec { - override func spec() { - _ = FunctionalTests_CrossReferencingSpecA() - it("does not crash") {} - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift deleted file mode 100644 index 6c4ac07..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift +++ /dev/null @@ -1,34 +0,0 @@ -import XCTest -import Nimble -import Quick - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - -final class DescribeTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (DescribeTests) -> () throws -> Void)] { - return [ - ("testDescribeThrowsIfUsedOutsideOfQuickSpec", testDescribeThrowsIfUsedOutsideOfQuickSpec) - ] - } - - func testDescribeThrowsIfUsedOutsideOfQuickSpec() { - expect { describe("this should throw an exception", {}) }.to(raiseException()) - } -} - -class QuickDescribeTests: QuickSpec { - override func spec() { - describe("Describe") { - it("should throw an exception if used in an it block") { - expect { - describe("A nested describe that should throw") { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'describe' cannot be used inside 'it', 'describe' may only be used inside 'context' or 'describe'. ")) - }) - } - } - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift deleted file mode 100644 index 106cf30..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift +++ /dev/null @@ -1,127 +0,0 @@ -import XCTest -@testable import Quick -import Nimble - -class FunctionalTests_ItSpec: QuickSpec { - override func spec() { - var exampleMetadata: ExampleMetadata? - beforeEach { metadata in exampleMetadata = metadata } - - it("") { - expect(exampleMetadata!.example.name).to(equal("")) - } - - it("has a description with セレクター名に使えない文字が入っている 👊💥") { - let name = "has a description with セレクター名に使えない文字が入っている 👊💥" - expect(exampleMetadata!.example.name).to(equal(name)) - } - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - - describe("when an example has a unique name") { - it("has a unique name") {} - - it("doesn't add multiple selectors for it") { - let allSelectors = [String]( - FunctionalTests_ItSpec.allSelectors() - .filter { $0.hasPrefix("when_an_example_has_a_unique_name__") }) - .sorted(by: <) - - expect(allSelectors) == [ - "when_an_example_has_a_unique_name__doesn_t_add_multiple_selectors_for_it", - "when_an_example_has_a_unique_name__has_a_unique_name" - ] - } - } - - describe("when two examples have the exact name") { - it("has exactly the same name") {} - it("has exactly the same name") {} - - it("makes a unique name for each of the above") { - let allSelectors = [String]( - FunctionalTests_ItSpec.allSelectors() - .filter { $0.hasPrefix("when_two_examples_have_the_exact_name__") }) - .sorted(by: <) - - expect(allSelectors) == [ - "when_two_examples_have_the_exact_name__has_exactly_the_same_name", - "when_two_examples_have_the_exact_name__has_exactly_the_same_name_2", - "when_two_examples_have_the_exact_name__makes_a_unique_name_for_each_of_the_above" - ] - } - - } - - describe("error handling when misusing ordering") { - it("an it") { - expect { - it("will throw an error when it is nested in another it") { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'it' cannot be used inside 'it', 'it' may only be used inside 'context' or 'describe'. ")) - }) - } - - describe("behavior with an 'it' inside a 'beforeEach'") { - var exception: NSException? - - beforeEach { - let capture = NMBExceptionCapture(handler: ({ e in - exception = e - }), finally: nil) - - capture.tryBlock { - it("a rogue 'it' inside a 'beforeEach'") { } - return - } - } - - it("should have thrown an exception with the correct error message") { - expect(exception).toNot(beNil()) - expect(exception!.reason).to(equal("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'. ")) - } - } - - describe("behavior with an 'it' inside an 'afterEach'") { - var exception: NSException? - - afterEach { - let capture = NMBExceptionCapture(handler: ({ e in - exception = e - expect(exception).toNot(beNil()) - expect(exception!.reason).to(equal("'it' cannot be used inside 'afterEach', 'it' may only be used inside 'context' or 'describe'. ")) - }), finally: nil) - - capture.tryBlock { - it("a rogue 'it' inside an 'afterEach'") { } - return - } - } - - it("should throw an exception with the correct message after this 'it' block executes") { } - } - } -#endif - } -} - -final class ItTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ItTests) -> () throws -> Void)] { - return [ - ("testAllExamplesAreExecuted", testAllExamplesAreExecuted) - ] - } - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - func testAllExamplesAreExecuted() { - let result = qck_runSpec(FunctionalTests_ItSpec.self) - XCTAssertEqual(result?.executionCount, 10) - } -#else - func testAllExamplesAreExecuted() { - let result = qck_runSpec(FunctionalTests_ItSpec.self) - XCTAssertEqual(result?.executionCount, 2) - } -#endif -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/AfterEachTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/AfterEachTests+ObjC.m deleted file mode 100644 index 4216a86..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/AfterEachTests+ObjC.m +++ /dev/null @@ -1,81 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -typedef NS_ENUM(NSUInteger, AfterEachType) { - OuterOne, - OuterTwo, - OuterThree, - InnerOne, - InnerTwo, - NoExamples, -}; - -static NSMutableArray *afterEachOrder; - -QuickSpecBegin(FunctionalTests_AfterEachSpec_ObjC) - -afterEach(^{ [afterEachOrder addObject:@(OuterOne)]; }); -afterEach(^{ [afterEachOrder addObject:@(OuterTwo)]; }); -afterEach(^{ [afterEachOrder addObject:@(OuterThree)]; }); - -it(@"executes the outer afterEach closures once, but not before this closure [1]", ^{ - expect(afterEachOrder).to(equal(@[])); -}); - -it(@"executes the outer afterEach closures a second time, but not before this closure [2]", ^{ - expect(afterEachOrder).to(equal(@[@(OuterOne), @(OuterTwo), @(OuterThree)])); -}); - -context(@"when there are nested afterEach", ^{ - afterEach(^{ [afterEachOrder addObject:@(InnerOne)]; }); - afterEach(^{ [afterEachOrder addObject:@(InnerTwo)]; }); - - it(@"executes the outer and inner afterEach closures, but not before this closure [3]", ^{ - // The afterEach for the previous two examples should have been run. - // The list should contain the afterEach for those example, executed from top to bottom. - expect(afterEachOrder).to(equal(@[ - @(OuterOne), @(OuterTwo), @(OuterThree), - @(OuterOne), @(OuterTwo), @(OuterThree), - ])); - }); -}); - -context(@"when there are nested afterEach without examples", ^{ - afterEach(^{ [afterEachOrder addObject:@(NoExamples)]; }); -}); - -QuickSpecEnd - -@interface AfterEachTests_ObjC : XCTestCase; @end - -@implementation AfterEachTests_ObjC - -- (void)setUp { - [super setUp]; - afterEachOrder = [NSMutableArray array]; -} - -- (void)tearDown { - afterEachOrder = [NSMutableArray array]; - [super tearDown]; -} - -- (void)testAfterEachIsExecutedInTheCorrectOrder { - qck_runSpec([FunctionalTests_AfterEachSpec_ObjC class]); - NSArray *expectedOrder = @[ - // [1] The outer afterEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), @(OuterThree), - // [2] The outer afterEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), @(OuterThree), - // [3] The outer afterEach closures are executed from top to bottom, - // then the outer afterEach closures are executed from top to bottom. - @(InnerOne), @(InnerTwo), @(OuterOne), @(OuterTwo), @(OuterThree), - ]; - - XCTAssertEqualObjects(afterEachOrder, expectedOrder); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeEachTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeEachTests+ObjC.m deleted file mode 100644 index c7a5897..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeEachTests+ObjC.m +++ /dev/null @@ -1,68 +0,0 @@ -@import XCTest; -@import Quick; - -#import "QCKSpecRunner.h" - -typedef NS_ENUM(NSUInteger, BeforeEachType) { - OuterOne, - OuterTwo, - InnerOne, - InnerTwo, - InnerThree, - NoExamples, -}; - -static NSMutableArray *beforeEachOrder; - -QuickSpecBegin(FunctionalTests_BeforeEachSpec_ObjC) - -beforeEach(^{ [beforeEachOrder addObject:@(OuterOne)]; }); -beforeEach(^{ [beforeEachOrder addObject:@(OuterTwo)]; }); - -it(@"executes the outer beforeEach closures once [1]", ^{}); -it(@"executes the outer beforeEach closures a second time [2]", ^{}); - -context(@"when there are nested beforeEach", ^{ - beforeEach(^{ [beforeEachOrder addObject:@(InnerOne)]; }); - beforeEach(^{ [beforeEachOrder addObject:@(InnerTwo)]; }); - beforeEach(^{ [beforeEachOrder addObject:@(InnerThree)]; }); - - it(@"executes the outer and inner beforeEach closures [3]", ^{}); -}); - -context(@"when there are nested beforeEach without examples", ^{ - beforeEach(^{ [beforeEachOrder addObject:@(NoExamples)]; }); -}); - -QuickSpecEnd - -@interface BeforeEachTests_ObjC : XCTestCase; @end - -@implementation BeforeEachTests_ObjC - -- (void)setUp { - beforeEachOrder = [NSMutableArray array]; - [super setUp]; -} - -- (void)tearDown { - beforeEachOrder = [NSMutableArray array]; - [super tearDown]; -} - -- (void)testBeforeEachIsExecutedInTheCorrectOrder { - qck_runSpec([FunctionalTests_BeforeEachSpec_ObjC class]); - NSArray *expectedOrder = @[ - // [1] The outer beforeEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), - // [2] The outer beforeEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), - // [3] The outer beforeEach closures are executed from top to bottom, - // then the inner beforeEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), @(InnerOne), @(InnerTwo), @(InnerThree), - ]; - - XCTAssertEqualObjects(beforeEachOrder, expectedOrder); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeSuiteTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeSuiteTests+ObjC.m deleted file mode 100644 index ce7efc9..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeSuiteTests+ObjC.m +++ /dev/null @@ -1,39 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -static BOOL beforeSuiteWasExecuted = NO; - -QuickSpecBegin(FunctionalTests_BeforeSuite_BeforeSuiteSpec_ObjC) - -beforeSuite(^{ - beforeSuiteWasExecuted = YES; -}); - -QuickSpecEnd - -QuickSpecBegin(FunctionalTests_BeforeSuite_Spec_ObjC) - -it(@"is executed after beforeSuite", ^{ - expect(@(beforeSuiteWasExecuted)).to(beTruthy()); -}); - -QuickSpecEnd - -@interface BeforeSuiteTests_ObjC : XCTestCase; @end - -@implementation BeforeSuiteTests_ObjC - -- (void)testBeforeSuiteIsExecutedBeforeAnyExamples { - // Execute the spec with an assertion before the one with a beforeSuite - NSArray *specs = @[ - [FunctionalTests_BeforeSuite_Spec_ObjC class], - [FunctionalTests_BeforeSuite_BeforeSuiteSpec_ObjC class] - ]; - XCTestRun *result = qck_runSpecs(specs); - XCTAssert(result.hasSucceeded); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureTests+ObjC.m deleted file mode 100644 index dc786e8..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureTests+ObjC.m +++ /dev/null @@ -1,61 +0,0 @@ -@import XCTest; - -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -static BOOL isRunningFunctionalTests = NO; - -#pragma mark - Spec - -QuickSpecBegin(FunctionalTests_FailureSpec_ObjC) - -describe(@"a group of failing examples", ^{ - it(@"passes", ^{ - expect(@YES).to(beTruthy()); - }); - - it(@"fails (but only when running the functional tests)", ^{ - expect(@(isRunningFunctionalTests)).to(beFalsy()); - }); - - it(@"fails again (but only when running the functional tests)", ^{ - expect(@(isRunningFunctionalTests)).to(beFalsy()); - }); -}); - -QuickSpecEnd - -#pragma mark - Tests - -@interface FailureTests_ObjC : XCTestCase; @end - -@implementation FailureTests_ObjC - -- (void)setUp { - [super setUp]; - isRunningFunctionalTests = YES; -} - -- (void)tearDown { - isRunningFunctionalTests = NO; - [super tearDown]; -} - -- (void)testFailureSpecHasSucceededIsFalse { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureSpec_ObjC class]); - XCTAssertFalse(result.hasSucceeded); -} - -- (void)testFailureSpecExecutedAllExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureSpec_ObjC class]); - XCTAssertEqual(result.executionCount, 3); -} - -- (void)testFailureSpecFailureCountIsEqualToTheNumberOfFailingExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureSpec_ObjC class]); - XCTAssertEqual(result.failureCount, 2); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureUsingXCTAssertTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureUsingXCTAssertTests+ObjC.m deleted file mode 100644 index 70fb245..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureUsingXCTAssertTests+ObjC.m +++ /dev/null @@ -1,55 +0,0 @@ -@import XCTest; -@import Quick; - -#import "QCKSpecRunner.h" - -static BOOL isRunningFunctionalTests = NO; - -QuickSpecBegin(FunctionalTests_FailureUsingXCTAssertSpec_ObjC) - -it(@"fails using an XCTAssert (but only when running the functional tests)", ^{ - XCTAssertFalse(isRunningFunctionalTests); -}); - -it(@"fails again using an XCTAssert (but only when running the functional tests)", ^{ - XCTAssertFalse(isRunningFunctionalTests); -}); - -it(@"succeeds using an XCTAssert", ^{ - XCTAssertTrue(YES); -}); - -QuickSpecEnd - -#pragma mark - Tests - -@interface FailureUsingXCTAssertTests_ObjC : XCTestCase; @end - -@implementation FailureUsingXCTAssertTests_ObjC - -- (void)setUp { - [super setUp]; - isRunningFunctionalTests = YES; -} - -- (void)tearDown { - isRunningFunctionalTests = NO; - [super tearDown]; -} - -- (void)testFailureUsingXCTAssertSpecHasSucceededIsFalse { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureUsingXCTAssertSpec_ObjC class]); - XCTAssertFalse(result.hasSucceeded); -} - -- (void)testFailureUsingXCTAssertSpecExecutedAllExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureUsingXCTAssertSpec_ObjC class]); - XCTAssertEqual(result.executionCount, 3); -} - -- (void)testFailureUsingXCTAssertSpecFailureCountIsEqualToTheNumberOfFailingExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureUsingXCTAssertSpec_ObjC class]); - XCTAssertEqual(result.totalFailureCount, 2); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/ItTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/ItTests+ObjC.m deleted file mode 100644 index 39e0b7d..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/ItTests+ObjC.m +++ /dev/null @@ -1,42 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" -#import "QuickSpec+QuickSpec_MethodList.h" - -QuickSpecBegin(FunctionalTests_ItSpec_ObjC) - -__block ExampleMetadata *exampleMetadata = nil; -beforeEachWithMetadata(^(ExampleMetadata *metadata) { - exampleMetadata = metadata; -}); - -it(@" ", ^{ - expect(exampleMetadata.example.name).to(equal(@" ")); -}); - -it(@"has a description with セレクター名に使えない文字が入っている 👊💥", ^{ - NSString *name = @"has a description with セレクター名に使えない文字が入っている 👊💥"; - expect(exampleMetadata.example.name).to(equal(name)); -}); - -it(@"is a test with a unique name", ^{ - NSSet *allSelectors = [FunctionalTests_ItSpec_ObjC allSelectors]; - - expect(allSelectors).to(contain(@"is_a_test_with_a_unique_name")); - expect(allSelectors).toNot(contain(@"is_a_test_with_a_unique_name_2")); -}); - -QuickSpecEnd - -@interface ItTests_ObjC : XCTestCase; @end - -@implementation ItTests_ObjC - -- (void)testAllExamplesAreExecuted { - XCTestRun *result = qck_runSpec([FunctionalTests_ItSpec_ObjC class]); - XCTAssertEqual(result.executionCount, 3); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/PendingTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/PendingTests+ObjC.m deleted file mode 100644 index 970175f..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/PendingTests+ObjC.m +++ /dev/null @@ -1,60 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -static NSUInteger oneExampleBeforeEachExecutedCount = 0; -static NSUInteger onlyPendingExamplesBeforeEachExecutedCount = 0; - -QuickSpecBegin(FunctionalTests_PendingSpec_ObjC) - -pending(@"an example that will not run", ^{ - expect(@YES).to(beFalsy()); -}); - -describe(@"a describe block containing only one enabled example", ^{ - beforeEach(^{ oneExampleBeforeEachExecutedCount += 1; }); - it(@"an example that will run", ^{}); - pending(@"an example that will not run", ^{}); -}); - -describe(@"a describe block containing only pending examples", ^{ - beforeEach(^{ onlyPendingExamplesBeforeEachExecutedCount += 1; }); - pending(@"an example that will not run", ^{}); -}); - -QuickSpecEnd - -@interface PendingTests_ObjC : XCTestCase; @end - -@implementation PendingTests_ObjC - -- (void)setUp { - [super setUp]; - oneExampleBeforeEachExecutedCount = 0; - onlyPendingExamplesBeforeEachExecutedCount = 0; -} - -- (void)tearDown { - oneExampleBeforeEachExecutedCount = 0; - onlyPendingExamplesBeforeEachExecutedCount = 0; - [super tearDown]; -} - -- (void)testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail { - XCTestRun *result = qck_runSpec([FunctionalTests_PendingSpec_ObjC class]); - XCTAssert(result.hasSucceeded); -} - -- (void)testBeforeEachOnlyRunForEnabledExamples { - qck_runSpec([FunctionalTests_PendingSpec_ObjC class]); - XCTAssertEqual(oneExampleBeforeEachExecutedCount, 1); -} - -- (void)testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples { - qck_runSpec([FunctionalTests_PendingSpec_ObjC class]); - XCTAssertEqual(onlyPendingExamplesBeforeEachExecutedCount, 0); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamples+BeforeEachTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamples+BeforeEachTests+ObjC.m deleted file mode 100644 index cdbf259..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamples+BeforeEachTests+ObjC.m +++ /dev/null @@ -1,59 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -static NSUInteger specBeforeEachExecutedCount = 0; -static NSUInteger sharedExamplesBeforeEachExecutedCount = 0; - -QuickConfigurationBegin(FunctionalTests_SharedExamples_BeforeEachTests_SharedExamples_ObjC) - -+ (void)configure:(Configuration *)configuration { - sharedExamples(@"a group of three shared examples with a beforeEach in Obj-C", - ^(QCKDSLSharedExampleContext context) { - beforeEach(^{ sharedExamplesBeforeEachExecutedCount += 1; }); - it(@"passes once", ^{}); - it(@"passes twice", ^{}); - it(@"passes three times", ^{}); - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(FunctionalTests_SharedExamples_BeforeEachSpec_ObjC) - -beforeEach(^{ specBeforeEachExecutedCount += 1; }); -it(@"executes the spec beforeEach once", ^{}); -itBehavesLike(@"a group of three shared examples with a beforeEach in Obj-C", - ^NSDictionary*{ return @{}; }); - -QuickSpecEnd - -@interface SharedExamples_BeforeEachTests_ObjC : XCTestCase; @end - -@implementation SharedExamples_BeforeEachTests_ObjC - -- (void)setUp { - [super setUp]; - specBeforeEachExecutedCount = 0; - sharedExamplesBeforeEachExecutedCount = 0; -} - -- (void)tearDown { - specBeforeEachExecutedCount = 0; - sharedExamplesBeforeEachExecutedCount = 0; - [super tearDown]; -} - -- (void)testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample { - qck_runSpec([FunctionalTests_SharedExamples_BeforeEachSpec_ObjC class]); - XCTAssertEqual(specBeforeEachExecutedCount, 4); -} - -- (void)testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample { - qck_runSpec([FunctionalTests_SharedExamples_BeforeEachSpec_ObjC class]); - XCTAssertEqual(sharedExamplesBeforeEachExecutedCount, 3); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamplesTests+ObjC.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamplesTests+ObjC.m deleted file mode 100644 index 7fcb8b1..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamplesTests+ObjC.m +++ /dev/null @@ -1,65 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -QuickSpecBegin(FunctionalTests_SharedExamples_Spec_ObjC) - -itBehavesLike(@"a group of three shared examples", ^NSDictionary*{ return @{}; }); - -QuickSpecEnd - -QuickSpecBegin(FunctionalTests_SharedExamples_ContextSpec_ObjC) - -itBehavesLike(@"shared examples that take a context", ^NSDictionary *{ - return @{ @"callsite": @"SharedExamplesSpec" }; -}); - -QuickSpecEnd - -QuickSpecBegin(FunctionalTests_SharedExamples_SameContextSpec_ObjC) - -__block NSInteger counter = 0; - -afterEach(^{ - counter++; -}); - -sharedExamples(@"gets called with a different context from within the same spec file", ^(QCKDSLSharedExampleContext exampleContext) { - - it(@"tracks correctly", ^{ - NSString *payload = exampleContext()[@"payload"]; - BOOL expected = [payload isEqualToString:[NSString stringWithFormat:@"%ld", (long)counter]]; - expect(@(expected)).to(beTrue()); - }); - -}); - -itBehavesLike(@"gets called with a different context from within the same spec file", ^{ - return @{ @"payload" : @"0" }; -}); - -itBehavesLike(@"gets called with a different context from within the same spec file", ^{ - return @{ @"payload" : @"1" }; -}); - -QuickSpecEnd - - -@interface SharedExamplesTests_ObjC : XCTestCase; @end - -@implementation SharedExamplesTests_ObjC - -- (void)testAGroupOfThreeSharedExamplesExecutesThreeExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_SharedExamples_Spec_ObjC class]); - XCTAssert(result.hasSucceeded); - XCTAssertEqual(result.executionCount, 3); -} - -- (void)testSharedExamplesWithContextPassContextToExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_SharedExamples_ContextSpec_ObjC class]); - XCTAssert(result.hasSucceeded); -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift deleted file mode 100644 index 5334200..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift +++ /dev/null @@ -1,61 +0,0 @@ -import XCTest -import Quick -import Nimble - -var oneExampleBeforeEachExecutedCount = 0 -var onlyPendingExamplesBeforeEachExecutedCount = 0 - -class FunctionalTests_PendingSpec_Behavior: Behavior { - override static func spec(_ aContext: @escaping () -> Void) { - it("an example that will not run") { - expect(true).to(beFalsy()) - } - } -} -class FunctionalTests_PendingSpec: QuickSpec { - override func spec() { - xit("an example that will not run") { - expect(true).to(beFalsy()) - } - xitBehavesLike(FunctionalTests_PendingSpec_Behavior.self) { () -> Void in } - describe("a describe block containing only one enabled example") { - beforeEach { oneExampleBeforeEachExecutedCount += 1 } - it("an example that will run") {} - pending("an example that will not run") {} - } - - describe("a describe block containing only pending examples") { - beforeEach { onlyPendingExamplesBeforeEachExecutedCount += 1 } - pending("an example that will not run") {} - } - } -} - -final class PendingTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (PendingTests) -> () throws -> Void)] { - return [ - ("testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail", testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail), - ("testBeforeEachOnlyRunForEnabledExamples", testBeforeEachOnlyRunForEnabledExamples), - ("testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples", testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples) - ] - } - - func testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail() { - let result = qck_runSpec(FunctionalTests_PendingSpec.self) - XCTAssertTrue(result!.hasSucceeded) - } - - func testBeforeEachOnlyRunForEnabledExamples() { - oneExampleBeforeEachExecutedCount = 0 - - qck_runSpec(FunctionalTests_PendingSpec.self) - XCTAssertEqual(oneExampleBeforeEachExecutedCount, 1) - } - - func testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples() { - onlyPendingExamplesBeforeEachExecutedCount = 0 - - qck_runSpec(FunctionalTests_PendingSpec.self) - XCTAssertEqual(onlyPendingExamplesBeforeEachExecutedCount, 0) - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift deleted file mode 100644 index 2b0fd77..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift +++ /dev/null @@ -1,48 +0,0 @@ -import XCTest -import Quick -import Nimble - -var specBeforeEachExecutedCount = 0 -var sharedExamplesBeforeEachExecutedCount = 0 - -class FunctionalTests_SharedExamples_BeforeEachTests_SharedExamples: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("a group of three shared examples with a beforeEach") { - beforeEach { sharedExamplesBeforeEachExecutedCount += 1 } - it("passes once") {} - it("passes twice") {} - it("passes three times") {} - } - } -} - -class FunctionalTests_SharedExamples_BeforeEachSpec: QuickSpec { - override func spec() { - beforeEach { specBeforeEachExecutedCount += 1 } - it("executes the spec beforeEach once") {} - itBehavesLike("a group of three shared examples with a beforeEach") - } -} - -final class SharedExamples_BeforeEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SharedExamples_BeforeEachTests) -> () throws -> Void)] { - return [ - ("testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample", testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample), - ("testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample", testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample) - ] - } - - func testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample() { - specBeforeEachExecutedCount = 0 - - qck_runSpec(FunctionalTests_SharedExamples_BeforeEachSpec.self) - XCTAssertEqual(specBeforeEachExecutedCount, 4) - } - - func testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample() { - sharedExamplesBeforeEachExecutedCount = 0 - - qck_runSpec(FunctionalTests_SharedExamples_BeforeEachSpec.self) - XCTAssertEqual(sharedExamplesBeforeEachExecutedCount, 3) - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift deleted file mode 100644 index 8a50cc1..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift +++ /dev/null @@ -1,54 +0,0 @@ -import Foundation -import XCTest -import Quick -import Nimble - -class FunctionalTests_SharedExamples_Spec: QuickSpec { - override func spec() { - itBehavesLike("a group of three shared examples") - } -} - -class FunctionalTests_SharedExamples_ContextSpec: QuickSpec { - override func spec() { - itBehavesLike("shared examples that take a context") { ["callsite": "SharedExamplesSpec"] } - } -} - -#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE -class FunctionalTests_SharedExamples_ErrorSpec: QuickSpec { - override func spec() { - describe("error handling when misusing ordering") { - it("should throw an exception when including itBehavesLike in it block") { - expect { - itBehavesLike("a group of three shared examples") - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'itBehavesLike' cannot be used inside 'it', 'itBehavesLike' may only be used inside 'context' or 'describe'. ")) - }) - } - } - } -} -#endif - -// Shared examples are defined in QuickTests/Fixtures -final class SharedExamplesTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SharedExamplesTests) -> () throws -> Void)] { - return [ - ("testAGroupOfThreeSharedExamplesExecutesThreeExamples", testAGroupOfThreeSharedExamplesExecutesThreeExamples), - ("testSharedExamplesWithContextPassContextToExamples", testSharedExamplesWithContextPassContextToExamples) - ] - } - - func testAGroupOfThreeSharedExamplesExecutesThreeExamples() { - let result = qck_runSpec(FunctionalTests_SharedExamples_Spec.self) - XCTAssert(result!.hasSucceeded) - XCTAssertEqual(result!.executionCount, 3) - } - - func testSharedExamplesWithContextPassContextToExamples() { - let result = qck_runSpec(FunctionalTests_SharedExamples_ContextSpec.self) - XCTAssert(result!.hasSucceeded) - } -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.h b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.h deleted file mode 100644 index 183118e..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.h +++ /dev/null @@ -1,22 +0,0 @@ -@import XCTest; - -/** - Runs an XCTestSuite instance containing only the given XCTestCase subclass. - Use this to run QuickSpec subclasses from within a set of unit tests. - - Due to implicit dependencies in _XCTFailureHandler, this function raises an - exception when used in Swift to run a failing test case. - - @param specClass The class of the spec to be run. - @return An XCTestRun instance that contains information such as the number of failures, etc. - */ -extern XCTestRun * _Nullable qck_runSpec(Class _Nonnull specClass); - -/** - Runs an XCTestSuite instance containing the given XCTestCase subclasses, in the order provided. - See the documentation for `qck_runSpec` for more details. - - @param specClasses An array of QuickSpec classes, in the order they should be run. - @return An XCTestRun instance that contains information such as the number of failures, etc. - */ -extern XCTestRun * _Nullable qck_runSpecs(NSArray * _Nonnull specClasses); diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.m deleted file mode 100644 index a2aa78c..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.m +++ /dev/null @@ -1,33 +0,0 @@ -@import Quick; - -#import "QCKSpecRunner.h" -#import "XCTestObservationCenter+QCKSuspendObservation.h" -#import "World.h" - -@interface XCTest (Redeclaration) -- (XCTestRun *)run; -@end - -XCTestRun * _Nullable qck_runSuite(XCTestSuite * _Nonnull suite) { - [World sharedWorld].isRunningAdditionalSuites = YES; - - __block XCTestRun *result = nil; - [[XCTestObservationCenter sharedTestObservationCenter] qck_suspendObservationForBlock:^{ - [suite runTest]; - result = suite.testRun; - }]; - return result; -} - -XCTestRun *qck_runSpec(Class specClass) { - return qck_runSuite([XCTestSuite testSuiteForTestCaseClass:specClass]); -} - -XCTestRun * _Nullable qck_runSpecs(NSArray * _Nonnull specClasses) { - XCTestSuite *suite = [XCTestSuite testSuiteWithName:@"MySpecs"]; - for (Class specClass in specClasses) { - [suite addTest:[XCTestSuite testSuiteForTestCaseClass:specClass]]; - } - - return qck_runSuite(suite); -} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.h b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.h deleted file mode 100644 index 99e20f8..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.h +++ /dev/null @@ -1,11 +0,0 @@ -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QuickSpec (QuickSpec_MethodList) - -+ (NSSet *)allSelectors; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.m deleted file mode 100644 index c648bd1..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.m +++ /dev/null @@ -1,31 +0,0 @@ -#import "QuickSpec+QuickSpec_MethodList.h" -#import - - -@implementation QuickSpec (QuickSpec_MethodList) - -/** - * This method will instantiate an instance of the class on which it is called, - * returning a list of selector names for it. - * - * @warning Only intended to be used in test assertions! - * - * @return a set of NSStrings representing the list of selectors it contains - */ -+ (NSSet *)allSelectors { - QuickSpec *specInstance = [[[self class] alloc] init]; - NSMutableSet *allSelectors = [NSMutableSet set]; - - unsigned int methodCount = 0; - Method *mlist = class_copyMethodList(object_getClass(specInstance), &methodCount); - - for(unsigned int i = 0; i < methodCount; i++) { - SEL selector = method_getName(mlist[i]); - [allSelectors addObject:NSStringFromSelector(selector)]; - } - - free(mlist); - return [allSelectors copy]; -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h deleted file mode 100644 index 301c5d5..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h +++ /dev/null @@ -1,2 +0,0 @@ -#import "QCKSpecRunner.h" -#import "QuickSpec+QuickSpec_MethodList.h" diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.h b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.h deleted file mode 100644 index d69f808..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -/** - Add the ability to temporarily disable internal XCTest execution observation in - order to run isolated XCTestSuite instances while the QuickTests test suite is running. - */ -@interface XCTestObservationCenter (QCKSuspendObservation) - -/** - Suspends test suite observation for XCTest-provided observers for the duration that - the block is executing. Any test suites that are executed within the block do not - generate any log output. Failures are still reported. - - Use this method to run XCTestSuite objects while another XCTestSuite is running. - Without this method, tests fail with the message: "Timed out waiting for IDE - barrier message to complete" or "Unexpected TestSuiteDidStart". - */ -- (void)qck_suspendObservationForBlock:(void (^)(void))block; - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.m deleted file mode 100644 index 1a32e10..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.m +++ /dev/null @@ -1,54 +0,0 @@ -@import XCTest; -#import - -@interface XCTestObservationCenter (Redeclaration) -- (id)observers; -- (void)removeTestObserver:(id)testObserver; -@end - -@implementation XCTestObservationCenter (QCKSuspendObservation) - -/// This allows us to only suspend observation for observers by provided by Apple -/// as a part of the XCTest framework. In particular it is important that we not -/// suspend the observer added by Nimble, otherwise it is unable to properly -/// report assertion failures. -static BOOL (^isFromApple)(id) = ^BOOL(id observer){ - return [[NSBundle bundleForClass:[observer class]].bundleIdentifier containsString:@"com.apple.dt.XCTest"]; -}; - -- (void)qck_suspendObservationForBlock:(void (^)(void))block { - id originalObservers = [[self observers] copy]; - NSMutableArray *suspendedObservers = [NSMutableArray new]; - - for (id observer in originalObservers) { - if (isFromApple(observer)) { - [suspendedObservers addObject:observer]; - - if ([self respondsToSelector:@selector(removeTestObserver:)]) { - [self removeTestObserver:observer]; - } - else if ([[self observers] respondsToSelector:@selector(removeObject:)]) { - [[self observers] removeObject:observer]; - } - else { - NSAssert(NO, @"unexpected type: unable to remove observers: %@", originalObservers); - } - } - } - - @try { - block(); - } - @finally { - for (id observer in suspendedObservers) { - if ([[self observers] respondsToSelector:@selector(addObject:)]) { - [[self observers] addObject:observer]; - } - else if ([self respondsToSelector:@selector(addTestObserver:)]) { - [self addTestObserver:observer]; - } - } - } -} - -@end diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Info.plist b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Info.plist deleted file mode 100644 index 6d32c15..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/QuickConfigurationTests.m b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/QuickConfigurationTests.m deleted file mode 100644 index ace4577..0000000 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/QuickConfigurationTests.m +++ /dev/null @@ -1,12 +0,0 @@ -#import -#import - -@interface QuickConfigurationTests : XCTestCase; @end - -@implementation QuickConfigurationTests - -- (void)testInitThrows { - XCTAssertThrowsSpecificNamed([QuickConfiguration new], NSException, NSInternalInconsistencyException); -} - -@end diff --git a/Carthage/Checkouts/Quick/script/release b/Carthage/Checkouts/Quick/script/release deleted file mode 100755 index 26409c4..0000000 --- a/Carthage/Checkouts/Quick/script/release +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/env sh -REMOTE_BRANCH=master -POD_NAME=Quick -PODSPEC=Quick.podspec - -POD=${COCOAPODS:-pod} - -function help { - echo "Usage: release VERSION RELEASE_NOTES [-f]" - echo - echo "VERSION should be the version to release, should not include the 'v' prefix" - echo "RELEASE_NOTES should be a file that lists all the release notes for this version" - echo " if file does not exist, creates a git-style commit with a diff as a comment" - echo - echo "FLAGS" - echo " -f Forces override of tag" - echo - echo " Example: ./release 1.0.0-rc.2 ./release-notes.txt" - echo - echo "HINT: use 'git diff ...HEAD' to build the release notes" - echo - exit 2 -} - -function die { - echo "[ERROR] $@" - echo - exit 1 -} - -if [ $# -lt 2 ]; then - help -fi - -VERSION=$1 -RELEASE_NOTES=$2 -FORCE_TAG=$3 - -VERSION_TAG="v$VERSION" - -echo "-> Verifying Local Directory for Release" - -if [ -z "`which $POD`" ]; then - die "Cocoapods is required to produce a release. Aborting." -fi -echo " > Cocoapods is installed" - -echo " > Is this a reasonable tag?" - -echo $VERSION_TAG | grep -q "^vv" -if [ $? -eq 0 ]; then - die "This tag ($VERSION) is an incorrect format. You should remove the 'v' prefix." -fi - -echo $VERSION_TAG | grep -q -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" -if [ $? -ne 0 ]; then - die "This tag ($VERSION) is an incorrect format. It should be in 'v{MAJOR}.{MINOR}.{PATCH}(-{PRERELEASE_NAME}.{PRERELEASE_VERSION})' form." -fi - -echo " > Is this version ($VERSION) unique?" -git describe --exact-match "$VERSION_TAG" > /dev/null 2>&1 -if [ $? -eq 0 ]; then - if [ -z "$FORCE_TAG" ]; then - die "This tag ($VERSION) already exists. Aborting. Append '-f' to override" - else - echo " > NO, but force was specified." - fi -else - echo " > Yes, tag is unique" -fi - -if [ ! -f "$RELEASE_NOTES" ]; then - echo " > Failed to find $RELEASE_NOTES. Prompting editor" - RELEASE_NOTES=.release-changes - LATEST_TAG=`git for-each-ref refs/tags --sort=-refname --format="%(refname:short)" | grep -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" | ruby -e 'puts STDIN.read.split("\n").sort { |a,b| Gem::Version.new(a.gsub(/^v/, "")) <=> Gem::Version.new(b.gsub(/^v/, "")) }.last'` - echo " > Latest tag ${LATEST_TAG}" - echo "${POD_NAME} v$VERSION" > $RELEASE_NOTES - echo "================" >> $RELEASE_NOTES - echo >> $RELEASE_NOTES - echo "# Changelog from ${LATEST_TAG}..HEAD" >> $RELEASE_NOTES - git log ${LATEST_TAG}..HEAD | sed -e 's/^/# /' >> $RELEASE_NOTES - $EDITOR $RELEASE_NOTES - diff -q $RELEASE_NOTES ${RELEASE_NOTES}.backup > /dev/null 2>&1 - STATUS=$? - rm ${RELEASE_NOTES}.backup - if [ $STATUS -eq 0 ]; then - rm $RELEASE_NOTES - die "No changes in release notes file. Aborting." - fi -fi -echo " > Release notes: $RELEASE_NOTES" - -if [ ! -f "$PODSPEC" ]; then - die "Cannot find podspec: $PODSPEC. Aborting." -fi -echo " > Podspec exists" - -git config --get user.signingkey > /dev/null || { - echo "[ERROR] No PGP found to sign tag. Aborting." - echo - echo " Creating a release requires signing the tag for security purposes. This allows users to verify the git cloned tree is from a trusted source." - echo " From a security perspective, it is not considered safe to trust the commits (including Author & Signed-off fields). It is easy for any" - echo " intermediate between you and the end-users to modify the git repository." - echo - echo " While not all users may choose to verify the PGP key for tagged releases. It is a good measure to ensure 'this is an official release'" - echo " from the official maintainers." - echo - echo " If you're creating your PGP key for the first time, use RSA with at least 4096 bits." - echo - echo "Related resources:" - echo " - Configuring your system for PGP: https://git-scm.com/book/tr/v2/Git-Tools-Signing-Your-Work" - echo " - Why: http://programmers.stackexchange.com/questions/212192/what-are-the-advantages-and-disadvantages-of-cryptographically-signing-commits-a" - echo - exit 2 -} -echo " > Found PGP key for git" - -# Verify cocoapods trunk ownership -pod trunk me | grep -q "$POD_NAME" || die "You do not have access to pod repository $POD_NAME. Aborting." -echo " > Verified ownership to $POD_NAME pod" - - -echo "--- Releasing version $VERSION (tag: $VERSION_TAG)..." - -function restore_podspec { - if [ -f "${PODSPEC}.backup" ]; then - mv -f ${PODSPEC}{.backup,} - fi -} - -echo "-> Ensuring no differences to origin/$REMOTE_BRANCH" -git fetch origin || die "Failed to fetch origin" -git diff --quiet HEAD "origin/$REMOTE_BRANCH" || die "HEAD is not aligned to origin/$REMOTE_BRANCH. Cannot update version safely" - -echo "-> Setting podspec version" -cat "$PODSPEC" | grep 's.version' | grep -q "\"$VERSION\"" -SET_PODSPEC_VERSION=$? -if [ $SET_PODSPEC_VERSION -eq 0 ]; then - echo " > Podspec already set to $VERSION. Skipping." -else - sed -i.backup "s/s.version *= *\".*\"/s.version = \"$VERSION\"/g" "$PODSPEC" || { - restore_podspec - die "Failed to update version in podspec" - } - - git add ${PODSPEC} || { restore_podspec; die "Failed to add ${PODSPEC} to INDEX"; } - git commit -m "Bumping version to $VERSION" || { restore_podspec; die "Failed to push updated version: $VERSION"; } -fi - -if [ -z "$FORCE_TAG" ]; then - echo "-> Tagging version" - git tag -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin" - git push origin "$VERSION_TAG" || die "Failed to push tag '$VERSION_TAG' to origin" -else - echo "-> Tagging version (force)" - git tag -f -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin (force)" - git push origin "$VERSION_TAG" -f || die "Failed to push tag '$VERSION_TAG' to origin" -fi - -if [ $SET_PODSPEC_VERSION -ne 0 ]; then - rm $RELEASE_NOTES - git push origin "$REMOTE_BRANCH" || die "Failed to push to origin" - echo " > Pushed version to origin" -fi - -echo -echo "Pushing to pod trunk..." - -$POD trunk push "$PODSPEC" - -echo -echo "================ Finalizing the Release ================" -echo -echo " - Opening GitHub to mark this as a release..." -echo " - Paste the contents of $RELEASE_NOTES into the release notes. Tweak for Github styling." -echo " - Announce!" - -open "https://github.com/Quick/Quick/releases/new?tag=$VERSION_TAG" - -rm ${PODSPEC}.backup diff --git a/Carthage/Checkouts/Quick/script/travis-install-linux b/Carthage/Checkouts/Quick/script/travis-install-linux deleted file mode 100755 index 279cd88..0000000 --- a/Carthage/Checkouts/Quick/script/travis-install-linux +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -set -e - -# See: https://github.com/kylef/swiftenv/wiki/Travis-CI -curl -sL https://gist.github.com/kylef/5c0475ff02b7c7671d2a/raw/621ef9b29bbb852fdfd2e10ed147b321d792c1e4/swiftenv-install.sh | bash diff --git a/Carthage/Checkouts/Quick/script/travis-install-macos b/Carthage/Checkouts/Quick/script/travis-install-macos deleted file mode 100755 index 64edf92..0000000 --- a/Carthage/Checkouts/Quick/script/travis-install-macos +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -set -e - -git submodule update --init --recursive diff --git a/Carthage/Checkouts/Quick/script/travis-script-linux b/Carthage/Checkouts/Quick/script/travis-script-linux deleted file mode 100755 index 7a6558d..0000000 --- a/Carthage/Checkouts/Quick/script/travis-script-linux +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh - -. ~/.swiftenv/init -rake test:swiftpm diff --git a/Carthage/Checkouts/Quick/script/travis-script-macos b/Carthage/Checkouts/Quick/script/travis-script-macos deleted file mode 100755 index ac60f1c..0000000 --- a/Carthage/Checkouts/Quick/script/travis-script-macos +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env sh - -if [ "$PODSPEC" ]; then - TASK="podspec:lint" -else - TASK="test:$PLATFORM" -fi - -echo "Executing rake task: $TASK" -rake "$TASK" diff --git a/Carthage/Checkouts/Swinject/.Package.test.swift b/Carthage/Checkouts/Swinject/.Package.test.swift deleted file mode 100644 index e5b2af1..0000000 --- a/Carthage/Checkouts/Swinject/.Package.test.swift +++ /dev/null @@ -1,9 +0,0 @@ -import PackageDescription - -let package = Package( - name: "Swinject", - dependencies: [ - .Package(url: "https://github.com/Quick/Quick", majorVersion: 1, minor: 1), - .Package(url: "https://github.com/Quick/Nimble", majorVersion: 7, minor: 0) - ] -) diff --git a/Carthage/Checkouts/Swinject/.gitignore b/Carthage/Checkouts/Swinject/.gitignore deleted file mode 100644 index f4118b3..0000000 --- a/Carthage/Checkouts/Swinject/.gitignore +++ /dev/null @@ -1,69 +0,0 @@ -# -# https://github.com/github/gitignore/blob/master/Swift.gitignore -# - -## Build generated -build/ -DerivedData - -## Various settings -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata - -## Other -*.xccheckout -*.moved-aside -*.xcuserstate -*.xcscmblueprint - -## Obj-C/Swift specific -*.hmap -*.ipa - -## Playgrounds -timeline.xctimeline -playground.xcworkspace - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -Packages/ -.build/ - -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -Carthage/Checkouts - -Carthage/Build - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md - -fastlane/report.xml -fastlane/screenshots - -## Mac -.DS_Store - -## Swinject -Swinject.framework.zip diff --git a/Carthage/Checkouts/Swinject/.gitmodules b/Carthage/Checkouts/Swinject/.gitmodules deleted file mode 100644 index 8b13789..0000000 --- a/Carthage/Checkouts/Swinject/.gitmodules +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Carthage/Checkouts/Swinject/.hound.yml b/Carthage/Checkouts/Swinject/.hound.yml deleted file mode 100644 index 65fa0c8..0000000 --- a/Carthage/Checkouts/Swinject/.hound.yml +++ /dev/null @@ -1,3 +0,0 @@ -swift: - enabled: true - config_file: .swiftlint.yml diff --git a/Carthage/Checkouts/Swinject/.swift-version b/Carthage/Checkouts/Swinject/.swift-version deleted file mode 100644 index 94ff29c..0000000 --- a/Carthage/Checkouts/Swinject/.swift-version +++ /dev/null @@ -1 +0,0 @@ -3.1.1 diff --git a/Carthage/Checkouts/Swinject/.swiftlint.yml b/Carthage/Checkouts/Swinject/.swiftlint.yml deleted file mode 100644 index dec264a..0000000 --- a/Carthage/Checkouts/Swinject/.swiftlint.yml +++ /dev/null @@ -1,14 +0,0 @@ -disabled_rules: - - force_cast - - type_name -excluded: - - Sources/Container.Arguments.swift - - Sources/SynchronizedResolver.Arguments.swift - - Sources/Resolver.swift - - Sample-iOS.playground - - Carthage - - Packages -variable_name: - min_length: - warning: 1 - error: 1 diff --git a/Carthage/Checkouts/Swinject/.travis.yml b/Carthage/Checkouts/Swinject/.travis.yml deleted file mode 100644 index 36e74f4..0000000 --- a/Carthage/Checkouts/Swinject/.travis.yml +++ /dev/null @@ -1,44 +0,0 @@ -language: objective-c -osx_image: xcode8.3 -env: - global: - - LC_CTYPE=en_US.UTF-8 - - PROJECT=Swinject.xcodeproj -git: - submodules: false -matrix: - include: - - env: JOB="LINUX_SPM" - os: linux - language: generic - sudo: required - dist: trusty - before_install: - - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/9f442512a46d7a2af7b850d65a7e9bd31edfb09b/swiftenv-install.sh)" - script: - - mv .Package.test.swift Package.swift - - swift build - - swift test - - env: JOB="POD_LINT" - script: - - pod lib lint - - env: JOB="XCODE" DEST="OS=8.4,name=iPhone 5" SCHEME="Swinject-iOS" SDK="iphonesimulator" ACTION="test" - - env: JOB="XCODE" DEST="OS=9.3,name=iPhone 6" SCHEME="Swinject-iOS" SDK="iphonesimulator" ACTION="test" - - env: JOB="XCODE" DEST="OS=10.1,name=iPhone 7 Plus" SCHEME="Swinject-iOS" SDK="iphonesimulator" ACTION="test" - - env: JOB="XCODE" DEST="arch=x86_64" SCHEME="Swinject-OSX" SDK="macosx" ACTION="test" - - env: JOB="XCODE" DEST="OS=9.2,name=Apple TV 1080p" SCHEME="Swinject-tvOS" SDK="appletvsimulator" ACTION="test" - - env: JOB="XCODE" DEST="OS=10.0,name=Apple TV 1080p" SCHEME="Swinject-tvOS" SDK="appletvsimulator" ACTION="test" - - env: JOB="XCODE" DEST="OS=2.2,name=Apple Watch - 42mm" SCHEME="Swinject-watchOS" SDK="watchsimulator" ACTION="build" - - env: JOB="XCODE" DEST="OS=3.2,name=Apple Watch - 42mm" SCHEME="Swinject-watchOS" SDK="watchsimulator" ACTION="build" -before_install: - - curl -L -O https://github.com/Carthage/Carthage/releases/download/0.18.1/Carthage.pkg - - sudo installer -pkg Carthage.pkg -target / - - rm Carthage.pkg - - carthage bootstrap --verbose -script: - - set -o pipefail - - open -b com.apple.iphonesimulator # Workaround https://github.com/travis-ci/travis-ci/issues/3040 - - xcodebuild "$ACTION" -project "$PROJECT" -scheme "$SCHEME" -sdk "$SDK" -destination "$DEST" -configuration Release ENABLE_TESTABILITY=YES | xcpretty -notifications: - email: - on_success: never diff --git a/Carthage/Checkouts/Swinject/Assets/SwinjectIcon.sketch b/Carthage/Checkouts/Swinject/Assets/SwinjectIcon.sketch deleted file mode 100644 index e47fd565a53c80eee9e04d69fad4b9c75b46c83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57344 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 NIa%||v;MD-`~zVl;RXNz diff --git a/Carthage/Checkouts/Swinject/CHANGELOG.md b/Carthage/Checkouts/Swinject/CHANGELOG.md deleted file mode 100644 index 37d1ac7..0000000 --- a/Carthage/Checkouts/Swinject/CHANGELOG.md +++ /dev/null @@ -1 +0,0 @@ -Refer to [Release Notes](https://github.com/Swinject/Swinject/releases). \ No newline at end of file diff --git a/Carthage/Checkouts/Swinject/CONTRIBUTING.md b/Carthage/Checkouts/Swinject/CONTRIBUTING.md deleted file mode 100644 index 131384e..0000000 --- a/Carthage/Checkouts/Swinject/CONTRIBUTING.md +++ /dev/null @@ -1,50 +0,0 @@ -# Welcome to Swinject - -Thank you for your interest to Swinject! - -## Reporting Issues - -Nothing is off-limits to submit as an issue. Feel free to submit an issue for a bug, strange behavior, build failure, new feature request or anything you would like to report. - -It is helpful if you include the followings when you submit an issue for a bug: - -- Your Xcode version -- Your Swinject version (or git SHA) -- The steps to reproduce the issue - -If you would like to ask general questions about Swinject, it is preferable to ask at [Stack Overflow](http://stackoverflow.com) because questions there are more discoverable with Google by other people who have the same questions. The author of Swinject monitors `swinject` tag to answer as quickly as possible. - -## Pull Requests - -Pull requests are more appreciated to improve Swinject or to fix problems. Any kind of pull requests are welcome. - -### Getting Started - -Framework dependencies of Swinject are managed with [Carthage](https://github.com/Carthage/Carthage/releases). Make sure you have its latest version installed. The latest installer is available at [the Carthage release page](https://github.com/Carthage/Carthage/releases). - -To setup a Swinject repository in your local Mac, run `git clone` command in Terminal. - -`git clone --recursive git@github.com:Swinject/Swinject.git` - -Move to the Swinject directory. - -`cd Swinject` - -Then run `carthage` command to build the frameworks that Swinject uses. - -`carthage bootstrap` - -Now it is ready to open `Swinject.xcodeproj`. Modify the code, run unit tests, and submit your pull request. - -### Code Style - -Please have a look at [GitHub Swift Style Guide](https://github.com/github/swift-style-guide), which the existing Swinject code tries to follow. If you have a case that is out of scope of the style guide, please try to match the style of the surrounding code. - -If you have [SwiftLint](https://github.com/realm/SwiftLint) installed, some parts of coding style are automatically checked when you build the Swinject project. -The installation of SwiftLint to your environment is optional. [Hound CI](https://houndci.com) triggers SwiftLint to check your pull request. - -### ERB Files - -Some Swift source files are generated from ERB files, e.g. `Resolvable.swift` is generated from `Resolvable.erb`, to easily maintain a set of functions that only differ the number of arguments. The generated source files are located under `GeneratedCode` group in the Xcode project. Do not modify the generated code directly, but instead modify the source ERB code. After modifying the ERB code, run `script/gencode` script to generate the Swift code. - -**Thank you for contributing!** diff --git a/Carthage/Checkouts/Swinject/Cartfile.private b/Carthage/Checkouts/Swinject/Cartfile.private deleted file mode 100644 index 8f0c9e7..0000000 --- a/Carthage/Checkouts/Swinject/Cartfile.private +++ /dev/null @@ -1,2 +0,0 @@ -github "Quick/Quick" ~> 1.1 -github "Quick/Nimble" ~> 7.0 diff --git a/Carthage/Checkouts/Swinject/Cartfile.resolved b/Carthage/Checkouts/Swinject/Cartfile.resolved deleted file mode 100644 index 4a33a6b..0000000 --- a/Carthage/Checkouts/Swinject/Cartfile.resolved +++ /dev/null @@ -1,2 +0,0 @@ -github "Quick/Nimble" "v7.0.1" -github "Quick/Quick" "v1.1.0" diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.gitignore b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.gitignore deleted file mode 100644 index e50906d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -.DS_Store -**/xcuserdata/* -**/*.xccheckout -**/*.xcscmblueprint -build/ -.idea -DerivedData/ -Nimble.framework.zip - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -.build/ diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.swift-version b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.swift-version deleted file mode 100644 index 9f55b2c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.swift-version +++ /dev/null @@ -1 +0,0 @@ -3.0 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.travis.yml b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.travis.yml deleted file mode 100644 index 3e2f896..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -osx_image: xcode8 -language: generic -matrix: - include: - - os: osx - sudo: required - env: TYPE=podspec - - os: osx - env: TYPE=ios NIMBLE_RUNTIME_IOS_SDK_VERSION=10.0 - - os: osx - env: TYPE=tvos NIMBLE_RUNTIME_TVOS_SDK_VERSION=10.0 - - os: osx - env: TYPE=macos - - os: osx - env: TYPE=swiftpm - - os: linux - dist: trusty - sudo: required - env: TYPE=swiftpm - install: - - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/9f442512a46d7a2af7b850d65a7e9bd31edfb09b/swiftenv-install.sh)" -install: - - if [[ "$TYPE" == "podspec" ]]; then sudo gem install bundler; bundle install; fi -script: - - ./test $TYPE diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/CONTRIBUTING.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/CONTRIBUTING.md deleted file mode 100644 index d9c4ba6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/CONTRIBUTING.md +++ /dev/null @@ -1,120 +0,0 @@ - - - -- [Welcome to Nimble!](#welcome-to-nimble!) - - [Reporting Bugs](#reporting-bugs) - - [Building the Project](#building-the-project) - - [Pull Requests](#pull-requests) - - [Style Conventions](#style-conventions) - - [Core Members](#core-members) - - [Code of Conduct](#code-of-conduct) - - - -# Welcome to Nimble! - -We're building a testing framework for a new generation of Swift and -Objective-C developers. - -Nimble should be easy to use and easy to maintain. Let's keep things -simple and well-tested. - -**tl;dr:** If you've added a file to the project, make sure it's -included in both the OS X and iOS targets. - -## Reporting Bugs - -Nothing is off-limits. If you're having a problem, we want to hear about -it. - -- See a crash? File an issue. -- Code isn't compiling, but you don't know why? Sounds like you should - submit a new issue, bud. -- Went to the kitchen, only to forget why you went in the first place? - Better submit an issue. - -Be sure to include in your issue: - -- Your Xcode version (eg - Xcode 7.0.1 7A1001) -- Your version of Nimble (eg - v2.0.0 or git sha `20a3f3b4e63cc8d97c92c4164bf36f2a2c9a6e1b`) -- What are the steps to reproduce this issue? -- What platform are you using? (eg - OS X, iOS, watchOS, tvOS) -- If the problem is on a UI Testing Bundle, Unit Testing Bundle, or some other target configuration -- Are you using carthage or cocoapods? - -## Building the Project - -- Use `Nimble.xcodeproj` to work on Nimble. - -## Running the Swift Package Manager tests - -1. Install `swiftenv` by running a line from the build script (`.travis.yml`): - - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/02090c7ede5a637b76e6df1710e83cd0bbe7dcdf/swiftenv-install.sh)" - -2. Run `./test swiftpm` - -## Pull Requests - -- Nothing is trivial. Submit pull requests for anything: typos, - whitespace, you name it. -- Not all pull requests will be merged, but all will be acknowledged. If - no one has provided feedback on your request, ping one of the owners - by name. -- Make sure your pull request includes any necessary updates to the - README or other documentation. -- Be sure the unit tests for both the OS X and iOS targets of Nimble - before submitting your pull request. You can run all the OS X & iOS unit - tests using `./test`. -- If you've added a file to the project, make sure it's included in both - the OS X and iOS targets. -- The `master` branch will always support the stable Xcode version. Other - branches will point to their corresponding versions they support. -- If you're making a configuration change, make sure to edit both the xcode - project and the podspec file. - -### Style Conventions - -- Indent using 4 spaces. -- Keep lines 100 characters or shorter. Break long statements into - shorter ones over multiple lines. -- In Objective-C, use `#pragma mark -` to mark public, internal, - protocol, and superclass methods. - -## Core Members - -If a few of your pull requests have been merged, and you'd like a -controlling stake in the project, file an issue asking for write access -to the repository. - -### Code of Conduct - -Your conduct as a core member is your own responsibility, but here are -some "ground rules": - -- Feel free to push whatever you want to master, and (if you have - ownership permissions) to create any repositories you'd like. - - Ideally, however, all changes should be submitted as GitHub pull - requests. No one should merge their own pull request, unless no - other core members respond for at least a few days. - - If you'd like to create a new repository, it'd be nice if you created - a GitHub issue and gathered some feedback first. - -- It'd be awesome if you could review, provide feedback on, and close - issues or pull requests submitted to the project. Please provide kind, - constructive feedback. Please don't be sarcastic or snarky. - -### Creating a Release - -The process is relatively straight forward, but here's is a useful checklist for tagging: - -- Look at changes from the previously tagged release and write release notes: `git log v0.4.0...HEAD` -- Run the release script: `./script/release A.B.C release-notes-file` -- The script will prompt you to create a new [GitHub release](https://github.com/Quick/Nimble/releases). - - Use the same release notes you created for the tag, but tweak up formatting for GitHub. -- Update [Quick](https://github.com/Quick/Quick) - - Update Quick's submodule reference to the newly released Nimble version - - Update Nimble version in `README.md` and Documentation in [Quick](https://github.com/Quick/Quick) if it's not a patch version update. -- Announce! diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Gemfile b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Gemfile deleted file mode 100644 index a6dc312..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -# A sample Gemfile -source "https://rubygems.org" - -gem 'cocoapods', '1.1.0.rc.3' diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Gemfile.lock b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Gemfile.lock deleted file mode 100644 index 87dc02b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Gemfile.lock +++ /dev/null @@ -1,69 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (4.2.7.1) - i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - claide (1.0.1) - cocoapods (1.1.0.rc.3) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.1, < 2.0) - cocoapods-core (= 1.1.0.rc.3) - cocoapods-deintegrate (>= 1.0.1, < 2.0) - cocoapods-downloader (>= 1.1.1, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (= 1.1.0.beta.1) - cocoapods-try (>= 1.1.0, < 2.0) - colored (~> 1.2) - escape (~> 0.0.4) - fourflusher (~> 2.0) - gh_inspector (~> 1.0) - molinillo (~> 0.5.1) - nap (~> 1.0) - xcodeproj (>= 1.3.2, < 2.0) - cocoapods-core (1.1.0.rc.3) - activesupport (>= 4.0.2, < 5) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.1) - cocoapods-downloader (1.1.1) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.0.0) - cocoapods-trunk (1.1.0.beta.1) - nap (>= 0.8, < 2.0) - netrc (= 0.7.8) - cocoapods-try (1.1.0) - colored (1.2) - escape (0.0.4) - fourflusher (2.0.1) - fuzzy_match (2.0.4) - gh_inspector (1.0.2) - i18n (0.7.0) - json (1.8.3) - minitest (5.9.1) - molinillo (0.5.1) - nap (1.1.0) - netrc (0.7.8) - thread_safe (0.3.5) - tzinfo (1.2.2) - thread_safe (~> 0.1) - xcodeproj (1.3.2) - activesupport (>= 3) - claide (>= 1.0.1, < 2.0) - colored (~> 1.2) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods (= 1.1.0.rc.3) - -BUNDLED WITH - 1.13.1 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/LICENSE.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/LICENSE.md deleted file mode 100644 index 0f3eb71..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/LICENSE.md +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014 Quick Team - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.podspec b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.podspec deleted file mode 100644 index 8ca36a1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.podspec +++ /dev/null @@ -1,47 +0,0 @@ -Pod::Spec.new do |s| - s.name = "Nimble" - s.version = "5.1.1" - s.summary = "A Matcher Framework for Swift and Objective-C" - s.description = <<-DESC - Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by Cedar. - DESC - s.homepage = "https://github.com/Quick/Nimble" - s.license = { :type => "Apache 2.0", :file => "LICENSE.md" } - s.author = "Quick Contributors" - s.ios.deployment_target = "8.0" - s.osx.deployment_target = "10.10" - s.tvos.deployment_target = "9.0" - s.source = { :git => "https://github.com/Quick/Nimble.git", - :tag => "v#{s.version}" } - - s.source_files = "Sources/**/*.{swift,h,m,c}" - - s.osx.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift", - ] - s.ios.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift", - ] - s.tvos.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.{h,c}", - "Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift", - "Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.m", - ] - - s.private_header_files = "Sources/NimbleObjectiveC/CurrentTestCaseTracker.h" - s.tvos.private_header_files = "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h" - - s.exclude_files = "Sources/Nimble/Adapters/NonObjectiveC/*.swift" - s.weak_framework = "XCTest" - s.requires_arc = true - s.compiler_flags = '-DPRODUCT_NAME=Nimble/Nimble' - s.pod_target_xcconfig = { - 'ENABLE_BITCODE' => 'NO', - 'OTHER_LDFLAGS' => '-weak-lswiftXCTest', - 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks"', - } -end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.pbxproj b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.pbxproj deleted file mode 100644 index 7c2c084..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2102 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1F0648CC19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F0648CD19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F0648D41963AAB2001F9C46 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F0648D51963AAB2001F9C46 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F14FB64194180C5009F2A08 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F1871C51CA89EDB00A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871C61CA89EDB00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871C71CA89EDB00A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871C81CA89EDB00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871C91CA89EDB00A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871CA1CA89EDB00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871CB1CA89EDB00A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871CC1CA89EDB00A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871D21CA89EEE00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871D31CA89EEE00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871D41CA89EEE00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871D61CA89EEF00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871D71CA89EEF00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871D81CA89EEF00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871D91CA89EF100A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871DA1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871DB1CA89EF100A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871DC1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871DD1CA89EF500A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871DE1CA89EF500A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871DF1CA89EF500A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E01CA89EF600A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E11CA89EF600A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E21CA89EF600A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E41CA89FB600A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E61CA89FCD00A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1871E71CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E81CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E91CA8A18700A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1871EB1CA8A18800A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1A742F1940169200FFFC47 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1A74351940169200FFFC47 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F1A74291940169200FFFC47 /* Nimble.framework */; }; - 1F1B5AD41963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F299EAC19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F2D175B1DB618ED00EE9C7A /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0261C6D0BB0000693EE /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F2D175C1DB618F000EE9C7A /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0221C6D0B82000693EE /* mach_excServer.c */; }; - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F43728C1A1B343C00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F43728E1A1B343F00EB80F8 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F43728F1A1B344000EB80F8 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F4999A61DBF2DD100BF8877 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F4A56661A3B305F009E1637 /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - 1F4A56671A3B305F009E1637 /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - 1F4A566A1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - 1F4A566B1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - 1F4A566D1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - 1F4A566E1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - 1F4A56701A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - 1F4A56711A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - 1F4A56731A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - 1F4A56741A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - 1F4A56761A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - 1F4A56771A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - 1F4A56791A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - 1F4A567A1A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - 1F4A567C1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - 1F4A567D1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - 1F4A567F1A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - 1F4A56801A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - 1F4A56821A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - 1F4A56831A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - 1F4A56851A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - 1F4A56861A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - 1F4A56881A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - 1F4A56891A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - 1F4A568B1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - 1F4A568C1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - 1F4A568E1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - 1F4A568F1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - 1F4A56911A3B344A009E1637 /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - 1F4A56921A3B344A009E1637 /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - 1F4A56941A3B346F009E1637 /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - 1F4A56951A3B346F009E1637 /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - 1F4A56971A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - 1F4A56981A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - 1F4A569A1A3B3539009E1637 /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - 1F4A569B1A3B3539009E1637 /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - 1F4A569D1A3B3565009E1637 /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - 1F4A569E1A3B3565009E1637 /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - 1F4A56A01A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - 1F4A56A11A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - 1F4BB8A41DAC9DC90048464B /* CwlCatchBadInstructionPOSIX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB89D1DAC9D930048464B /* CwlCatchBadInstructionPOSIX.swift */; }; - 1F4BB8AB1DAC9DE50048464B /* CwlCatchBadInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F4BB8AE1DAC9DED0048464B /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0161C6D0B2F000693EE /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F4BB8B61DACA0E30048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8B71DACA0E40048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8B81DACAACF0048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8BA1DACBFCF0048464B /* CwlCatchBadInstruction.m in Sources */ = {isa = PBXBuildFile; fileRef = 9630C00B1C6D0B18000693EE /* CwlCatchBadInstruction.m */; }; - 1F4BB8BB1DACBFD00048464B /* CwlCatchBadInstruction.m in Sources */ = {isa = PBXBuildFile; fileRef = 9630C00B1C6D0B18000693EE /* CwlCatchBadInstruction.m */; }; - 1F5DF15F1BDCA0CE00C3A531 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */; }; - 1F5DF16C1BDCA0F500C3A531 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1F5DF16D1BDCA0F500C3A531 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1F5DF16E1BDCA0F500C3A531 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1F5DF16F1BDCA0F500C3A531 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1F5DF1701BDCA0F500C3A531 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1F5DF1711BDCA0F500C3A531 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - 1F5DF1721BDCA0F500C3A531 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1F5DF1741BDCA0F500C3A531 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1F5DF1751BDCA0F500C3A531 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1F5DF1761BDCA0F500C3A531 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - 1F5DF1771BDCA0F500C3A531 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1F5DF1781BDCA0F500C3A531 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1F5DF1791BDCA0F500C3A531 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1F5DF17A1BDCA0F500C3A531 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1F5DF17B1BDCA0F500C3A531 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1F5DF17C1BDCA0F500C3A531 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1F5DF17D1BDCA0F500C3A531 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1F5DF17E1BDCA0F500C3A531 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1F5DF17F1BDCA0F500C3A531 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1F5DF1801BDCA0F500C3A531 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1F5DF1811BDCA0F500C3A531 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1F5DF1821BDCA0F500C3A531 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1F5DF1831BDCA0F500C3A531 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1F5DF1841BDCA0F500C3A531 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1F5DF1851BDCA0F500C3A531 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1F5DF1861BDCA0F500C3A531 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - 1F5DF1881BDCA0F500C3A531 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - 1F5DF1891BDCA0F500C3A531 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F5DF18C1BDCA0F500C3A531 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F5DF18E1BDCA0F500C3A531 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F5DF1921BDCA10200C3A531 /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F5DF1931BDCA10200C3A531 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F5DF1941BDCA10200C3A531 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - 1F5DF1951BDCA10200C3A531 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F5DF1961BDCA10200C3A531 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F5DF1971BDCA10200C3A531 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - 1F5DF1981BDCA10200C3A531 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F5DF1991BDCA10200C3A531 /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F5DF19A1BDCA10200C3A531 /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F5DF19B1BDCA10200C3A531 /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F5DF19C1BDCA10200C3A531 /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F5DF19D1BDCA10200C3A531 /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F5DF19E1BDCA10200C3A531 /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F5DF19F1BDCA10200C3A531 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - 1F5DF1A01BDCA10200C3A531 /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1F5DF1A11BDCA10200C3A531 /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F5DF1A21BDCA10200C3A531 /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F5DF1A31BDCA10200C3A531 /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F5DF1A41BDCA10200C3A531 /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F5DF1A51BDCA10200C3A531 /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F5DF1A61BDCA10200C3A531 /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F5DF1A71BDCA10200C3A531 /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F5DF1A81BDCA10200C3A531 /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 1F5DF1A91BDCA10200C3A531 /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - 1F5DF1AA1BDCA10200C3A531 /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F5DF1AB1BDCA10200C3A531 /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 1F8A37B01B7C5042001C8357 /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - 1F8A37B11B7C5042001C8357 /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - 1F91DD2D1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD2E1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD2F1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD311C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F91DD321C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F91DD331C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F925EB8195C0D6300ED456B /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F925EAD195C0D6300ED456B /* Nimble.framework */; }; - 1F925EC7195C0DD100ED456B /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F925EE2195C0DFD00ED456B /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F925EE6195C121200ED456B /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F925EE7195C121200ED456B /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F925EE9195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F925EEA195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F925EEC195C12C800ED456B /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F925EED195C12C800ED456B /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F925EEF195C136500ED456B /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F925EF0195C136500ED456B /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F925EF6195C147800ED456B /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F925EF7195C147800ED456B /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F925EF9195C175000ED456B /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F925EFA195C175000ED456B /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F925EFC195C186800ED456B /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F925EFD195C186800ED456B /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F925EFF195C187600ED456B /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F925F00195C187600ED456B /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F925F02195C189500ED456B /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F925F03195C189500ED456B /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F925F05195C18B700ED456B /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F925F06195C18B700ED456B /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F925F08195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F925F09195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F925F0B195C18E100ED456B /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F925F0C195C18E100ED456B /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F925F0E195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F925F0F195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F925F11195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F925F12195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F9DB8FB1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - 1F9DB8FC1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - 1FB90098195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1FB90099195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1FC494AA1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FC494AB1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FC494AC1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FCF914F1C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91501C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91511C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FCF91551C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1FD8CD2F1968AB07008ED995 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1FD8CD301968AB07008ED995 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1FD8CD311968AB07008ED995 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1FD8CD321968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1FD8CD331968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1FD8CD341968AB07008ED995 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1FD8CD351968AB07008ED995 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1FD8CD361968AB07008ED995 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1FD8CD371968AB07008ED995 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1FD8CD381968AB07008ED995 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1FD8CD391968AB07008ED995 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1FD8CD3A1968AB07008ED995 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1FD8CD3B1968AB07008ED995 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1FD8CD3C1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1FD8CD3D1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1FD8CD3E1968AB07008ED995 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1FD8CD3F1968AB07008ED995 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1FD8CD401968AB07008ED995 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1FD8CD411968AB07008ED995 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1FD8CD421968AB07008ED995 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1FD8CD431968AB07008ED995 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1FD8CD441968AB07008ED995 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1FD8CD451968AB07008ED995 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1FD8CD461968AB07008ED995 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1FD8CD471968AB07008ED995 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1FD8CD481968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1FD8CD491968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1FD8CD4A1968AB07008ED995 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1FD8CD4B1968AB07008ED995 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1FD8CD4C1968AB07008ED995 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1FD8CD4D1968AB07008ED995 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1FD8CD4E1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1FD8CD4F1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1FD8CD501968AB07008ED995 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1FD8CD511968AB07008ED995 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1FD8CD521968AB07008ED995 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1FD8CD531968AB07008ED995 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1FD8CD561968AB07008ED995 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1FD8CD571968AB07008ED995 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1FD8CD581968AB07008ED995 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1FD8CD591968AB07008ED995 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1FD8CD5A1968AB07008ED995 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1FD8CD5B1968AB07008ED995 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1FD8CD5C1968AB07008ED995 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - 1FD8CD5D1968AB07008ED995 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - 1FD8CD5E1968AB07008ED995 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1FD8CD5F1968AB07008ED995 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1FD8CD6A1968AB07008ED995 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1FD8CD6B1968AB07008ED995 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1FDBD8671AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1FDBD8681AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 29EA59631B551ED2002D767E /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 29EA59641B551ED2002D767E /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 472FD1351B9E085700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 472FD1391B9E0A9700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 472FD13A1B9E0A9F00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 472FD13B1B9E0CFE00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 4793854D1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - 4793854E1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - 6CAEDD0A1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 6CAEDD0B1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 6CAEDD0C1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 7B5358BA1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BB1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BC1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BE1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 7B5358BF1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 7B5358C01C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 9630C00D1C6D0B18000693EE /* CwlCatchBadInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C00E1C6D0B18000693EE /* CwlCatchBadInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C0131C6D0B18000693EE /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C00C1C6D0B18000693EE /* CwlCatchBadInstruction.swift */; }; - 9630C0141C6D0B18000693EE /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C00C1C6D0B18000693EE /* CwlCatchBadInstruction.swift */; }; - 9630C0191C6D0B2F000693EE /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0161C6D0B2F000693EE /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C01A1C6D0B2F000693EE /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0161C6D0B2F000693EE /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C01C1C6D0B2F000693EE /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0171C6D0B2F000693EE /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 9630C01D1C6D0B2F000693EE /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0171C6D0B2F000693EE /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 9630C01F1C6D0B2F000693EE /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0181C6D0B2F000693EE /* CwlCatchException.swift */; }; - 9630C0201C6D0B2F000693EE /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0181C6D0B2F000693EE /* CwlCatchException.swift */; }; - 9630C0231C6D0B82000693EE /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0221C6D0B82000693EE /* mach_excServer.c */; }; - 9630C0271C6D0BB0000693EE /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0261C6D0BB0000693EE /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C02C1C6D125F000693EE /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C02B1C6D125F000693EE /* CwlBadInstructionException.swift */; }; - 9630C02D1C6D125F000693EE /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C02B1C6D125F000693EE /* CwlBadInstructionException.swift */; }; - 9630C0301C6D139F000693EE /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C02F1C6D139F000693EE /* CwlDarwinDefinitions.swift */; }; - 9630C0311C6D139F000693EE /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C02F1C6D139F000693EE /* CwlDarwinDefinitions.swift */; }; - 964CFEFD1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 964CFEFE1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 964CFEFF1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 965B0D091B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - 965B0D0A1B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - 965B0D0C1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - 965B0D0D1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - AE4BA9AD1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE4BA9AE1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE4BA9AF1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE7ADE451C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE461C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE471C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE491C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - AE7ADE4A1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - AE7ADE4B1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - CD79C9A01D2CC839004B6F9A /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - CD79C9A11D2CC83B004B6F9A /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - CD79C9A21D2CC83E004B6F9A /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - CD79C9A31D2CC841004B6F9A /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - CD79C9A41D2CC848004B6F9A /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - CD79C9A51D2CC848004B6F9A /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - CD79C9A61D2CC848004B6F9A /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - CD79C9A71D2CC848004B6F9A /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - CD79C9A81D2CC848004B6F9A /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - CD79C9A91D2CC848004B6F9A /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - CD79C9AA1D2CC848004B6F9A /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - CD79C9AB1D2CC848004B6F9A /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - CD79C9AC1D2CC848004B6F9A /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - CD79C9AD1D2CC848004B6F9A /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - CD79C9AE1D2CC848004B6F9A /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - CD79C9AF1D2CC848004B6F9A /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - CD79C9B01D2CC848004B6F9A /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - CD79C9B11D2CC848004B6F9A /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - CD79C9B21D2CC848004B6F9A /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - CD79C9B31D2CC848004B6F9A /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - CD79C9B41D2CC848004B6F9A /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - CD79C9B51D2CC848004B6F9A /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - CD79C9B61D2CC848004B6F9A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - CD79C9B71D2CC848004B6F9A /* ObjCSatisfyAnyOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */; }; - DA9E8C821A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - DA9E8C831A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - DD72EC641A93874A002F7651 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - DD72EC651A93874A002F7651 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - DD9A9A8F19CF439B00706F49 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - DD9A9A9019CF43AD00706F49 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - DDB1BC791A92235600F743C3 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - DDB1BC7A1A92235600F743C3 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - DDB4D5ED19FE43C200E9D9FE /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - DDB4D5F019FE442800E9D9FE /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - DDB4D5F119FE442800E9D9FE /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - DDEFAEB41A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - DDEFAEB51A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - F8A1BE2F1CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; - F8A1BE301CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; - F8A1BE311CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1F1A74361940169200FFFC47 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = "Nimble-iOS"; - }; - 1F5DF1601BDCA0CE00C3A531 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F5DF1541BDCA0CE00C3A531; - remoteInfo = "Nimble-tvOS"; - }; - 1F6BB82A1968BFF9009F1DBB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = "Nimble-iOS"; - }; - 1F925EA4195C0C8500ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = Nimble; - }; - 1F925EA6195C0C8500ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = Nimble; - }; - 1F925EB9195C0D6300ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-OSX"; - }; - 1F9B7BFD1968AD760094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-OSX"; - }; - 1F9B7BFF1968AD760094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-OSX"; - }; - 1F9B7C011968AD820094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-OSX"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectWithLazyProperty.swift; sourceTree = ""; }; - 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronousTests.swift; sourceTree = ""; }; - 1F14FB63194180C5009F2A08 /* utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = utils.swift; sourceTree = ""; }; - 1F1871BC1CA89EDB00A34BF2 /* DSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DSL.h; sourceTree = ""; }; - 1F1871BD1CA89EDB00A34BF2 /* DSL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DSL.m; sourceTree = ""; }; - 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMBExceptionCapture.h; sourceTree = ""; }; - 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NMBExceptionCapture.m; sourceTree = ""; }; - 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMBStringify.h; sourceTree = ""; }; - 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NMBStringify.m; sourceTree = ""; }; - 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NMBExpectation.swift; sourceTree = ""; }; - 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NMBObjCMatcher.swift; sourceTree = ""; }; - 1F1871CD1CA89EE000A34BF2 /* ExceptionCapture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExceptionCapture.swift; sourceTree = ""; }; - 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncMatcherWrapper.swift; sourceTree = ""; }; - 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherFunc.swift; sourceTree = ""; }; - 1F1A74291940169200FFFC47 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F1A742D1940169200FFFC47 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F1A742E1940169200FFFC47 /* Nimble.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Nimble.h; sourceTree = ""; }; - 1F1A74341940169200FFFC47 /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F1A743A1940169200FFFC47 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAKindOfTest.swift; sourceTree = ""; }; - 1F2752D119445B8400052A26 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; lineEnding = 0; path = README.md; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.markdown; }; - 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeEmptyTest.swift; sourceTree = ""; }; - 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCAsyncTest.m; sourceTree = ""; }; - 1F4A56681A3B3074009E1637 /* NimbleSpecHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NimbleSpecHelper.h; sourceTree = ""; }; - 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeAnInstanceOfTest.m; sourceTree = ""; }; - 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeKindOfTest.m; sourceTree = ""; }; - 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeCloseToTest.m; sourceTree = ""; }; - 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeginWithTest.m; sourceTree = ""; }; - 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeGreaterThanTest.m; sourceTree = ""; }; - 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeGreaterThanOrEqualToTest.m; sourceTree = ""; }; - 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeIdenticalToTest.m; sourceTree = ""; }; - 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeLessThanTest.m; sourceTree = ""; }; - 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeLessThanOrEqualToTest.m; sourceTree = ""; }; - 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeTruthyTest.m; sourceTree = ""; }; - 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeFalsyTest.m; sourceTree = ""; }; - 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeTrueTest.m; sourceTree = ""; }; - 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeFalseTest.m; sourceTree = ""; }; - 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeNilTest.m; sourceTree = ""; }; - 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCContainTest.m; sourceTree = ""; }; - 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCEndWithTest.m; sourceTree = ""; }; - 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCEqualTest.m; sourceTree = ""; }; - 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCMatchTest.m; sourceTree = ""; }; - 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCRaiseExceptionTest.m; sourceTree = ""; }; - 1F4BB89D1DAC9D930048464B /* CwlCatchBadInstructionPOSIX.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstructionPOSIX.swift; path = CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift; sourceTree = ""; }; - 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowAssertionTest.swift; sourceTree = ""; }; - 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCSyncTest.m; sourceTree = ""; }; - 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeVoidTest.swift; sourceTree = ""; }; - 1F91DD301C74BF61002C309F /* BeVoid.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeVoid.swift; sourceTree = ""; }; - 1F925EAD195C0D6300ED456B /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F925EE5195C121200ED456B /* AsynchronousTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsynchronousTest.swift; sourceTree = ""; }; - 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAnInstanceOfTest.swift; sourceTree = ""; }; - 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RaisesExceptionTest.swift; sourceTree = ""; }; - 1F925EEE195C136500ED456B /* BeLogicalTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLogicalTest.swift; sourceTree = ""; }; - 1F925EF5195C147800ED456B /* BeCloseToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeCloseToTest.swift; sourceTree = ""; }; - 1F925EF8195C175000ED456B /* BeNilTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeNilTest.swift; sourceTree = ""; }; - 1F925EFB195C186800ED456B /* BeginWithTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeginWithTest.swift; sourceTree = ""; }; - 1F925EFE195C187600ED456B /* EndWithTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndWithTest.swift; sourceTree = ""; }; - 1F925F01195C189500ED456B /* ContainTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainTest.swift; sourceTree = ""; }; - 1F925F04195C18B700ED456B /* EqualTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EqualTest.swift; sourceTree = ""; }; - 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThanTest.swift; sourceTree = ""; }; - 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThanTest.swift; sourceTree = ""; }; - 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThanOrEqualToTest.swift; sourceTree = ""; }; - 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThanOrEqualToTest.swift; sourceTree = ""; }; - 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeEmptyTest.m; sourceTree = ""; }; - 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeIdenticalToTest.swift; sourceTree = ""; }; - 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleEnvironment.swift; sourceTree = ""; }; - 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostNotificationTest.swift; sourceTree = ""; }; - 1FCF91521C61C8A400B15DCB /* PostNotification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostNotification.swift; sourceTree = ""; }; - 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionRecorder.swift; sourceTree = ""; }; - 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdapterProtocols.swift; sourceTree = ""; }; - 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleXCTestHandler.swift; sourceTree = ""; }; - 1FD8CD081968AB07008ED995 /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSL.swift; sourceTree = ""; }; - 1FD8CD091968AB07008ED995 /* Expectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expectation.swift; sourceTree = ""; }; - 1FD8CD0A1968AB07008ED995 /* Expression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expression.swift; sourceTree = ""; }; - 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FailureMessage.swift; sourceTree = ""; }; - 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAnInstanceOf.swift; sourceTree = ""; }; - 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeAKindOf.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeCloseTo.swift; sourceTree = ""; }; - 1FD8CD101968AB07008ED995 /* BeEmpty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeEmpty.swift; sourceTree = ""; }; - 1FD8CD111968AB07008ED995 /* BeginWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeginWith.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeGreaterThan.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeGreaterThanOrEqualTo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeIdenticalTo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD151968AB07008ED995 /* BeLessThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLessThan.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLessThanOrEqual.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD171968AB07008ED995 /* BeLogical.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLogical.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD181968AB07008ED995 /* BeNil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeNil.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD1A1968AB07008ED995 /* Contain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Contain.swift; sourceTree = ""; }; - 1FD8CD1B1968AB07008ED995 /* EndWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndWith.swift; sourceTree = ""; }; - 1FD8CD1C1968AB07008ED995 /* Equal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Equal.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherProtocols.swift; sourceTree = ""; }; - 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RaisesException.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD251968AB07008ED995 /* Functional.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Functional.swift; sourceTree = ""; }; - 1FD8CD261968AB07008ED995 /* Async.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Async.swift; sourceTree = ""; }; - 1FD8CD271968AB07008ED995 /* SourceLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SourceLocation.swift; sourceTree = ""; }; - 1FD8CD281968AB07008ED995 /* Stringers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stringers.swift; sourceTree = ""; }; - 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionDispatcher.swift; sourceTree = ""; }; - 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowErrorTest.swift; sourceTree = ""; }; - 29EA59651B551EE6002D767E /* ThrowError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowError.swift; sourceTree = ""; }; - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestCaseProvider.swift; sourceTree = ""; }; - 472FD1341B9E085700C7B8DA /* HaveCount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCount.swift; sourceTree = ""; }; - 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCountTest.swift; sourceTree = ""; }; - 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCHaveCount.m; sourceTree = ""; }; - 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinuxSupport.swift; sourceTree = ""; }; - 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SatisfyAnyOfTest.swift; sourceTree = ""; }; - 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SatisfyAnyOf.swift; sourceTree = ""; }; - 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCSatisfyAnyOfTest.m; sourceTree = ""; }; - 8DF1C3F61C94FC75004B2D36 /* ObjcStringersTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjcStringersTest.m; sourceTree = ""; }; - 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CwlCatchBadInstruction.h; path = CwlPreconditionTesting/CwlCatchBadInstruction.h; sourceTree = ""; }; - 9630C00B1C6D0B18000693EE /* CwlCatchBadInstruction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CwlCatchBadInstruction.m; path = CwlPreconditionTesting/CwlCatchBadInstruction.m; sourceTree = ""; }; - 9630C00C1C6D0B18000693EE /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = ""; }; - 9630C0161C6D0B2F000693EE /* CwlCatchException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CwlCatchException.h; path = CwlCatchException/CwlCatchException/CwlCatchException.h; sourceTree = ""; }; - 9630C0171C6D0B2F000693EE /* CwlCatchException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = CwlCatchException/CwlCatchException/CwlCatchException.m; sourceTree = ""; }; - 9630C0181C6D0B2F000693EE /* CwlCatchException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlCatchException.swift; path = CwlCatchException/CwlCatchException/CwlCatchException.swift; sourceTree = ""; }; - 9630C0221C6D0B82000693EE /* mach_excServer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mach_excServer.c; path = CwlPreconditionTesting/mach_excServer.c; sourceTree = ""; }; - 9630C0261C6D0BB0000693EE /* mach_excServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = CwlPreconditionTesting/mach_excServer.h; sourceTree = ""; }; - 9630C02B1C6D125F000693EE /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; - 9630C02F1C6D139F000693EE /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; - 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowAssertion.swift; sourceTree = ""; }; - 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCUserDescriptionTest.m; sourceTree = ""; }; - 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDescriptionTest.swift; sourceTree = ""; }; - AE4BA9AC1C88DDB500B73906 /* Errors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = ""; }; - AE7ADE441C80BF8000B94CD3 /* MatchError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchError.swift; sourceTree = ""; }; - AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchErrorTest.swift; sourceTree = ""; }; - DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DSL+Wait.swift"; sourceTree = ""; }; - DD72EC631A93874A002F7651 /* AllPassTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllPassTest.swift; sourceTree = ""; }; - DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeIdenticalToObjectTest.swift; sourceTree = ""; }; - DDB1BC781A92235600F743C3 /* AllPass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllPass.swift; sourceTree = ""; }; - DDB4D5EC19FE43C200E9D9FE /* Match.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Match.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchTest.swift; sourceTree = ""; }; - DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCAllPassTest.m; sourceTree = ""; }; - F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCTestObservationCenter+Register.m"; sourceTree = ""; }; - F8A1BE321CB3777F00031679 /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CurrentTestCaseTracker.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1F1A74251940169200FFFC47 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74311940169200FFFC47 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F1A74351940169200FFFC47 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1511BDCA0CE00C3A531 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15B1BDCA0CE00C3A531 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F5DF15F1BDCA0CE00C3A531 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EA9195C0D6300ED456B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB4195C0D6300ED456B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F925EB8195C0D6300ED456B /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1F14FB61194180A7009F2A08 /* Helpers */ = { - isa = PBXGroup; - children = ( - 1F14FB63194180C5009F2A08 /* utils.swift */, - 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */, - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 1F1871B91CA89E1B00A34BF2 /* NimbleObjectiveC */ = { - isa = PBXGroup; - children = ( - F8A1BE321CB3777F00031679 /* CurrentTestCaseTracker.h */, - 1F1871BC1CA89EDB00A34BF2 /* DSL.h */, - 1F1871BD1CA89EDB00A34BF2 /* DSL.m */, - 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */, - 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */, - 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */, - 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */, - F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */, - ); - name = NimbleObjectiveC; - path = Sources/NimbleObjectiveC; - sourceTree = ""; - }; - 1F1871BA1CA89E2500A34BF2 /* NonObjectiveC */ = { - isa = PBXGroup; - children = ( - 1F1871CD1CA89EE000A34BF2 /* ExceptionCapture.swift */, - ); - path = NonObjectiveC; - sourceTree = ""; - }; - 1F1A741F1940169200FFFC47 = { - isa = PBXGroup; - children = ( - 1F2752D119445B8400052A26 /* README.md */, - 1F1A742B1940169200FFFC47 /* Nimble */, - 1F1871B91CA89E1B00A34BF2 /* NimbleObjectiveC */, - 1F1A74381940169200FFFC47 /* NimbleTests */, - 9630C0081C6D0AB3000693EE /* Lib */, - 1F1A742A1940169200FFFC47 /* Products */, - ); - indentWidth = 4; - sourceTree = ""; - tabWidth = 4; - usesTabs = 0; - }; - 1F1A742A1940169200FFFC47 /* Products */ = { - isa = PBXGroup; - children = ( - 1F1A74291940169200FFFC47 /* Nimble.framework */, - 1F1A74341940169200FFFC47 /* NimbleTests.xctest */, - 1F925EAD195C0D6300ED456B /* Nimble.framework */, - 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */, - 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */, - 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 1F1A742B1940169200FFFC47 /* Nimble */ = { - isa = PBXGroup; - children = ( - 1FD8CD041968AB07008ED995 /* Adapters */, - 1FD8CD081968AB07008ED995 /* DSL.swift */, - DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */, - 1FD8CD091968AB07008ED995 /* Expectation.swift */, - 1FD8CD0A1968AB07008ED995 /* Expression.swift */, - 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */, - 1F1A742D1940169200FFFC47 /* Info.plist */, - 1FD8CD0C1968AB07008ED995 /* Matchers */, - 1F1A742E1940169200FFFC47 /* Nimble.h */, - 1FD8CD241968AB07008ED995 /* Utils */, - ); - name = Nimble; - path = Sources/Nimble; - sourceTree = ""; - }; - 1F1A74381940169200FFFC47 /* NimbleTests */ = { - isa = PBXGroup; - children = ( - 1F925EE5195C121200ED456B /* AsynchronousTest.swift */, - 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */, - 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */, - 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */, - 1FFD729A1963FC8200CD29A2 /* objc */, - 1F14FB61194180A7009F2A08 /* Helpers */, - 1F925EE3195C11B000ED456B /* Matchers */, - 1F1A74391940169200FFFC47 /* Supporting Files */, - ); - name = NimbleTests; - path = Tests/NimbleTests; - sourceTree = ""; - }; - 1F1A74391940169200FFFC47 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 1F1A743A1940169200FFFC47 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 1F925EE3195C11B000ED456B /* Matchers */ = { - isa = PBXGroup; - children = ( - DD72EC631A93874A002F7651 /* AllPassTest.swift */, - 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */, - 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */, - 1F925EF5195C147800ED456B /* BeCloseToTest.swift */, - 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */, - 1F925EFB195C186800ED456B /* BeginWithTest.swift */, - 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */, - 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */, - DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */, - 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */, - 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */, - 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */, - 1F925EEE195C136500ED456B /* BeLogicalTest.swift */, - 1F925EF8195C175000ED456B /* BeNilTest.swift */, - 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */, - 1F925F01195C189500ED456B /* ContainTest.swift */, - 1F925EFE195C187600ED456B /* EndWithTest.swift */, - 1F925F04195C18B700ED456B /* EqualTest.swift */, - 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */, - DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */, - 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */, - 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */, - 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */, - 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */, - AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */, - 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */, - ); - path = Matchers; - sourceTree = ""; - }; - 1FD8CD041968AB07008ED995 /* Adapters */ = { - isa = PBXGroup; - children = ( - 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */, - 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */, - 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */, - 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */, - 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */, - 1F1871BA1CA89E2500A34BF2 /* NonObjectiveC */, - 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */, - 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */, - ); - path = Adapters; - sourceTree = ""; - }; - 1FD8CD0C1968AB07008ED995 /* Matchers */ = { - isa = PBXGroup; - children = ( - DDB1BC781A92235600F743C3 /* AllPass.swift */, - 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */, - 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */, - 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */, - 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */, - 1FD8CD101968AB07008ED995 /* BeEmpty.swift */, - 1FD8CD111968AB07008ED995 /* BeginWith.swift */, - 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */, - 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */, - 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */, - 1FD8CD151968AB07008ED995 /* BeLessThan.swift */, - 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */, - 1FD8CD171968AB07008ED995 /* BeLogical.swift */, - 1FD8CD181968AB07008ED995 /* BeNil.swift */, - 1F91DD301C74BF61002C309F /* BeVoid.swift */, - 1FD8CD1A1968AB07008ED995 /* Contain.swift */, - 1FD8CD1B1968AB07008ED995 /* EndWith.swift */, - 1FD8CD1C1968AB07008ED995 /* Equal.swift */, - 472FD1341B9E085700C7B8DA /* HaveCount.swift */, - DDB4D5EC19FE43C200E9D9FE /* Match.swift */, - 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */, - 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */, - AE7ADE441C80BF8000B94CD3 /* MatchError.swift */, - 1FCF91521C61C8A400B15DCB /* PostNotification.swift */, - 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */, - 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */, - 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */, - 29EA59651B551EE6002D767E /* ThrowError.swift */, - ); - path = Matchers; - sourceTree = ""; - }; - 1FD8CD241968AB07008ED995 /* Utils */ = { - isa = PBXGroup; - children = ( - 1FD8CD251968AB07008ED995 /* Functional.swift */, - 1FD8CD261968AB07008ED995 /* Async.swift */, - 1FD8CD271968AB07008ED995 /* SourceLocation.swift */, - 1FD8CD281968AB07008ED995 /* Stringers.swift */, - AE4BA9AC1C88DDB500B73906 /* Errors.swift */, - ); - path = Utils; - sourceTree = ""; - }; - 1FFD729A1963FC8200CD29A2 /* objc */ = { - isa = PBXGroup; - children = ( - 1F4A56681A3B3074009E1637 /* NimbleSpecHelper.h */, - 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */, - 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */, - 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */, - 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */, - 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */, - 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */, - 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */, - 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */, - 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */, - 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */, - 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */, - 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */, - 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */, - 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */, - 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */, - 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */, - 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */, - 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */, - 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */, - 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */, - 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */, - 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */, - 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */, - 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */, - DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */, - 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */, - 8DF1C3F61C94FC75004B2D36 /* ObjcStringersTest.m */, - ); - path = objc; - sourceTree = ""; - }; - 9630C0081C6D0AB3000693EE /* Lib */ = { - isa = PBXGroup; - children = ( - 9630C0091C6D0ABA000693EE /* CwlPreconditionTesting */, - ); - name = Lib; - path = Sources/Lib; - sourceTree = ""; - }; - 9630C0091C6D0ABA000693EE /* CwlPreconditionTesting */ = { - isa = PBXGroup; - children = ( - 1F4BB89D1DAC9D930048464B /* CwlCatchBadInstructionPOSIX.swift */, - 9630C02B1C6D125F000693EE /* CwlBadInstructionException.swift */, - 9630C00C1C6D0B18000693EE /* CwlCatchBadInstruction.swift */, - 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */, - 9630C00B1C6D0B18000693EE /* CwlCatchBadInstruction.m */, - 9630C0181C6D0B2F000693EE /* CwlCatchException.swift */, - 9630C0161C6D0B2F000693EE /* CwlCatchException.h */, - 9630C0171C6D0B2F000693EE /* CwlCatchException.m */, - 9630C02F1C6D139F000693EE /* CwlDarwinDefinitions.swift */, - 9630C0261C6D0BB0000693EE /* mach_excServer.h */, - 9630C0221C6D0B82000693EE /* mach_excServer.c */, - ); - path = CwlPreconditionTesting; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 1F1A74261940169200FFFC47 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9630C00D1C6D0B18000693EE /* CwlCatchBadInstruction.h in Headers */, - 9630C0191C6D0B2F000693EE /* CwlCatchException.h in Headers */, - 1F1871C91CA89EDB00A34BF2 /* NMBStringify.h in Headers */, - 1F1871C51CA89EDB00A34BF2 /* DSL.h in Headers */, - 1F1871C71CA89EDB00A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F1A742F1940169200FFFC47 /* Nimble.h in Headers */, - 9630C0271C6D0BB0000693EE /* mach_excServer.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1521BDCA0CE00C3A531 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4BB8AE1DAC9DED0048464B /* CwlCatchException.h in Headers */, - 1F1871E21CA89EF600A34BF2 /* NMBStringify.h in Headers */, - 1F1871E01CA89EF600A34BF2 /* DSL.h in Headers */, - 1F1871E11CA89EF600A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F4BB8AB1DAC9DE50048464B /* CwlCatchBadInstruction.h in Headers */, - 1F4999A61DBF2DD100BF8877 /* Nimble.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EAA195C0D6300ED456B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9630C00E1C6D0B18000693EE /* CwlCatchBadInstruction.h in Headers */, - 9630C01A1C6D0B2F000693EE /* CwlCatchException.h in Headers */, - 1F2D175B1DB618ED00EE9C7A /* mach_excServer.h in Headers */, - 1F1871DF1CA89EF500A34BF2 /* NMBStringify.h in Headers */, - 1F1871DD1CA89EF500A34BF2 /* DSL.h in Headers */, - 1F1871DE1CA89EF500A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F925EC7195C0DD100ED456B /* Nimble.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1F1A74281940169200FFFC47 /* Nimble-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F1A743F1940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOS" */; - buildPhases = ( - 1F1A74241940169200FFFC47 /* Sources */, - 1F1A74251940169200FFFC47 /* Frameworks */, - 1F1A74261940169200FFFC47 /* Headers */, - 1F1A74271940169200FFFC47 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-iOS"; - productName = "Nimble-iOS"; - productReference = 1F1A74291940169200FFFC47 /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F1A74331940169200FFFC47 /* Nimble-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F1A74421940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOSTests" */; - buildPhases = ( - 1F1A74301940169200FFFC47 /* Sources */, - 1F1A74311940169200FFFC47 /* Frameworks */, - 1F1A74321940169200FFFC47 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F1A74371940169200FFFC47 /* PBXTargetDependency */, - 1F925EA5195C0C8500ED456B /* PBXTargetDependency */, - 1F925EA7195C0C8500ED456B /* PBXTargetDependency */, - 1F6BB82B1968BFF9009F1DBB /* PBXTargetDependency */, - ); - name = "Nimble-iOSTests"; - productName = "Nimble-iOSTests"; - productReference = 1F1A74341940169200FFFC47 /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F5DF16A1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOS" */; - buildPhases = ( - 1F5DF1501BDCA0CE00C3A531 /* Sources */, - 1F5DF1511BDCA0CE00C3A531 /* Frameworks */, - 1F5DF1521BDCA0CE00C3A531 /* Headers */, - 1F5DF1531BDCA0CE00C3A531 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-tvOS"; - productName = "Nimble-tvOS"; - productReference = 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F5DF15D1BDCA0CE00C3A531 /* Nimble-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F5DF16B1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOSTests" */; - buildPhases = ( - 1F5DF15A1BDCA0CE00C3A531 /* Sources */, - 1F5DF15B1BDCA0CE00C3A531 /* Frameworks */, - 1F5DF15C1BDCA0CE00C3A531 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F5DF1611BDCA0CE00C3A531 /* PBXTargetDependency */, - ); - name = "Nimble-tvOSTests"; - productName = "Nimble-tvOSTests"; - productReference = 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F925EAC195C0D6300ED456B /* Nimble-macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F925EC0195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOS" */; - buildPhases = ( - 1F925EA8195C0D6300ED456B /* Sources */, - 1F925EA9195C0D6300ED456B /* Frameworks */, - 1F925EAA195C0D6300ED456B /* Headers */, - 1F925EAB195C0D6300ED456B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-macOS"; - productName = "Nimble-OSX"; - productReference = 1F925EAD195C0D6300ED456B /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F925EB6195C0D6300ED456B /* Nimble-macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F925EC3195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOSTests" */; - buildPhases = ( - 1F925EB3195C0D6300ED456B /* Sources */, - 1F925EB4195C0D6300ED456B /* Frameworks */, - 1F925EB5195C0D6300ED456B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F925EBA195C0D6300ED456B /* PBXTargetDependency */, - 1F9B7BFE1968AD760094EB8F /* PBXTargetDependency */, - 1F9B7C001968AD760094EB8F /* PBXTargetDependency */, - 1F9B7C021968AD820094EB8F /* PBXTargetDependency */, - ); - name = "Nimble-macOSTests"; - productName = "Nimble-OSXTests"; - productReference = 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 1F1A74201940169200FFFC47 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0800; - ORGANIZATIONNAME = "Jeff Hui"; - TargetAttributes = { - 1F1A74281940169200FFFC47 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - }; - 1F1A74331940169200FFFC47 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - TestTargetID = 1F1A74281940169200FFFC47; - }; - 1F5DF1541BDCA0CE00C3A531 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 1F5DF15D1BDCA0CE00C3A531 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 1F925EAC195C0D6300ED456B = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - }; - 1F925EB6195C0D6300ED456B = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - TestTargetID = 1F925EAC195C0D6300ED456B; - }; - }; - }; - buildConfigurationList = 1F1A74231940169200FFFC47 /* Build configuration list for PBXProject "Nimble" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 1F1A741F1940169200FFFC47; - productRefGroup = 1F1A742A1940169200FFFC47 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1F925EAC195C0D6300ED456B /* Nimble-macOS */, - 1F925EB6195C0D6300ED456B /* Nimble-macOSTests */, - 1F1A74281940169200FFFC47 /* Nimble-iOS */, - 1F1A74331940169200FFFC47 /* Nimble-iOSTests */, - 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */, - 1F5DF15D1BDCA0CE00C3A531 /* Nimble-tvOSTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1F1A74271940169200FFFC47 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74321940169200FFFC47 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1531BDCA0CE00C3A531 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15C1BDCA0CE00C3A531 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EAB195C0D6300ED456B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB5195C0D6300ED456B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1F1A74241940169200FFFC47 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1FD8CD401968AB07008ED995 /* BeCloseTo.swift in Sources */, - 1F1871C81CA89EDB00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1FD8CD361968AB07008ED995 /* Expectation.swift in Sources */, - 1FD8CD321968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */, - 1F43728F1A1B344000EB80F8 /* Stringers.swift in Sources */, - 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */, - 1FD8CD4E1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, - 1FDBD8671AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */, - AE4BA9AD1C88DDB500B73906 /* Errors.swift in Sources */, - 1FD8CD3C1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, - 1FD8CD501968AB07008ED995 /* BeLogical.swift in Sources */, - 1F1871CB1CA89EDB00A34BF2 /* NMBExpectation.swift in Sources */, - DA9E8C821A414BB9002633C2 /* DSL+Wait.swift in Sources */, - DDB1BC791A92235600F743C3 /* AllPass.swift in Sources */, - 1FD8CD3E1968AB07008ED995 /* BeAKindOf.swift in Sources */, - DDB4D5ED19FE43C200E9D9FE /* Match.swift in Sources */, - 1F91DD311C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */, - 1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */, - 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */, - 1FD8CD5A1968AB07008ED995 /* Equal.swift in Sources */, - 1FD8CD4C1968AB07008ED995 /* BeLessThan.swift in Sources */, - 1F1871CC1CA89EDB00A34BF2 /* NMBObjCMatcher.swift in Sources */, - 1FD8CD461968AB07008ED995 /* BeGreaterThan.swift in Sources */, - F8A1BE2F1CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F1871C61CA89EDB00A34BF2 /* DSL.m in Sources */, - 1FD8CD301968AB07008ED995 /* AdapterProtocols.swift in Sources */, - AE7ADE451C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1F4BB8BA1DACBFCF0048464B /* CwlCatchBadInstruction.m in Sources */, - 1FC494AA1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1FD8CD5E1968AB07008ED995 /* RaisesException.swift in Sources */, - 1FD8CD561968AB07008ED995 /* Contain.swift in Sources */, - 1FD8CD481968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */, - 1FD8CD441968AB07008ED995 /* BeginWith.swift in Sources */, - 1FD8CD4A1968AB07008ED995 /* BeIdenticalTo.swift in Sources */, - 1F1871E61CA89FCD00A34BF2 /* MatcherFunc.swift in Sources */, - 1FD8CD421968AB07008ED995 /* BeEmpty.swift in Sources */, - 1F1871E41CA89FB600A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1F1871CA1CA89EDB00A34BF2 /* NMBStringify.m in Sources */, - 1FD8CD521968AB07008ED995 /* BeNil.swift in Sources */, - 1FD8CD6A1968AB07008ED995 /* Async.swift in Sources */, - 1FD8CD581968AB07008ED995 /* EndWith.swift in Sources */, - 1FD8CD5C1968AB07008ED995 /* MatcherProtocols.swift in Sources */, - 1FD8CD341968AB07008ED995 /* DSL.swift in Sources */, - 7B5358BE1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1FD8CD381968AB07008ED995 /* Expression.swift in Sources */, - 1FD8CD3A1968AB07008ED995 /* FailureMessage.swift in Sources */, - 472FD1351B9E085700C7B8DA /* HaveCount.swift in Sources */, - 9630C0301C6D139F000693EE /* CwlDarwinDefinitions.swift in Sources */, - 9630C0231C6D0B82000693EE /* mach_excServer.c in Sources */, - 9630C01F1C6D0B2F000693EE /* CwlCatchException.swift in Sources */, - 9630C0131C6D0B18000693EE /* CwlCatchBadInstruction.swift in Sources */, - 9630C01C1C6D0B2F000693EE /* CwlCatchException.m in Sources */, - 9630C02C1C6D125F000693EE /* CwlBadInstructionException.swift in Sources */, - 964CFEFD1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74301940169200FFFC47 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4A569A1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, - 1F925EEC195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, - 1F925EFF195C187600ED456B /* EndWithTest.swift in Sources */, - 1F1B5AD41963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, - 1F925F0E195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, - 1F4A56661A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, - 1F925EFC195C186800ED456B /* BeginWithTest.swift in Sources */, - 1F14FB64194180C5009F2A08 /* utils.swift in Sources */, - DDB4D5F019FE442800E9D9FE /* MatchTest.swift in Sources */, - 1F4A56731A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */, - 1F4A56821A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 1F925F02195C189500ED456B /* ContainTest.swift in Sources */, - 1F4A56881A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */, - 1F4A568E1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */, - 1F925F11195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F925EEF195C136500ED456B /* BeLogicalTest.swift in Sources */, - 1F4A56A01A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */, - 1F925F0B195C18E100ED456B /* BeLessThanTest.swift in Sources */, - 1F9DB8FB1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */, - 1FB90098195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */, - 1F91DD2D1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 1F4A56761A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, - 1F925EF9195C175000ED456B /* BeNilTest.swift in Sources */, - 1F4A56701A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, - 1F4A56971A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */, - 1F4A567C1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */, - 965B0D0C1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */, - 1FCF914F1C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - 965B0D091B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */, - 1F4A56911A3B344A009E1637 /* ObjCBeNilTest.m in Sources */, - 1F8A37B01B7C5042001C8357 /* ObjCSyncTest.m in Sources */, - 1F4A56941A3B346F009E1637 /* ObjCContainTest.m in Sources */, - 1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */, - 1F925EF6195C147800ED456B /* BeCloseToTest.swift in Sources */, - 1F4A56791A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - AE7ADE491C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 1F4A568B1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */, - DDEFAEB41A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */, - 1F4A567F1A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */, - 1F925EE6195C121200ED456B /* AsynchronousTest.swift in Sources */, - 1F0648CC19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */, - 1F4A56851A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */, - DD9A9A8F19CF439B00706F49 /* BeIdenticalToObjectTest.swift in Sources */, - 1F4BB8B71DACA0E40048464B /* ThrowAssertionTest.swift in Sources */, - 1F0648D41963AAB2001F9C46 /* SynchronousTests.swift in Sources */, - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 4793854D1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */, - 1F925F08195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, - 7B5358BA1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F925F05195C18B700ED456B /* EqualTest.swift in Sources */, - 1F4A566D1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */, - DD72EC641A93874A002F7651 /* AllPassTest.swift in Sources */, - 1F4A569D1A3B3565009E1637 /* ObjCMatchTest.m in Sources */, - 1F925EE9195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */, - 29EA59631B551ED2002D767E /* ThrowErrorTest.swift in Sources */, - 6CAEDD0A1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4A566A1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */, - 472FD13B1B9E0CFE00C7B8DA /* HaveCountTest.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1501BDCA0CE00C3A531 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F5DF1791BDCA0F500C3A531 /* BeCloseTo.swift in Sources */, - 1F5DF16C1BDCA0F500C3A531 /* AssertionRecorder.swift in Sources */, - 1F1871D71CA89EEF00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1F5DF1881BDCA0F500C3A531 /* MatcherProtocols.swift in Sources */, - 1F5DF16E1BDCA0F500C3A531 /* NimbleXCTestHandler.swift in Sources */, - 1F5DF1751BDCA0F500C3A531 /* FailureMessage.swift in Sources */, - 1F5DF1801BDCA0F500C3A531 /* BeLessThanOrEqual.swift in Sources */, - 1F1871E81CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */, - 1F5DF1891BDCA0F500C3A531 /* RaisesException.swift in Sources */, - 1F5DF1761BDCA0F500C3A531 /* AllPass.swift in Sources */, - AE4BA9AF1C88DDB500B73906 /* Errors.swift in Sources */, - 1F5DF1861BDCA0F500C3A531 /* HaveCount.swift in Sources */, - 1F5DF1811BDCA0F500C3A531 /* BeLogical.swift in Sources */, - 1F1871DB1CA89EF100A34BF2 /* NMBExpectation.swift in Sources */, - 1F5DF1741BDCA0F500C3A531 /* Expression.swift in Sources */, - 1F5DF1781BDCA0F500C3A531 /* BeAnInstanceOf.swift in Sources */, - 1F5DF1771BDCA0F500C3A531 /* BeAKindOf.swift in Sources */, - 1F5DF17F1BDCA0F500C3A531 /* BeLessThan.swift in Sources */, - 1F4BB8A41DAC9DC90048464B /* CwlCatchBadInstructionPOSIX.swift in Sources */, - 1F5DF17C1BDCA0F500C3A531 /* BeGreaterThan.swift in Sources */, - 1F91DD331C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91551C61C8A400B15DCB /* PostNotification.swift in Sources */, - 1F5DF1831BDCA0F500C3A531 /* Contain.swift in Sources */, - 1F5DF1851BDCA0F500C3A531 /* Equal.swift in Sources */, - 1F1871DC1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */, - F8A1BE311CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F5DF1711BDCA0F500C3A531 /* DSL+Wait.swift in Sources */, - 1F1871D61CA89EEF00A34BF2 /* DSL.m in Sources */, - 1F5DF17D1BDCA0F500C3A531 /* BeGreaterThanOrEqualTo.swift in Sources */, - AE7ADE471C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AC1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1F5DF18E1BDCA0F500C3A531 /* Stringers.swift in Sources */, - 1F5DF16D1BDCA0F500C3A531 /* AdapterProtocols.swift in Sources */, - 1F5DF17B1BDCA0F500C3A531 /* BeginWith.swift in Sources */, - 1F5DF17E1BDCA0F500C3A531 /* BeIdenticalTo.swift in Sources */, - 1F1871E91CA8A18700A34BF2 /* MatcherFunc.swift in Sources */, - 1F5DF17A1BDCA0F500C3A531 /* BeEmpty.swift in Sources */, - 1F5DF18C1BDCA0F500C3A531 /* Async.swift in Sources */, - 1F1871D81CA89EEF00A34BF2 /* NMBStringify.m in Sources */, - 1F5DF1821BDCA0F500C3A531 /* BeNil.swift in Sources */, - 1F5DF16F1BDCA0F500C3A531 /* AssertionDispatcher.swift in Sources */, - 964CFEFF1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - 1F5DF1841BDCA0F500C3A531 /* EndWith.swift in Sources */, - 1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */, - 1F5DF1701BDCA0F500C3A531 /* DSL.swift in Sources */, - 1F5DF1721BDCA0F500C3A531 /* Expectation.swift in Sources */, - 7B5358C01C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */, - 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15A1BDCA0CE00C3A531 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CD79C9AD1D2CC848004B6F9A /* ObjCBeTrueTest.m in Sources */, - CD79C9B41D2CC848004B6F9A /* ObjCRaiseExceptionTest.m in Sources */, - 1F5DF1A31BDCA10200C3A531 /* BeLogicalTest.swift in Sources */, - 1F5DF1951BDCA10200C3A531 /* utils.swift in Sources */, - CD79C9B01D2CC848004B6F9A /* ObjCEndWithTest.m in Sources */, - CD79C9B21D2CC848004B6F9A /* ObjCHaveCount.m in Sources */, - CD79C9A41D2CC848004B6F9A /* ObjCBeFalsyTest.m in Sources */, - 1F5DF1981BDCA10200C3A531 /* BeAKindOfTest.swift in Sources */, - 1F5DF19B1BDCA10200C3A531 /* BeEmptyTest.swift in Sources */, - 7B5358BC1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F5DF1A11BDCA10200C3A531 /* BeLessThanOrEqualToTest.swift in Sources */, - 1F5DF1961BDCA10200C3A531 /* ObjectWithLazyProperty.swift in Sources */, - 1F5DF1AB1BDCA10200C3A531 /* ThrowErrorTest.swift in Sources */, - CD79C9A91D2CC848004B6F9A /* ObjCBeKindOfTest.m in Sources */, - 1F5DF1A51BDCA10200C3A531 /* ContainTest.swift in Sources */, - AE7ADE4B1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - CD79C9B31D2CC848004B6F9A /* ObjCMatchTest.m in Sources */, - 1F5DF19E1BDCA10200C3A531 /* BeGreaterThanTest.swift in Sources */, - 1F5DF1A21BDCA10200C3A531 /* BeLessThanTest.swift in Sources */, - CD79C9AB1D2CC848004B6F9A /* ObjCBeLessThanTest.m in Sources */, - CD79C9A81D2CC848004B6F9A /* ObjCBeIdenticalToTest.m in Sources */, - CD79C9AE1D2CC848004B6F9A /* ObjCBeTruthyTest.m in Sources */, - 1F5DF1921BDCA10200C3A531 /* AsynchronousTest.swift in Sources */, - 1F5DF1A91BDCA10200C3A531 /* MatchTest.swift in Sources */, - 1F5DF1A81BDCA10200C3A531 /* HaveCountTest.swift in Sources */, - 1F5DF1971BDCA10200C3A531 /* AllPassTest.swift in Sources */, - CD79C9A61D2CC848004B6F9A /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */, - 1FCF91511C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - CD79C9B51D2CC848004B6F9A /* ObjCUserDescriptionTest.m in Sources */, - 1F5DF19C1BDCA10200C3A531 /* BeginWithTest.swift in Sources */, - 1F5DF1A01BDCA10200C3A531 /* BeIdenticalToTest.swift in Sources */, - 1F5DF19A1BDCA10200C3A531 /* BeCloseToTest.swift in Sources */, - 1F5DF1A61BDCA10200C3A531 /* EndWithTest.swift in Sources */, - CD79C9A31D2CC841004B6F9A /* ObjCBeFalseTest.m in Sources */, - 1F5DF1A71BDCA10200C3A531 /* EqualTest.swift in Sources */, - CD79C9AA1D2CC848004B6F9A /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 1F5DF1931BDCA10200C3A531 /* SynchronousTests.swift in Sources */, - CD79C9A11D2CC83B004B6F9A /* ObjCBeCloseToTest.m in Sources */, - 1F5DF19D1BDCA10200C3A531 /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F5DF1A41BDCA10200C3A531 /* BeNilTest.swift in Sources */, - CD79C9A71D2CC848004B6F9A /* ObjCBeGreaterThanTest.m in Sources */, - CD79C9A51D2CC848004B6F9A /* ObjCBeginWithTest.m in Sources */, - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 1F5DF1AA1BDCA10200C3A531 /* RaisesExceptionTest.swift in Sources */, - 1F5DF1941BDCA10200C3A531 /* UserDescriptionTest.swift in Sources */, - CD79C9AF1D2CC848004B6F9A /* ObjCContainTest.m in Sources */, - 1F5DF19F1BDCA10200C3A531 /* BeIdenticalToObjectTest.swift in Sources */, - CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */, - 1F91DD2F1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 6CAEDD0C1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4BB8B81DACAACF0048464B /* ThrowAssertionTest.swift in Sources */, - CD79C9B71D2CC848004B6F9A /* ObjCSatisfyAnyOfTest.m in Sources */, - 1F5DF1991BDCA10200C3A531 /* BeAnInstanceOfTest.swift in Sources */, - CD79C9B11D2CC848004B6F9A /* ObjCEqualTest.m in Sources */, - CD79C9A21D2CC83E004B6F9A /* ObjCBeEmptyTest.m in Sources */, - CD79C9AC1D2CC848004B6F9A /* ObjCBeNilTest.m in Sources */, - CD79C9A01D2CC839004B6F9A /* ObjCBeAnInstanceOfTest.m in Sources */, - CD79C9B61D2CC848004B6F9A /* ObjCAllPassTest.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EA8195C0D6300ED456B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1FD8CD411968AB07008ED995 /* BeCloseTo.swift in Sources */, - 1F1871D31CA89EEE00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1FD8CD371968AB07008ED995 /* Expectation.swift in Sources */, - 1FD8CD331968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */, - 1F43728E1A1B343F00EB80F8 /* Stringers.swift in Sources */, - 1F43728C1A1B343C00EB80F8 /* SourceLocation.swift in Sources */, - 1FD8CD4F1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, - 1F1871E71CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1FDBD8681AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */, - AE4BA9AE1C88DDB500B73906 /* Errors.swift in Sources */, - 1FD8CD3D1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, - 1FD8CD511968AB07008ED995 /* BeLogical.swift in Sources */, - 1F1871D91CA89EF100A34BF2 /* NMBExpectation.swift in Sources */, - DA9E8C831A414BB9002633C2 /* DSL+Wait.swift in Sources */, - DDB1BC7A1A92235600F743C3 /* AllPass.swift in Sources */, - 1FD8CD3F1968AB07008ED995 /* BeAKindOf.swift in Sources */, - 1FD8CD2F1968AB07008ED995 /* AssertionRecorder.swift in Sources */, - 1F91DD321C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */, - DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */, - 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */, - 1FD8CD5B1968AB07008ED995 /* Equal.swift in Sources */, - 1FD8CD4D1968AB07008ED995 /* BeLessThan.swift in Sources */, - 1FD8CD471968AB07008ED995 /* BeGreaterThan.swift in Sources */, - F8A1BE301CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F1871DA1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */, - 1FD8CD311968AB07008ED995 /* AdapterProtocols.swift in Sources */, - 1F2D175C1DB618F000EE9C7A /* mach_excServer.c in Sources */, - 1F1871D21CA89EEE00A34BF2 /* DSL.m in Sources */, - 1F4BB8BB1DACBFD00048464B /* CwlCatchBadInstruction.m in Sources */, - AE7ADE461C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AB1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1FD8CD5F1968AB07008ED995 /* RaisesException.swift in Sources */, - 1FD8CD571968AB07008ED995 /* Contain.swift in Sources */, - 1FD8CD491968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */, - 1FD8CD451968AB07008ED995 /* BeginWith.swift in Sources */, - 1F1871EB1CA8A18800A34BF2 /* MatcherFunc.swift in Sources */, - 1FD8CD4B1968AB07008ED995 /* BeIdenticalTo.swift in Sources */, - 1FD8CD431968AB07008ED995 /* BeEmpty.swift in Sources */, - 1F1871D41CA89EEE00A34BF2 /* NMBStringify.m in Sources */, - 1FD8CD531968AB07008ED995 /* BeNil.swift in Sources */, - 1FD8CD6B1968AB07008ED995 /* Async.swift in Sources */, - 964CFEFE1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - 1FD8CD591968AB07008ED995 /* EndWith.swift in Sources */, - 1FD8CD5D1968AB07008ED995 /* MatcherProtocols.swift in Sources */, - 1FD8CD351968AB07008ED995 /* DSL.swift in Sources */, - 7B5358BF1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1FD8CD391968AB07008ED995 /* Expression.swift in Sources */, - 1FD8CD3B1968AB07008ED995 /* FailureMessage.swift in Sources */, - 472FD1391B9E0A9700C7B8DA /* HaveCount.swift in Sources */, - 9630C0311C6D139F000693EE /* CwlDarwinDefinitions.swift in Sources */, - 9630C0201C6D0B2F000693EE /* CwlCatchException.swift in Sources */, - 9630C0141C6D0B18000693EE /* CwlCatchBadInstruction.swift in Sources */, - 9630C01D1C6D0B2F000693EE /* CwlCatchException.m in Sources */, - 9630C02D1C6D125F000693EE /* CwlBadInstructionException.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB3195C0D6300ED456B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4A569B1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, - 1F925EED195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, - 1F925F00195C187600ED456B /* EndWithTest.swift in Sources */, - 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, - 1F925F0F195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, - 1F4A56671A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, - 1F925EFD195C186800ED456B /* BeginWithTest.swift in Sources */, - 1F925EE2195C0DFD00ED456B /* utils.swift in Sources */, - DDB4D5F119FE442800E9D9FE /* MatchTest.swift in Sources */, - 1F4A56741A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */, - 1F4A56831A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 1F925F03195C189500ED456B /* ContainTest.swift in Sources */, - 1F4A56891A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */, - 1F4A568F1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */, - 1F925F12195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F925EF0195C136500ED456B /* BeLogicalTest.swift in Sources */, - 1F4A56A11A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */, - 1F925F0C195C18E100ED456B /* BeLessThanTest.swift in Sources */, - 1F9DB8FC1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */, - 1FB90099195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */, - 1F91DD2E1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 1F4A56771A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, - 1F925EFA195C175000ED456B /* BeNilTest.swift in Sources */, - 1F4A56711A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, - 1F4A56981A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */, - 1F4A567D1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */, - 965B0D0D1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */, - 1FCF91501C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - 965B0D0A1B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */, - 1F4A56921A3B344A009E1637 /* ObjCBeNilTest.m in Sources */, - 1F8A37B11B7C5042001C8357 /* ObjCSyncTest.m in Sources */, - 1F4A56951A3B346F009E1637 /* ObjCContainTest.m in Sources */, - 1F299EAC19627B2D002641AF /* BeEmptyTest.swift in Sources */, - 1F925EF7195C147800ED456B /* BeCloseToTest.swift in Sources */, - 1F4A567A1A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - AE7ADE4A1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 1F4A568C1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */, - DDEFAEB51A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */, - 1F4A56801A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */, - 1F925EE7195C121200ED456B /* AsynchronousTest.swift in Sources */, - 1F0648CD19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */, - 1F4A56861A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */, - DD9A9A9019CF43AD00706F49 /* BeIdenticalToObjectTest.swift in Sources */, - 1F4BB8B61DACA0E30048464B /* ThrowAssertionTest.swift in Sources */, - 1F0648D51963AAB2001F9C46 /* SynchronousTests.swift in Sources */, - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 4793854E1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */, - 1F925F09195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, - 7B5358BB1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F925F06195C18B700ED456B /* EqualTest.swift in Sources */, - 1F4A566E1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */, - DD72EC651A93874A002F7651 /* AllPassTest.swift in Sources */, - 1F4A569E1A3B3565009E1637 /* ObjCMatchTest.m in Sources */, - 1F925EEA195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */, - 29EA59641B551ED2002D767E /* ThrowErrorTest.swift in Sources */, - 6CAEDD0B1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4A566B1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */, - 472FD13A1B9E0A9F00C7B8DA /* HaveCountTest.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1F1A74371940169200FFFC47 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F1A74361940169200FFFC47 /* PBXContainerItemProxy */; - }; - 1F5DF1611BDCA0CE00C3A531 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */; - targetProxy = 1F5DF1601BDCA0CE00C3A531 /* PBXContainerItemProxy */; - }; - 1F6BB82B1968BFF9009F1DBB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F6BB82A1968BFF9009F1DBB /* PBXContainerItemProxy */; - }; - 1F925EA5195C0C8500ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F925EA4195C0C8500ED456B /* PBXContainerItemProxy */; - }; - 1F925EA7195C0C8500ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F925EA6195C0C8500ED456B /* PBXContainerItemProxy */; - }; - 1F925EBA195C0D6300ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F925EB9195C0D6300ED456B /* PBXContainerItemProxy */; - }; - 1F9B7BFE1968AD760094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7BFD1968AD760094EB8F /* PBXContainerItemProxy */; - }; - 1F9B7C001968AD760094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7BFF1968AD760094EB8F /* PBXContainerItemProxy */; - }; - 1F9B7C021968AD820094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7C011968AD820094EB8F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1F1A743D1940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 1F1A743E1940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 1F1A74401940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F1A74411940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 1F1A74431940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F1A74441940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 1F5DF1661BDCA0CE00C3A531 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Debug; - }; - 1F5DF1671BDCA0CE00C3A531 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Release; - }; - 1F5DF1681BDCA0CE00C3A531 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Debug; - }; - 1F5DF1691BDCA0CE00C3A531 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = appletvos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Release; - }; - 1F925EC1195C0D6300ED456B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - FRAMEWORK_VERSION = A; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = macosx; - SKIP_INSTALL = YES; - VALID_ARCHS = x86_64; - }; - name = Debug; - }; - 1F925EC2195C0D6300ED456B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - FRAMEWORK_VERSION = A; - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALID_ARCHS = x86_64; - }; - name = Release; - }; - 1F925EC4195C0D6300ED456B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F925EC5195C0D6300ED456B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1F1A74231940169200FFFC47 /* Build configuration list for PBXProject "Nimble" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A743D1940169200FFFC47 /* Debug */, - 1F1A743E1940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F1A743F1940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A74401940169200FFFC47 /* Debug */, - 1F1A74411940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F1A74421940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A74431940169200FFFC47 /* Debug */, - 1F1A74441940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F5DF16A1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F5DF1661BDCA0CE00C3A531 /* Debug */, - 1F5DF1671BDCA0CE00C3A531 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F5DF16B1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F5DF1681BDCA0CE00C3A531 /* Debug */, - 1F5DF1691BDCA0CE00C3A531 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F925EC0195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F925EC1195C0D6300ED456B /* Debug */, - 1F925EC2195C0D6300ED456B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F925EC3195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F925EC4195C0D6300ED456B /* Debug */, - 1F925EC5195C0D6300ED456B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 1F1A74201940169200FFFC47 /* Project object */; -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a822b74..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme deleted file mode 100644 index 4a6682b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme deleted file mode 100644 index 4aa936e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme deleted file mode 100644 index 2309132..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Package.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Package.swift deleted file mode 100644 index 46d1ff6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Package.swift +++ /dev/null @@ -1,10 +0,0 @@ -import PackageDescription - -let package = Package( - name: "Nimble", - exclude: [ - "Sources/Lib", - "Sources/NimbleObjectiveC", - "Tests/NimbleTests/objc", - ] -) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/README.md deleted file mode 100644 index 684255e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/README.md +++ /dev/null @@ -1,1340 +0,0 @@ -# Nimble - -Use Nimble to express the expected outcomes of Swift -or Objective-C expressions. Inspired by -[Cedar](https://github.com/pivotal/cedar). - -```swift -// Swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` - -# How to Use Nimble - - - -**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - -- [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) - - [Operator Overloads](#operator-overloads) - - [Lazily Computed Values](#lazily-computed-values) - - [C Primitives](#c-primitives) - - [Asynchronous Expectations](#asynchronous-expectations) - - [Objective-C Support](#objective-c-support) - - [Disabling Objective-C Shorthand](#disabling-objective-c-shorthand) -- [Built-in Matcher Functions](#built-in-matcher-functions) - - [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) - - [Verify a notification was posted](#verifying-a-notification-was-posted) - - [Matching a value to any of a group of matchers](#matching-a-value-to-any-of-a-group-of-matchers) -- [Writing Your Own Matchers](#writing-your-own-matchers) - - [Lazy Evaluation](#lazy-evaluation) - - [Type Checking via Swift Generics](#type-checking-via-swift-generics) - - [Customizing Failure Messages](#customizing-failure-messages) - - [Supporting Objective-C](#supporting-objective-c) - - [Properly Handling `nil` in Objective-C Matchers](#properly-handling-nil-in-objective-c-matchers) -- [Installing Nimble](#installing-nimble) - - [Installing Nimble as a Submodule](#installing-nimble-as-a-submodule) - - [Installing Nimble via CocoaPods](#installing-nimble-via-cocoapods) - - [Using Nimble without XCTest](#using-nimble-without-xctest) - - - -# Some Background: Expressing Outcomes Using Assertions in XCTest - -Apple's Xcode includes the XCTest framework, which provides -assertion macros to test whether code behaves properly. -For example, to assert that `1 + 1 = 2`, XCTest has you write: - -```swift -// Swift - -XCTAssertEqual(1 + 1, 2, "expected one plus one to equal two") -``` - -Or, in Objective-C: - -```objc -// Objective-C - -XCTAssertEqual(1 + 1, 2, @"expected one plus one to equal two"); -``` - -XCTest assertions have a couple of drawbacks: - -1. **Not enough macros.** There's no easy way to assert that a string - contains a particular substring, or that a number is less than or - equal to another. -2. **It's hard to write asynchronous tests.** XCTest forces you to write - a lot of boilerplate code. - -Nimble addresses these concerns. - -# Nimble: Expectations Using `expect(...).to` - -Nimble allows you to express expectations using a natural, -easily understood language: - -```swift -// Swift - -import Nimble - -expect(seagull.squawk).to(equal("Squee!")) -``` - -```objc -// Objective-C - -@import Nimble; - -expect(seagull.squawk).to(equal(@"Squee!")); -``` - -> The `expect` function autocompletes to include `file:` and `line:`, - but these parameters are optional. Use the default values to have - Xcode highlight the correct line when an expectation is not met. - -To perform the opposite expectation--to assert something is *not* -equal--use `toNot` or `notTo`: - -```swift -// Swift - -import Nimble - -expect(seagull.squawk).toNot(equal("Oh, hello there!")) -expect(seagull.squawk).notTo(equal("Oh, hello there!")) -``` - -```objc -// Objective-C - -@import Nimble; - -expect(seagull.squawk).toNot(equal(@"Oh, hello there!")); -expect(seagull.squawk).notTo(equal(@"Oh, hello there!")); -``` - -## Custom Failure Messages - -Would you like to add more information to the test's failure messages? Use the `description` optional argument to add your own text: - -```swift -// Swift - -expect(1 + 1).to(equal(3)) -// failed - expected to equal <3>, got <2> - -expect(1 + 1).to(equal(3), description: "Make sure libKindergartenMath is loaded") -// failed - Make sure libKindergartenMath is loaded -// expected to equal <3>, got <2> -``` - -Or the *WithDescription version in Objective-C: - -```objc -// Objective-C - -@import Nimble; - -expect(@(1+1)).to(equal(@3)); -// failed - expected to equal <3.0000>, got <2.0000> - -expect(@(1+1)).toWithDescription(equal(@3), @"Make sure libKindergartenMath is loaded"); -// failed - Make sure libKindergartenMath is loaded -// expected to equal <3.0000>, got <2.0000> -``` - -## Type Checking - -Nimble makes sure you don't compare two types that don't match: - -```swift -// Swift - -// Does not compile: -expect(1 + 1).to(equal("Squee!")) -``` - -> Nimble uses generics--only available in Swift--to ensure - type correctness. That means type checking is - not available when using Nimble in Objective-C. :sob: - -## Operator Overloads - -Tired of so much typing? With Nimble, you can use overloaded operators -like `==` for equivalence, or `>` for comparisons: - -```swift -// Swift - -// Passes if squawk does not equal "Hi!": -expect(seagull.squawk) != "Hi!" - -// Passes if 10 is greater than 2: -expect(10) > 2 -``` - -> Operator overloads are only available in Swift, so you won't be able - to use this syntax in Objective-C. :broken_heart: - -## Lazily Computed Values - -The `expect` function doesn't evaluate the value it's given until it's -time to match. So Nimble can test whether an expression raises an -exception once evaluated: - -```swift -// Swift - -// Note: Swift currently doesn't have exceptions. -// Only Objective-C code can raise exceptions -// that Nimble will catch. -// (see https://github.com/Quick/Nimble/issues/220#issuecomment-172667064) -let exception = NSException( - name: NSInternalInconsistencyException, - reason: "Not enough fish in the sea.", - userInfo: ["something": "is fishy"]) -expect { exception.raise() }.to(raiseException()) - -// Also, you can customize raiseException to be more specific -expect { exception.raise() }.to(raiseException(named: NSInternalInconsistencyException)) -expect { exception.raise() }.to(raiseException( - named: NSInternalInconsistencyException, - reason: "Not enough fish in the sea")) -expect { exception.raise() }.to(raiseException( - named: NSInternalInconsistencyException, - reason: "Not enough fish in the sea", - userInfo: ["something": "is fishy"])) -``` - -Objective-C works the same way, but you must use the `expectAction` -macro when making an expectation on an expression that has no return -value: - -```objc -// Objective-C - -NSException *exception = [NSException exceptionWithName:NSInternalInconsistencyException - reason:@"Not enough fish in the sea." - userInfo:nil]; -expectAction(^{ [exception raise]; }).to(raiseException()); - -// Use the property-block syntax to be more specific. -expectAction(^{ [exception raise]; }).to(raiseException().named(NSInternalInconsistencyException)); -expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInternalInconsistencyException). - reason("Not enough fish in the sea")); -expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInternalInconsistencyException). - reason("Not enough fish in the sea"). - userInfo(@{@"something": @"is fishy"})); - -// You can also pass a block for custom matching of the raised exception -expectAction(exception.raise()).to(raiseException().satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(beginWith(NSInternalInconsistencyException)); -})); -``` - -## C Primitives - -Some testing frameworks make it hard to test primitive C values. -In Nimble, it just works: - -```swift -// Swift - -let actual: CInt = 1 -let expectedValue: CInt = 1 -expect(actual).to(equal(expectedValue)) -``` - -In fact, Nimble uses type inference, so you can write the above -without explicitly specifying both types: - -```swift -// Swift - -expect(1 as CInt).to(equal(1)) -``` - -> In Objective-C, Nimble only supports Objective-C objects. To - make expectations on primitive C values, wrap then in an object - literal: - - ```objc - expect(@(1 + 1)).to(equal(@2)); - ``` - -## Asynchronous Expectations - -In Nimble, it's easy to make expectations on values that are updated -asynchronously. Just use `toEventually` or `toEventuallyNot`: - -```swift -// Swift - -dispatch_async(dispatch_get_main_queue()) { - ocean.add("dolphins") - ocean.add("whales") -} -expect(ocean).toEventually(contain("dolphins", "whales")) -``` - - -```objc -// Objective-C -dispatch_async(dispatch_get_main_queue(), ^{ - [ocean add:@"dolphins"]; - [ocean add:@"whales"]; -}); -expect(ocean).toEventually(contain(@"dolphins", @"whales")); -``` - -Note: toEventually triggers its polls on the main thread. Blocking the main -thread will cause Nimble to stop the run loop. This can cause test pollution -for whatever incomplete code that was running on the main thread. Blocking the -main thread can be caused by blocking IO, calls to sleep(), deadlocks, and -synchronous IPC. - -In the above example, `ocean` is constantly re-evaluated. If it ever -contains dolphins and whales, the expectation passes. If `ocean` still -doesn't contain them, even after being continuously re-evaluated for one -whole second, the expectation fails. - -Sometimes it takes more than a second for a value to update. In those -cases, use the `timeout` parameter: - -```swift -// Swift - -// 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 -// Objective-C - -// Waits three seconds for ocean to contain "starfish": -expect(ocean).withTimeout(3).toEventually(contain(@"starfish")); -``` - -You can also provide a callback by using the `waitUntil` function: - -```swift -// Swift - -waitUntil { done in - // do some stuff that takes a while... - NSThread.sleepForTimeInterval(0.5) - done() -} -``` - -```objc -// Objective-C - -waitUntil(^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:0.5]; - done(); -}); -``` - -`waitUntil` also optionally takes a timeout parameter: - -```swift -// Swift - -waitUntil(timeout: 10) { done in - // do some stuff that takes a while... - NSThread.sleepForTimeInterval(1) - done() -} -``` - -```objc -// Objective-C - -waitUntilTimeout(10, ^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:1]; - done(); -}); -``` - -Note: waitUntil triggers its timeout code on the main thread. Blocking the main -thread will cause Nimble to stop the run loop to continue. This can cause test -pollution for whatever incomplete code that was running on the main thread. -Blocking the main thread can be caused by blocking IO, calls to sleep(), -deadlocks, and synchronous IPC. - -In some cases (e.g. when running on slower machines) it can be useful to modify -the default timeout and poll interval values. This can be done as follows: - -```swift -// Swift - -// Increase the global timeout to 5 seconds: -Nimble.AsyncDefaults.Timeout = 5 - -// Slow the polling interval to 0.1 seconds: -Nimble.AsyncDefaults.PollInterval = 0.1 -``` - -## Objective-C Support - -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 or can be converted into - an `NSObject` equivalent: - - ```objc - // Objective-C - - @import Nimble; - - 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, - such as `-[NSException raise]`, use `expectAction` instead of - `expect`: - - ```objc - // 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 -`expect` function. To disable this shorthand in Objective-C, define the -`NIMBLE_DISABLE_SHORT_SYNTAX` macro somewhere in your code before -importing Nimble: - -```objc -#define NIMBLE_DISABLE_SHORT_SYNTAX 1 - -@import Nimble; - -NMB_expect(^{ return seagull.squawk; }, __FILE__, __LINE__).to(NMB_equal(@"Squee!")); -``` - -> Disabling the shorthand is useful if you're testing functions with - names that conflict with Nimble functions, such as `expect` or - `equal`. If that's not the case, there's no point in disabling the - shorthand. - -# Built-in Matcher Functions - -Nimble includes a wide variety of matcher functions. - -## Equivalence - -```swift -// Swift - -// Passes if actual is equivalent to expected: -expect(actual).to(equal(expected)) -expect(actual) == expected - -// Passes if actual is not equivalent to expected: -expect(actual).toNot(equal(expected)) -expect(actual) != expected -``` - -```objc -// Objective-C - -// Passes if actual is equivalent to expected: -expect(actual).to(equal(expected)) - -// Passes if actual is not equivalent to expected: -expect(actual).toNot(equal(expected)) -``` - -Values must be `Equatable`, `Comparable`, or subclasses of `NSObject`. -`equal` will always fail when used to compare one or more `nil` values. - -## Identity - -```swift -// Swift - -// 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: -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. - - -```objc -// Objective-C - -// 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: -expect(actual).toNot(beIdenticalTo(expected)); -``` - -## Comparisons - -```swift -// Swift - -expect(actual).to(beLessThan(expected)) -expect(actual) < expected - -expect(actual).to(beLessThanOrEqualTo(expected)) -expect(actual) <= expected - -expect(actual).to(beGreaterThan(expected)) -expect(actual) > expected - -expect(actual).to(beGreaterThanOrEqualTo(expected)) -expect(actual) >= expected -``` - -```objc -// Objective-C - -expect(actual).to(beLessThan(expected)); -expect(actual).to(beLessThanOrEqualTo(expected)); -expect(actual).to(beGreaterThan(expected)); -expect(actual).to(beGreaterThanOrEqualTo(expected)); -``` - -> Values given to the comparison matchers above must implement - `Comparable`. - -Because of how computers represent floating point numbers, assertions -that two floating point numbers be equal will sometimes fail. To express -that two numbers should be close to one another within a certain margin -of error, use `beCloseTo`: - -```swift -// Swift - -expect(actual).to(beCloseTo(expected, within: delta)) -``` - -```objc -// Objective-C - -expect(actual).to(beCloseTo(expected).within(delta)); -``` - -For example, to assert that `10.01` is close to `10`, you can write: - -```swift -// Swift - -expect(10.01).to(beCloseTo(10, within: 0.1)) -``` - -```objc -// Objective-C - -expect(@(10.01)).to(beCloseTo(@10).within(0.1)); -``` - -There is also an operator shortcut available in Swift: - -```swift -// Swift - -expect(actual) ≈ expected -expect(actual) ≈ (expected, delta) - -``` -(Type Option-x to get ≈ on a U.S. keyboard) - -The former version uses the default delta of 0.0001. Here is yet another way to do this: - -```swift -// Swift - -expect(actual) ≈ expected ± delta -expect(actual) == expected ± delta - -``` -(Type Option-Shift-= to get ± on a U.S. keyboard) - -If you are comparing arrays of floating point numbers, you'll find the following useful: - -```swift -// Swift - -expect([0.0, 2.0]) ≈ [0.0001, 2.0001] -expect([0.0, 2.0]).to(beCloseTo([0.1, 2.1], within: 0.1)) - -``` - -> Values given to the `beCloseTo` matcher must be coercable into a - `Double`. - -## Types/Classes - -```swift -// Swift - -// 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: -expect(instance).to(beAKindOf(aClass)) -``` - -```objc -// Objective-C - -// 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: -expect(instance).to(beAKindOf(aClass)); -``` - -> Instances must be Objective-C objects: subclasses of `NSObject`, - or Swift objects bridged to Objective-C with the `@objc` prefix. - -For example, to assert that `dolphin` is a kind of `Mammal`: - -```swift -// Swift - -expect(dolphin).to(beAKindOf(Mammal)) -``` - -```objc -// Objective-C - -expect(dolphin).to(beAKindOf([Mammal class])); -``` - -> `beAnInstanceOf` uses the `-[NSObject isMemberOfClass:]` method to - test membership. `beAKindOf` uses `-[NSObject isKindOfClass:]`. - -## Truthiness - -```swift -// 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): -expect(actual).to(beTrue()) - -// 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): -expect(actual).to(beFalse()) - -// 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: -expect(actual).to(beTruthy()); - -// 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: -expect(actual).to(beFalsy()); - -// Passes if actual is only false (not nil or an object conforming to Boolean false): -expect(actual).to(beFalse()); - -// 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 calling fatalError() or precondition fails: -expect { () -> Void in fatalError() }.to(throwAssertion()) -expect { precondition(false) }.to(throwAssertion()) - -// Passes if throwing a NSError is not equal to throwing an assertion: -expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion()) - -// Passes if the post assertion code is not run: -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. - -```swift -// Swift - -// Passes if somethingThatThrows() throws an ErrorProtocol: -expect{ try somethingThatThrows() }.to(throwError()) - -// Passes if somethingThatThrows() throws an error with a given domain: -expect{ try somethingThatThrows() }.to(throwError { (error: ErrorProtocol) 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 an error with a given 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. - -```swift -// Swift - -let actual: ErrorProtocol = … - -// Passes if actual contains any error value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum)) - -// Passes if actual contains the Timeout value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum.Timeout)) - -// Passes if actual contains an NSError equal to the given one: -expect(actual).to(matchError(NSError(domain: "err", code: 123, userInfo: nil))) -``` - -Note: This feature is only available in Swift. - -## Exceptions - -```swift -// Swift - -// Passes if actual, when evaluated, raises an exception: -expect(actual).to(raiseException()) - -// 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: -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') -expect { exception.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name).to(beginWith("a r")) -}) -``` - -```objc -// Objective-C - -// Passes if actual, when evaluated, raises an exception: -expect(actual).to(raiseException()) - -// 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: -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') -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. - -## Collection Membership - -```swift -// Swift - -// 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): -expect(actual).to(beEmpty()) -``` - -```objc -// Objective-C - -// Passes if expected is a member of actual: -expect(actual).to(contain(expected)); - -// Passes if actual is an empty collection (it contains no elements): -expect(actual).to(beEmpty()); -``` - -> In Swift `contain` takes any number of arguments. The expectation - passes if all of them are members of the collection. In Objective-C, - `contain` only takes one argument [for now](https://github.com/Quick/Nimble/issues/27). - -For example, to assert that a list of sea creature names contains -"dolphin" and "starfish": - -```swift -// Swift - -expect(["whale", "dolphin", "starfish"]).to(contain("dolphin", "starfish")) -``` - -```objc -// Objective-C - -expect(@[@"whale", @"dolphin", @"starfish"]).to(contain(@"dolphin")); -expect(@[@"whale", @"dolphin", @"starfish"]).to(contain(@"starfish")); -``` - -> `contain` and `beEmpty` expect collections to be instances of - `NSArray`, `NSSet`, or a Swift collection composed of `Equatable` elements. - -To test whether a set of elements is present at the beginning or end of -an ordered collection, use `beginWith` and `endWith`: - -```swift -// Swift - -// 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: -expect(actual).to(endWith(expected...)) -``` - -```objc -// Objective-C - -// 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: -expect(actual).to(endWith(expected)); -``` - -> `beginWith` and `endWith` expect collections to be instances of - `NSArray`, or ordered Swift collections composed of `Equatable` - elements. - - Like `contain`, in Objective-C `beginWith` and `endWith` only support - a single argument [for now](https://github.com/Quick/Nimble/issues/27). - -## Strings - -```swift -// Swift - -// Passes if actual contains substring expected: -expect(actual).to(contain(expected)) - -// Passes if actual begins with substring: -expect(actual).to(beginWith(expected)) - -// Passes if actual ends with substring: -expect(actual).to(endWith(expected)) - -// Passes if actual is an empty string, "": -expect(actual).to(beEmpty()) - -// Passes if actual matches the regular expression defined in expected: -expect(actual).to(match(expected)) -``` - -```objc -// Objective-C - -// Passes if actual contains substring expected: -expect(actual).to(contain(expected)); - -// Passes if actual begins with substring: -expect(actual).to(beginWith(expected)); - -// Passes if actual ends with substring: -expect(actual).to(endWith(expected)); - -// Passes if actual is an empty string, "": -expect(actual).to(beEmpty()); - -// 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 - -```swift -// Swift - -// with a custom function: -expect([1,2,3,4]).to(allPass({$0 < 5})) - -// with another matcher: -expect([1,2,3,4]).to(allPass(beLessThan(5))) -``` - -```objc -// Objective-C - -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 - -```swift -// Swift - -// passes if actual collection's count is equal to expected -expect(actual).to(haveCount(expected)) - -// passes if actual collection's count is not equal to expected -expect(actual).notTo(haveCount(expected)) -``` - -```objc -// Objective-C - -// passes if actual collection's count is equal to expected -expect(actual).to(haveCount(expected)) - -// passes if actual collection's count is not equal to expected -expect(actual).notTo(haveCount(expected)) -``` - -For Swift the actual value must be a `Collection` such as 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. - -## Foundation - -### Verifying a Notification was posted - -```swift -// Swift -let testNotification = Notification(name: "Foo", object: nil) - -// passes if the closure in expect { ... } posts a notification to the default -// notification center. -expect { - NotificationCenter.default.postNotification(testNotification) -}.to(postNotifications(equal([testNotification])) - -// passes if the closure in expect { ... } posts a notification to a given -// notification center -let notificationCenter = NotificationCenter() -expect { - notificationCenter.postNotification(testNotification) -}.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) -``` - -> This matcher is only available in Swift. - -## Matching a value to any of a group of matchers - -```swift -// passes if actual is either less than 10 or greater than 20 -expect(actual).to(satisfyAnyOf(beLessThan(10), beGreaterThan(20))) - -// can include any number of matchers -- the following will pass -// **be careful** -- too many matchers can be the sign of an unfocused test -expect(6).to(satisfyAnyOf(equal(2), equal(3), equal(4), equal(5), equal(6), equal(7))) - -// in Swift you also have the option to use the || operator to achieve a similar function -expect(82).to(beLessThan(50) || beGreaterThan(80)) -``` - -```objc -// passes if actual is either less than 10 or greater than 20 -expect(actual).to(satisfyAnyOf(beLessThan(@10), beGreaterThan(@20))) - -// can include any number of matchers -- the following will pass -// **be careful** -- too many matchers can be the sign of an unfocused test -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. - -# Writing Your Own Matchers - -In Nimble, matchers are Swift functions that take an expected -value and return a `MatcherFunc` closure. Take `equal`, for example: - -```swift -// Swift - -public func equal(expectedValue: T?) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(expectedValue)>" - if let actualValue = try actualExpression.evaluate() { - return actualValue == expectedValue - } else { - return false - } - } -} -``` - -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 actual `equal` matcher function does not match when either - `actual` or `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 -in an Xcode project you distribute to others. - -> If you write a matcher you think everyone can use, consider adding it - to Nimble's built-in set of matchers by sending a pull request! Or - distribute it yourself via GitHub. - -For examples of how to write your own matchers, just check out the -[`Matchers` directory](https://github.com/Quick/Nimble/tree/master/Sources/Nimble/Matchers) -to see how Nimble's built-in set of matchers are implemented. You can -also check out the tips below. - -## Lazy Evaluation - -`actualExpression` is a lazy, memoized closure around the value provided to the -`expect` function. The expression can either be a closure or a value directly -passed to `expect(...)`. In order to determine whether that value matches, -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 - } -} -``` - -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 -passed to the `expect` function by modifying the return type. - -For example, the following matcher, `haveDescription`, only accepts actual -values that implement the `Printable` protocol. It checks their `description` -against the one provided to the matcher function, and passes if they are the same: - -```swift -// Swift - -public func haveDescription(description: String) -> MatcherFunc { - return MatcherFunc { actual, failureMessage in - return actual.evaluate().description == description - } -} -``` - -## Customizing Failure Messages - -By default, Nimble outputs the following failure message when an -expectation fails: - -``` -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: - -```swift -// Swift - -// Outputs: expected to be under the sea, got <\(actual)> -failureMessage.postfixMessage = "be under the sea" -``` - -You can change how the `actual` value is displayed by updating -`failureMessage.actualValue`. Or, to remove it altogether, set it to -`nil`: - -```swift -// Swift - -// Outputs: expected to be under the sea -failureMessage.actualValue = nil -failureMessage.postfixMessage = "be under the sea" -``` - -## Supporting Objective-C - -To use a custom matcher written in Swift from Objective-C, you'll have -to extend the `NMBObjCMatcher` class, adding a new class method for your -custom matcher. The example below defines the class method -`+[NMBObjCMatcher beNilMatcher]`: - -```swift -// Swift - -extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualBlock, failureMessage, location in - let block = ({ actualBlock() as NSObject? }) - let expr = Expression(expression: block, location: location) - return beNil().matches(expr, failureMessage: failureMessage) - } - } -} -``` - -The above allows you to use the matcher from Objective-C: - -```objc -// Objective-C - -expect(actual).to([NMBObjCMatcher beNilMatcher]()); -``` - -To make the syntax easier to use, define a C function that calls the -class method: - -```objc -// Objective-C - -FOUNDATION_EXPORT id beNil() { - return [NMBObjCMatcher beNilMatcher]; -} -``` - -### Properly Handling `nil` in Objective-C Matchers - -When supporting Objective-C, make sure you handle `nil` appropriately. -Like [Cedar](https://github.com/pivotal/cedar/issues/100), -**most matchers do not match with nil**. This is to bring prevent test -writers from being surprised by `nil` values where they did not expect -them. - -Nimble provides the `beNil` matcher function for test writer that want -to make expectations on `nil` objects: - -```objc -// Objective-C - -expect(nil).to(equal(nil)); // fails -expect(nil).to(beNil()); // passes -``` - -If your matcher does not want to match with nil, you use `NonNilMatcherFunc` -and the `canMatchNil` constructor on `NMBObjCMatcher`. Using both types will -automatically generate expected value failure messages when they're nil. - -```swift - -public func beginWith(startingElement: T) -> NonNilMatcherFunc { - 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 - } -} - -extension NMBObjCMatcher { - public class func beginWithMatcher(expected: AnyObject) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = actualExpression.evaluate() - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return beginWith(expected).matches(expr, failureMessage: failureMessage) - } - } -} -``` - -# 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 - 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. - -## Installing Nimble as a Submodule - -To use Nimble as a submodule to test your macOS, iOS or tvOS applications, follow -these 4 easy steps: - -1. Clone the Nimble repository -2. Add Nimble.xcodeproj to the Xcode workspace for your project -3. Link Nimble.framework to your test target -4. Start writing expectations! - -For more detailed instructions on each of these steps, -read [How to Install Quick](https://github.com/Quick/Quick#how-to-install-quick). -Ignore the steps involving adding Quick to your project in order to -install just Nimble. - -## Installing Nimble via CocoaPods - -To use Nimble in CocoaPods to test your macOS, iOS or tvOS applications, add -Nimble to your podfile and add the ```use_frameworks!``` line to enable Swift -support for CocoaPods. - -```ruby -platform :ios, '8.0' - -source 'https://github.com/CocoaPods/Specs.git' - -# Whatever pods you need for your app go here - -target 'YOUR_APP_NAME_HERE_Tests', :exclusive => true do - use_frameworks! - pod 'Nimble', '~> 5.0.0' -end -``` - -Finally run `pod install`. - -## Using Nimble without XCTest - -Nimble is integrated with XCTest to allow it work well when used in Xcode test -bundles, however it can also be used in a standalone app. After installing -Nimble using one of the above methods, there are two additional steps required -to make this work. - -1. Create a custom assertion handler and assign an instance of it to the - global `NimbleAssertionHandler` variable. For example: - -```swift -class MyAssertionHandler : AssertionHandler { - func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) { - if (!assertion) { - print("Expectation failed: \(message.stringValue)") - } - } -} -``` -```swift -// Somewhere before you use any assertions -NimbleAssertionHandler = MyAssertionHandler() -``` - -2. Add a post-build action to fix an issue with the Swift XCTest support - library being unnecessarily copied into your app - * Edit your scheme in Xcode, and navigate to Build -> Post-actions - * Click the "+" icon and select "New Run Script Action" - * Open the "Provide build settings from" dropdown and select your target - * Enter the following script contents: -``` -rm "${SWIFT_STDLIB_TOOL_DESTINATION_DIR}/libswiftXCTest.dylib" -``` - -You can now use Nimble assertions in your code and handle failures as you see -fit. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/.gitignore b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/.gitignore deleted file mode 100644 index 5b05d7e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.DS_Store -project.xcworkspace/ -xcuserdata/ diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h deleted file mode 100644 index 6ec6a29..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// 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[]; - -__attribute__((visibility("hidden"))) -NSException* __nullable catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)()); diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m deleted file mode 100644 index 4f9772c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// 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" - -__attribute__((visibility("hidden"))) -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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift deleted file mode 100644 index b44a232..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// 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 - -// We can't simply cast to Self? in the catchInBlock method so we need this generic function wrapper to do the conversion for us. Mildly annoying. -private func catchReturnTypeConverter(_ type: T.Type, block: () -> Void) -> T? { - return catchExceptionOfKind(type, block) as? T -} - -extension NSException { - public static func catchException(in block: () -> Void) -> Self? { - return catchReturnTypeConverter(self, block: block) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/Info.plist deleted file mode 100644 index f14cf1e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSHumanReadableCopyright - Copyright © 2016 Matt Gallagher. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift deleted file mode 100644 index 2fa67c9..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// 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 - -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 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. - public class func catch_mach_exception_raise_state(_ exception_port: mach_port_t, exception: exception_type_t, code: UnsafePointer, codeCnt: mach_msg_type_number_t, flavor: UnsafeMutablePointer, old_state: UnsafePointer, old_stateCnt: mach_msg_type_number_t, new_state: thread_state_t, new_stateCnt: UnsafeMutablePointer) -> kern_return_t { - - #if arch(x86_64) - // Make sure we've been given enough memory - if old_stateCnt != x86_THREAD_STATE64_COUNT || new_stateCnt.pointee < x86_THREAD_STATE64_COUNT { - return 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 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 KERN_SUCCESS - #else - fatalError("Unavailable for this CPU architecture") - #endif - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h deleted file mode 100644 index 0333ed2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h +++ /dev/null @@ -1,61 +0,0 @@ -// -// CwlCatchBadInstruction.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. -// - -#if defined(__x86_64__) - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -// 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; - -extern boolean_t mach_exc_server(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); - -NS_ASSUME_NONNULL_END - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m deleted file mode 100644 index 22c1377..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// CwlCatchBadInstruction.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 "CwlCatchBadInstruction.h" - -// Assuming the "PRODUCT_NAME" macro is defined, this will create the name of the Swift generated header file -#define STRINGIZE_NO_EXPANSION(A) #A -#define STRINGIZE_WITH_EXPANSION(A) STRINGIZE_NO_EXPANSION(A) -#define SWIFT_INCLUDE STRINGIZE_WITH_EXPANSION(PRODUCT_NAME-Swift.h) - -// Include the Swift generated header file -#import SWIFT_INCLUDE - -/// 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) { - return [BadInstructionException catch_mach_exception_raise_state:exception_port exception:exception code:code codeCnt:codeCnt flavor:flavor old_state:old_state old_stateCnt:old_stateCnt new_state:new_state new_stateCnt:new_stateCnt]; -} - -// 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift deleted file mode 100644 index ab460b3..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift +++ /dev/null @@ -1,194 +0,0 @@ -// -// 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 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 subsquent 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift deleted file mode 100644 index 9d777f8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// CwlCatchBadInstructionPosix.swift -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 8/02/2016. -// 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 arch(x86_64) - - // This file is an alternative implementation to CwlCatchBadInstruction.swift that uses a SIGILL signal action and setenv/longjmp instead of a Mach exception handler and Objective-C exception raising. - // - // WARNING: - // This code is quick and dirty. It's a proof of concept for using a SIGILL handler and setjmp/longjmp where Mach exceptions and the Obj-C runtime aren't available. I ran the automated tests when I first wrote this code but I don't personally use it at all so by the time you're reading this comment, it probably broke and I didn't notice. - // Obvious limitations: - // * It doesn't work when debugging with lldb. - // * It doesn't scope correctly to the thread (it's global) - // * In violation of rules for signal handlers, it writes to the "red zone" on the stack - // * It isn't re-entrant - // * Plus all of the same caveats as the Mach exceptions version (doesn't play well with other handlers, probably leaks ARC memory, etc) - // Treat it like a loaded shotgun. Don't point it at your face. - - // This function is called from the signal handler to shut down the thread and return 1 (indicating a SIGILL was received). - private func callThreadExit() { - pthread_exit(UnsafeMutableRawPointer(bitPattern: 1)) - } - - // When called, this signal handler simulates a function call to `callThreadExit` - private func sigIllHandler(code: Int32, info: UnsafeMutablePointer<__siginfo>?, uap: UnsafeMutableRawPointer?) -> Void { - guard let context = uap?.assumingMemoryBound(to: ucontext64_t.self) else { return } - - // 1. Decrement the stack pointer - context.pointee.uc_mcontext64.pointee.__ss.__rsp -= __uint64_t(MemoryLayout.size) - - // 2. Save the old Instruction Pointer to the stack. - let rsp = context.pointee.uc_mcontext64.pointee.__ss.__rsp - if let ump = UnsafeMutablePointer<__uint64_t>(bitPattern: UInt(rsp)) { - ump.pointee = rsp - } - - // 3. Set the Instruction Pointer to the new function's address - var f: @convention(c) () -> Void = callThreadExit - withUnsafePointer(to: &f) { $0.withMemoryRebound(to: __uint64_t.self, capacity: 1) { ptr in - context.pointee.uc_mcontext64.pointee.__ss.__rip = ptr.pointee - } } - } - - /// Without Mach exceptions or the Objective-C runtime, there's nothing to put in the exception object. It's really just a boolean – either a SIGILL was caught or not. - public class BadInstructionException { - } - - /// Run the provided block. If a POSIX SIGILL is received, handle it and return a BadInstructionException (which is just an empty object in this POSIX signal version). 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 SIGILL is received, the block will be interrupted using a C `longjmp`. The risks associated with abrupt jumps apply here: most Swift functions are *not* interrupt-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 SIGILL is raised during the execution of `block` then a BadInstructionException will be returned, otherwise `nil`. - public func catchBadInstruction(block: @escaping () -> Void) -> BadInstructionException? { - // Construct the signal action - var sigActionPrev = sigaction() - let action = __sigaction_u(__sa_sigaction: sigIllHandler) - var sigActionNew = sigaction(__sigaction_u: action, sa_mask: sigset_t(), sa_flags: SA_SIGINFO) - - // Install the signal action - if sigaction(SIGILL, &sigActionNew, &sigActionPrev) != 0 { - fatalError("Sigaction error: \(errno)") - } - - defer { - // Restore the previous signal action - if sigaction(SIGILL, &sigActionPrev, nil) != 0 { - fatalError("Sigaction error: \(errno)") - } - } - - var b = block - let caught: Bool = withUnsafeMutablePointer(to: &b) { blockPtr in - // Run the block on its own thread - var handlerThread: pthread_t? = nil - let e = pthread_create(&handlerThread, nil, { arg in - (arg.assumingMemoryBound(to: (() -> Void).self).pointee)() - return nil - }, blockPtr) - precondition(e == 0, "Unable to create thread") - - // Wait for completion and get the result. It will be either `nil` or bitPattern 1 - var rawResult: UnsafeMutableRawPointer? = nil - let e2 = pthread_join(handlerThread!, &rawResult) - precondition(e2 == 0, "Thread join failed") - return Int(bitPattern: rawResult) != 0 - } - - return caught ? BadInstructionException() : nil - } - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift deleted file mode 100644 index 12a6b9f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift +++ /dev/null @@ -1,63 +0,0 @@ -// -// 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/port.h -// #define MACH_PORT_RIGHT_RECEIVE ((mach_port_right_t) 1) -let MACH_PORT_RIGHT_RECEIVE: mach_port_right_t = 1 - -// 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)) -let MACH_MSG_TYPE_MAKE_SEND: UInt32 = 20 -func MACH_MSGH_BITS_REMOTE(_ bits: UInt32) -> UInt32 { return bits & UInt32(MACH_MSGH_BITS_REMOTE_MASK) } -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) -// #define EXCEPTION_DEFAULT 1 -let EXC_BAD_INSTRUCTION: UInt32 = 2 -let EXC_MASK_BAD_INSTRUCTION: UInt32 = 1 << EXC_BAD_INSTRUCTION -let EXCEPTION_DEFAULT: Int32 = 1 - -// From /usr/include/mach/i386/thread_status.h -// #define THREAD_STATE_NONE 13 -// #define x86_THREAD_STATE64_COUNT ((mach_msg_type_number_t) \ -// ( sizeof (x86_thread_state64_t) / sizeof (int) )) -let THREAD_STATE_NONE: Int32 = 13 -let x86_THREAD_STATE64_COUNT = UInt32(MemoryLayout.size / MemoryLayout.size) - -let EXC_TYPES_COUNT = 14 -struct execTypesCountTuple { - // From /usr/include/mach/i386/exception.h - // #define EXC_TYPES_COUNT 14 /* incl. illegal exception 0 */ - 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) - init() { - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Info.plist deleted file mode 100644 index f14cf1e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSHumanReadableCopyright - Copyright © 2016 Matt Gallagher. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c deleted file mode 100644 index 2334538..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c +++ /dev/null @@ -1,537 +0,0 @@ -/* - * IDENTIFICATION: - * stub generated Mon Jan 11 00:24:26 2016 - * with a MiG generated by bootstrap_cmds-93 - * OPTIONS: - */ - -/* Module mach_exc */ - -#if defined(__x86_64__) - -#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; - - 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h deleted file mode 100644 index 766ba11..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h +++ /dev/null @@ -1,298 +0,0 @@ -#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 */ - - -#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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/README.md deleted file mode 100644 index a1a9a70..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Lib/CwlPreconditionTesting/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# CwlPreconditionTesting - -A Mach exception handler, written in Swift and Objective-C, that allows `EXC_BAD_INSTRUCTION` (as raised by Swift's `assertionFailure`/`preconditionFailure`/`fatalError`) to be caught and tested. - -For an extended discussion of this code, please see the Cocoa with Love article: - -[Partial functions in Swift, Part 2: Catching precondition failures](http://cocoawithlove.com/blog/2016/02/02/partial-functions-part-two-catching-precondition-failures.html) - -## Usage - -The short version is: - -1. `git clone https://github.com/mattgallagher/CwlPreconditionTesting.git` -2. drag the "CwlPreconditionTesting.xcodeproj" file into your project's file tree in Xcode -3. go to your testing target's Build Phase settings and under "Target Dependencies" press the "+" button and select the relevant "CwlPreconditionTesting" target ("_iOS" or "_OSX", depending on your testing target's SDK) -4. write `import CwlPreconditionTesting` at the top of any test file where you want to use `catchBadInstruction` (Swift should handle the linkage automatically when you do this) -5. use the `catchBadInstruction` function as shown in the [CwlCatchBadInstructionTests.swift tests file](https://github.com/mattgallagher/CwlPreconditionTesting/blob/master/CwlPreconditionTestingTests/CwlCatchBadInstructionTests.swift?ts=4) - -### Project details - -The "CwlPreconditionTesting.xcodeproj" contains two targets: - -* CwlPreconditionTesting_OSX -* CwlPreconditionTesting_iOS - -both build a framework named "CwlPreconditionTesting.framework". If you're linking manually, be certain to select the "CwlPreconditionTesting.framework" from the appropriate target. - -Remember: the iOS build is useful only in the simulator. All Mach exception handling code will be conditionally excluded in any device build. - -### Static inclusion - -Due to the complications associated with needing to call into and out of Objective-C, static inclusion in other projects is not a single file nor a quick drag and drop. There's at least 7 files and you'll need to add some project settings. - -All of the following files: - -* CwlCatchBadInstruction.swift -* CwlCatchBadInstruction.h -* CwlCatchBadInstruction.m -* CwlCatchException.swift -* CwlCatchException.h -* CwlCatchException.m - -and either: - -* $(SDKROOT)/usr/include/mach/mach_exc.defs -* mach_excServer.c - -need to be added to the testing target for OS X projects or iOS projects, respectively. - -Your target will also need to have the following macros defined in the "Apple LLVM - Preprocessing" → "Preprocessor Macros" build setting: - - PRODUCT_NAME=$(PRODUCT_NAME) - -This lets the Objective-C file generate the include directive for the autogenerated Swift header so it can call back into Swift during the Mach exception handler callbacks. This macro should stay in sync if you change the target name but if you do anything else in your project that changes the name of the autogenerated Swift header independent of the target name (or you want to add spaces or other command-line complications to the target name), you'll want to update "CwlCatchBadInstruction.m" directly with the correct include directive. - -Additionally, you'll need a standard Objective-C "Bridging header" for your testing target and it will need to include the following import statements: - -``` -#if defined(__x86_64__) -#import -#endif - -#import -``` - -### Using POSIX signals and setjmp/longjmp - -For comparison or for anyone running this code on a platform without Mach exceptions or the Objective-C runtime, I've added a proof-of-concept implementation of `catchBadInstruction` that uses a POSIX SIGILL `sigaction` and `setjmp`/`longjmp` to perform the throw. - -In Xcode, you can simply select the CwlPreconditionTesting_POSIX target (instead of the OSX or iOS targets). If you're building without Xcode: all you need is the CwlCatchBadInstructionPOSIX.swift file (compared to the Mach exception handler, the code is tiny doesn't have any weird Objective-C/MiG file dependencies). - -**Warning No. 1**: on OS X, this approach can't be used when lldb is attached since lldb's Mach exception handler blocks the SIGILL from ever occurring (I've disabled the "Debug Executable" setting for the tests in Xcode - re-enable it to witness the problem). - -**Warning No. 2**: if you're switching between the CwlPreconditionTesting_OSX and CwlPreconditionTesting_POSIX targets, Xcode (as of Xcode 7.2.1) will not detect the change and will not remove the old framework correctly so you'll need to *clean your project* otherwise the old framework will hang around. - -Additional problems in decreasing severity include: - -* the signal handler is whole process (rather than correctly scoped to the thread where the "catch" occurs) -* the signal handler doesn't deal with re-entrancy whereas the mach exception handler remains deterministic in the face of multiple fatal errors -* the signal handler overwrites the "[red zone](https://en.wikipedia.org/wiki/Red_zone_(computing))" which is technically frowned upon in signal handlers (although unlikely to cause problems here) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift deleted file mode 100644 index 2e58fdf..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation - -/// Protocol for the assertion handler that Nimble uses for all expectations. -public protocol AssertionHandler { - func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) -} - -/// Global backing interface for assertions that Nimble creates. -/// Defaults to a private test handler that passes through to XCTest. -/// -/// If XCTest is not available, you must assign your own assertion handler -/// before using any matchers, otherwise Nimble will abort the program. -/// -/// @see AssertionHandler -public var NimbleAssertionHandler: AssertionHandler = { () -> AssertionHandler in - return isXCTestAvailable() ? NimbleXCTestHandler() : NimbleXCTestUnavailableHandler() -}() diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift deleted file mode 100644 index 2e30f61..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift +++ /dev/null @@ -1,20 +0,0 @@ - -/// AssertionDispatcher allows multiple AssertionHandlers to receive -/// assertion messages. -/// -/// @warning Does not fully dispatch if one of the handlers raises an exception. -/// This is possible with XCTest-based assertion handlers. -/// -public class AssertionDispatcher: AssertionHandler { - let handlers: [AssertionHandler] - - public init(handlers: [AssertionHandler]) { - self.handlers = handlers - } - - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - for handler in handlers { - handler.assert(assertion, message: message, location: location) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift deleted file mode 100644 index 7d0bab2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift +++ /dev/null @@ -1,100 +0,0 @@ -import Foundation - -/// A data structure that stores information about an assertion when -/// AssertionRecorder is set as the Nimble assertion handler. -/// -/// @see AssertionRecorder -/// @see AssertionHandler -public struct AssertionRecord: CustomStringConvertible { - /// Whether the assertion succeeded or failed - public let success: Bool - /// The failure message the assertion would display on failure. - public let message: FailureMessage - /// The source location the expectation occurred on. - public let location: SourceLocation - - public var description: String { - return "AssertionRecord { success=\(success), message='\(message.stringValue)', location=\(location) }" - } -} - -/// An AssertionHandler that silently records assertions that Nimble makes. -/// This is useful for testing failure messages for matchers. -/// -/// @see AssertionHandler -public class AssertionRecorder : AssertionHandler { - /// All the assertions that were captured by this recorder - public var assertions = [AssertionRecord]() - - public init() {} - - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - assertions.append( - AssertionRecord( - success: assertion, - message: message, - location: location)) - } -} - -/// Allows you to temporarily replace the current Nimble assertion handler with -/// the one provided for the scope of the closure. -/// -/// Once the closure finishes, then the original Nimble assertion handler is restored. -/// -/// @see AssertionHandler -public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler, closure: @escaping () throws -> Void) { - let environment = NimbleEnvironment.activeInstance - let oldRecorder = environment.assertionHandler - let capturer = NMBExceptionCapture(handler: nil, finally: ({ - environment.assertionHandler = oldRecorder - })) - environment.assertionHandler = tempAssertionHandler - capturer.tryBlock { - try! closure() - } -} - -/// Captures expectations that occur in the given closure. Note that all -/// expectations will still go through to the default Nimble handler. -/// -/// This can be useful if you want to gather information about expectations -/// that occur within a closure. -/// -/// @param silently expectations are no longer send to the default Nimble -/// assertion handler when this is true. Defaults to false. -/// -/// @see gatherFailingExpectations -public func gatherExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { - let previousRecorder = NimbleEnvironment.activeInstance.assertionHandler - let recorder = AssertionRecorder() - let handlers: [AssertionHandler] - - if silently { - handlers = [recorder] - } else { - handlers = [recorder, previousRecorder] - } - - let dispatcher = AssertionDispatcher(handlers: handlers) - withAssertionHandler(dispatcher, closure: closure) - return recorder.assertions -} - -/// Captures failed expectations that occur in the given closure. Note that all -/// expectations will still go through to the default Nimble handler. -/// -/// This can be useful if you want to gather information about failed -/// expectations that occur within a closure. -/// -/// @param silently expectations are no longer send to the default Nimble -/// assertion handler when this is true. Defaults to false. -/// -/// @see gatherExpectations -/// @see raiseException source for an example use case. -public func gatherFailingExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { - let assertions = gatherExpectations(silently: silently, closure: closure) - return assertions.filter { assertion in - !assertion.success - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift deleted file mode 100644 index 47d4eed..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift +++ /dev/null @@ -1,131 +0,0 @@ -import Foundation - -#if _runtime(_ObjC) - -internal struct ObjCMatcherWrapper : Matcher { - let matcher: NMBMatcher - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.matches( - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.doesNotMatch( - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) - } -} - -// Equivalent to Expectation, but for Nimble's Objective-C interface -public class NMBExpectation : NSObject { - internal let _actualBlock: () -> NSObject! - internal var _negative: Bool - internal let _file: FileString - internal let _line: UInt - internal var _timeout: TimeInterval = 1.0 - - public init(actualBlock: @escaping () -> NSObject!, negative: Bool, file: FileString, line: UInt) { - self._actualBlock = actualBlock - self._negative = negative - self._file = file - self._line = line - } - - private var expectValue: Expectation { - return expect(_file, line: _line){ - self._actualBlock() as NSObject? - } - } - - public var withTimeout: (TimeInterval) -> NMBExpectation { - return ({ timeout in self._timeout = timeout - return self - }) - } - - public var to: (NMBMatcher) -> Void { - return ({ matcher in - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher)) - }) - } - - public var toWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher), description: description) - }) - } - - public var toNot: (NMBMatcher) -> Void { - return ({ matcher in - self.expectValue.toNot( - ObjCMatcherWrapper(matcher: matcher) - ) - }) - } - - public var toNotWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - self.expectValue.toNot( - ObjCMatcherWrapper(matcher: matcher), description: description - ) - }) - } - - public var notTo: (NMBMatcher) -> Void { return toNot } - - public var notToWithDescription: (NMBMatcher, String) -> Void { return toNotWithDescription } - - public var toEventually: (NMBMatcher) -> Void { - return ({ matcher in - 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 - ) - }) - } - - public var toEventuallyNot: (NMBMatcher) -> Void { - return ({ matcher in - 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 - ) - }) - } - - public var toNotEventually: (NMBMatcher) -> Void { return toEventuallyNot } - - public var toNotEventuallyWithDescription: (NMBMatcher, String) -> Void { return toEventuallyNotWithDescription } - - public class func failWithMessage(_ message: String, file: FileString, line: UInt) { - fail(message, location: SourceLocation(file: file, line: line)) - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift deleted file mode 100644 index c609f69..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift +++ /dev/null @@ -1,81 +0,0 @@ -import Foundation - -#if _runtime(_ObjC) - -public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) -> Bool -public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) -> Bool - -public class NMBObjCMatcher : NSObject, NMBMatcher { - let _match: MatcherBlock - let _doesNotMatch: MatcherBlock - let canMatchNil: Bool - - public init(canMatchNil: Bool, matcher: @escaping MatcherBlock, notMatcher: @escaping MatcherBlock) { - self.canMatchNil = canMatchNil - self._match = matcher - self._doesNotMatch = notMatcher - } - - public convenience init(matcher: @escaping MatcherBlock) { - self.init(canMatchNil: true, matcher: matcher) - } - - public convenience init(canMatchNil: Bool, matcher: @escaping MatcherBlock) { - self.init(canMatchNil: canMatchNil, matcher: matcher, notMatcher: ({ actualExpression, failureMessage in - return !matcher(actualExpression, failureMessage) - })) - } - - public convenience init(matcher: @escaping FullMatcherBlock) { - self.init(canMatchNil: true, matcher: matcher) - } - - public convenience init(canMatchNil: Bool, matcher: @escaping FullMatcherBlock) { - self.init(canMatchNil: canMatchNil, matcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, false) - }), notMatcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, true) - })) - } - - private func canMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - do { - if !canMatchNil { - if try actualExpression.evaluate() == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - return false - } - } - } catch let error { - failureMessage.actualValue = "an unexpected error thrown: \(error)" - return false - } - return true - } - - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let expr = Expression(expression: actualBlock, location: location) - let result = _match( - expr, - failureMessage) - if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { - return result - } else { - return false - } - } - - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let expr = Expression(expression: actualBlock, location: location) - let result = _doesNotMatch( - expr, - failureMessage) - if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { - return result - } else { - return false - } - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift deleted file mode 100644 index a55cb27..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Dispatch -import Foundation - -/// "Global" state of Nimble is stored here. Only DSL functions should access / be aware of this -/// class' existance -internal class NimbleEnvironment { - static var activeInstance: NimbleEnvironment { - get { - let env = Thread.current.threadDictionary["NimbleEnvironment"] - if let env = env as? NimbleEnvironment { - return env - } else { - let newEnv = NimbleEnvironment() - self.activeInstance = newEnv - return newEnv - } - } - set { - Thread.current.threadDictionary["NimbleEnvironment"] = newValue - } - } - - // TODO: eventually migrate the global to this environment value - var assertionHandler: AssertionHandler { - get { return NimbleAssertionHandler } - set { NimbleAssertionHandler = newValue } - } - - var suppressTVOSAssertionWarning: Bool = false - var awaiter: Awaiter - - init() { - let timeoutQueue: DispatchQueue - if #available(OSX 10.10, *) { - timeoutQueue = DispatchQueue.global(qos: .userInitiated) - } else { - timeoutQueue = DispatchQueue.global(priority: .high) - } - - awaiter = Awaiter( - waitLock: AssertionWaitLock(), - asyncQueue: .main, - timeoutQueue: timeoutQueue) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift deleted file mode 100644 index 1aba8bc..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift +++ /dev/null @@ -1,77 +0,0 @@ -import Foundation -import XCTest - -/// Default handler for Nimble. This assertion handler passes failures along to -/// XCTest. -public class NimbleXCTestHandler : AssertionHandler { - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - if !assertion { - recordFailure("\(message.stringValue)\n", location: location) - } - } -} - -/// Alternative handler for Nimble. This assertion handler passes failures along -/// to XCTest by attempting to reduce the failure message size. -public class NimbleShortXCTestHandler: AssertionHandler { - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - if !assertion { - let msg: String - if let actual = message.actualValue { - msg = "got: \(actual) \(message.postfixActual)" - } else { - msg = "expected \(message.to) \(message.postfixMessage)" - } - recordFailure("\(msg)\n", location: location) - } - } -} - -/// Fallback handler in case XCTest is unavailable. This assertion handler will abort -/// the program if it is invoked. -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 -@objc final internal class CurrentTestCaseTracker: NSObject, XCTestObservation { - @objc static let sharedInstance = CurrentTestCaseTracker() - - private(set) var currentTestCase: XCTestCase? - - @objc func testCaseWillStart(_ testCase: XCTestCase) { - currentTestCase = testCase - } - - @objc func testCaseDidFinish(_ testCase: XCTestCase) { - currentTestCase = nil - } -} -#endif - - -func isXCTestAvailable() -> Bool { -#if _runtime(_ObjC) - // XCTest is weakly linked and so may not be present - return NSClassFromString("XCTestCase") != nil -#else - return true -#endif -} - -private func recordFailure(_ message: String, location: SourceLocation) { -#if _runtime(_ObjC) - if let testCase = CurrentTestCaseTracker.sharedInstance.currentTestCase { - testCase.recordFailure(withDescription: message, inFile: location.file, atLine: location.line, expected: true) - } else { - let msg = "Attempted to report a test failure to XCTest while no test case was running. " + - "The failure was:\n\"\(message)\"\nIt occurred at: \(location.file):\(location.line)" - NSException(name: .internalInconsistencyException, reason: msg, userInfo: nil).raise() - } -#else - XCTFail("\(message)\n", file: location.file, line: location.line) -#endif -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift deleted file mode 100644 index dd02aa4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -#if !_runtime(_ObjC) -// swift-corelibs-foundation doesn't provide NSException at all, so provide a dummy -class NSException {} -#endif - -// NOTE: This file is not intended to be included in the Xcode project. It -// is picked up by the Swift Package Manager during its build process. - -/// A dummy reimplementation of the `NMBExceptionCapture` class to serve -/// as a stand-in for build and runtime environments that don't support -/// Objective C. -internal class ExceptionCapture { - let finally: (() -> Void)? - - init(handler: ((NSException) -> Void)?, finally: (() -> Void)?) { - self.finally = finally - } - - func tryBlock(_ unsafeBlock: (() -> Void)) { - // We have no way of handling Objective C exceptions in Swift, - // so we just go ahead and run the unsafeBlock as-is - unsafeBlock() - - finally?() - } -} - -/// Compatibility with the actual Objective-C implementation -typealias NMBExceptionCapture = ExceptionCapture diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/DSL+Wait.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/DSL+Wait.swift deleted file mode 100644 index 619b6dc..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/DSL+Wait.swift +++ /dev/null @@ -1,98 +0,0 @@ -import Dispatch -import Foundation - -private enum ErrorResult { - case exception(NSException) - case error(Error) - case none -} - -/// Only classes, protocols, methods, properties, and subscript declarations can be -/// bridges to Objective-C via the @objc keyword. This class encapsulates callback-style -/// asynchronous waiting logic so that it may be called from Objective-C and Swift. -internal class NMBWait: NSObject { - internal class func until( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) -> Void) -> Void { - return throwableUntil(timeout: timeout, file: file, line: line) { done in - action(done) - } - } - - // Using a throwable closure makes this method not objc compatible. - internal class func throwableUntil( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) throws -> Void) -> Void { - let awaiter = NimbleEnvironment.activeInstance.awaiter - let leeway = timeout / 2.0 - let result = awaiter.performBlock { (done: @escaping (ErrorResult) -> Void) throws -> Void in - DispatchQueue.main.async { - let capture = NMBExceptionCapture( - handler: ({ exception in - done(.exception(exception)) - }), - finally: ({ }) - ) - capture.tryBlock { - do { - try action() { - done(.none) - } - } catch let e { - done(.error(e)) - } - } - } - }.timeout(timeout, forcefullyAbortTimeout: leeway).wait("waitUntil(...)", file: file, line: line) - - switch result { - case .incomplete: internalError("Reached .incomplete state for waitUntil(...).") - case .blockedRunLoop: - fail(blockedRunLoopErrorMessageFor("-waitUntil()", leeway: leeway), - file: file, line: line) - case .timedOut: - let pluralize = (timeout == 1 ? "" : "s") - fail("Waited more than \(timeout) second\(pluralize)", file: file, line: line) - case let .raisedException(exception): - fail("Unexpected exception raised: \(exception)") - case let .errorThrown(error): - fail("Unexpected error thrown: \(error)") - case .completed(.exception(let exception)): - fail("Unexpected exception raised: \(exception)") - case .completed(.error(let error)): - fail("Unexpected error thrown: \(error)") - case .completed(.none): // success - break - } - } - - #if _runtime(_ObjC) - @objc(untilFile:line:action:) - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) -> Void { - until(timeout: 1, file: file, line: line, action: action) - } - #else - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) -> Void { - until(timeout: 1, file: file, line: line, action: action) - } - #endif -} - -internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterval) -> String { - return "\(fnName) timed out but was unable to run the timeout handler because the main thread is unresponsive (\(leeway) seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." -} - -/// Wait asynchronously until the done closure is called or the timeout has been reached. -/// -/// @discussion -/// Call the done() closure to indicate the waiting has completed. -/// -/// 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 { - NMBWait.until(timeout: timeout, file: file, line: line, action: action) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/DSL.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/DSL.swift deleted file mode 100644 index 7ebd684..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/DSL.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation - -/// Make an expectation on a given actual value. The value given is lazily evaluated. -public func expect(_ expression: @autoclosure @escaping () throws -> T?, file: FileString = #file, line: UInt = #line) -> Expectation { - return Expectation( - expression: Expression( - expression: expression, - location: SourceLocation(file: file, line: line), - isClosure: true)) -} - -/// Make an expectation on a given actual value. The closure is lazily invoked. -public func expect(_ file: FileString = #file, line: UInt = #line, expression: @escaping () throws -> T?) -> Expectation { - return Expectation( - expression: Expression( - expression: expression, - location: SourceLocation(file: file, line: line), - isClosure: true)) -} - -/// Always fails the test with a message and a specified location. -public func fail(_ message: String, location: SourceLocation) { - let handler = NimbleEnvironment.activeInstance.assertionHandler - handler.assert(false, message: FailureMessage(stringValue: message), location: location) -} - -/// Always fails the test with a message. -public func fail(_ message: String, file: FileString = #file, line: UInt = #line) { - fail(message, location: SourceLocation(file: file, line: line)) -} - -/// Always fails the test. -public func fail(_ file: FileString = #file, line: UInt = #line) { - fail("fail() always fails", file: file, line: line) -} - -/// Like Swift's precondition(), but raises NSExceptions instead of sigaborts -internal func nimblePrecondition( - _ expr: @autoclosure() -> Bool, - _ name: @autoclosure() -> String, - _ message: @autoclosure() -> String, - file: StaticString = #file, - line: UInt = #line) { - let result = expr() - if !result { -#if _runtime(_ObjC) - let e = NSException( - name: NSExceptionName(name()), - reason: message(), - userInfo: nil) - e.raise() -#else - preconditionFailure("\(name()) - \(message())", file: file, line: line) -#endif - } -} - -internal func internalError(_ msg: String, file: FileString = #file, line: UInt = #line) -> Never { - fatalError( - "Nimble Bug Found: \(msg) at \(file):\(line).\n" + - "Please file a bug to Nimble: https://github.com/Quick/Nimble/issues with the " + - "code snippet that caused this error." - ) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Expectation.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Expectation.swift deleted file mode 100644 index 16d7c3b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Expectation.swift +++ /dev/null @@ -1,76 +0,0 @@ -import Foundation - -internal func expressionMatches(_ expression: Expression, matcher: U, to: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T -{ - let msg = FailureMessage() - msg.userDescription = description - msg.to = to - do { - let pass = try matcher.matches(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" - } - return (pass, msg) - } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" - return (false, msg) - } -} - -internal func expressionDoesNotMatch(_ expression: Expression, matcher: U, toNot: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T -{ - let msg = FailureMessage() - msg.userDescription = description - msg.to = toNot - do { - let pass = try matcher.doesNotMatch(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" - } - return (pass, msg) - } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" - return (false, msg) - } -} - -public struct Expectation { - - public let expression: Expression - - public func verify(_ pass: Bool, _ message: FailureMessage) { - let handler = NimbleEnvironment.activeInstance.assertionHandler - handler.assert(pass, message: message, location: expression.location) - } - - /// Tests the actual value using a matcher to match. - public func to(_ matcher: U, description: String? = nil) - where U: Matcher, U.ValueType == T - { - let (pass, msg) = expressionMatches(expression, matcher: matcher, to: "to", description: description) - verify(pass, msg) - } - - /// Tests the actual value using a matcher to not match. - public func toNot(_ matcher: U, description: String? = nil) - 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. - /// - /// Alias to toNot(). - public func notTo(_ matcher: U, description: String? = nil) - where U: Matcher, U.ValueType == T - { - toNot(matcher, description: description) - } - - // see: - // - AsyncMatcherWrapper for extension - // - NMBExpectation for Objective-C interface -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Expression.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Expression.swift deleted file mode 100644 index 8ba53e4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Expression.swift +++ /dev/null @@ -1,90 +0,0 @@ -import Foundation - -// Memoizes the given closure, only calling the passed -// closure once; even if repeat calls to the returned closure -internal func memoizedClosure(_ closure: @escaping () throws -> T) -> (Bool) throws -> T { - var cache: T? - return ({ withoutCaching in - if (withoutCaching || cache == nil) { - cache = try closure() - } - return cache! - }) -} - -/// Expression represents the closure of the value inside expect(...). -/// Expressions are memoized by default. This makes them safe to call -/// evaluate() multiple times without causing a re-evaluation of the underlying -/// closure. -/// -/// @warning Since the closure can be any code, Objective-C code may choose -/// to raise an exception. Currently, Expression does not memoize -/// exception raising. -/// -/// This provides a common consumable API for matchers to utilize to allow -/// Nimble to change internals to how the captured closure is managed. -public struct Expression { - internal let _expression: (Bool) throws -> T? - internal let _withoutCaching: Bool - public let location: SourceLocation - public let isClosure: Bool - - /// Creates a new expression struct. Normally, expect(...) will manage this - /// creation process. The expression is memoized. - /// - /// @param expression The closure that produces a given value. - /// @param location The source location that this closure originates from. - /// @param isClosure A bool indicating if the captured expression is a - /// closure or internally produced closure. Some matchers - /// may require closures. For example, toEventually() - /// requires an explicit closure. This gives Nimble - /// flexibility if @autoclosure behavior changes between - /// Swift versions. Nimble internals always sets this true. - public init(expression: @escaping () throws -> T?, location: SourceLocation, isClosure: Bool = true) { - self._expression = memoizedClosure(expression) - self.location = location - self._withoutCaching = false - self.isClosure = isClosure - } - - /// Creates a new expression struct. Normally, expect(...) will manage this - /// creation process. - /// - /// @param expression The closure that produces a given value. - /// @param location The source location that this closure originates from. - /// @param withoutCaching Indicates if the struct should memoize the given - /// closure's result. Subsequent evaluate() calls will - /// not call the given closure if this is true. - /// @param isClosure A bool indicating if the captured expression is a - /// closure or internally produced closure. Some matchers - /// may require closures. For example, toEventually() - /// requires an explicit closure. This gives Nimble - /// flexibility if @autoclosure behavior changes between - /// Swift versions. Nimble internals always sets this true. - public init(memoizedExpression: @escaping (Bool) throws -> T?, location: SourceLocation, withoutCaching: Bool, isClosure: Bool = true) { - self._expression = memoizedExpression - self.location = location - self._withoutCaching = withoutCaching - self.isClosure = isClosure - } - - /// Returns a new Expression from the given expression. Identical to a map() - /// on this type. This should be used only to typecast the Expression's - /// closure value. - /// - /// The returned expression will preserve location and isClosure. - /// - /// @param block The block that can cast the current Expression value to a - /// new type. - public func cast(_ block: @escaping (T?) throws -> U?) -> Expression { - return Expression(expression: ({ try block(self.evaluate()) }), location: self.location, isClosure: self.isClosure) - } - - public func evaluate() throws -> T? { - return try self._expression(_withoutCaching) - } - - public func withoutCaching() -> Expression { - return Expression(memoizedExpression: self._expression, location: location, withoutCaching: true, isClosure: isClosure) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/FailureMessage.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/FailureMessage.swift deleted file mode 100644 index 2d245e5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/FailureMessage.swift +++ /dev/null @@ -1,65 +0,0 @@ -import Foundation - -/// Encapsulates the failure message that matchers can report to the end user. -/// -/// This is shared state between Nimble and matchers that mutate this value. -public class FailureMessage: NSObject { - public var expected: String = "expected" - public var actualValue: String? = "" // empty string -> use default; nil -> exclude - public var to: String = "to" - public var postfixMessage: String = "match" - public var postfixActual: String = "" - /// 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 stringValue: String { - get { - if let value = _stringValueOverride { - return value - } else { - return computeStringValue() - } - } - set { - _stringValueOverride = newValue - } - } - - internal var _stringValueOverride: String? - - public override init() { - } - - public init(stringValue: String) { - _stringValueOverride = stringValue - } - - internal func stripNewlines(_ str: String) -> String { - let whitespaces = CharacterSet.whitespacesAndNewlines - return str - .components(separatedBy: "\n") - .map { line in line.trimmingCharacters(in: whitespaces) } - .joined(separator: "") - } - - internal func computeStringValue() -> String { - var value = "\(expected) \(to) \(postfixMessage)" - if let actualValue = actualValue { - value = "\(expected) \(to) \(postfixMessage), got \(actualValue)\(postfixActual)" - } - value = stripNewlines(value) - - if let extendedMessage = extendedMessage { - value += "\n\(stripNewlines(extendedMessage))" - } - - if let userDescription = userDescription { - return "\(userDescription)\n\(value)" - } - - return value - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Info.plist deleted file mode 100644 index 6ac80b8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSHumanReadableCopyright - Copyright © 2014 Jeff Hui. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AllPass.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AllPass.swift deleted file mode 100644 index 3a9258d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AllPass.swift +++ /dev/null @@ -1,100 +0,0 @@ -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 - (_ 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 - (_ matcher: V) -> NonNilMatcherFunc - where U: Sequence, V: Matcher, U.Iterator.Element == V.ValueType -{ - return createAllPassMatcher() { - try matcher.matches($0, failureMessage: $1) - } -} - -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() { - 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 - } - } - failureMessage.postfixMessage = "all \(failureMessage.postfixMessage)" - } else { - failureMessage.postfixMessage = "all pass (use beNil() to match nils)" - return false - } - - return true - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func allPassMatcher(_ matcher: NMBObjCMatcher) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage 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) - while let obj = generator.next() { - if let nsObject = obj as? NSObject { - nsObjects.append(nsObject) - } else { - collectionIsUsable = false - break - } - } - } else { - collectionIsUsable = false - } - - if !collectionIsUsable { - failureMessage.postfixMessage = - "allPass only works with NSFastEnumeration (NSArray, NSSet, ...) of NSObjects" - failureMessage.expected = "" - failureMessage.to = "" - return false - } - - 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) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift deleted file mode 100644 index 6b89c76..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift +++ /dev/null @@ -1,146 +0,0 @@ -import Foundation - -/// If you are running on a slower machine, it could be useful to increase the default timeout value -/// or slow down poll interval. Default timeout interval is 1, and poll interval is 0.01. -public struct AsyncDefaults { - public static var Timeout: TimeInterval = 1 - public static var PollInterval: TimeInterval = 0.01 -} - -internal struct AsyncMatcherWrapper: Matcher - where U: Matcher, U.ValueType == T -{ - let fullMatcher: U - let timeoutInterval: TimeInterval - let pollInterval: TimeInterval - - init(fullMatcher: U, timeoutInterval: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval) { - self.fullMatcher = fullMatcher - self.timeoutInterval = timeoutInterval - self.pollInterval = pollInterval - } - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let fnName = "expect(...).toEventually(...)" - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: fnName) { - try self.fullMatcher.matches(uncachedExpression, failureMessage: failureMessage) - } - switch (result) { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventually(...).") - } - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: "expect(...).toEventuallyNot(...)") { - try self.fullMatcher.doesNotMatch(uncachedExpression, failureMessage: failureMessage) - } - switch (result) { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventuallyNot(...).") - } - } -} - -private let toEventuallyRequiresClosureError = FailureMessage(stringValue: "expect(...).toEventually(...) requires an explicit closure (eg - expect { ... }.toEventually(...) )\nSwift 1.2 @autoclosure behavior has changed in an incompatible way for Nimble to function") - - -extension Expectation { - /// Tests the actual value using a matcher to match by checking continuously - /// at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T - { - if expression.isClosure { - let (pass, msg) = expressionMatches( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - to: "to eventually", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventuallyNot(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T - { - if expression.isClosure { - let (pass, msg) = expressionDoesNotMatch( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - toNot: "to eventually not", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// Alias of toEventuallyNot() - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toNotEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T - { - return toEventuallyNot(matcher, timeout: timeout, pollInterval: pollInterval, description: description) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift deleted file mode 100644 index 99b8f8f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift +++ /dev/null @@ -1,38 +0,0 @@ -import Foundation - -#if _runtime(_ObjC) - -// 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 - } -} - -/// 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 - let instance = try actualExpression.evaluate() - if let validInstance = instance { - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" - } else { - failureMessage.actualValue = "" - } - failureMessage.postfixMessage = "be a kind of \(String(describing: expectedClass))" - return instance != nil && instance!.isKind(of: expectedClass) - } -} - -extension NMBObjCMatcher { - public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAKindOf(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift deleted file mode 100644 index 2298c78..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift +++ /dev/null @@ -1,40 +0,0 @@ -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 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 - let instance = try actualExpression.evaluate() - if let validInstance = instance { - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" - } else { - failureMessage.actualValue = "" - } - 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) -extension NMBObjCMatcher { - public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAnInstanceOf(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift deleted file mode 100644 index 48e9895..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift +++ /dev/null @@ -1,122 +0,0 @@ -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 -} - -/// 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) - } -} - -/// 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: NMBDoubleConvertible, within delta: Double = DefaultDelta) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta, failureMessage: failureMessage) - } -} - -#if _runtime(_ObjC) -public class NMBObjCBeCloseToMatcher : NSObject, NMBMatcher { - var _expected: NSNumber - var _delta: CDouble - init(expected: NSNumber, within: CDouble) { - _expected = expected - _delta = within - } - - public func matches(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.matches(expr, failureMessage: failureMessage) - } - - public func doesNotMatch(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.doesNotMatch(expr, failureMessage: failureMessage) - } - - public var within: (CDouble) -> NMBObjCBeCloseToMatcher { - return ({ delta in - return NMBObjCBeCloseToMatcher(expected: self._expected, within: delta) - }) - } -} - -extension NMBObjCMatcher { - public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToMatcher { - return NMBObjCBeCloseToMatcher(expected: expected, within: within) - } -} -#endif - -public func beCloseTo(_ expectedValues: [Double], within delta: Double = DefaultDelta) -> NonNilMatcherFunc <[Double]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be close to <\(stringify(expectedValues))> (each within \(stringify(delta)))" - if let actual = try actualExpression.evaluate() { - failureMessage.actualValue = "<\(stringify(actual))>" - - if actual.count != expectedValues.count { - return false - } else { - for (index, actualItem) in actual.enumerated() { - if fabs(actualItem - expectedValues[index]) > delta { - return false - } - } - return true - } - } - return false - } -} - -// MARK: - Operators - -infix operator ≈ : ComparisonPrecedence - -public func ≈(lhs: Expectation<[Double]>, rhs: [Double]) { - lhs.to(beCloseTo(rhs)) -} - -public func ≈(lhs: Expectation, rhs: NMBDoubleConvertible) { - lhs.to(beCloseTo(rhs)) -} - -public func ≈(lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) -} - -public func ==(lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) -} - -// make this higher precedence than exponents so the Doubles either end aren't pulled in -// unexpectantly -precedencegroup PlusMinusOperatorPrecedence { - higherThan: BitwiseShiftPrecedence -} - -infix operator ± : PlusMinusOperatorPrecedence -public func ±(lhs: NMBDoubleConvertible, rhs: Double) -> (expected: NMBDoubleConvertible, delta: Double) { - return (expected: lhs, delta: rhs) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeEmpty.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeEmpty.swift deleted file mode 100644 index 19df0d2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeEmpty.swift +++ /dev/null @@ -1,92 +0,0 @@ -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" - let actualSeq = try actualExpression.evaluate() - if actualSeq == nil { - return true - } - var generator = actualSeq!.makeIterator() - return 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" - let actualString = try actualExpression.evaluate() - return 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" - let actualString = try actualExpression.evaluate() - return actualString == nil || actualString!.length == 0 - } -} - -// Without specific overrides, beEmpty() is ambiguous for NSDictionary, NSArray, -// etc, since they conform to Sequence as well as NMBCollection. - -/// 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" - let actualDictionary = try actualExpression.evaluate() - return 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" - let actualArray = try actualExpression.evaluate() - return 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" - let actual = try actualExpression.evaluate() - return actual == nil || actual!.count == 0 - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beEmptyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage 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) - } else if let value = actualValue as? NSString { - let expr = Expression(expression: ({ value as String }), location: location) - return try! beEmpty().matches(expr, failureMessage: failureMessage) - } 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" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift deleted file mode 100644 index 1345199..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift +++ /dev/null @@ -1,42 +0,0 @@ -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))>" - if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual > expected - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual value is greater than the expected value. -public func beGreaterThan(_ expectedValue: NMBComparable?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedDescending - return matches - } -} - -public func >(lhs: Expectation, rhs: T) { - lhs.to(beGreaterThan(rhs)) -} - -public func >(lhs: Expectation, rhs: NMBComparable?) { - lhs.to(beGreaterThan(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThan(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift deleted file mode 100644 index 2949fce..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is greater than -/// or equal to the expected value. -public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - if let actual = actualValue, let expected = expectedValue { - return actual >= expected - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual value is greater than -/// or equal to the expected value. -public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedAscending - return matches - } -} - -public func >=(lhs: Expectation, rhs: T) { - lhs.to(beGreaterThanOrEqualTo(rhs)) -} - -public func >=(lhs: Expectation, rhs: T) { - lhs.to(beGreaterThanOrEqualTo(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift deleted file mode 100644 index ca3357b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift +++ /dev/null @@ -1,47 +0,0 @@ -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 - #if os(Linux) - let actual = try actualExpression.evaluate() as? AnyObject - #else - let actual = try actualExpression.evaluate() as AnyObject? - #endif - failureMessage.actualValue = "\(identityAsString(actual))" - failureMessage.postfixMessage = "be identical to \(identityAsString(expected))" - #if os(Linux) - return actual === (expected as? AnyObject) && actual !== nil - #else - return actual === (expected as AnyObject?) && actual !== nil - #endif - } -} - -public func ===(lhs: Expectation, rhs: Any?) { - lhs.to(beIdenticalTo(rhs)) -} -public func !==(lhs: Expectation, rhs: Any?) { - lhs.toNot(beIdenticalTo(rhs)) -} - -/// A Nimble matcher that succeeds when the actual value is the same instance -/// as the expected instance. -/// -/// Alias for "beIdenticalTo". -public func be(_ expected: Any?) -> NonNilMatcherFunc { - return beIdenticalTo(expected) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let aExpr = actualExpression.cast { $0 as Any? } - return try! beIdenticalTo(expected).matches(aExpr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThan.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThan.swift deleted file mode 100644 index fbcd7c7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThan.swift +++ /dev/null @@ -1,41 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is less than the expected value. -public func beLessThan(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" - if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual < expected - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual value is less than the expected value. -public func beLessThan(_ expectedValue: NMBComparable?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedAscending - return matches - } -} - -public func <(lhs: Expectation, rhs: T) { - lhs.to(beLessThan(rhs)) -} - -public func <(lhs: Expectation, rhs: NMBComparable?) { - lhs.to(beLessThan(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThan(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift deleted file mode 100644 index a0cd2f0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift +++ /dev/null @@ -1,42 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is less than -/// or equal to the expected value. -public func beLessThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" - if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual <= expected - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual value is less than -/// or equal to the expected value. -public func beLessThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - return actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedDescending - } -} - -public func <=(lhs: Expectation, rhs: T) { - lhs.to(beLessThanOrEqualTo(rhs)) -} - -public func <=(lhs: Expectation, rhs: T) { - lhs.to(beLessThanOrEqualTo(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil:false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLogical.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLogical.swift deleted file mode 100644 index 49272a3..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeLogical.swift +++ /dev/null @@ -1,173 +0,0 @@ -import Foundation - -extension Int8: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int8Value - } -} - -extension UInt8: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint8Value - } -} - -extension Int16: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int16Value - } -} - -extension UInt16: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint16Value - } -} - -extension Int32: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int32Value - } -} - -extension UInt32: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint32Value - } -} - -extension Int64: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int64Value - } -} - -extension UInt64: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint64Value - } -} - -extension Float: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).floatValue - } -} - -extension Double: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).doubleValue - } -} - -extension Int: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).intValue - } -} - -extension UInt: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uintValue - } -} - -internal func matcherWithFailureMessage(_ matcher: NonNilMatcherFunc, postprocessor: @escaping (FailureMessage) -> Void) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - defer { postprocessor(failureMessage) } - return try matcher.matcher(actualExpression, failureMessage) - } -} - -// 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" - } -} - -/// 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" - } -} - -// 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" - let actualValue = try actualExpression.evaluate() - if let actualValue = actualValue { - // FIXME: This is a workaround to SR-2290. - // See: - // - 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 actualValue == (true as T) - } - return 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" - let actualValue = try actualExpression.evaluate() - if let actualValue = actualValue { - // FIXME: This is a workaround to SR-2290. - // See: - // - 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 actualValue == (false as T) - } - return actualValue == nil - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beTruthyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTruthy().matches(expr, failureMessage: failureMessage) - } - } - - public class func beFalsyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalsy().matches(expr, failureMessage: failureMessage) - } - } - - public class func beTrueMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTrue().matches(expr, failureMessage: failureMessage) - } - } - - public class func beFalseMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalse().matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeNil.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeNil.swift deleted file mode 100644 index a6fb31f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeNil.swift +++ /dev/null @@ -1,20 +0,0 @@ -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" - let actualValue = try actualExpression.evaluate() - return actualValue == nil - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - return try! beNil().matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeVoid.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeVoid.swift deleted file mode 100644 index 8f86265..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeVoid.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is Void. -public func beVoid() -> MatcherFunc<()> { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be void" - let actualValue: ()? = try actualExpression.evaluate() - return actualValue != nil - } -} - -public func ==(lhs: Expectation<()>, rhs: ()) { - lhs.to(beVoid()) -} - -public func !=(lhs: Expectation<()>, rhs: ()) { - lhs.toNot(beVoid()) -} \ No newline at end of file diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeginWith.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeginWith.swift deleted file mode 100644 index ef6c603..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/BeginWith.swift +++ /dev/null @@ -1,65 +0,0 @@ -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)>" - if let actualValue = try actualExpression.evaluate() { - var actualGenerator = actualValue.makeIterator() - return actualGenerator.next() == startingElement - } - return false - } -} - -/// 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 } - #if os(Linux) - guard let collectionValue = collection.object(at: 0) as? NSObject else { - return false - } - #else - let collectionValue = collection.object(at: 0) as AnyObject - #endif - return 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)>" - if let actual = try actualExpression.evaluate() { - let range = actual.range(of: startingSubstring) - return range != nil && range!.lowerBound == actual.startIndex - } - return false - } -} - -#if _runtime(_ObjC) -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 { - let expr = actualExpression.cast { $0 as? String } - return try! beginWith(expected as! String).matches(expr, failureMessage: failureMessage) - } else { - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! beginWith(expected).matches(expr, failureMessage: failureMessage) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Contain.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Contain.swift deleted file mode 100644 index 4400d30..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Contain.swift +++ /dev/null @@ -1,96 +0,0 @@ -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 -{ - return contain(items) -} - -public func contain(_ items: [T]) -> NonNilMatcherFunc - where S.Iterator.Element == T -{ - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" - if let actual = try actualExpression.evaluate() { - return items.all { - return actual.contains($0) - } - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: String...) -> NonNilMatcherFunc { - return contain(substrings) -} - -public func contain(_ substrings: [String]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" - if let actual = try actualExpression.evaluate() { - return substrings.all { - let range = actual.range(of: $0) - return range != nil && !range!.isEmpty - } - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: NSString...) -> NonNilMatcherFunc { - return contain(substrings) -} - -public func contain(_ substrings: [NSString]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { 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 - } -} - -/// A Nimble matcher that succeeds when the actual collection contains the expected object. -public func contain(_ items: Any?...) -> NonNilMatcherFunc { - return contain(items) -} - -public func contain(_ items: [Any?]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" - guard let actual = try actualExpression.evaluate() else { return false } - return items.all { item in - return item != nil && actual.contains(item!) - } - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func containMatcher(_ expected: [NSObject]) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - if let value = actualValue as? NMBContainer { - let expr = Expression(expression: ({ value as NMBContainer }), location: location) - - // A straightforward cast on the array causes this to crash, so we have to cast the individual items - let expectedOptionals: [Any?] = expected.map({ $0 as Any? }) - return try! contain(expectedOptionals).matches(expr, failureMessage: failureMessage) - } else if let value = actualValue as? NSString { - let expr = Expression(expression: ({ value as String }), location: location) - return try! contain(expected as! [String]).matches(expr, failureMessage: failureMessage) - } else if actualValue != nil { - failureMessage.postfixMessage = "contain <\(arrayAsString(expected))> (only works for NSArrays, NSSets, NSHashTables, and NSStrings)" - } else { - failureMessage.postfixMessage = "contain <\(arrayAsString(expected))>" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/EndWith.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/EndWith.swift deleted file mode 100644 index b96e96c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/EndWith.swift +++ /dev/null @@ -1,75 +0,0 @@ -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 - failureMessage.postfixMessage = "end with <\(endingElement)>" - - if let actualValue = try actualExpression.evaluate() { - var actualGenerator = actualValue.makeIterator() - var lastItem: T? - var item: T? - repeat { - lastItem = item - item = actualGenerator.next() - } while(item != nil) - - return lastItem == endingElement - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual collection's last element -/// is equal to the expected object. -public func endWith(_ endingElement: Any) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingElement)>" - guard let collection = try actualExpression.evaluate() else { return false } - guard collection.count > 0 else { return false } - #if os(Linux) - guard let collectionValue = collection.object(at: collection.count - 1) as? NSObject else { - return false - } - #else - let collectionValue = collection.object(at: collection.count - 1) as AnyObject - #endif - - return collectionValue.isEqual(endingElement) - } -} - - -/// A Nimble matcher that succeeds when the actual string contains the expected substring -/// where the expected substring's location is the actual string's length minus the -/// expected substring's length. -public func endWith(_ endingSubstring: String) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingSubstring)>" - if let collection = try actualExpression.evaluate() { - return collection.hasSuffix(endingSubstring) - } - return false - } -} - -#if _runtime(_ObjC) -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 { - let expr = actualExpression.cast { $0 as? String } - return try! endWith(expected as! String).matches(expr, failureMessage: failureMessage) - } else { - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! endWith(expected).matches(expr, failureMessage: failureMessage) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Equal.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Equal.swift deleted file mode 100644 index 53579e0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Equal.swift +++ /dev/null @@ -1,181 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is equal to the expected value. -/// 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))>" - let actualValue = try actualExpression.evaluate() - let matches = actualValue == expectedValue && expectedValue != nil - if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - return false - } - return matches - } -} - -/// A Nimble matcher that succeeds when the actual value is equal to the expected value. -/// 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))>" - let actualValue = try actualExpression.evaluate() - if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - return false - } - return expectedValue! == actualValue! - } -} - -/// A Nimble matcher that succeeds when the actual collection is equal to the expected collection. -/// Items must implement the Equatable protocol. -public func equal(_ expectedValue: [T]?) -> NonNilMatcherFunc<[T]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - return false - } - return expectedValue! == actualValue! - } -} - -/// A Nimble matcher allowing comparison of collection with optional type -public func equal(_ expectedValue: [T?]) -> NonNilMatcherFunc<[T?]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" - if let actualValue = try actualExpression.evaluate() { - if expectedValue.count != actualValue.count { - return false - } - - for (index, item) in actualValue.enumerated() { - let otherItem = expectedValue[index] - if item == nil && otherItem == nil { - continue - } else if item == nil && otherItem != nil { - return false - } else if item != nil && otherItem == nil { - return false - } else if item! != otherItem! { - return false - } - } - - return true - } else { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - - return false - } -} - -/// A Nimble matcher that succeeds when the actual set is equal to the expected set. -public func equal(_ expectedValue: Set?) -> NonNilMatcherFunc> { - 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> { - return equal(expectedValue, stringify: { - if let set = $0 { - return stringify(Array(set).sorted { $0 < $1 }) - } else { - return "nil" - } - }) -} - -private func equal(_ expectedValue: Set?, stringify: @escaping (Set?) -> String) -> NonNilMatcherFunc> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" - - if let expectedValue = expectedValue { - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "<\(stringify(actualValue))>" - - if expectedValue == actualValue { - return true - } - - let missing = expectedValue.subtracting(actualValue) - if missing.count > 0 { - failureMessage.postfixActual += ", missing <\(stringify(missing))>" - } - - let extra = actualValue.subtracting(expectedValue) - if extra.count > 0 { - failureMessage.postfixActual += ", extra <\(stringify(extra))>" - } - } - } else { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - - return false - } -} - -public func ==(lhs: Expectation, rhs: T?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation, rhs: T?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation<[T]>, rhs: [T]?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation<[T]>, rhs: [T]?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation>, rhs: Set?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation>, rhs: Set?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation>, rhs: Set?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation>, rhs: Set?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation<[T: C]>, rhs: [T: C]?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { - lhs.toNot(equal(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! equal(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/HaveCount.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/HaveCount.swift deleted file mode 100644 index 5b24af2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/HaveCount.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Foundation - -// The `haveCount` matchers do not print the full string representation of the collection value, -// instead they only print the type name and the expected count. This makes it easier to understand -// the reason for failed expectations. See: https://github.com/Quick/Nimble/issues/308. -// The representation of the collection content is provided in a new line as an `extendedMessage`. - -/// 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 - if let actualValue = try actualExpression.evaluate() { - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" - let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result - } else { - return false - } - } -} - -/// 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 - if let actualValue = try actualExpression.evaluate() { - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" - let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result - } else { - return false - } - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func haveCountMatcher(_ expected: NSNumber) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - if let value = actualValue as? NMBCollection { - let expr = Expression(expression: ({ value as NMBCollection}), location: location) - return try! haveCount(expected.intValue).matches(expr, failureMessage: failureMessage) - } else if let actualValue = actualValue { - failureMessage.postfixMessage = "get type of NSArray, NSSet, NSDictionary, or NSHashTable" - failureMessage.actualValue = "\(String(describing: type(of: actualValue)))" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Match.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Match.swift deleted file mode 100644 index 3ad5fb5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/Match.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual string satisfies the regular expression -/// described by the expected string. -public func match(_ expectedValue: String?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "match <\(stringify(expectedValue))>" - - if let actual = try actualExpression.evaluate() { - if let regexp = expectedValue { - return actual.range(of: regexp, options: .regularExpression) != nil - } - } - - return false - } -} - -#if _runtime(_ObjC) - -extension NMBObjCMatcher { - public class func matchMatcher(_ expected: NSString) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = actualExpression.cast { $0 as? String } - return try! match(expected.description).matches(actual, failureMessage: failureMessage) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatchError.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatchError.swift deleted file mode 100644 index 2092cb6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatchError.swift +++ /dev/null @@ -1,26 +0,0 @@ -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 comparision by _domain and _code. -public func matchError(_ error: T) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() - - setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, error: error) - return errorMatchesNonNilFieldsOrClosure(actualError, error: error) - } -} - -/// A Nimble matcher that succeeds when the actual expression evaluates to an -/// error of the specified type -public func matchError(_ errorType: T.Type) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() - - setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, errorType: errorType) - return errorMatchesNonNilFieldsOrClosure(actualError, errorType: errorType) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift deleted file mode 100644 index 02d3245..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift +++ /dev/null @@ -1,69 +0,0 @@ -/// 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. -/// -/// 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. -public struct MatcherFunc: Matcher { - public let matcher: (Expression, FailureMessage) throws -> Bool - - public init(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) { - self.matcher = matcher - } - - public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - return try matcher(actualExpression, failureMessage) - } - - public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - return try !matcher(actualExpression, failureMessage) - } -} - -/// 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. -/// This applies regardless of using to() or toNot(). -/// -/// 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. -public struct NonNilMatcherFunc: Matcher { - public let matcher: (Expression, FailureMessage) throws -> Bool - - public init(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) { - self.matcher = matcher - } - - public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - let pass = try matcher(actualExpression, failureMessage) - if try attachNilErrorIfNeeded(actualExpression, failureMessage: failureMessage) { - return false - } - return pass - } - - public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - let pass = try !matcher(actualExpression, failureMessage) - if try attachNilErrorIfNeeded(actualExpression, failureMessage: failureMessage) { - return false - } - return pass - } - - internal func attachNilErrorIfNeeded(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - if try actualExpression.evaluate() == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - return true - } - return false - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift deleted file mode 100644 index ac1eb9d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift +++ /dev/null @@ -1,153 +0,0 @@ -import Foundation -// `CGFloat` is in Foundation (swift-corelibs-foundation) on Linux. -#if _runtime(_ObjC) - import CoreGraphics -#endif - -/// Implement this protocol to implement a custom matcher for Swift -public protocol Matcher { - associatedtype ValueType - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool -} - -#if _runtime(_ObjC) -/// Objective-C interface to the Swift variant of Matcher. -@objc public protocol NMBMatcher { - func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool - func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool -} -#endif - -#if _runtime(_ObjC) -/// Protocol for types that support contain() matcher. -@objc public protocol NMBContainer { - @objc(containsObject:) - func contains(_ anObject: Any) -> Bool -} - -// FIXME: NSHashTable can not conform to NMBContainer since swift-DEVELOPMENT-SNAPSHOT-2016-04-25-a -//extension NSHashTable : NMBContainer {} // Corelibs Foundation does not include this class yet -#else -public protocol NMBContainer { - func contains(_ anObject: Any) -> Bool -} -#endif - -extension NSArray : NMBContainer {} -extension NSSet : NMBContainer {} - -#if _runtime(_ObjC) -/// Protocol for types that support only beEmpty(), haveCount() matchers -@objc public protocol NMBCollection { - var count: Int { get } -} - -extension NSHashTable : NMBCollection {} // Corelibs Foundation does not include these classes yet -extension NSMapTable : NMBCollection {} -#else -public protocol NMBCollection { - var count: Int { get } -} -#endif - -extension NSSet : NMBCollection {} -extension NSIndexSet : NMBCollection {} -extension NSDictionary : NMBCollection {} - -#if _runtime(_ObjC) -/// Protocol for types that support beginWith(), endWith(), beEmpty() matchers -@objc public protocol NMBOrderedCollection : NMBCollection { - @objc(objectAtIndex:) - func object(at index: Int) -> Any -} -#else -public protocol NMBOrderedCollection : NMBCollection { - func object(at index: Int) -> Any -} -#endif - -extension NSArray : NMBOrderedCollection {} - -public protocol NMBDoubleConvertible { - var doubleValue: CDouble { get } -} - -extension Double : NMBDoubleConvertible { - public var doubleValue: CDouble { - return self - } -} - -extension Float : NMBDoubleConvertible { - public var doubleValue: CDouble { - return CDouble(self) - } -} - -extension CGFloat: NMBDoubleConvertible { - public var doubleValue: CDouble { - return CDouble(self) - } -} - -extension NSNumber : NMBDoubleConvertible { -} - -private let dateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSS" - formatter.locale = Locale(identifier: "en_US_POSIX") - - return formatter -}() - -extension Date: NMBDoubleConvertible { - public var doubleValue: CDouble { - return self.timeIntervalSinceReferenceDate - } -} - -extension NSDate: NMBDoubleConvertible { - public var doubleValue: CDouble { - return self.timeIntervalSinceReferenceDate - } -} - -extension Date: TestOutputStringConvertible { - public var testDescription: String { - return dateFormatter.string(from: self) - } -} - -extension NSDate: TestOutputStringConvertible { - public var testDescription: String { - return dateFormatter.string(from: Date(timeIntervalSinceReferenceDate: self.timeIntervalSinceReferenceDate)) - } -} - -/// Protocol for types to support beLessThan(), beLessThanOrEqualTo(), -/// beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers. -/// -/// Types that conform to Swift's Comparable protocol will work implicitly too -#if _runtime(_ObjC) -@objc public protocol NMBComparable { - func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult -} -#else -// This should become obsolete once Corelibs Foundation adds Comparable conformance to NSNumber -public protocol NMBComparable { - func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult -} -#endif - -extension NSNumber : NMBComparable { - public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { - return compare(otherObject as! NSNumber) - } -} -extension NSString : NMBComparable { - public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { - return compare(otherObject as! String) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift deleted file mode 100644 index 84b9d49..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ /dev/null @@ -1,70 +0,0 @@ -import Foundation - -internal class NotificationCollector { - private(set) var observedNotifications: [Notification] - private let notificationCenter: NotificationCenter - #if _runtime(_ObjC) - private var token: AnyObject? - #else - private var token: NSObjectProtocol? - #endif - - required init(notificationCenter: NotificationCenter) { - self.notificationCenter = notificationCenter - self.observedNotifications = [] - } - - func startObserving() { - self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil) { - // linux-swift gets confused by .append(n) - [weak self] n in self?.observedNotifications.append(n) - } - } - - deinit { - #if _runtime(_ObjC) - if let token = self.token { - self.notificationCenter.removeObserver(token) - } - #else - if let token = self.token as? AnyObject { - self.notificationCenter.removeObserver(token) - } - #endif - } -} - -private let mainThread = pthread_self() - -let notificationCenterDefault = NotificationCenter.default - -public func postNotifications( - _ notificationsMatcher: T, - fromNotificationCenter center: NotificationCenter = notificationCenterDefault) - -> MatcherFunc - where T: Matcher, T.ValueType == [Notification] -{ - let _ = mainThread // Force lazy-loading of this value - let collector = NotificationCollector(notificationCenter: center) - collector.startObserving() - var once: Bool = false - return MatcherFunc { actualExpression, failureMessage in - let collectorNotificationsExpression = Expression(memoizedExpression: { _ in - return collector.observedNotifications - }, location: actualExpression.location, withoutCaching: true) - - assert(pthread_equal(mainThread, pthread_self()) != 0, "Only expecting closure to be evaluated on main thread.") - if !once { - once = true - _ = try actualExpression.evaluate() - } - - let match = try notificationsMatcher.matches(collectorNotificationsExpression, failureMessage: failureMessage) - if collector.observedNotifications.isEmpty { - failureMessage.actualValue = "no notifications" - } else { - failureMessage.actualValue = "<\(stringify(collector.observedNotifications))>" - } - return match - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/RaisesException.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/RaisesException.swift deleted file mode 100644 index 09e28c7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/RaisesException.swift +++ /dev/null @@ -1,183 +0,0 @@ -import Foundation - -// This matcher requires the Objective-C, and being built by Xcode rather than the Swift Package Manager -#if _runtime(_ObjC) && !SWIFT_PACKAGE - -/// A Nimble matcher that succeeds when the actual expression raises an -/// exception with the specified name, reason, and/or userInfo. -/// -/// Alternatively, you can pass a closure to do any arbitrary custom matching -/// to the raised exception. The closure only gets called when an exception -/// is raised. -/// -/// nil arguments indicates that the matcher should not attempt to match against -/// that parameter. -public func raiseException( - named: String? = nil, - reason: String? = nil, - userInfo: NSDictionary? = nil, - closure: ((NSException) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - - var exception: NSException? - let capture = NMBExceptionCapture(handler: ({ e in - exception = e - }), finally: nil) - - capture.tryBlock { - _ = try! actualExpression.evaluate() - return - } - - setFailureMessageForException(failureMessage, exception: exception, named: named, reason: reason, userInfo: userInfo, closure: closure) - return exceptionMatchesNonNilFieldsOrClosure(exception, named: named, reason: reason, userInfo: userInfo, closure: closure) - } -} - -internal func setFailureMessageForException( - _ failureMessage: FailureMessage, - exception: NSException?, - named: String?, - reason: String?, - userInfo: NSDictionary?, - closure: ((NSException) -> Void)?) { - failureMessage.postfixMessage = "raise exception" - - if let named = named { - failureMessage.postfixMessage += " with name <\(named)>" - } - if let reason = reason { - failureMessage.postfixMessage += " with reason <\(reason)>" - } - if let userInfo = userInfo { - failureMessage.postfixMessage += " with userInfo <\(userInfo)>" - } - if let _ = closure { - failureMessage.postfixMessage += " that satisfies block" - } - if named == nil && reason == nil && userInfo == nil && closure == nil { - failureMessage.postfixMessage = "raise any exception" - } - - if let exception = exception { - failureMessage.actualValue = "\(String(describing: type(of: exception))) { name=\(exception.name), reason='\(stringify(exception.reason))', userInfo=\(stringify(exception.userInfo)) }" - } else { - failureMessage.actualValue = "no exception" - } -} - -internal func exceptionMatchesNonNilFieldsOrClosure( - _ exception: NSException?, - named: String?, - reason: String?, - userInfo: NSDictionary?, - closure: ((NSException) -> Void)?) -> Bool { - var matches = false - - if let exception = exception { - matches = true - - if let named = named, exception.name.rawValue != named { - matches = false - } - if reason != nil && exception.reason != reason { - matches = false - } - if let userInfo = userInfo, let exceptionUserInfo = exception.userInfo, - (exceptionUserInfo as NSDictionary) != userInfo { - matches = false - } - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(exception) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - - return matches -} - -public class NMBObjCRaiseExceptionMatcher : NSObject, NMBMatcher { - internal var _name: String? - internal var _reason: String? - internal var _userInfo: NSDictionary? - internal var _block: ((NSException) -> Void)? - - internal init(name: String?, reason: String?, userInfo: NSDictionary?, block: ((NSException) -> Void)?) { - _name = name - _reason = reason - _userInfo = userInfo - _block = block - } - - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let block: () -> Any? = ({ _ = actualBlock(); return nil }) - let expr = Expression(expression: block, location: location) - - return try! raiseException( - named: _name, - reason: _reason, - userInfo: _userInfo, - closure: _block - ).matches(expr, failureMessage: failureMessage) - } - - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - return !matches(actualBlock, failureMessage: failureMessage, location: location) - } - - public var named: (_ name: String) -> NMBObjCRaiseExceptionMatcher { - return ({ name in - return NMBObjCRaiseExceptionMatcher( - name: name, - reason: self._reason, - userInfo: self._userInfo, - block: self._block - ) - }) - } - - public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionMatcher { - return ({ reason in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: reason, - userInfo: self._userInfo, - block: self._block - ) - }) - } - - public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionMatcher { - return ({ userInfo in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, - userInfo: userInfo, - block: self._block - ) - }) - } - - public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionMatcher { - return ({ block in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, - userInfo: self._userInfo, - block: block - ) - }) - } -} - -extension NMBObjCMatcher { - public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionMatcher { - return NMBObjCRaiseExceptionMatcher(name: nil, reason: nil, userInfo: nil, block: nil) - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift deleted file mode 100644 index b24b3ec..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift +++ /dev/null @@ -1,65 +0,0 @@ -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 -{ - 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 - } - postfixMessages.add(NSString(string: "{\(failureMessage.postfixMessage)}")) - } - - failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "\(actualValue)" - } - - return matches - } -} - -public func ||(left: NonNilMatcherFunc, right: NonNilMatcherFunc) -> NonNilMatcherFunc { - return satisfyAnyOf(left, right) -} - -public func ||(left: MatcherFunc, right: MatcherFunc) -> NonNilMatcherFunc { - return satisfyAnyOf(left, right) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func satisfyAnyOfMatcher(_ matchers: [NMBObjCMatcher]) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - if matchers.isEmpty { - failureMessage.stringValue = "satisfyAnyOf must be called with at least one matcher" - return false - } - - var elementEvaluators = [NonNilMatcherFunc]() - for matcher in matchers { - let elementEvaluator: (Expression, FailureMessage) -> Bool = { - expression, failureMessage in - return matcher.matches( - {try! expression.evaluate()}, failureMessage: failureMessage, location: actualExpression.location) - } - - elementEvaluators.append(NonNilMatcherFunc(elementEvaluator)) - } - - return try! satisfyAnyOf(elementEvaluators).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift deleted file mode 100644 index 67f9cf6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift +++ /dev/null @@ -1,55 +0,0 @@ -import Foundation - -public func throwAssertion() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - #if arch(x86_64) && _runtime(_ObjC) && !SWIFT_PACKAGE - failureMessage.postfixMessage = "throw an assertion" - failureMessage.actualValue = nil - - var succeeded = true - - 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowError.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowError.swift deleted file mode 100644 index 8c9b91b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/ThrowError.swift +++ /dev/null @@ -1,53 +0,0 @@ -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 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? = 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 - } - - setFailureMessageForError(failureMessage, actualError: actualError, error: error, errorType: errorType, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, error: error, errorType: errorType, closure: closure) - } -} - -/// 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: ((Error) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - - var actualError: Error? - do { - _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError - } - - setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, closure: closure) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Nimble.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Nimble.h deleted file mode 100644 index 790d16d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Nimble.h +++ /dev/null @@ -1,14 +0,0 @@ -#import -#import "NMBExceptionCapture.h" -#import "NMBStringify.h" -#import "DSL.h" - -#import "CwlCatchException.h" -#import "CwlCatchBadInstruction.h" - -#if !TARGET_OS_TV - #import "mach_excServer.h" -#endif - -FOUNDATION_EXPORT double NimbleVersionNumber; -FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Async.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Async.swift deleted file mode 100644 index c902692..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Async.swift +++ /dev/null @@ -1,361 +0,0 @@ -import CoreFoundation -import Dispatch -import Foundation - -#if !_runtime(_ObjC) - import CDispatch -#endif - -private let timeoutLeeway = DispatchTimeInterval.milliseconds(1) -private let pollLeeway = DispatchTimeInterval.milliseconds(1) - -/// Stores debugging information about callers -internal struct WaitingInfo: CustomStringConvertible { - let name: String - let file: FileString - let lineNumber: UInt - - var description: String { - return "\(name) at \(file):\(lineNumber)" - } -} - -internal protocol WaitLock { - func acquireWaitingLock(_ fnName: String, file: FileString, line: UInt) - func releaseWaitingLock() - func isWaitingLocked() -> Bool -} - -internal class AssertionWaitLock: WaitLock { - private var currentWaiter: WaitingInfo? = nil - 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( - isMainThread, - "InvalidNimbleAPIUsage", - "\(fnName) can only run on the main thread." - ) - nimblePrecondition( - currentWaiter == nil, - "InvalidNimbleAPIUsage", - "Nested async expectations are not allowed to avoid creating flaky tests.\n\n" + - "The call to\n\t\(info)\n" + - "triggered this exception because\n\t\(currentWaiter!)\n" + - "is currently managing the main run loop." - ) - currentWaiter = info - } - - func isWaitingLocked() -> Bool { - return currentWaiter != nil - } - - func releaseWaitingLock() { - currentWaiter = nil - } -} - -internal enum AwaitResult { - /// Incomplete indicates None (aka - this value hasn't been fulfilled yet) - case incomplete - /// TimedOut indicates the result reached its defined timeout limit before returning - case timedOut - /// BlockedRunLoop indicates the main runloop is too busy processing other blocks to trigger - /// the timeout code. - /// - /// This may also mean the async code waiting upon may have never actually ran within the - /// required time because other timers & sources are running on the main run loop. - case blockedRunLoop - /// The async block successfully executed and returned a given result - case completed(T) - /// When a Swift Error is thrown - case errorThrown(Error) - /// When an Objective-C Exception is raised - case raisedException(NSException) - - func isIncomplete() -> Bool { - switch self { - case .incomplete: return true - default: return false - } - } - - func isCompleted() -> Bool { - switch self { - case .completed(_): return true - default: return false - } - } -} - -/// Holds the resulting value from an asynchronous expectation. -/// This class is thread-safe at receiving an "response" to this promise. -internal class AwaitPromise { - private(set) internal var asyncResult: AwaitResult = .incomplete - private var signal: DispatchSemaphore - - init() { - signal = DispatchSemaphore(value: 1) - } - - /// Resolves the promise with the given result if it has not been resolved. Repeated calls to - /// this method will resolve in a no-op. - /// - /// @returns a Bool that indicates if the async result was accepted or rejected because another - /// value was recieved first. - func resolveResult(_ result: AwaitResult) -> Bool { - if signal.wait(timeout: .now()) == .success { - self.asyncResult = result - return true - } else { - return false - } - } -} - -internal struct AwaitTrigger { - let timeoutSource: DispatchSourceTimer - let actionSource: DispatchSourceTimer? - let start: () throws -> Void -} - -/// Factory for building fully configured AwaitPromises and waiting for their results. -/// -/// This factory stores all the state for an async expectation so that Await doesn't -/// doesn't have to manage it. -internal class AwaitPromiseBuilder { - let awaiter: Awaiter - let waitLock: WaitLock - let trigger: AwaitTrigger - let promise: AwaitPromise - - internal init( - awaiter: Awaiter, - waitLock: WaitLock, - promise: AwaitPromise, - trigger: AwaitTrigger) { - self.awaiter = awaiter - self.waitLock = waitLock - self.promise = promise - self.trigger = trigger - } - - func timeout(_ timeoutInterval: TimeInterval, forcefullyAbortTimeout: TimeInterval) -> Self { - // = Discussion = - // - // There's a lot of technical decisions here that is useful to elaborate on. This is - // definitely more lower-level than the previous NSRunLoop based implementation. - // - // - // Why Dispatch Source? - // - // - // We're using a dispatch source to have better control of the run loop behavior. - // A timer source gives us deferred-timing control without having to rely as much on - // a run loop's traditional dispatching machinery (eg - NSTimers, DefaultRunLoopMode, etc.) - // which is ripe for getting corrupted by application code. - // - // And unlike dispatch_async(), we can control how likely our code gets prioritized to - // executed (see leeway parameter) + DISPATCH_TIMER_STRICT. - // - // This timer is assumed to run on the HIGH priority queue to ensure it maintains the - // highest priority over normal application / test code when possible. - // - // - // Run Loop Management - // - // In order to properly interrupt the waiting behavior performed by this factory class, - // this timer stops the main run loop to tell the waiter code that the result should be - // checked. - // - // In addition, stopping the run loop is used to halt code executed on the main run loop. - trigger.timeoutSource.scheduleOneshot( - deadline: DispatchTime.now() + timeoutInterval, - leeway: timeoutLeeway) - trigger.timeoutSource.setEventHandler() { - guard self.promise.asyncResult.isIncomplete() else { return } - let timedOutSem = DispatchSemaphore(value: 0) - let semTimedOutOrBlocked = DispatchSemaphore(value: 0) - semTimedOutOrBlocked.signal() - let runLoop = CFRunLoopGetMain() - #if _runtime(_ObjC) - let runLoopMode = CFRunLoopMode.defaultMode.rawValue - #else - let runLoopMode = kCFRunLoopDefaultMode - #endif - CFRunLoopPerformBlock(runLoop, runLoopMode) { - if semTimedOutOrBlocked.wait(timeout: .now()) == .success { - timedOutSem.signal() - semTimedOutOrBlocked.signal() - if self.promise.resolveResult(.timedOut) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - // potentially interrupt blocking code on run loop to let timeout code run - CFRunLoopStop(runLoop) - let now = DispatchTime.now() + forcefullyAbortTimeout - let didNotTimeOut = timedOutSem.wait(timeout: now) != .success - let timeoutWasNotTriggered = semTimedOutOrBlocked.wait(timeout: .now()) == .success - if didNotTimeOut && timeoutWasNotTriggered { - if self.promise.resolveResult(.blockedRunLoop) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - return self - } - - /// Blocks for an asynchronous result. - /// - /// @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. - /// - /// This method will return an AwaitResult in the following cases: - /// - /// - The main run loop is blocked by other operations and the async expectation cannot be - /// be stopped. - /// - The async expectation timed out - /// - The async expectation succeeded - /// - The async expectation raised an unexpected exception (objc) - /// - The async expectation raised an unexpected error (swift) - /// - /// The returned AwaitResult will NEVER be .incomplete. - func wait(_ fnName: String = #function, file: FileString = #file, line: UInt = #line) -> AwaitResult { - waitLock.acquireWaitingLock( - fnName, - file: file, - line: line) - - let capture = NMBExceptionCapture(handler: ({ exception in - _ = self.promise.resolveResult(.raisedException(exception)) - }), finally: ({ - self.waitLock.releaseWaitingLock() - })) - capture.tryBlock { - do { - try self.trigger.start() - } catch let error { - _ = self.promise.resolveResult(.errorThrown(error)) - } - 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) - } - self.trigger.timeoutSource.suspend() - self.trigger.timeoutSource.cancel() - if let asyncSource = self.trigger.actionSource { - asyncSource.cancel() - } - } - - return promise.asyncResult - } -} - -internal class Awaiter { - let waitLock: WaitLock - let timeoutQueue: DispatchQueue - let asyncQueue: DispatchQueue - - internal init( - waitLock: WaitLock, - asyncQueue: DispatchQueue, - timeoutQueue: DispatchQueue) { - self.waitLock = waitLock - self.asyncQueue = asyncQueue - self.timeoutQueue = timeoutQueue - } - - private func createTimerSource(_ queue: DispatchQueue) -> DispatchSourceTimer { - return DispatchSource.makeTimerSource(flags: .strict, queue: queue) - } - - func performBlock( - _ closure: @escaping (@escaping (T) -> Void) throws -> Void) -> AwaitPromiseBuilder { - let promise = AwaitPromise() - let timeoutSource = createTimerSource(timeoutQueue) - var completionCount = 0 - let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: nil) { - try closure() { - completionCount += 1 - nimblePrecondition( - completionCount < 2, - "InvalidNimbleAPIUsage", - "Done closure's was called multiple times. waitUntil(..) expects its " + - "completion closure to only be called once.") - if promise.resolveResult(.completed($0)) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - - return AwaitPromiseBuilder( - awaiter: self, - waitLock: waitLock, - promise: promise, - trigger: trigger) - } - - func poll(_ pollInterval: TimeInterval, closure: @escaping () throws -> T?) -> AwaitPromiseBuilder { - let promise = AwaitPromise() - let timeoutSource = createTimerSource(timeoutQueue) - let asyncSource = createTimerSource(asyncQueue) - 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() { - do { - if let result = try closure() { - if promise.resolveResult(.completed(result)) { - CFRunLoopStop(CFRunLoopGetCurrent()) - } - } - } catch let error { - if promise.resolveResult(.errorThrown(error)) { - CFRunLoopStop(CFRunLoopGetCurrent()) - } - } - } - asyncSource.resume() - } - - return AwaitPromiseBuilder( - awaiter: self, - waitLock: waitLock, - promise: promise, - trigger: trigger) - } -} - -internal func pollBlock( - pollInterval: TimeInterval, - timeoutInterval: TimeInterval, - file: FileString, - line: UInt, - fnName: String = #function, - 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 - } - }.timeout(timeoutInterval, forcefullyAbortTimeout: timeoutInterval / 2.0).wait(fnName, file: file, line: line) - - return result -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Errors.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Errors.swift deleted file mode 100644 index d424c98..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Errors.swift +++ /dev/null @@ -1,142 +0,0 @@ -import Foundation - -// Generic - -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, - postfixMessageVerb: String = "throw", - actualError: Error?, - error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) { - failureMessage.postfixMessage = "\(postfixMessageVerb) error" - - if let error = error { - if let error = error as? CustomDebugStringConvertible { - failureMessage.postfixMessage += " <\(error.debugDescription)>" - } else { - failureMessage.postfixMessage += " <\(error)>" - } - } else if errorType != nil || closure != nil { - failureMessage.postfixMessage += " from type <\(T.self)>" - } - if let _ = closure { - failureMessage.postfixMessage += " that satisfies block" - } - if error == nil && errorType == nil && closure == nil { - failureMessage.postfixMessage = "\(postfixMessageVerb) any error" - } - - if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" - } else { - failureMessage.actualValue = "no error" - } -} - -internal func errorMatchesExpectedError( - _ actualError: Error, - expectedError: T) -> Bool { - return actualError._domain == expectedError._domain - && actualError._code == expectedError._code -} - -internal func errorMatchesExpectedError( - _ actualError: Error, - expectedError: T) -> Bool - where T: Equatable -{ - if let actualError = actualError as? T { - return actualError == expectedError - } - return false -} - -internal func errorMatchesNonNilFieldsOrClosure( - _ actualError: Error?, - error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) -> Bool { - var matches = false - - if let actualError = actualError { - matches = true - - if let error = error { - if !errorMatchesExpectedError(actualError, expectedError: error) { - matches = false - } - } - if let actualError = actualError as? T { - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(actualError as T) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } else if errorType != nil { - matches = (actualError is T) - // The closure expects another ErrorProtocol as argument, so this - // is _supposed_ to fail, so that it becomes more obvious. - if let closure = closure { - let assertions = gatherExpectations { - if let actual = actualError as? T { - closure(actual) - } - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - } - - return matches -} - -// Non-generic - -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, - actualError: Error?, - closure: ((Error) -> Void)?) { - failureMessage.postfixMessage = "throw error" - - if let _ = closure { - failureMessage.postfixMessage += " that satisfies block" - } else { - failureMessage.postfixMessage = "throw any error" - } - - if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" - } else { - 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Functional.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Functional.swift deleted file mode 100644 index 6c5126a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Functional.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation - -extension Sequence { - internal func all(_ fn: (Iterator.Element) -> Bool) -> Bool { - for item in self { - if !fn(item) { - return false - } - } - return true - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/SourceLocation.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/SourceLocation.swift deleted file mode 100644 index a7279aa..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/SourceLocation.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -// Ideally we would always use `StaticString` as the type for tracking the file name -// that expectations originate from, for consistency with `assert` etc. from the -// stdlib, and because recent versions of the XCTest overlay require `StaticString` -// when calling `XCTFail`. Under the Objective-C runtime (i.e. building on Mac), we -// have to use `String` instead because StaticString can't be generated from Objective-C -#if _runtime(_ObjC) -public typealias FileString = String -#else -public typealias FileString = StaticString -#endif - -public final class SourceLocation : NSObject { - public let file: FileString - public let line: UInt - - override init() { - file = "Unknown File" - line = 0 - } - - init(file: FileString, line: UInt) { - self.file = file - self.line = line - } - - override public var description: String { - return "\(file):\(line)" - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Stringers.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Stringers.swift deleted file mode 100644 index 012e1e3..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/Nimble/Utils/Stringers.swift +++ /dev/null @@ -1,213 +0,0 @@ -import Foundation - - -internal func identityAsString(_ value: Any?) -> String { - let anyObject: AnyObject? -#if os(Linux) - anyObject = value as? AnyObject -#else - anyObject = value as AnyObject? -#endif - if let value = anyObject { - return NSString(format: "<%p>", unsafeBitCast(value, to: Int.self)).description - } else { - return "nil" - } -} - -internal func arrayAsString(_ items: [T], joiner: String = ", ") -> String { - return items.reduce("") { accum, item in - let prefix = (accum.isEmpty ? "" : joiner) - return accum + prefix + "\(stringify(item))" - } -} - -/// A type with a customized test output text representation. -/// -/// This textual representation is produced when values will be -/// printed in test runs, and may be useful when producing -/// error messages in custom matchers. -/// -/// - SeeAlso: `CustomDebugStringConvertible` -public protocol TestOutputStringConvertible { - var testDescription: String { get } -} - -extension Double: TestOutputStringConvertible { - public var testDescription: String { - return NSNumber(value: self).testDescription - } -} - -extension Float: TestOutputStringConvertible { - public var testDescription: String { - return NSNumber(value: self).testDescription - } -} - -extension NSNumber: TestOutputStringConvertible { - // This is using `NSString(format:)` instead of - // `String(format:)` because the latter somehow breaks - // 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. - // Maybe this will change in a future snapshot. - let decimalPlaces = NSString(string: NSString(string: description) - .components(separatedBy: ".")[1]) - - // SeeAlso: https://bugs.swift.org/browse/SR-1464 - switch decimalPlaces.length { - case 1: - return NSString(format: "%0.1f", self.doubleValue).description - case 2: - return NSString(format: "%0.2f", self.doubleValue).description - case 3: - return NSString(format: "%0.3f", self.doubleValue).description - default: - return NSString(format: "%0.4f", self.doubleValue).description - } - } - return self.description - } -} - -extension Array: TestOutputStringConvertible { - public var testDescription: String { - let list = self.map(Nimble.stringify).joined(separator: ", ") - return "[\(list)]" - } -} - -extension AnySequence: TestOutputStringConvertible { - public var testDescription: String { - 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)]" - } -} - -extension NSArray: TestOutputStringConvertible { - public var testDescription: String { - let list = Array(self).map(Nimble.stringify).joined(separator: ", ") - return "(\(list))" - } -} - -extension NSIndexSet: TestOutputStringConvertible { - public var testDescription: String { - let list = Array(self).map(Nimble.stringify).joined(separator: ", ") - return "(\(list))" - } -} - -extension String: TestOutputStringConvertible { - public var testDescription: String { - return self - } -} - -extension Data: TestOutputStringConvertible { - public var testDescription: String { - #if os(Linux) - // FIXME: Swift on Linux triggers a segfault when calling NSData's hash() (last checked on 03-11-16) - return "Data" - #else - return "Data" - #endif - } -} - -/// -/// Returns a string appropriate for displaying in test output -/// from the provided value. -/// -/// - parameter value: A value that will show up in a test's output. -/// -/// - returns: The string that is returned can be -/// customized per type by conforming a type to the `TestOutputStringConvertible` -/// protocol. When stringifying a non-`TestOutputStringConvertible` type, this -/// function will return the value's debug description and then its -/// normal description if available and in that order. Otherwise it -/// will return the result of constructing a string from the value. -/// -/// - SeeAlso: `TestOutputStringConvertible` -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) -} - -/// -SeeAlso: `stringify(value: T)` -public func stringify(_ value: T?) -> String { - if let unboxed = value { - return stringify(unboxed) - } - return "nil" -} - -#if _runtime(_ObjC) -@objc public class NMBStringer: NSObject { - @objc public class func stringify(_ obj: Any?) -> String { - return Nimble.stringify(obj) - } -} -#endif - -// MARK: Collection Type Stringers - -/// Attempts to generate a pretty type string for a given value. If the value is of a Objective-C -/// collection type, or a subclass thereof, (e.g. `NSArray`, `NSDictionary`, etc.). -/// This function will return the type name of the root class of the class cluster for better -/// readability (e.g. `NSArray` instead of `__NSArrayI`). -/// -/// For values that don't have a type of an Objective-C collection, this function returns the -/// default type description. -/// -/// - parameter value: A value that will be used to determine a type name. -/// -/// - returns: The name of the class cluster root class for Objective-C collection types, or the -/// the `dynamicType` of the value for values of any other type. -public func prettyCollectionType(_ value: T) -> String { - switch value { - case is NSArray: - return String(describing: NSArray.self) - case is NSDictionary: - return String(describing: NSDictionary.self) - case is NSSet: - return String(describing: NSSet.self) - case is NSIndexSet: - return String(describing: NSIndexSet.self) - default: - return String(describing: value) - } -} - -/// Returns the type name for a given collection type. This overload is used by Swift -/// collection types. -/// -/// - parameter collection: A Swift `CollectionType` value. -/// -/// - returns: A string representing the `dynamicType` of the value. -public func prettyCollectionType(_ collection: T) -> String { - return String(describing: type(of: collection)) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h deleted file mode 100644 index 5d416e4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble22CurrentTestCaseTracker") -@interface CurrentTestCaseTracker : NSObject -+ (CurrentTestCaseTracker *)sharedInstance; -@end - -@interface CurrentTestCaseTracker (Register) @end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.h deleted file mode 100644 index 54677ee..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.h +++ /dev/null @@ -1,377 +0,0 @@ -#import - -@class NMBExpectation; -@class NMBObjCBeCloseToMatcher; -@class NMBObjCRaiseExceptionMatcher; -@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 - - - -#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); - - - -#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_EXPORT_INLINE id beAnInstanceOf(Class expectedClass) { - return NMB_beAnInstanceOf(expectedClass); -} - -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass); -NIMBLE_EXPORT_INLINE id beAKindOf(Class expectedClass) { - return NMB_beAKindOf(expectedClass); -} - -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring); -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(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), - NMB_beIdenticalTo(expectedInstance)); - -NIMBLE_EXPORT id NMB_be(id expectedInstance); -NIMBLE_SHORT(id be(id expectedInstance), - NMB_be(expectedInstance)); - - -#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), - NMB_beTruthy()); - -NIMBLE_EXPORT id NMB_beFalsy(void); -NIMBLE_SHORT(id beFalsy(void), - NMB_beFalsy()); - -NIMBLE_EXPORT id NMB_beTrue(void); -NIMBLE_SHORT(id beTrue(void), - NMB_beTrue()); - -NIMBLE_EXPORT id NMB_beFalse(void); -NIMBLE_SHORT(id beFalse(void), - NMB_beFalse()); - -NIMBLE_EXPORT id NMB_beNil(void); -NIMBLE_SHORT(id beNil(void), - NMB_beNil()); - -NIMBLE_EXPORT id NMB_beEmpty(void); -NIMBLE_SHORT(id beEmpty(void), - NMB_beEmpty()); - -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) NS_REQUIRES_NIL_TERMINATION; -#define NMB_contain(...) NMB_containWithNilTermination(__VA_ARGS__, nil) -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#define contain(...) NMB_contain(__VA_ARGS__) -#endif - -NIMBLE_EXPORT id NMB_endWith(id itemElementOrSubstring); -NIMBLE_SHORT(id endWith(id itemElementOrSubstring), - NMB_endWith(itemElementOrSubstring)); - -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException(void); -NIMBLE_SHORT(NMBObjCRaiseExceptionMatcher *raiseException(void), - NMB_raiseException()); - -NIMBLE_EXPORT id NMB_match(id expectedValue); -NIMBLE_SHORT(id match(id expectedValue), - NMB_match(expectedValue)); - -NIMBLE_EXPORT id NMB_allPass(id matcher); -NIMBLE_SHORT(id allPass(id matcher), - NMB_allPass(matcher)); - -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers); -#define NMB_satisfyAnyOf(...) NMB_satisfyAnyOfWithMatchers(@[__VA_ARGS__]) -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#define satisfyAnyOf(...) NMB_satisfyAnyOf(__VA_ARGS__) -#endif - -// In order to preserve breakpoint behavior despite using macros to fill in __FILE__ and __LINE__, -// define a builder that populates __FILE__ and __LINE__, and returns a block that takes timeout -// and action arguments. See https://github.com/Quick/Quick/pull/185 for details. -typedef void (^NMBWaitUntilTimeoutBlock)(NSTimeInterval timeout, void (^action)(void (^)(void))); -typedef void (^NMBWaitUntilBlock)(void (^action)(void (^)(void))); - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line); - -NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line); -NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line); - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line); - -#define NMB_waitUntilTimeout NMB_waitUntilTimeoutBuilder(@(__FILE__), __LINE__) -#define NMB_waitUntil NMB_waitUntilBuilder(@(__FILE__), __LINE__) - -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#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") - - -#define waitUntilTimeout NMB_waitUntilTimeout -#define waitUntil NMB_waitUntil - -#undef NIMBLE_VALUE_OF - -#endif - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.m deleted file mode 100644 index cd93ddd..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/DSL.m +++ /dev/null @@ -1,156 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble7NMBWait") -@interface NMBWait : NSObject - -+ (void)untilTimeout:(NSTimeInterval)timeout file:(NSString *)file line:(NSUInteger)line action:(void(^)())action; -+ (void)untilFile:(NSString *)file line:(NSUInteger)line action:(void(^)())action; - -@end - - -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 - line:line]; -} - -NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(), NSString *file, NSUInteger line) { - return NMB_expect(^id{ - actualBlock(); - return nil; - }, file, line); -} - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line) { - return [NMBExpectation failWithMessage:msg file:file line:line]; -} - -NIMBLE_EXPORT id NMB_beAnInstanceOf(Class expectedClass) { - return [NMBObjCMatcher beAnInstanceOfMatcher:expectedClass]; -} - -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass) { - return [NMBObjCMatcher beAKindOfMatcher:expectedClass]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beCloseToMatcher:expectedValue within:0.001]; -} - -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring) { - return [NMBObjCMatcher beginWithMatcher:itemElementOrSubstring]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanOrEqualToMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_beIdenticalTo(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; -} - -NIMBLE_EXPORT id NMB_be(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanOrEqualToMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_beTruthy() { - return [NMBObjCMatcher beTruthyMatcher]; -} - -NIMBLE_EXPORT id NMB_beFalsy() { - return [NMBObjCMatcher beFalsyMatcher]; -} - -NIMBLE_EXPORT id NMB_beTrue() { - return [NMBObjCMatcher beTrueMatcher]; -} - -NIMBLE_EXPORT id NMB_beFalse() { - return [NMBObjCMatcher beFalseMatcher]; -} - -NIMBLE_EXPORT id NMB_beNil() { - return [NMBObjCMatcher beNilMatcher]; -} - -NIMBLE_EXPORT id NMB_beEmpty() { - return [NMBObjCMatcher beEmptyMatcher]; -} - -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) { - NSMutableArray *itemOrSubstringArray = [NSMutableArray array]; - - if (itemOrSubstring) { - [itemOrSubstringArray addObject:itemOrSubstring]; - - va_list args; - va_start(args, itemOrSubstring); - id next; - while ((next = va_arg(args, id))) { - [itemOrSubstringArray addObject:next]; - } - va_end(args); - } - - return [NMBObjCMatcher containMatcher:itemOrSubstringArray]; -} - -NIMBLE_EXPORT id NMB_endWith(id itemElementOrSubstring) { - return [NMBObjCMatcher endWithMatcher:itemElementOrSubstring]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_equal(__nullable id expectedValue) { - return [NMBObjCMatcher equalMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_haveCount(id expectedValue) { - return [NMBObjCMatcher haveCountMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_match(id expectedValue) { - return [NMBObjCMatcher matchMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_allPass(id expectedValue) { - return [NMBObjCMatcher allPassMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers) { - return [NMBObjCMatcher satisfyAnyOfMatcher:matchers]; -} - -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException() { - return [NMBObjCMatcher raiseExceptionMatcher]; -} - -NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line) { - return ^(NSTimeInterval timeout, void (^action)(void (^)(void))) { - [NMBWait untilTimeout:timeout file:file line:line action:action]; - }; -} - -NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line) { - return ^(void (^action)(void (^)(void))) { - [NMBWait untilFile:file line:line action:action]; - }; -} - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h deleted file mode 100644 index e0ec05a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h +++ /dev/null @@ -1,11 +0,0 @@ -#import -#import - -@interface NMBExceptionCapture : NSObject - -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)())finally; -- (void)tryBlock:(void(^ _Nonnull)())unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); - -@end - -typedef void(^NMBSourceCallbackBlock)(BOOL successful); diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m deleted file mode 100644 index 0a882b7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m +++ /dev/null @@ -1,35 +0,0 @@ -#import "NMBExceptionCapture.h" - -@interface NMBExceptionCapture () -@property (nonatomic, copy) void(^ _Nullable handler)(NSException * _Nullable); -@property (nonatomic, copy) void(^ _Nullable finally)(); -@end - -@implementation NMBExceptionCapture - -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)())finally { - self = [super init]; - if (self) { - self.handler = handler; - self.finally = finally; - } - return self; -} - -- (void)tryBlock:(void(^ _Nonnull)())unsafeBlock { - @try { - unsafeBlock(); - } - @catch (NSException *exception) { - if (self.handler) { - self.handler(exception); - } - } - @finally { - if (self.finally) { - self.finally(); - } - } -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.h deleted file mode 100644 index e5d5ddd..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.h +++ /dev/null @@ -1,18 +0,0 @@ -@class NSString; - -/** - * 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. - * - * @return The string that is returned can be - * customized per type by conforming a type to the `TestOutputStringConvertible` - * protocol. When stringifying a non-`TestOutputStringConvertible` type, this - * function will return the value's debug description and then its - * normal description if available and in that order. Otherwise it - * will return the result of constructing a string from the value. - * - * @see `TestOutputStringConvertible` - */ -extern NSString *_Nonnull NMBStringify(id _Nullable anyObject) __attribute__((warn_unused_result)); diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.m deleted file mode 100644 index 329d39a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/NMBStringify.m +++ /dev/null @@ -1,6 +0,0 @@ -#import "NMBStringify.h" -#import - -NSString *_Nonnull NMBStringify(id _Nullable anyObject) { - return [NMBStringer stringify:anyObject]; -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m deleted file mode 100644 index 35f26fd..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m +++ /dev/null @@ -1,78 +0,0 @@ -#import "CurrentTestCaseTracker.h" -#import -#import - -#pragma mark - Method Swizzling - -/// Swaps the implementations between two instance methods. -/// -/// @param class The class containing `originalSelector`. -/// @param originalSelector Original method to replace. -/// @param replacementSelector Replacement method. -void swizzleSelectors(Class class, SEL originalSelector, SEL replacementSelector) { - Method originalMethod = class_getInstanceMethod(class, originalSelector); - Method replacementMethod = class_getInstanceMethod(class, replacementSelector); - - BOOL didAddMethod = - class_addMethod(class, - originalSelector, - method_getImplementation(replacementMethod), - method_getTypeEncoding(replacementMethod)); - - if (didAddMethod) { - class_replaceMethod(class, - replacementSelector, - method_getImplementation(originalMethod), - method_getTypeEncoding(originalMethod)); - } else { - method_exchangeImplementations(originalMethod, replacementMethod); - } -} - -#pragma mark - Private - -@interface XCTestObservationCenter (Private) -- (void)_addLegacyTestObserver:(id)observer; -@end - -@implementation XCTestObservationCenter (Register) - -/// Uses objc method swizzling to register `CurrentTestCaseTracker` as a test observer. This is necessary -/// because Xcode 7.3 introduced timing issues where if a custom `XCTestObservation` is registered too early -/// it suppresses all console output (generated by `XCTestLog`), breaking any tools that depend on this output. -/// This approach waits to register our custom test observer until XCTest adds its first "legacy" observer, -/// falling back to registering after the first normal observer if this private method ever changes. -+ (void)load { - if (class_getInstanceMethod([self class], @selector(_addLegacyTestObserver:))) { - // Swizzle -_addLegacyTestObserver: - swizzleSelectors([self class], @selector(_addLegacyTestObserver:), @selector(NMB_original__addLegacyTestObserver:)); - } else { - // Swizzle -addTestObserver:, only if -_addLegacyTestObserver: is not implemented - swizzleSelectors([self class], @selector(addTestObserver:), @selector(NMB_original_addTestObserver:)); - } -} - -#pragma mark - Replacement Methods - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -- (void)NMB_original__addLegacyTestObserver:(id)observer { - [self NMB_original__addLegacyTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -/// This method is only used if `-_addLegacyTestObserver:` is not impelemented. (added in Xcode 7.3) -- (void)NMB_original_addTestObserver:(id)observer { - [self NMB_original_addTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self NMB_original_addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/LinuxMain.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/LinuxMain.swift deleted file mode 100644 index 4210ef0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/LinuxMain.swift +++ /dev/null @@ -1,37 +0,0 @@ -import XCTest -@testable import NimbleTests - -// This is the entry point for NimbleTests on Linux - -XCTMain([ - testCase(AsyncTest.allTests), - testCase(SynchronousTest.allTests), - testCase(UserDescriptionTest.allTests), - - // Matchers - testCase(AllPassTest.allTests), - // testCase(BeAKindOfTest.allTests), - testCase(BeAnInstanceOfTest.allTests), - testCase(BeCloseToTest.allTests), - testCase(BeginWithTest.allTests), - testCase(BeGreaterThanOrEqualToTest.allTests), - testCase(BeGreaterThanTest.allTests), - testCase(BeIdenticalToObjectTest.allTests), - testCase(BeIdenticalToTest.allTests), - testCase(BeLessThanOrEqualToTest.allTests), - testCase(BeLessThanTest.allTests), - testCase(BeTruthyTest.allTests), - testCase(BeTrueTest.allTests), - testCase(BeFalsyTest.allTests), - testCase(BeFalseTest.allTests), - testCase(BeNilTest.allTests), - testCase(ContainTest.allTests), - testCase(EndWithTest.allTests), - testCase(EqualTest.allTests), - testCase(HaveCountTest.allTests), - testCase(MatchTest.allTests), - // testCase(RaisesExceptionTest.allTests), - testCase(ThrowErrorTest.allTests), - testCase(SatisfyAnyOfTest.allTests), - testCase(PostNotificationTest.allTests), -]) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/AsynchronousTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/AsynchronousTest.swift deleted file mode 100644 index ff78d47..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/AsynchronousTest.swift +++ /dev/null @@ -1,222 +0,0 @@ -import Dispatch -import Foundation -import XCTest -import Nimble - -final class AsyncTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AsyncTest) -> () throws -> Void)] { - return [ - ("testToEventuallyPositiveMatches", testToEventuallyPositiveMatches), - ("testToEventuallyNegativeMatches", testToEventuallyNegativeMatches), - ("testWaitUntilPositiveMatches", testWaitUntilPositiveMatches), - ("testToEventuallyWithCustomDefaultTimeout", testToEventuallyWithCustomDefaultTimeout), - ("testWaitUntilTimesOutIfNotCalled", testWaitUntilTimesOutIfNotCalled), - ("testWaitUntilTimesOutWhenExceedingItsTime", testWaitUntilTimesOutWhenExceedingItsTime), - ("testWaitUntilNegativeMatches", testWaitUntilNegativeMatches), - ("testWaitUntilDetectsStalledMainThreadActivity", testWaitUntilDetectsStalledMainThreadActivity), - ("testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed", testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed), - ("testWaitUntilErrorsIfDoneIsCalledMultipleTimes", testWaitUntilErrorsIfDoneIsCalledMultipleTimes), - ("testWaitUntilMustBeInMainThread", testWaitUntilMustBeInMainThread), - ("testToEventuallyMustBeInMainThread", testToEventuallyMustBeInMainThread), - ] - } - - class Error: Swift.Error {} - let errorToThrow = Error() - - private func doThrowError() throws -> Int { - throw errorToThrow - } - - func testToEventuallyPositiveMatches() { - var value = 0 - deferToMainQueue { value = 1 } - expect { value }.toEventually(equal(1)) - - deferToMainQueue { value = 0 } - expect { value }.toEventuallyNot(equal(1)) - } - - func testToEventuallyNegativeMatches() { - let value = 0 - failsWithErrorMessage("expected to eventually not equal <0>, got <0>") { - expect { value }.toEventuallyNot(equal(0)) - } - failsWithErrorMessage("expected to eventually equal <1>, got <0>") { - expect { value }.toEventually(equal(1)) - } - failsWithErrorMessage("expected to eventually equal <1>, got an unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toEventually(equal(1)) - } - failsWithErrorMessage("expected to eventually not equal <0>, got an unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toEventuallyNot(equal(0)) - } - } - - func testToEventuallyWithCustomDefaultTimeout() { - AsyncDefaults.Timeout = 2 - defer { - AsyncDefaults.Timeout = 1 - } - - var value = 0 - - let sleepThenSetValueTo: (Int) -> () = { newValue in - Thread.sleep(forTimeInterval: 1.1) - value = newValue - } - - var asyncOperation: () -> () = { sleepThenSetValueTo(1) } - - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect { value }.toEventually(equal(1)) - - asyncOperation = { sleepThenSetValueTo(0) } - - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect { value }.toEventuallyNot(equal(1)) - } - - func testWaitUntilPositiveMatches() { - waitUntil { done in - done() - } - waitUntil { done in - deferToMainQueue { - done() - } - } - } - - func testWaitUntilTimesOutIfNotCalled() { - failsWithErrorMessage("Waited more than 1.0 second") { - waitUntil(timeout: 1) { done in return } - } - } - - func testWaitUntilTimesOutWhenExceedingItsTime() { - var waiting = true - failsWithErrorMessage("Waited more than 0.01 seconds") { - waitUntil(timeout: 0.01) { done in - let asyncOperation: () -> () = { - Thread.sleep(forTimeInterval: 0.1) - done() - waiting = false - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - } - } - - // "clear" runloop to ensure this test doesn't poison other tests - repeat { - RunLoop.main.run(until: Date().addingTimeInterval(0.2)) - } while(waiting) - } - - func testWaitUntilNegativeMatches() { - failsWithErrorMessage("expected to equal <2>, got <1>") { - waitUntil { done in - Thread.sleep(forTimeInterval: 0.1) - expect(1).to(equal(2)) - done() - } - } - } - - func testWaitUntilDetectsStalledMainThreadActivity() { - let msg = "-waitUntil() timed out but was unable to run the timeout handler because the main thread is unresponsive (0.5 seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." - failsWithErrorMessage(msg) { - waitUntil(timeout: 1) { done in - Thread.sleep(forTimeInterval: 5.0) - done() - } - } - } - - func testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed() { - // Currently we are unable to catch Objective-C exceptions when built by the Swift Package Manager -#if !SWIFT_PACKAGE - let referenceLine = #line + 9 - var msg = "Unexpected exception raised: Nested async expectations are not allowed " - msg += "to avoid creating flaky tests." - msg += "\n\n" - msg += "The call to\n\t" - msg += "expect(...).toEventually(...) at \(#file):\(referenceLine + 7)\n" - msg += "triggered this exception because\n\t" - msg += "waitUntil(...) at \(#file):\(referenceLine + 1)\n" - msg += "is currently managing the main run loop." - failsWithErrorMessage(msg) { // reference line - waitUntil(timeout: 2.0) { done in - var protected: Int = 0 - DispatchQueue.main.async { - protected = 1 - } - - expect(protected).toEventually(equal(1)) - done() - } - } -#endif - } - - func testWaitUntilErrorsIfDoneIsCalledMultipleTimes() { -#if !SWIFT_PACKAGE - waitUntil { done in - deferToMainQueue { - done() - expect { - done() - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - } - } -#endif - } - - func testWaitUntilMustBeInMainThread() { -#if !SWIFT_PACKAGE - var executedAsyncBlock: Bool = false - let asyncOperation: () -> () = { - expect { - waitUntil { done in done() } - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - executedAsyncBlock = true - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect(executedAsyncBlock).toEventually(beTruthy()) -#endif - } - - func testToEventuallyMustBeInMainThread() { -#if !SWIFT_PACKAGE - var executedAsyncBlock: Bool = false - let asyncOperation: () -> () = { - expect { - expect(1).toEventually(equal(2)) - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - executedAsyncBlock = true - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect(executedAsyncBlock).toEventually(beTruthy()) -#endif - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift deleted file mode 100644 index 26e5a98..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation - -class ObjectWithLazyProperty { - init() {} - lazy var value: String = "hello" - lazy var anotherValue: String = { return "world" }() -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift deleted file mode 100644 index f300d47..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest - -// XCTestCaseProvider should be adopted by all XCTestCase subclasses. It provides a -// mechanism for us to fail tests in Xcode which haven't been included in the `allTests` -// list for swift-corelibs-xctest which is unable to dynamically discover tests. Note -// that only `static var allTests` needs to be explicitly implemented, as `allTestNames` -// has a default implementation provided by a protocol extension. - -// Implementation note: This is broken down into two separate protocols because we need a -// protocol with no Self references to which we can cast XCTestCase instances in a non-generic context. - -public protocol XCTestCaseProviderStatic { - // This should be explicitly implemented by XCTestCase subclasses - static var allTests: [(String, (Self) -> () throws -> Void)] { get } -} - -public protocol XCTestCaseNameProvider { - // This does not need to be explicitly implemented because of the protocol extension below - var allTestNames: [String] { get } -} - -public protocol XCTestCaseProvider: XCTestCaseProviderStatic, XCTestCaseNameProvider {} - -extension XCTestCaseProvider where Self: XCTestCaseProviderStatic { - var allTestNames: [String] { - return type(of: self).allTests.map({ name, test in - return name - }) - } -} - -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) - -extension XCTestCase { - override open func tearDown() { - if let provider = self as? XCTestCaseNameProvider { - provider.assertContainsTest(invocation!.selector.description) - } - - super.tearDown() - } -} - -extension XCTestCaseNameProvider { - fileprivate func assertContainsTest(_ name: String) { - let contains = self.allTestNames.contains(name) - XCTAssert(contains, "Test '\(name)' is missing from the allTests array") - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/utils.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/utils.swift deleted file mode 100644 index 0b33ea6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/utils.swift +++ /dev/null @@ -1,98 +0,0 @@ -import Dispatch -import Foundation -@testable import Nimble -import XCTest - -func failsWithErrorMessage(_ messages: [String], file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () throws -> Void) { - var filePath = file - var lineNumber = line - - let recorder = AssertionRecorder() - withAssertionHandler(recorder, closure: closure) - - for msg in messages { - var lastFailure: AssertionRecord? - var foundFailureMessage = false - - for assertion in recorder.assertions { - lastFailure = assertion - if assertion.message.stringValue == msg { - foundFailureMessage = true - break - } - } - - if foundFailureMessage { - continue - } - - if preferOriginalSourceLocation { - if let failure = lastFailure { - filePath = failure.location.file - lineNumber = failure.location.line - } - } - - let message: String - if let lastFailure = lastFailure { - message = "Got failure message: \"\(lastFailure.message.stringValue)\", but expected \"\(msg)\"" - } else { - message = "expected failure message, but got none" - } - NimbleAssertionHandler.assert(false, - message: FailureMessage(stringValue: message), - location: SourceLocation(file: filePath, line: lineNumber)) - } -} - -func failsWithErrorMessage(_ message: String, file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () -> Void) { - return failsWithErrorMessage( - [message], - file: file, - line: line, - preferOriginalSourceLocation: preferOriginalSourceLocation, - closure: closure - ) -} - -func failsWithErrorMessageForNil(_ message: String, file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () -> Void) { - failsWithErrorMessage("\(message) (use beNil() to match nils)", file: file, line: line, preferOriginalSourceLocation: preferOriginalSourceLocation, closure: closure) -} - - func deferToMainQueue(action: @escaping () -> Void) { - DispatchQueue.main.async { - Thread.sleep(forTimeInterval: 0.01) - action() - } - } - -public class NimbleHelper : NSObject { - public class func expectFailureMessage(_ message: NSString, block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessage(String(describing: message), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } - - public class func expectFailureMessages(_ messages: [NSString], block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessage(messages.map({String(describing: $0)}), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } - - public class func expectFailureMessageForNil(_ message: NSString, block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessageForNil(String(describing: message), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } -} - -extension Date { - init(dateTimeString: String) { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - dateFormatter.locale = Locale(identifier: "en_US_POSIX") - let date = dateFormatter.date(from: dateTimeString)! - self.init(timeInterval:0, since:date) - } -} - -extension NSDate { - convenience init(dateTimeString: String) { - let date = Date(dateTimeString: dateTimeString) - self.init(timeIntervalSinceReferenceDate: date.timeIntervalSinceReferenceDate) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Info.plist deleted file mode 100644 index 6d32c15..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/LinuxSupport.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/LinuxSupport.swift deleted file mode 100644 index 03ff8e1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/LinuxSupport.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -#if os(Linux) - extension NSNotification.Name { - init(_ rawValue: String) { - self.init(rawValue: rawValue) - } - } -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift deleted file mode 100644 index 0f4327a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift +++ /dev/null @@ -1,126 +0,0 @@ -import XCTest -import Nimble - -/// Add operators to `Optional` for conforming `Comparable` that removed in Swift 3.0 -extension Optional where Wrapped: Comparable { - static func < (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l < r - case (nil, _?): - return true - default: - return false - } - } - - static func > (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l > r - default: - return rhs < lhs - } - } - - static func <= (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l <= r - default: - return !(rhs < lhs) - } - } - - static func >= (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l >= r - default: - return !(lhs < rhs) - } - } -} - -final class AllPassTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AllPassTest) -> () throws -> Void)] { - return [ - ("testAllPassArray", testAllPassArray), - ("testAllPassMatcher", testAllPassMatcher), - ("testAllPassCollectionsWithOptionalsDontWork", testAllPassCollectionsWithOptionalsDontWork), - ("testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer", testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer), - ("testAllPassSet", testAllPassSet), - ("testAllPassWithNilAsExpectedValue", testAllPassWithNilAsExpectedValue), - ] - } - - func testAllPassArray() { - expect([1,2,3,4]).to(allPass({$0 < 5})) - expect([1,2,3,4]).toNot(allPass({$0 > 5})) - - failsWithErrorMessage( - "expected to all pass a condition, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1,2,3,4]).to(allPass({$0 < 3})) - } - failsWithErrorMessage("expected to not all pass a condition") { - expect([1,2,3,4]).toNot(allPass({$0 < 5})) - } - failsWithErrorMessage( - "expected to all be something, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1,2,3,4]).to(allPass("be something", {$0 < 3})) - } - failsWithErrorMessage("expected to not all be something") { - expect([1,2,3,4]).toNot(allPass("be something", {$0 < 5})) - } - } - - func testAllPassMatcher() { - expect([1,2,3,4]).to(allPass(beLessThan(5))) - expect([1,2,3,4]).toNot(allPass(beGreaterThan(5))) - - failsWithErrorMessage( - "expected to all be less than <3>, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1,2,3,4]).to(allPass(beLessThan(3))) - } - failsWithErrorMessage("expected to not all be less than <5>") { - expect([1,2,3,4]).toNot(allPass(beLessThan(5))) - } - } - - func testAllPassCollectionsWithOptionalsDontWork() { - failsWithErrorMessage("expected to all be nil, but failed first at element in <[nil, nil, nil]>") { - expect([nil, nil, nil] as [Int?]).to(allPass(beNil())) - } - failsWithErrorMessage("expected to all pass a condition, but failed first at element in <[nil, nil, nil]>") { - expect([nil, nil, nil] as [Int?]).to(allPass({$0 == nil})) - } - } - - func testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer() { - expect([nil, nil, nil] as [Int?]).to(allPass({$0! == nil})) - expect([nil, 1, nil] as [Int?]).toNot(allPass({$0! == nil})) - expect([1, 1, 1] as [Int?]).to(allPass({$0! == 1})) - expect([1, 1, nil] as [Int?]).toNot(allPass({$0! == 1})) - expect([1, 2, 3] as [Int?]).to(allPass({$0! < 4})) - expect([1, 2, 3] as [Int?]).toNot(allPass({$0! < 3})) - expect([1, 2, nil] as [Int?]).to(allPass({$0! < 3})) - } - - func testAllPassSet() { - expect(Set([1,2,3,4])).to(allPass({$0 < 5})) - expect(Set([1,2,3,4])).toNot(allPass({$0 > 5})) - - failsWithErrorMessage("expected to not all pass a condition") { - expect(Set([1,2,3,4])).toNot(allPass({$0 < 5})) - } - failsWithErrorMessage("expected to not all be something") { - expect(Set([1,2,3,4])).toNot(allPass("be something", {$0 < 5})) - } - } - - func testAllPassWithNilAsExpectedValue() { - failsWithErrorMessageForNil("expected to all pass") { - expect(nil as [Int]?).to(allPass(beLessThan(5))) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift deleted file mode 100644 index 121ecbd..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble - -#if _runtime(_ObjC) - -class TestNull : NSNull {} - -final class BeAKindOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAKindOfTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testFailureMessages", testFailureMessages), - ("testSwiftTypesFailureMessages", testSwiftTypesFailureMessages), - ] - } - - func testPositiveMatch() { - expect(TestNull()).to(beAKindOf(NSNull.self)) - expect(NSObject()).to(beAKindOf(NSObject.self)) - expect(NSNumber(value:1)).toNot(beAKindOf(NSDate.self)) - } - - func testFailureMessages() { - failsWithErrorMessageForNil("expected to not be a kind of NSNull, got ") { - expect(nil as NSNull?).toNot(beAKindOf(NSNull.self)) - } - failsWithErrorMessageForNil("expected to be a kind of NSString, got ") { - expect(nil as NSString?).to(beAKindOf(NSString.self)) - } - failsWithErrorMessage("expected to be a kind of NSString, got <__NSCFNumber instance>") { - expect(NSNumber(value:1)).to(beAKindOf(NSString.self)) - } - failsWithErrorMessage("expected to not be a kind of NSNumber, got <__NSCFNumber instance>") { - expect(NSNumber(value:1)).toNot(beAKindOf(NSNumber.self)) - } - } - - func testSwiftTypesFailureMessages() { - enum TestEnum { - case one, two - } - failsWithErrorMessage("beAKindOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect(1).to(beAKindOf(Int.self)) - } - failsWithErrorMessage("beAKindOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect("test").to(beAKindOf(String.self)) - } - failsWithErrorMessage("beAKindOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect(TestEnum.one).to(beAKindOf(TestEnum.self)) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift deleted file mode 100644 index c4a4954..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift +++ /dev/null @@ -1,58 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeAnInstanceOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAnInstanceOfTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testFailureMessages", testFailureMessages), - ("testSwiftTypesFailureMessages", testSwiftTypesFailureMessages), - ] - } - - func testPositiveMatch() { - expect(NSNull()).to(beAnInstanceOf(NSNull.self)) - expect(NSNumber(value:1)).toNot(beAnInstanceOf(NSDate.self)) - } - - func testFailureMessages() { - failsWithErrorMessageForNil("expected to not be an instance of NSNull, got ") { - expect(nil as NSNull?).toNot(beAnInstanceOf(NSNull.self)) - } - failsWithErrorMessageForNil("expected to be an instance of NSString, got ") { - expect(nil as NSString?).to(beAnInstanceOf(NSString.self)) - } -#if _runtime(_ObjC) - let numberTypeName = "__NSCFNumber" -#else - let numberTypeName = "NSNumber" -#endif - failsWithErrorMessage("expected to be an instance of NSString, got <\(numberTypeName) instance>") { - expect(NSNumber(value:1)).to(beAnInstanceOf(NSString.self)) - } - failsWithErrorMessage("expected to not be an instance of NSNumber, got <\(numberTypeName) instance>") { - expect(NSNumber(value:1)).toNot(beAnInstanceOf(NSNumber.self)) - } - } - - func testSwiftTypesFailureMessages() { - enum TestEnum { - case one, two - } - - failsWithErrorMessage("beAnInstanceOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect(1).to(beAnInstanceOf(Int.self)) - } - failsWithErrorMessage("beAnInstanceOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect("test").to(beAnInstanceOf(String.self)) - } - failsWithErrorMessage("beAnInstanceOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect(TestEnum.one).to(beAnInstanceOf(TestEnum.self)) - } - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift deleted file mode 100644 index c9e9c48..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift +++ /dev/null @@ -1,160 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeCloseToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeCloseToTest) -> () throws -> Void)] { - return [ - ("testBeCloseTo", testBeCloseTo), - ("testBeCloseToWithin", testBeCloseToWithin), - ("testBeCloseToWithNSNumber", testBeCloseToWithNSNumber), - ("testBeCloseToWithDate", testBeCloseToWithDate), - ("testBeCloseToWithNSDate", testBeCloseToWithNSDate), - ("testBeCloseToOperator", testBeCloseToOperator), - ("testBeCloseToWithinOperator", testBeCloseToWithinOperator), - ("testPlusMinusOperator", testPlusMinusOperator), - ("testBeCloseToOperatorWithDate", testBeCloseToOperatorWithDate), - ("testBeCloseToWithinOperatorWithDate", testBeCloseToWithinOperatorWithDate), - ("testPlusMinusOperatorWithDate", testPlusMinusOperatorWithDate), - ("testBeCloseToArray", testBeCloseToArray), - ("testBeCloseToWithCGFloat", testBeCloseToWithCGFloat), - ] - } - - func testBeCloseTo() { - expect(1.2).to(beCloseTo(1.2001)) - expect(1.2 as CDouble).to(beCloseTo(1.2001)) - expect(1.2 as Float).to(beCloseTo(1.2001)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 0.0001), got <1.2>") { - expect(1.2).toNot(beCloseTo(1.2001)) - } - } - - func testBeCloseToWithin() { - expect(1.2).to(beCloseTo(9.300, within: 10)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(1.2).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithNSNumber() { - expect(NSNumber(value:1.2)).to(beCloseTo(9.300, within: 10)) - expect(NSNumber(value:1.2)).to(beCloseTo(NSNumber(value:9.300), within: 10)) - expect(1.2).to(beCloseTo(NSNumber(value:9.300), within: 10)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(NSNumber(value:1.2)).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithCGFloat() { - expect(CGFloat(1.2)).to(beCloseTo(1.2001)) - expect(CGFloat(1.2)).to(beCloseTo(CGFloat(1.2001))) - - failsWithErrorMessage("expected to be close to <1.2001> (within 1), got <1.2>") { - expect(CGFloat(1.2)).to(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")).to(beCloseTo(Date(dateTimeString: "2015-08-26 11:43:05"), within: 10)) - - failsWithErrorMessage("expected to not be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")).toNot(beCloseTo(expectedDate, within: 0.004)) - } - } - - func testBeCloseToWithNSDate() { - expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).to(beCloseTo(NSDate(dateTimeString: "2015-08-26 11:43:05"), within: 10)) - - failsWithErrorMessage("expected to not be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = NSDate(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).toNot(beCloseTo(expectedDate, within: 0.004)) - } - } - - func testBeCloseToOperator() { - expect(1.2) ≈ 1.2001 - expect(1.2 as CDouble) ≈ 1.2001 - - failsWithErrorMessage("expected to be close to <1.2002> (within 0.0001), got <1.2>") { - expect(1.2) ≈ 1.2002 - } - } - - func testBeCloseToWithinOperator() { - expect(1.2) ≈ (9.300, 10) - expect(1.2) == (9.300, 10) - - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) ≈ (1.0, 0.1) - } - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) == (1.0, 0.1) - } - } - - func testPlusMinusOperator() { - expect(1.2) ≈ 9.300 ± 10 - expect(1.2) == 9.300 ± 10 - - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) ≈ 1.0 ± 0.1 - } - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) == 1.0 ± 0.1 - } - } - - func testBeCloseToOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ Date(dateTimeString: "2015-08-26 11:43:00") - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.0001), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ expectedDate - } - } - - func testBeCloseToWithinOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ (Date(dateTimeString: "2015-08-26 11:43:05"), 10) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == (Date(dateTimeString: "2015-08-26 11:43:05"), 10) - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ (expectedDate, 0.006) - } - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == (expectedDate, 0.006) - } - } - - func testPlusMinusOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ Date(dateTimeString: "2015-08-26 11:43:05") ± 10 - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == Date(dateTimeString: "2015-08-26 11:43:05") ± 10 - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ expectedDate ± 0.006 - } - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == expectedDate ± 0.006 - } - } - - func testBeCloseToArray() { - expect([0.0, 1.1, 2.2]) ≈ [0.0001, 1.1001, 2.2001] - expect([0.0, 1.1, 2.2]).to(beCloseTo([0.1, 1.2, 2.3], within: 0.1)) - - failsWithErrorMessage("expected to be close to <[0, 1]> (each within 0.0001), got <[0, 1.1]>") { - expect([0.0, 1.1]) ≈ [0.0, 1.0] - } - failsWithErrorMessage("expected to be close to <[0.2, 1.2]> (each within 0.1), got <[0, 1.1]>") { - expect([0.0, 1.1]).to(beCloseTo([0.2, 1.2], within: 0.1)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift deleted file mode 100644 index d7f35aa..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift +++ /dev/null @@ -1,82 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeEmptyTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeEmptyTest) -> () throws -> Void)] { - return [ - ("testBeEmptyPositive", testBeEmptyPositive), - ("testBeEmptyNegative", testBeEmptyNegative), - ] - } - - func testBeEmptyPositive() { - expect([] as [Int]).to(beEmpty()) - expect([1]).toNot(beEmpty()) - - expect([] as [CInt]).to(beEmpty()) - expect([1] as [CInt]).toNot(beEmpty()) - -#if _runtime(_ObjC) - expect(NSDictionary() as? [Int:Int]).to(beEmpty()) - expect(NSDictionary(object: 1, forKey: 1 as NSNumber) as? [Int:Int]).toNot(beEmpty()) -#endif - - expect(Dictionary()).to(beEmpty()) - expect(["hi": 1]).toNot(beEmpty()) - -#if _runtime(_ObjC) - expect(NSArray() as? [Int]).to(beEmpty()) - expect(NSArray(array: [1]) as? [Int]).toNot(beEmpty()) -#endif - - expect(NSSet()).to(beEmpty()) - expect(NSSet(array: [NSNumber(value: 1)])).toNot(beEmpty()) - - expect(NSIndexSet()).to(beEmpty()) - expect(NSIndexSet(index: 1)).toNot(beEmpty()) - - expect(NSString()).to(beEmpty()) - expect(NSString(string: "hello")).toNot(beEmpty()) - - expect("").to(beEmpty()) - expect("foo").toNot(beEmpty()) - } - - func testBeEmptyNegative() { - failsWithErrorMessageForNil("expected to be empty, got ") { - expect(nil as NSString?).to(beEmpty()) - } - failsWithErrorMessageForNil("expected to not be empty, got ") { - expect(nil as [CInt]?).toNot(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <()>") { - expect(NSArray()).toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got <[1]>") { - expect([1]).to(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <{()}>") { - expect(NSSet()).toNot(beEmpty()); - } - failsWithErrorMessage("expected to be empty, got <{(1)}>") { - expect(NSSet(object: NSNumber(value: 1))).to(beEmpty()); - } - - failsWithErrorMessage("expected to not be empty, got <()>") { - expect(NSIndexSet()).toNot(beEmpty()); - } - failsWithErrorMessage("expected to be empty, got <(1)>") { - expect(NSIndexSet(index: 1)).to(beEmpty()); - } - - failsWithErrorMessage("expected to not be empty, got <>") { - expect("").toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got ") { - expect("foo").to(beEmpty()) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift deleted file mode 100644 index beec4d7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift +++ /dev/null @@ -1,50 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeGreaterThanOrEqualToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeGreaterThanOrEqualToTest) -> () throws -> Void)] { - return [ - ("testGreaterThanOrEqualTo", testGreaterThanOrEqualTo), - ("testGreaterThanOrEqualToOperator", testGreaterThanOrEqualToOperator), - ] - } - - func testGreaterThanOrEqualTo() { - expect(10).to(beGreaterThanOrEqualTo(10)) - expect(10).to(beGreaterThanOrEqualTo(2)) - expect(1).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value:1)).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value:2)).to(beGreaterThanOrEqualTo(NSNumber(value:2))) -#if _runtime(_ObjC) - expect(1).to(beGreaterThanOrEqualTo(NSNumber(value:0))) -#endif - - failsWithErrorMessage("expected to be greater than or equal to <2>, got <0>") { - expect(0).to(beGreaterThanOrEqualTo(2)) - return - } - failsWithErrorMessage("expected to not be greater than or equal to <1>, got <1>") { - expect(1).toNot(beGreaterThanOrEqualTo(1)) - return - } - failsWithErrorMessageForNil("expected to be greater than or equal to <-2>, got ") { - expect(nil as Int?).to(beGreaterThanOrEqualTo(-2)) - } - failsWithErrorMessageForNil("expected to not be greater than or equal to <1>, got ") { - expect(nil as Int?).toNot(beGreaterThanOrEqualTo(1)) - } - } - - func testGreaterThanOrEqualToOperator() { - expect(0) >= 0 - expect(1) >= 0 - expect(NSNumber(value:1)) >= 1 - expect(NSNumber(value:1)) >= NSNumber(value:1) - - failsWithErrorMessage("expected to be greater than or equal to <2>, got <1>") { - expect(1) >= 2 - return - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift deleted file mode 100644 index b7dbf47..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift +++ /dev/null @@ -1,50 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeGreaterThanTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeGreaterThanTest) -> () throws -> Void)] { - return [ - ("testGreaterThan", testGreaterThan), - ("testGreaterThanOperator", testGreaterThanOperator), - ] - } - - func testGreaterThan() { - expect(10).to(beGreaterThan(2)) - expect(1).toNot(beGreaterThan(2)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:3)).to(beGreaterThan(2)) -#else - expect(NSNumber(value:3)).to(beGreaterThan(2 as NSNumber)) -#endif - expect(NSNumber(value:1)).toNot(beGreaterThan(NSNumber(value:2))) - - failsWithErrorMessage("expected to be greater than <2>, got <0>") { - expect(0).to(beGreaterThan(2)) - } - failsWithErrorMessage("expected to not be greater than <0>, got <1>") { - expect(1).toNot(beGreaterThan(0)) - } - failsWithErrorMessageForNil("expected to be greater than <-2>, got ") { - expect(nil as Int?).to(beGreaterThan(-2)) - } - failsWithErrorMessageForNil("expected to not be greater than <0>, got ") { - expect(nil as Int?).toNot(beGreaterThan(0)) - } - } - - func testGreaterThanOperator() { - expect(1) > 0 - expect(NSNumber(value:1)) > NSNumber(value:0) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:1)) > 0 -#else - expect(NSNumber(value:1)) > 0 as NSNumber -#endif - failsWithErrorMessage("expected to be greater than <2>, got <1>") { - expect(1) > 2 - return - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift deleted file mode 100644 index a598bfb..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeIdenticalToObjectTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeIdenticalToObjectTest) -> () throws -> Void)] { - return [ - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testFailsOnNils", testFailsOnNils), - ("testOperators", testOperators), - ] - } - - private class BeIdenticalToObjectTester {} - private let testObjectA = BeIdenticalToObjectTester() - private let testObjectB = BeIdenticalToObjectTester() - - func testBeIdenticalToPositive() { - expect(self.testObjectA).to(beIdenticalTo(testObjectA)) - } - - func testBeIdenticalToNegative() { - expect(self.testObjectA).toNot(beIdenticalTo(testObjectB)) - } - - func testBeIdenticalToPositiveMessage() { - let message = String(describing: NSString(format: "expected to be identical to <%p>, got <%p>", - unsafeBitCast(testObjectB, to: Int.self), unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessage(message) { - expect(self.testObjectA).to(beIdenticalTo(self.testObjectB)) - } - } - - func testBeIdenticalToNegativeMessage() { - let message = String(describing: NSString(format: "expected to not be identical to <%p>, got <%p>", - unsafeBitCast(testObjectA, to: Int.self), unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessage(message) { - expect(self.testObjectA).toNot(beIdenticalTo(self.testObjectA)) - } - } - - func testFailsOnNils() { - let message1 = String(describing: NSString(format: "expected to be identical to <%p>, got nil", - unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessageForNil(message1) { - expect(nil as BeIdenticalToObjectTester?).to(beIdenticalTo(self.testObjectA)) - } - - let message2 = String(describing: NSString(format: "expected to not be identical to <%p>, got nil", - unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessageForNil(message2) { - expect(nil as BeIdenticalToObjectTester?).toNot(beIdenticalTo(self.testObjectA)) - } - } - - func testOperators() { - expect(self.testObjectA) === testObjectA - expect(self.testObjectA) !== testObjectB - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift deleted file mode 100644 index a68260a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Foundation -import XCTest -@testable import Nimble - -final class BeIdenticalToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeIdenticalToTest) -> () throws -> Void)] { - return [ - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testOperators", testOperators), - ("testBeAlias", testBeAlias) - ] - } - - func testBeIdenticalToPositive() { - let value = NSDate() - expect(value).to(beIdenticalTo(value)) - } - - func testBeIdenticalToNegative() { - expect(NSNumber(value:1)).toNot(beIdenticalTo(NSString(string: "yo"))) - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) - } - - func testBeIdenticalToPositiveMessage() { - let num1 = NSNumber(value:1) - let num2 = NSNumber(value:2) - let message = "expected to be identical to \(identityAsString(num2)), got \(identityAsString(num1))" - failsWithErrorMessage(message) { - expect(num1).to(beIdenticalTo(num2)) - } - } - - func testBeIdenticalToNegativeMessage() { - let value1 = NSArray(array: []) - let value2 = NSArray(array: []) - let message = "expected to not be identical to \(identityAsString(value2)), got \(identityAsString(value1))" - failsWithErrorMessage(message) { - expect(value1).toNot(beIdenticalTo(value2)) - } - } - - func testOperators() { - let value = NSDate() - expect(value) === value - expect(NSNumber(value:1)) !== NSNumber(value:2) - } - - func testBeAlias() { - let value = NSDate() - expect(value).to(be(value)) - expect(NSNumber(value:1)).toNot(be(NSString(stringLiteral: "turtles"))) - #if _runtime(_ObjC) - expect([1]).toNot(be([1])) - #else - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) - #endif - - let value1 = NSArray(array: []) - let value2 = NSArray(array: []) - let message = "expected to not be identical to \(identityAsString(value2)), got \(identityAsString(value1))" - failsWithErrorMessage(message) { - expect(value1).toNot(be(value2)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift deleted file mode 100644 index 61cfec1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeLessThanOrEqualToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeLessThanOrEqualToTest) -> () throws -> Void)] { - return [ - ("testLessThanOrEqualTo", testLessThanOrEqualTo), - ("testLessThanOrEqualToOperator", testLessThanOrEqualToOperator), - ] - } - - func testLessThanOrEqualTo() { - expect(10).to(beLessThanOrEqualTo(10)) - expect(2).to(beLessThanOrEqualTo(10)) - expect(2).toNot(beLessThanOrEqualTo(1)) - - expect(NSNumber(value:2)).to(beLessThanOrEqualTo(10)) - expect(NSNumber(value:2)).toNot(beLessThanOrEqualTo(1)) -#if _runtime(_ObjC) - expect(2).to(beLessThanOrEqualTo(NSNumber(value:10))) - expect(2).toNot(beLessThanOrEqualTo(NSNumber(value:1))) -#endif - - failsWithErrorMessage("expected to be less than or equal to <0>, got <2>") { - expect(2).to(beLessThanOrEqualTo(0)) - return - } - failsWithErrorMessage("expected to not be less than or equal to <0>, got <0>") { - expect(0).toNot(beLessThanOrEqualTo(0)) - return - } - failsWithErrorMessageForNil("expected to be less than or equal to <2>, got ") { - expect(nil as Int?).to(beLessThanOrEqualTo(2)) - return - } - failsWithErrorMessageForNil("expected to not be less than or equal to <-2>, got ") { - expect(nil as Int?).toNot(beLessThanOrEqualTo(-2)) - return - } - } - - func testLessThanOrEqualToOperator() { - expect(0) <= 1 - expect(1) <= 1 - - failsWithErrorMessage("expected to be less than or equal to <1>, got <2>") { - expect(2) <= 1 - return - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift deleted file mode 100644 index f1c3317..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeLessThanTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeLessThanTest) -> () throws -> Void)] { - return [ - ("testLessThan", testLessThan), - ("testLessThanOperator", testLessThanOperator), - ] - } - - func testLessThan() { - expect(2).to(beLessThan(10)) - expect(2).toNot(beLessThan(1)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:2)).to(beLessThan(10)) - expect(NSNumber(value:2)).toNot(beLessThan(1)) - - expect(2).to(beLessThan(NSNumber(value:10))) - expect(2).toNot(beLessThan(NSNumber(value:1))) -#else - expect(NSNumber(value:2)).to(beLessThan(10 as NSNumber)) - expect(NSNumber(value:2)).toNot(beLessThan(1 as NSNumber)) - - expect(2 as NSNumber).to(beLessThan(NSNumber(value:10))) - expect(2 as NSNumber).toNot(beLessThan(NSNumber(value:1))) -#endif - - failsWithErrorMessage("expected to be less than <0>, got <2>") { - expect(2).to(beLessThan(0)) - } - failsWithErrorMessage("expected to not be less than <1>, got <0>") { - expect(0).toNot(beLessThan(1)) - } - - failsWithErrorMessageForNil("expected to be less than <2>, got ") { - expect(nil as Int?).to(beLessThan(2)) - } - failsWithErrorMessageForNil("expected to not be less than <-1>, got ") { - expect(nil as Int?).toNot(beLessThan(-1)) - } - } - - func testLessThanOperator() { - expect(0) < 1 -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:0)) < 1 -#else - expect(NSNumber(value:0)) < 1 as NSNumber -#endif - failsWithErrorMessage("expected to be less than <1>, got <2>") { - expect(2) < 1 - return - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift deleted file mode 100644 index 9b8735c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift +++ /dev/null @@ -1,270 +0,0 @@ -import XCTest -import Nimble -import Foundation - -enum ConvertsToBool : ExpressibleByBooleanLiteral, CustomStringConvertible { - case trueLike, falseLike - - typealias BooleanLiteralType = Bool - - init(booleanLiteral value: Bool) { - switch value { - case true: self = .trueLike - case false: self = .falseLike - } - } - - var boolValue : Bool { - switch self { - case .trueLike: return true - case .falseLike: return false - } - } - - var description : String { - switch self { - case .trueLike: return "TrueLike" - case .falseLike: return "FalseLike" - } - } -} - -final class BeTruthyTest : XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeTruthyTest) -> () throws -> Void)] { - return [ - ("testShouldMatchNonNilTypes", testShouldMatchNonNilTypes), - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchNilTypes", testShouldNotMatchNilTypes), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ("testShouldMatchBoolConvertibleTypesThatConvertToTrue", testShouldMatchBoolConvertibleTypesThatConvertToTrue), - ("testShouldNotMatchBoolConvertibleTypesThatConvertToFalse", testShouldNotMatchBoolConvertibleTypesThatConvertToFalse), - ] - } - - func testShouldMatchNonNilTypes() { - expect(true as Bool?).to(beTruthy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(1 as Int8?).to(beTruthy()) - expect(1 as UInt8?).to(beTruthy()) - expect(1 as Int16?).to(beTruthy()) - expect(1 as UInt16?).to(beTruthy()) - expect(1 as Int32?).to(beTruthy()) - expect(1 as UInt32?).to(beTruthy()) - expect(1 as Int64?).to(beTruthy()) - expect(1 as UInt64?).to(beTruthy()) - expect(1 as Float?).to(beTruthy()) - expect(1 as Double?).to(beTruthy()) - expect(1 as Int?).to(beTruthy()) - expect(1 as UInt?).to(beTruthy()) - } - - func testShouldMatchTrue() { - expect(true).to(beTruthy()) - - failsWithErrorMessage("expected to not be truthy, got ") { - expect(true).toNot(beTruthy()) - } - } - - func testShouldNotMatchNilTypes() { - expect(false as Bool?).toNot(beTruthy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(nil as Bool?).toNot(beTruthy()) - expect(nil as Int8?).toNot(beTruthy()) - expect(nil as UInt8?).toNot(beTruthy()) - expect(nil as Int16?).toNot(beTruthy()) - expect(nil as UInt16?).toNot(beTruthy()) - expect(nil as Int32?).toNot(beTruthy()) - expect(nil as UInt32?).toNot(beTruthy()) - expect(nil as Int64?).toNot(beTruthy()) - expect(nil as UInt64?).toNot(beTruthy()) - expect(nil as Float?).toNot(beTruthy()) - expect(nil as Double?).toNot(beTruthy()) - expect(nil as Int?).toNot(beTruthy()) - expect(nil as UInt?).toNot(beTruthy()) - } - - func testShouldNotMatchFalse() { - expect(false).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(false).to(beTruthy()) - } - } - - func testShouldNotMatchNilBools() { - expect(nil as Bool?).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(nil as Bool?).to(beTruthy()) - } - } - - func testShouldMatchBoolConvertibleTypesThatConvertToTrue() { - expect(ConvertsToBool.trueLike).to(beTruthy()) - - failsWithErrorMessage("expected to not be truthy, got ") { - expect(ConvertsToBool.trueLike).toNot(beTruthy()) - } - } - - func testShouldNotMatchBoolConvertibleTypesThatConvertToFalse() { - expect(ConvertsToBool.falseLike).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(ConvertsToBool.falseLike).to(beTruthy()) - } - } -} - -final class BeTrueTest : XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeTrueTest) -> () throws -> Void)] { - return [ - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ] - } - - func testShouldMatchTrue() { - expect(true).to(beTrue()) - - failsWithErrorMessage("expected to not be true, got ") { - expect(true).toNot(beTrue()) - } - } - - func testShouldNotMatchFalse() { - expect(false).toNot(beTrue()) - - failsWithErrorMessage("expected to be true, got ") { - expect(false).to(beTrue()) - } - } - - func testShouldNotMatchNilBools() { - failsWithErrorMessageForNil("expected to not be true, got ") { - expect(nil as Bool?).toNot(beTrue()) - } - - failsWithErrorMessageForNil("expected to be true, got ") { - expect(nil as Bool?).to(beTrue()) - } - } -} - -final class BeFalsyTest : XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeFalsyTest) -> () throws -> Void)] { - return [ - ("testShouldMatchNilTypes", testShouldMatchNilTypes), - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ("testShouldNotMatchNonNilTypes", testShouldNotMatchNonNilTypes), - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldMatchNilBools", testShouldMatchNilBools), - ] - } - - func testShouldMatchNilTypes() { - expect(false as Bool?).to(beFalsy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(nil as Bool?).to(beFalsy()) - expect(nil as Int8?).to(beFalsy()) - expect(nil as UInt8?).to(beFalsy()) - expect(nil as Int16?).to(beFalsy()) - expect(nil as UInt16?).to(beFalsy()) - expect(nil as Int32?).to(beFalsy()) - expect(nil as UInt32?).to(beFalsy()) - expect(nil as Int64?).to(beFalsy()) - expect(nil as UInt64?).to(beFalsy()) - expect(nil as Float?).to(beFalsy()) - expect(nil as Double?).to(beFalsy()) - expect(nil as Int?).to(beFalsy()) - expect(nil as UInt?).to(beFalsy()) - } - - func testShouldNotMatchTrue() { - expect(true).toNot(beFalsy()) - - failsWithErrorMessage("expected to be falsy, got ") { - expect(true).to(beFalsy()) - } - } - - func testShouldNotMatchNonNilTypes() { - expect(true as Bool?).toNot(beFalsy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(1 as Int8?).toNot(beFalsy()) - expect(1 as UInt8?).toNot(beFalsy()) - expect(1 as Int16?).toNot(beFalsy()) - expect(1 as UInt16?).toNot(beFalsy()) - expect(1 as Int32?).toNot(beFalsy()) - expect(1 as UInt32?).toNot(beFalsy()) - expect(1 as Int64?).toNot(beFalsy()) - expect(1 as UInt64?).toNot(beFalsy()) - expect(1 as Float?).toNot(beFalsy()) - expect(1 as Double?).toNot(beFalsy()) - expect(1 as Int?).toNot(beFalsy()) - expect(1 as UInt?).toNot(beFalsy()) - } - - func testShouldMatchFalse() { - expect(false).to(beFalsy()) - - failsWithErrorMessage("expected to not be falsy, got ") { - expect(false).toNot(beFalsy()) - } - } - - func testShouldMatchNilBools() { - expect(nil as Bool?).to(beFalsy()) - - failsWithErrorMessage("expected to not be falsy, got ") { - expect(nil as Bool?).toNot(beFalsy()) - } - } -} - -final class BeFalseTest : XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeFalseTest) -> () throws -> Void)] { - return [ - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ] - } - - func testShouldNotMatchTrue() { - expect(true).toNot(beFalse()) - - failsWithErrorMessage("expected to be false, got ") { - expect(true).to(beFalse()) - } - } - - func testShouldMatchFalse() { - expect(false).to(beFalse()) - - failsWithErrorMessage("expected to not be false, got ") { - expect(false).toNot(beFalse()) - } - } - - func testShouldNotMatchNilBools() { - failsWithErrorMessageForNil("expected to be false, got ") { - expect(nil as Bool?).to(beFalse()) - } - - failsWithErrorMessageForNil("expected to not be false, got ") { - expect(nil as Bool?).toNot(beFalse()) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift deleted file mode 100644 index 78cade0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift +++ /dev/null @@ -1,28 +0,0 @@ -import XCTest -import Nimble - -final class BeNilTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeNilTest) -> () throws -> Void)] { - return [ - ("testBeNil", testBeNil), - ] - } - - func producesNil() -> Array? { - return nil - } - - func testBeNil() { - expect(nil as Int?).to(beNil()) - expect(1 as Int?).toNot(beNil()) - expect(self.producesNil()).to(beNil()) - - failsWithErrorMessage("expected to not be nil, got ") { - expect(nil as Int?).toNot(beNil()) - } - - failsWithErrorMessage("expected to be nil, got <1>") { - expect(1 as Int?).to(beNil()) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift deleted file mode 100644 index a8eefc1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift +++ /dev/null @@ -1,32 +0,0 @@ -import XCTest -import Nimble - -final class BeVoidTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeVoidTest) -> () throws -> Void)] { - return [ - ("testBeVoid", testBeVoid), - ] - } - - func testBeVoid() { - expect(()).to(beVoid()) - expect(() as ()?).to(beVoid()) - expect(nil as ()?).toNot(beVoid()) - - expect(()) == () - expect(() as ()?) == () - expect(nil as ()?) != () - - failsWithErrorMessage("expected to not be void, got <()>") { - expect(()).toNot(beVoid()) - } - - failsWithErrorMessage("expected to not be void, got <()>") { - expect(() as ()?).toNot(beVoid()) - } - - failsWithErrorMessage("expected to be void, got ") { - expect(nil as ()?).to(beVoid()) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift deleted file mode 100644 index a05707c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeginWithTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeginWithTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testNegativeMatches", testNegativeMatches), - ] - } - - func testPositiveMatches() { - expect([1, 2, 3]).to(beginWith(1)) - expect([1, 2, 3]).toNot(beginWith(2)) - - expect("foobar").to(beginWith("foo")) - expect("foobar").toNot(beginWith("oo")) - - expect("foobarfoo").to(beginWith("foo")) - - expect(NSString(string: "foobar").description).to(beginWith("foo")) - expect(NSString(string: "foobar").description).toNot(beginWith("oo")) - -#if _runtime(_ObjC) - expect(NSArray(array: ["a", "b"])).to(beginWith("a")) - expect(NSArray(array: ["a", "b"])).toNot(beginWith("b")) -#endif - } - - func testNegativeMatches() { - failsWithErrorMessageForNil("expected to begin with , got ") { - expect(nil as NSArray?).to(beginWith(NSString(string: "b"))) - } - failsWithErrorMessageForNil("expected to not begin with , got ") { - expect(nil as NSArray?).toNot(beginWith(NSString(string: "b"))) - } - - failsWithErrorMessage("expected to begin with <2>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(beginWith(2)) - } - failsWithErrorMessage("expected to not begin with <1>, got <[1, 2, 3]>") { - expect([1, 2, 3]).toNot(beginWith(1)) - } - failsWithErrorMessage("expected to begin with , got ") { - expect("batman").to(beginWith("atm")) - } - failsWithErrorMessage("expected to not begin with , got ") { - expect("batman").toNot(beginWith("bat")) - } - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift deleted file mode 100644 index 6b20d15..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift +++ /dev/null @@ -1,95 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class ContainTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ContainTest) -> () throws -> Void)] { - return [ - ("testContain", testContain), - ("testContainSubstring", testContainSubstring), - ("testContainObjCSubstring", testContainObjCSubstring), - ("testVariadicArguments", testVariadicArguments), - ("testCollectionArguments", testCollectionArguments), - ] - } - - func testContain() { - expect([1, 2, 3]).to(contain(1)) - expect([1, 2, 3] as [CInt]).to(contain(1 as CInt)) - expect([1, 2, 3] as Array).to(contain(1 as CInt)) - expect(["foo", "bar", "baz"]).to(contain("baz")) - expect([1, 2, 3]).toNot(contain(4)) - expect(["foo", "bar", "baz"]).toNot(contain("ba")) -#if _runtime(_ObjC) - expect(NSArray(array: ["a"])).to(contain(NSString(string: "a"))) - expect(NSArray(array: ["a"])).toNot(contain(NSString(string:"b"))) - expect(NSArray(object: 1) as NSArray?).to(contain(1)) -#endif - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain("bar")) - } - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain("b")) - } - - failsWithErrorMessageForNil("expected to contain , got ") { - expect(nil as [String]?).to(contain("bar")) - } - failsWithErrorMessageForNil("expected to not contain , got ") { - expect(nil as [String]?).toNot(contain("b")) - } - } - - func testContainSubstring() { - expect("foo").to(contain("o")) - expect("foo").to(contain("oo")) - expect("foo").toNot(contain("z")) - expect("foo").toNot(contain("zz")) - - failsWithErrorMessage("expected to contain , got ") { - expect("foo").to(contain("bar")) - } - failsWithErrorMessage("expected to not contain , got ") { - expect("foo").toNot(contain("oo")) - } - } - - func testContainObjCSubstring() { - let str = NSString(string: "foo") - expect(str).to(contain(NSString(string: "o"))) - expect(str).to(contain(NSString(string: "oo"))) - expect(str).toNot(contain(NSString(string: "z"))) - expect(str).toNot(contain(NSString(string: "zz"))) - } - - func testVariadicArguments() { - expect([1, 2, 3]).to(contain(1, 2)) - expect([1, 2, 3]).toNot(contain(1, 4)) - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain("a", "bar")) - } - - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain("bar", "b")) - } - } - - func testCollectionArguments() { - expect([1, 2, 3]).to(contain([1, 2])) - expect([1, 2, 3]).toNot(contain([1, 4])) - - let collection = Array(1...10) - let slice = Array(collection[3...5]) - expect(collection).to(contain(slice)) - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain(["a", "bar"])) - } - - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain(["bar", "b"])) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift deleted file mode 100644 index 3e19426..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class EndWithTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (EndWithTest) -> () throws -> Void)] { - return [ - ("testEndWithPositives", testEndWithPositives), - ("testEndWithNegatives", testEndWithNegatives), - ] - } - - func testEndWithPositives() { - expect([1, 2, 3]).to(endWith(3)) - expect([1, 2, 3]).toNot(endWith(2)) - expect([]).toNot(endWith(1)) - expect(["a", "b", "a"]).to(endWith("a")) - - expect("foobar").to(endWith("bar")) - expect("foobar").toNot(endWith("oo")) - expect("foobarfoo").to(endWith("foo")) - - expect(NSString(string: "foobar").description).to(endWith("bar")) - expect(NSString(string: "foobar").description).toNot(endWith("oo")) - -#if _runtime(_ObjC) - expect(NSArray(array: ["a", "b"])).to(endWith("b")) - expect(NSArray(array: ["a", "b"])).toNot(endWith("a")) - expect(NSArray(array: [])).toNot(endWith("a")) - expect(NSArray(array: ["a", "b", "a"])).to(endWith("a")) -#endif - } - - func testEndWithNegatives() { - failsWithErrorMessageForNil("expected to end with <2>, got ") { - expect(nil as [Int]?).to(endWith(2)) - } - failsWithErrorMessageForNil("expected to not end with <2>, got ") { - expect(nil as [Int]?).toNot(endWith(2)) - } - - failsWithErrorMessage("expected to end with <2>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(endWith(2)) - } - failsWithErrorMessage("expected to not end with <3>, got <[1, 2, 3]>") { - expect([1, 2, 3]).toNot(endWith(3)) - } - failsWithErrorMessage("expected to end with , got ") { - expect("batman").to(endWith("atm")) - } - failsWithErrorMessage("expected to not end with , got ") { - expect("batman").toNot(endWith("man")) - } - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift deleted file mode 100644 index a66a784..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift +++ /dev/null @@ -1,274 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class EqualTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (EqualTest) -> () throws -> Void)] { - return [ - ("testEquality", testEquality), - ("testArrayEquality", testArrayEquality), - ("testSetEquality", testSetEquality), - ("testDoesNotMatchNils", testDoesNotMatchNils), - ("testDictionaryEquality", testDictionaryEquality), - ("testDataEquality", testDataEquality), - ("testNSObjectEquality", testNSObjectEquality), - ("testOperatorEquality", testOperatorEquality), - ("testOperatorEqualityWithArrays", testOperatorEqualityWithArrays), - ("testOperatorEqualityWithDictionaries", testOperatorEqualityWithDictionaries), - ("testOptionalEquality", testOptionalEquality), - ("testArrayOfOptionalsEquality", testArrayOfOptionalsEquality), - ("testDictionariesWithDifferentSequences", testDictionariesWithDifferentSequences), - ] - } - - func testEquality() { - expect(1 as CInt).to(equal(1 as CInt)) - expect(1 as CInt).to(equal(1)) - expect(1).to(equal(1)) - expect("hello").to(equal("hello")) - expect("hello").toNot(equal("world")) - - expect { - 1 - }.to(equal(1)) - - failsWithErrorMessage("expected to equal , got ") { - expect("hello").to(equal("world")) - } - failsWithErrorMessage("expected to not equal , got ") { - expect("hello").toNot(equal("hello")) - } - } - - func testArrayEquality() { - expect([1, 2, 3]).to(equal([1, 2, 3])) - expect([1, 2, 3]).toNot(equal([1, 2])) - expect([1, 2, 3]).toNot(equal([1, 2, 4])) - - let array1: Array = [1, 2, 3] - let array2: Array = [1, 2, 3] - expect(array1).to(equal(array2)) - expect(array1).to(equal([1, 2, 3])) - expect(array1).toNot(equal([1, 2] as Array)) - -#if _runtime(_ObjC) - expect(NSArray(array: [1, 2, 3])).to(equal(NSArray(array: [1, 2, 3]))) -#endif - - failsWithErrorMessage("expected to equal <[1, 2]>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(equal([1, 2])) - } - } - - func testSetEquality() { - expect(Set([1, 2])).to(equal(Set([1, 2]))) - expect(Set()).to(equal(Set())) - expect(Set()) == Set() - expect(Set([1, 2])) != Set() - - failsWithErrorMessageForNil("expected to equal <[1, 2]>, got ") { - expect(nil as Set?).to(equal(Set([1, 2]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3]>, missing <[1]>") { - expect(Set([2, 3])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[1, 2, 3, 4]>, extra <[4]>") { - expect(Set([1, 2, 3, 4])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3, 4]>, missing <[1]>, extra <[4]>") { - expect(Set([2, 3, 4])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3, 4]>, missing <[1]>, extra <[4]>") { - expect(Set([2, 3, 4])) == Set([1, 2, 3]) - } - - failsWithErrorMessage("expected to not equal <[1, 2, 3]>, got <[1, 2, 3]>") { - expect(Set([1, 2, 3])) != Set([1, 2, 3]) - } - } - - func testDoesNotMatchNils() { - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as String?).to(equal(nil as String?)) - } - failsWithErrorMessageForNil("expected to not equal , got ") { - expect("foo").toNot(equal(nil as String?)) - } - failsWithErrorMessageForNil("expected to not equal , got ") { - expect(nil as String?).toNot(equal("bar")) - } - - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as [Int]?).to(equal(nil as [Int]?)) - } - failsWithErrorMessageForNil("expected to not equal <[1]>, got ") { - expect(nil as [Int]?).toNot(equal([1])) - } - failsWithErrorMessageForNil("expected to not equal , got <[1]>") { - expect([1]).toNot(equal(nil as [Int]?)) - } - - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as [Int: Int]?).to(equal(nil as [Int: Int]?)) - } - failsWithErrorMessageForNil("expected to not equal <[1: 1]>, got ") { - expect(nil as [Int: Int]?).toNot(equal([1: 1])) - } - failsWithErrorMessageForNil("expected to not equal , got <[1: 1]>") { - expect([1: 1]).toNot(equal(nil as [Int: Int]?)) - } - } - - func testDictionaryEquality() { - expect(["foo": "bar"]).to(equal(["foo": "bar"])) - expect(["foo": "bar"]).toNot(equal(["foo": "baz"])) - - let actual = ["foo": "bar"] - let expected = ["foo": "bar"] - let unexpected = ["foo": "baz"] - expect(actual).to(equal(expected)) - expect(actual).toNot(equal(unexpected)) - -#if _runtime(_ObjC) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString)).to(equal(["foo": "bar"])) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString) as? [String:String]).to(equal(expected)) -#endif - } - - func testDataEquality() { - let actual = "foobar".data(using: .utf8) - let expected = "foobar".data(using: .utf8) - let unexpected = "foobarfoo".data(using: .utf8) - - expect(actual).to(equal(expected)) - expect(actual).toNot(equal(unexpected)) - - #if os(Linux) - // FIXME: Swift on Linux triggers a segfault when calling NSData's hash() (last checked on 03-11) - let expectedErrorMessage = "expected to equal >, got >" - #else - let expectedErrorMessage = "expected to equal >," - + " got >" - #endif - - failsWithErrorMessage(expectedErrorMessage) { - expect(actual).to(equal(unexpected)) - } - } - - func testNSObjectEquality() { - expect(NSNumber(value:1)).to(equal(NSNumber(value:1))) - expect(NSNumber(value:1)) == NSNumber(value:1) - expect(NSNumber(value:1)) != NSNumber(value:2) - expect { NSNumber(value:1) }.to(equal(1)) - } - - func testOperatorEquality() { - expect("foo") == "foo" - expect("foo") != "bar" - - failsWithErrorMessage("expected to equal , got ") { - expect("hello") == "world" - return - } - failsWithErrorMessage("expected to not equal , got ") { - expect("hello") != "hello" - return - } - } - - func testOperatorEqualityWithArrays() { - let array1: Array = [1, 2, 3] - let array2: Array = [1, 2, 3] - let array3: Array = [1, 2] - expect(array1) == array2 - expect(array1) != array3 - } - - func testOperatorEqualityWithDictionaries() { - let dict1 = ["foo": "bar"] - let dict2 = ["foo": "bar"] - let dict3 = ["foo": "baz"] - expect(dict1) == dict2 - expect(dict1) != dict3 - } - - func testOptionalEquality() { - expect(1 as CInt?).to(equal(1)) - expect(1 as CInt?).to(equal(1 as CInt?)) - - expect(1).toNot(equal(nil)) - } - - func testArrayOfOptionalsEquality() { - let array1: Array = [1, nil, 3] - let array2: Array = [nil, 2, 3] - let array3: Array = [1, nil, 3] - - expect(array1).toNot(equal(array2)) - expect(array1).to(equal(array3)) - expect(array2).toNot(equal(array3)) - - let allNils1: Array = [nil, nil, nil, nil] - let allNils2: Array = [nil, nil, nil, nil] - let notReallyAllNils: Array = [nil, nil, nil, "turtles"] - - expect(allNils1).to(equal(allNils2)) - expect(allNils1).toNot(equal(notReallyAllNils)) - - let noNils1: Array = [1, 2, 3, 4, 5] - let noNils2: Array = [1, 3, 5, 7, 9] - - expect(noNils1).toNot(equal(noNils2)) - - failsWithErrorMessage("expected to equal <[Optional(1), nil]>, got <[nil, Optional(2)]>") { - let arrayOfOptionalInts: Array = [nil, 2] - let anotherArrayOfOptionalInts: Array = [1, nil] - expect(arrayOfOptionalInts).to(equal(anotherArrayOfOptionalInts)) - return - } - } - - func testDictionariesWithDifferentSequences() { - // see: https://github.com/Quick/Nimble/issues/61 - // these dictionaries generate different orderings of sequences. - let result = ["how":1, "think":1, "didnt":2, "because":1, - "interesting":1, "always":1, "right":1, "such":1, - "to":3, "say":1, "cool":1, "you":1, - "weather":3, "be":1, "went":1, "was":2, - "sometimes":1, "and":3, "mind":1, "rain":1, - "whole":1, "everything":1, "weather.":1, "down":1, - "kind":1, "mood.":1, "it":2, "everyday":1, "might":1, - "more":1, "have":2, "person":1, "could":1, "tenth":2, - "night":1, "write":1, "Youd":1, "affects":1, "of":3, - "Who":1, "us":1, "an":1, "I":4, "my":1, "much":2, - "wrong.":1, "peacefully.":1, "amazing":3, "would":4, - "just":1, "grade.":1, "Its":2, "The":2, "had":1, "that":1, - "the":5, "best":1, "but":1, "essay":1, "for":1, "summer":2, - "your":1, "grade":1, "vary":1, "pretty":1, "at":1, "rain.":1, - "about":1, "allow":1, "thought":1, "in":1, "sleep":1, "a":1, - "hot":1, "really":1, "beach":1, "life.":1, "we":1, "although":1] - - let storyCount = ["The":2, "summer":2, "of":3, "tenth":2, "grade":1, - "was":2, "the":5, "best":1, "my":1, "life.":1, "I":4, - "went":1, "to":3, "beach":1, "everyday":1, "and":3, - "we":1, "had":1, "amazing":3, "weather.":1, "weather":3, - "didnt":2, "really":1, "vary":1, "much":2, "always":1, - "pretty":1, "hot":1, "although":1, "sometimes":1, "at":1, - "night":1, "it":2, "would":4, "rain.":1, "mind":1, "rain":1, - "because":1, "cool":1, "everything":1, "down":1, "allow":1, - "us":1, "sleep":1, "peacefully.":1, "Its":2, "how":1, - "affects":1, "your":1, "mood.":1, "Who":1, "have":2, - "thought":1, "that":1, "could":1, "write":1, "a":1, - "whole":1, "essay":1, "just":1, "about":1, "in":1, - "grade.":1, "kind":1, "right":1, "Youd":1, "think":1, - "for":1, "such":1, "an":1, "interesting":1, "person":1, - "might":1, "more":1, "say":1, "but":1, "you":1, "be":1, "wrong.":1] - - expect(result).to(equal(storyCount)) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift deleted file mode 100644 index de5033d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble - -final class HaveCountTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (HaveCountTest) -> () throws -> Void)] { - return [ - ("testHaveCountForArray", testHaveCountForArray), - ("testHaveCountForDictionary", testHaveCountForDictionary), - ("testHaveCountForSet", testHaveCountForSet), - ] - } - - func testHaveCountForArray() { - expect([1, 2, 3]).to(haveCount(3)) - expect([1, 2, 3]).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Array with count 1, got 3\nActual Value: [1, 2, 3]") { - expect([1, 2, 3]).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Array with count 3, got 3\nActual Value: [1, 2, 3]") { - expect([1, 2, 3]).notTo(haveCount(3)) - } - } - - func testHaveCountForDictionary() { - let dictionary = ["1":1, "2":2, "3":3] - expect(dictionary).to(haveCount(3)) - expect(dictionary).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Dictionary with count 1, got 3\nActual Value: \(stringify(dictionary))") { - expect(dictionary).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Dictionary with count 3, got 3" + - "\nActual Value: \(stringify(dictionary))") { - expect(dictionary).notTo(haveCount(3)) - } - } - - func testHaveCountForSet() { - let set = Set([1, 2, 3]) - expect(set).to(haveCount(3)) - expect(set).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Set with count 1, got 3" + - "\nActual Value: \(stringify(set))") { - expect(set).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Set with count 3, got 3" + - "\nActual Value: \(stringify(set))") { - expect(set).notTo(haveCount(3)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift deleted file mode 100644 index 940a214..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift +++ /dev/null @@ -1,83 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class MatchErrorTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (MatchErrorTest) -> () throws -> Void)] { - return [ - ("testMatchErrorPositive", testMatchErrorPositive), - ("testMatchErrorNegative", testMatchErrorNegative), - ("testMatchNSErrorPositive", testMatchNSErrorPositive), - ("testMatchNSErrorNegative", testMatchNSErrorNegative), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testDoesNotMatchNils", testDoesNotMatchNils), - ] - } - - func testMatchErrorPositive() { - expect(NimbleError.laugh).to(matchError(NimbleError.laugh)) - expect(NimbleError.laugh).to(matchError(NimbleError.self)) - expect(EquatableError.parameterized(x: 1)).to(matchError(EquatableError.parameterized(x: 1))) - - expect(NimbleError.laugh as Error).to(matchError(NimbleError.laugh)) - } - - func testMatchErrorNegative() { - expect(NimbleError.laugh).toNot(matchError(NimbleError.cry)) - expect(NimbleError.laugh as Error).toNot(matchError(NimbleError.cry)) - expect(NimbleError.laugh).toNot(matchError(EquatableError.self)) - } - - func testMatchNSErrorPositive() { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 0, userInfo: nil) - - expect(error1).to(matchError(error2)) - } - - func testMatchNSErrorNegative() { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 1, userInfo: nil) - - expect(error1).toNot(matchError(error2)) - } - - func testMatchPositiveMessage() { - failsWithErrorMessage("expected to match error , got ") { - expect(EquatableError.parameterized(x: 1)).to(matchError(EquatableError.parameterized(x: 2))) - } - failsWithErrorMessage("expected to match error , got ") { - expect(NimbleError.laugh).to(matchError(NimbleError.cry)) - } - failsWithErrorMessage("expected to match error , got ") { - expect(CustomDebugStringConvertibleError.a).to(matchError(CustomDebugStringConvertibleError.b)) - } - - failsWithErrorMessage("expected to match error , got ") { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 1, userInfo: nil) - expect(error1).to(matchError(error2)) - } - } - - func testMatchNegativeMessage() { - failsWithErrorMessage("expected to not match error , got ") { - expect(NimbleError.laugh).toNot(matchError(NimbleError.laugh)) - } - - failsWithErrorMessage("expected to match error from type , got ") { - expect(NimbleError.laugh).to(matchError(EquatableError.self)) - } - } - - func testDoesNotMatchNils() { - failsWithErrorMessageForNil("expected to match error , got no error") { - expect(nil as Error?).to(matchError(NimbleError.laugh)) - } - - failsWithErrorMessageForNil("expected to not match error , got no error") { - expect(nil as Error?).toNot(matchError(NimbleError.laugh)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift deleted file mode 100644 index 5b6d77f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift +++ /dev/null @@ -1,46 +0,0 @@ -import XCTest -import Nimble - -final class MatchTest:XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (MatchTest) -> () throws -> Void)] { - return [ - ("testMatchPositive", testMatchPositive), - ("testMatchNegative", testMatchNegative), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testMatchNils", testMatchNils), - ] - } - - func testMatchPositive() { - expect("11:14").to(match("\\d{2}:\\d{2}")) - } - - func testMatchNegative() { - expect("hello").toNot(match("\\d{2}:\\d{2}")) - } - - func testMatchPositiveMessage() { - let message = "expected to match <\\d{2}:\\d{2}>, got " - failsWithErrorMessage(message) { - expect("hello").to(match("\\d{2}:\\d{2}")) - } - } - - func testMatchNegativeMessage() { - let message = "expected to not match <\\d{2}:\\d{2}>, got <11:14>" - failsWithErrorMessage(message) { - expect("11:14").toNot(match("\\d{2}:\\d{2}")) - } - } - - func testMatchNils() { - failsWithErrorMessageForNil("expected to match <\\d{2}:\\d{2}>, got ") { - expect(nil as String?).to(match("\\d{2}:\\d{2}")) - } - - failsWithErrorMessageForNil("expected to not match <\\d{2}:\\d{2}>, got ") { - expect(nil as String?).toNot(match("\\d{2}:\\d{2}")) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift deleted file mode 100644 index 33b2ff0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift +++ /dev/null @@ -1,91 +0,0 @@ -import XCTest -import Nimble -import Foundation - -final class PostNotificationTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (PostNotificationTest) -> () throws -> Void)] { - return [ - ("testPassesWhenNoNotificationsArePosted", testPassesWhenNoNotificationsArePosted), - ("testPassesWhenExpectedNotificationIsPosted", testPassesWhenExpectedNotificationIsPosted), - ("testPassesWhenAllExpectedNotificationsArePosted", testPassesWhenAllExpectedNotificationsArePosted), - ("testFailsWhenNoNotificationsArePosted", testFailsWhenNoNotificationsArePosted), - ("testFailsWhenNotificationWithWrongNameIsPosted", testFailsWhenNotificationWithWrongNameIsPosted), - ("testFailsWhenNotificationWithWrongObjectIsPosted", testFailsWhenNotificationWithWrongObjectIsPosted), - ("testPassesWhenExpectedNotificationEventuallyIsPosted", testPassesWhenExpectedNotificationEventuallyIsPosted), - ] - } - - let notificationCenter = NotificationCenter() - - func testPassesWhenNoNotificationsArePosted() { - expect { - // no notifications here! - return nil - }.to(postNotifications(beEmpty(), fromNotificationCenter: notificationCenter)) - } - - func testPassesWhenExpectedNotificationIsPosted() { - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - expect { - self.notificationCenter.post(testNotification) - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) - } - - func testPassesWhenAllExpectedNotificationsArePosted() { - let foo = NSNumber(value: 1) - let bar = NSNumber(value: 2) - let n1 = Notification(name: Notification.Name("Foo"), object: foo) - let n2 = Notification(name: Notification.Name("Bar"), object: bar) - expect { - self.notificationCenter.post(n1) - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1, n2]), fromNotificationCenter: notificationCenter)) - } - - func testFailsWhenNoNotificationsArePosted() { - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - failsWithErrorMessage("expected to equal <[\(testNotification)]>, got no notifications") { - expect { - // no notifications here! - return nil - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testFailsWhenNotificationWithWrongNameIsPosted() { - let n1 = Notification(name: Notification.Name("Foo"), object: nil) - let n2 = Notification(name: Notification.Name(n1.name.rawValue + "a"), object: nil) - failsWithErrorMessage("expected to equal <[\(n1)]>, got <[\(n2)]>") { - expect { - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testFailsWhenNotificationWithWrongObjectIsPosted() { - let n1 = Notification(name: Notification.Name("Foo"), object: nil) - let n2 = Notification(name: n1.name, object: NSObject()) - failsWithErrorMessage("expected to equal <[\(n1)]>, got <[\(n2)]>") { - expect { - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testPassesWhenExpectedNotificationEventuallyIsPosted() { - #if _runtime(_ObjC) - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - expect { - deferToMainQueue { - self.notificationCenter.post(testNotification) - } - return nil - }.toEventually(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) - #else - print("\(#function) is missing because toEventually is not implement on this platform") - #endif - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift deleted file mode 100644 index 302a2f5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift +++ /dev/null @@ -1,166 +0,0 @@ -import XCTest -import Nimble - -#if _runtime(_ObjC) && !SWIFT_PACKAGE - -final class RaisesExceptionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (RaisesExceptionTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testPositiveMatchesWithClosures", testPositiveMatchesWithClosures), - ("testNegativeMatches", testNegativeMatches), - ("testNegativeMatchesDoNotCallClosureWithoutException", testNegativeMatchesDoNotCallClosureWithoutException), - ("testNegativeMatchesWithClosure", testNegativeMatchesWithClosure), - ] - } - - var anException = NSException(name: NSExceptionName("laugh"), reason: "Lulz", userInfo: ["key": "value"]) - - func testPositiveMatches() { - expect { self.anException.raise() }.to(raiseException()) - expect { self.anException.raise() }.to(raiseException(named: "laugh")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) - } - - func testPositiveMatchesWithClosures() { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName("laugh"))) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("as")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("df")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("as")) - }) - } - - func testNegativeMatches() { - failsWithErrorMessage("expected to raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "foo")) - } - - failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "bar")) - } - - failsWithErrorMessage( - "expected to raise exception with name with reason with userInfo <{k = v;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["k": "v"])) - } - - failsWithErrorMessage("expected to raise any exception, got no exception") { - expect { self.anException }.to(raiseException()) - } - failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) - } - failsWithErrorMessage("expected to raise exception with name with reason , got no exception") { - expect { self.anException }.to(raiseException(named: "laugh", reason: "Lulz")) - } - - failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "bar", reason: "Lulz")) - } - failsWithErrorMessage("expected to not raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh")) - } - failsWithErrorMessage("expected to not raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz")) - } - - failsWithErrorMessage("expected to not raise exception with name with reason with userInfo <{key = value;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) - } - } - - func testNegativeMatchesDoNotCallClosureWithoutException() { - failsWithErrorMessage("expected to raise exception that satisfies block, got no exception") { - expect { self.anException }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName(rawValue:"foo"))) - }) - } - - failsWithErrorMessage("expected to raise exception with name that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo") { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to raise exception with name with reason that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "ha") { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to raise exception with name with reason with userInfo <{}> that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "Lulz", userInfo: [:]) { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) - } - } - - func testNegativeMatchesWithClosure() { - failsWithErrorMessage("expected to raise exception that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - let innerFailureMessage = "expected to begin with , got " - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "wrong") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{key = value;}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "Lulz", userInfo: [:]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift deleted file mode 100644 index 9378956..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble -import Foundation - -final class SatisfyAnyOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SatisfyAnyOfTest) -> () throws -> Void)] { - return [ - ("testSatisfyAnyOf", testSatisfyAnyOf), - ("testOperatorOr", testOperatorOr), - ] - } - - func testSatisfyAnyOf() { - expect(2).to(satisfyAnyOf(equal(2), equal(3))) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(satisfyAnyOf(equal(3), equal("turtles"))) -#else - expect(2 as NSNumber).toNot(satisfyAnyOf(equal(3 as NSNumber), equal("turtles" as NSString))) -#endif - expect([1,2,3]).to(satisfyAnyOf(equal([1,2,3]), allPass({$0 < 4}), haveCount(3))) - expect("turtle").toNot(satisfyAnyOf(contain("a"), endWith("magic"))) - expect(82.0).toNot(satisfyAnyOf(beLessThan(10.5), beGreaterThan(100.75), beCloseTo(50.1))) - expect(false).to(satisfyAnyOf(beTrue(), beFalse())) - expect(true).to(satisfyAnyOf(beTruthy(), beFalsy())) - - failsWithErrorMessage( - "expected to match one of: {equal <3>}, or {equal <4>}, or {equal <5>}, got 2") { - expect(2).to(satisfyAnyOf(equal(3), equal(4), equal(5))) - } - failsWithErrorMessage( - "expected to match one of: {all be less than 4, but failed first at element <5> in <[5, 6, 7]>}, or {equal <[1, 2, 3, 4]>}, got [5, 6, 7]") { - expect([5,6,7]).to(satisfyAnyOf(allPass("be less than 4", {$0 < 4}), equal([1,2,3,4]))) - } - failsWithErrorMessage( - "expected to match one of: {be true}, got false") { - expect(false).to(satisfyAnyOf(beTrue())) - } - failsWithErrorMessage( - "expected to not match one of: {be less than <10.5>}, or {be greater than <100.75>}, or {be close to <50.1> (within 0.0001)}, got 50.10001") { - expect(50.10001).toNot(satisfyAnyOf(beLessThan(10.5), beGreaterThan(100.75), beCloseTo(50.1))) - } - } - - func testOperatorOr() { - expect(2).to(equal(2) || equal(3)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(equal(3) || equal("turtles")) -#else - expect(2 as NSNumber).toNot(equal(3 as NSNumber) || equal("turtles" as NSString)) -#endif - expect("turtle").toNot(contain("a") || endWith("magic")) - expect(82.0).toNot(beLessThan(10.5) || beGreaterThan(100.75)) - expect(false).to(beTrue() || beFalse()) - expect(true).to(beTruthy() || beFalsy()) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift deleted file mode 100644 index c227b1b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift +++ /dev/null @@ -1,62 +0,0 @@ -import Foundation -import XCTest -import Nimble - -#if _runtime(_ObjC) && !SWIFT_PACKAGE - -final class ThrowAssertionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ThrowAssertionTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testErrorThrown", testErrorThrown), - ("testPostAssertionCodeNotRun", testPostAssertionCodeNotRun), - ("testNegativeMatch", testNegativeMatch), - ("testPositiveMessage", testPositiveMessage), - ("testNegativeMessage", testNegativeMessage), - ] - } - - func testPositiveMatch() { - expect { () -> Void in fatalError() }.to(throwAssertion()) - } - - func testErrorThrown() { - expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion()) - } - - func testPostAssertionCodeNotRun() { - var reachedPoint1 = false - var reachedPoint2 = false - - expect { - reachedPoint1 = true - precondition(false, "condition message") - reachedPoint2 = true - }.to(throwAssertion()) - - expect(reachedPoint1) == true - expect(reachedPoint2) == false - } - - func testNegativeMatch() { - var reachedPoint1 = false - - expect { reachedPoint1 = true }.toNot(throwAssertion()) - - expect(reachedPoint1) == true - } - - func testPositiveMessage() { - failsWithErrorMessage("expected to throw an assertion") { - expect { () -> Void? in return }.to(throwAssertion()) - } - } - - func testNegativeMessage() { - failsWithErrorMessage("expected to not throw an assertion") { - expect { () -> Void in fatalError() }.toNot(throwAssertion()) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift deleted file mode 100644 index d7cd312..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift +++ /dev/null @@ -1,154 +0,0 @@ -import XCTest -import Nimble - -enum NimbleError : Error { - case laugh - case cry -} - -enum EquatableError : Error { - case parameterized(x: Int) -} - -extension EquatableError : Equatable { -} - -func ==(lhs: EquatableError, rhs: EquatableError) -> Bool { - switch (lhs, rhs) { - case (.parameterized(let l), .parameterized(let r)): - return l == r - } -} - -enum CustomDebugStringConvertibleError : Error { - case a - case b -} - -extension CustomDebugStringConvertibleError : CustomDebugStringConvertible { - var debugDescription : String { - return "code=\(_code)" - } -} - -final class ThrowErrorTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ThrowErrorTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testPositiveMatchesWithClosures", testPositiveMatchesWithClosures), - ("testNegativeMatches", testNegativeMatches), - ("testPositiveNegatedMatches", testPositiveNegatedMatches), - ("testNegativeNegatedMatches", testNegativeNegatedMatches), - ("testNegativeMatchesDoNotCallClosureWithoutError", testNegativeMatchesDoNotCallClosureWithoutError), - ("testNegativeMatchesWithClosure", testNegativeMatchesWithClosure), - ] - } - - func testPositiveMatches() { - expect { throw NimbleError.laugh }.to(throwError()) - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh)) - expect { throw NimbleError.laugh }.to(throwError(errorType: NimbleError.self)) - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 1))) - } - - func testPositiveMatchesWithClosures() { - // Generic typed closure - expect { throw EquatableError.parameterized(x: 42) }.to(throwError { error in - guard case EquatableError.parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Explicit typed closure - expect { throw EquatableError.parameterized(x: 42) }.to(throwError { (error: EquatableError) in - guard case .parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Typed closure over errorType argument - expect { throw EquatableError.parameterized(x: 42) }.to(throwError(errorType: EquatableError.self) { error in - guard case .parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Typed closure over error argument - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh) { (error: Error) in - expect(error._domain).to(beginWith("Nim")) - }) - // Typed closure over error argument - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh) { (error: Error) in - expect(error._domain).toNot(beginWith("as")) - }) - } - - func testNegativeMatches() { - // Same case, different arguments - failsWithErrorMessage("expected to throw error , got ") { - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 2))) - } - // Same case, different arguments - failsWithErrorMessage("expected to throw error , got ") { - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 2))) - } - // Different case - failsWithErrorMessage("expected to throw error , got ") { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.cry)) - } - // Different case with closure - failsWithErrorMessage("expected to throw error that satisfies block, got ") { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.cry) { _ in return }) - } - // Different case, implementing CustomDebugStringConvertible - failsWithErrorMessage("expected to throw error , got ") { - expect { throw CustomDebugStringConvertibleError.a }.to(throwError(CustomDebugStringConvertibleError.b)) - } - } - - func testPositiveNegatedMatches() { - // No error at all - expect { return }.toNot(throwError()) - // Different case - expect { throw NimbleError.laugh }.toNot(throwError(NimbleError.cry)) - } - - func testNegativeNegatedMatches() { - // No error at all - failsWithErrorMessage("expected to not throw any error, got ") { - expect { throw NimbleError.laugh }.toNot(throwError()) - } - // Different error - failsWithErrorMessage("expected to not throw error , got ") { - expect { throw NimbleError.laugh }.toNot(throwError(NimbleError.laugh)) - } - } - - func testNegativeMatchesDoNotCallClosureWithoutError() { - failsWithErrorMessage("expected to throw error that satisfies block, got no error") { - expect { return }.to(throwError { error in - fail() - }) - } - - failsWithErrorMessage("expected to throw error that satisfies block, got no error") { - expect { return }.to(throwError(NimbleError.laugh) { error in - fail() - }) - } - } - - func testNegativeMatchesWithClosure() { - let moduleName = "NimbleTests" - let innerFailureMessage = "expected to equal , got <\(moduleName).NimbleError>" - let closure = { (error: Error) in - expect(error._domain).to(equal("foo")) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(closure: closure)) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error from type that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(errorType: NimbleError.self, closure: closure)) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh, closure: closure)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/SynchronousTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/SynchronousTests.swift deleted file mode 100644 index 6234932..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/SynchronousTests.swift +++ /dev/null @@ -1,129 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class SynchronousTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SynchronousTest) -> () throws -> Void)] { - return [ - ("testFailAlwaysFails", testFailAlwaysFails), - ("testUnexpectedErrorsThrownFails", testUnexpectedErrorsThrownFails), - ("testToMatchesIfMatcherReturnsTrue", testToMatchesIfMatcherReturnsTrue), - ("testToProvidesActualValueExpression", testToProvidesActualValueExpression), - ("testToProvidesAMemoizedActualValueExpression", testToProvidesActualValueExpression), - ("testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testToMatchAgainstLazyProperties", testToMatchAgainstLazyProperties), - ("testToNotMatchesIfMatcherReturnsTrue", testToNotMatchesIfMatcherReturnsTrue), - ("testToNotProvidesActualValueExpression", testToNotProvidesActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpression", testToNotProvidesAMemoizedActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testToNotNegativeMatches", testToNotNegativeMatches), - ("testNotToMatchesLikeToNot", testNotToMatchesLikeToNot), - ] - } - - class Error: Swift.Error {} - let errorToThrow = Error() - - private func doThrowError() throws -> Int { - throw errorToThrow - } - - func testFailAlwaysFails() { - failsWithErrorMessage("My error message") { - fail("My error message") - } - failsWithErrorMessage("fail() always fails") { - fail() - } - } - - func testUnexpectedErrorsThrownFails() { - failsWithErrorMessage("expected to equal <1>, got an unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.to(equal(1)) - } - failsWithErrorMessage("expected to not equal <1>, got an unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toNot(equal(1)) - } - } - - func testToMatchesIfMatcherReturnsTrue() { - expect(1).to(MatcherFunc { expr, failure in true }) - expect{1}.to(MatcherFunc { expr, failure in true }) - } - - func testToProvidesActualValueExpression() { - var value: Int? - expect(1).to(MatcherFunc { expr, failure in value = try expr.evaluate(); return true }) - expect(value).to(equal(1)) - } - - func testToProvidesAMemoizedActualValueExpression() { - var callCount = 0 - expect{ callCount += 1 }.to(MatcherFunc { expr, failure in - _ = try expr.evaluate() - _ = try expr.evaluate() - return true - }) - expect(callCount).to(equal(1)) - } - - func testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { - var callCount = 0 - expect{ callCount += 1 }.to(MatcherFunc { expr, failure in - expect(callCount).to(equal(0)) - _ = try expr.evaluate() - return true - }) - expect(callCount).to(equal(1)) - } - - func testToMatchAgainstLazyProperties() { - expect(ObjectWithLazyProperty().value).to(equal("hello")) - expect(ObjectWithLazyProperty().value).toNot(equal("world")) - expect(ObjectWithLazyProperty().anotherValue).to(equal("world")) - expect(ObjectWithLazyProperty().anotherValue).toNot(equal("hello")) - } - - // repeated tests from to() for toNot() - func testToNotMatchesIfMatcherReturnsTrue() { - expect(1).toNot(MatcherFunc { expr, failure in false }) - expect{1}.toNot(MatcherFunc { expr, failure in false }) - } - - func testToNotProvidesActualValueExpression() { - var value: Int? - expect(1).toNot(MatcherFunc { expr, failure in value = try expr.evaluate(); return false }) - expect(value).to(equal(1)) - } - - func testToNotProvidesAMemoizedActualValueExpression() { - var callCount = 0 - expect{ callCount += 1 }.toNot(MatcherFunc { expr, failure in - _ = try expr.evaluate() - _ = try expr.evaluate() - return false - }) - expect(callCount).to(equal(1)) - } - - func testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { - var callCount = 0 - expect{ callCount += 1 }.toNot(MatcherFunc { expr, failure in - expect(callCount).to(equal(0)) - _ = try expr.evaluate() - return false - }) - expect(callCount).to(equal(1)) - } - - func testToNotNegativeMatches() { - failsWithErrorMessage("expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { expr, failure in true }) - } - } - - - func testNotToMatchesLikeToNot() { - expect(1).notTo(MatcherFunc { expr, failure in false }) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/UserDescriptionTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/UserDescriptionTest.swift deleted file mode 100644 index e22d64e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/UserDescriptionTest.swift +++ /dev/null @@ -1,64 +0,0 @@ -import XCTest -import Nimble - -final class UserDescriptionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (UserDescriptionTest) -> () throws -> Void)] { - return [ - ("testToMatcher_CustomFailureMessage", testToMatcher_CustomFailureMessage), - ("testNotToMatcher_CustomFailureMessage", testNotToMatcher_CustomFailureMessage), - ("testToNotMatcher_CustomFailureMessage", testToNotMatcher_CustomFailureMessage), - ("testToEventuallyMatch_CustomFailureMessage", testToEventuallyMatch_CustomFailureMessage), - ("testToEventuallyNotMatch_CustomFailureMessage", testToEventuallyNotMatch_CustomFailureMessage), - ("testToNotEventuallyMatch_CustomFailureMessage", testToNotEventuallyMatch_CustomFailureMessage), - ] - } - - func testToMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to match, got <1>") { - expect(1).to(MatcherFunc { expr, failure in false }, description: "These aren't equal!") - } - } - - func testNotToMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to not match, got <1>") { - expect(1).notTo(MatcherFunc { expr, failure in true }, description: "These aren't equal!") - } - } - - func testToNotMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { expr, failure in true }, description: "These aren't equal!") - } - } - - func testToEventuallyMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't eventually equal!\n" + - "expected to eventually equal <1>, got <0>") { - expect { 0 }.toEventually(equal(1), description: "These aren't eventually equal!") - } - } - - func testToEventuallyNotMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These are eventually equal!\n" + - "expected to eventually not equal <1>, got <1>") { - expect { 1 }.toEventuallyNot(equal(1), description: "These are eventually equal!") - } - } - - func testToNotEventuallyMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These are eventually equal!\n" + - "expected to eventually not equal <1>, got <1>") { - expect { 1 }.toEventuallyNot(equal(1), description: "These are eventually equal!") - } - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h deleted file mode 100644 index 282993d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h +++ /dev/null @@ -1,15 +0,0 @@ -@import Nimble; -#import "NimbleTests-Swift.h" - -// Use this when you want to verify the failure message for when an expectation fails -#define expectFailureMessage(MSG, BLOCK) \ -[NimbleHelper expectFailureMessage:(MSG) block:(BLOCK) file:@(__FILE__) line:__LINE__]; - -#define expectFailureMessages(MSGS, BLOCK) \ -[NimbleHelper expectFailureMessages:(MSGS) block:(BLOCK) file:@(__FILE__) line:__LINE__]; - - -// Use this when you want to verify the failure message with the nil message postfixed -// to it: " (use beNil() to match nils)" -#define expectNilFailureMessage(MSG, BLOCK) \ -[NimbleHelper expectFailureMessageForNil:(MSG) block:(BLOCK) file:@(__FILE__) line:__LINE__]; diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m deleted file mode 100644 index 1146920..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m +++ /dev/null @@ -1,38 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCAllPassTest : XCTestCase - -@end - -@implementation ObjCAllPassTest - -- (void)testPositiveMatches { - expect(@[@1, @2, @3,@4]).to(allPass(beLessThan(@5))); - expect(@[@1, @2, @3,@4]).toNot(allPass(beGreaterThan(@5))); - - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).to(allPass(beLessThan(@5))); - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).toNot(allPass(beGreaterThan(@5))); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to all be less than <3>, but failed first at element" - " <3> in <[1, 2, 3, 4]>", ^{ - expect(@[@1, @2, @3,@4]).to(allPass(beLessThan(@3))); - }); - expectFailureMessage(@"expected to not all be less than <5>", ^{ - expect(@[@1, @2, @3,@4]).toNot(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"expected to not all be less than <5>", ^{ - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).toNot(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"allPass only works with NSFastEnumeration" - " (NSArray, NSSet, ...) of NSObjects, got <3>", ^{ - expect(@3).to(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"allPass only works with NSFastEnumeration" - " (NSArray, NSSet, ...) of NSObjects, got <3>", ^{ - expect(@3).toNot(allPass(beLessThan(@5))); - }); -} -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m deleted file mode 100644 index f052e74..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m +++ /dev/null @@ -1,55 +0,0 @@ -#import -#import -#import "NimbleSpecHelper.h" - -@interface ObjCAsyncTest : XCTestCase - -@end - -@implementation ObjCAsyncTest - -- (void)testAsync { - __block id obj = @1; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - obj = nil; - }); - expect(obj).toEventually(beNil()); -} - - -- (void)testAsyncWithCustomTimeout { - __block id obj = nil; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - obj = @1; - }); - expect(obj).withTimeout(5).toEventuallyNot(beNil()); -} - -- (void)testAsyncCallback { - waitUntil(^(void (^done)(void)){ - done(); - }); - - expectFailureMessage(@"Waited more than 1.0 second", ^{ - waitUntil(^(void (^done)(void)){ /* ... */ }); - }); - - expectFailureMessage(@"Waited more than 0.01 seconds", ^{ - waitUntilTimeout(0.01, ^(void (^done)(void)){ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [NSThread sleepForTimeInterval:0.1]; - done(); - }); - }); - }); - - expectFailureMessage(@"expected to equal , got ", ^{ - waitUntil(^(void (^done)(void)){ - [NSThread sleepForTimeInterval:0.1]; - expect(@"hello").to(equal(@"goodbye")); - done(); - }); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m deleted file mode 100644 index f5fca2d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m +++ /dev/null @@ -1,34 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeAnInstanceOfTest : XCTestCase -@end - -@implementation ObjCBeAnInstanceOfTest - -- (void)testPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(beAnInstanceOf([NSNull class])); - expect(@1).toNot(beAnInstanceOf([NSNull class])); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be an instance of NSNull, got <__NSCFNumber instance>", ^{ - expect(@1).to(beAnInstanceOf([NSNull class])); - }); - expectFailureMessage(@"expected to not be an instance of NSNull, got ", ^{ - expect([NSNull null]).toNot(beAnInstanceOf([NSNull class])); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be an instance of NSNull, got ", ^{ - expect(nil).to(beAnInstanceOf([NSNull class])); - }); - - expectNilFailureMessage(@"expected to not be an instance of NSNull, got ", ^{ - expect(nil).toNot(beAnInstanceOf([NSNull class])); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m deleted file mode 100644 index c33d643..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m +++ /dev/null @@ -1,47 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeCloseToTest : XCTestCase - -@end - -@implementation ObjCBeCloseToTest - -- (void)testPositiveMatches { - expect(@1.2).to(beCloseTo(@1.2001)); - expect(@1.2).to(beCloseTo(@2).within(10)); - expect(@2).toNot(beCloseTo(@1)); - expect(@1.00001).toNot(beCloseTo(@1).within(0.00000001)); - - expect(1.2).to(beCloseTo(1.2001)); - expect(1.2).to(beCloseTo(2).within(10)); - expect(2).toNot(beCloseTo(1)); - expect(1.00001).toNot(beCloseTo(1).within(0.00000001)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be close to <0> (within 0.001), got <1>", ^{ - expect(@1).to(beCloseTo(@0)); - }); - expectFailureMessage(@"expected to not be close to <0> (within 0.001), got <0.0001>", ^{ - expect(@(0.0001)).toNot(beCloseTo(@0)); - }); - expectFailureMessage(@"expected to be close to <0> (within 0.001), got <1>", ^{ - expect(1).to(beCloseTo(0)); - }); - expectFailureMessage(@"expected to not be close to <0> (within 0.001), got <0.0001>", ^{ - expect(0.0001).toNot(beCloseTo(0)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be close to <0> (within 0.001), got ", ^{ - expect(nil).to(beCloseTo(@0)); - }); - expectNilFailureMessage(@"expected to not be close to <0> (within 0.001), got ", ^{ - expect(nil).toNot(beCloseTo(@0)); - }); -} - - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m deleted file mode 100644 index 723d642..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m +++ /dev/null @@ -1,89 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeEmptyTest : XCTestCase -@end - -@implementation ObjCBeEmptyTest - -- (void)testPositiveMatches { - expect(@[]).to(beEmpty()); - expect(@"").to(beEmpty()); - expect(@{}).to(beEmpty()); - expect([NSSet set]).to(beEmpty()); - expect([NSIndexSet indexSet]).to(beEmpty()); - expect([NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]).to(beEmpty()); - - expect(@[@1, @2]).toNot(beEmpty()); - expect(@"a").toNot(beEmpty()); - expect(@{@"key": @"value"}).toNot(beEmpty()); - expect([NSSet setWithObject:@1]).toNot(beEmpty()); - expect([NSIndexSet indexSetWithIndex:1]).toNot(beEmpty()); - - NSHashTable *table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - expect(table).toNot(beEmpty()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be empty, got ", ^{ - expect(@"foo").to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <(1)>", ^{ - expect(@[@1]).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <{key = value;}>", ^{ - expect(@{@"key": @"value"}).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <{(1)}>", ^{ - expect([NSSet setWithObject:@1]).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <(1)>", ^{ - expect([NSIndexSet indexSetWithIndex:1]).to(beEmpty()); - }); - NSHashTable *table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - NSString *tableString = [[table description] stringByReplacingOccurrencesOfString:@"\n" withString:@""]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be empty, got <%@>", tableString]), ^{ - expect(table).to(beEmpty()); - }); - - expectFailureMessage(@"expected to not be empty, got <>", ^{ - expect(@"").toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <()>", ^{ - expect(@[]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <{}>", ^{ - expect(@{}).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <{(1)}>", ^{ - expect([NSSet setWithObject:@1]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <(1)>", ^{ - expect([NSIndexSet indexSetWithIndex:1]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got ", ^{ - expect([NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]).toNot(beEmpty()); - }); -} - -- (void)testItDoesNotMatchNil { - expectNilFailureMessage(@"expected to be empty, got ", ^{ - expect(nil).to(beEmpty()); - }); - expectNilFailureMessage(@"expected to not be empty, got ", ^{ - expect(nil).toNot(beEmpty()); - }); -} - -- (void)testItReportsTypesItMatchesAgainst { - expectFailureMessage(@"expected to be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings), got __NSCFNumber type", ^{ - expect(@1).to(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings), got __NSCFNumber type", ^{ - expect(@1).toNot(beEmpty()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m deleted file mode 100644 index 5a5bce8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m +++ /dev/null @@ -1,46 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeFalseTest : XCTestCase - -@end - -@implementation ObjCBeFalseTest - -- (void)testPositiveMatches { - expect(@NO).to(beFalse()); - expect(@YES).toNot(beFalse()); - - expect(false).to(beFalse()); - expect(true).toNot(beFalse()); - - expect(NO).to(beFalse()); - expect(YES).toNot(beFalse()); - - expect(10).toNot(beFalse()); -} - -- (void)testNegativeMatches { - expectNilFailureMessage(@"expected to be false, got ", ^{ - expect(nil).to(beFalse()); - }); - expectNilFailureMessage(@"expected to not be false, got ", ^{ - expect(nil).toNot(beFalse()); - }); - - expectFailureMessage(@"expected to be false, got <1>", ^{ - expect(true).to(beFalse()); - }); - expectFailureMessage(@"expected to not be false, got <0>", ^{ - expect(false).toNot(beFalse()); - }); - - expectFailureMessage(@"expected to be false, got <1>", ^{ - expect(YES).to(beFalse()); - }); - expectFailureMessage(@"expected to not be false, got <0>", ^{ - expect(NO).toNot(beFalse()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m deleted file mode 100644 index f3f5c98..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m +++ /dev/null @@ -1,58 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeFalsyTest : XCTestCase - -@end - -@implementation ObjCBeFalsyTest - -- (void)testPositiveMatches { - expect(@NO).to(beFalsy()); - expect(@YES).toNot(beFalsy()); - expect(nil).to(beFalsy()); - - expect(true).toNot(beFalsy()); - expect(false).to(beFalsy()); - - expect(YES).toNot(beFalsy()); - expect(NO).to(beFalsy()); - - expect(10).toNot(beFalsy()); - expect(0).to(beFalsy()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to not be falsy, got ", ^{ - expect(nil).toNot(beFalsy()); - }); - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(@1).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(@NO).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(true).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(false).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(YES).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(NO).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <10>", ^{ - expect(10).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(0).toNot(beFalsy()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m deleted file mode 100644 index 22cab3a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m +++ /dev/null @@ -1,42 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeGreaterThanOrEqualToTest : XCTestCase - -@end - -@implementation ObjCBeGreaterThanOrEqualToTest - -- (void)testPositiveMatches { - expect(@2).to(beGreaterThanOrEqualTo(@2)); - expect(@2).toNot(beGreaterThanOrEqualTo(@3)); - expect(2).to(beGreaterThanOrEqualTo(0)); - expect(2).to(beGreaterThanOrEqualTo(2)); - expect(2).toNot(beGreaterThanOrEqualTo(3)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be greater than or equal to <0>, got <-1>", ^{ - expect(@(-1)).to(beGreaterThanOrEqualTo(@0)); - }); - expectFailureMessage(@"expected to not be greater than or equal to <1>, got <2>", ^{ - expect(@2).toNot(beGreaterThanOrEqualTo(@(1))); - }); - expectFailureMessage(@"expected to be greater than or equal to <0>, got <-1>", ^{ - expect(-1).to(beGreaterThanOrEqualTo(0)); - }); - expectFailureMessage(@"expected to not be greater than or equal to <1>, got <2>", ^{ - expect(2).toNot(beGreaterThanOrEqualTo(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be greater than or equal to <-1>, got ", ^{ - expect(nil).to(beGreaterThanOrEqualTo(@(-1))); - }); - expectNilFailureMessage(@"expected to not be greater than or equal to <1>, got ", ^{ - expect(nil).toNot(beGreaterThanOrEqualTo(@(1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m deleted file mode 100644 index 13336d5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m +++ /dev/null @@ -1,41 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeGreaterThanTest : XCTestCase - -@end - -@implementation ObjCBeGreaterThanTest - -- (void)testPositiveMatches { - expect(@2).to(beGreaterThan(@1)); - expect(@2).toNot(beGreaterThan(@2)); - expect(@2).to(beGreaterThan(0)); - expect(@2).toNot(beGreaterThan(2)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be greater than <0>, got <-1>", ^{ - expect(@(-1)).to(beGreaterThan(@(0))); - }); - expectFailureMessage(@"expected to not be greater than <1>, got <0>", ^{ - expect(@0).toNot(beGreaterThan(@(1))); - }); - expectFailureMessage(@"expected to be greater than <0>, got <-1>", ^{ - expect(-1).to(beGreaterThan(0)); - }); - expectFailureMessage(@"expected to not be greater than <1>, got <0>", ^{ - expect(0).toNot(beGreaterThan(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be greater than <-1>, got ", ^{ - expect(nil).to(beGreaterThan(@(-1))); - }); - expectNilFailureMessage(@"expected to not be greater than <1>, got ", ^{ - expect(nil).toNot(beGreaterThan(@(1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m deleted file mode 100644 index a9d9d51..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m +++ /dev/null @@ -1,68 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeIdenticalToTest : XCTestCase - -@end - -@implementation ObjCBeIdenticalToTest - -- (void)testPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(beIdenticalTo([NSNull null])); - expect(@2).toNot(beIdenticalTo(@3)); -} - -- (void)testNegativeMatches { - NSNull *obj = [NSNull null]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be identical to <%p>, got <%p>", obj, @2]), ^{ - expect(@2).to(beIdenticalTo(obj)); - }); - expectFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got <%p>", obj, obj]), ^{ - expect(obj).toNot(beIdenticalTo(obj)); - }); -} - -- (void)testNilMatches { - NSNull *obj = [NSNull null]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnonnull" - expectNilFailureMessage(@"expected to be identical to nil, got nil", ^{ - expect(nil).to(beIdenticalTo(nil)); - }); -#pragma clang diagnostic pop - expectNilFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got nil", obj]), ^{ - expect(nil).toNot(beIdenticalTo(obj)); - }); -} - -- (void)testAliasPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(be([NSNull null])); - expect(@2).toNot(be(@3)); -} - -- (void)testAliasNegativeMatches { - NSNull *obj = [NSNull null]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be identical to <%p>, got <%p>", obj, @2]), ^{ - expect(@2).to(be(obj)); - }); - expectFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got <%p>", obj, obj]), ^{ - expect(obj).toNot(be(obj)); - }); -} - -- (void)testAliasNilMatches { - NSNull *obj = [NSNull null]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnonnull" - expectNilFailureMessage(@"expected to be identical to nil, got nil", ^{ - expect(nil).to(be(nil)); - }); -#pragma clang diagnostic pop - expectNilFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got nil", obj]), ^{ - expect(nil).toNot(be(obj)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m deleted file mode 100644 index 7eee261..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m +++ /dev/null @@ -1,34 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeKindOfTest : XCTestCase - -@end - -@implementation ObjCBeKindOfTest - -- (void)testPositiveMatches { - NSMutableArray *array = [NSMutableArray array]; - expect(array).to(beAKindOf([NSArray class])); - expect(@1).toNot(beAKindOf([NSNull class])); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be a kind of NSNull, got <__NSCFNumber instance>", ^{ - expect(@1).to(beAKindOf([NSNull class])); - }); - expectFailureMessage(@"expected to not be a kind of NSNull, got ", ^{ - expect([NSNull null]).toNot(beAKindOf([NSNull class])); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be a kind of NSNull, got ", ^{ - expect(nil).to(beAKindOf([NSNull class])); - }); - expectNilFailureMessage(@"expected to not be a kind of NSNull, got ", ^{ - expect(nil).toNot(beAKindOf([NSNull class])); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m deleted file mode 100644 index 4a738ec..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m +++ /dev/null @@ -1,43 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeLessThanOrEqualToTest : XCTestCase - -@end - -@implementation ObjCBeLessThanOrEqualToTest - -- (void)testPositiveMatches { - expect(@2).to(beLessThanOrEqualTo(@2)); - expect(@2).toNot(beLessThanOrEqualTo(@1)); - expect(2).to(beLessThanOrEqualTo(2)); - expect(2).toNot(beLessThanOrEqualTo(1)); - expect(2).toNot(beLessThanOrEqualTo(0)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be less than or equal to <1>, got <2>", ^{ - expect(@2).to(beLessThanOrEqualTo(@1)); - }); - expectFailureMessage(@"expected to not be less than or equal to <1>, got <1>", ^{ - expect(@1).toNot(beLessThanOrEqualTo(@1)); - }); - - expectFailureMessage(@"expected to be less than or equal to <1>, got <2>", ^{ - expect(2).to(beLessThanOrEqualTo(1)); - }); - expectFailureMessage(@"expected to not be less than or equal to <1>, got <1>", ^{ - expect(1).toNot(beLessThanOrEqualTo(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be less than or equal to <1>, got ", ^{ - expect(nil).to(beLessThanOrEqualTo(@1)); - }); - expectNilFailureMessage(@"expected to not be less than or equal to <-1>, got ", ^{ - expect(nil).toNot(beLessThanOrEqualTo(@(-1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m deleted file mode 100644 index 7ba38b2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m +++ /dev/null @@ -1,42 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeLessThanTest : XCTestCase - -@end - -@implementation ObjCBeLessThanTest - -- (void)testPositiveMatches { - expect(@2).to(beLessThan(@3)); - expect(@2).toNot(beLessThan(@2)); - expect(2).to(beLessThan(3)); - expect(2).toNot(beLessThan(2)); - expect(2).toNot(beLessThan(0)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be less than <0>, got <-1>", ^{ - expect(@(-1)).to(beLessThan(@0)); - }); - expectFailureMessage(@"expected to not be less than <1>, got <0>", ^{ - expect(@0).toNot(beLessThan(@1)); - }); - expectFailureMessage(@"expected to be less than <0>, got <-1>", ^{ - expect(-1).to(beLessThan(0)); - }); - expectFailureMessage(@"expected to not be less than <1>, got <0>", ^{ - expect(0).toNot(beLessThan(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be less than <-1>, got ", ^{ - expect(nil).to(beLessThan(@(-1))); - }); - expectNilFailureMessage(@"expected to not be less than <1>, got ", ^{ - expect(nil).toNot(beLessThan(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m deleted file mode 100644 index a43ee50..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m +++ /dev/null @@ -1,24 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeNilTest : XCTestCase - -@end - -@implementation ObjCBeNilTest - -- (void)testPositiveMatches { - expect(nil).to(beNil()); - expect(@NO).toNot(beNil()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be nil, got <1>", ^{ - expect(@1).to(beNil()); - }); - expectFailureMessage(@"expected to not be nil, got ", ^{ - expect(nil).toNot(beNil()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m deleted file mode 100644 index c669475..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m +++ /dev/null @@ -1,47 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeTrueTest : XCTestCase - -@end - -@implementation ObjCBeTrueTest - -- (void)testPositiveMatches { - expect(@YES).to(beTrue()); - expect(@NO).toNot(beTrue()); - expect(nil).toNot(beTrue()); - - expect(true).to(beTrue()); - expect(false).toNot(beTrue()); - - expect(YES).to(beTrue()); - expect(NO).toNot(beTrue()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(@NO).to(beTrue()); - }); - expectFailureMessage(@"expected to be true, got ", ^{ - expect(nil).to(beTrue()); - }); - - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(false).to(beTrue()); - }); - - expectFailureMessage(@"expected to not be true, got <1>", ^{ - expect(true).toNot(beTrue()); - }); - - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(NO).to(beTrue()); - }); - - expectFailureMessage(@"expected to not be true, got <1>", ^{ - expect(YES).toNot(beTrue()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m deleted file mode 100644 index 1ad7913..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m +++ /dev/null @@ -1,55 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeTruthyTest : XCTestCase - -@end - -@implementation ObjCBeTruthyTest - -- (void)testPositiveMatches { - expect(@YES).to(beTruthy()); - expect(@NO).toNot(beTruthy()); - expect(nil).toNot(beTruthy()); - - expect(true).to(beTruthy()); - expect(false).toNot(beTruthy()); - - expect(YES).to(beTruthy()); - expect(NO).toNot(beTruthy()); - - expect(10).to(beTruthy()); - expect(0).toNot(beTruthy()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be truthy, got ", ^{ - expect(nil).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(@1).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(@NO).to(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(false).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(true).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(NO).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(YES).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <10>", ^{ - expect(10).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(0).to(beTruthy()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m deleted file mode 100644 index 5ca7be4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m +++ /dev/null @@ -1,37 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeginWithTest : XCTestCase - -@end - -@implementation ObjCBeginWithTest - -- (void)testPositiveMatches { - expect(@"hello world!").to(beginWith(@"hello")); - expect(@"hello world!").toNot(beginWith(@"world")); - - NSArray *array = @[@1, @2]; - expect(array).to(beginWith(@1)); - expect(array).toNot(beginWith(@2)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to begin with , got ", ^{ - expect(@"foo").to(beginWith(@"bar")); - }); - expectFailureMessage(@"expected to not begin with , got ", ^{ - expect(@"foo").toNot(beginWith(@"foo")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to begin with <1>, got ", ^{ - expect(nil).to(beginWith(@1)); - }); - expectNilFailureMessage(@"expected to not begin with <1>, got ", ^{ - expect(nil).toNot(beginWith(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m deleted file mode 100644 index 92bb9f9..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m +++ /dev/null @@ -1,67 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCContainTest : XCTestCase - -@end - -@implementation ObjCContainTest - -- (void)testPositiveMatches { - NSArray *array = @[@1, @2]; - expect(array).to(contain(@1)); - expect(array).toNot(contain(@"HI")); - expect(@"String").to(contain(@"Str")); - expect(@"Other").toNot(contain(@"Str")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to contain <3>, got <(1, 2)>", ^{ - expect((@[@1, @2])).to(contain(@3)); - }); - expectFailureMessage(@"expected to not contain <2>, got <(1, 2)>", ^{ - expect((@[@1, @2])).toNot(contain(@2)); - }); - - expectFailureMessage(@"expected to contain , got ", ^{ - expect(@"la").to(contain(@"hi")); - }); - expectFailureMessage(@"expected to not contain , got ", ^{ - expect(@"hihihi").toNot(contain(@"hi")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to contain <3>, got ", ^{ - expect(nil).to(contain(@3)); - }); - expectNilFailureMessage(@"expected to not contain <3>, got ", ^{ - expect(nil).toNot(contain(@3)); - }); - - expectNilFailureMessage(@"expected to contain , got ", ^{ - expect(nil).to(contain(@"hi")); - }); - expectNilFailureMessage(@"expected to not contain , got ", ^{ - expect(nil).toNot(contain(@"hi")); - }); -} - -- (void)testVariadicArguments { - NSArray *array = @[@1, @2]; - expect(array).to(contain(@1, @2)); - expect(array).toNot(contain(@"HI", @"whale")); - expect(@"String").to(contain(@"Str", @"ng")); - expect(@"Other").toNot(contain(@"Str", @"Oth")); - - - expectFailureMessage(@"expected to contain , got <(a, b, c)>", ^{ - expect(@[@"a", @"b", @"c"]).to(contain(@"a", @"bar")); - }); - - expectFailureMessage(@"expected to not contain , got <(a, b, c)>", ^{ - expect(@[@"a", @"b", @"c"]).toNot(contain(@"bar", @"b")); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m deleted file mode 100644 index b960f01..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m +++ /dev/null @@ -1,37 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCEndWithTest : XCTestCase - -@end - -@implementation ObjCEndWithTest - -- (void)testPositiveMatches { - NSArray *array = @[@1, @2]; - expect(@"hello world!").to(endWith(@"world!")); - expect(@"hello world!").toNot(endWith(@"hello")); - expect(array).to(endWith(@2)); - expect(array).toNot(endWith(@1)); - expect(@1).toNot(contain(@"foo")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to end with , got ", ^{ - expect(@"hello world!").to(endWith(@"?")); - }); - expectFailureMessage(@"expected to not end with , got ", ^{ - expect(@"hello world!").toNot(endWith(@"!")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to end with <1>, got ", ^{ - expect(nil).to(endWith(@1)); - }); - expectNilFailureMessage(@"expected to not end with <1>, got ", ^{ - expect(nil).toNot(endWith(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m deleted file mode 100644 index 6c20809..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m +++ /dev/null @@ -1,94 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCEqualTest : XCTestCase - -@end - -@implementation ObjCEqualTest - -- (void)testPositiveMatches { - expect(@1).to(equal(@1)); - expect(@1).toNot(equal(@2)); - expect(@1).notTo(equal(@2)); - expect(@"hello").to(equal(@"hello")); - expect("hello").to(equal("hello")); - expect(NSMakeRange(0, 10)).to(equal(NSMakeRange(0, 10))); - expect(NSMakeRange(0, 10)).toNot(equal(NSMakeRange(0, 5))); - expect((NSInteger)1).to(equal((NSInteger)1)); - expect((NSInteger)1).toNot(equal((NSInteger)2)); - expect((NSUInteger)1).to(equal((NSUInteger)1)); - expect((NSUInteger)1).toNot(equal((NSUInteger)2)); - expect(0).to(equal(0)); - expect(1).to(equal(1)); - expect(1).toNot(equal(2)); - expect(1.0).to(equal(1.0)); // Note: not recommended, use beCloseTo() instead - expect(1.0).toNot(equal(2.0)); // Note: not recommended, use beCloseTo() instead - expect((float)1.0).to(equal((float)1.0)); // Note: not recommended, use beCloseTo() instead - expect((float)1.0).toNot(equal((float)2.0)); // Note: not recommended, use beCloseTo() instead - expect((double)1.0).to(equal((double)1.0)); // Note: not recommended, use beCloseTo() instead - expect((double)1.0).toNot(equal((double)2.0)); // Note: not recommended, use beCloseTo() instead - expect((long long)1).to(equal((long long)1)); - expect((long long)1).toNot(equal((long long)2)); - expect((unsigned long long)1).to(equal((unsigned long long)1)); - expect((unsigned long long)1).toNot(equal((unsigned long long)2)); -} - -- (void)testNimbleCurrentlyBoxesNumbersWhichAllowsImplicitTypeConversions { - expect(1).to(equal(1.0)); - expect((long long)1).to(equal((unsigned long long)1)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(@1).to(equal(@2)); - }); - expectFailureMessage(@"expected to not equal <1>, got <1>", ^{ - expect(@1).toNot(equal(@1)); - }); - expectFailureMessage(@"expected to not equal , got ", ^{ - expect("bar").toNot(equal("foo")); - }); - expectFailureMessage(@"expected to equal , got ", ^{ - expect(NSMakeRange(0, 10)).to(equal(NSMakeRange(0, 5))); - }); - - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((NSInteger)1).to(equal((NSInteger)2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((NSUInteger)1).to(equal((NSUInteger)2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(1).to(equal(2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(1.0).to(equal(2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((float)1.0).to(equal((float)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((double)1.0).to(equal((double)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((long long)1.0).to(equal((long long)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((unsigned long long)1.0).to(equal((unsigned long long)2.0)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to equal , got ", ^{ - expect(NULL).to(equal(NULL)); - }); - expectNilFailureMessage(@"expected to equal , got ", ^{ - expect(nil).to(equal(nil)); - }); - expectNilFailureMessage(@"expected to not equal , got ", ^{ - expect(nil).toNot(equal(nil)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m deleted file mode 100644 index 31053c8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m +++ /dev/null @@ -1,174 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCHaveCountTest : XCTestCase - -@end - -@implementation ObjCHaveCountTest - -- (void)testHaveCountForNSArray { - expect(@[@1, @2, @3]).to(haveCount(@3)); - expect(@[@1, @2, @3]).notTo(haveCount(@1)); - - expect(@[]).to(haveCount(@0)); - expect(@[@1]).notTo(haveCount(@0)); - - expect(@[@1, @2, @3]).to(haveCount(3)); - expect(@[@1, @2, @3]).notTo(haveCount(1)); - - expect(@[]).to(haveCount(0)); - expect(@[@1]).notTo(haveCount(0)); - - expectFailureMessage(@"expected to have NSArray with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSArray with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSArray with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSArray with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSDictionary { - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(@3)); - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(@1)); - - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(3)); - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSDictionary with count 1, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSDictionary with count 3, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSDictionary with count 1, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSDictionary with count 3, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSHashtable { - NSHashTable *const table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - [table addObject:@2]; - [table addObject:@3]; - - expect(table).to(haveCount(@3)); - expect(table).notTo(haveCount(@1)); - - expect(table).to(haveCount(3)); - expect(table).notTo(haveCount(1)); - - NSString *msg = [NSString stringWithFormat: - @"expected to have NSHashTable {[2] 2[12] 1[13] 3}with count 1, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).to(haveCount(@1)); - }); - - msg = [NSString stringWithFormat: - @"expected to not have NSHashTable {[2] 2[12] 1[13] 3}with count 3, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).notTo(haveCount(@3)); - }); - - - msg = [NSString stringWithFormat: - @"expected to have NSHashTable {[2] 2[12] 1[13] 3}with count 1, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).to(haveCount(1)); - }); - - msg = [NSString stringWithFormat: - @"expected to not have NSHashTable {[2] 2[12] 1[13] 3}with count 3, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSSet { - NSSet *const set = [NSSet setWithArray:@[@1, @2, @3]]; - - expect(set).to(haveCount(@3)); - expect(set).notTo(haveCount(@1)); - expect(set).to(haveCount(3)); - expect(set).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSSet with count 1, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSSet with count 3, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSSet with count 1, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSSet with count 3, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSIndexSet { - NSIndexSet *const set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]; - - expect(set).to(haveCount(@3)); - expect(set).notTo(haveCount(@1)); - expect(set).to(haveCount(3)); - expect(set).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSIndexSet with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSIndexSet with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSIndexSet with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSIndexSet with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForUnsupportedTypes { - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFConstantString", ^{ - expect(@"string").to(haveCount(@6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFNumber", ^{ - expect(@1).to(haveCount(@6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFConstantString", ^{ - expect(@"string").to(haveCount(6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFNumber", ^{ - expect(@1).to(haveCount(6)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m deleted file mode 100644 index 2342ae4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m +++ /dev/null @@ -1,33 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCMatchTest : XCTestCase - -@end - -@implementation ObjCMatchTest - -- (void)testPositiveMatches { - expect(@"11:14").to(match(@"\\d{2}:\\d{2}")); - expect(@"hello").toNot(match(@"\\d{2}:\\d{2}")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to match <\\d{2}:\\d{2}>, got ", ^{ - expect(@"hello").to(match(@"\\d{2}:\\d{2}")); - }); - expectFailureMessage(@"expected to not match <\\d{2}:\\d{2}>, got <11:22>", ^{ - expect(@"11:22").toNot(match(@"\\d{2}:\\d{2}")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to match <\\d{2}:\\d{2}>, got ", ^{ - expect(nil).to(match(@"\\d{2}:\\d{2}")); - }); - expectNilFailureMessage(@"expected to not match <\\d{2}:\\d{2}>, got ", ^{ - expect(nil).toNot(match(@"\\d{2}:\\d{2}")); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m deleted file mode 100644 index d84915a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m +++ /dev/null @@ -1,178 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCRaiseExceptionTest : XCTestCase - -@end - -@implementation ObjCRaiseExceptionTest - -- (void)testPositiveMatches { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectAction(^{ @throw exception; }).to(raiseException()); - expectAction(^{ [exception raise]; }).to(raiseException()); - expectAction(^{ [exception raise]; }).to(raiseException().named(NSInvalidArgumentException)); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food")); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"})); - - expectAction(^{ }).toNot(raiseException()); -} - -- (void)testPositiveMatchesWithBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectAction(^{ [exception raise]; }).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); -} - -- (void)testNegativeMatches { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - - expectFailureMessage(@"expected to raise any exception, got no exception", ^{ - expectAction(^{ }).to(raiseException()); - }); - - expectFailureMessage(@"expected to raise exception with name , got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(@"foo")); - }); - - expectFailureMessage(@"expected to raise exception with name with reason , got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"cakes")); - }); - - expectFailureMessage(@"expected to raise exception with name with reason with userInfo <{k = v;}>, got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"k": @"v"})); - }); - - expectFailureMessage(@"expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }", ^{ - expectAction(^{ [exception raise]; }).toNot(raiseException()); - }); -} - -- (void)testNegativeMatchesWithPassingBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectFailureMessage(@"expected to raise exception that satisfies block, got no exception", ^{ - expect(exception).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"LOL")); - })); - }); - - NSString *outerFailureMessage = @"expected to raise exception that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(@"foo"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"bar"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name with reason with userInfo <{}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); -} - -- (void)testNegativeMatchesWithNegativeBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - NSString *outerFailureMessage; - - NSString const *innerFailureMessage = @"expected to equal , got "; - outerFailureMessage = @"expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); - - - outerFailureMessage = @"expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); - - - outerFailureMessage = @"expected to raise exception with name with reason with userInfo <{key = value;}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m deleted file mode 100644 index 4c80abc..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m +++ /dev/null @@ -1,32 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCSatisfyAnyOfTest : XCTestCase - -@end - -@implementation ObjCSatisfyAnyOfTest - -- (void)testPositiveMatches { - expect(@2).to(satisfyAnyOf(equal(@2), equal(@3))); - expect(@2).toNot(satisfyAnyOf(equal(@3), equal(@16))); - expect(@[@1, @2, @3]).to(satisfyAnyOf(equal(@[@1, @2, @3]), allPass(beLessThan(@4)))); - expect(@NO).to(satisfyAnyOf(beTrue(), beFalse())); - expect(@YES).to(satisfyAnyOf(beTrue(), beFalse())); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to match one of: {equal <3>}, or {equal <4>}, or {equal <5>}, got 2", ^{ - expect(@2).to(satisfyAnyOf(equal(@3), equal(@4), equal(@5))); - }); - - expectFailureMessage(@"expected to match one of: {all be less than <4>, but failed first at element" - " <5> in <[5, 6, 7]>}, or {equal <(1, 2, 3, 4)>}, got (5,6,7)", ^{ - expect(@[@5, @6, @7]).to(satisfyAnyOf(allPass(beLessThan(@4)), equal(@[@1, @2, @3, @4]))); - }); - - expectFailureMessage(@"satisfyAnyOf must be called with at least one matcher", ^{ - expect(@"turtles").to(satisfyAnyOf()); - }); -} -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m deleted file mode 100644 index 2aae816..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m +++ /dev/null @@ -1,21 +0,0 @@ -#import -#import -#import "NimbleSpecHelper.h" - -@interface ObjCSyncTest : XCTestCase - -@end - -@implementation ObjCSyncTest - -- (void)testFailureExpectation { - expectFailureMessage(@"fail() always fails", ^{ - fail(); - }); - - expectFailureMessage(@"This always fails", ^{ - failWithMessage(@"This always fails"); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m deleted file mode 100644 index ffb5407..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m +++ /dev/null @@ -1,52 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCUserDescriptionTest : XCTestCase - -@end - -@implementation ObjCUserDescriptionTest - -- (void)testToWithDescription { - expectFailureMessage(@"These are equal!\n" - "expected to equal <2>, got <1>", ^{ - expect(@1).toWithDescription(equal(@2), @"These are equal!"); - }); -} - -- (void)testToNotWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to not equal <1>, got <1>", ^{ - expect(@1).toNotWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testNotToWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to not equal <1>, got <1>", ^{ - expect(@1).notToWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testToEventuallyWithDescription { - expectFailureMessage(@"These are equal!\n" - "expected to eventually equal <2>, got <1>", ^{ - expect(@1).toEventuallyWithDescription(equal(@2), @"These are equal!"); - }); -} - -- (void)testToEventuallyNotWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to eventually not equal <1>, got <1>", ^{ - expect(@1).toEventuallyNotWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testToNotEventuallyWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to eventually not equal <1>, got <1>", ^{ - expect(@1).toNotEventuallyWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m deleted file mode 100644 index 4ba2eae..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m +++ /dev/null @@ -1,31 +0,0 @@ -@import XCTest; -@import Nimble; - -@interface ObjcStringersTest : XCTestCase - -@end - -@implementation ObjcStringersTest - -- (void)testItCanStringifyArrays { - NSArray *array = @[@1, @2, @3]; - NSString *result = NMBStringify(array); - - expect(result).to(equal(@"(1, 2, 3)")); -} - -- (void)testItCanStringifyIndexSets { - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]; - NSString *result = NMBStringify(indexSet); - - expect(result).to(equal(@"(1, 2, 3)")); -} - -- (void)testItRoundsLongDecimals { - NSNumber *num = @291.123782163; - NSString *result = NMBStringify(num); - - expect(result).to(equal(@"291.1238")); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/script/release b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/script/release deleted file mode 100755 index eb53530..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/script/release +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env sh -REMOTE_BRANCH=master -POD_NAME=Nimble -PODSPEC=Nimble.podspec - -POD=${COCOAPODS:-pod} - -function help { - echo "Usage: release VERSION RELEASE_NOTES [-f]" - echo - echo "VERSION should be the version to release, should not include the 'v' prefix" - echo "RELEASE_NOTES should be a file that lists all the release notes for this version" - echo " if file does not exist, creates a git-style commit with a diff as a comment" - echo - echo "FLAGS" - echo " -f Forces override of tag" - echo - echo " Example: ./release 1.0.0-rc.2 ./release-notes.txt" - echo - echo "HINT: use 'git diff ...HEAD' to build the release notes" - echo - exit 2 -} - -function die { - echo "[ERROR] $@" - echo - exit 1 -} - -if [ $# -lt 2 ]; then - help -fi - -VERSION=$1 -RELEASE_NOTES=$2 -FORCE_TAG=$3 - -VERSION_TAG="v$VERSION" - -echo "-> Verifying Local Directory for Release" - -if [ -z "`which $POD`" ]; then - die "Cocoapods is required to produce a release. Aborting." -fi -echo " > Cocoapods is installed" - -echo " > Is this a reasonable tag?" - -echo $VERSION_TAG | grep -q "^vv" -if [ $? -eq 0 ]; then - die "This tag ($VERSION) is an incorrect format. You should remove the 'v' prefix." -fi - -echo $VERSION_TAG | grep -q -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" -if [ $? -ne 0 ]; then - die "This tag ($VERSION) is an incorrect format. It should be in 'v{MAJOR}.{MINOR}.{PATCH}(-{PRERELEASE_NAME}.{PRERELEASE_VERSION})' form." -fi - -echo " > Is this version ($VERSION) unique?" -git describe --exact-match "$VERSION_TAG" > /dev/null 2>&1 -if [ $? -eq 0 ]; then - if [ -z "$FORCE_TAG" ]; then - die "This tag ($VERSION) already exists. Aborting. Append '-f' to override" - else - echo " > NO, but force was specified." - fi -else - echo " > Yes, tag is unique" -fi - -if [ ! -f "$RELEASE_NOTES" ]; then - echo " > Failed to find $RELEASE_NOTES. Prompting editor" - RELEASE_NOTES=/tmp/nimble.release.notes - LATEST_TAG=`git for-each-ref refs/tags --sort=-refname --format="%(refname:short)" | grep -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" | ruby -e 'puts STDIN.read.split("\n").sort { |a,b| Gem::Version.new(a.gsub(/^v/, "")) <=> Gem::Version.new(b.gsub(/^v/, "")) }.last'` - echo " > Latest tag ${LATEST_TAG}" - echo "${POD_NAME} v$VERSION" > $RELEASE_NOTES - echo "================" >> $RELEASE_NOTES - echo >> $RELEASE_NOTES - echo "# Changelog from ${LATEST_TAG}..HEAD" >> $RELEASE_NOTES - git log ${LATEST_TAG}..HEAD | sed -e 's/^/# /' >> $RELEASE_NOTES - $EDITOR $RELEASE_NOTES - diff -q $RELEASE_NOTES ${RELEASE_NOTES}.backup > /dev/null 2>&1 - STATUS=$? - rm ${RELEASE_NOTES}.backup - if [ $STATUS -eq 0 ]; then - rm $RELEASE_NOTES - die "No changes in release notes file. Aborting." - fi -fi -echo " > Release notes: $RELEASE_NOTES" - -if [ ! -f "$PODSPEC" ]; then - die "Cannot find podspec: $PODSPEC. Aborting." -fi -echo " > Podspec exists" - -git config --get user.signingkey > /dev/null || { - echo "[ERROR] No PGP found to sign tag. Aborting." - echo - echo " Creating a release requires signing the tag for security purposes. This allows users to verify the git cloned tree is from a trusted source." - echo " From a security perspective, it is not considered safe to trust the commits (including Author & Signed-off fields). It is easy for any" - echo " intermediate between you and the end-users to modify the git repository." - echo - echo " While not all users may choose to verify the PGP key for tagged releases. It is a good measure to ensure 'this is an official release'" - echo " from the official maintainers." - echo - echo " If you're creating your PGP key for the first time, use RSA with at least 4096 bits." - echo - echo "Related resources:" - echo " - Configuring your system for PGP: https://git-scm.com/book/tr/v2/Git-Tools-Signing-Your-Work" - echo " - Why: http://programmers.stackexchange.com/questions/212192/what-are-the-advantages-and-disadvantages-of-cryptographically-signing-commits-a" - echo - exit 2 -} -echo " > Found PGP key for git" - -# Verify cocoapods trunk ownership -pod trunk me | grep -q "$POD_NAME" || die "You do not have access to pod repository $POD_NAME. Aborting." -echo " > Verified ownership to $POD_NAME pod" - - -echo "--- Releasing version $VERSION (tag: $VERSION_TAG)..." - -function restore_podspec { - if [ -f "${PODSPEC}.backup" ]; then - mv -f ${PODSPEC}{.backup,} - fi -} - -echo "-> Ensuring no differences to origin/$REMOTE_BRANCH" -git fetch origin || die "Failed to fetch origin" -git diff --quiet HEAD "origin/$REMOTE_BRANCH" || die "HEAD is not aligned to origin/$REMOTE_BRANCH. Cannot update version safely" - - -echo "-> Setting podspec version" -cat "$PODSPEC" | grep 's.version' | grep -q "\"$VERSION\"" -SET_PODSPEC_VERSION=$? -if [ $SET_PODSPEC_VERSION -eq 0 ]; then - echo " > Podspec already set to $VERSION. Skipping." -else - sed -i.backup "s/s.version *= *\".*\"/s.version = \"$VERSION\"/g" "$PODSPEC" || { - restore_podspec - die "Failed to update version in podspec" - } - - git add ${PODSPEC} || { restore_podspec; die "Failed to add ${PODSPEC} to INDEX"; } - git commit -m "Bumping version to $VERSION" || { restore_podspec; die "Failed to push updated version: $VERSION"; } -fi - -if [ -z "$FORCE_TAG" ]; then - echo "-> Tagging version" - git tag -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin" - git push origin "$VERSION_TAG" || die "Failed to push tag '$VERSION_TAG' to origin" -else - echo "-> Tagging version (force)" - git tag -f -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin (force)" - git push origin "$VERSION_TAG" -f || die "Failed to push tag '$VERSION_TAG' to origin" -fi - -if [ $SET_PODSPEC_VERSION -ne 0 ]; then - git push origin "$REMOTE_BRANCH" || die "Failed to push to origin" - echo " > Pushed version to origin" -fi - -echo -echo "---------------- Released as $VERSION_TAG ----------------" -echo - -echo -echo "Pushing to pod trunk..." - -$POD trunk push "$PODSPEC" - -echo -echo "================ Finalizing the Release ================" -echo -echo " - Opening GitHub to mark this as a release..." -echo " - Paste the contents of $RELEASE_NOTES into the release notes. Tweak for GitHub styling." -echo " - Announce!" - -open "https://github.com/Quick/Nimble/releases/new?tag=$VERSION_TAG" - -rm ${PODSPEC}.backup diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/test b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/test deleted file mode 100755 index 8ea482e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Nimble/test +++ /dev/null @@ -1,142 +0,0 @@ -#!/bin/bash - -GREEN="\033[0;32m" -CLEAR="\033[0m" - -if which xcodebuild > /dev/null; then - echo -e "Gathering ${GREEN}xcodebuild sdk versions${CLEAR}..." - BUILD_DIR=`pwd`/build - LATEST_IOS_SDK_VERSION=`xcodebuild -showsdks | grep iphonesimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_TVOS_SDK_VERSION=`xcodebuild -showsdks | grep appletvsimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_MACOS_SDK_VERSION=`xcodebuild -showsdks | grep 'macosx' | cut -d ' ' -f 3 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - BUILD_IOS_SDK_VERSION=${NIMBLE_BUILD_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - RUNTIME_IOS_SDK_VERSION=${NIMBLE_RUNTIME_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - BUILD_TVOS_SDK_VERSION=${NIMBLE_BUILD_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - RUNTIME_TVOS_SDK_VERSION=${NIMBLE_RUNTIME_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - BUILD_MACOS_SDK_VERSION=${NIMBLE_BUILD_MACOS_SDK_VERSION:-$LATEST_MACOS_SDK_VERSION} -fi - -set -e - -function color_if_overridden { - local actual=$1 - local env_var=$2 - if [ -z "$env_var" ]; then - printf "$actual" - else - printf "$GREEN$actual$CLEAR" - fi -} - -function print_env { - echo "=== Environment ===" - echo " iOS:" - echo " Latest iOS SDK: $LATEST_IOS_SDK_VERSION" - echo " Building with iOS SDK: `color_if_overridden $BUILD_IOS_SDK_VERSION $NIMBLE_BUILD_IOS_SDK_VERSION`" - echo " Running with iOS SDK: `color_if_overridden $RUNTIME_IOS_SDK_VERSION $NIMBLE_RUNTIME_IOS_SDK_VERSION`" - echo - echo " tvOS:" - echo " Latest tvOS SDK: $LATEST_TVOS_SDK_VERSION" - echo " Building with tvOS SDK: `color_if_overridden $BUILD_TVOS_SDK_VERSION $NIMBLE_BUILD_TVOS_SDK_VERSION`" - echo " Running with tvOS SDK: `color_if_overridden $RUNTIME_TVOS_SDK_VERSION $NIMBLE_RUNTIME_TVOS_SDK_VERSION`" - echo - echo " macOS:" - echo " Latest macOS SDK: $LATEST_MACOS_SDK_VERSION" - echo " Building with macOS SDK: `color_if_overridden $BUILD_MACOS_SDK_VERSION $NIMBLE_BUILD_MACOS_SDK_VERSION`" - echo - echo "======= END =======" - echo -} - -function run { - echo -e "$GREEN==>$CLEAR $@" - "$@" -} - -function test_ios { - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPad Air,OS=$RUNTIME_IOS_SDK_VERSION" build-for-testing test-without-building - - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPhone 5s,OS=$RUNTIME_IOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_tvos { - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -sdk "appletvsimulator$BUILD_TVOS_SDK_VERSION" -destination "name=Apple TV 1080p,OS=$RUNTIME_TVOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_macos { - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-macOS" -configuration "Debug" -sdk "macosx$BUILD_MACOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_podspec { - echo "Gathering CocoaPods installation information..." - run bundle exec pod --version - echo "Linting podspec..." - run bundle exec pod lib lint Nimble.podspec -} - -function test_swiftpm { - if [ -d .build ]; then - run swift build --clean - fi - run swift build && swift test -} - -function test() { - test_ios - test_tvos - test_macos - - if which swift-test; then - test_swiftpm - else - echo "Not testing with the Swift Package Manager because swift-test is not installed" - fi -} - -function clean { - run rm -rf ~/Library/Developer/Xcode/DerivedData\; true -} - -function help { - echo "Usage: $0 COMMANDS" - echo - echo "COMMANDS:" - echo " clean - Cleans the derived data directory of Xcode. Assumes default location" - echo " ios - Runs the tests as an iOS device" - echo " tvos - Runs the tests as an tvOS device" - echo " macos - Runs the tests on macOS 10.10 (Yosemite and newer only)" - echo " podspec - Runs pod lib lint against the podspec to detect breaking changes" - echo " all - Runs the all tests of macos, ios and tvos" - echo " swiftpm - Runs the tests built by the Swift Package Manager" - echo " help - Displays this help" - echo - exit 1 -} - -function main { - print_env - for arg in $@ - do - case "$arg" in - clean) clean ;; - ios) test_ios ;; - tvos) test_tvos ;; - macos) test_macos ;; - podspec) test_podspec ;; - test) test ;; - all) test ;; - swiftpm) test_swiftpm ;; - help) help ;; - esac - done - - if [ $# -eq 0 ]; then - clean - test - fi -} - -main $@ diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.Package.test.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.Package.test.swift deleted file mode 100644 index 34b9608..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.Package.test.swift +++ /dev/null @@ -1,19 +0,0 @@ -import PackageDescription - -let package = Package( - name: "Quick", - // TODO: Once the `test` command has been implemented in the Swift Package Manager, this should be changed to - // be `testDependencies:` instead. For now it has to be done like this for the library to get linked with the test targets. - // See: https://github.com/apple/swift-evolution/blob/master/proposals/0019-package-manager-testing.md - dependencies: [ - .Package(url: "https://github.com/Quick/Nimble", majorVersion: 5) - ], - exclude: [ - "Sources/QuickObjectiveC", - "Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m", - "Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m", - "Tests/QuickTests/QuickTests/FunctionalTests/ObjC", - "Tests/QuickTests/QuickTests/Helpers", - "Tests/QuickTests/QuickTests/QuickConfigurationTests.m", - ] -) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE deleted file mode 100644 index ebe5a2b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE +++ /dev/null @@ -1,36 +0,0 @@ -- [ ] I have read [CONTRIBUTING](https://github.com/Quick/Quick/blob/master/CONTRIBUTING.md) and have done my best to follow them. - -### What did you do? - -Please replace this with what you did. - -### What did you expect to happen? - -Please replace this with what you expected to happen. - -### What actually happened instead? - -Please replace this with what happened instead. - -### Environment - -List the software versions you're using: - - - Quick: *?.?.?* - - Nimble: *?.?.?* - - Xcode Version: *?.? (????)* (Open Xcode; In menubar: Xcode > About Xcode) - - Swift Version: *?.?* (Open Xcode Preferences; Components > Toolchains. If none, use `Xcode Default`.) - -Please also mention which package manager you used and its version. Delete the -other package managers in this list: - - - Cocoapods: *?.?.?* (Use `pod --version` in Terminal) - - Carthage: *?.?* (Use `carthage version` in Terminal) - - Swift Package Manager *?.?.? (swiftpm-???)* (Use `swift build --version` in Terminal) - -### Project that demonstrates the issue - -Please link to a project we can download that reproduces the issue. Feel free -to delete this section if it's not relevant to the issue (eg - feature request). - -The project should be [short, self-contained, and correct example](http://sscce.org/). diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.github/PULL_REQUEST_TEMPLATE b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.github/PULL_REQUEST_TEMPLATE deleted file mode 100644 index 20e40c8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.github/PULL_REQUEST_TEMPLATE +++ /dev/null @@ -1,14 +0,0 @@ -The PR should summarize what was changed and why. Here are some questions to -help you if you're not sure: - - - What behavior was changed? - - What code was refactored / updated to support this change? - - What issues are related to this PR? Or why was this change introduced? - -Checklist - While not every PR needs it, new features should consider this list: - - - [ ] Does this have tests? - - [ ] Does this have documentation? - - [ ] Does this break the public API (Requires major version bump)? - - [ ] Is this a new feature (Requires minor version bump)? - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.gitignore b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.gitignore deleted file mode 100644 index 33d3dc9..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.gitignore +++ /dev/null @@ -1,65 +0,0 @@ -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## Build generated -build/ -DerivedData - -## Various settings -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata - -## Other -*.xccheckout -*.moved-aside -*.xcuserstate -*.xcscmblueprint - -## Obj-C/Swift specific -*.hmap -*.ipa - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -Packages/ -.build/ - -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md - -fastlane/report.xml -fastlane/screenshots - -# Mac OS X -.DS_Store - -# Quick -Quick.framework.zip diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.gitmodules b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.gitmodules deleted file mode 100644 index cffbed0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "Externals/Nimble"] - path = Externals/Nimble - url = https://github.com/Quick/Nimble.git diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.hound.yml b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.hound.yml deleted file mode 100644 index b867fd9..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.hound.yml +++ /dev/null @@ -1,2 +0,0 @@ -swift: - config_file: .swiftlint.yml diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.swift-version b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.swift-version deleted file mode 100644 index 9f55b2c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.swift-version +++ /dev/null @@ -1 +0,0 @@ -3.0 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.swiftlint.yml b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.swiftlint.yml deleted file mode 100644 index 64760d5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.swiftlint.yml +++ /dev/null @@ -1,12 +0,0 @@ - -disabled_rules: - - line_length - - type_name - - valid_docs - - empty_count - - force_unwrapping - - function_body_length - - variable_name -included: - - Sources - - Tests diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.travis.yml b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.travis.yml deleted file mode 100644 index 4c57144..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -osx_image: xcode8 -language: generic -matrix: - include: - - os: osx - env: - - PLATFORM=macos - - XCODE_ACTION="build-for-testing test-without-building" - - os: osx - env: - - PLATFORM=ios - - XCODE_ACTION="build-for-testing test-without-building" - - os: osx - env: - - PLATFORM=tvos - - XCODE_ACTION="build-for-testing test-without-building" - - os: osx - sudo: required - env: - - PODSPEC=1 - - os: linux - sudo: required - dist: trusty -install: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./script/travis-install-macos; fi - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./script/travis-install-linux; fi - - if [[ "$PODSPEC" ]]; then rvm system; sudo gem install bundler; bundle install; fi -script: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./script/travis-script-macos; fi - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./script/travis-script-linux; fi diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/CODE_OF_CONDUCT.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/CODE_OF_CONDUCT.md deleted file mode 100644 index f82f39a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or -advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at [quickorg@icloud.com](mailto:quickorg@icloud.com). All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/CONTRIBUTING.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/CONTRIBUTING.md deleted file mode 100644 index e8e32c1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/CONTRIBUTING.md +++ /dev/null @@ -1,111 +0,0 @@ - - -**Table of Contents** *generated with [DocToc](http://doctoc.herokuapp.com/)* - -- [Welcome to Quick!](#welcome-to-quick!) - - [Reporting Bugs](#reporting-bugs) - - [Building the Project](#building-the-project) - - [Pull Requests](#pull-requests) - - [Style Conventions](#style-conventions) - - [Core Members](#core-members) - - [Code of Conduct](#code-of-conduct) - - [Creating a Release](#creating-a-release) - - - -# Welcome to Quick! - -We're building a testing framework for a new generation of Swift and -Objective-C developers. - -Quick should be easy to use and easy to maintain. Let's keep things -simple and well-tested. - -## Reporting Bugs - -Nothing is off-limits. If you're having a problem, we want to hear about -it. - -- See a crash? File an issue. -- Code isn't compiling, but you don't know why? Sounds like you should - submit a new issue, bud. -- Went to the kitchen, only to forget why you went in the first place? - Better submit an issue. - -Be sure to include in your issue: - -- Your Xcode version (eg - Xcode 7.0.1 7A1001) -- Your version of Quick / Nimble (eg - v0.7.0 or git sha `7d0b8c21357839a8c5228863b77faecf709254a9`) -- What are the steps to reproduce this issue? -- What platform are you using? (eg - OS X, iOS, watchOS, tvOS) -- If the problem is on a UI Testing Bundle, Unit Testing Bundle, or some other target configuration -- Are you using carthage or cocoapods? - -## Building the Project - -- After cloning the repository, run `git submodule update --init` to pull the Nimble submodule. -- Use `Quick.xcworkspace` to work on Quick. The workspace includes - Nimble, which is used in Quick's tests. - -## Pull Requests - -- Nothing is trivial. Submit pull requests for anything: typos, - whitespace, you name it. -- Not all pull requests will be merged, but all will be acknowledged. If - no one has provided feedback on your request, ping one of the owners - by name. -- Make sure your pull request includes any necessary updates to the - README or other documentation. -- Be sure the unit tests for both the OS X and iOS targets of both Quick - and Nimble pass before submitting your pull request. You can run all - the iOS and OS X unit tests using `rake`. -- The `master` branch will always support the stable Xcode version. Other - branches will point to their corresponding versions they support. -- If you're making a configuration change, make sure to edit both the xcode - project and the podspec file. - -### Style Conventions - -- Indent using 4 spaces. -- Keep lines 100 characters or shorter. Break long statements into - shorter ones over multiple lines. -- In Objective-C, use `#pragma mark -` to mark public, internal, - protocol, and superclass methods. See `QuickSpec.m` for an example. - -## Core Members - -If a few of your pull requests have been merged, and you'd like a -controlling stake in the project, file an issue asking for write access -to the repository. - -Your conduct as a core member is your own responsibility, but here are -some "ground rules": - -- Feel free to push whatever you want to master, and (if you have - ownership permissions) to create any repositories you'd like. - - Ideally, however, all changes should be submitted as GitHub pull - requests. No one should merge their own pull request, unless no - other core members respond for at least a few days. - - Pull requests should be issued from personal forks. The Quick repo - should be reserved for long-running feature branches. - - If you'd like to create a new repository, it'd be nice if you created - a GitHub issue and gathered some feedback first. - -- It'd be awesome if you could review, provide feedback on, and close - issues or pull requests submitted to the project. Please provide kind, - constructive feedback. Please don't be sarcastic or snarky. - -Read [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for more in depth guidelines. - -## Creating a Release - -The process is relatively straight forward, but here's is a useful checklist for tagging: - -- Look at changes from the previously tagged release and write release notes: `git log v0.4.0...HEAD` -- Run the release script: `./script/release A.B.C release-notes-file` -- The script will prompt you to create a new [GitHub release](https://github.com/Quick/Quick/releases). - - Use the same release notes you created for the tag, but tweak up formatting for GitHub. -- Announce! diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/README.md deleted file mode 100644 index 08fb556..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Documentation - -- [English](en-us/README.md) -- [日本語](ja/README.md) -- [中文](zh-cn/README.md) -- [pt-br](pt-br/README.md) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/ArrangeActAssert.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/ArrangeActAssert.md deleted file mode 100644 index fc7915b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/ArrangeActAssert.md +++ /dev/null @@ -1,220 +0,0 @@ -# Effective Tests Using XCTest: Arrange, Act, and Assert - -Whether you're using XCTest, Quick, or another testing framework, you can write -effective unit tests by following a simple pattern: - -1. Arrange -2. Act -3. Assert - -## Using Arrange, Act, and Assert - -For example, let's look at a simple class called `Banana`: - -```swift -// Banana/Banana.swift - -/** A delicious banana. Tastes better if you peel it first. */ -public class Banana { - private var isPeeled = false - - /** Peels the banana. */ - public func peel() { - isPeeled = true - } - - /** You shouldn't eat a banana unless it's been peeled. */ - public var isEdible: Bool { - return isPeeled - } -} -``` - -Let's verify the `Banana.peel()` method does what it's supposed to: - -```swift -// BananaTests/BananaTests.swift - -class BananaTests: XCTestCase { - func testPeel() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) - } -} -``` - -## Using Clear Test Names - -Our `testPeel()` makes sure that, if the `Banana.peel()` method ever -stops working right, we'll know. This usually happens when our application -code changes, which either means: - -1. We accidentally broke our application code, so we have to fix the application code -2. We changed how our application code works--maybe because we're adding a new - feature--so we have to change the test code - -If our tests start breaking, how do we know which one of these cases applies? It might -surprise you that **the name of the test** is our best indication. Good test names: - -1. Are clear about what is being tested. -2. Are clear about when the test should pass or fail. - -Is our `testPeel()` method clearly named? Let's make it clearer: - -```diff -// BananaTests.swift - --func testPeel() { -+func testPeel_makesTheBananaEdible() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) -} -``` - -The new name: - -1. Is clear about what is being tested: `testPeel` indicates it's the `Banana.peel()` method. -2. Is clear about when the test should pass: `makesTheBananaEdible` indicates the - banana is edible once the method has been called. - -## Testing Conditions - -Let's say we want to offer people bananas, using a function called `offer()`: - -```swift -// Banana/Offer.swift - -/** Given a banana, returns a string that can be used to offer someone the banana. */ -public func offer(banana: Banana) -> String { - if banana.isEdible { - return "Hey, want a banana?" - } else { - return "Hey, want me to peel this banana for you?" - } -} -``` - -Our application code does one of two things: - -1. Either it offers a banana that's already been peeled... -2. ...or it offers an unpeeled banana. - -Let's write tests for these two cases: - -```swift -// BananaTests/OfferTests.swift - -class OfferTests: XCTestCase { - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { - // Arrange: Create a banana and peel it. - let banana = Banana() - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { - // Arrange: Create a banana. - let banana = Banana() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -Our test names clearly indicate the **conditions** under which our tests should pass: -in the case that `whenTheBananaIsPeeled`, `offer()` should `offersTheBanana`. And if -the banana isn't peeled? Well, we have a test for that, too! - -Notice that we have one test per `if` statement in our application code. -This is a great pattern when writing tests: it makes sure every set of conditions -is tested. If one of those conditions no longer works, or needs to be changed, we'll know -exactly which test needs to be looked at. - -## Shorter "Arrange" Steps with `XCTestCase.setUp()` - -Both of our `OfferTests` tests contain the same "Arrange" code: they both -create a banana. We should move that code into a single place. Why? - -1. As-is, if we change the `Banana` initializer, we'll have to change every test that creates a banana. -2. Our test methods will be shorter--which is a good thing if (and **only if**) that makes - the tests easier to read. - -Let's move the `Banana` initialization into the `XCTestCase.setUp()` method, which is called -once before every test method. - -```diff -// OfferTests.swift - -class OfferTests: XCTestCase { -+ var banana: Banana! -+ -+ override func setUp() { -+ super.setUp() -+ banana = Banana() -+ } -+ - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { -- // Arrange: Create a banana and peel it. -- let banana = Banana() -+ // Arrange: Peel the banana. - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { -- // Arrange: Create a banana. -- let banana = Banana() -- - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -## Sharing "Arrange" Code Across Multiple Tests - -If you find yourself using the same "arrange" steps across multiple tests, -you may want to define a helper function within your test target: - -```swift -// BananaTests/BananaHelpers.swift - -internal func createNewPeeledBanana() -> Banana { - let banana = Banana() - banana.peel() - return banana -} -``` - -> Use a function to define your helpers: functions can't be subclassed, nor - can they retain any state. Subclassing and mutable state can make your tests - harder to read. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/BehavioralTesting.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/BehavioralTesting.md deleted file mode 100644 index 02ae0c0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/BehavioralTesting.md +++ /dev/null @@ -1,87 +0,0 @@ -# Don't Test Code, Instead Verify Behavior - -Tests should only fail if the application **behaves differently**. -They should test *what* the application code does, not *how* it does those things. - -- Tests that verify *what* an application does are **behavioral tests**. -- Tests that break if the application code changes, even if the behavior - remains the same, are **brittle tests**. - -Let's say we have a banana database, called `GorillaDB`. -`GorillaDB` is a key-value store for bananas. We can save bananas: - -```swift -let database = GorillaDB() -let banana = Banana() -database.save(banana: banana, key: "my-banana") -``` - -And we can restore bananas from disk later: - -```swift -let banana = database.load(key: "my-banana") -``` - -## Brittle Tests - -How can we test this behavior? One way would be to check the size of the database -after we save a banana: - -```swift -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() - let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - - // Assert: The size of the database should have increased by one. - XCTAssertEqual(database.size, originalSize + 1) -} -``` - - -Imagine, however, that the source code of `GorillaDB` changes. In order to make -reading bananas from the database faster, it maintains a cache of the most frequently -used bananas. `GorillaDB.size` grows as the size of the cache grows, and our test fails: - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/Screenshot_database_size_fail.png) - -## Behavioral Tests - -The key to writing behavioral tests is determining exactly what you're expecting -your application code to do. - -In the context of our `testSave_savesTheBananaToTheDatabase` test: what is the -behavior we expect when we "save" a banana to the database? "Saving" implies, to me, -that we can load it later. So instead of testing that the size of the database increases, -we should test that we can load a banana. - -```diff -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() -- let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - -- // Assert: The size of the database should have increased by one. -- XCTAssertEqual(database.size, originalSize + 1) -+ // Assert: The bananas saved to and loaded from the database should be the same. -+ XCTAssertEqual(database.load(key: "test-banana"), banana) -} -``` - -The key to writing behavioral tests is asking: - -- What exactly should this application code do? -- Is my test verifying *only* that behavior? - Or could it fail due to other aspects of how the code works? diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/ConfiguringQuick.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/ConfiguringQuick.md deleted file mode 100644 index 919d4de..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/ConfiguringQuick.md +++ /dev/null @@ -1,103 +0,0 @@ -# Configuring How Quick Behaves - -You can customize how Quick behaves by subclassing `QuickConfiguration` and -overriding the `QuickConfiguration.Type.configure()` class method: - -```swift -// Swift - -import Quick - -class ProjectDataTestConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - // ...set options on the configuration object here. - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(ProjectDataTestConfiguration) - -+ (void)configure:(Configuration *configuration) { - // ...set options on the configuration object here. -} - -QuickConfigurationEnd -``` - -Projects may include several configurations. Quick does not make any -guarantee about the order in which those configurations are executed. - -## Adding Global `beforeEach` and `afterEach` Closures - -Using `QuickConfiguration.beforeEach` and `QuickConfiguration.afterEach`, you -can specify closures to be run before or after *every* example in a test suite: - -```swift -// Swift - -import Quick -import Sea - -class FinConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { - Dorsal.sharedFin().height = 0 - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -#import "Dorsal.h" - -QuickConfigurationBegin(FinConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEach:^{ - [Dorsal sharedFin].height = 0; - }]; -} - -QuickConfigurationEnd -``` - -In addition, Quick allows you to access metadata regarding the current -example being run: - -```swift -// Swift - -import Quick - -class SeaConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { exampleMetadata in - // ...use the example metadata object to access the current example name, and more. - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(SeaConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEachWithMetadata:^(ExampleMetadata *data) { - // ...use the example metadata object to access the current example name, and more. - }]; -} - -QuickConfigurationEnd -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/InstallingFileTemplates.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/InstallingFileTemplates.md deleted file mode 100644 index 3de82c5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/InstallingFileTemplates.md +++ /dev/null @@ -1,28 +0,0 @@ -# Installing Quick File Templates - -The Quick repository includes file templates for both Swift and -Objective-C specs. - -## Alcatraz - -Quick templates can be installed via [Alcatraz](https://github.com/supermarin/Alcatraz), -a package manager for Xcode. Just search for the templates from the -Package Manager window. - -![](http://f.cl.ly/items/3T3q0G1j0b2t1V0M0T04/Screen%20Shot%202014-06-27%20at%202.01.10%20PM.png) - -## Manually via the Rakefile - -To manually install the templates, just clone the repository and -run the `templates:install` rake task: - -```sh -$ git clone git@github.com:Quick/Quick.git -$ rake templates:install -``` - -Uninstalling is easy, too: - -```sh -$ rake templates:uninstall -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md deleted file mode 100644 index 258956f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md +++ /dev/null @@ -1,157 +0,0 @@ -# Installing Quick - ->Before starting, check [here](../../README.md#swift-version) which versions of Quick and Nimble are compatible with your version of Swift. - -Quick provides the syntax to define examples and example groups. Nimble -provides the `expect(...).to` assertion syntax. You may use either one, -or both, in your tests. - -There are three recommended ways of linking Quick to your tests: - -1. [Git Submodules](#git-submodules) -2. [CocoaPods](#cocoapods) -3. [Carthage](#carthage) -4. [Swift Package Manager (experimental)](#swift-package-manager) - -Choose one and follow the instructions below. Once you've completed them, -you should be able to `import Quick` from within files in your test target. - -## Git Submodules - -To link Quick and Nimble using Git submodules: - -1. Add submodule for Quick. -2. If you don't already have a `.xcworkspace` for your project, create one. ([Here's how](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) -3. Add `Quick.xcodeproj` to your project's `.xcworkspace`. -4. Add `Nimble.xcodeproj` to your project's `.xcworkspace`. It exists in `path/to/Quick/Externals/Nimble`. By adding Nimble from Quick's dependencies (as opposed to adding directly as a submodule), you'll ensure that you're using the correct version of Nimble for whatever version of Quick you're using. -5. Link `Quick.framework` and `Nimble.framework` in your test target's - "Link Binary with Libraries" build phase. - -First, if you don't already have one, create a directory for your Git submodules. -Let's assume you have a directory named `Vendor`. - -**Step One:** Download Quick and Nimble as Git submodules: - -```sh -git submodule add git@github.com:Quick/Quick.git Vendor/Quick -git submodule add git@github.com:Quick/Nimble.git Vendor/Nimble -git submodule update --init --recursive -``` - -**Step Two:** Add the `Quick.xcodeproj` and `Nimble.xcodeproj` files downloaded above to -your project's `.xcworkspace`. For example, this is `Guanaco.xcworkspace`, the -workspace for a project that is tested using Quick and Nimble: - -![](http://f.cl.ly/items/2b2R0e1h09003u2f0Z3U/Screen%20Shot%202015-02-27%20at%202.19.37%20PM.png) - -**Step Three:** Link the `Quick.framework` during your test target's -`Link Binary with Libraries` build phase. You should see two -`Quick.frameworks`; one is for macOS, and the other is for iOS. - -![](http://cl.ly/image/2L0G0H1a173C/Screen%20Shot%202014-06-08%20at%204.27.48%20AM.png) - -Do the same for the `Nimble.framework`, and you're done! - -**Updating the Submodules:** If you ever want to update the Quick -or Nimble submodules to latest version, enter the Quick directory -and pull from the master repository: - -```sh -cd /path/to/your/project/Vendor/Quick -git checkout master -git pull --rebase origin master -``` - -Your Git repository will track changes to submodules. You'll want to -commit the fact that you've updated the Quick submodule: - -```sh -cd /path/to/your/project -git commit -m "Updated Quick submodule" -``` - -**Cloning a Repository that Includes a Quick Submodule:** After other people -clone your repository, they'll have to pull down the submodules as well. -They can do so by running the `git submodule update` command: - -```sh -git submodule update --init --recursive -``` - -You can read more about Git submodules [here](http://git-scm.com/book/en/Git-Tools-Submodules). - -## CocoaPods - -First, update CocoaPods to Version 0.36.0 or newer, which is necessary to install CocoaPods using Swift. - -Then, add Quick and Nimble to your Podfile. Additionally, the ```use_frameworks!``` line is necessary for using Swift in CocoaPods: - -```rb - -# Podfile - -use_frameworks! - -def testing_pods - pod 'Quick' - pod 'Nimble' -end - -target 'MyTests' do - testing_pods -end - -target 'MyUITests' do - testing_pods -end -``` - -Finally, download and link Quick and Nimble to your tests: - -```sh -pod install -``` - -## [Carthage](https://github.com/Carthage/Carthage) - -As test targets do not have the "Embedded Binaries" section, the frameworks must -be added to the target's "Link Binary With Libraries" as well as a "Copy Files" build phase -to copy them to the target's Frameworks destination. - - > As Carthage builds dynamic frameworks, you will need a valid code signing identity set up. - -1. Add Quick to your [`Cartfile.private`](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfileprivate): - - ``` - github "Quick/Quick" - github "Quick/Nimble" - ``` - -2. Run `carthage update`. -3. From your `Carthage/Build/[platform]/` directory, add both Quick and Nimble to your test target's "Link Binary With Libraries" build phase: - ![](http://i.imgur.com/pBkDDk5.png) - -4. For your test target, create a new build phase of type "Copy Files": - ![](http://i.imgur.com/jZATIjQ.png) - -5. Set the "Destination" to "Frameworks", then add both frameworks: - ![](http://i.imgur.com/rpnyWGH.png) - -This is not "the one and only way" to use Carthage to manage dependencies. -For further reference check out the [Carthage documentation](https://github.com/Carthage/Carthage/blob/master/README.md). - -## [Swift Package Manager](https://github.com/apple/swift-package-manager) -With the advent of the [swift.org](https://swift.org) open-source project, Swift now has an official, though nascent, package manager tool. Notably, this provides the possibility of using Quick on non-Apple platforms for the first time. Initial steps have been taken to allow using Quick to test projects using the Swift Package Manager, although frequent breakage is expected at this point since the tool is still under heavy development. - -Until further documentation has been written, the following repository may be useful as an example of how Quick can be declared as a dependency in a `Package.swift` file for SwiftPM: - -https://github.com/Quick/QuickOnLinuxExample - -### (Not Recommended) Running Quick Specs on a Physical iOS Device - -In order to run specs written in Quick on device, you need to add `Quick.framework` and -`Nimble.framework` as `Embedded Binaries` to the `Host Application` of the -test target. After adding a framework as an embedded binary, Xcode will -automatically link the host app against the framework. - -![](http://indiedev.kapsi.fi/images/embed-in-host.png) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/MoreResources.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/MoreResources.md deleted file mode 100644 index 65d7eba..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/MoreResources.md +++ /dev/null @@ -1,28 +0,0 @@ -# More Resources - -## Examples of Quick Specs - -Quick is used by many companies, open-source projects, and individuals, -including [GitHub](https://github.com/github) and -[ReactiveCocoa](https://github.com/ReactiveCocoa). For examples, check out: - -- https://github.com/ReactiveCocoa/ReactiveCocoa -- https://github.com/github/Archimedes -- https://github.com/libgit2/objective-git -- https://github.com/jspahrsummers/RXSwift -- https://github.com/artsy/eidolon -- https://github.com/AshFurrow/Moya -- https://github.com/nerdyc/Squeal -- https://github.com/pepibumur/SugarRecord - -## More on Unit Testing for OS X and iOS Apps - -- **[Quality Coding](http://qualitycoding.org/)**: - A blog on iOS development that focuses on unit testing. -- **[OCMock Tutorials](http://ocmock.org/support/)**: - Use OCMock when you need "fake objects" in your tests. -- **[Nocilla: Stunning HTTP stubbing for iOS and Mac OS X](https://github.com/luisobo/Nocilla)**: - Use this library to test code that sends requests to, and receives responses from, the Internet. -- **[Pivotal Labs: Writing Beautiful Specs with Jasmine Custom Matchers](http://pivotallabs.com/writing-beautiful-specs-jasmine-custom-matchers/)**: - See [the Nimble documentation](https://github.com/Quick/Nimble) for instructions on how to write - custom matchers in Nimble. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/NimbleAssertions.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/NimbleAssertions.md deleted file mode 100644 index 3b31ac3..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/NimbleAssertions.md +++ /dev/null @@ -1,106 +0,0 @@ -# Clearer Tests Using Nimble Assertions - -When code doesn't work the way it's supposed to, unit tests should make it -**clear** exactly what's wrong. - -Take the following function which, given a bunch of monkeys, only returns -the silly monkeys in the bunch: - -```swift -public func silliest(monkeys: [Monkey]) -> [Monkey] { - return monkeys.filter { $0.silliness == .VerySilly } -} -``` - -Now let's say we have a unit test for this function: - -```swift -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) - XCTAssertTrue(contains(sillyMonkeys, kiki)) -} -``` - -The test fails with the following failure message: - -``` -XCTAssertTrue failed -``` - -![](http://f.cl.ly/items/1G17453p47090y30203d/Screen%20Shot%202015-02-26%20at%209.08.27%20AM.png) - -The failure message leaves a lot to be desired. It leaves us wondering, -"OK, so something that should have been true was false--but what?" -That confusion slows us down, since we now have to spend time deciphering test code. - -## Better Failure Messages, Part 1: Manually Providing `XCTAssert` Failure Messages - -`XCTAssert` assertions allow us to specify a failure message of our own, which certainly helps: - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki)) -+ XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -} -``` - -But we have to write our own failure message. - -## Better Failure Messages, Part 2: Nimble Failure Messages - -Nimble makes your test assertions, and their failure messages, easier to read: - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -+ expect(sillyMonkeys).to(contain(kiki)) -} -``` - -We don't have to write our own failure message--the one provided by Nimble -is already very readable: - -``` -expected to contain , - got <[Monkey(name: Jane, silliness: VerySilly)]> -``` - -![](http://f.cl.ly/items/3N2e3g2K3W123b1L1J0G/Screen%20Shot%202015-02-26%20at%2011.27.02%20AM.png) - -The failure message makes it clear what's wrong: we were expecting `kiki` to be included -in the result of `silliest()`, but the result only contains `jane`. Now that we know -exactly what's wrong, it's easy to fix the issue: - -```diff -public func silliest(monkeys: [Monkey]) -> [Monkey] { -- return monkeys.filter { $0.silliness == .VerySilly } -+ return monkeys.filter { $0.silliness == .VerySilly || $0.silliness == .ExtremelySilly } -} -``` - -Nimble provides many different kind of assertions, each with great failure -messages. And unlike `XCTAssert`, you don't have to type your own failure message -every time. - -For the full list of Nimble assertions, check out the [Nimble README](https://github.com/Quick/Nimble). -Below is just a sample, to whet your appetite: - -```swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/QuickExamplesAndGroups.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/QuickExamplesAndGroups.md deleted file mode 100644 index e9f0550..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/QuickExamplesAndGroups.md +++ /dev/null @@ -1,491 +0,0 @@ -# Organized Tests with Quick Examples and Example Groups - -Quick uses a special syntax to define **examples** and **example groups**. - -In *[Effective Tests Using XCTest: Arrange, Act, and Assert](ArrangeActAssert.md)*, -we learned that a good test method name is crucial--when a test starts failing, it's -the best way to determine whether we have to fix the application code or update the test. - -Quick examples and example groups serve two purposes: - -1. They encourage you to write descriptive test names. -2. They greatly simplify the test code in the "arrange" step of your tests. - -## Examples Using `it` - -Examples, defined with the `it` function, use assertions to demonstrate -how code should behave. These are like test methods in XCTest. - -`it` takes two parameters: the name of the example, and a closure. -The examples below specify how the `Sea.Dolphin` class should behave. -A new dolphin should be smart and friendly: - -```swift -// Swift - -import Quick -import Nimble -import Sea - -class DolphinSpec: QuickSpec { - override func spec() { - it("is friendly") { - expect(Dolphin().isFriendly).to(beTruthy()) - } - - it("is smart") { - expect(Dolphin().isSmart).to(beTruthy()) - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -it(@"is friendly", ^{ - expect(@([[Dolphin new] isFriendly])).to(beTruthy()); -}); - -it(@"is smart", ^{ - expect(@([[Dolphin new] isSmart])).to(beTruthy()); -}); - -QuickSpecEnd -``` - -Use descriptions to make it clear what your examples are testing. -Descriptions can be of any length and use any character, including -characters from languages besides English, or even emoji! :v: :sunglasses: - -## Example Groups Using `describe` and `context` - -Example groups are logical groupings of examples. Example groups can share -setup and teardown code. - -### Describing Classes and Methods Using `describe` - -To specify the behavior of the `Dolphin` class's `click` method--in -other words, to test the method works--several `it` examples can be -grouped together using the `describe` function. Grouping similar -examples together makes the spec easier to read: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - describe("its click") { - it("is loud") { - let click = Dolphin().click() - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - let click = Dolphin().click() - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - describe(@"its click", ^{ - it(@"is loud", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -When these two examples are run in Xcode, they'll display the -description from the `describe` and `it` functions: - -1. `DolphinSpec.a_dolphin_its_click_is_loud` -2. `DolphinSpec.a_dolphin_its_click_has_a_high_frequency` - -Again, it's clear what each of these examples is testing. - -### Sharing Setup/Teardown Code Using `beforeEach` and `afterEach` - -Example groups don't just make the examples clearer, they're also useful -for sharing setup and teardown code among examples in a group. - -In the example below, the `beforeEach` function is used to create a brand -new instance of a dolphin and its click before each example in the group. -This ensures that both are in a "fresh" state for every example: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { - dolphin = Dolphin() - } - - describe("its click") { - var click: Click! - beforeEach { - click = dolphin.click() - } - - it("is loud") { - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ - dolphin = [Dolphin new]; - }); - - describe(@"its click", ^{ - __block Click *click = nil; - beforeEach(^{ - click = [dolphin click]; - }); - - it(@"is loud", ^{ - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -Sharing setup like this might not seem like a big deal with the -dolphin example, but for more complicated objects, it saves a lot -of typing! - -To execute code *after* each example, use `afterEach`. - -### Specifying Conditional Behavior Using `context` - -Dolphins use clicks for echolocation. When they approach something -particularly interesting to them, they release a series of clicks in -order to get a better idea of what it is. - -The tests need to show that the `click` method behaves differently in -different circumstances. Normally, the dolphin just clicks once. But when -the dolphin is close to something interesting, it clicks several times. - -This can be expressed using `context` functions: one `context` for the -normal case, and one `context` for when the dolphin is close to -something interesting: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { dolphin = Dolphin() } - - describe("its click") { - context("when the dolphin is not near anything interesting") { - it("is only emitted once") { - expect(dolphin!.click().count).to(equal(1)) - } - } - - context("when the dolphin is near something interesting") { - beforeEach { - let ship = SunkenShip() - Jamaica.dolphinCove.add(ship) - Jamaica.dolphinCove.add(dolphin) - } - - it("is emitted three times") { - expect(dolphin.click().count).to(equal(3)) - } - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ dolphin = [Dolphin new]; }); - - describe(@"its click", ^{ - context(@"when the dolphin is not near anything interesting", ^{ - it(@"is only emitted once", ^{ - expect(@([[dolphin click] count])).to(equal(@1)); - }); - }); - - context(@"when the dolphin is near something interesting", ^{ - beforeEach(^{ - [[Jamaica dolphinCove] add:[SunkenShip new]]; - [[Jamaica dolphinCove] add:dolphin]; - }); - - it(@"is emitted three times", ^{ - expect(@([[dolphin click] count])).to(equal(@3)); - }); - }); - }); -}); - -QuickSpecEnd -``` - -Strictly speaking, the `context` keyword is a synonym for `describe`, -but thoughtful use will make your spec easier to understand. - -### Test Readability: Quick and XCTest - -In [Effective Tests Using XCTest: Arrange, Act, and Assert](ArrangeActAssert.md), -we looked at how one test per condition was a great way to organize test code. -In XCTest, that leads to long test method names: - -```swift -func testDolphin_click_whenTheDolphinIsNearSomethingInteresting_isEmittedThreeTimes() { - // ... -} -``` - -Using Quick, the conditions are much easier to read, and we can perform setup -for each example group: - -```swift -describe("a dolphin") { - describe("its click") { - context("when the dolphin is near something interesting") { - it("is emitted three times") { - // ... - } - } - } -} -``` - -## Temporarily Disabling Examples or Groups - -You can temporarily disable examples or example groups that don't pass yet. -The names of the examples will be printed out along with the test results, -but they won't be run. - -You can disable an example or group by prepending `x`: - -```swift -// Swift - -xdescribe("its click") { - // ...none of the code in this closure will be run. -} - -xcontext("when the dolphin is not near anything interesting") { - // ...none of the code in this closure will be run. -} - -xit("is only emitted once") { - // ...none of the code in this closure will be run. -} -``` - -```objc -// Objective-C - -xdescribe(@"its click", ^{ - // ...none of the code in this closure will be run. -}); - -xcontext(@"when the dolphin is not near anything interesting", ^{ - // ...none of the code in this closure will be run. -}); - -xit(@"is only emitted once", ^{ - // ...none of the code in this closure will be run. -}); -``` - -## Temporarily Running a Subset of Focused Examples - -Sometimes it helps to focus on only one or a few examples. Running one -or two examples is faster than the entire suite, after all. You can -run only one or two by using the `fit` function. You can also focus a -group of examples using `fdescribe` or `fcontext`: - -```swift -fit("is loud") { - // ...only this focused example will be run. -} - -it("has a high frequency") { - // ...this example is not focused, and will not be run. -} - -fcontext("when the dolphin is near something interesting") { - // ...examples in this group are also focused, so they'll be run. -} -``` - -```objc -fit(@"is loud", { - // ...only this focused example will be run. -}); - -it(@"has a high frequency", ^{ - // ...this example is not focused, and will not be run. -}); - -fcontext(@"when the dolphin is near something interesting", ^{ - // ...examples in this group are also focused, so they'll be run. -}); -``` - -## Global Setup/Teardown Using `beforeSuite` and `afterSuite` - -Some test setup needs to be performed before *any* examples are -run. For these cases, use `beforeSuite` and `afterSuite`. - -In the example below, a database of all the creatures in the ocean is -created before any examples are run. That database is torn down once all -the examples have finished: - -```swift -// Swift - -import Quick - -class DolphinSpec: QuickSpec { - override func spec() { - beforeSuite { - OceanDatabase.createDatabase(name: "test.db") - OceanDatabase.connectToDatabase(name: "test.db") - } - - afterSuite { - OceanDatabase.teardownDatabase(name: "test.db") - } - - describe("a dolphin") { - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickSpecBegin(DolphinSpec) - -beforeSuite(^{ - [OceanDatabase createDatabase:@"test.db"]; - [OceanDatabase connectToDatabase:@"test.db"]; -}); - -afterSuite(^{ - [OceanDatabase teardownDatabase:@"test.db"]; -}); - -describe(@"a dolphin", ^{ - // ... -}); - -QuickSpecEnd -``` - -You can specify as many `beforeSuite` and `afterSuite` as you like. All -`beforeSuite` closures will be executed before any tests run, and all -`afterSuite` closures will be executed after all the tests are finished. -There is no guarantee as to what order these closures will be executed in. - -## Accessing Metadata for the Current Example - -There may be some cases in which you'd like the know the name of the example -that is currently being run, or how many have been run so far. Quick provides -access to this metadata in `beforeEach` and `afterEach` closures. - -```swift -beforeEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) is about to be run.") -} - -afterEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) has run.") -} -``` - -```objc -beforeEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l is about to be run.", (long)exampleMetadata.exampleIndex); -}); - -afterEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l has run.", (long)exampleMetadata.exampleIndex); -}); -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/QuickInObjectiveC.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/QuickInObjectiveC.md deleted file mode 100644 index 3fb6bdc..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/QuickInObjectiveC.md +++ /dev/null @@ -1,57 +0,0 @@ -# Using Quick in Objective-C - -Quick works equally well in both Swift and Objective-C. - -There are two notes to keep in mind when using Quick in Objective-C, -however, which are described below. - -## The Optional Shorthand Syntax - -Importing Quick in an Objective-C file defines macros named `it` and -`itShouldBehaveLike`, as well as functions like `context()` and `describe()`. - -If the project you are testing also defines symbols with these names, you may -encounter confusing build failures. In that case, you can avoid namespace -collision by turning off Quick's optional "shorthand" syntax: - -```objc -#define QUICK_DISABLE_SHORT_SYNTAX 1 - -@import Quick; - -QuickSpecBegin(DolphinSpec) -// ... -QuickSpecEnd -``` - -You must define the `QUICK_DISABLE_SHORT_SYNTAX` macro *before* -importing the Quick header. - -Alternatively, you may define the macro in your test target's build configuration: - -![](http://d.twobitlabs.com/VFEamhvixX.png) - -## Your Test Target Must Include At Least One Swift File - -The Swift stdlib will not be linked into your test target, and thus -Quick will fail to execute properly, if your test target does not contain -*at least one* Swift file. - -Without at least one Swift file, your tests will exit prematurely with -the following error: - -``` -*** Test session exited(82) without checking in. Executable cannot be -loaded for some other reason, such as a problem with a library it -depends on or a code signature/entitlements mismatch. -``` - -To fix the problem, add a blank file called `SwiftSpec.swift` to your test target: - -```swift -// SwiftSpec.swift - -import Quick -``` - -> For more details on this issue, see https://github.com/Quick/Quick/issues/164. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/README.md deleted file mode 100644 index d03f633..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Documentation - -Quick helps you verify how your Swift and Objective-C programs behave. -Doing so effectively isn't just a matter of knowing how to use Quick, -however. The guides in this directory can help you write -effective tests--not just using Quick, but even XCTest or other testing -frameworks. - -Each guide covers a particular topic. If you're completely new to unit -testing, consider reading them in the order they're introduced below: - -- **[Setting Up Tests in Your Xcode Project](SettingUpYourXcodeProject.md)**: - Read this if you're having trouble using your application code from within - your test files. -- **[Effective Tests Using XCTest: Arrange, Act, and Assert](ArrangeActAssert.md)**: - Read this to learn how to write `XCTestCase` tests that will help you write - code faster and more effectively. -- **[Don't Test Code, Instead Verify Behavior](BehavioralTesting.md)**: - Read this to learn what kinds of tests speed you up, and which ones will only end up - slowing you down. -- **[Clearer Tests Using Nimble Assertions](NimbleAssertions.md)**: - Read this to learn how to use Nimble to generate better failure messages. - Better failure messages help you move faster, by spending less time figuring out why - a test failed. -- **[Organized Tests with Quick Examples and Example Groups](QuickExamplesAndGroups.md)**: - Read this to learn how Quick can help you write even more effective tests, using - *examples* and *example groups*. -- **[Testing OS X and iOS Applications](TestingApps.md)**: - Read this to learn more about testing code that uses the AppKit and UIKit frameworks. -- **[Testing with test doubles](TestUsingTestDoubles.md)**: - Read this to learn what test doubles are and how to use them. -- **[Reducing Test Boilerplate with Shared Assertions](SharedExamples.md)**: - Read this to learn how to share sets of assertions among your tests. -- **[Configuring How Quick Behaves](ConfiguringQuick.md)**: - Read this to learn how you can change how Quick behaves when running your test suite. -- **[Using Quick in Objective-C](QuickInObjectiveC.md)**: - Read this if you experience trouble using Quick in Objective-C. -- **[Installing Quick](InstallingQuick.md)**: - Read this for instructions on how to add Quick to your project, using - Git submodules, CocoaPods, Carthage, or the Swift Package Manager. -- **[Installing Quick File Templates](InstallingFileTemplates.md)**: - Read this to learn how to install file templates that make writing Quick specs faster. -- **[More Resources](MoreResources.md)**: - A list of additional resources on OS X and iOS testing. -- **[Troubleshooting](Troubleshooting.md)**: - Read this when you experience other troubles. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/SettingUpYourXcodeProject.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/SettingUpYourXcodeProject.md deleted file mode 100644 index dd49355..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/SettingUpYourXcodeProject.md +++ /dev/null @@ -1,86 +0,0 @@ -# Setting Up Tests in Your Xcode Project - -With the exception of the Command Line Tool project type, when you create a new project in Xcode 7, a unit test target is included -by default. [See specific instructions for a Command Line Tool Project](#setting-up-a-test-target-for-a-command-line-tool-project). To write unit tests, you'll need to be able to use your main -target's code from within your test target. - -## Testing Swift Code Using Swift - -In order to test code written in Swift, you'll need to do two things: - -1. Set "Defines Module" in your `.xcodeproj` to `YES`. - - * To do this in Xcode: Choose your project, then "Build Settings", then "Packaging" header, - then "Defines Module" line, then select "Yes". Note: you may have - to choose "All" (Build Settings) instead of "Basic" to see the - "Packaging" section. - -2. `@testable import YourAppModuleName` in your unit tests. This will expose Any `public` and `internal` (the default) - symbols to your tests. `private` symbols are still unavailable. - -```swift -// MyAppTests.swift - -import XCTest -@testable import MyModule - -class MyClassTests: XCTestCase { - // ... -} -``` - -> Some developers advocate adding Swift source files to your test target. -However, this leads to [subtle, hard-to-diagnose -errors](https://github.com/Quick/Quick/issues/91), and is not -recommended. - -## Testing Objective-C Code Using Swift - -1. Add a bridging header to your test target. -2. In the bridging header, import the file containing the code you'd like to test. - -```objc -// MyAppTests-BridgingHeader.h - -#import "MyClass.h" -``` - -You can now use the code from `MyClass.h` in your Swift test files. - -## Testing Swift Code Using Objective-C - -1. Bridge Swift classes and functions you'd like to test to Objective-C by - using the `@objc` attribute. -2. Import your module's Swift headers in your unit tests. - -```objc -@import XCTest; -#import "MyModule-Swift.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -## Testing Objective-C Code Using Objective-C - -Import the file defining the code you'd like to test from within your test target: - -```objc -// MyAppTests.m - -@import XCTest; -#import "MyClass.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -### Setting Up a Test Target for a Command Line Tool Project - -1. Add a target to your project in the project pane. -2. Select "OS X Unit Testing Bundle". -3. Edit the scheme of your main target. -4. Select the "Test" node, click the "+" under the "Info" heading, and select - your testing bundle. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/SharedExamples.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/SharedExamples.md deleted file mode 100644 index 3e67cb5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/SharedExamples.md +++ /dev/null @@ -1,125 +0,0 @@ -# Reducing Test Boilerplate with Shared Assertions - -In some cases, the same set of specifications apply to multiple objects. - -For example, consider a protocol called `Edible`. When a dolphin -eats something `Edible`, the dolphin becomes happy. `Mackerel` and -`Cod` are both edible. Quick allows you to easily test that a dolphin is -happy to eat either one. - -The example below defines a set of "shared examples" for "something edible", -and specifies that both mackerel and cod behave like "something edible": - -```swift -// Swift - -import Quick -import Nimble - -class EdibleSharedExamplesConfiguration: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in - it("makes dolphins happy") { - let dolphin = Dolphin(happy: false) - let edible = sharedExampleContext()["edible"] - dolphin.eat(edible) - expect(dolphin.isHappy).to(beTruthy()) - } - } - } -} - -class MackerelSpec: QuickSpec { - override func spec() { - var mackerel: Mackerel! - beforeEach { - mackerel = Mackerel() - } - - itBehavesLike("something edible") { ["edible": mackerel] } - } -} - -class CodSpec: QuickSpec { - override func spec() { - var cod: Cod! - beforeEach { - cod = Cod() - } - - itBehavesLike("something edible") { ["edible": cod] } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickConfigurationBegin(EdibleSharedExamplesConfiguration) - -+ (void)configure:(Configuration *configuration) { - sharedExamples(@"something edible", ^(QCKDSLSharedExampleContext exampleContext) { - it(@"makes dolphins happy") { - Dolphin *dolphin = [[Dolphin alloc] init]; - dolphin.happy = NO; - id edible = exampleContext()[@"edible"]; - [dolphin eat:edible]; - expect(dolphin.isHappy).to(beTruthy()) - } - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(MackerelSpec) - -__block Mackerel *mackerel = nil; -beforeEach(^{ - mackerel = [[Mackerel alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": mackerel }; }); - -QuickSpecEnd - -QuickSpecBegin(CodSpec) - -__block Mackerel *cod = nil; -beforeEach(^{ - cod = [[Cod alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": cod }; }); - -QuickSpecEnd -``` - -Shared examples can include any number of `it`, `context`, and -`describe` blocks. They save a *lot* of typing when running -the same tests against several different kinds of objects. - -In some cases, you won't need any additional context. In Swift, you can -simply use `sharedExamples` closures that take no parameters. This -might be useful when testing some sort of global state: - -```swift -// Swift - -import Quick - -sharedExamples("everything under the sea") { - // ... -} - -itBehavesLike("everything under the sea") -``` - -> In Objective-C, you'll have to pass a block that takes a - `QCKDSLSharedExampleContext`, even if you don't plan on using that - argument. Sorry, but that's the way the cookie crumbles! - :cookie: :bomb: - -You can also "focus" shared examples using the `fitBehavesLike` function. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/TestUsingTestDoubles.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/TestUsingTestDoubles.md deleted file mode 100644 index fc4f3f9..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/TestUsingTestDoubles.md +++ /dev/null @@ -1,129 +0,0 @@ -# Testing with Mocks - -## Test doubles - -Dependencies between objects can cause problems when writing tests. For example, say you have a `Car` class that depends on/uses `Tire`. - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesA.png) - -`CarTests` tests `Car`, which calls `Tire`. Now bugs in `Tire` could cause `CarTests` to fail (even though `Car` is okay). It can be hard to answer the question: "What's broken?". - -To avoid this problem, you can use a stand-in object for `Tire` in `CarTests`. In this case, we'll create a stand-in object for `Tire` called `PerfectTire`. - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesAmock.png) - -`PerfectTire` will have all of the same public functions and properties as `Tire`. However, the implementation of some or all of those functions and properties will differ. - -Objects like `PerfectTire` are called "test doubles". Test doubles are used as "stand-in objects" for testing the functionality of related objects in isolation. There are several kinds of test doubles: - -- Mock object: Used for receiving output from a test class. -- Stub object: Used for providing input to a test class. -- Fake object: Behaves similarly to the original class, but in a simplified way. - -Let's start with how to use mock objects. - -## Mock - -A mock object focuses on fully specifying the correct interaction with other objects and detecting when something goes awry. The mock object should know (in advance) the methods that should be called on it during the test and what values the mock object should return. - -Mock objects are great because you can: - -- Run tests a lot quicker. -- Run tests even if you're not connected to the Internet. -- Focus on testing classes in isolation from their dependencies. - -### Writing Tests with Mock Objects in Swift - -#### Sample app - -For example, let's create an app which retrieves data from the Internet: - -* Data from the Internet will be displayed in `ViewController`. -* A custom class will implement the `DataProviderProtocol`, which specifies methods for fetching data. - -`DataProviderProtocol` is defined as follows: - -```swift -protocol DataProviderProtocol: class { - func fetch(callback: (data: String) -> Void) -} -``` - -`fetch()` gets data from the Internet and returns it using a `callback` closure. - -Here is the `DataProvider` class, which conforms to the `DataProviderProtocol` protocol. - -```swift -class DataProvider: NSObject, DataProviderProtocol { - func fetch(callback: (data: String) -> Void) { - let url = URL(string: "http://example.com/")! - let session = URLSession(configuration: .default) - let task = session.dataTask(with: url) { - (data, resp, err) in - let string = String(data: data!, encoding: .utf8) - callback(data: string) - } - task.resume() - } -} -``` - -In our scenario, `fetch()` is called in the `viewDidLoad()` method of `ViewController`. - -```swift -class ViewController: UIViewController { - - // MARK: Properties - @IBOutlet weak var resultLabel: UILabel! - private var dataProvider: DataProviderProtocol? - - // MARK: View Controller Lifecycle - override func viewDidLoad() { - super.viewDidLoad() - - dataProvider = dataProvider ?? DataProvider() - - dataProvider?.fetch({ [unowned self] (data) -> Void in - self.resultLabel.text = data - }) - } -} -``` - -#### Testing using a Mock of `DataProviderProtocol` - -`ViewController` depends on `DataProviderProtocol`. In order to test the view controller in isolation, you can create a mock object which conforms to `DataProviderProtocol`. - -```swift -class MockDataProvider: NSObject, DataProviderProtocol { - var fetchCalled = false - func fetch(callback: (data: String) -> Void) { - fetchCalled = true - callback(data: "foobar") - } -} -``` - -The `fetchCalled` property is set to `true` when `fetch()` is called, so that the test can confirm that it was called. - -The following test verifies that when `ViewController` is loaded, the view controller calls `dataProvider.fetch()`. - -```swift -override func spec() { - describe("view controller") { - it("fetch data with data provider") { - let mockProvider = MockDataProvider() - let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as! ViewController - viewController.dataProvider = mockProvider - - expect(mockProvider.fetchCalled).to(beFalse()) - - let _ = viewController.view - - expect(mockProvider.fetchCalled).to(beTrue()) - } - } -} -``` - -If you're interested in learning more about writing tests, continue on to . diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/TestingApps.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/TestingApps.md deleted file mode 100644 index 4f5ce1d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/TestingApps.md +++ /dev/null @@ -1,179 +0,0 @@ -# Testing OS X and iOS Applications - -*[Setting Up Tests in Your Xcode Project](SettingUpYourXcodeProject.md)* -covers everything you need to know to test any Objective-C or Swift function or class. -In this section, we'll go over a few additional hints for testing -classes like `UIViewController` subclasses. - -> You can see a short lightning talk covering most of these topics - [here](https://vimeo.com/115671189#t=37m50s) (the talk begins at 37'50"). - -## Triggering `UIViewController` Lifecycle Events - -Normally, UIKit triggers lifecycle events for your view controller as it's -presented within the app. When testing a `UIViewController`, however, you'll -need to trigger these yourself. You can do so in one of three ways: - -1. Accessing `UIViewController.view`, which triggers things like `UIViewController.viewDidLoad()`. -2. Use `UIViewController.beginAppearanceTransition()` to trigger most lifecycle events. -3. Directly calling methods like `UIViewController.viewDidLoad()` or `UIViewController.viewWillAppear()`. - -```swift -// Swift - -import Quick -import Nimble -import BananaApp - -class BananaViewControllerSpec: QuickSpec { - override func spec() { - var viewController: BananaViewController! - beforeEach { - viewController = BananaViewController() - } - - describe(".viewDidLoad()") { - beforeEach { - // Method #1: Access the view to trigger BananaViewController.viewDidLoad(). - let _ = viewController.view - } - - it("sets the banana count label to zero") { - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal("0")) - } - } - - describe("the view") { - beforeEach { - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - viewController.beginAppearanceTransition(true, animated: false) - viewController.endAppearanceTransition() - } - // ... - } - - describe(".viewWillDisappear()") { - beforeEach { - // Method #3: Directly call the lifecycle event. - viewController.viewWillDisappear(false) - } - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; -#import "BananaViewController.h" - -QuickSpecBegin(BananaViewControllerSpec) - -__block BananaViewController *viewController = nil; -beforeEach(^{ - viewController = [[BananaViewController alloc] init]; -}); - -describe(@"-viewDidLoad", ^{ - beforeEach(^{ - // Method #1: Access the view to trigger -[BananaViewController viewDidLoad]. - [viewController view]; - }); - - it(@"sets the banana count label to zero", ^{ - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal(@"0")) - }); -}); - -describe(@"the view", ^{ - beforeEach(^{ - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - [viewController beginAppearanceTransition:YES animated:NO]; - [viewController endAppearanceTransition]; - }); - // ... -}); - -describe(@"-viewWillDisappear", ^{ - beforeEach(^{ - // Method #3: Directly call the lifecycle event. - [viewController viewWillDisappear:NO]; - }); - // ... -}); - -QuickSpecEnd -``` - -## Initializing View Controllers Defined in Storyboards - -To initialize view controllers defined in a storyboard, you'll need to assign -a **Storyboard ID** to the view controller: - -![](http://f.cl.ly/items/2X2G381K1h1l2B2Q0g3L/Screen%20Shot%202015-02-27%20at%2011.58.06%20AM.png) - -Once you've done so, you can instantiate the view controller from within your tests: - -```swift -// Swift - -var viewController: BananaViewController! -beforeEach { - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - let storyboard = UIStoryboard(name: "Main", bundle: nil) - // 2. Use the storyboard to instantiate the view controller. - viewController = - storyboard.instantiateViewControllerWithIdentifier( - "BananaViewControllerID") as! BananaViewController -} -``` - -```objc -// Objective-C - -__block BananaViewController *viewController = nil; -beforeEach(^{ - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; - // 2. Use the storyboard to instantiate the view controller. - viewController = [storyboard instantiateViewControllerWithIdentifier:@"BananaViewControllerID"]; -}); -``` - -## Triggering UIControl Events Like Button Taps - -Buttons and other UIKit classes inherit from `UIControl`, which defines methods -that allow us to send control events, like button taps, programmatically. -To test behavior that occurs when a button is tapped, you can write: - -```swift -// Swift - -describe("the 'more bananas' button") { - it("increments the banana count label when tapped") { - viewController.moreButton.sendActionsForControlEvents( - UIControlEvents.TouchUpInside) - expect(viewController.bananaCountLabel.text).to(equal("1")) - } -} -``` - -```objc -// Objective-C - -describe(@"the 'more bananas' button", ^{ - it(@"increments the banana count label when tapped", ^{ - [viewController.moreButton sendActionsForControlEvents:UIControlEventTouchUpInside]; - expect(viewController.bananaCountLabel.text).to(equal(@"1")); - }); -}); -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/Troubleshooting.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/Troubleshooting.md deleted file mode 100644 index c39403c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/en-us/Troubleshooting.md +++ /dev/null @@ -1,9 +0,0 @@ -# Common Installation Issues - -Here are solutions to common issues that come up when using the framework. - -## No such module 'Quick' - -- If you have already run `pod install`, close and reopen the Xcode workspace. If this does not fix the issue, continue below. -- Delete the _entire_ `~/Library/Developer/Xcode/DerivedData` direction, which includes `ModuleCache`. -- Explicitly build (`Cmd+B`) the `Quick`, `Nimble`, and `Pods-ProjectNameTests` targets after enabled their schemes from the Manage Schemes dialog. \ No newline at end of file diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/ArrangeActAssert.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/ArrangeActAssert.md deleted file mode 100644 index 2f0a138..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/ArrangeActAssert.md +++ /dev/null @@ -1,212 +0,0 @@ -# Effective Tests Using XCTest: Arrange, Act, and Assert - -XCTest や Quick に限らず、テストフレームワークを使用する際、このパターンに従うことで効率的なユニットテストを書くことができます。 - -1. Arrange(環境構築) -2. Act(実行) -3. Assert(動作確認) - -## パターンに従ってテストを書く - -例として Banana クラスを用意します。 - -```swift -// Banana/Banana.swift - -/** A delicious banana. Tastes better if you peel it first. */ -public class Banana { - private var isPeeled = false - - /** Peels the banana. */ - public func peel() { - isPeeled = true - } - - /** You shouldn't eat a banana unless it's been peeled. */ - public var isEdible: Bool { - return isPeeled - } -} -``` - -ここでは `Banana.peel()` のテストをしてみましょう。このメソッドの期待する振る舞いはこのようになります。 - -```swift -// BananaTests/BananaTests.swift - -class BananaTests: XCTestCase { - func testPeel() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) - } -} -``` - -## 簡潔なテスト名を用いる - -この `testPeel()` テストのおかげで `Banana.peel()` が正しく動作しない場合、すぐ気付くことができます。 -我々のアプリケーションコードを変更することで正しく動作しないケース(テストが失敗するケース)はしばしば起こります。 -テストが失敗する場合は下記どちらかのケースになります。 - -1. 間違えてアプリケーションコードを壊してしまっているため、直す必要がある -2. アプリケーションコードは期待したとおりに動いているが、もともと期待した機能が変わっているためテストコードを直す必要がある - -もしテストが失敗した場合、どちらのケースに当てはまる判断する必要が出てきます。そのためテスト名が分かりやすいことが重要になります。 - -良いテスト名とは、 - -1. 何をテストしているか明確であること -2. どのような時にテストがパスするか・失敗するか明確であること - -例に挙げた `testPeel()` は良いテスト名でしょうか?分かりやすくしてみましょう。 - -```diff -// BananaTests.swift - --func testPeel() { -+func testPeel_makesTheBananaEdible() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) -} -``` - -新しいテスト名は、 - -1. 何をテストしているか明確である: `testPeel` は `Banana.peel()` メソッドをテストしてることを示す。 -2. どのような時にテストがパスするか明確である: `makesTheBananaEdible` はバナナが食べられるか(edible)どうかをテストしていることを示す。 - -## テスト時の条件 - -人々がバナナを欲しい時、`offer()` というメソッドを使います。 - -```swift -// Banana/Offer.swift - -/** Given a banana, returns a string that can be used to offer someone the banana. */ -public func offer(banana: Banana) -> String { - if banana.isEdible { - return "Hey, want a banana?" - } else { - return "Hey, want me to peel this banana for you?" - } -} -``` - -私達のアプリケーションコードは2つのうちどちらかを実行します: - -1. 食べられる(すでに皮がむかれている)バナナを注文するか -2. まだ食べられない(すでに皮がむかれている)バナナを注文するか - -両方のケースをテストしてみましょう。 - -```swift -// BananaTests/OfferTests.swift - -class OfferTests: XCTestCase { - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { - // Arrange: Create a banana and peel it. - let banana = Banana() - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { - // Arrange: Create a banana. - let banana = Banana() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -私達のテスト名は'どのような条件でテストをパスするか'を明確に表しています。 -`whenTheBananaIsPeeled`, `offer()` のケースでは `offersTheBanana` となるべきです。またバナナの皮がむかれていない場合は? -ここでは両方共テストしています。 - -ここで大事なことはアプリケーションコード内の各`if`文に対してそれぞれ1つのテストを持っていることです。 -これはテストを書く際の重要なアプローチです。このアプローチでは全ての条件(if文)に関してテストされていることを保証します。 -テストのうちどれか1つがでも失敗するようになったらコードの見直しをする必要があります。テスト名が分かりやすいとすぐにチェックすべき箇所が分かります。 - -## `XCTestCase.setUp()`を用いて簡潔に環境構築をする - -`OfferTests` の2つのテストのどちらにも同じ"環境構築"のコードが入っています。 -どちらのテストでも banana を作っています。このコードは一箇所にまとめるべきです。なぜでしょう? - -1. そのままにしておく場合、もし `Banana` の生成方法が変わったら, 私たちは全てのテストを修正しないといけなくなります。 -2. テストコードが短くなり、テストの可読性が向上します。 - -Banana の生成方法を `XCTestCase.setUp()` の中に移しましょう。`XCTestCase.setUp()` は各テストの実行前に一度呼び出されます。 - -```diff -// OfferTests.swift - -class OfferTests: XCTestCase { -+ var banana: Banana! -+ -+ override func setUp() { -+ super.setUp() -+ banana = Banana() -+ } -+ - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { -- // Arrange: Create a banana and peel it. -- let banana = Banana() -+ // Arrange: Peel the banana. - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { -- // Arrange: Create a banana. -- let banana = Banana() -- - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -## 複数のテストにまたがって環境構築を共有する - -もし複数のテストにまたがって同じ環境構築のコードを使っている部分があれば、 test target 内に'ヘルパー関数'を定義しましょう。 - -```swift -// BananaTests/BananaHelpers.swift - -internal func createNewPeeledBanana() -> Banana { - let banana = Banana() - banana.peel() - return banana -} -``` - -> 共通操作を定義するのに関数を使いましょう。関数は継承できず、状態を保持することができません。継承や状態を持たせる場合、テストの可読性が落ちてしまいます。 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/BehavioralTesting.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/BehavioralTesting.md deleted file mode 100644 index af78e50..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/BehavioralTesting.md +++ /dev/null @@ -1,81 +0,0 @@ -# コードをテストせず、動作を確認する - -テストはアプリケーションが**期待と異なる動作** をした時のみ失敗するようにすべきです。 -アプリケーションコードが *何を* したかをテストすべきで、*どのように* したかをテストすべきではありません。 - -- アプリケーションが *何を* したかを確認するテストは **動作テスト(behavioral tests)** といいます。 -- アプリケーションの動作が変わっていなくても、コードを変更すると失敗するようになるテストは **脆弱なテスト(brittle tests)** といいます。 - -ここで `GorillaDB` というバナナのデータベースを用意します。 -`GorillaDB`は Key-Value 型のデータベースでバナナを保存することができます。 - -```swift -let database = GorillaDB() -let banana = Banana() -database.save(banana: banana, key: "my-banana") -``` - -そしてバナナをディスクから取り出すことができます。 - -```swift -let banana = database.load(key: "my-banana") -``` - -## 脆弱なテスト(Brittle Tests) - -どのようにして動作をテストするのでしょう?一つの方法としてここではバナナを保存した後にバナナのデータベースのサイズをチェックします。 - -```swift -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() - let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - - // Assert: The size of the database should have increased by one. - XCTAssertEqual(database.size, originalSize + 1) -} -``` - -ここで `GorillaDB` のソースコードを変更したとします。データベースからの読み出しを速くするためにもっとも頻繁に使用するバナナをキャッシュに保持するようにします。 -`GorillaDB.size` はキャッシュのサイズに合わせて大きくなります。この場合ディスクに保存しなくなるため上記のテストは失敗します。 - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/Screenshot_database_size_fail.png) - -## 動作テスト(Behavioral Tests) - -動作のテストの重要なポイントは アプリケーションコードに期待する動作を明確にすることです。 - -`testSave_savesTheBananaToTheDatabase` というテストで期待する動作は バナナをデータベースに "保存する" ことでしょうか? -"保存する"というのは 後から読み出すことができる、という意味です。そのためデータベースのサイズが大きくなることをテストするのではなく、 -バナナを読み出すことができるかをテストすべきです。 - - -```diff -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() -- let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - -- // Assert: The size of the database should have increased by one. -- XCTAssertEqual(database.size, originalSize + 1) -+ // Assert: The bananas saved to and loaded from the database should be the same. -+ XCTAssertEqual(database.load(key: "test-banana"), banana) -} -``` - -動作テストを書く際の重要なポイント: - -- アプリケーションコードが何をすべきか明確にしているか? -- テストが *動作のみ* をテストしているか?コードの動作が他の要因で意図しない動きにならないか。 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/ConfiguringQuick.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/ConfiguringQuick.md deleted file mode 100644 index 4226564..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/ConfiguringQuick.md +++ /dev/null @@ -1,101 +0,0 @@ -# Quickの挙動をカスタマイズしましょう - -`QuickConfiguration` を継承したクラスを作成し、`QuickConfiguration.Type.configure()` をオーバーライドすることで Quick の挙動をカスラマイズすることができます。 - -```swift -// Swift - -import Quick - -class ProjectDataTestConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - // ...set options on the configuration object here. - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(ProjectDataTestConfiguration) - -+ (void)configure:(Configuration *configuration) { - // ...set options on the configuration object here. -} - -QuickConfigurationEnd -``` - -一つのプロジェクトで複数の configuration を持つこともできますが -どの順に configuration が実行されるか保証されません。 - -## テスト全体で使う `beforeEach` と `afterEach` を追加する - -`QuickConfiguration.beforeEach` と `QuickConfiguration.afterEach` を使うと -テストスイート内の各テストの実行前・実行後に走らせる処理を記述することができます。 - -```swift -// Swift - -import Quick -import Sea - -class FinConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { - Dorsal.sharedFin().height = 0 - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -#import "Dorsal.h" - -QuickConfigurationBegin(FinConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEach:^{ - [Dorsal sharedFin].height = 0; - }]; -} - -QuickConfigurationEnd -``` - -さらに現在実行中のテストに関するメタデータを取得することもできます。 - -```swift -// Swift - -import Quick - -class SeaConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { exampleMetadata in - // ...use the example metadata object to access the current example name, and more. - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(SeaConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEachWithMetadata:^(ExampleMetadata *data) { - // ...use the example metadata object to access the current example name, and more. - }]; -} - -QuickConfigurationEnd -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/InstallingFileTemplates.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/InstallingFileTemplates.md deleted file mode 100644 index 1c87e52..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/InstallingFileTemplates.md +++ /dev/null @@ -1,26 +0,0 @@ -# Quickファイル・テンプレートのインストール方法 - -Quick のリポジトリには Swift, Objective-C の両方で使用できるテンプレートが含まれています。 - -## Alcatraz - -Quick のテンプレートは Xcode のパッケージマネージャーの [Alcatraz](https://github.com/supermarin/Alcatraz) 経由でインストールできます。 -パッケージマネージャーから検索してみてください。 - -![](http://f.cl.ly/items/3T3q0G1j0b2t1V0M0T04/Screen%20Shot%202014-06-27%20at%202.01.10%20PM.png) - -## Rakefile から手動でインストールする - -手動でインストールすることもできます。 -リポジトリを clone して rake task の `templates:install` を実行してください。 - -```sh -$ git clone git@github.com:Quick/Quick.git -$ rake templates:install -``` - -アンインストールも簡単です、下記コマンドを実行してください。 - -```sh -$ rake templates:uninstall -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md deleted file mode 100644 index 884b8a5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md +++ /dev/null @@ -1,152 +0,0 @@ -# Quickのインストール方法 - -> **もし Xcode 7.1 を使用していたら** 現時点で最新バージョンの Quick--`v0.9.0` を使用してください -> 最新のリリースは `swift-2.0` branch で開発されています。 - -Quick は examples(テスト) and example groups(テストグループ)の文法を提供します。 -Nimble は `expect(...).to` の文法を提供します。 -テストでは両方を使ってもいいですし、どちらか片方を使う、ということもできます。 - -Quick をテストに組み込むには3つの方法があります。 - -1. [Git Submodules](#git-submodules) -2. [CocoaPods](#cocoapods) -3. [Carthage](#carthage) - -下記のインストール手順の中からどれか選択してインストールを進めてください。 -インストール完了後、テストターゲット内のファイルで Quick を使用(`import Quick`)できるようになります。 - -## Git Submodules - -Git submodules を使って Quick と Nimble をリンクします。手順の流れとしては下記の通りです。 - -1. Quick を submodule として追加. -2. プロジェクトで`.xcworkspace`を使っていなければ作成してください。 ([こちらを参照](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) -3. `Quick.xcodeproj` をプロジェクトの`.xcworkspace`に追加してください。 -4. `Nimble.xcodeproj` をプロジェクトの`.xcworkspace`に追加してください。 `Nimble.xcodeproj` は `path/to/Quick/Externals/Nimble` にあります。 Quick が依存している Niimble を追加することで Quick のバージョンと Nimble のバージョンを合わせられます。 - -5. `Quick.framework` と `Nimble.framework` を BuildPhase の "Link Binary with Libraries" でリンクします。 - -もしまだ git submodules 用のディレクトリを作っていなかったら、まず始めにディレクトリを作成します。 -`Vendor` という名前のディレクトリを用意しましょう。 - -**Step 1:** Quick と Nimble を Git submodules としてダウンロードする - -```sh -git submodule add git@github.com:Quick/Quick.git Vendor/Quick -git submodule add git@github.com:Quick/Nimble.git Vendor/Nimble -git submodule update --init --recursive -``` - -**Step 2:** `Quick.xcodeproj` と `Nimble.xcodeproj` をプロジェクトの `.xcworkspace` に追加してください。 -例として `Guanaco.xcworkspace` という workspace に Quick と Nimble を追加します。 - -![](http://f.cl.ly/items/2b2R0e1h09003u2f0Z3U/Screen%20Shot%202015-02-27%20at%202.19.37%20PM.png) - -**Step 3:** build phase の `Link Binary with Libraries` に `Quick.framework` を追加してください。 -2種類の `Quick.frameworks` が表示されますが 1 つは OS X 用で、もう 1 つが iOS 用です。 - -![](http://cl.ly/image/2L0G0H1a173C/Screen%20Shot%202014-06-08%20at%204.27.48%20AM.png) - -`Nimble.framework` も同様に追加してください。これで完了です! - -**Submodules をアップデートする:** Quick と Nimble を最新バージョンにアップデートしたい場合は Quick ディレクトリに入って master リポジトリから pull してください。 - -```sh -cd /path/to/your/project/Vendor/Quick -git checkout master -git pull --rebase origin master -``` - -あなたのプロジェクトの Git リポジトリは submodule の変更もトラッキングしているので Quick submodules の更新を commit しておきます。 - -```sh -cd /path/to/your/project -git commit -m "Updated Quick submodule" -``` - -**Quick Submodule を含んだ リポジトリを git clone する:** 他の開発者があなたのリポジトリを clone したあと、submodules を同様に pull してくる必要があります。`git submodule update` コマンドを実行することで pull できます。 - -```sh -git submodule update --init --recursive -``` - -git submodules に詳細な情報は[こちら](http://git-scm.com/book/en/Git-Tools-Submodules)です。 - -## CocoaPods - -CocoaPods でインストールする場合、バージョンは 0.36.0 以降である必要(CocoaPods が Swift をサポートしているバージョン)があります。 - -Podfile に Quick と Nimble を追加して下さい。 Swift では ```use_frameworks!``` も必要です。 - -```rb - -# Podfile - -use_frameworks! - -def testing_pods - pod 'Quick', '~> 0.9.0' - pod 'Nimble', '3.0.0' -end - -target 'MyTests' do - testing_pods -end - -target 'MyUITests' do - testing_pods -end -``` - -その後 pod install でダウンロード、リンクします。 - -```sh -pod install -``` - -### Swift 1.2 で使う - -Quick の最新版(0.4.0)は Swift 2 (Xcode 7) 用ですが、Nimble の最新版(1.0.0) は Swift 1.2 (Xcode 6) 用です。 - -もし Xcode6 で使いたい場合は下記のようにバージョン指定してください。 - -```sh -target 'MyTests' do - use_frameworks! - pod 'Quick', '~>0.3.0' - pod 'Nimble', '~>1.0.0' -end -``` - -## [Carthage](https://github.com/Carthage/Carthage) - -テストターゲットは "Embedded Binaries" section がないので framework はターゲットの "Link Binary With Libraries" に追加する必要があります。 build phase の "Copy Files" も同様にターゲットの framework destination を指定して下さい。 - - > Carthage は dynamic frameworks をビルドするので code signing identity に有効なものを設定しておく必要があります。 - -1. Quick を [`Cartfile.private`](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfileprivate) に追加してください。 - - ``` - github "Quick/Quick" - github "Quick/Nimble" - ``` - -2. `carthage update` を実行してください。 -3. `Carthage/Build/[platform]/` ディレクトリから Quick と Nimble をテストターゲットの "Link Binary With Libraries" に追加してください。 - ![](http://i.imgur.com/pBkDDk5.png) - -4. テストターゲットの build phase で "New Copy Files Phase" を選択してください。 - ![](http://i.imgur.com/jZATIjQ.png) - -5. "Destination" を "Frameworks" に設定して、2つの framework を追加してください。 - ![](http://i.imgur.com/rpnyWGH.png) - -Carthage の dependency の管理方法はこの方法だけではありません。 -詳細な情報はこちらを参照してください [Carthage documentation](https://github.com/Carthage/Carthage/blob/master/README.md) 。 - -### (非推奨) 実機で Quick のテストを走らせる - -Quick で書かれたテストを実機で走らせるためには `Quick.framework` と `Nimble.framework` を `Embedded Binaries` としてテストターゲットの `ホストアプリケーション` に追加されます。 Embedded binary として framework を追加すると Xcode が自動的にホストアプリケーションにリンクしてしまいます。 - -![](http://indiedev.kapsi.fi/images/embed-in-host.png) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/MoreResources.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/MoreResources.md deleted file mode 100644 index 996f2df..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/MoreResources.md +++ /dev/null @@ -1,27 +0,0 @@ -# その他の参考資料 - -## Quick のテストのサンプル - -Quick は[GitHub](https://github.com/github)や[ReactiveCocoa](https://github.com/ReactiveCocoa)を含む多くの企業、OSS プロジェクト、個人で利用されています。 - -下記リポジトリを参考にしてみてください。 - -- https://github.com/ReactiveCocoa/ReactiveCocoa -- https://github.com/github/Archimedes -- https://github.com/libgit2/objective-git -- https://github.com/jspahrsummers/RXSwift -- https://github.com/artsy/eidolon -- https://github.com/Moya/Moya -- https://github.com/nerdyc/Squeal -- https://github.com/pepibumur/SugarRecord - -## OS X と iOS Apps のテストに関する参考資料 - -- **[Quality Coding](http://qualitycoding.org/)**: - ユニットテストにフォーカスした iOS 開発に関するブログ。 -- **[OCMock Tutorials](http://ocmock.org/support/)**: - テストでモックが必要な時に使用する OCMock のチュートリアル。 -- **[Nocilla: Stunning HTTP stubbing for iOS and Mac OS X](https://github.com/luisobo/Nocilla)**: - 通信を行うコードをテストする時はこのライブラリを使用して下さい。 -- **[Pivotal Labs: Writing Beautiful Specs with Jasmine Custom Matchers](http://pivotallabs.com/writing-beautiful-specs-jasmine-custom-matchers/)**: - Nimble の matcher の書き方に関するドキュメントはこちら([the Nimble documentation](https://github.com/Quick/Nimble)) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/NimbleAssertions.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/NimbleAssertions.md deleted file mode 100644 index 8534a71..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/NimbleAssertions.md +++ /dev/null @@ -1,100 +0,0 @@ -# Nimble Assertions を使ってテストをより簡潔に - -テストが期待した通りに動作しない時、ユニットテストは **何が問題か** を明確にすべきです。 - -次の関数はサルの集団から馬鹿なサルだけを取得します。 - -```swift -public func silliest(monkeys: [Monkey]) -> [Monkey] { - return monkeys.filter { $0.silliness == .VerySilly } -} -``` - -ここでこの関数に対するテストを書いてみましょう。 - -```swift -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) - XCTAssertTrue(contains(sillyMonkeys, kiki)) -} -``` - -このテストは下記のメッセージとともに失敗します。 - -``` -XCTAssertTrue failed -``` - -![](http://f.cl.ly/items/1G17453p47090y30203d/Screen%20Shot%202015-02-26%20at%209.08.27%20AM.png) - -失敗した時は多くの情報を残すことが望ましいです。このメッセージのままではよく分かりません。 -true や false だけではそれがなにか分かりません。このままではテストコードから原因を見つけるまでに時間がかかってしまいます。 - -## 良い失敗メッセージを残す: Part 1: XCTAssert に手動でメッセージを渡す - -`XCTAssert` は失敗時にメッセージを指定することができます。 - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki)) -+ XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -} -``` - -しかし`XCTAssert`では自分でメッセージを指定しないといけません。 - -## 良い失敗メッセージを残す: Part 2: Nimble Failure Messages を使う - -Nimble は Assert, 失敗時のメッセージを読みやすくしてくれます。 - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -+ expect(sillyMonkeys).to(contain(kiki)) -} -``` - -Nimble では自分でメッセージを指定しなくても Nimble がとても読みやすいメッセージを返してくれます。 - -``` -expected to contain , - got <[Monkey(name: Jane, silliness: VerySilly)]> -``` - -![](http://f.cl.ly/items/3N2e3g2K3W123b1L1J0G/Screen%20Shot%202015-02-26%20at%2011.27.02%20AM.png) - -失敗メッセージは何が問題かを明確にします:ここでは `kiki` が `silliest()` の戻り値に含まれることを期待していますが -このテストでは `jane` しか含まれていません。Nimble からのメッセージで何が問題かが分かりやすく伝えられるので、簡単に直すことができます。 - -```diff -public func silliest(monkeys: [Monkey]) -> [Monkey] { -- return monkeys.filter { $0.silliness == .VerySilly } -+ return monkeys.filter { $0.silliness == .VerySilly || $0.silliness == .ExtremelySilly } -} -``` - -Nimble は具体的な失敗メッセージを返してくれる多くの種類の Assertion を提供します。 -`XCTAssert` と違って毎回自分でメッセージを指定することはありません。 - -Nimble の全ての assertion はこちらで確認できます: [Nimble README](https://github.com/Quick/Nimble) 。 -下記に幾つかの例を示します。 - -```swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/QuickExamplesAndGroups.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/QuickExamplesAndGroups.md deleted file mode 100644 index 2ddad20..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/QuickExamplesAndGroups.md +++ /dev/null @@ -1,477 +0,0 @@ -# QuickのExamplesとExample Groupsで、たくさんのテストでも整理整頓 - -Quick では **examples** と **example groups** という特別な文法があります。 - -*[XCTestで役に立つテストを書く方法:Arrange(環境構築), Act(実行), and Assert(動作確認)](ArrangeActAssert.md)* では, -良いテスト名をつけることがとても重要だということを学びました。 -テストが失敗した時、テスト名はアプリケーションコードを直すべきかテストを修正すべきかを判断する際の重要な材料になります。 - -Quick の examples(テスト) と example groups(テストグループ) は二つの役に立ちます。 - -1. 記述的なテスト名を書くためことをサポートします -2. テスト中の "環境構築" 部分におけるコードを簡略化します - -## Examples の `it` - -Examples は `it` という「コードがどのように動作すべきかを宣言する」関数を持ちます。 -これは XCTest の test methods のようなものです。 - -`it` 関数は2つのパラメータ、example の名前と closure です。 -下記のテストでは `Sea.Dolphin` クラスがどのように動作すべきかを記述しています。 -この example では「新しく生成された Dolphin は smart で friendly であるべき」と書いています。 - -```swift -// Swift - -import Quick -import Nimble -import Sea - -class DolphinSpec: QuickSpec { - override func spec() { - it("is friendly") { - expect(Dolphin().isFriendly).to(beTruthy()) - } - - it("is smart") { - expect(Dolphin().isSmart).to(beTruthy()) - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -it(@"is friendly", ^{ - expect(@([[Dolphin new] isFriendly])).to(beTruthy()); -}); - -it(@"is smart", ^{ - expect(@([[Dolphin new] isSmart])).to(beTruthy()); -}); - -QuickSpecEnd -``` - -Examples が何をテストしているかを明確にするために Description を使います。 -Description は文字数制限がなくどの文字でも(絵文字さえも!)使うことができます。 -:v: :sunglasses: - -## Example Groups の `describe` と `context` - -Example groups では Example のグルーピングができ、 setup と teardown のコードを共有できます。 - -### `describe` を使ってクラスと関数について記述する - -`Dolphin` クラスの `click` 関数の動作を記述する際に、 -言い換えると関数が動作していることをテストする際に、 -複数の `it` example を `describe` を用いてグルーピングすることができます。 -似ている examples をまとめることで可読性が向上します。 - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - describe("its click") { - it("is loud") { - let click = Dolphin().click() - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - let click = Dolphin().click() - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - describe(@"its click", ^{ - it(@"is loud", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -Xcode でこれらの examples を実行すると`describe` と `it` の記述内容も表示されます。上記のテストの場合、下記のような出力になります。 - -1. `DolphinSpec.a_dolphin_its_click_is_loud` -2. `DolphinSpec.a_dolphin_its_click_has_a_high_frequency` - -それぞれの Example が何をテストしているかが明確ですね。 - -### `beforeEach` と `afterEach` を使って Setup/Teardown のコードを共有する - -Example groups はテストの内容をただ分かりやすくするだけでなく同一グループ内のsetup/teardownコードを共有することができます。 - -下記の例では`its click`の Example group のテストを実行する前に `beforeEach`を使って新しい Dolphin のインスタンスを生成しています。 -各 Example において "新しい" 状態でテストが行えます。 - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { - dolphin = Dolphin() - } - - describe("its click") { - var click: Click! - beforeEach { - click = dolphin.click() - } - - it("is loud") { - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ - dolphin = [Dolphin new]; - }); - - describe(@"its click", ^{ - __block Click *click = nil; - beforeEach(^{ - click = [dolphin click]; - }); - - it(@"is loud", ^{ - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -この例では setup を共有することはあまりメリットがないように見えるかもしれませんが -複数の複雑なオブジェクトを生成する時などコード量を節約することができます。 - -それぞれの Example を実行した後に実行したいコードについては`afterEach`を使います。 - -### `context` を使ってある条件での動作を記述する - -例の Dolphins(イルカ達) はエコーロケーションのために カチッと音を立てます(`click` 関数を呼び出します)。 -イルカ達は特に興味のあるものに近づく時、それが何かを調べるために連続してエコーロケーション(`click` 関数を呼び出します)を行います。 - -このシナリオにおいてテストが 異なる状況において `click` 関数の動作は異なる ということを表す必要があります。 - -基本的にイルカは一度音を鳴らすだけですが、イルカ達が興味があるものが近くにあると連続して音を鳴らします。 - -この状況について `context` 関数を使って表します。ある `context` では通常のケースで、もう一方の`context`ではイルカが興味あるものに近づいているケースです。 - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { dolphin = Dolphin() } - - describe("its click") { - context("when the dolphin is not near anything interesting") { - it("is only emitted once") { - expect(dolphin!.click().count).to(equal(1)) - } - } - - context("when the dolphin is near something interesting") { - beforeEach { - let ship = SunkenShip() - Jamaica.dolphinCove.add(ship) - Jamaica.dolphinCove.add(dolphin) - } - - it("is emitted three times") { - expect(dolphin.click().count).to(equal(3)) - } - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ dolphin = [Dolphin new]; }); - - describe(@"its click", ^{ - context(@"when the dolphin is not near anything interesting", ^{ - it(@"is only emitted once", ^{ - expect(@([[dolphin click] count])).to(equal(@1)); - }); - }); - - context(@"when the dolphin is near something interesting", ^{ - beforeEach(^{ - [[Jamaica dolphinCove] add:[SunkenShip new]]; - [[Jamaica dolphinCove] add:dolphin]; - }); - - it(@"is emitted three times", ^{ - expect(@([[dolphin click] count])).to(equal(@3)); - }); - }); - }); -}); - -QuickSpecEnd -``` - -厳密には `context` キーワードは `describe`と同じですがテストを理解しやすくなるので使い分けるとよいです。 - -### テストの可読性: Quick と XCTest - -*[XCTestで役に立つテストを書く方法:Arrange(環境構築), Act(実行), and Assert(動作確認)](ArrangeActAssert.md)*で各条件についてそれぞれテストを用意するのがテストを書く際の重要な方法と述べましたが -このアプローチで XCTest でテストを書くとテスト名が長くなってしまいます。 - -```swift -func testDolphin_click_whenTheDolphinIsNearSomethingInteresting_isEmittedThreeTimes() { - // ... -} -``` - -Quick を使うと条件について読みやすく、しかもそれぞれの Example group について環境構築が効率的に行えます。 - -```swift -describe("a dolphin") { - describe("its click") { - context("when the dolphin is near something interesting") { - it("is emitted three times") { - // ... - } - } - } -} -``` - -## 一時的に Examples や Example Groups を無効にする - -通っていない Example を一時的に無効にすることもできます。 -Example や Example Groups の先頭に `x` をつけると無効になります。 -Examples の名前がテスト結果の中に出力されますがテストは実行されなくなります。 - - -```swift -// Swift - -xdescribe("its click") { - // ...none of the code in this closure will be run. -} - -xcontext("when the dolphin is not near anything interesting") { - // ...none of the code in this closure will be run. -} - -xit("is only emitted once") { - // ...none of the code in this closure will be run. -} -``` - -```objc -// Objective-C - -xdescribe(@"its click", ^{ - // ...none of the code in this closure will be run. -}); - -xcontext(@"when the dolphin is not near anything interesting", ^{ - // ...none of the code in this closure will be run. -}); - -xit(@"is only emitted once", ^{ - // ...none of the code in this closure will be run. -}); -``` - -## 指定した Examples だけ一時的に実行する - -一部の Example だけ実行できると便利なこともあります。 -そのような時は実行したい Example を `fit` 関数を用いて指定します。 -特定の Example group だけ実行したい時は`fdescribe` か `fcontext` を記述します。 -※もともと書いてあるテストコードの先頭に `f` を追記するだけです。 - -```swift -fit("is loud") { - // ...only this focused example will be run. -} - -it("has a high frequency") { - // ...this example is not focused, and will not be run. -} - -fcontext("when the dolphin is near something interesting") { - // ...examples in this group are also focused, so they'll be run. -} -``` - -```objc -fit(@"is loud", { - // ...only this focused example will be run. -}); - -it(@"has a high frequency", ^{ - // ...this example is not focused, and will not be run. -}); - -fcontext(@"when the dolphin is near something interesting", ^{ - // ...examples in this group are also focused, so they'll be run. -}); -``` - -## `beforeSuite` と `afterSuite` を使ってテスト全体に対する Setup/Teardown を行う - -テストの環境構築の中にはどの Example よりも先に、または最後に実行したいものがある場合もあります。 -このような時は `beforeSuite` か `afterSuite` を使います。 - -下記の例では 全ての Example が実行される前に一度だけ海の全ての生物のデータベースが生成され、全ての Exmample が実行された後にデータベースを削除しています。 - -```swift -// Swift - -import Quick - -class DolphinSpec: QuickSpec { - override func spec() { - beforeSuite { - OceanDatabase.createDatabase(name: "test.db") - OceanDatabase.connectToDatabase(name: "test.db") - } - - afterSuite { - OceanDatabase.teardownDatabase(name: "test.db") - } - - describe("a dolphin") { - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickSpecBegin(DolphinSpec) - -beforeSuite(^{ - [OceanDatabase createDatabase:@"test.db"]; - [OceanDatabase connectToDatabase:@"test.db"]; -}); - -afterSuite(^{ - [OceanDatabase teardownDatabase:@"test.db"]; -}); - -describe(@"a dolphin", ^{ - // ... -}); - -QuickSpecEnd -``` - -`beforeSuite` and `afterSuite` は必要な数だけ定義することができます。 -全ての `beforeSuite` の closure は全てのテストが実行される前に実行され、 -全ての `afterSuite` の closure は全てのテストが実行された後に実行されます。 - -複数の `beforeSuite`(`afterSuite`) の closure を記述した場合、これらの実行順序は記述した順序で実行されるかは保証されません。 - -## 実行中の Example でメタデータにアクセスする - -実行中の Example の中で、Example名を知りたいケース、これまでに何件の Example を実行したかを知りたいケースがあるかもしれません。 -Quick ではこれらの情報に `beforeEach` と `afterEach` の closure の中からアクセスすることができます。 - -```swift -beforeEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) is about to be run.") -} - -afterEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) has run.") -} -``` - -```objc -beforeEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l is about to be run.", (long)exampleMetadata.exampleIndex); -}); - -afterEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l has run.", (long)exampleMetadata.exampleIndex); -}); -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/QuickInObjectiveC.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/QuickInObjectiveC.md deleted file mode 100644 index 6d67044..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/QuickInObjectiveC.md +++ /dev/null @@ -1,48 +0,0 @@ -# Objective-C で Quick を使う - -Quick は Swift でも Objective-C でも問題なく動作します。 - -ですが、Objective-C で Quick を使う場合、2点気を付けておきべきことがあります。 - -## 簡略記法 - -Objective-C で Quick を import すると `it` と `itShouldBehaveLike` というマクロが定義されます。 -また、`context()` and `describe()`といった関数も同様に定義されます。 - -もしプロジェクトですでに同じ名前のシンボルを定義していた場合、重複のためビルドエラーになります。 -その場合は下記のように`QUICK_DISABLE_SHORT_SYNTAX`を定義してこの機能を無効にしてください。 - -```objc -#define QUICK_DISABLE_SHORT_SYNTAX 1 - -@import Quick; - -QuickSpecBegin(DolphinSpec) -// ... -QuickSpecEnd -``` - -`QUICK_DISABLE_SHORT_SYNTAX`マクロは Quick ヘッダを import する前に定義する必要があります。 - - -## Swift のファイルを テストターゲットに含める - -テストターゲットの中に Swift のファイルが含まれていないと Swift stlib が リンクされないため Quick が正しく実行されません。 - -Swift のファイルが含まれていないと下記のようなエラーが発生します。 - -``` -*** Test session exited(82) without checking in. Executable cannot be -loaded for some other reason, such as a problem with a library it -depends on or a code signature/entitlements mismatch. -``` - -修正するためには `SwiftSpec.swift` という名前の空のファイルをテストターゲットに追加してください。 - -```swift -// SwiftSpec.swift - -import Quick -``` - -> この問題に関する詳細情報はこちら https://github.com/Quick/Quick/issues/164. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/README.md deleted file mode 100644 index 0c4f0d5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# テストの書き方、Quickの使い方 - -Quickでテストを書くと、SwiftとObjective-Cで書かれたプログラムがどう動作しているか楽に確認できます。 - -ところが、有用なテストはQuickを使わなくても書けます。 -役に立つテストが書けるようになるには、Quickのようなフレームワークの使い方を覚える必要はありません。 - -このディレクトリにあるファイルは、QuickかXCTestかを問わず、 -「役に立つ」テストとは何か、そしてどうやってそういったテストが書けるか、 -それを拙文ながら説明しようとしています。 - -目次: - -(テストについて事前知識がまったくない方は、順に読んでいくことをオススメします。) - -- **[Xcodeでテストを用意しましょう](SettingUpYourXcodeProject.md)**: - アプリのコードがテスト・ファイルから参照できない場合や、 - その他スムーズにテストが動かない場合はこのファイルを読み返すといいかもしれません。 -- **[XCTestで役に立つテストを書く方法:Arrange(環境構築), Act(実行), and Assert(動作確認)](ArrangeActAssert.md)**: - 役に立つテストを書くための基本中の基本。これさえ覚えれば、 - XCTestを使ってあなたも正確に動作するコードをすばやく書けるようになります。 -- **[コードをテストするのではなく、動作の確認をしましょう](BehavioralTesting.md)**: - 同じ「テスト」でも、開発を進めやすくするテストと、邪魔ばかりするテストとがあります。 - 見分ける方法は、このファイルを読めば分かります。 -- **[Nimbleのassertでテストをより読みやすくしましょう](NimbleAssertions.md)**: - Nimbleを使って、テストが失敗したときわかりやすいエラーメッセージを出すようにしましょう。 - わかりやすいメッセージで、テストがなぜ失敗したのかが一瞬でわかって開発の速度があがります。 -- **[QuickのExamplesとExample Groupsで、たくさんのテストでも整理整頓](QuickExamplesAndGroups.md)**: - Quickを使う大きなメリットのひとつはexamplesとexample groupsです。 - これでより簡潔にたくさんのテストが書けるようになります。 -- **[OS XとiOSアプリのテスト](TestingApps.md)**: - AppKitとUIKitを使ったコードをどうやってテストできるか説明します。 -- **[Test doublesを使ったテスト](TestUsingTestDoubles.md)**: - Test doublesを使って対象のクラスのみをテストする方法を説明します。 -- **[assertの共有でボイラープレートコードをなくしましょう](SharedExamples.md)**: - どうやってassertを共有できるか、なぜそうするのが望ましいのか説明します。 -- **[Quickの挙動をカスタマイズしましょう](ConfiguringQuick.md)**: - Quickがテストを実行するときの挙動をどうやって変えられるか説明します。 -- **[Objective-CでQuickを使う方法・注意点](QuickInObjectiveC.md)**: - QuickをObjective-Cで使ったときに思わぬ不具合・トラブルがあった場合、 - これを読んでください。 -- **[Quickのインストール方法](InstallingQuick.md)**: - あなたのプロジェクトにQuickを導入する方法を説明します。Git submodules、 - CocoaPods、Carthage、全部サポートしています! -- **[Quickファイル・テンプレートのインストール方法](InstallingFileTemplates.md)**: - Quickテストをすばやく作成するためのファイル・テンプレートをインストールする方法を説明します。 -- **[その他の参考資料](MoreResources.md)**: - OS X・iOSのテストに関しての資料集を用意しています。 -- **[トラブルシューティング](Troubleshooting.md)**: - その他の不具合に遭遇した場合にこれを読んでください。 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/SettingUpYourXcodeProject.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/SettingUpYourXcodeProject.md deleted file mode 100644 index 9258217..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/SettingUpYourXcodeProject.md +++ /dev/null @@ -1,77 +0,0 @@ -# テストの準備をする - -Xcode7 では Command Line Tool プロジェクトを除き、デフォルトで Unit test target が生成されます。 [参照:コマンドラインツールプロジェクトでテストの準備をする](#コマンドラインツールプロジェクトでテストの準備をする)。 -テストを書くためには Unit test targetから Main target のコードが使用できる必要があります。 - -## Swift のコードを Swift でテストする - -Swift で書かれたコードをテストするためには下記2つの作業を行います。 - -1. プロジェクトファイル `.xcodeproj` の "defines module" を `YES` に設定します。 - - * Xcode で対象のプロジェクトを開き、"Build Settings" の "Defines Modules" の 項目を "Yes" にします。 - -2. 各テストファイルで `@testable import YourAppModuleName` を追記します。 追記することで public, internal のシンボルにアクセスできるようになります。`private` シンボルはアクセスできないままです。 - -```swift -// MyAppTests.swift - -import XCTest -@testable import MyModule - -class MyClassTests: XCTestCase { - // ... -} -``` - -> Swift のファイルを Test target に含める、という方法もありますが、不具合を引き起こす([subtle, hard-to-diagnose -errors](https://github.com/Quick/Quick/issues/91)) ことがあるためお勧めしません。 - -## Objective-C のコードを Swift でテストする - -1. Bridging header を test target に追加します。 -2. Bridging header 内で テストしたいコードを import します。 - -```objc -// MyAppTests-BridgingHeader.h - -#import "MyClass.h" -``` - -これで `MyClass.h` のコードを Swift のテストコードから使用できるようになります。 - -## Swift のコードを Objective-C でテストする - -1. テストしたい Swift のクラスと関数に`@objc`属性を付加します。 -2. テストコードで Module の Swift header を import します。 - -```objc -@import XCTest; -#import "MyModule-Swift.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -## Objective-C のコードを Objective-C でテストする - -テストコード内でテスト対象を import します。 - -```objc -// MyAppTests.m - -@import XCTest; -#import "MyClass.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -### コマンドラインツールプロジェクトでテストの準備をする - -1. プロジェクトのペインからターゲットを追加(+ボタンを押下) -2. "OS X Unit Testing Bundle" または "iOS Unit Testing Bundle" を選択 -3. Main target で "Edit the scheme" を選択 -4. "Test" を選択, "Info" タブで "+" をクリックして追加した testing bundle を選択 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md deleted file mode 100644 index a1670d2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md +++ /dev/null @@ -1,122 +0,0 @@ -# assertの共有でボイラープレートコードをなくしましょう - -複数のオブジェクトに対象して同じ内容のテストを行いたい場合があります。 - -例えば `Edible` という protocol があるとします。 -イルカ(dolphin)が何か食べられる(`Edible`な)ものを食べるとイルカが幸せになります。 -サバ(`Mackerel`)とタラ(`Cod`)は食べられる(`Edible`な)ものです。 - -Quick は「イルカがどちらかを食べて幸せになる」ということを簡単にテストすることできます。 - -下記で示すテストは "(何かを食べる)something edible" という共有できるテスト(Shared examples)を定義しています。 -また、この共有できるテストでサバ(Mackerel)とタラ(Cod)を食べることについてのテストを記述しています。 - -```swift -// Swift - -import Quick -import Nimble - -class EdibleSharedExamplesConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in - it("makes dolphins happy") { - let dolphin = Dolphin(happy: false) - let edible = sharedExampleContext()["edible"] - dolphin.eat(edible) - expect(dolphin.isHappy).to(beTruthy()) - } - } - } -} - -class MackerelSpec: QuickSpec { - override func spec() { - var mackerel: Mackerel! - beforeEach { - mackerel = Mackerel() - } - - itBehavesLike("something edible") { ["edible": mackerel] } - } -} - -class CodSpec: QuickSpec { - override func spec() { - var cod: Cod! - beforeEach { - cod = Cod() - } - - itBehavesLike("something edible") { ["edible": cod] } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickConfigurationBegin(EdibleSharedExamplesConfiguration) - -+ (void)configure:(Configuration *configuration) { - sharedExamples(@"something edible", ^(QCKDSLSharedExampleContext exampleContext) { - it(@"makes dolphins happy") { - Dolphin *dolphin = [[Dolphin alloc] init]; - dolphin.happy = NO; - id edible = exampleContext()[@"edible"]; - [dolphin eat:edible]; - expect(dolphin.isHappy).to(beTruthy()) - } - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(MackerelSpec) - -__block Mackerel *mackerel = nil; -beforeEach(^{ - mackerel = [[Mackerel alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": mackerel }; }); - -QuickSpecEnd - -QuickSpecBegin(CodSpec) - -__block Mackerel *cod = nil; -beforeEach(^{ - cod = [[Cod alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": cod }; }); - -QuickSpecEnd -``` - -Shared examples は `it`, `context` や `describe` のブロックをいくつでも含めることができます。 -これは異なる種類の対象についてテストをする際のコードを節約することができます。 - -あるケースでは context を追加する必要もありません。 -Swift では `sharedExamples` closure を使って共有できるテストを定義することができます。 -このテクニックはある時点での状態をテストしたい時などに役に立つかもしれません。 - -```swift -// Swift - -import Quick - -sharedExamples("everything under the sea") { - // ... -} - -itBehavesLike("everything under the sea") -``` - -> Objective-Cでは, `QCKDSLSharedExampleContext` を引数に取る block を渡すことができます。※QCKDSLSharedExampleContext を使う予定がなくても引数に取る block を用意してください。めんどくさくても。世の中そんなもんです。 :cookie: :bomb: - -`itBehavesLike` の先頭に `f` を加えて(`fitBehavesLike`) として共有できるテストのみ実行することもできます。 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/TestUsingTestDoubles.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/TestUsingTestDoubles.md deleted file mode 100644 index 7251e2e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/TestUsingTestDoubles.md +++ /dev/null @@ -1,138 +0,0 @@ -# Test doubles を使ったテスト - -## Test doubles - -テストを書いているとしばしば次のような問題にぶつかります。 `車`クラスが`タイヤ`クラスを使用している(依存している)とします。 - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesA.png) - -ここで 車Tests という (`タイヤ`に依存している)`車` のテストを用意します。ここで `タイヤ` にバグがあった場合、`車`に問題なくても 車Tests は失敗します。 -このような事が頻繁に起こるとバグの究明が難しくなります。 - -この問題を回避するには、`車`Tests において `タイヤ`の 代わりになるクラス`完璧タイヤ` クラス(代理、英語で `Stand-in`といいます)を用意する、という方法があります。 - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesAmock.png) - -この`完璧タイヤ`は実装は異なりますが`タイヤ`と同じメソッド、プロパティを持ちます。そのため 車Tests において `タイヤ` を `完璧タイヤ` と入れ替えることができます。 - -`完璧タイヤ`クラスのような差し替え可能なオブジェクトのことを一般に'test doubles(テストダブル)'と呼びます。 -'test doubles' にはいくつか種類があります。 - -- Mock object: テスト対象のクラスの出力の検証に用いる -- Stub object: テスト対象のクラスにデータを渡す(入力)際に用いる -- Fake object: 差し替え前のオブジェクトと近い振る舞いをする(実装がより簡単になっている) - -ここではモックを使ったテストの方法を紹介します。 - -## モックとは - -モックとはテスト対象のオブジェクト(クラス、構造体)が呼び出し先のオブジェクトと意図したとおりに協調動作するかどうかをテストするために使うオブジェクトのことです。 - -## Swift でモックを使ったテストを書く - -### サンプルアプリケーション - -ここでは例としてインターネット経由で取得したデータを表示するアプリケーションを考えます。 - -* DataProviderProtocolというプロトコルを実装したクラスがインターネット経由でデータを取得する -* 取得したデータをViewControllerで表示する - -ここで DataProviderProtocol を定義します。 - -```swift -// Swift -protocol DataProviderProtocol: class { - func fetch(callback: (data: String) -> Void) -} -``` - -DataProviderProtocol の `fetch()`関数でデータを取得し、callbackブロックでデータを渡します。 - -ここで DataProviderProtocol を実装する DataProvider クラスを定義します。 - -```swift -// Swift -class DataProvider: NSObject, DataProviderProtocol { - func fetch(callback: (data: String) -> Void) { - let url = NSURL(string: "http://example.com/")! - let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) - let task = session.dataTaskWithURL(url, completionHandler: { - (data, resp, err) in - let string = NSString(data:data!, encoding:NSUTF8StringEncoding) as! String - callback(data: string) - }) - task.resume() - } -} -``` - -ViewController の `viewDidLoad` 中にデータの取得(`fetch()`の呼び出し)を行います。 - -コードはこのようになります。 - -```swift -// Swift -class ViewController: UIViewController { - @IBOutlet weak var resultLabel: UILabel! - private var dataProvider: DataProviderProtocol? - - override func viewDidLoad() { - super.viewDidLoad() - - dataProvider = dataProvider ?? DataProvider() - - dataProvider?.fetch({ [unowned self] (data) -> Void in - self.resultLabel.text = data - }) - } -} -``` - -## DataProviderProtocol のモックを使ったテストを書く - -この例では ViewController は DataProviderProtocol に依存しています。 -テスト用に DataProviderProtocol を継承したクラス(モックとして使用します)をテストターゲット内に作成します。 - -モックを作成することで、 -- テストを速く実行できる -- インターネットに接続していなくてもテストができるようになる -- ViewController の動作のテストにフォーカスできる(実際のDataProviderをテスト対象から外すことが出来る) - -```swift -// Swift -class MockDataProvider: NSObject, DataProviderProtocol { - var fetchCalled = false - func fetch(callback: (data: String) -> Void) { - fetchCalled = true - callback(data: "foobar") - } -} -``` - -このモックの中で fetchCalled プロパティを定義しています。 fetchCalled は fetch 関数が呼ばれたら true になります。 -これで準備は完了です。 - -このモックを使ってテストをします。このテストで「 ViewController がロードされた時(viewDidLoad)に dataProvider を使って fetch() を実行するか」という動作をテストしています。 - -```swift -// Swift -override func spec() { - describe("view controller") { - it("fetch data with data provider") { - let mockProvier = MockDataProvider() - let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as! ViewController - viewController.dataProvier = mockProvier - - expect(mockProvier.fetchCalled).to(equal(false)) - - let _ = viewController.view - - expect(mockProvier.fetchCalled).to(equal(true)) - } - } -} -``` - -このようにオブジェクトのモックを作ることで動作をテストしやすくなります。 - -テストの書き方について、更に詳細を知りたい方はこちらのビデオを参考にしてください。 https://realm.io/jp/news/testing-in-swift/ 。 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/TestingApps.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/TestingApps.md deleted file mode 100644 index db389ee..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/TestingApps.md +++ /dev/null @@ -1,174 +0,0 @@ -# Testing OS X and iOS Applications - -*[Xcodeでテストを用意しましょう](SettingUpYourXcodeProject.md)*では Objective-C や Swift の関数やクラスを -テストするために必要なことを述べました。ここでは `UIViewController` のサブクラスなどをテストする際のポイントを述べます。 - -> 関連する LT がありますので[こちら](https://vimeo.com/115671189#t=37m50s)も参考にしてください。 (37'50" から始まる部分です)。 - -## `UIViewController` のライフサイクルイベントを発火させる - -通常は UIKit が view controller のライフサイクルイベントを発火しますが、 -テストをする時は自分たちでライフサイクルイベントを発火させる必要があります。 -呼び出すには3つの方法があります。 - -1. `UIViewController.view`にアクセスする、すると `UIViewController.viewDidLoad()` のイベントが発火します。 -2. `UIViewController.beginAppearanceTransition()` を呼び出すとほとんどのライフサイクルイベントが発火します。。 -3. `UIViewController.viewDidLoad()` や `UIViewController.viewWillAppear()` などのライフサイクルに関わる関数を直接呼び出す。 - -```swift -// Swift - -import Quick -import Nimble -import BananaApp - -class BananaViewControllerSpec: QuickSpec { - override func spec() { - var viewController: BananaViewController! - beforeEach { - viewController = BananaViewController() - } - - describe(".viewDidLoad()") { - beforeEach { - // Method #1: Access the view to trigger BananaViewController.viewDidLoad(). - let _ = viewController.view - } - - it("sets the banana count label to zero") { - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal("0")) - } - } - - describe("the view") { - beforeEach { - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - viewController.beginAppearanceTransition(true, animated: false) - viewController.endAppearanceTransition() - } - // ... - } - - describe(".viewWillDisappear()") { - beforeEach { - // Method #3: Directly call the lifecycle event. - viewController.viewWillDisappear(false) - } - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; -#import "BananaViewController.h" - -QuickSpecBegin(BananaViewControllerSpec) - -__block BananaViewController *viewController = nil; -beforeEach(^{ - viewController = [[BananaViewController alloc] init]; -}); - -describe(@"-viewDidLoad", ^{ - beforeEach(^{ - // Method #1: Access the view to trigger -[BananaViewController viewDidLoad]. - [viewController view]; - }); - - it(@"sets the banana count label to zero", ^{ - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal(@"0")) - }); -}); - -describe(@"the view", ^{ - beforeEach(^{ - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - [viewController beginAppearanceTransition:YES animated:NO]; - [viewController endAppearanceTransition]; - }); - // ... -}); - -describe(@"-viewWillDisappear", ^{ - beforeEach(^{ - // Method #3: Directly call the lifecycle event. - [viewController viewWillDisappear:NO]; - }); - // ... -}); - -QuickSpecEnd -``` - -## Storyboard 内に定義した View Controller を初期化する - -Storyboard 内に定義した View Controller を初期化する際は **Storyboard ID** を定義しておく必要があります。 - -![](http://f.cl.ly/items/2X2G381K1h1l2B2Q0g3L/Screen%20Shot%202015-02-27%20at%2011.58.06%20AM.png) - -**Storyboard ID** を定義しておくとテストコードから ViewController を初期化することができます。 - -```swift -// Swift - -var viewController: BananaViewController! -beforeEach { - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - let storyboard = UIStoryboard(name: "Main", bundle: nil) - // 2. Use the storyboard to instantiate the view controller. - viewController = - storyboard.instantiateViewControllerWithIdentifier( - "BananaViewControllerID") as! BananaViewController -} -``` - -```objc -// Objective-C - -__block BananaViewController *viewController = nil; -beforeEach(^{ - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; - // 2. Use the storyboard to instantiate the view controller. - viewController = [storyboard instantiateViewControllerWithIdentifier:@"BananaViewControllerID"]; -}); -``` - -## ボタンをタップされた、などの UIControl Events を発火させる - -ボタンや他の `UIControl` を継承したクラスは Control イベントを発火させる関数を持っています。 -ボタンをタップされた時の動作をテストするにはこのように書くことができます: - -```swift -// Swift - -describe("the 'more bananas' button") { - it("increments the banana count label when tapped") { - viewController.moreButton.sendActionsForControlEvents( - UIControlEvents.TouchUpInside) - expect(viewController.bananaCountLabel.text).to(equal("1")) - } -} -``` - -```objc -// Objective-C - -describe(@"the 'more bananas' button", ^{ - it(@"increments the banana count label when tapped", ^{ - [viewController.moreButton sendActionsForControlEvents:UIControlEventTouchUpInside]; - expect(viewController.bananaCountLabel.text).to(equal(@"1")); - }); -}); -``` diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/Troubleshooting.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/Troubleshooting.md deleted file mode 100644 index 095dad3..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/ja/Troubleshooting.md +++ /dev/null @@ -1,9 +0,0 @@ -# トラブルシューティング - -Quick を使用するときによくぶつかる問題の解決策を紹介します。 - -## Cocoapods でインストールした時に「No such module 'Quick'」エラーが出る - -- すでに `pod install` を実行していた場合、一度 Xcode workspace を閉じて再度開いてみてください。それでも解決しない場合は次の手順を試してみてください。 -- `ModuleCache` を含む `~/Library/Developer/Xcode/DerivedData` をすべて削除してください。 -- `Manage Schemes`ダイアログから`Quick`、`Nimble`、`Pods-ProjectNameTests` ターゲットの Scheme が有効なことを確認して、明示的にビルド(`Cmd+B`)をやり直してみてください。 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/pt-br/BehavioralTesting.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/pt-br/BehavioralTesting.md deleted file mode 100644 index 4e41676..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/pt-br/BehavioralTesting.md +++ /dev/null @@ -1,78 +0,0 @@ -# Não Teste o Código, Verifique Comportamento - -Testes devem falhar somente se a aplicação **se comportar diferente**. -Eles devem testar *o que* o código da aplicação faz, não *como* faz. - -- Testes que verificam *o que* a aplicação faz são **testes de comportamento**. -- Testes que quebram se o código da aplicação muda, mesmo que o comportamento seja mantido, são **teste frágeis**. - -Vamos supor que temos uma database de bananas, chamada `GorillaDB`. -`GorillaDB` é uma database baseada em chave-valor que guarda bananas. Nós podemos salvar bananas: - -```swift -let database = GorillaDB() -let banana = Banana() -database.save(banana: banana, key: "my-banana") -``` - -E podemos ler bananas: - -```swift -let banana = database.load(key: "my-banana") -``` - -## Testes Frágeis - -Como podemos testar esse comportamento? Um jeito seria checar o tamanho da database depois de salvar uma banana: - -```swift -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() - let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - - // Assert: The size of the database should have increased by one. - XCTAssertEqual(database.size, originalSize + 1) -} -``` - - -Imagine, no entanto, que o código fonte da `GorillaDB` mude. Para que a operação de leitura de bananas da database seja mais rápida, é mantido um cache com as bananas lidas com maior frequência. `GorillaDB.size` aumenta conforme o tamanho do cache aumenta, e nosso teste falha: - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/Screenshot_database_size_fail.png) - -## Testes de Comportamento - -O segredo para escrever testes de comportamento é determinar exatamente o que se espera que o código da aplicação faça. - -No contexto do teste `testSave_savesTheBananaToTheDatabase`: qual é o comportamento esperado quando uma banana é salva na database? "Salvar" implica que essa banana pode ser lida mais tarde. Então, ao invés de testar que o tamanho da database aumenta, nós devemos testar que é possível ler uma banana. - -```diff -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { - // Arrange: Create a database and get its original size. - let database = GorillaDB() -- let originalSize = database.size - - // Act: Save a banana to the database. - let banana = Banana() - database.save(banana: banana, key: "test-banana") - -- // Assert: The size of the database should have increased by one. -- XCTAssertEqual(database.size, originalSize + 1) -+ // Assert: The bananas saved to and loaded from the database should be the same. -+ XCTAssertEqual(database.load(key: "test-banana"), banana) -} -``` - -O segredo para escrever testes de comportamento é perguntar: - -- O que exatamente o código dessa aplicação deve fazer? -- O meu teste está verificando *apenas* esse comportamento? Ou o teste pode falhar devido à forma como o código funciona? \ No newline at end of file diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/pt-br/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/pt-br/README.md deleted file mode 100644 index c170942..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/pt-br/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Documentação - -Quick te ajuda a verificar como programas em Swift e Objective-C se comportam. - -Fazê-lo de forma eficaz não é apenas questão de saber como usar Quick. Os guias nesse diretório podem te ajudar a escrever testes eficazes --não apenas usando Quick, mas até mesmo XCTest ou outros framework de teste. - -Cada guia cobre um tópico em particular. Se você é completamente novo a teste unitário, considere lê-los na ordem que são introduzidos abaixo: - -- **[Configurar Testes no seu Xcode Project](SettingUpYourXcodeProject.md)**: - Leia isto se você esta com problemas para usar o código da sua aplicação de dentro dos seus arquivos de teste. -- **[Testes Eficazes Usando XCTest: Arrange, Act e Assert](ArrangeActAssert.md)**: - Leia isto para aprender como escrever `XCTestcase` testes que o ajudarão a escrever código mais rápido e mais eficaz. -- **[Não Teste o Código, Verifique Comportamento](BehavioralTesting.md)**: - Leia isto para aprender que tipos de testes te deixam mais rápido e quais os que só vão acabar te deixando mais devagar. -- **[Testes Limpos Usando Nimble Assertions](NimbleAssertions.md)**: - Leia isto para aprender a usar Nimble para gerar melhores mensagens de falha. - Melhores mensagens de falha ajudam a se mover mais rápido, gastando menos tempo tentando descobrir por que -    um teste falhou. -- **[Testes Organizados com Exemplos Quick e Grupos de Exemplo](QuickExamplesAndGroups.md)**: - Leia isto para aprender como Quick pode ajudar ainda mais a escrever testes eficazes, usando *exemplos* e *grupos de exemplos* -- **[Testando Aplicações OS X e iOS](TestingApps.md)**: - Leia isto para aprender mais sobre testar código que utiliza - AppKit e UIKit frameworks. -- **[Testando com testes dublês](TestUsingTestDoubles.md)**: - Leia isto para aprender o que são testes dublês e como usa-lôs. -- **[Reduzindo Teste Boilerplate com Assertions Compartilhados](SharedExamples.md)**: - Leia isto para aprender como compartilhar conjuntos de assertions entre seus testes. -- **[Configurando como Quick se Comporta](ConfiguringQuick.md)**: - Leia isto para aprender como você pode mudar como Quick se comporta quando roda os sua suite de testes. -- **[Usando Quick com Objective-C](QuickInObjectiveC.md)**: - Leia isto se você esta com problemas para usar Quick em Objective-C. -- **[Instalando Quick](InstallingQuick.md)**: - Leia isto para instruções de como adicionar Quick no seu projeto, usando Git submodules, CocoaPods, Carthage, ou Swift Package Manager. -- **[Instalando Arquivos Templates Quick](InstallingFileTemplates.md)**: -Leia isto para aprender como instalar arquivos templates que deixam escrever Quick specs mais rápidos. -- **[Mais Recursos](MoreResources.md)**: - Uma lista de recursos adicionais sobre testes OS X e iOS. -- **[Troubleshooting](Troubleshooting.md)**: - Leia isto quando você tiver outros problemas. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/ArrangeActAssert.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/ArrangeActAssert.md deleted file mode 100644 index fda4f8a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/ArrangeActAssert.md +++ /dev/null @@ -1,205 +0,0 @@ -# 编写高效的 XCTest 测试: Arrange,Act 和 Assert - -当你使用 XCTest,Quick 或者其他测试框架时,你可以遵循下面的模式来编写有效的单元测试: - -1. Arrange - 安排好所有先要条件和输入 -2. Act - 对要测试的对象或方法进行演绎 -3. Assert - 作出预测结果的断言 - -## Arrange, Act, and Assert 三部曲 - -举个例子,假设现在有一个叫 `Banana` 的类: - -```swift -// Banana/Banana.swift - -/** A delicious banana. Tastes better if you peel it first. */ -public class Banana { - private var isPeeled = false - - /** Peels the banana. */ - public func peel() { - isPeeled = true - } - - /** You shouldn't eat a banana unless it's been peeled. */ - public var isEdible: Bool { - return isPeeled - } -} -``` - -现在我们想验证一下 `Banana.peel()` 方法的行为是否跟我们设想的一样: - -```swift -// BananaTests/BananaTests.swift - -class BananaTests: XCTestCase { - func testPeel() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) - } -} -``` - -## 使用明确清晰的方法名字 - -我们的 `testPeel()` 函数可以确保如果 `Banana.peel()` 方法出了问题,我们可以第一时间知道。这通常发生在我们修改了应用的代码后,同时也意味着: - -1. 如果我们意外地写错了代码,我们需要修复它从而让代码正常工作。 -2. 或者我们可能为了增加一个新的功能而改变原有的代码 —— 因此我们需要更改现有的测试代码。 - -如果我们的测试开始出现失败,怎么才能知道是哪一个测试用例失败呢?这可能会让你吃惊,最好的办法是从 **测试方法的名字** 找出端倪。好的测试方法会: - -1. 明确什么是对正在被测试的对象。 -2. 明确什么时候测试应该通过,什么时候测试应该失败。 - -那我们上面的 `testPeel()` 方法的命名清晰吗?我们可以让它变得更清晰: - -```diff -// BananaTests.swift - --func testPeel() { -+func testPeel_makesTheBananaEdible() { - // Arrange: Create the banana we'll be peeling. - let banana = Banana() - - // Act: Peel the banana. - banana.peel() - - // Assert: Verify that the banana is now edible. - XCTAssertTrue(banana.isEdible) -} -``` - -新的方法命名: - -1. 明确了什么是正在被测试的对象:`testPeel` 指明了正在被测试的是 `Banana.peel()` 方法。 -2. 明确了测试通过的条件:`makesTheBananaEdible` 指明了只要这个测试方法被调用后,香蕉就已经被剥皮(可食用)。 - -## 对条件进行测试 - -假设我们现在可以向别人提供香蕉,有这样一个叫 `offer()` 的函数: - -```swift -// Banana/Offer.swift - -/** Given a banana, returns a string that can be used to offer someone the banana. */ -public func offer(banana: Banana) -> String { - if banana.isEdible { - return "Hey, want a banana?" - } else { - return "Hey, want me to peel this banana for you?" - } -} -``` - -我们的代码做了以下其中一件事: - -1. 给别人一个已经被剥过皮的香蕉。 -2. 或者给别人一个没剥皮的香蕉。 - -现在让我们为这两种情况编写测试: - -```swift -// BananaTests/OfferTests.swift - -class OfferTests: XCTestCase { - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { - // Arrange: Create a banana and peel it. - let banana = Banana() - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { - // Arrange: Create a banana. - let banana = Banana() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -我们的方法名字清晰地指明了测试通过时所应具备的**条件**:在 `whenTheBananaIsPeeled` 测试中,`offer()` 方法应该 `offersTheBanana`。那香蕉没被剥皮的情况呢?好吧,我们也写了另外一个测试来测试这种情况。 - -注意,我们为每个 `if` 条件单独写了一个测试。在我们写测试时,确保每个条件都能被测试,是一个好的模式。如果其中一个条件不再满足,或者需要修改,我们就很容易知道哪个测试需要处理。 - -## 用 `XCTestCase.setUp()` 来编写更简洁的 "Arrange" - -我们的两个 `OfferTests` 测试都包含了相同的 "Arrange" 代码:他们都初始化了一个香蕉。我们应该把初始化方法移到一个单独的地方。为什么? - -1. 现在,假设需要修改 `Banana` 的初始化方法,那么我们就要对每个方法进行修改。 -2. 我们的测试方法会更加简洁 —— 这对于我们是一件好事,当且**仅当**测试方法能更容易被人阅读的时候。 - -现在我们把 `Banana` 的初始化方法移到 `XCTestCase.setUp()` 方法里,这样当每个测试开始时,初始化方法都会被调用。 - -```diff -// OfferTests.swift - -class OfferTests: XCTestCase { -+ var banana: Banana! -+ -+ override func setUp() { -+ super.setUp() -+ banana = Banana() -+ } -+ - func testOffer_whenTheBananaIsPeeled_offersTheBanana() { -- // Arrange: Create a banana and peel it. -- let banana = Banana() -+ // Arrange: Peel the banana. - banana.peel() - - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want a banana?") - } - - func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() { -- // Arrange: Create a banana. -- let banana = Banana() -- - // Act: Create the string used to offer the banana. - let message = offer(banana) - - // Assert: Verify it's the right string. - XCTAssertEqual(message, "Hey, want me to peel this banana for you?") - } -} -``` - -## 在不同的测试里共享 "Arrange" 代码 - -如果你发现你在很多地方都有相同重复的 "arrange" 方法,你可能想定义一个通用的 helper 函数: - -```swift -// BananaTests/BananaHelpers.swift - -internal func createNewPeeledBanana() -> Banana { - let banana = Banana() - banana.peel() - return banana -} -``` - -> 用一个通用函数来定义那些不能被抽象,或不会保存状态的方法。抽象的子类和可修改的状态会使你的测试难以阅读。 - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/BehavioralTesting.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/BehavioralTesting.md deleted file mode 100644 index 70a0b51..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/BehavioralTesting.md +++ /dev/null @@ -1,75 +0,0 @@ -# 别测试代码,而应该验证程序的行为 - -测试应该只在程序的**行为和预期的不一样**时,才不通过。测试应该测试程序的代码做了什么,而不是测试程序如何实现。 - -- 验证应用程序做了什么的,叫做**行为测试**。 -- 即使应用程序的行为不发生变化,只要应用程序的代码发生了变化,测试就不通过的,叫做**脆性测试**。 - -假设我们有一个香蕉数据库,叫做 `GorillaDB`。`GorillaDB` 是一个以键-值对来储存香蕉的数据库。我们可以用这样的方式储存香蕉: - -```swift -let database = GorillaDB() -let banana = Banana() -database.save(banana: banana, key: "my-banana") -``` - -之后可以从数据库里取回香蕉: - -```swift -let banana = database.load(key: "my-banana") -``` - -## 脆性测试 - -我们如何测试这个存取的行为呢?一种方式是每当我们储存一根香蕉后就检查数据库的大小: - -```swift -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { -// Arrange: Create a database and get its original size. -let database = GorillaDB() -let originalSize = database.size - -// Act: Save a banana to the database. -let banana = Banana() -database.save(banana: banana, key: "test-banana") - -// Assert: The size of the database should have increased by one. -XCTAssertEqual(database.size, originalSize + 1) -} -``` - -然而,设想一下 `GorillaDB` 的源代码发生了变化。为了从数据库里更快地取出香蕉,数据库预留了一部份缓存空间用于存放经常使用的香蕉。`GorillaDB.size` 就会随着缓存的增加而增加,这样我们的测试就不能通过了: - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/Screenshot_database_size_fail.png) - -## 行为测试 - -编写行为测试的关键,就是准确的定位你想让你的程序代码做什么。 - -在我们的 `testSave_savesTheBananaToTheDatabase` 的测试中:当我们在数据库中储存一根香蕉时,我们所希望程序完成的是一个怎样的行为呢?应该是保存香蕉,即之后可以取回香蕉。因此,我们不该测试数据库大小的增加,而应该测试我们能不能从数据库里取回香蕉。 - -```diff -// GorillaDBTests.swift - -func testSave_savesTheBananaToTheDatabase() { -// Arrange: Create a database and get its original size. -let database = GorillaDB() -- let originalSize = database.size - -// Act: Save a banana to the database. -let banana = Banana() -database.save(banana: banana, key: "test-banana") - -- // Assert: The size of the database should have increased by one. -- XCTAssertEqual(database.size, originalSize + 1) -+ // Assert: The bananas saved to and loaded from the database should be the same. -+ XCTAssertEqual(database.load(key: "test-banana"), banana) -} -``` - -编写行为测试的关键,就在于思考这些问题: - -- 这段程序代码是用来做什么的? -- 我的测试只验证了程序的行为吗?它可能因为代码运行的其他原因而不通过吗? diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/ConfiguringQuick.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/ConfiguringQuick.md deleted file mode 100644 index fc5ba90..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/ConfiguringQuick.md +++ /dev/null @@ -1,102 +0,0 @@ -# 配置 Quick 的行为 - -你可以通过继承 `QuickConfiguration` 并且 -重写 `QuickConfiguration.Type.configure()` 类方法的方式来自定义 Quick 的行为。 - -```swift -// Swift - -import Quick - -class ProjectDataTestConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - // ...set options on the configuration object here. - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(ProjectDataTestConfiguration) - -+ (void)configure:(Configuration *configuration) { - // ...set options on the configuration object here. -} - -QuickConfigurationEnd -``` - -一个项目可能包含多个配置。Quick 不保证这些配置执行的先后顺序。 - -## 添加全局闭包 `beforeEach` 和 `afterEach` - -你可以通过使用 `QuickConfiguration.beforeEach` 和 `QuickConfiguration.afterEach` ,执行测试中每个例子运行前或运行后特定的闭包代码: - -```swift -// Swift - -import Quick -import Sea - -class FinConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { - Dorsal.sharedFin().height = 0 - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -#import "Dorsal.h" - -QuickConfigurationBegin(FinConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEach:^{ - [Dorsal sharedFin].height = 0; - }]; -} - -QuickConfigurationEnd -``` - -另外,Quick 允许你根据当前正在运行的例子,访问元数据: - -```swift -// Swift - -import Quick - -class SeaConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - configuration.beforeEach { exampleMetadata in - // ...use the example metadata object to access the current example name, and more. - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickConfigurationBegin(SeaConfiguration) - -+ (void)configure:(Configuration *)configuration { - [configuration beforeEachWithMetadata:^(ExampleMetadata *data) { - // ...use the example metadata object to access the current example name, and more. - }]; -} - -QuickConfigurationEnd -``` - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingFileTemplates.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingFileTemplates.md deleted file mode 100644 index 7e35365..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingFileTemplates.md +++ /dev/null @@ -1,26 +0,0 @@ -# 安装 Quick 文件模板 - -Quick 仓库包含了 Swift 和 Objective-C 规范的文件模板。 - -## Alcatraz - -Quick 模板可以通过 [Alcatraz](https://github.com/supermarin/Alcatraz) 安装,这是一个 Xcode 的包管理器。只需在包管理器里搜索 Quick : - -![](http://f.cl.ly/items/3T3q0G1j0b2t1V0M0T04/Screen%20Shot%202014-06-27%20at%202.01.10%20PM.png) - -## 使用 Rakefile 手动安装 - -如果想手动安装模板,那么只需克隆仓库并运行 rake 命令 `templates:install` : - -```sh -$ git clone git@github.com:Quick/Quick.git -$ rake templates:install -``` - -若要卸载模板,可以运行命令: - -```sh -$ rake templates:uninstall -``` - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md deleted file mode 100644 index 2f54b0a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md +++ /dev/null @@ -1,157 +0,0 @@ -# 安装 Quick - -> **如果你的 Xcode 版本是7.1,** 请使用新的 Quick--`v0.9.0` 写测试代码。 -> 新发布的版本是基于 `swift-2.0` 这个分支开发的。 - - - -Quick 提供了定义例子和例子群的语法。 Nimble 提供了如 `expect(...).to` 的断言语法。 在写测试代码的时候,你可以使用它们中的任意一个或者同时使用它们。 - -下面是几种主要的方法,用来添加 Quick 支持: - -1. [Git Submodules](#git-submodules) -2. [CocoaPods](#cocoapods) -3. [Carthage](#carthage) -4. [Swift Package Manager (experimental)](#swift-package-manager) - -你可以选择其中一种方法,并按照下面的步骤进行。完成之后,就可以通过 `import Quick` 使你的测试支持 Quick 。 - -## Git Submodules - -通过以下步骤可以使用 Git 的子模块(submodules) 为项目添加 Quick 和 Nimble : - -1. 添加子模块 Quick。 -2. 为你的项目新建一个 `.xcworkspace` 文件,如果原本已经有这个文件,则跳过此步骤。 ([如何添加请看这里](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) -3. 把 `Quick.xcodeproj` 添加到项目的 `.xcworkspace`中。 -4. 把 `Nimble.xcodeproj` 添加到项目的 `.xcworkspace`中。它所在的目录是: `path/to/Quick/Externals/Nimble`。 通过从 Quick 的依赖库中添加 Nimble (而不是直接添加为子模块),可以确保无论所用的 Quick 是什么版本,都能使用正确版本的 Nimble 。 -5. 把 `Quick.framework` 和 `Nimble.framework` 添加到项目 "build phase" 选项页的 "Link Binary with Libraries" 列表中。 - -首先,你需要有一个 Git 子模块的目录,如果没有的话,就创建一个。假设这个目录的名称是 "Vendor" 。 - -**第一步:** 下载 Quick 和 Nimble 作为 Git 的子模块: - -```sh -git submodule add git@github.com:Quick/Quick.git Vendor/Quick -git submodule add git@github.com:Quick/Nimble.git Vendor/Nimble -git submodule update --init --recursive -``` - -**第二步:** 把下载完的 `Quick.xcodeproj` 和 `Nimble.xcodeproj` 文件添加到项目的 `.xcworkspace` 上。 例如:下图是 `Guanaco.xcworkspace` 已经添加了 Quick 和 Nimble : - -![](http://f.cl.ly/items/2b2R0e1h09003u2f0Z3U/Screen%20Shot%202015-02-27%20at%202.19.37%20PM.png) - -**第三步:** 把 `Quick.framework` 添加到测试目标(target)的 `Link Binary with Libraries` 列表中。你会发现有两个 `Quick.frameworks`;其中一个是 OS X 平台的,另一个是 iOS 平台的。 - -![](http://cl.ly/image/2L0G0H1a173C/Screen%20Shot%202014-06-08%20at%204.27.48%20AM.png) - -重复上面的步骤,添加 `Nimble.framework`。 - -**更新子模块:** 如果你想把 Quick 和 Nimble 模块升级到最新版本,你可以在 Quick 目录下使用 `pull` 来更新,如下: - -```sh -cd /path/to/your/project/Vendor/Quick -git checkout master -git pull --rebase origin master -``` - -你的 Git 仓库会自动同步更改到子模块中。如果你想确保已经更新了 Quick 子模块,那么可以这样: - -```sh -cd /path/to/your/project -git commit -m "Updated Quick submodule" -``` - -**克隆一个包含有 Quick 子模块的仓库:** 当其他人克隆了你的仓库后,他们会同时拥有这些子模块。 -他们可以运行 `git submodule update` 命令: - -```sh -git submodule update --init --recursive -``` - -更多关于子模块的内容,可以参考[这里](http://git-scm.com/book/en/Git-Tools-Submodules)。 - -## CocoaPods - -首先,请把 CocoaPods 升级到0.36或者更高的版本,这样才能在 Swift 下使用 CocoaPods 。 - -然后在你的 Podfile 中添加 Quick 和 Nimble 。并且为了在 Swift 中使用 CocoaPods ,记得加上这一行: ```use_frameworks!``` 。 - -```rb - -# Podfile - -use_frameworks! - -def testing_pods - pod 'Quick' - pod 'Nimble' -end - -target 'MyTests' do - testing_pods -end - -target 'MyUITests' do - testing_pods -end -``` - -最后,下载并将 Quick 和 Nimble 导入到你的测试中: - -```sh -pod install -``` - -### 使用 Swift 1.2 ? - -最近发布的 Quick (0.4.0) 适用于 Swift 2 (Xcode 7),但是 Nimble (1.0.0) 适用于 Swift 1.2 (Xcode 6)。 - -如果你想在 Xcode 6 中使用它们,请使用以下这段代码: - -```sh -target 'MyTests' do - use_frameworks! - pod 'Quick', '~>0.3.0' - pod 'Nimble', '~>1.0.0' -end -``` - -## [Carthage](https://github.com/Carthage/Carthage) - -在一个项目中,测试所在的目标(target)并没有 "Embedded Binaries" 这部分内容, 因此必须把框架添加到目标的 "Link Binary With Libraries" 里,并且在 build phase 选项页中新建一条 "Copy Files" 把它们复制到目标的框架列表中。 - - > 因为 Carthage 生成的是动态的框架,所以你需要有一个合法的身份标识。 - -1. 在 [`Cartfile.private`](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfileprivate) 中添加 Quick ,如下: - - ``` - github "Quick/Quick" - github "Quick/Nimble" - ``` - -2. 运行 `carthage update`。 -3. 从 `Carthage/Build/[platform]/` 目录下, 找到 Quick 框架和 Nimble 框架,把它们添加到测试目标的 "Link Binary With Libraries" 列表中: - ![](http://i.imgur.com/pBkDDk5.png) - -4. 在你的测试目标下新建一条 "Copy Files" : - ![](http://i.imgur.com/jZATIjQ.png) - -5. 将 "Destination" 设为 "Frameworks",然后添加这两个框架: - ![](http://i.imgur.com/rpnyWGH.png) - -注意,这并不是使用 Carthage 来管理依赖的唯一方法。更多的方法请参考 [Carthage documentation](https://github.com/Carthage/Carthage/blob/master/README.md)。 - -## [Swift Package Manager](https://github.com/apple/swift-package-manager) -随着 [swift.org](https://swift.org) 上一个开源项目的出现, Swift 现在有了一个官方的包管理器。 尽管它刚问世不久,但是它首次使在非苹果平台上使用 Quick 成为了可能。经过初期的开发,现在已经可以利用 Swift Package Manager 为测试项目添加 Quick 支持了。但是由于这个包管理器正在开发中,在使用的过程中可能会出现一些问题。 - -在更新的帮助文档发布之前,这个项目阐述了如何在 SwiftPM 的 `Package.swift` 中添加 Quick 。 - -https://github.com/Quick/QuickOnLinuxExample - -### (不建议) 在真实的iOS设备上运行用Quick书写的代码 - -为了在设备上运行 Quick 形式的代码,你需要把 `Quick.framework` 和 `Nimble.framework` 作为 `Embedded Binaries` 添加到项目目标的 `Host Application` 里。 当以二进制文件的形式把框架添加到 Xcode 中,Xcode 会自动为 App 添加 Quick 框架。 - -![](http://indiedev.kapsi.fi/images/embed-in-host.png) - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/MoreResources.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/MoreResources.md deleted file mode 100644 index 0a9ed84..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/MoreResources.md +++ /dev/null @@ -1,23 +0,0 @@ -# 更多资源 - -## Quick Specs 的例子 - -很多公司、开源项目和独立开发者都使用了 Quick ,包括 [GitHub](https://github.com/github) 和 [ReactiveCocoa](https://github.com/ReactiveCocoa)。具体例子请参考以下链接: - -- https://github.com/ReactiveCocoa/ReactiveCocoa -- https://github.com/github/Archimedes -- https://github.com/libgit2/objective-git -- https://github.com/jspahrsummers/RXSwift -- https://github.com/artsy/eidolon -- https://github.com/AshFurrow/Moya -- https://github.com/nerdyc/Squeal -- https://github.com/pepibumur/SugarRecord - -## 关于 OS X 和 iOS 应用单元测试的更多信息 - -- **[Quality Coding](http://qualitycoding.org/)**:一个关注单元测试的 iOS 开发博客。 -- **[OCMock Tutorials](http://ocmock.org/support/)**:当你需要在测试中使用伪对象时,使用 OCMock 。 -- **[Nocilla: Stunning HTTP stubbing for iOS and Mac OS X](https://github.com/luisobo/Nocilla)**:使用这个库来测试那些与互联网进行数据交换的代码。 -- **[Pivotal Labs: Writing Beautiful Specs with Jasmine Custom Matchers](http://pivotallabs.com/writing-beautiful-specs-jasmine-custom-matchers/)**:参考 [the Nimble documentation](https://github.com/Quick/Nimble) ,了解如何用 Nimble 编写自定义的匹配器。 - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/NimbleAssertions.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/NimbleAssertions.md deleted file mode 100644 index b64919c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/NimbleAssertions.md +++ /dev/null @@ -1,100 +0,0 @@ -# 使用 Nimble 断言,让测试更清晰 - -当代码不能如预期那样正常运行时,单元测试应该能够反映出问题的所在。 - -例如,下面这个函数能够从所给的一组猴子中筛选并返回其中的傻猴子: - -```swift -public func silliest(monkeys: [Monkey]) -> [Monkey] { - return monkeys.filter { $0.silliness == .VerySilly } -} -``` - -现在有一个针对这个函数的单元测试: - -```swift -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) - XCTAssertTrue(contains(sillyMonkeys, kiki)) -} -``` - -这个测试运行失败,并返回以下信息: - -``` -XCTAssertTrue failed -``` - -![](http://f.cl.ly/items/1G17453p47090y30203d/Screen%20Shot%202015-02-26%20at%209.08.27%20AM.png) - -我们无法从失败信息中获得有用的东西,只能说:“好吧,原本预期为真的表达式,现在却为假。但这是为什么呢?” -像这样的困惑会降低我们的效率,因为我们现在不得不花时间理解这些测试代码。 - -## 更好的失败返回信息,第一部分:手动设定 `XCTAssert` 的返回信息 - -`XCTAssert` 这个断言(Assertion)允许我们设定运行失败时的返回信息(下面简称“返回信息”),这当然有一定的作用: - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki)) -+ XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -} -``` - -但是,我们就不得不亲自设置这些返回信息。 - -## 更好的失败返回信息,第二部分:Nimble 的返回信息 - -Nimble 能让你的测试断言及其返回信息更便于阅读: - -```diff -func testSilliest_whenMonkeysContainSillyMonkeys_theyreIncludedInTheResult() { - let kiki = Monkey(name: "Kiki", silliness: .ExtremelySilly) - let carl = Monkey(name: "Carl", silliness: .NotSilly) - let jane = Monkey(name: "Jane", silliness: .VerySilly) - let sillyMonkeys = silliest([kiki, carl, jane]) -- XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") -+ expect(sillyMonkeys).to(contain(kiki)) -} -``` - -我们不需要再亲自设置返回信息,因为 Nimble 提供的信息已经非常清楚了: - -``` -expected to contain , - got <[Monkey(name: Jane, silliness: VerySilly)]> -``` - -![](http://f.cl.ly/items/3N2e3g2K3W123b1L1J0G/Screen%20Shot%202015-02-26%20at%2011.27.02%20AM.png) - -这个返回信息清楚地点明了出错的地方:预期中 `kiki` 应该包含在 `silliest()` 的返回值里面,但是实际的返回值只包含 `jane` 。现在我们知道问题出在哪了,因此很容易解决问题: - -```diff -public func silliest(monkeys: [Monkey]) -> [Monkey] { -- return monkeys.filter { $0.silliness == .VerySilly } -+ return monkeys.filter { $0.silliness == .VerySilly || $0.silliness == .ExtremelySilly } -} -``` - -Nimble 提供了很多种类的断言,每个断言都带有清晰的返回信息。与 `XCTAssert` 不同,你不需要每次都亲自设定返回信息。 - -完整的 Nimble 断言列表,请参考 [Nimble README](https://github.com/Quick/Nimble) 。 -下面是一些例子,先睹为快: - -```swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickExamplesAndGroups.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickExamplesAndGroups.md deleted file mode 100644 index f17281d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickExamplesAndGroups.md +++ /dev/null @@ -1,461 +0,0 @@ -# 用 Quick 例子和例子群组织测试 - -Quick 使用特殊的语法定义**例子(examples)**和**例子群(example groups)**。 - -在*[编写高效的 XCTest 测试: Arrange,Act 和 Assert](ArrangeActAssert.md)*,我们了解了一个好的测试方法名称是至关重要的,尤其是当测试失败时。它能够帮助我们判断是修改程序代码或者是更新测试内容。 - -Quick 的例子和例子群主要有两个目的: - -1. 它们促使你使用具有描述性的测试名称。 -2. 它们极大地简化了 Arrange 步骤的测试代码。 - -## 例子:使用 `it` - -定义了 `it` 函数的例子,使用断言代码指明了程序应有的行为。这些就像 XCTest 中的测试方法一样。 - -`it` 函数有两个参数:例子的名称和闭包。下面这个例子具体说明了 `Sea.Dolphin` 类应有的行为。 -一只新的海豚(dolphin)应该是聪明(smart)且友好(friendly)的: - -```swift -// Swift - -import Quick -import Nimble -import Sea - -class DolphinSpec: QuickSpec { - override func spec() { - it("is friendly") { - expect(Dolphin().isFriendly).to(beTruthy()) - } - - it("is smart") { - expect(Dolphin().isSmart).to(beTruthy()) - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -it(@"is friendly", ^{ - expect(@([[Dolphin new] isFriendly])).to(beTruthy()); -}); - -it(@"is smart", ^{ - expect(@([[Dolphin new] isSmart])).to(beTruthy()); -}); - -QuickSpecEnd -``` - -用描述性的语言使例子所测试的内容清晰明了。 -描述性的语言可以是任意长度、任意字符的,涵盖了英语以及其他语言的字符,甚至可以是表情符号!:v: :sunglasses: - -## 例子群:使用 `describe` 和 `context` - -例子群是按一定逻辑关系组织的例子。例子群里可以共享配置(setup)和卸载(teardown)代码。 - -### 使用 `describe` 描述类和方法 - -为了具体说明 `Dolphin` 类中 `click` 方法的行为 —— 换句话说,为了验证这个方法可用 —— 我们可以把多个 `it` 例子用 `describe` 函数组织成为一个群。把相同的例子组织在一起能更方便阅读: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - describe("its click") { - it("is loud") { - let click = Dolphin().click() - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - let click = Dolphin().click() - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - describe(@"its click", ^{ - it(@"is loud", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - Click *click = [[Dolphin new] click]; - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -当这两个例子在 Xcode 中运行的时候,它们会从 `describe` 和 `it` 函数中输出一些描述性的语言: - -1. `DolphinSpec.a_dolphin_its_click_is_loud` -2. `DolphinSpec.a_dolphin_its_click_has_a_high_frequency` - -显然,这两个测试各自测试的内容都很清晰明了。 - -### 使用 `beforeEach` 和 `afterEach` 共享配置/卸载代码 - -例子群不仅使它包含的例子更清晰易懂,还有助于在群里共享配置和卸载的代码。 - -在下面的这个示例里,例子群中的每一个例子前面,都用 `beforeEach` 这个函数创建一种新类型的海豚以及它特定的叫声。 -这就保证了对每个例子进行了初始化: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { - dolphin = Dolphin() - } - - describe("its click") { - var click: Click! - beforeEach { - click = dolphin.click() - } - - it("is loud") { - expect(click.isLoud).to(beTruthy()) - } - - it("has a high frequency") { - expect(click.hasHighFrequency).to(beTruthy()) - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ - dolphin = [Dolphin new]; - }); - - describe(@"its click", ^{ - __block Click *click = nil; - beforeEach(^{ - click = [dolphin click]; - }); - - it(@"is loud", ^{ - expect(@(click.isLoud)).to(beTruthy()); - }); - - it(@"has a high frequency", ^{ - expect(@(click.hasHighFrequency)).to(beTruthy()); - }); - }); -}); - -QuickSpecEnd -``` - -对于海豚这个例子来说,像这样共享配置代码并不是一个很大的工程。但是对于更复杂的对象,共享代码能够省去大量写代码的时间! - -如果想在每个例子后面执行特定的代码,可以使用 `afterEach`。 - -### 使用 `context` 指定条件的行为 - -海豚使用叫声进行回声定位。当接近了它们感兴趣的东西时,海豚会发出一系列的超声波对其进行更准确的探测。 - -这个测试需要展示在不同环境下,`click` 方法的不同行为。通常,海豚只叫(click)一声。但是当海豚接近它们感兴趣的东西时,它会发出很多次叫声。 - -这种情况可以用 `context` 函数来表示:一个 `context` 代表正常情况,另一个 `context` 代表海豚接近感兴趣的东西: - -```swift -// Swift - -import Quick -import Nimble - -class DolphinSpec: QuickSpec { - override func spec() { - describe("a dolphin") { - var dolphin: Dolphin! - beforeEach { dolphin = Dolphin() } - - describe("its click") { - context("when the dolphin is not near anything interesting") { - it("is only emitted once") { - expect(dolphin!.click().count).to(equal(1)) - } - } - - context("when the dolphin is near something interesting") { - beforeEach { - let ship = SunkenShip() - Jamaica.dolphinCove.add(ship) - Jamaica.dolphinCove.add(dolphin) - } - - it("is emitted three times") { - expect(dolphin.click().count).to(equal(3)) - } - } - } - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickSpecBegin(DolphinSpec) - -describe(@"a dolphin", ^{ - __block Dolphin *dolphin = nil; - beforeEach(^{ dolphin = [Dolphin new]; }); - - describe(@"its click", ^{ - context(@"when the dolphin is not near anything interesting", ^{ - it(@"is only emitted once", ^{ - expect(@([[dolphin click] count])).to(equal(@1)); - }); - }); - - context(@"when the dolphin is near something interesting", ^{ - beforeEach(^{ - [[Jamaica dolphinCove] add:[SunkenShip new]]; - [[Jamaica dolphinCove] add:dolphin]; - }); - - it(@"is emitted three times", ^{ - expect(@([[dolphin click] count])).to(equal(@3)); - }); - }); - }); -}); - -QuickSpecEnd -``` - -严格地说,`context` 是 `describe` 的一种同义的表达,但是像这样有目的地使用能够让你的代码更容易理解。 - -### 测试的可读性:Quick 和 XCTest - -在*[编写高效的 XCTest 测试: Arrange,Act 和 Assert](ArrangeActAssert.md)*里,我们知道了对每种情况进行一个测试能够很方便地组织测试代码。 -在 XCTest 里,这样做会导致出现冗长的测试方法名称: - -```swift -func testDolphin_click_whenTheDolphinIsNearSomethingInteresting_isEmittedThreeTimes() { - // ... -} -``` - -使用 Quick ,每种情况会更容易阅读,并且我们能够为每一个例子群进行配置: - -```swift -describe("a dolphin") { - describe("its click") { - context("when the dolphin is near something interesting") { - it("is emitted three times") { - // ... - } - } - } -} -``` - -## 临时禁用例子或例子群 - -你可以临时禁用那些测试不通过的例子和例子群。 -这些例子的名称会随着测试结果一起打印在控制台里,但它们并不运行。 - -通过添加前缀 `x` 就能禁用例子或例子群: - -```swift -// Swift - -xdescribe("its click") { - // ...none of the code in this closure will be run. -} - -xcontext("when the dolphin is not near anything interesting") { - // ...none of the code in this closure will be run. -} - -xit("is only emitted once") { - // ...none of the code in this closure will be run. -} -``` - -```objc -// Objective-C - -xdescribe(@"its click", ^{ - // ...none of the code in this closure will be run. -}); - -xcontext(@"when the dolphin is not near anything interesting", ^{ - // ...none of the code in this closure will be run. -}); - -xit(@"is only emitted once", ^{ - // ...none of the code in this closure will be run. -}); -``` - -## 临时运行一部分例子 - -在某些情况下,只关注一个或几个例子有助于测试。毕竟只运行一两个例子比运行整个测试快多了。通过使用 `fit` 函数,你可以只运行一两个例子。你还可以使用 `fdescribe` 或 `fcontext` 把测试重点放在一个例子群: - -```swift -fit("is loud") { - // ...only this focused example will be run. -} - -it("has a high frequency") { - // ...this example is not focused, and will not be run. -} - -fcontext("when the dolphin is near something interesting") { - // ...examples in this group are also focused, so they'll be run. -} -``` - -```objc -fit(@"is loud", { - // ...only this focused example will be run. -}); - -it(@"has a high frequency", ^{ - // ...this example is not focused, and will not be run. -}); - -fcontext(@"when the dolphin is near something interesting", ^{ - // ...examples in this group are also focused, so they'll be run. -}); -``` - -## 使用 `beforeSuite` 和 `afterSuite` 进行全局配置/卸载 - -有一些测试的配置需要在所有例子运行之前进行。对于这种情况,可以使用 `beforeSuite` 和 `afterSuite` 。 - -下面的示例展示了在所有其他例子运行之前,创建一个包含了海洋中所有生物的数据库。当所有例子运行结束的时候,这个数据库就被卸载: - -```swift -// Swift - -import Quick - -class DolphinSpec: QuickSpec { - override func spec() { - beforeSuite { - OceanDatabase.createDatabase(name: "test.db") - OceanDatabase.connectToDatabase(name: "test.db") - } - - afterSuite { - OceanDatabase.teardownDatabase(name: "test.db") - } - - describe("a dolphin") { - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; - -QuickSpecBegin(DolphinSpec) - -beforeSuite(^{ - [OceanDatabase createDatabase:@"test.db"]; - [OceanDatabase connectToDatabase:@"test.db"]; -}); - -afterSuite(^{ - [OceanDatabase teardownDatabase:@"test.db"]; -}); - -describe(@"a dolphin", ^{ - // ... -}); - -QuickSpecEnd -``` - -你可以添加多个 `beforeSuite` 和 `afterSuite` 。所有的 -`beforeSuite` 闭包都会在其它测试运行前执行,同样,所有的 -`afterSuite` 闭包都会在其它测试运行结束后执行。 -但是这些闭包并不一定按先后顺序执行。 - -## 访问当前例子的元数据 - -在某些情况下,你会想知道当前运行的例子的名称,或者目前已经运行了多少例子。Quick 提供了闭包 `beforeEach` 和 `afterEach` ,通过这些闭包,可以访问元数据。 - -```swift -beforeEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) is about to be run.") -} - -afterEach { exampleMetadata in - println("Example number \(exampleMetadata.exampleIndex) has run.") -} -``` - -```objc -beforeEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l is about to be run.", (long)exampleMetadata.exampleIndex); -}); - -afterEachWithMetadata(^(ExampleMetadata *exampleMetadata){ - NSLog(@"Example number %l has run.", (long)exampleMetadata.exampleIndex); -}); -``` - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickInObjectiveC.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickInObjectiveC.md deleted file mode 100644 index 22318a0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/QuickInObjectiveC.md +++ /dev/null @@ -1,52 +0,0 @@ -# 在 Objective-C 中使用 Quick - -Quick 既支持 Swift ,也支持 Objective-C 。 - -但是,在 Objective-C 下使用 Quick 时,有以下两点需要注意。 - -## 可选的速记语法 - -在 Objective-C 文件中导入的 Quick 框架,包含了名为 `it` 和 -`itShouldBehaveLike` 的宏,还包含了名为 `context()` 和 `describe()` 的函数。 - -如果你在测试项目的时候,也定义了同名的量或者函数,那么就会出现错误。因此,这种情况下,你可以通过禁用 Quick 的可选速记语法来避免命名冲突: - -```objc -#define QUICK_DISABLE_SHORT_SYNTAX 1 - -@import Quick; - -QuickSpecBegin(DolphinSpec) -// ... -QuickSpecEnd -``` - -注意,必须在 `@import Quick;` 之前,定义宏:`QUICK_DISABLE_SHORT_SYNTAX` 。 - -当然,你也可以选择在测试目标(target)的设置里面定义宏: - -![](http://d.twobitlabs.com/VFEamhvixX.png) - -## 你的测试目标必需至少包含一个 Swift 文件 - -如果你的测试目标没有*至少包含一个 Swift 文件*,那么 Swift 标准库就不会链接到你的测试目标,因而会导致 Quick 无法正常编译。 - -当没有至少包含一个 Swift 文件时,测试运行后就会终止并且返回以下错误: - -``` -*** Test session exited(82) without checking in. Executable cannot be -loaded for some other reason, such as a problem with a library it -depends on or a code signature/entitlements mismatch. -``` - -只需要在测试目标下添加一个空的 Swift 文件,如 `SwiftSpec.swift` 就可以解决这个问题: - -```swift -// SwiftSpec.swift - -import Quick -``` - -> 更多关于这个问题的细节,请参考 https://github.com/Quick/Quick/issues/164 。 - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/README.md deleted file mode 100644 index 2c48f4c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# 文档 - -Quick 能够帮助你验证你的 Swift 和 Objective-C 程序的行为。然而,能提高你的测试技巧的不仅仅是了解如何使用 Quick。下面这些指南能够帮助你更有效地写测试 —— 不仅是和 Quick 相关的,更包括 XCTest 还有其他的测试框架。 - -每份指南都有一个主题。如果你对单元测试完全陌生,建议你按照从上往下的顺序阅读。 - -- **[在项目中添加测试](SettingUpYourXcodeProject.md)**:如果你遇到在项目中构建测试的问题,请阅读这份指南。 -- **[编写高效的 XCTest 测试: Arrange,Act 和 Assert](ArrangeActAssert.md)**:阅读这份指南来了解如何更高效快速地编写 `XCTestCase` 测试。 -- **[不要测试代码,而应该测试行为](BehavioralTesting.md)**:通过这份指南你能学习到哪些是好的测试,哪些是不好的测试。 -- **[测试 OS X 和 iOS 应用](TestingApps.md)**:了解如何为使用 AppKit 和 UIKit 框架的代码编写测试。 -- **[使用测试替身进行测试](TestUsingTestDoubles.md)**:阅读这份指南来了解什么是测试替身,以及如何使用它们。 -- **[使用 Shared Assertion 来复用测试模板代码](SharedExamples.md)**:学习如何在测试中共享测试代码。 -- **[配置 Quick 的行为](ConfiguringQuick.md)**:阅读这份指南来了解如何在运行测试代码时改变 Quick 的行为。 -- **[在 Objective-C 中使用 Quick](QuickInObjectiveC.md)**:如果你在 Objective-C 项目使用 Quick 的过程中遇到了困难,请阅读这份指南。 -- **[安装 Quick](InstallingQuick.md)**:通过这份指南了解在项目中添加 Quick 的方法:Git submodules,CocoaPods,Carthage 和 Swift Package Manager 。 -- **[安装 Quick 文件模板](InstallingFileTemplates.md)**:阅读这份指南来了解如何安装文件模板以提高编写 Quick specs 的效率。 -- **[更多资料](MoreResources.md)**:更多关于 OS X 和 iOS 测试的资源。 -- **[常见的问题](Troubleshooting.md)**:当你遇到问题的时候,请阅读这份指南。 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/SettingUpYourXcodeProject.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/SettingUpYourXcodeProject.md deleted file mode 100644 index e902c6f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/SettingUpYourXcodeProject.md +++ /dev/null @@ -1,75 +0,0 @@ -# 在项目中添加测试 - -除了命令行项目以外,当你在 Xcode 7 中创建新项目时,单元测试 Target 默认是包含的。[为命令行项目设置测试 Target](#setting-up-a-test-target-for-a-command-line-tool-project) 要编写单元测试,你需要能够在测试 Target 中使用主 target 代码。 - -## 用 Swift 测试 Swift 项目代码 - -为了测试用 Swift 写的代码,你需要做以下两件事: - -1. 将 `.xcodeproj` 中的 "defines module" 设置为 `YES`。 - - * Xcode 中具体操作方法:选中你的项目,选择 "Build Settings" 选项列表,选中 "Defines Modules" 行,修改其值为 "Yes"。 - -2. 在单元测试中添加 `@testable import YourAppModuleName`。这会把所有 `public` 和 `internal` (默认访问修饰符) 修饰符暴露给测试代码。但 `private` 修饰符仍旧保持私有。 - -```swift -// MyAppTests.swift - -import XCTest -@testable import MyModule - -class MyClassTests: XCTestCase { - // ... -} -``` - -> 一些开发者提倡添加 Swift 源文件至测试 target。然而这会导致以下问题 [subtle, hard-to-diagnose errors](https://github.com/Quick/Quick/issues/91),所以并不推荐。 - -## 使用 Swift 测试 Objective-C 项目代码 - -1. 给你的测试 target 添加 bridging header 文件。 -2. 在 bridging header 文件中,引入待测试的代码文件。 - -```objc -// MyAppTests-BridgingHeader.h - -#import "MyClass.h" -``` - -现在就可以在 Swift 测试文件中使用 `MyClass.h` 中的代码了。 - -## 使用 Objective-C 测试 Swift 项目代码 - -1. 使用 `@objc` 桥接需要使用 Objective-C 测试的 Swift 类和方法。 -2. 在单元测试中引入模块的 Swift 头文件。 - -```objc -@import XCTest; -#import "MyModule-Swift.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -## 使用 Objective-C 测试 Objective-C 项目代码 - -在测试 target 中引入待测试的代码文件: - -```objc -// MyAppTests.m - -@import XCTest; -#import "MyClass.h" - -@interface MyClassTests: XCTestCase -// ... -@end -``` - -### 为命令行项目设置测试 Target - -1. 在项目窗格中添加一个项目target。 -2. 选择 "OS X Unit Testing Bundle"。 -3. 编辑主target的 scheme。 -4. 选中 "Test" 条目,单击 "Info" 下的 "+",选择需要测试的 bundle。 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md deleted file mode 100644 index ec87138..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md +++ /dev/null @@ -1,113 +0,0 @@ -# 使用 Shared Assertion 来复用测试模板代码 - -在某种场合下,一些特定的测试代码可以应用在不同的对象上。 - -比如,假设有一个叫 `Edible` 的协议。当一只海豚吃了标识为 `Edible` 的食物时,它会变得高兴。`Mackerel` 和 `Cod` 都遵循 `Edible` 协议。这个时候,Quick 的 shared example(共享用例)能帮你更容易地测试 `Mackerel` 和 `Cod` 的行为。 - -下面的例子为一些 `Edible` 的食物定义了一组共享用例,以测试 mackerel 和 cod 的行为。 - -```swift -// Swift - -import Quick -import Nimble - -class EdibleSharedExamplesConfiguration: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in - it("makes dolphins happy") { - let dolphin = Dolphin(happy: false) - let edible = sharedExampleContext()["edible"] - dolphin.eat(edible) - expect(dolphin.isHappy).to(beTruthy()) - } - } - } -} - -class MackerelSpec: QuickSpec { - override func spec() { - var mackerel: Mackerel! - beforeEach { - mackerel = Mackerel() - } - - itBehavesLike("something edible") { ["edible": mackerel] } - } -} - -class CodSpec: QuickSpec { - override func spec() { - var cod: Cod! - beforeEach { - cod = Cod() - } - - itBehavesLike("something edible") { ["edible": cod] } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; - -QuickConfigurationBegin(EdibleSharedExamplesConfiguration) - -+ (void)configure:(Configuration *configuration) { - sharedExamples(@"something edible", ^(QCKDSLSharedExampleContext exampleContext) { - it(@"makes dolphins happy") { - Dolphin *dolphin = [[Dolphin alloc] init]; - dolphin.happy = NO; - id edible = exampleContext()[@"edible"]; - [dolphin eat:edible]; - expect(dolphin.isHappy).to(beTruthy()) - } - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(MackerelSpec) - -__block Mackerel *mackerel = nil; -beforeEach(^{ - mackerel = [[Mackerel alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": mackerel }; }); - -QuickSpecEnd - -QuickSpecBegin(CodSpec) - -__block Mackerel *cod = nil; -beforeEach(^{ - cod = [[Cod alloc] init]; -}); - -itBehavesLike(@"someting edible", ^{ return @{ @"edible": cod }; }); - -QuickSpecEnd -``` - -共享用例可以包括任意数量的 `it`, `context` 和 `describe` 代码块。当使用它们来测试不同对象的相同行为时,你可以少写*很多*不必要的重复代码。 - -一般来说,你使用共享用例进行测试时不需要依赖其他额外的对象。在 Swift 中,你可以简单地用一个不带参数的 `sharedExample` 闭包来使用共享用例。当你需要进行全局测试时,这很有用。 - -```swift -// Swift - -import Quick - -sharedExamples("everything under the sea") { - // ... -} - -itBehavesLike("everything under the sea") -``` -> 如果你使用 Objective-C 的话,你需要传入一个带 `QCKDSLSharedExampleContext` 参数的 block,即使你并不打算使用它。不好意思,你只能这样做,人生有时就是这么的无奈。:cookie: :bomb: - -你也可以使用 `fitBehavesLike` 函数来单独测试共享用例。 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/TestUsingTestDoubles.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/TestUsingTestDoubles.md deleted file mode 100644 index 9e83ead..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/TestUsingTestDoubles.md +++ /dev/null @@ -1,131 +0,0 @@ -# 使用模拟对象进行测试 - -## 测试替身 - -下面的问题在写测试时经常出现。比如:`Car` 依赖于/使用 `Tire` 。 - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesA.png) - -`CarTests` 用来测试调用了 `Tire` 的 `Car` 。这时候,在 `Tire` 里出现的 bug 会导致 `CarTests` 测试失败(即使 `Car` 是没有错误的)。 - -这时候很难说清楚到底是什么出错了。为了避免这个问题,我们可以使用一个替身对象,来代替 `CarTests` 里面的 `Tire` 。对于这个问题,我们会为 `Tire` 创建一个替身对象,命名为 `PerfectTire` 。 - -![](https://github.com/Quick/Assets/blob/master/Screenshots/TestUsingMock_BusesAmock.png) - -`PerfectTire` 具有和 `Tire` 一样的函数和属性。但是,这些函数和属性的实现可能会有所不同。 - -像 `PerfectTire` 这样的对象叫做“测试替身”。测试替身充当替身对象,用于独立测试多个相关对象的功能。以下是测试替身的几种类型: - -- 模拟对象:用于从测试类中接收输出。 -- 桩对象:用于为测试类提供输入。 -- 伪对象:具有与原来的类相似的行为。 - -我们先了解一下如何使用模拟对象。 - -## 模拟对象 - -模拟对象着眼于说明它与其它对象的正确交互,并且当出现错误时用来检测问题。模拟对象应该事先知道测试时会发生什么,并且该做出怎样的反应。 - -### 在 Swift 中使用模拟对象来写测试 - -#### 应用案例 - -例如,我们有一个应用,它会从互联网上获取数据。 - -* 在 `ViewController` 中展示从互联网上获取的数据。 -* 自定义类,实现 `DataProviderProtocol` ,负责获取数据。 - -`DataProviderProtocol` 如下定义: - -```swift -protocol DataProviderProtocol: class { - func fetch(callback: (data: String) -> Void) -} -``` - -`fetch()` 从互联网上获取数据,并通过闭包 `callback` 返回数据。 - -下面的 `DataProvider` 实现了 `DataProviderProtocol` 协议。 - -```swift -class DataProvider: NSObject, DataProviderProtocol { - func fetch(callback: (data: String) -> Void) { - let url = NSURL(string: "http://example.com/")! - let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) - let task = session.dataTaskWithURL(url, completionHandler: { - (data, resp, err) in - let string = NSString(data:data!, encoding:NSUTF8StringEncoding) as! String - callback(data: string) - }) - task.resume() - } -} -``` - -在我们这个场景里,`ViewController` 的 `viewDidLoad()` 里调用了 `fetch()` 。 - -```swift -class ViewController: UIViewController { - - // MARK: Properties - @IBOutlet weak var resultLabel: UILabel! - private var dataProvider: DataProviderProtocol? - - // MARK: View Controller Lifecycle - override func viewDidLoad() { - super.viewDidLoad() - - dataProvider = dataProvider ?? DataProvider() - - dataProvider?.fetch({ [unowned self] (data) -> Void in - self.resultLabel.text = data - }) - } -} -``` - -#### 用 `DataProviderProtocol` 协议的模拟对象进行测试 - -`ViewController` 依赖于 `DataProviderProtocol` 协议。为了测试这个 viewController ,要创建一个遵循 `DataProviderProtocol` 的模拟对象。 - -模拟对象是非常有用的。因为使用它,你可以: - -- 更快地运行测试。 -- 即使未联网也可以进行测试。 -- 对 `ViewController` 进行独立测试。 - -```swift -class MockDataProvider: NSObject, DataProviderProtocol { - var fetchCalled = false - func fetch(callback: (data: String) -> Void) { - fetchCalled = true - callback(data: "foobar") - } -} -``` - -当 `fetch()` 被调用的时候,`fetchCalled` 会被设为 `true` 。这样能使测试代码确认对象是否准备好进行测试。 - -下面的代码验证了当 `ViewController` 加载时,会运行 `dataProvider.fetch()` 。 - -```swift -override func spec() { - describe("view controller") { - it("fetch data with data provider") { - let mockProvier = MockDataProvider() - let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as! ViewController - viewController.dataProvier = mockProvier - - expect(mockProvier.fetchCalled).to(equal(false)) - - let _ = viewController.view - - expect(mockProvier.fetchCalled).to(equal(true)) - } - } -} -``` - -如果你对写测试感兴趣,想学习更多的内容,请参考 https://realm.io/news/testing-in-swift/ 。 - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/TestingApps.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/TestingApps.md deleted file mode 100644 index 59f68d8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/TestingApps.md +++ /dev/null @@ -1,174 +0,0 @@ -# 测试 OS X 和 iOS 应用 - -*[在项目中添加测试](SettingUpYourXcodeProject.md)* 这篇文章详细介绍了有关如何测试 Objective-C 和 Swift 的函数和类的内容。 -本文将介绍一些额外的技巧,用来测试**类**,如 `UIViewController` 及其子类。 - -> 你可以参考这个简短的 [Lightning Talk](https://vimeo.com/115671189#t=37m50s)(从37分50秒开始),它涵盖了绝大多数这方面的话题。 - -## 触发 `UIViewController` 生命周期事件 - -通常,当你的视图控制器(view controller)呈现在应用中,UIKit 会自动触发生命周期事件。然而,在测试 `UIViewController` 的时候,你需要自己手动触发这些事件。你可以通过以下任意一种方法来实现它: - -1. 通过访问 `UIViewController.view` 来触发事件,如: `UIViewController.viewDidLoad()` 。 -2. 使用 `UIViewController.beginAppearanceTransition()` 来触发大多数生命周期事件。 -3. 直接调用方法,如:`UIViewController.viewDidLoad()` 或 `UIViewController.viewWillAppear()` 。 - -```swift -// Swift - -import Quick -import Nimble -import BananaApp - -class BananaViewControllerSpec: QuickSpec { - override func spec() { - var viewController: BananaViewController! - beforeEach { - viewController = BananaViewController() - } - - describe(".viewDidLoad()") { - beforeEach { - // Method #1: Access the view to trigger BananaViewController.viewDidLoad(). - let _ = viewController.view - } - - it("sets the banana count label to zero") { - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal("0")) - } - } - - describe("the view") { - beforeEach { - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - viewController.beginAppearanceTransition(true, animated: false) - viewController.endAppearanceTransition() - } - // ... - } - - describe(".viewWillDisappear()") { - beforeEach { - // Method #3: Directly call the lifecycle event. - viewController.viewWillDisappear(false) - } - // ... - } - } -} -``` - -```objc -// Objective-C - -@import Quick; -@import Nimble; -#import "BananaViewController.h" - -QuickSpecBegin(BananaViewControllerSpec) - -__block BananaViewController *viewController = nil; -beforeEach(^{ - viewController = [[BananaViewController alloc] init]; -}); - -describe(@"-viewDidLoad", ^{ - beforeEach(^{ - // Method #1: Access the view to trigger -[BananaViewController viewDidLoad]. - [viewController view]; - }); - - it(@"sets the banana count label to zero", ^{ - // Since the label is only initialized when the view is loaded, this - // would fail if we didn't access the view in the `beforeEach` above. - expect(viewController.bananaCountLabel.text).to(equal(@"0")) - }); -}); - -describe(@"the view", ^{ - beforeEach(^{ - // Method #2: Triggers .viewDidLoad(), .viewWillAppear(), and .viewDidAppear() events. - [viewController beginAppearanceTransition:YES animated:NO]; - [viewController endAppearanceTransition]; - }); - // ... -}); - -describe(@"-viewWillDisappear", ^{ - beforeEach(^{ - // Method #3: Directly call the lifecycle event. - [viewController viewWillDisappear:NO]; - }); - // ... -}); - -QuickSpecEnd -``` - -## 初始化在故事板(Storyboard)中定义的视图控制器 - -为了初始化在故事板中定义的视图控制器,你需要先为它分配一个 **Storyboard ID** : - -![](http://f.cl.ly/items/2X2G381K1h1l2B2Q0g3L/Screen%20Shot%202015-02-27%20at%2011.58.06%20AM.png) - -为视图控制器分配 ID 后,就可以在测试中初始化了: - -```swift -// Swift - -var viewController: BananaViewController! -beforeEach { - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - let storyboard = UIStoryboard(name: "Main", bundle: nil) - // 2. Use the storyboard to instantiate the view controller. - viewController = - storyboard.instantiateViewControllerWithIdentifier( - "BananaViewControllerID") as! BananaViewController -} -``` - -```objc -// Objective-C - -__block BananaViewController *viewController = nil; -beforeEach(^{ - // 1. Instantiate the storyboard. By default, it's name is "Main.storyboard". - // You'll need to use a different string here if the name of your storyboard is different. - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; - // 2. Use the storyboard to instantiate the view controller. - viewController = [storyboard instantiateViewControllerWithIdentifier:@"BananaViewControllerID"]; -}); -``` - -## 触发 UIControl 事件(如:点击按钮) - -按钮以及其他继承自 `UIControl` 的 UIKit 类定义了一些方法,使我们能够通过程序代码发送控制事件,如:点击按钮。 -以下代码演示了如何测试点击按钮触发的行为: - -```swift -// Swift - -describe("the 'more bananas' button") { - it("increments the banana count label when tapped") { - viewController.moreButton.sendActionsForControlEvents( - UIControlEvents.TouchUpInside) - expect(viewController.bananaCountLabel.text).to(equal("1")) - } -} -``` - -```objc -// Objective-C - -describe(@"the 'more bananas' button", ^{ - it(@"increments the banana count label when tapped", ^{ - [viewController.moreButton sendActionsForControlEvents:UIControlEventTouchUpInside]; - expect(viewController.bananaCountLabel.text).to(equal(@"1")); - }); -}); -``` - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/Troubleshooting.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/Troubleshooting.md deleted file mode 100644 index c89e25e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Documentation/zh-cn/Troubleshooting.md +++ /dev/null @@ -1,10 +0,0 @@ -# 常见的安装问题 - -这里有一些解决方案,用来处理使用框架时遇到的一些问题。 - -## No such module 'Quick' - -- 如果你已经运行了 `pod install` ,那么关闭并重新打开 Xcode workspace 。如果这样做还没解决问题,那么请接着进行下面的步骤。 -- 删除 `~/Library/Developer/Xcode/DerivedData` **整个**目录,这里面包含了 `ModuleCache` 。 -- 在 Manage Schemes 对话框中,勾选 `Quick` 、`Nimble` 、`Pods-ProjectnameTests` ,然后重新编译它们(`Cmd+B`)。 - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.gitignore b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.gitignore deleted file mode 100644 index e50906d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -.DS_Store -**/xcuserdata/* -**/*.xccheckout -**/*.xcscmblueprint -build/ -.idea -DerivedData/ -Nimble.framework.zip - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -.build/ diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version deleted file mode 100644 index 9f55b2c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version +++ /dev/null @@ -1 +0,0 @@ -3.0 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml deleted file mode 100644 index 3e2f896..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -osx_image: xcode8 -language: generic -matrix: - include: - - os: osx - sudo: required - env: TYPE=podspec - - os: osx - env: TYPE=ios NIMBLE_RUNTIME_IOS_SDK_VERSION=10.0 - - os: osx - env: TYPE=tvos NIMBLE_RUNTIME_TVOS_SDK_VERSION=10.0 - - os: osx - env: TYPE=macos - - os: osx - env: TYPE=swiftpm - - os: linux - dist: trusty - sudo: required - env: TYPE=swiftpm - install: - - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/9f442512a46d7a2af7b850d65a7e9bd31edfb09b/swiftenv-install.sh)" -install: - - if [[ "$TYPE" == "podspec" ]]; then sudo gem install bundler; bundle install; fi -script: - - ./test $TYPE diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/CONTRIBUTING.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/CONTRIBUTING.md deleted file mode 100644 index d9c4ba6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/CONTRIBUTING.md +++ /dev/null @@ -1,120 +0,0 @@ - - - -- [Welcome to Nimble!](#welcome-to-nimble!) - - [Reporting Bugs](#reporting-bugs) - - [Building the Project](#building-the-project) - - [Pull Requests](#pull-requests) - - [Style Conventions](#style-conventions) - - [Core Members](#core-members) - - [Code of Conduct](#code-of-conduct) - - - -# Welcome to Nimble! - -We're building a testing framework for a new generation of Swift and -Objective-C developers. - -Nimble should be easy to use and easy to maintain. Let's keep things -simple and well-tested. - -**tl;dr:** If you've added a file to the project, make sure it's -included in both the OS X and iOS targets. - -## Reporting Bugs - -Nothing is off-limits. If you're having a problem, we want to hear about -it. - -- See a crash? File an issue. -- Code isn't compiling, but you don't know why? Sounds like you should - submit a new issue, bud. -- Went to the kitchen, only to forget why you went in the first place? - Better submit an issue. - -Be sure to include in your issue: - -- Your Xcode version (eg - Xcode 7.0.1 7A1001) -- Your version of Nimble (eg - v2.0.0 or git sha `20a3f3b4e63cc8d97c92c4164bf36f2a2c9a6e1b`) -- What are the steps to reproduce this issue? -- What platform are you using? (eg - OS X, iOS, watchOS, tvOS) -- If the problem is on a UI Testing Bundle, Unit Testing Bundle, or some other target configuration -- Are you using carthage or cocoapods? - -## Building the Project - -- Use `Nimble.xcodeproj` to work on Nimble. - -## Running the Swift Package Manager tests - -1. Install `swiftenv` by running a line from the build script (`.travis.yml`): - - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/02090c7ede5a637b76e6df1710e83cd0bbe7dcdf/swiftenv-install.sh)" - -2. Run `./test swiftpm` - -## Pull Requests - -- Nothing is trivial. Submit pull requests for anything: typos, - whitespace, you name it. -- Not all pull requests will be merged, but all will be acknowledged. If - no one has provided feedback on your request, ping one of the owners - by name. -- Make sure your pull request includes any necessary updates to the - README or other documentation. -- Be sure the unit tests for both the OS X and iOS targets of Nimble - before submitting your pull request. You can run all the OS X & iOS unit - tests using `./test`. -- If you've added a file to the project, make sure it's included in both - the OS X and iOS targets. -- The `master` branch will always support the stable Xcode version. Other - branches will point to their corresponding versions they support. -- If you're making a configuration change, make sure to edit both the xcode - project and the podspec file. - -### Style Conventions - -- Indent using 4 spaces. -- Keep lines 100 characters or shorter. Break long statements into - shorter ones over multiple lines. -- In Objective-C, use `#pragma mark -` to mark public, internal, - protocol, and superclass methods. - -## Core Members - -If a few of your pull requests have been merged, and you'd like a -controlling stake in the project, file an issue asking for write access -to the repository. - -### Code of Conduct - -Your conduct as a core member is your own responsibility, but here are -some "ground rules": - -- Feel free to push whatever you want to master, and (if you have - ownership permissions) to create any repositories you'd like. - - Ideally, however, all changes should be submitted as GitHub pull - requests. No one should merge their own pull request, unless no - other core members respond for at least a few days. - - If you'd like to create a new repository, it'd be nice if you created - a GitHub issue and gathered some feedback first. - -- It'd be awesome if you could review, provide feedback on, and close - issues or pull requests submitted to the project. Please provide kind, - constructive feedback. Please don't be sarcastic or snarky. - -### Creating a Release - -The process is relatively straight forward, but here's is a useful checklist for tagging: - -- Look at changes from the previously tagged release and write release notes: `git log v0.4.0...HEAD` -- Run the release script: `./script/release A.B.C release-notes-file` -- The script will prompt you to create a new [GitHub release](https://github.com/Quick/Nimble/releases). - - Use the same release notes you created for the tag, but tweak up formatting for GitHub. -- Update [Quick](https://github.com/Quick/Quick) - - Update Quick's submodule reference to the newly released Nimble version - - Update Nimble version in `README.md` and Documentation in [Quick](https://github.com/Quick/Quick) if it's not a patch version update. -- Announce! diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile deleted file mode 100644 index a6dc312..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -# A sample Gemfile -source "https://rubygems.org" - -gem 'cocoapods', '1.1.0.rc.3' diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock deleted file mode 100644 index 87dc02b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock +++ /dev/null @@ -1,69 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (4.2.7.1) - i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - claide (1.0.1) - cocoapods (1.1.0.rc.3) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.1, < 2.0) - cocoapods-core (= 1.1.0.rc.3) - cocoapods-deintegrate (>= 1.0.1, < 2.0) - cocoapods-downloader (>= 1.1.1, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (= 1.1.0.beta.1) - cocoapods-try (>= 1.1.0, < 2.0) - colored (~> 1.2) - escape (~> 0.0.4) - fourflusher (~> 2.0) - gh_inspector (~> 1.0) - molinillo (~> 0.5.1) - nap (~> 1.0) - xcodeproj (>= 1.3.2, < 2.0) - cocoapods-core (1.1.0.rc.3) - activesupport (>= 4.0.2, < 5) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.1) - cocoapods-downloader (1.1.1) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.0.0) - cocoapods-trunk (1.1.0.beta.1) - nap (>= 0.8, < 2.0) - netrc (= 0.7.8) - cocoapods-try (1.1.0) - colored (1.2) - escape (0.0.4) - fourflusher (2.0.1) - fuzzy_match (2.0.4) - gh_inspector (1.0.2) - i18n (0.7.0) - json (1.8.3) - minitest (5.9.1) - molinillo (0.5.1) - nap (1.1.0) - netrc (0.7.8) - thread_safe (0.3.5) - tzinfo (1.2.2) - thread_safe (~> 0.1) - xcodeproj (1.3.2) - activesupport (>= 3) - claide (>= 1.0.1, < 2.0) - colored (~> 1.2) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods (= 1.1.0.rc.3) - -BUNDLED WITH - 1.13.1 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/LICENSE.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/LICENSE.md deleted file mode 100644 index 0f3eb71..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/LICENSE.md +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014 Quick Team - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec deleted file mode 100644 index 8ca36a1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec +++ /dev/null @@ -1,47 +0,0 @@ -Pod::Spec.new do |s| - s.name = "Nimble" - s.version = "5.1.1" - s.summary = "A Matcher Framework for Swift and Objective-C" - s.description = <<-DESC - Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by Cedar. - DESC - s.homepage = "https://github.com/Quick/Nimble" - s.license = { :type => "Apache 2.0", :file => "LICENSE.md" } - s.author = "Quick Contributors" - s.ios.deployment_target = "8.0" - s.osx.deployment_target = "10.10" - s.tvos.deployment_target = "9.0" - s.source = { :git => "https://github.com/Quick/Nimble.git", - :tag => "v#{s.version}" } - - s.source_files = "Sources/**/*.{swift,h,m,c}" - - s.osx.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift", - ] - s.ios.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift", - ] - s.tvos.exclude_files = [ - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift", - "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.{h,c}", - "Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift", - "Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.m", - ] - - s.private_header_files = "Sources/NimbleObjectiveC/CurrentTestCaseTracker.h" - s.tvos.private_header_files = "Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h" - - s.exclude_files = "Sources/Nimble/Adapters/NonObjectiveC/*.swift" - s.weak_framework = "XCTest" - s.requires_arc = true - s.compiler_flags = '-DPRODUCT_NAME=Nimble/Nimble' - s.pod_target_xcconfig = { - 'ENABLE_BITCODE' => 'NO', - 'OTHER_LDFLAGS' => '-weak-lswiftXCTest', - 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks"', - } -end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj deleted file mode 100644 index 7c2c084..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2102 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1F0648CC19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F0648CD19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F0648D41963AAB2001F9C46 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F0648D51963AAB2001F9C46 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F14FB64194180C5009F2A08 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F1871C51CA89EDB00A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871C61CA89EDB00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871C71CA89EDB00A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871C81CA89EDB00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871C91CA89EDB00A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871CA1CA89EDB00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871CB1CA89EDB00A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871CC1CA89EDB00A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871D21CA89EEE00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871D31CA89EEE00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871D41CA89EEE00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871D61CA89EEF00A34BF2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BD1CA89EDB00A34BF2 /* DSL.m */; }; - 1F1871D71CA89EEF00A34BF2 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */; }; - 1F1871D81CA89EEF00A34BF2 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */; }; - 1F1871D91CA89EF100A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871DA1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871DB1CA89EF100A34BF2 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */; }; - 1F1871DC1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */; }; - 1F1871DD1CA89EF500A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871DE1CA89EF500A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871DF1CA89EF500A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E01CA89EF600A34BF2 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BC1CA89EDB00A34BF2 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E11CA89EF600A34BF2 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E21CA89EF600A34BF2 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1871E41CA89FB600A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E61CA89FCD00A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1871E71CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E81CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */; }; - 1F1871E91CA8A18700A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1871EB1CA8A18800A34BF2 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */; }; - 1F1A742F1940169200FFFC47 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1A74351940169200FFFC47 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F1A74291940169200FFFC47 /* Nimble.framework */; }; - 1F1B5AD41963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F299EAC19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F2D175B1DB618ED00EE9C7A /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0261C6D0BB0000693EE /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F2D175C1DB618F000EE9C7A /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0221C6D0B82000693EE /* mach_excServer.c */; }; - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F43728C1A1B343C00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F43728E1A1B343F00EB80F8 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F43728F1A1B344000EB80F8 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F4999A61DBF2DD100BF8877 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F4A56661A3B305F009E1637 /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - 1F4A56671A3B305F009E1637 /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - 1F4A566A1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - 1F4A566B1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - 1F4A566D1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - 1F4A566E1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - 1F4A56701A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - 1F4A56711A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - 1F4A56731A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - 1F4A56741A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - 1F4A56761A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - 1F4A56771A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - 1F4A56791A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - 1F4A567A1A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - 1F4A567C1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - 1F4A567D1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - 1F4A567F1A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - 1F4A56801A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - 1F4A56821A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - 1F4A56831A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - 1F4A56851A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - 1F4A56861A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - 1F4A56881A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - 1F4A56891A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - 1F4A568B1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - 1F4A568C1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - 1F4A568E1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - 1F4A568F1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - 1F4A56911A3B344A009E1637 /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - 1F4A56921A3B344A009E1637 /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - 1F4A56941A3B346F009E1637 /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - 1F4A56951A3B346F009E1637 /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - 1F4A56971A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - 1F4A56981A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - 1F4A569A1A3B3539009E1637 /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - 1F4A569B1A3B3539009E1637 /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - 1F4A569D1A3B3565009E1637 /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - 1F4A569E1A3B3565009E1637 /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - 1F4A56A01A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - 1F4A56A11A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - 1F4BB8A41DAC9DC90048464B /* CwlCatchBadInstructionPOSIX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB89D1DAC9D930048464B /* CwlCatchBadInstructionPOSIX.swift */; }; - 1F4BB8AB1DAC9DE50048464B /* CwlCatchBadInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F4BB8AE1DAC9DED0048464B /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0161C6D0B2F000693EE /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F4BB8B61DACA0E30048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8B71DACA0E40048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8B81DACAACF0048464B /* ThrowAssertionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */; }; - 1F4BB8BA1DACBFCF0048464B /* CwlCatchBadInstruction.m in Sources */ = {isa = PBXBuildFile; fileRef = 9630C00B1C6D0B18000693EE /* CwlCatchBadInstruction.m */; }; - 1F4BB8BB1DACBFD00048464B /* CwlCatchBadInstruction.m in Sources */ = {isa = PBXBuildFile; fileRef = 9630C00B1C6D0B18000693EE /* CwlCatchBadInstruction.m */; }; - 1F5DF15F1BDCA0CE00C3A531 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */; }; - 1F5DF16C1BDCA0F500C3A531 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1F5DF16D1BDCA0F500C3A531 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1F5DF16E1BDCA0F500C3A531 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1F5DF16F1BDCA0F500C3A531 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1F5DF1701BDCA0F500C3A531 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1F5DF1711BDCA0F500C3A531 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - 1F5DF1721BDCA0F500C3A531 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1F5DF1741BDCA0F500C3A531 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1F5DF1751BDCA0F500C3A531 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1F5DF1761BDCA0F500C3A531 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - 1F5DF1771BDCA0F500C3A531 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1F5DF1781BDCA0F500C3A531 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1F5DF1791BDCA0F500C3A531 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1F5DF17A1BDCA0F500C3A531 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1F5DF17B1BDCA0F500C3A531 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1F5DF17C1BDCA0F500C3A531 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1F5DF17D1BDCA0F500C3A531 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1F5DF17E1BDCA0F500C3A531 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1F5DF17F1BDCA0F500C3A531 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1F5DF1801BDCA0F500C3A531 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1F5DF1811BDCA0F500C3A531 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1F5DF1821BDCA0F500C3A531 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1F5DF1831BDCA0F500C3A531 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1F5DF1841BDCA0F500C3A531 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1F5DF1851BDCA0F500C3A531 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1F5DF1861BDCA0F500C3A531 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - 1F5DF1881BDCA0F500C3A531 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - 1F5DF1891BDCA0F500C3A531 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F5DF18C1BDCA0F500C3A531 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; - 1F5DF18E1BDCA0F500C3A531 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; - 1F5DF1921BDCA10200C3A531 /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F5DF1931BDCA10200C3A531 /* SynchronousTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */; }; - 1F5DF1941BDCA10200C3A531 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - 1F5DF1951BDCA10200C3A531 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F5DF1961BDCA10200C3A531 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; - 1F5DF1971BDCA10200C3A531 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - 1F5DF1981BDCA10200C3A531 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; - 1F5DF1991BDCA10200C3A531 /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F5DF19A1BDCA10200C3A531 /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F5DF19B1BDCA10200C3A531 /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F5DF19C1BDCA10200C3A531 /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F5DF19D1BDCA10200C3A531 /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F5DF19E1BDCA10200C3A531 /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F5DF19F1BDCA10200C3A531 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - 1F5DF1A01BDCA10200C3A531 /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1F5DF1A11BDCA10200C3A531 /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F5DF1A21BDCA10200C3A531 /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F5DF1A31BDCA10200C3A531 /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F5DF1A41BDCA10200C3A531 /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F5DF1A51BDCA10200C3A531 /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F5DF1A61BDCA10200C3A531 /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F5DF1A71BDCA10200C3A531 /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F5DF1A81BDCA10200C3A531 /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 1F5DF1A91BDCA10200C3A531 /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - 1F5DF1AA1BDCA10200C3A531 /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F5DF1AB1BDCA10200C3A531 /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 1F8A37B01B7C5042001C8357 /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - 1F8A37B11B7C5042001C8357 /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - 1F91DD2D1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD2E1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD2F1C74BF36002C309F /* BeVoidTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */; }; - 1F91DD311C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F91DD321C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F91DD331C74BF61002C309F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F91DD301C74BF61002C309F /* BeVoid.swift */; }; - 1F925EB8195C0D6300ED456B /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F925EAD195C0D6300ED456B /* Nimble.framework */; }; - 1F925EC7195C0DD100ED456B /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1A742E1940169200FFFC47 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F925EE2195C0DFD00ED456B /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F14FB63194180C5009F2A08 /* utils.swift */; }; - 1F925EE6195C121200ED456B /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F925EE7195C121200ED456B /* AsynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE5195C121200ED456B /* AsynchronousTest.swift */; }; - 1F925EE9195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F925EEA195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */; }; - 1F925EEC195C12C800ED456B /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F925EED195C12C800ED456B /* RaisesExceptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */; }; - 1F925EEF195C136500ED456B /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F925EF0195C136500ED456B /* BeLogicalTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EEE195C136500ED456B /* BeLogicalTest.swift */; }; - 1F925EF6195C147800ED456B /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F925EF7195C147800ED456B /* BeCloseToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF5195C147800ED456B /* BeCloseToTest.swift */; }; - 1F925EF9195C175000ED456B /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F925EFA195C175000ED456B /* BeNilTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EF8195C175000ED456B /* BeNilTest.swift */; }; - 1F925EFC195C186800ED456B /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F925EFD195C186800ED456B /* BeginWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFB195C186800ED456B /* BeginWithTest.swift */; }; - 1F925EFF195C187600ED456B /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F925F00195C187600ED456B /* EndWithTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925EFE195C187600ED456B /* EndWithTest.swift */; }; - 1F925F02195C189500ED456B /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F925F03195C189500ED456B /* ContainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F01195C189500ED456B /* ContainTest.swift */; }; - 1F925F05195C18B700ED456B /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F925F06195C18B700ED456B /* EqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F04195C18B700ED456B /* EqualTest.swift */; }; - 1F925F08195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F925F09195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */; }; - 1F925F0B195C18E100ED456B /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F925F0C195C18E100ED456B /* BeLessThanTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */; }; - 1F925F0E195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F925F0F195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */; }; - 1F925F11195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F925F12195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */; }; - 1F9DB8FB1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - 1F9DB8FC1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - 1FB90098195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1FB90099195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */; }; - 1FC494AA1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FC494AB1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FC494AC1C29CBA40010975C /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */; }; - 1FCF914F1C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91501C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91511C61C85A00B15DCB /* PostNotificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */; }; - 1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FCF91551C61C8A400B15DCB /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCF91521C61C8A400B15DCB /* PostNotification.swift */; }; - 1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1FD8CD2F1968AB07008ED995 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */; }; - 1FD8CD301968AB07008ED995 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1FD8CD311968AB07008ED995 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */; }; - 1FD8CD321968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1FD8CD331968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */; }; - 1FD8CD341968AB07008ED995 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1FD8CD351968AB07008ED995 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD081968AB07008ED995 /* DSL.swift */; }; - 1FD8CD361968AB07008ED995 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1FD8CD371968AB07008ED995 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD091968AB07008ED995 /* Expectation.swift */; }; - 1FD8CD381968AB07008ED995 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1FD8CD391968AB07008ED995 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0A1968AB07008ED995 /* Expression.swift */; }; - 1FD8CD3A1968AB07008ED995 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1FD8CD3B1968AB07008ED995 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */; }; - 1FD8CD3C1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1FD8CD3D1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */; }; - 1FD8CD3E1968AB07008ED995 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1FD8CD3F1968AB07008ED995 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */; }; - 1FD8CD401968AB07008ED995 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1FD8CD411968AB07008ED995 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */; }; - 1FD8CD421968AB07008ED995 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1FD8CD431968AB07008ED995 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD101968AB07008ED995 /* BeEmpty.swift */; }; - 1FD8CD441968AB07008ED995 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1FD8CD451968AB07008ED995 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD111968AB07008ED995 /* BeginWith.swift */; }; - 1FD8CD461968AB07008ED995 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1FD8CD471968AB07008ED995 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */; }; - 1FD8CD481968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1FD8CD491968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */; }; - 1FD8CD4A1968AB07008ED995 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1FD8CD4B1968AB07008ED995 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */; }; - 1FD8CD4C1968AB07008ED995 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1FD8CD4D1968AB07008ED995 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD151968AB07008ED995 /* BeLessThan.swift */; }; - 1FD8CD4E1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1FD8CD4F1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */; }; - 1FD8CD501968AB07008ED995 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1FD8CD511968AB07008ED995 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD171968AB07008ED995 /* BeLogical.swift */; }; - 1FD8CD521968AB07008ED995 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1FD8CD531968AB07008ED995 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD181968AB07008ED995 /* BeNil.swift */; }; - 1FD8CD561968AB07008ED995 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1FD8CD571968AB07008ED995 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1A1968AB07008ED995 /* Contain.swift */; }; - 1FD8CD581968AB07008ED995 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1FD8CD591968AB07008ED995 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1B1968AB07008ED995 /* EndWith.swift */; }; - 1FD8CD5A1968AB07008ED995 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1FD8CD5B1968AB07008ED995 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1C1968AB07008ED995 /* Equal.swift */; }; - 1FD8CD5C1968AB07008ED995 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - 1FD8CD5D1968AB07008ED995 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; - 1FD8CD5E1968AB07008ED995 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1FD8CD5F1968AB07008ED995 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; - 1FD8CD6A1968AB07008ED995 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1FD8CD6B1968AB07008ED995 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Async.swift */; }; - 1FDBD8671AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 1FDBD8681AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */; }; - 29EA59631B551ED2002D767E /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 29EA59641B551ED2002D767E /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; - 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 472FD1351B9E085700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 472FD1391B9E0A9700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; - 472FD13A1B9E0A9F00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 472FD13B1B9E0CFE00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; - 4793854D1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - 4793854E1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - 6CAEDD0A1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 6CAEDD0B1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 6CAEDD0C1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; - 7B5358BA1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BB1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BC1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */; }; - 7B5358BE1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 7B5358BF1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 7B5358C01C38479700A23FAA /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */; }; - 9630C00D1C6D0B18000693EE /* CwlCatchBadInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C00E1C6D0B18000693EE /* CwlCatchBadInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C0131C6D0B18000693EE /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C00C1C6D0B18000693EE /* CwlCatchBadInstruction.swift */; }; - 9630C0141C6D0B18000693EE /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C00C1C6D0B18000693EE /* CwlCatchBadInstruction.swift */; }; - 9630C0191C6D0B2F000693EE /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0161C6D0B2F000693EE /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C01A1C6D0B2F000693EE /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0161C6D0B2F000693EE /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C01C1C6D0B2F000693EE /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0171C6D0B2F000693EE /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 9630C01D1C6D0B2F000693EE /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0171C6D0B2F000693EE /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 9630C01F1C6D0B2F000693EE /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0181C6D0B2F000693EE /* CwlCatchException.swift */; }; - 9630C0201C6D0B2F000693EE /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0181C6D0B2F000693EE /* CwlCatchException.swift */; }; - 9630C0231C6D0B82000693EE /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9630C0221C6D0B82000693EE /* mach_excServer.c */; }; - 9630C0271C6D0BB0000693EE /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9630C0261C6D0BB0000693EE /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9630C02C1C6D125F000693EE /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C02B1C6D125F000693EE /* CwlBadInstructionException.swift */; }; - 9630C02D1C6D125F000693EE /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C02B1C6D125F000693EE /* CwlBadInstructionException.swift */; }; - 9630C0301C6D139F000693EE /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C02F1C6D139F000693EE /* CwlDarwinDefinitions.swift */; }; - 9630C0311C6D139F000693EE /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9630C02F1C6D139F000693EE /* CwlDarwinDefinitions.swift */; }; - 964CFEFD1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 964CFEFE1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 964CFEFF1C4FF48900513336 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */; }; - 965B0D091B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - 965B0D0A1B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - 965B0D0C1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - 965B0D0D1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */; }; - AE4BA9AD1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE4BA9AE1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE4BA9AF1C88DDB500B73906 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4BA9AC1C88DDB500B73906 /* Errors.swift */; }; - AE7ADE451C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE461C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE471C80BF8000B94CD3 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE441C80BF8000B94CD3 /* MatchError.swift */; }; - AE7ADE491C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - AE7ADE4A1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - AE7ADE4B1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; }; - CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; - CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; - CD79C9A01D2CC839004B6F9A /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; - CD79C9A11D2CC83B004B6F9A /* ObjCBeCloseToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */; }; - CD79C9A21D2CC83E004B6F9A /* ObjCBeEmptyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */; }; - CD79C9A31D2CC841004B6F9A /* ObjCBeFalseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */; }; - CD79C9A41D2CC848004B6F9A /* ObjCBeFalsyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */; }; - CD79C9A51D2CC848004B6F9A /* ObjCBeginWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */; }; - CD79C9A61D2CC848004B6F9A /* ObjCBeGreaterThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */; }; - CD79C9A71D2CC848004B6F9A /* ObjCBeGreaterThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */; }; - CD79C9A81D2CC848004B6F9A /* ObjCBeIdenticalToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */; }; - CD79C9A91D2CC848004B6F9A /* ObjCBeKindOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */; }; - CD79C9AA1D2CC848004B6F9A /* ObjCBeLessThanOrEqualToTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */; }; - CD79C9AB1D2CC848004B6F9A /* ObjCBeLessThanTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */; }; - CD79C9AC1D2CC848004B6F9A /* ObjCBeNilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */; }; - CD79C9AD1D2CC848004B6F9A /* ObjCBeTrueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */; }; - CD79C9AE1D2CC848004B6F9A /* ObjCBeTruthyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */; }; - CD79C9AF1D2CC848004B6F9A /* ObjCContainTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */; }; - CD79C9B01D2CC848004B6F9A /* ObjCEndWithTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */; }; - CD79C9B11D2CC848004B6F9A /* ObjCEqualTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */; }; - CD79C9B21D2CC848004B6F9A /* ObjCHaveCount.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */; }; - CD79C9B31D2CC848004B6F9A /* ObjCMatchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */; }; - CD79C9B41D2CC848004B6F9A /* ObjCRaiseExceptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */; }; - CD79C9B51D2CC848004B6F9A /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; - CD79C9B61D2CC848004B6F9A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - CD79C9B71D2CC848004B6F9A /* ObjCSatisfyAnyOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */; }; - DA9E8C821A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - DA9E8C831A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; - DD72EC641A93874A002F7651 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - DD72EC651A93874A002F7651 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; - DD9A9A8F19CF439B00706F49 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - DD9A9A9019CF43AD00706F49 /* BeIdenticalToObjectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */; }; - DDB1BC791A92235600F743C3 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - DDB1BC7A1A92235600F743C3 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB1BC781A92235600F743C3 /* AllPass.swift */; }; - DDB4D5ED19FE43C200E9D9FE /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; - DDB4D5F019FE442800E9D9FE /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - DDB4D5F119FE442800E9D9FE /* MatchTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */; }; - DDEFAEB41A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - DDEFAEB51A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; - F8A1BE2F1CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; - F8A1BE301CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; - F8A1BE311CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1F1A74361940169200FFFC47 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = "Nimble-iOS"; - }; - 1F5DF1601BDCA0CE00C3A531 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F5DF1541BDCA0CE00C3A531; - remoteInfo = "Nimble-tvOS"; - }; - 1F6BB82A1968BFF9009F1DBB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = "Nimble-iOS"; - }; - 1F925EA4195C0C8500ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = Nimble; - }; - 1F925EA6195C0C8500ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = Nimble; - }; - 1F925EB9195C0D6300ED456B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-OSX"; - }; - 1F9B7BFD1968AD760094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-OSX"; - }; - 1F9B7BFF1968AD760094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-OSX"; - }; - 1F9B7C011968AD820094EB8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F1A74201940169200FFFC47 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F925EAC195C0D6300ED456B; - remoteInfo = "Nimble-OSX"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectWithLazyProperty.swift; sourceTree = ""; }; - 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronousTests.swift; sourceTree = ""; }; - 1F14FB63194180C5009F2A08 /* utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = utils.swift; sourceTree = ""; }; - 1F1871BC1CA89EDB00A34BF2 /* DSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DSL.h; sourceTree = ""; }; - 1F1871BD1CA89EDB00A34BF2 /* DSL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DSL.m; sourceTree = ""; }; - 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMBExceptionCapture.h; sourceTree = ""; }; - 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NMBExceptionCapture.m; sourceTree = ""; }; - 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMBStringify.h; sourceTree = ""; }; - 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NMBStringify.m; sourceTree = ""; }; - 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NMBExpectation.swift; sourceTree = ""; }; - 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NMBObjCMatcher.swift; sourceTree = ""; }; - 1F1871CD1CA89EE000A34BF2 /* ExceptionCapture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExceptionCapture.swift; sourceTree = ""; }; - 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncMatcherWrapper.swift; sourceTree = ""; }; - 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherFunc.swift; sourceTree = ""; }; - 1F1A74291940169200FFFC47 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F1A742D1940169200FFFC47 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F1A742E1940169200FFFC47 /* Nimble.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Nimble.h; sourceTree = ""; }; - 1F1A74341940169200FFFC47 /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F1A743A1940169200FFFC47 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAKindOfTest.swift; sourceTree = ""; }; - 1F2752D119445B8400052A26 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; lineEnding = 0; path = README.md; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.markdown; }; - 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeEmptyTest.swift; sourceTree = ""; }; - 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCAsyncTest.m; sourceTree = ""; }; - 1F4A56681A3B3074009E1637 /* NimbleSpecHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NimbleSpecHelper.h; sourceTree = ""; }; - 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeAnInstanceOfTest.m; sourceTree = ""; }; - 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeKindOfTest.m; sourceTree = ""; }; - 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeCloseToTest.m; sourceTree = ""; }; - 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeginWithTest.m; sourceTree = ""; }; - 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeGreaterThanTest.m; sourceTree = ""; }; - 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeGreaterThanOrEqualToTest.m; sourceTree = ""; }; - 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeIdenticalToTest.m; sourceTree = ""; }; - 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeLessThanTest.m; sourceTree = ""; }; - 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeLessThanOrEqualToTest.m; sourceTree = ""; }; - 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeTruthyTest.m; sourceTree = ""; }; - 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeFalsyTest.m; sourceTree = ""; }; - 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeTrueTest.m; sourceTree = ""; }; - 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeFalseTest.m; sourceTree = ""; }; - 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeNilTest.m; sourceTree = ""; }; - 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCContainTest.m; sourceTree = ""; }; - 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCEndWithTest.m; sourceTree = ""; }; - 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCEqualTest.m; sourceTree = ""; }; - 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCMatchTest.m; sourceTree = ""; }; - 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCRaiseExceptionTest.m; sourceTree = ""; }; - 1F4BB89D1DAC9D930048464B /* CwlCatchBadInstructionPOSIX.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstructionPOSIX.swift; path = CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift; sourceTree = ""; }; - 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowAssertionTest.swift; sourceTree = ""; }; - 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCSyncTest.m; sourceTree = ""; }; - 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeVoidTest.swift; sourceTree = ""; }; - 1F91DD301C74BF61002C309F /* BeVoid.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeVoid.swift; sourceTree = ""; }; - 1F925EAD195C0D6300ED456B /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NimbleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F925EE5195C121200ED456B /* AsynchronousTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsynchronousTest.swift; sourceTree = ""; }; - 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAnInstanceOfTest.swift; sourceTree = ""; }; - 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RaisesExceptionTest.swift; sourceTree = ""; }; - 1F925EEE195C136500ED456B /* BeLogicalTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLogicalTest.swift; sourceTree = ""; }; - 1F925EF5195C147800ED456B /* BeCloseToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeCloseToTest.swift; sourceTree = ""; }; - 1F925EF8195C175000ED456B /* BeNilTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeNilTest.swift; sourceTree = ""; }; - 1F925EFB195C186800ED456B /* BeginWithTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeginWithTest.swift; sourceTree = ""; }; - 1F925EFE195C187600ED456B /* EndWithTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndWithTest.swift; sourceTree = ""; }; - 1F925F01195C189500ED456B /* ContainTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainTest.swift; sourceTree = ""; }; - 1F925F04195C18B700ED456B /* EqualTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EqualTest.swift; sourceTree = ""; }; - 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThanTest.swift; sourceTree = ""; }; - 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThanTest.swift; sourceTree = ""; }; - 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThanOrEqualToTest.swift; sourceTree = ""; }; - 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThanOrEqualToTest.swift; sourceTree = ""; }; - 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCBeEmptyTest.m; sourceTree = ""; }; - 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeIdenticalToTest.swift; sourceTree = ""; }; - 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleEnvironment.swift; sourceTree = ""; }; - 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostNotificationTest.swift; sourceTree = ""; }; - 1FCF91521C61C8A400B15DCB /* PostNotification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostNotification.swift; sourceTree = ""; }; - 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionRecorder.swift; sourceTree = ""; }; - 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdapterProtocols.swift; sourceTree = ""; }; - 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleXCTestHandler.swift; sourceTree = ""; }; - 1FD8CD081968AB07008ED995 /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSL.swift; sourceTree = ""; }; - 1FD8CD091968AB07008ED995 /* Expectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expectation.swift; sourceTree = ""; }; - 1FD8CD0A1968AB07008ED995 /* Expression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expression.swift; sourceTree = ""; }; - 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FailureMessage.swift; sourceTree = ""; }; - 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAnInstanceOf.swift; sourceTree = ""; }; - 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeAKindOf.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeCloseTo.swift; sourceTree = ""; }; - 1FD8CD101968AB07008ED995 /* BeEmpty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeEmpty.swift; sourceTree = ""; }; - 1FD8CD111968AB07008ED995 /* BeginWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeginWith.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeGreaterThan.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeGreaterThanOrEqualTo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeIdenticalTo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD151968AB07008ED995 /* BeLessThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLessThan.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLessThanOrEqual.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD171968AB07008ED995 /* BeLogical.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeLogical.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD181968AB07008ED995 /* BeNil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BeNil.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD1A1968AB07008ED995 /* Contain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Contain.swift; sourceTree = ""; }; - 1FD8CD1B1968AB07008ED995 /* EndWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndWith.swift; sourceTree = ""; }; - 1FD8CD1C1968AB07008ED995 /* Equal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Equal.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherProtocols.swift; sourceTree = ""; }; - 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RaisesException.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD251968AB07008ED995 /* Functional.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Functional.swift; sourceTree = ""; }; - 1FD8CD261968AB07008ED995 /* Async.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Async.swift; sourceTree = ""; }; - 1FD8CD271968AB07008ED995 /* SourceLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SourceLocation.swift; sourceTree = ""; }; - 1FD8CD281968AB07008ED995 /* Stringers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stringers.swift; sourceTree = ""; }; - 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionDispatcher.swift; sourceTree = ""; }; - 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowErrorTest.swift; sourceTree = ""; }; - 29EA59651B551EE6002D767E /* ThrowError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowError.swift; sourceTree = ""; }; - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestCaseProvider.swift; sourceTree = ""; }; - 472FD1341B9E085700C7B8DA /* HaveCount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCount.swift; sourceTree = ""; }; - 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCountTest.swift; sourceTree = ""; }; - 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCHaveCount.m; sourceTree = ""; }; - 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinuxSupport.swift; sourceTree = ""; }; - 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SatisfyAnyOfTest.swift; sourceTree = ""; }; - 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SatisfyAnyOf.swift; sourceTree = ""; }; - 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCSatisfyAnyOfTest.m; sourceTree = ""; }; - 8DF1C3F61C94FC75004B2D36 /* ObjcStringersTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjcStringersTest.m; sourceTree = ""; }; - 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CwlCatchBadInstruction.h; path = CwlPreconditionTesting/CwlCatchBadInstruction.h; sourceTree = ""; }; - 9630C00B1C6D0B18000693EE /* CwlCatchBadInstruction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CwlCatchBadInstruction.m; path = CwlPreconditionTesting/CwlCatchBadInstruction.m; sourceTree = ""; }; - 9630C00C1C6D0B18000693EE /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = ""; }; - 9630C0161C6D0B2F000693EE /* CwlCatchException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CwlCatchException.h; path = CwlCatchException/CwlCatchException/CwlCatchException.h; sourceTree = ""; }; - 9630C0171C6D0B2F000693EE /* CwlCatchException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = CwlCatchException/CwlCatchException/CwlCatchException.m; sourceTree = ""; }; - 9630C0181C6D0B2F000693EE /* CwlCatchException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlCatchException.swift; path = CwlCatchException/CwlCatchException/CwlCatchException.swift; sourceTree = ""; }; - 9630C0221C6D0B82000693EE /* mach_excServer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mach_excServer.c; path = CwlPreconditionTesting/mach_excServer.c; sourceTree = ""; }; - 9630C0261C6D0BB0000693EE /* mach_excServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = CwlPreconditionTesting/mach_excServer.h; sourceTree = ""; }; - 9630C02B1C6D125F000693EE /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; - 9630C02F1C6D139F000693EE /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; - 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowAssertion.swift; sourceTree = ""; }; - 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCUserDescriptionTest.m; sourceTree = ""; }; - 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDescriptionTest.swift; sourceTree = ""; }; - AE4BA9AC1C88DDB500B73906 /* Errors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = ""; }; - AE7ADE441C80BF8000B94CD3 /* MatchError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchError.swift; sourceTree = ""; }; - AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchErrorTest.swift; sourceTree = ""; }; - DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DSL+Wait.swift"; sourceTree = ""; }; - DD72EC631A93874A002F7651 /* AllPassTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllPassTest.swift; sourceTree = ""; }; - DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeIdenticalToObjectTest.swift; sourceTree = ""; }; - DDB1BC781A92235600F743C3 /* AllPass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllPass.swift; sourceTree = ""; }; - DDB4D5EC19FE43C200E9D9FE /* Match.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Match.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchTest.swift; sourceTree = ""; }; - DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCAllPassTest.m; sourceTree = ""; }; - F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCTestObservationCenter+Register.m"; sourceTree = ""; }; - F8A1BE321CB3777F00031679 /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CurrentTestCaseTracker.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1F1A74251940169200FFFC47 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74311940169200FFFC47 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F1A74351940169200FFFC47 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1511BDCA0CE00C3A531 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15B1BDCA0CE00C3A531 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F5DF15F1BDCA0CE00C3A531 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EA9195C0D6300ED456B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB4195C0D6300ED456B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F925EB8195C0D6300ED456B /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1F14FB61194180A7009F2A08 /* Helpers */ = { - isa = PBXGroup; - children = ( - 1F14FB63194180C5009F2A08 /* utils.swift */, - 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */, - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 1F1871B91CA89E1B00A34BF2 /* NimbleObjectiveC */ = { - isa = PBXGroup; - children = ( - F8A1BE321CB3777F00031679 /* CurrentTestCaseTracker.h */, - 1F1871BC1CA89EDB00A34BF2 /* DSL.h */, - 1F1871BD1CA89EDB00A34BF2 /* DSL.m */, - 1F1871BE1CA89EDB00A34BF2 /* NMBExceptionCapture.h */, - 1F1871BF1CA89EDB00A34BF2 /* NMBExceptionCapture.m */, - 1F1871C01CA89EDB00A34BF2 /* NMBStringify.h */, - 1F1871C11CA89EDB00A34BF2 /* NMBStringify.m */, - F8A1BE2B1CB3710900031679 /* XCTestObservationCenter+Register.m */, - ); - name = NimbleObjectiveC; - path = Sources/NimbleObjectiveC; - sourceTree = ""; - }; - 1F1871BA1CA89E2500A34BF2 /* NonObjectiveC */ = { - isa = PBXGroup; - children = ( - 1F1871CD1CA89EE000A34BF2 /* ExceptionCapture.swift */, - ); - path = NonObjectiveC; - sourceTree = ""; - }; - 1F1A741F1940169200FFFC47 = { - isa = PBXGroup; - children = ( - 1F2752D119445B8400052A26 /* README.md */, - 1F1A742B1940169200FFFC47 /* Nimble */, - 1F1871B91CA89E1B00A34BF2 /* NimbleObjectiveC */, - 1F1A74381940169200FFFC47 /* NimbleTests */, - 9630C0081C6D0AB3000693EE /* Lib */, - 1F1A742A1940169200FFFC47 /* Products */, - ); - indentWidth = 4; - sourceTree = ""; - tabWidth = 4; - usesTabs = 0; - }; - 1F1A742A1940169200FFFC47 /* Products */ = { - isa = PBXGroup; - children = ( - 1F1A74291940169200FFFC47 /* Nimble.framework */, - 1F1A74341940169200FFFC47 /* NimbleTests.xctest */, - 1F925EAD195C0D6300ED456B /* Nimble.framework */, - 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */, - 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */, - 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 1F1A742B1940169200FFFC47 /* Nimble */ = { - isa = PBXGroup; - children = ( - 1FD8CD041968AB07008ED995 /* Adapters */, - 1FD8CD081968AB07008ED995 /* DSL.swift */, - DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */, - 1FD8CD091968AB07008ED995 /* Expectation.swift */, - 1FD8CD0A1968AB07008ED995 /* Expression.swift */, - 1FD8CD0B1968AB07008ED995 /* FailureMessage.swift */, - 1F1A742D1940169200FFFC47 /* Info.plist */, - 1FD8CD0C1968AB07008ED995 /* Matchers */, - 1F1A742E1940169200FFFC47 /* Nimble.h */, - 1FD8CD241968AB07008ED995 /* Utils */, - ); - name = Nimble; - path = Sources/Nimble; - sourceTree = ""; - }; - 1F1A74381940169200FFFC47 /* NimbleTests */ = { - isa = PBXGroup; - children = ( - 1F925EE5195C121200ED456B /* AsynchronousTest.swift */, - 1F0648D31963AAB2001F9C46 /* SynchronousTests.swift */, - 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */, - 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */, - 1FFD729A1963FC8200CD29A2 /* objc */, - 1F14FB61194180A7009F2A08 /* Helpers */, - 1F925EE3195C11B000ED456B /* Matchers */, - 1F1A74391940169200FFFC47 /* Supporting Files */, - ); - name = NimbleTests; - path = Tests/NimbleTests; - sourceTree = ""; - }; - 1F1A74391940169200FFFC47 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 1F1A743A1940169200FFFC47 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 1F925EE3195C11B000ED456B /* Matchers */ = { - isa = PBXGroup; - children = ( - DD72EC631A93874A002F7651 /* AllPassTest.swift */, - 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */, - 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */, - 1F925EF5195C147800ED456B /* BeCloseToTest.swift */, - 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */, - 1F925EFB195C186800ED456B /* BeginWithTest.swift */, - 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */, - 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */, - DD9A9A8D19CF413800706F49 /* BeIdenticalToObjectTest.swift */, - 1FB90097195EC4B8001D7FAE /* BeIdenticalToTest.swift */, - 1F925F0D195C18F500ED456B /* BeLessThanOrEqualToTest.swift */, - 1F925F0A195C18E100ED456B /* BeLessThanTest.swift */, - 1F925EEE195C136500ED456B /* BeLogicalTest.swift */, - 1F925EF8195C175000ED456B /* BeNilTest.swift */, - 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */, - 1F925F01195C189500ED456B /* ContainTest.swift */, - 1F925EFE195C187600ED456B /* EndWithTest.swift */, - 1F925F04195C18B700ED456B /* EqualTest.swift */, - 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */, - DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */, - 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */, - 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */, - 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */, - 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */, - AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */, - 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */, - ); - path = Matchers; - sourceTree = ""; - }; - 1FD8CD041968AB07008ED995 /* Adapters */ = { - isa = PBXGroup; - children = ( - 1FD8CD061968AB07008ED995 /* AdapterProtocols.swift */, - 1FDBD8661AF8A4FF0089F27B /* AssertionDispatcher.swift */, - 1FD8CD051968AB07008ED995 /* AssertionRecorder.swift */, - 1FC494A91C29CBA40010975C /* NimbleEnvironment.swift */, - 1FD8CD071968AB07008ED995 /* NimbleXCTestHandler.swift */, - 1F1871BA1CA89E2500A34BF2 /* NonObjectiveC */, - 1F1871C21CA89EDB00A34BF2 /* NMBExpectation.swift */, - 1F1871C31CA89EDB00A34BF2 /* NMBObjCMatcher.swift */, - ); - path = Adapters; - sourceTree = ""; - }; - 1FD8CD0C1968AB07008ED995 /* Matchers */ = { - isa = PBXGroup; - children = ( - DDB1BC781A92235600F743C3 /* AllPass.swift */, - 1F1871E31CA89FB600A34BF2 /* AsyncMatcherWrapper.swift */, - 1FD8CD0E1968AB07008ED995 /* BeAKindOf.swift */, - 1FD8CD0D1968AB07008ED995 /* BeAnInstanceOf.swift */, - 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */, - 1FD8CD101968AB07008ED995 /* BeEmpty.swift */, - 1FD8CD111968AB07008ED995 /* BeginWith.swift */, - 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */, - 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */, - 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */, - 1FD8CD151968AB07008ED995 /* BeLessThan.swift */, - 1FD8CD161968AB07008ED995 /* BeLessThanOrEqual.swift */, - 1FD8CD171968AB07008ED995 /* BeLogical.swift */, - 1FD8CD181968AB07008ED995 /* BeNil.swift */, - 1F91DD301C74BF61002C309F /* BeVoid.swift */, - 1FD8CD1A1968AB07008ED995 /* Contain.swift */, - 1FD8CD1B1968AB07008ED995 /* EndWith.swift */, - 1FD8CD1C1968AB07008ED995 /* Equal.swift */, - 472FD1341B9E085700C7B8DA /* HaveCount.swift */, - DDB4D5EC19FE43C200E9D9FE /* Match.swift */, - 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */, - 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */, - AE7ADE441C80BF8000B94CD3 /* MatchError.swift */, - 1FCF91521C61C8A400B15DCB /* PostNotification.swift */, - 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */, - 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */, - 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */, - 29EA59651B551EE6002D767E /* ThrowError.swift */, - ); - path = Matchers; - sourceTree = ""; - }; - 1FD8CD241968AB07008ED995 /* Utils */ = { - isa = PBXGroup; - children = ( - 1FD8CD251968AB07008ED995 /* Functional.swift */, - 1FD8CD261968AB07008ED995 /* Async.swift */, - 1FD8CD271968AB07008ED995 /* SourceLocation.swift */, - 1FD8CD281968AB07008ED995 /* Stringers.swift */, - AE4BA9AC1C88DDB500B73906 /* Errors.swift */, - ); - path = Utils; - sourceTree = ""; - }; - 1FFD729A1963FC8200CD29A2 /* objc */ = { - isa = PBXGroup; - children = ( - 1F4A56681A3B3074009E1637 /* NimbleSpecHelper.h */, - 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */, - 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */, - 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */, - 1F4A566F1A3B319F009E1637 /* ObjCBeCloseToTest.m */, - 1F9DB8FA1A74E793002E96AD /* ObjCBeEmptyTest.m */, - 1F4A568D1A3B342B009E1637 /* ObjCBeFalseTest.m */, - 1F4A56871A3B33CB009E1637 /* ObjCBeFalsyTest.m */, - 1F4A56721A3B3210009E1637 /* ObjCBeginWithTest.m */, - 1F4A56781A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m */, - 1F4A56751A3B3253009E1637 /* ObjCBeGreaterThanTest.m */, - 1F4A567B1A3B3311009E1637 /* ObjCBeIdenticalToTest.m */, - 1F4A566C1A3B3159009E1637 /* ObjCBeKindOfTest.m */, - 1F4A56811A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m */, - 1F4A567E1A3B333F009E1637 /* ObjCBeLessThanTest.m */, - 1F4A56901A3B344A009E1637 /* ObjCBeNilTest.m */, - 1F4A568A1A3B3407009E1637 /* ObjCBeTrueTest.m */, - 1F4A56841A3B33A0009E1637 /* ObjCBeTruthyTest.m */, - 1F4A56931A3B346F009E1637 /* ObjCContainTest.m */, - 1F4A56961A3B34AA009E1637 /* ObjCEndWithTest.m */, - 1F4A56991A3B3539009E1637 /* ObjCEqualTest.m */, - 4793854C1BA0BB2500296F85 /* ObjCHaveCount.m */, - 1F4A569C1A3B3565009E1637 /* ObjCMatchTest.m */, - 1F4A569F1A3B359E009E1637 /* ObjCRaiseExceptionTest.m */, - 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */, - DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */, - 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */, - 8DF1C3F61C94FC75004B2D36 /* ObjcStringersTest.m */, - ); - path = objc; - sourceTree = ""; - }; - 9630C0081C6D0AB3000693EE /* Lib */ = { - isa = PBXGroup; - children = ( - 9630C0091C6D0ABA000693EE /* CwlPreconditionTesting */, - ); - name = Lib; - path = Sources/Lib; - sourceTree = ""; - }; - 9630C0091C6D0ABA000693EE /* CwlPreconditionTesting */ = { - isa = PBXGroup; - children = ( - 1F4BB89D1DAC9D930048464B /* CwlCatchBadInstructionPOSIX.swift */, - 9630C02B1C6D125F000693EE /* CwlBadInstructionException.swift */, - 9630C00C1C6D0B18000693EE /* CwlCatchBadInstruction.swift */, - 9630C00A1C6D0B18000693EE /* CwlCatchBadInstruction.h */, - 9630C00B1C6D0B18000693EE /* CwlCatchBadInstruction.m */, - 9630C0181C6D0B2F000693EE /* CwlCatchException.swift */, - 9630C0161C6D0B2F000693EE /* CwlCatchException.h */, - 9630C0171C6D0B2F000693EE /* CwlCatchException.m */, - 9630C02F1C6D139F000693EE /* CwlDarwinDefinitions.swift */, - 9630C0261C6D0BB0000693EE /* mach_excServer.h */, - 9630C0221C6D0B82000693EE /* mach_excServer.c */, - ); - path = CwlPreconditionTesting; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 1F1A74261940169200FFFC47 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9630C00D1C6D0B18000693EE /* CwlCatchBadInstruction.h in Headers */, - 9630C0191C6D0B2F000693EE /* CwlCatchException.h in Headers */, - 1F1871C91CA89EDB00A34BF2 /* NMBStringify.h in Headers */, - 1F1871C51CA89EDB00A34BF2 /* DSL.h in Headers */, - 1F1871C71CA89EDB00A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F1A742F1940169200FFFC47 /* Nimble.h in Headers */, - 9630C0271C6D0BB0000693EE /* mach_excServer.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1521BDCA0CE00C3A531 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4BB8AE1DAC9DED0048464B /* CwlCatchException.h in Headers */, - 1F1871E21CA89EF600A34BF2 /* NMBStringify.h in Headers */, - 1F1871E01CA89EF600A34BF2 /* DSL.h in Headers */, - 1F1871E11CA89EF600A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F4BB8AB1DAC9DE50048464B /* CwlCatchBadInstruction.h in Headers */, - 1F4999A61DBF2DD100BF8877 /* Nimble.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EAA195C0D6300ED456B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9630C00E1C6D0B18000693EE /* CwlCatchBadInstruction.h in Headers */, - 9630C01A1C6D0B2F000693EE /* CwlCatchException.h in Headers */, - 1F2D175B1DB618ED00EE9C7A /* mach_excServer.h in Headers */, - 1F1871DF1CA89EF500A34BF2 /* NMBStringify.h in Headers */, - 1F1871DD1CA89EF500A34BF2 /* DSL.h in Headers */, - 1F1871DE1CA89EF500A34BF2 /* NMBExceptionCapture.h in Headers */, - 1F925EC7195C0DD100ED456B /* Nimble.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1F1A74281940169200FFFC47 /* Nimble-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F1A743F1940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOS" */; - buildPhases = ( - 1F1A74241940169200FFFC47 /* Sources */, - 1F1A74251940169200FFFC47 /* Frameworks */, - 1F1A74261940169200FFFC47 /* Headers */, - 1F1A74271940169200FFFC47 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-iOS"; - productName = "Nimble-iOS"; - productReference = 1F1A74291940169200FFFC47 /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F1A74331940169200FFFC47 /* Nimble-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F1A74421940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOSTests" */; - buildPhases = ( - 1F1A74301940169200FFFC47 /* Sources */, - 1F1A74311940169200FFFC47 /* Frameworks */, - 1F1A74321940169200FFFC47 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F1A74371940169200FFFC47 /* PBXTargetDependency */, - 1F925EA5195C0C8500ED456B /* PBXTargetDependency */, - 1F925EA7195C0C8500ED456B /* PBXTargetDependency */, - 1F6BB82B1968BFF9009F1DBB /* PBXTargetDependency */, - ); - name = "Nimble-iOSTests"; - productName = "Nimble-iOSTests"; - productReference = 1F1A74341940169200FFFC47 /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F5DF16A1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOS" */; - buildPhases = ( - 1F5DF1501BDCA0CE00C3A531 /* Sources */, - 1F5DF1511BDCA0CE00C3A531 /* Frameworks */, - 1F5DF1521BDCA0CE00C3A531 /* Headers */, - 1F5DF1531BDCA0CE00C3A531 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-tvOS"; - productName = "Nimble-tvOS"; - productReference = 1F5DF1551BDCA0CE00C3A531 /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F5DF15D1BDCA0CE00C3A531 /* Nimble-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F5DF16B1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOSTests" */; - buildPhases = ( - 1F5DF15A1BDCA0CE00C3A531 /* Sources */, - 1F5DF15B1BDCA0CE00C3A531 /* Frameworks */, - 1F5DF15C1BDCA0CE00C3A531 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F5DF1611BDCA0CE00C3A531 /* PBXTargetDependency */, - ); - name = "Nimble-tvOSTests"; - productName = "Nimble-tvOSTests"; - productReference = 1F5DF15E1BDCA0CE00C3A531 /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F925EAC195C0D6300ED456B /* Nimble-macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F925EC0195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOS" */; - buildPhases = ( - 1F925EA8195C0D6300ED456B /* Sources */, - 1F925EA9195C0D6300ED456B /* Frameworks */, - 1F925EAA195C0D6300ED456B /* Headers */, - 1F925EAB195C0D6300ED456B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nimble-macOS"; - productName = "Nimble-OSX"; - productReference = 1F925EAD195C0D6300ED456B /* Nimble.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F925EB6195C0D6300ED456B /* Nimble-macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F925EC3195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOSTests" */; - buildPhases = ( - 1F925EB3195C0D6300ED456B /* Sources */, - 1F925EB4195C0D6300ED456B /* Frameworks */, - 1F925EB5195C0D6300ED456B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F925EBA195C0D6300ED456B /* PBXTargetDependency */, - 1F9B7BFE1968AD760094EB8F /* PBXTargetDependency */, - 1F9B7C001968AD760094EB8F /* PBXTargetDependency */, - 1F9B7C021968AD820094EB8F /* PBXTargetDependency */, - ); - name = "Nimble-macOSTests"; - productName = "Nimble-OSXTests"; - productReference = 1F925EB7195C0D6300ED456B /* NimbleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 1F1A74201940169200FFFC47 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0800; - ORGANIZATIONNAME = "Jeff Hui"; - TargetAttributes = { - 1F1A74281940169200FFFC47 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - }; - 1F1A74331940169200FFFC47 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - TestTargetID = 1F1A74281940169200FFFC47; - }; - 1F5DF1541BDCA0CE00C3A531 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 1F5DF15D1BDCA0CE00C3A531 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 1F925EAC195C0D6300ED456B = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - }; - 1F925EB6195C0D6300ED456B = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - TestTargetID = 1F925EAC195C0D6300ED456B; - }; - }; - }; - buildConfigurationList = 1F1A74231940169200FFFC47 /* Build configuration list for PBXProject "Nimble" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 1F1A741F1940169200FFFC47; - productRefGroup = 1F1A742A1940169200FFFC47 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1F925EAC195C0D6300ED456B /* Nimble-macOS */, - 1F925EB6195C0D6300ED456B /* Nimble-macOSTests */, - 1F1A74281940169200FFFC47 /* Nimble-iOS */, - 1F1A74331940169200FFFC47 /* Nimble-iOSTests */, - 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */, - 1F5DF15D1BDCA0CE00C3A531 /* Nimble-tvOSTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1F1A74271940169200FFFC47 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74321940169200FFFC47 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1531BDCA0CE00C3A531 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15C1BDCA0CE00C3A531 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EAB195C0D6300ED456B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB5195C0D6300ED456B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1F1A74241940169200FFFC47 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1FD8CD401968AB07008ED995 /* BeCloseTo.swift in Sources */, - 1F1871C81CA89EDB00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1FD8CD361968AB07008ED995 /* Expectation.swift in Sources */, - 1FD8CD321968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */, - 1F43728F1A1B344000EB80F8 /* Stringers.swift in Sources */, - 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */, - 1FD8CD4E1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, - 1FDBD8671AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */, - AE4BA9AD1C88DDB500B73906 /* Errors.swift in Sources */, - 1FD8CD3C1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, - 1FD8CD501968AB07008ED995 /* BeLogical.swift in Sources */, - 1F1871CB1CA89EDB00A34BF2 /* NMBExpectation.swift in Sources */, - DA9E8C821A414BB9002633C2 /* DSL+Wait.swift in Sources */, - DDB1BC791A92235600F743C3 /* AllPass.swift in Sources */, - 1FD8CD3E1968AB07008ED995 /* BeAKindOf.swift in Sources */, - DDB4D5ED19FE43C200E9D9FE /* Match.swift in Sources */, - 1F91DD311C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */, - 1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */, - 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */, - 1FD8CD5A1968AB07008ED995 /* Equal.swift in Sources */, - 1FD8CD4C1968AB07008ED995 /* BeLessThan.swift in Sources */, - 1F1871CC1CA89EDB00A34BF2 /* NMBObjCMatcher.swift in Sources */, - 1FD8CD461968AB07008ED995 /* BeGreaterThan.swift in Sources */, - F8A1BE2F1CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F1871C61CA89EDB00A34BF2 /* DSL.m in Sources */, - 1FD8CD301968AB07008ED995 /* AdapterProtocols.swift in Sources */, - AE7ADE451C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1F4BB8BA1DACBFCF0048464B /* CwlCatchBadInstruction.m in Sources */, - 1FC494AA1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1FD8CD5E1968AB07008ED995 /* RaisesException.swift in Sources */, - 1FD8CD561968AB07008ED995 /* Contain.swift in Sources */, - 1FD8CD481968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */, - 1FD8CD441968AB07008ED995 /* BeginWith.swift in Sources */, - 1FD8CD4A1968AB07008ED995 /* BeIdenticalTo.swift in Sources */, - 1F1871E61CA89FCD00A34BF2 /* MatcherFunc.swift in Sources */, - 1FD8CD421968AB07008ED995 /* BeEmpty.swift in Sources */, - 1F1871E41CA89FB600A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1F1871CA1CA89EDB00A34BF2 /* NMBStringify.m in Sources */, - 1FD8CD521968AB07008ED995 /* BeNil.swift in Sources */, - 1FD8CD6A1968AB07008ED995 /* Async.swift in Sources */, - 1FD8CD581968AB07008ED995 /* EndWith.swift in Sources */, - 1FD8CD5C1968AB07008ED995 /* MatcherProtocols.swift in Sources */, - 1FD8CD341968AB07008ED995 /* DSL.swift in Sources */, - 7B5358BE1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1FD8CD381968AB07008ED995 /* Expression.swift in Sources */, - 1FD8CD3A1968AB07008ED995 /* FailureMessage.swift in Sources */, - 472FD1351B9E085700C7B8DA /* HaveCount.swift in Sources */, - 9630C0301C6D139F000693EE /* CwlDarwinDefinitions.swift in Sources */, - 9630C0231C6D0B82000693EE /* mach_excServer.c in Sources */, - 9630C01F1C6D0B2F000693EE /* CwlCatchException.swift in Sources */, - 9630C0131C6D0B18000693EE /* CwlCatchBadInstruction.swift in Sources */, - 9630C01C1C6D0B2F000693EE /* CwlCatchException.m in Sources */, - 9630C02C1C6D125F000693EE /* CwlBadInstructionException.swift in Sources */, - 964CFEFD1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F1A74301940169200FFFC47 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4A569A1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, - 1F925EEC195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, - 1F925EFF195C187600ED456B /* EndWithTest.swift in Sources */, - 1F1B5AD41963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, - 1F925F0E195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, - 1F4A56661A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, - 1F925EFC195C186800ED456B /* BeginWithTest.swift in Sources */, - 1F14FB64194180C5009F2A08 /* utils.swift in Sources */, - DDB4D5F019FE442800E9D9FE /* MatchTest.swift in Sources */, - 1F4A56731A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */, - 1F4A56821A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 1F925F02195C189500ED456B /* ContainTest.swift in Sources */, - 1F4A56881A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */, - 1F4A568E1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */, - 1F925F11195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F925EEF195C136500ED456B /* BeLogicalTest.swift in Sources */, - 1F4A56A01A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */, - 1F925F0B195C18E100ED456B /* BeLessThanTest.swift in Sources */, - 1F9DB8FB1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */, - 1FB90098195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */, - 1F91DD2D1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 1F4A56761A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, - 1F925EF9195C175000ED456B /* BeNilTest.swift in Sources */, - 1F4A56701A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, - 1F4A56971A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */, - 1F4A567C1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */, - 965B0D0C1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */, - 1FCF914F1C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - 965B0D091B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */, - 1F4A56911A3B344A009E1637 /* ObjCBeNilTest.m in Sources */, - 1F8A37B01B7C5042001C8357 /* ObjCSyncTest.m in Sources */, - 1F4A56941A3B346F009E1637 /* ObjCContainTest.m in Sources */, - 1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */, - 1F925EF6195C147800ED456B /* BeCloseToTest.swift in Sources */, - 1F4A56791A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - AE7ADE491C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 1F4A568B1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */, - DDEFAEB41A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */, - 1F4A567F1A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */, - 1F925EE6195C121200ED456B /* AsynchronousTest.swift in Sources */, - 1F0648CC19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */, - 1F4A56851A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */, - DD9A9A8F19CF439B00706F49 /* BeIdenticalToObjectTest.swift in Sources */, - 1F4BB8B71DACA0E40048464B /* ThrowAssertionTest.swift in Sources */, - 1F0648D41963AAB2001F9C46 /* SynchronousTests.swift in Sources */, - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 4793854D1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */, - 1F925F08195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, - 7B5358BA1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F925F05195C18B700ED456B /* EqualTest.swift in Sources */, - 1F4A566D1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */, - DD72EC641A93874A002F7651 /* AllPassTest.swift in Sources */, - 1F4A569D1A3B3565009E1637 /* ObjCMatchTest.m in Sources */, - 1F925EE9195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */, - 29EA59631B551ED2002D767E /* ThrowErrorTest.swift in Sources */, - 6CAEDD0A1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4A566A1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */, - 472FD13B1B9E0CFE00C7B8DA /* HaveCountTest.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF1501BDCA0CE00C3A531 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F5DF1791BDCA0F500C3A531 /* BeCloseTo.swift in Sources */, - 1F5DF16C1BDCA0F500C3A531 /* AssertionRecorder.swift in Sources */, - 1F1871D71CA89EEF00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1F5DF1881BDCA0F500C3A531 /* MatcherProtocols.swift in Sources */, - 1F5DF16E1BDCA0F500C3A531 /* NimbleXCTestHandler.swift in Sources */, - 1F5DF1751BDCA0F500C3A531 /* FailureMessage.swift in Sources */, - 1F5DF1801BDCA0F500C3A531 /* BeLessThanOrEqual.swift in Sources */, - 1F1871E81CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */, - 1F5DF1891BDCA0F500C3A531 /* RaisesException.swift in Sources */, - 1F5DF1761BDCA0F500C3A531 /* AllPass.swift in Sources */, - AE4BA9AF1C88DDB500B73906 /* Errors.swift in Sources */, - 1F5DF1861BDCA0F500C3A531 /* HaveCount.swift in Sources */, - 1F5DF1811BDCA0F500C3A531 /* BeLogical.swift in Sources */, - 1F1871DB1CA89EF100A34BF2 /* NMBExpectation.swift in Sources */, - 1F5DF1741BDCA0F500C3A531 /* Expression.swift in Sources */, - 1F5DF1781BDCA0F500C3A531 /* BeAnInstanceOf.swift in Sources */, - 1F5DF1771BDCA0F500C3A531 /* BeAKindOf.swift in Sources */, - 1F5DF17F1BDCA0F500C3A531 /* BeLessThan.swift in Sources */, - 1F4BB8A41DAC9DC90048464B /* CwlCatchBadInstructionPOSIX.swift in Sources */, - 1F5DF17C1BDCA0F500C3A531 /* BeGreaterThan.swift in Sources */, - 1F91DD331C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91551C61C8A400B15DCB /* PostNotification.swift in Sources */, - 1F5DF1831BDCA0F500C3A531 /* Contain.swift in Sources */, - 1F5DF1851BDCA0F500C3A531 /* Equal.swift in Sources */, - 1F1871DC1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */, - F8A1BE311CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F5DF1711BDCA0F500C3A531 /* DSL+Wait.swift in Sources */, - 1F1871D61CA89EEF00A34BF2 /* DSL.m in Sources */, - 1F5DF17D1BDCA0F500C3A531 /* BeGreaterThanOrEqualTo.swift in Sources */, - AE7ADE471C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AC1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1F5DF18E1BDCA0F500C3A531 /* Stringers.swift in Sources */, - 1F5DF16D1BDCA0F500C3A531 /* AdapterProtocols.swift in Sources */, - 1F5DF17B1BDCA0F500C3A531 /* BeginWith.swift in Sources */, - 1F5DF17E1BDCA0F500C3A531 /* BeIdenticalTo.swift in Sources */, - 1F1871E91CA8A18700A34BF2 /* MatcherFunc.swift in Sources */, - 1F5DF17A1BDCA0F500C3A531 /* BeEmpty.swift in Sources */, - 1F5DF18C1BDCA0F500C3A531 /* Async.swift in Sources */, - 1F1871D81CA89EEF00A34BF2 /* NMBStringify.m in Sources */, - 1F5DF1821BDCA0F500C3A531 /* BeNil.swift in Sources */, - 1F5DF16F1BDCA0F500C3A531 /* AssertionDispatcher.swift in Sources */, - 964CFEFF1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - 1F5DF1841BDCA0F500C3A531 /* EndWith.swift in Sources */, - 1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */, - 1F5DF1701BDCA0F500C3A531 /* DSL.swift in Sources */, - 1F5DF1721BDCA0F500C3A531 /* Expectation.swift in Sources */, - 7B5358C01C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */, - 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F5DF15A1BDCA0CE00C3A531 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CD79C9AD1D2CC848004B6F9A /* ObjCBeTrueTest.m in Sources */, - CD79C9B41D2CC848004B6F9A /* ObjCRaiseExceptionTest.m in Sources */, - 1F5DF1A31BDCA10200C3A531 /* BeLogicalTest.swift in Sources */, - 1F5DF1951BDCA10200C3A531 /* utils.swift in Sources */, - CD79C9B01D2CC848004B6F9A /* ObjCEndWithTest.m in Sources */, - CD79C9B21D2CC848004B6F9A /* ObjCHaveCount.m in Sources */, - CD79C9A41D2CC848004B6F9A /* ObjCBeFalsyTest.m in Sources */, - 1F5DF1981BDCA10200C3A531 /* BeAKindOfTest.swift in Sources */, - 1F5DF19B1BDCA10200C3A531 /* BeEmptyTest.swift in Sources */, - 7B5358BC1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F5DF1A11BDCA10200C3A531 /* BeLessThanOrEqualToTest.swift in Sources */, - 1F5DF1961BDCA10200C3A531 /* ObjectWithLazyProperty.swift in Sources */, - 1F5DF1AB1BDCA10200C3A531 /* ThrowErrorTest.swift in Sources */, - CD79C9A91D2CC848004B6F9A /* ObjCBeKindOfTest.m in Sources */, - 1F5DF1A51BDCA10200C3A531 /* ContainTest.swift in Sources */, - AE7ADE4B1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - CD79C9B31D2CC848004B6F9A /* ObjCMatchTest.m in Sources */, - 1F5DF19E1BDCA10200C3A531 /* BeGreaterThanTest.swift in Sources */, - 1F5DF1A21BDCA10200C3A531 /* BeLessThanTest.swift in Sources */, - CD79C9AB1D2CC848004B6F9A /* ObjCBeLessThanTest.m in Sources */, - CD79C9A81D2CC848004B6F9A /* ObjCBeIdenticalToTest.m in Sources */, - CD79C9AE1D2CC848004B6F9A /* ObjCBeTruthyTest.m in Sources */, - 1F5DF1921BDCA10200C3A531 /* AsynchronousTest.swift in Sources */, - 1F5DF1A91BDCA10200C3A531 /* MatchTest.swift in Sources */, - 1F5DF1A81BDCA10200C3A531 /* HaveCountTest.swift in Sources */, - 1F5DF1971BDCA10200C3A531 /* AllPassTest.swift in Sources */, - CD79C9A61D2CC848004B6F9A /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */, - 1FCF91511C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - CD79C9B51D2CC848004B6F9A /* ObjCUserDescriptionTest.m in Sources */, - 1F5DF19C1BDCA10200C3A531 /* BeginWithTest.swift in Sources */, - 1F5DF1A01BDCA10200C3A531 /* BeIdenticalToTest.swift in Sources */, - 1F5DF19A1BDCA10200C3A531 /* BeCloseToTest.swift in Sources */, - 1F5DF1A61BDCA10200C3A531 /* EndWithTest.swift in Sources */, - CD79C9A31D2CC841004B6F9A /* ObjCBeFalseTest.m in Sources */, - 1F5DF1A71BDCA10200C3A531 /* EqualTest.swift in Sources */, - CD79C9AA1D2CC848004B6F9A /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 1F5DF1931BDCA10200C3A531 /* SynchronousTests.swift in Sources */, - CD79C9A11D2CC83B004B6F9A /* ObjCBeCloseToTest.m in Sources */, - 1F5DF19D1BDCA10200C3A531 /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F5DF1A41BDCA10200C3A531 /* BeNilTest.swift in Sources */, - CD79C9A71D2CC848004B6F9A /* ObjCBeGreaterThanTest.m in Sources */, - CD79C9A51D2CC848004B6F9A /* ObjCBeginWithTest.m in Sources */, - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 1F5DF1AA1BDCA10200C3A531 /* RaisesExceptionTest.swift in Sources */, - 1F5DF1941BDCA10200C3A531 /* UserDescriptionTest.swift in Sources */, - CD79C9AF1D2CC848004B6F9A /* ObjCContainTest.m in Sources */, - 1F5DF19F1BDCA10200C3A531 /* BeIdenticalToObjectTest.swift in Sources */, - CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */, - 1F91DD2F1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 6CAEDD0C1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4BB8B81DACAACF0048464B /* ThrowAssertionTest.swift in Sources */, - CD79C9B71D2CC848004B6F9A /* ObjCSatisfyAnyOfTest.m in Sources */, - 1F5DF1991BDCA10200C3A531 /* BeAnInstanceOfTest.swift in Sources */, - CD79C9B11D2CC848004B6F9A /* ObjCEqualTest.m in Sources */, - CD79C9A21D2CC83E004B6F9A /* ObjCBeEmptyTest.m in Sources */, - CD79C9AC1D2CC848004B6F9A /* ObjCBeNilTest.m in Sources */, - CD79C9A01D2CC839004B6F9A /* ObjCBeAnInstanceOfTest.m in Sources */, - CD79C9B61D2CC848004B6F9A /* ObjCAllPassTest.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EA8195C0D6300ED456B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1FD8CD411968AB07008ED995 /* BeCloseTo.swift in Sources */, - 1F1871D31CA89EEE00A34BF2 /* NMBExceptionCapture.m in Sources */, - 1FD8CD371968AB07008ED995 /* Expectation.swift in Sources */, - 1FD8CD331968AB07008ED995 /* NimbleXCTestHandler.swift in Sources */, - 1F43728E1A1B343F00EB80F8 /* Stringers.swift in Sources */, - 1F43728C1A1B343C00EB80F8 /* SourceLocation.swift in Sources */, - 1FD8CD4F1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, - 1F1871E71CA8A18400A34BF2 /* AsyncMatcherWrapper.swift in Sources */, - 1FDBD8681AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */, - AE4BA9AE1C88DDB500B73906 /* Errors.swift in Sources */, - 1FD8CD3D1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, - 1FD8CD511968AB07008ED995 /* BeLogical.swift in Sources */, - 1F1871D91CA89EF100A34BF2 /* NMBExpectation.swift in Sources */, - DA9E8C831A414BB9002633C2 /* DSL+Wait.swift in Sources */, - DDB1BC7A1A92235600F743C3 /* AllPass.swift in Sources */, - 1FD8CD3F1968AB07008ED995 /* BeAKindOf.swift in Sources */, - 1FD8CD2F1968AB07008ED995 /* AssertionRecorder.swift in Sources */, - 1F91DD321C74BF61002C309F /* BeVoid.swift in Sources */, - 1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */, - DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */, - 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */, - 1FD8CD5B1968AB07008ED995 /* Equal.swift in Sources */, - 1FD8CD4D1968AB07008ED995 /* BeLessThan.swift in Sources */, - 1FD8CD471968AB07008ED995 /* BeGreaterThan.swift in Sources */, - F8A1BE301CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */, - 1F1871DA1CA89EF100A34BF2 /* NMBObjCMatcher.swift in Sources */, - 1FD8CD311968AB07008ED995 /* AdapterProtocols.swift in Sources */, - 1F2D175C1DB618F000EE9C7A /* mach_excServer.c in Sources */, - 1F1871D21CA89EEE00A34BF2 /* DSL.m in Sources */, - 1F4BB8BB1DACBFD00048464B /* CwlCatchBadInstruction.m in Sources */, - AE7ADE461C80BF8000B94CD3 /* MatchError.swift in Sources */, - 1FC494AB1C29CBA40010975C /* NimbleEnvironment.swift in Sources */, - 1FD8CD5F1968AB07008ED995 /* RaisesException.swift in Sources */, - 1FD8CD571968AB07008ED995 /* Contain.swift in Sources */, - 1FD8CD491968AB07008ED995 /* BeGreaterThanOrEqualTo.swift in Sources */, - 1FD8CD451968AB07008ED995 /* BeginWith.swift in Sources */, - 1F1871EB1CA8A18800A34BF2 /* MatcherFunc.swift in Sources */, - 1FD8CD4B1968AB07008ED995 /* BeIdenticalTo.swift in Sources */, - 1FD8CD431968AB07008ED995 /* BeEmpty.swift in Sources */, - 1F1871D41CA89EEE00A34BF2 /* NMBStringify.m in Sources */, - 1FD8CD531968AB07008ED995 /* BeNil.swift in Sources */, - 1FD8CD6B1968AB07008ED995 /* Async.swift in Sources */, - 964CFEFE1C4FF48900513336 /* ThrowAssertion.swift in Sources */, - 1FD8CD591968AB07008ED995 /* EndWith.swift in Sources */, - 1FD8CD5D1968AB07008ED995 /* MatcherProtocols.swift in Sources */, - 1FD8CD351968AB07008ED995 /* DSL.swift in Sources */, - 7B5358BF1C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, - 1FD8CD391968AB07008ED995 /* Expression.swift in Sources */, - 1FD8CD3B1968AB07008ED995 /* FailureMessage.swift in Sources */, - 472FD1391B9E0A9700C7B8DA /* HaveCount.swift in Sources */, - 9630C0311C6D139F000693EE /* CwlDarwinDefinitions.swift in Sources */, - 9630C0201C6D0B2F000693EE /* CwlCatchException.swift in Sources */, - 9630C0141C6D0B18000693EE /* CwlCatchBadInstruction.swift in Sources */, - 9630C01D1C6D0B2F000693EE /* CwlCatchException.m in Sources */, - 9630C02D1C6D125F000693EE /* CwlBadInstructionException.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F925EB3195C0D6300ED456B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F4A569B1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, - 1F925EED195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, - 1F925F00195C187600ED456B /* EndWithTest.swift in Sources */, - 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, - 1F925F0F195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, - 1F4A56671A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, - 1F925EFD195C186800ED456B /* BeginWithTest.swift in Sources */, - 1F925EE2195C0DFD00ED456B /* utils.swift in Sources */, - DDB4D5F119FE442800E9D9FE /* MatchTest.swift in Sources */, - 1F4A56741A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */, - 1F4A56831A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */, - 1F925F03195C189500ED456B /* ContainTest.swift in Sources */, - 1F4A56891A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */, - 1F4A568F1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */, - 1F925F12195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */, - 1F925EF0195C136500ED456B /* BeLogicalTest.swift in Sources */, - 1F4A56A11A3B359E009E1637 /* ObjCRaiseExceptionTest.m in Sources */, - 1F925F0C195C18E100ED456B /* BeLessThanTest.swift in Sources */, - 1F9DB8FC1A74E793002E96AD /* ObjCBeEmptyTest.m in Sources */, - 1FB90099195EC4B8001D7FAE /* BeIdenticalToTest.swift in Sources */, - 1F91DD2E1C74BF36002C309F /* BeVoidTest.swift in Sources */, - 1F4A56771A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, - 1F925EFA195C175000ED456B /* BeNilTest.swift in Sources */, - 1F4A56711A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, - 1F4A56981A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */, - 1F4A567D1A3B3311009E1637 /* ObjCBeIdenticalToTest.m in Sources */, - 965B0D0D1B62C06D0005AE66 /* UserDescriptionTest.swift in Sources */, - 1FCF91501C61C85A00B15DCB /* PostNotificationTest.swift in Sources */, - 965B0D0A1B62B8ED0005AE66 /* ObjCUserDescriptionTest.m in Sources */, - 1F4A56921A3B344A009E1637 /* ObjCBeNilTest.m in Sources */, - 1F8A37B11B7C5042001C8357 /* ObjCSyncTest.m in Sources */, - 1F4A56951A3B346F009E1637 /* ObjCContainTest.m in Sources */, - 1F299EAC19627B2D002641AF /* BeEmptyTest.swift in Sources */, - 1F925EF7195C147800ED456B /* BeCloseToTest.swift in Sources */, - 1F4A567A1A3B32E3009E1637 /* ObjCBeGreaterThanOrEqualToTest.m in Sources */, - AE7ADE4A1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */, - 1F4A568C1A3B3407009E1637 /* ObjCBeTrueTest.m in Sources */, - DDEFAEB51A93CBE6005CA37A /* ObjCAllPassTest.m in Sources */, - 1F4A56801A3B333F009E1637 /* ObjCBeLessThanTest.m in Sources */, - 1F925EE7195C121200ED456B /* AsynchronousTest.swift in Sources */, - 1F0648CD19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */, - 1F4A56861A3B33A0009E1637 /* ObjCBeTruthyTest.m in Sources */, - DD9A9A9019CF43AD00706F49 /* BeIdenticalToObjectTest.swift in Sources */, - 1F4BB8B61DACA0E30048464B /* ThrowAssertionTest.swift in Sources */, - 1F0648D51963AAB2001F9C46 /* SynchronousTests.swift in Sources */, - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, - 4793854E1BA0BB2500296F85 /* ObjCHaveCount.m in Sources */, - 1F925F09195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, - 7B5358BB1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, - 1F925F06195C18B700ED456B /* EqualTest.swift in Sources */, - 1F4A566E1A3B3159009E1637 /* ObjCBeKindOfTest.m in Sources */, - DD72EC651A93874A002F7651 /* AllPassTest.swift in Sources */, - 1F4A569E1A3B3565009E1637 /* ObjCMatchTest.m in Sources */, - 1F925EEA195C124400ED456B /* BeAnInstanceOfTest.swift in Sources */, - 29EA59641B551ED2002D767E /* ThrowErrorTest.swift in Sources */, - 6CAEDD0B1CAEA86F003F1584 /* LinuxSupport.swift in Sources */, - 1F4A566B1A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m in Sources */, - 472FD13A1B9E0A9F00C7B8DA /* HaveCountTest.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1F1A74371940169200FFFC47 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F1A74361940169200FFFC47 /* PBXContainerItemProxy */; - }; - 1F5DF1611BDCA0CE00C3A531 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F5DF1541BDCA0CE00C3A531 /* Nimble-tvOS */; - targetProxy = 1F5DF1601BDCA0CE00C3A531 /* PBXContainerItemProxy */; - }; - 1F6BB82B1968BFF9009F1DBB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F6BB82A1968BFF9009F1DBB /* PBXContainerItemProxy */; - }; - 1F925EA5195C0C8500ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F925EA4195C0C8500ED456B /* PBXContainerItemProxy */; - }; - 1F925EA7195C0C8500ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F1A74281940169200FFFC47 /* Nimble-iOS */; - targetProxy = 1F925EA6195C0C8500ED456B /* PBXContainerItemProxy */; - }; - 1F925EBA195C0D6300ED456B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F925EB9195C0D6300ED456B /* PBXContainerItemProxy */; - }; - 1F9B7BFE1968AD760094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7BFD1968AD760094EB8F /* PBXContainerItemProxy */; - }; - 1F9B7C001968AD760094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7BFF1968AD760094EB8F /* PBXContainerItemProxy */; - }; - 1F9B7C021968AD820094EB8F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F925EAC195C0D6300ED456B /* Nimble-macOS */; - targetProxy = 1F9B7C011968AD820094EB8F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1F1A743D1940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 1F1A743E1940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 1F1A74401940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F1A74411940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 1F1A74431940169200FFFC47 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F1A74441940169200FFFC47 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 1F5DF1661BDCA0CE00C3A531 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Debug; - }; - 1F5DF1671BDCA0CE00C3A531 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Release; - }; - 1F5DF1681BDCA0CE00C3A531 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Debug; - }; - 1F5DF1691BDCA0CE00C3A531 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CODE_SIGN_FLAGS = "--verbose"; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = appletvos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Release; - }; - 1F925EC1195C0D6300ED456B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - FRAMEWORK_VERSION = A; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = macosx; - SKIP_INSTALL = YES; - VALID_ARCHS = x86_64; - }; - name = Debug; - }; - 1F925EC2195C0D6300ED456B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - FRAMEWORK_VERSION = A; - GCC_PREPROCESSOR_DEFINITIONS = ( - "PRODUCT_NAME=$(PRODUCT_NAME)/$(PRODUCT_NAME)", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - INFOPLIST_FILE = Sources/Nimble/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "-weak_framework", - XCTest, - "-weak-lswiftXCTest", - ); - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Nimble; - PRODUCT_NAME = Nimble; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALID_ARCHS = x86_64; - }; - name = Release; - }; - 1F925EC4195C0D6300ED456B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1F925EC5195C0D6300ED456B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/NimbleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = NimbleTests; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1F1A74231940169200FFFC47 /* Build configuration list for PBXProject "Nimble" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A743D1940169200FFFC47 /* Debug */, - 1F1A743E1940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F1A743F1940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A74401940169200FFFC47 /* Debug */, - 1F1A74411940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F1A74421940169200FFFC47 /* Build configuration list for PBXNativeTarget "Nimble-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F1A74431940169200FFFC47 /* Debug */, - 1F1A74441940169200FFFC47 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F5DF16A1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F5DF1661BDCA0CE00C3A531 /* Debug */, - 1F5DF1671BDCA0CE00C3A531 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F5DF16B1BDCA0CE00C3A531 /* Build configuration list for PBXNativeTarget "Nimble-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F5DF1681BDCA0CE00C3A531 /* Debug */, - 1F5DF1691BDCA0CE00C3A531 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F925EC0195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F925EC1195C0D6300ED456B /* Debug */, - 1F925EC2195C0D6300ED456B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F925EC3195C0D6300ED456B /* Build configuration list for PBXNativeTarget "Nimble-macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F925EC4195C0D6300ED456B /* Debug */, - 1F925EC5195C0D6300ED456B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 1F1A74201940169200FFFC47 /* Project object */; -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a822b74..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme deleted file mode 100644 index 4a6682b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme deleted file mode 100644 index 4aa936e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-macOS.xcscheme +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme deleted file mode 100644 index 2309132..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Package.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Package.swift deleted file mode 100644 index 46d1ff6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Package.swift +++ /dev/null @@ -1,10 +0,0 @@ -import PackageDescription - -let package = Package( - name: "Nimble", - exclude: [ - "Sources/Lib", - "Sources/NimbleObjectiveC", - "Tests/NimbleTests/objc", - ] -) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/README.md deleted file mode 100644 index 684255e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/README.md +++ /dev/null @@ -1,1340 +0,0 @@ -# Nimble - -Use Nimble to express the expected outcomes of Swift -or Objective-C expressions. Inspired by -[Cedar](https://github.com/pivotal/cedar). - -```swift -// Swift -expect(1 + 1).to(equal(2)) -expect(1.2).to(beCloseTo(1.1, within: 0.1)) -expect(3) > 2 -expect("seahorse").to(contain("sea")) -expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi")) -expect(ocean.isClean).toEventually(beTruthy()) -``` - -# How to Use Nimble - - - -**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - -- [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) - - [Operator Overloads](#operator-overloads) - - [Lazily Computed Values](#lazily-computed-values) - - [C Primitives](#c-primitives) - - [Asynchronous Expectations](#asynchronous-expectations) - - [Objective-C Support](#objective-c-support) - - [Disabling Objective-C Shorthand](#disabling-objective-c-shorthand) -- [Built-in Matcher Functions](#built-in-matcher-functions) - - [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) - - [Verify a notification was posted](#verifying-a-notification-was-posted) - - [Matching a value to any of a group of matchers](#matching-a-value-to-any-of-a-group-of-matchers) -- [Writing Your Own Matchers](#writing-your-own-matchers) - - [Lazy Evaluation](#lazy-evaluation) - - [Type Checking via Swift Generics](#type-checking-via-swift-generics) - - [Customizing Failure Messages](#customizing-failure-messages) - - [Supporting Objective-C](#supporting-objective-c) - - [Properly Handling `nil` in Objective-C Matchers](#properly-handling-nil-in-objective-c-matchers) -- [Installing Nimble](#installing-nimble) - - [Installing Nimble as a Submodule](#installing-nimble-as-a-submodule) - - [Installing Nimble via CocoaPods](#installing-nimble-via-cocoapods) - - [Using Nimble without XCTest](#using-nimble-without-xctest) - - - -# Some Background: Expressing Outcomes Using Assertions in XCTest - -Apple's Xcode includes the XCTest framework, which provides -assertion macros to test whether code behaves properly. -For example, to assert that `1 + 1 = 2`, XCTest has you write: - -```swift -// Swift - -XCTAssertEqual(1 + 1, 2, "expected one plus one to equal two") -``` - -Or, in Objective-C: - -```objc -// Objective-C - -XCTAssertEqual(1 + 1, 2, @"expected one plus one to equal two"); -``` - -XCTest assertions have a couple of drawbacks: - -1. **Not enough macros.** There's no easy way to assert that a string - contains a particular substring, or that a number is less than or - equal to another. -2. **It's hard to write asynchronous tests.** XCTest forces you to write - a lot of boilerplate code. - -Nimble addresses these concerns. - -# Nimble: Expectations Using `expect(...).to` - -Nimble allows you to express expectations using a natural, -easily understood language: - -```swift -// Swift - -import Nimble - -expect(seagull.squawk).to(equal("Squee!")) -``` - -```objc -// Objective-C - -@import Nimble; - -expect(seagull.squawk).to(equal(@"Squee!")); -``` - -> The `expect` function autocompletes to include `file:` and `line:`, - but these parameters are optional. Use the default values to have - Xcode highlight the correct line when an expectation is not met. - -To perform the opposite expectation--to assert something is *not* -equal--use `toNot` or `notTo`: - -```swift -// Swift - -import Nimble - -expect(seagull.squawk).toNot(equal("Oh, hello there!")) -expect(seagull.squawk).notTo(equal("Oh, hello there!")) -``` - -```objc -// Objective-C - -@import Nimble; - -expect(seagull.squawk).toNot(equal(@"Oh, hello there!")); -expect(seagull.squawk).notTo(equal(@"Oh, hello there!")); -``` - -## Custom Failure Messages - -Would you like to add more information to the test's failure messages? Use the `description` optional argument to add your own text: - -```swift -// Swift - -expect(1 + 1).to(equal(3)) -// failed - expected to equal <3>, got <2> - -expect(1 + 1).to(equal(3), description: "Make sure libKindergartenMath is loaded") -// failed - Make sure libKindergartenMath is loaded -// expected to equal <3>, got <2> -``` - -Or the *WithDescription version in Objective-C: - -```objc -// Objective-C - -@import Nimble; - -expect(@(1+1)).to(equal(@3)); -// failed - expected to equal <3.0000>, got <2.0000> - -expect(@(1+1)).toWithDescription(equal(@3), @"Make sure libKindergartenMath is loaded"); -// failed - Make sure libKindergartenMath is loaded -// expected to equal <3.0000>, got <2.0000> -``` - -## Type Checking - -Nimble makes sure you don't compare two types that don't match: - -```swift -// Swift - -// Does not compile: -expect(1 + 1).to(equal("Squee!")) -``` - -> Nimble uses generics--only available in Swift--to ensure - type correctness. That means type checking is - not available when using Nimble in Objective-C. :sob: - -## Operator Overloads - -Tired of so much typing? With Nimble, you can use overloaded operators -like `==` for equivalence, or `>` for comparisons: - -```swift -// Swift - -// Passes if squawk does not equal "Hi!": -expect(seagull.squawk) != "Hi!" - -// Passes if 10 is greater than 2: -expect(10) > 2 -``` - -> Operator overloads are only available in Swift, so you won't be able - to use this syntax in Objective-C. :broken_heart: - -## Lazily Computed Values - -The `expect` function doesn't evaluate the value it's given until it's -time to match. So Nimble can test whether an expression raises an -exception once evaluated: - -```swift -// Swift - -// Note: Swift currently doesn't have exceptions. -// Only Objective-C code can raise exceptions -// that Nimble will catch. -// (see https://github.com/Quick/Nimble/issues/220#issuecomment-172667064) -let exception = NSException( - name: NSInternalInconsistencyException, - reason: "Not enough fish in the sea.", - userInfo: ["something": "is fishy"]) -expect { exception.raise() }.to(raiseException()) - -// Also, you can customize raiseException to be more specific -expect { exception.raise() }.to(raiseException(named: NSInternalInconsistencyException)) -expect { exception.raise() }.to(raiseException( - named: NSInternalInconsistencyException, - reason: "Not enough fish in the sea")) -expect { exception.raise() }.to(raiseException( - named: NSInternalInconsistencyException, - reason: "Not enough fish in the sea", - userInfo: ["something": "is fishy"])) -``` - -Objective-C works the same way, but you must use the `expectAction` -macro when making an expectation on an expression that has no return -value: - -```objc -// Objective-C - -NSException *exception = [NSException exceptionWithName:NSInternalInconsistencyException - reason:@"Not enough fish in the sea." - userInfo:nil]; -expectAction(^{ [exception raise]; }).to(raiseException()); - -// Use the property-block syntax to be more specific. -expectAction(^{ [exception raise]; }).to(raiseException().named(NSInternalInconsistencyException)); -expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInternalInconsistencyException). - reason("Not enough fish in the sea")); -expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInternalInconsistencyException). - reason("Not enough fish in the sea"). - userInfo(@{@"something": @"is fishy"})); - -// You can also pass a block for custom matching of the raised exception -expectAction(exception.raise()).to(raiseException().satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(beginWith(NSInternalInconsistencyException)); -})); -``` - -## C Primitives - -Some testing frameworks make it hard to test primitive C values. -In Nimble, it just works: - -```swift -// Swift - -let actual: CInt = 1 -let expectedValue: CInt = 1 -expect(actual).to(equal(expectedValue)) -``` - -In fact, Nimble uses type inference, so you can write the above -without explicitly specifying both types: - -```swift -// Swift - -expect(1 as CInt).to(equal(1)) -``` - -> In Objective-C, Nimble only supports Objective-C objects. To - make expectations on primitive C values, wrap then in an object - literal: - - ```objc - expect(@(1 + 1)).to(equal(@2)); - ``` - -## Asynchronous Expectations - -In Nimble, it's easy to make expectations on values that are updated -asynchronously. Just use `toEventually` or `toEventuallyNot`: - -```swift -// Swift - -dispatch_async(dispatch_get_main_queue()) { - ocean.add("dolphins") - ocean.add("whales") -} -expect(ocean).toEventually(contain("dolphins", "whales")) -``` - - -```objc -// Objective-C -dispatch_async(dispatch_get_main_queue(), ^{ - [ocean add:@"dolphins"]; - [ocean add:@"whales"]; -}); -expect(ocean).toEventually(contain(@"dolphins", @"whales")); -``` - -Note: toEventually triggers its polls on the main thread. Blocking the main -thread will cause Nimble to stop the run loop. This can cause test pollution -for whatever incomplete code that was running on the main thread. Blocking the -main thread can be caused by blocking IO, calls to sleep(), deadlocks, and -synchronous IPC. - -In the above example, `ocean` is constantly re-evaluated. If it ever -contains dolphins and whales, the expectation passes. If `ocean` still -doesn't contain them, even after being continuously re-evaluated for one -whole second, the expectation fails. - -Sometimes it takes more than a second for a value to update. In those -cases, use the `timeout` parameter: - -```swift -// Swift - -// 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 -// Objective-C - -// Waits three seconds for ocean to contain "starfish": -expect(ocean).withTimeout(3).toEventually(contain(@"starfish")); -``` - -You can also provide a callback by using the `waitUntil` function: - -```swift -// Swift - -waitUntil { done in - // do some stuff that takes a while... - NSThread.sleepForTimeInterval(0.5) - done() -} -``` - -```objc -// Objective-C - -waitUntil(^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:0.5]; - done(); -}); -``` - -`waitUntil` also optionally takes a timeout parameter: - -```swift -// Swift - -waitUntil(timeout: 10) { done in - // do some stuff that takes a while... - NSThread.sleepForTimeInterval(1) - done() -} -``` - -```objc -// Objective-C - -waitUntilTimeout(10, ^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:1]; - done(); -}); -``` - -Note: waitUntil triggers its timeout code on the main thread. Blocking the main -thread will cause Nimble to stop the run loop to continue. This can cause test -pollution for whatever incomplete code that was running on the main thread. -Blocking the main thread can be caused by blocking IO, calls to sleep(), -deadlocks, and synchronous IPC. - -In some cases (e.g. when running on slower machines) it can be useful to modify -the default timeout and poll interval values. This can be done as follows: - -```swift -// Swift - -// Increase the global timeout to 5 seconds: -Nimble.AsyncDefaults.Timeout = 5 - -// Slow the polling interval to 0.1 seconds: -Nimble.AsyncDefaults.PollInterval = 0.1 -``` - -## Objective-C Support - -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 or can be converted into - an `NSObject` equivalent: - - ```objc - // Objective-C - - @import Nimble; - - 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, - such as `-[NSException raise]`, use `expectAction` instead of - `expect`: - - ```objc - // 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 -`expect` function. To disable this shorthand in Objective-C, define the -`NIMBLE_DISABLE_SHORT_SYNTAX` macro somewhere in your code before -importing Nimble: - -```objc -#define NIMBLE_DISABLE_SHORT_SYNTAX 1 - -@import Nimble; - -NMB_expect(^{ return seagull.squawk; }, __FILE__, __LINE__).to(NMB_equal(@"Squee!")); -``` - -> Disabling the shorthand is useful if you're testing functions with - names that conflict with Nimble functions, such as `expect` or - `equal`. If that's not the case, there's no point in disabling the - shorthand. - -# Built-in Matcher Functions - -Nimble includes a wide variety of matcher functions. - -## Equivalence - -```swift -// Swift - -// Passes if actual is equivalent to expected: -expect(actual).to(equal(expected)) -expect(actual) == expected - -// Passes if actual is not equivalent to expected: -expect(actual).toNot(equal(expected)) -expect(actual) != expected -``` - -```objc -// Objective-C - -// Passes if actual is equivalent to expected: -expect(actual).to(equal(expected)) - -// Passes if actual is not equivalent to expected: -expect(actual).toNot(equal(expected)) -``` - -Values must be `Equatable`, `Comparable`, or subclasses of `NSObject`. -`equal` will always fail when used to compare one or more `nil` values. - -## Identity - -```swift -// Swift - -// 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: -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. - - -```objc -// Objective-C - -// 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: -expect(actual).toNot(beIdenticalTo(expected)); -``` - -## Comparisons - -```swift -// Swift - -expect(actual).to(beLessThan(expected)) -expect(actual) < expected - -expect(actual).to(beLessThanOrEqualTo(expected)) -expect(actual) <= expected - -expect(actual).to(beGreaterThan(expected)) -expect(actual) > expected - -expect(actual).to(beGreaterThanOrEqualTo(expected)) -expect(actual) >= expected -``` - -```objc -// Objective-C - -expect(actual).to(beLessThan(expected)); -expect(actual).to(beLessThanOrEqualTo(expected)); -expect(actual).to(beGreaterThan(expected)); -expect(actual).to(beGreaterThanOrEqualTo(expected)); -``` - -> Values given to the comparison matchers above must implement - `Comparable`. - -Because of how computers represent floating point numbers, assertions -that two floating point numbers be equal will sometimes fail. To express -that two numbers should be close to one another within a certain margin -of error, use `beCloseTo`: - -```swift -// Swift - -expect(actual).to(beCloseTo(expected, within: delta)) -``` - -```objc -// Objective-C - -expect(actual).to(beCloseTo(expected).within(delta)); -``` - -For example, to assert that `10.01` is close to `10`, you can write: - -```swift -// Swift - -expect(10.01).to(beCloseTo(10, within: 0.1)) -``` - -```objc -// Objective-C - -expect(@(10.01)).to(beCloseTo(@10).within(0.1)); -``` - -There is also an operator shortcut available in Swift: - -```swift -// Swift - -expect(actual) ≈ expected -expect(actual) ≈ (expected, delta) - -``` -(Type Option-x to get ≈ on a U.S. keyboard) - -The former version uses the default delta of 0.0001. Here is yet another way to do this: - -```swift -// Swift - -expect(actual) ≈ expected ± delta -expect(actual) == expected ± delta - -``` -(Type Option-Shift-= to get ± on a U.S. keyboard) - -If you are comparing arrays of floating point numbers, you'll find the following useful: - -```swift -// Swift - -expect([0.0, 2.0]) ≈ [0.0001, 2.0001] -expect([0.0, 2.0]).to(beCloseTo([0.1, 2.1], within: 0.1)) - -``` - -> Values given to the `beCloseTo` matcher must be coercable into a - `Double`. - -## Types/Classes - -```swift -// Swift - -// 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: -expect(instance).to(beAKindOf(aClass)) -``` - -```objc -// Objective-C - -// 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: -expect(instance).to(beAKindOf(aClass)); -``` - -> Instances must be Objective-C objects: subclasses of `NSObject`, - or Swift objects bridged to Objective-C with the `@objc` prefix. - -For example, to assert that `dolphin` is a kind of `Mammal`: - -```swift -// Swift - -expect(dolphin).to(beAKindOf(Mammal)) -``` - -```objc -// Objective-C - -expect(dolphin).to(beAKindOf([Mammal class])); -``` - -> `beAnInstanceOf` uses the `-[NSObject isMemberOfClass:]` method to - test membership. `beAKindOf` uses `-[NSObject isKindOfClass:]`. - -## Truthiness - -```swift -// 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): -expect(actual).to(beTrue()) - -// 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): -expect(actual).to(beFalse()) - -// 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: -expect(actual).to(beTruthy()); - -// 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: -expect(actual).to(beFalsy()); - -// Passes if actual is only false (not nil or an object conforming to Boolean false): -expect(actual).to(beFalse()); - -// 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 calling fatalError() or precondition fails: -expect { () -> Void in fatalError() }.to(throwAssertion()) -expect { precondition(false) }.to(throwAssertion()) - -// Passes if throwing a NSError is not equal to throwing an assertion: -expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion()) - -// Passes if the post assertion code is not run: -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. - -```swift -// Swift - -// Passes if somethingThatThrows() throws an ErrorProtocol: -expect{ try somethingThatThrows() }.to(throwError()) - -// Passes if somethingThatThrows() throws an error with a given domain: -expect{ try somethingThatThrows() }.to(throwError { (error: ErrorProtocol) 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 an error with a given 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. - -```swift -// Swift - -let actual: ErrorProtocol = … - -// Passes if actual contains any error value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum)) - -// Passes if actual contains the Timeout value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum.Timeout)) - -// Passes if actual contains an NSError equal to the given one: -expect(actual).to(matchError(NSError(domain: "err", code: 123, userInfo: nil))) -``` - -Note: This feature is only available in Swift. - -## Exceptions - -```swift -// Swift - -// Passes if actual, when evaluated, raises an exception: -expect(actual).to(raiseException()) - -// 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: -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') -expect { exception.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name).to(beginWith("a r")) -}) -``` - -```objc -// Objective-C - -// Passes if actual, when evaluated, raises an exception: -expect(actual).to(raiseException()) - -// 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: -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') -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. - -## Collection Membership - -```swift -// Swift - -// 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): -expect(actual).to(beEmpty()) -``` - -```objc -// Objective-C - -// Passes if expected is a member of actual: -expect(actual).to(contain(expected)); - -// Passes if actual is an empty collection (it contains no elements): -expect(actual).to(beEmpty()); -``` - -> In Swift `contain` takes any number of arguments. The expectation - passes if all of them are members of the collection. In Objective-C, - `contain` only takes one argument [for now](https://github.com/Quick/Nimble/issues/27). - -For example, to assert that a list of sea creature names contains -"dolphin" and "starfish": - -```swift -// Swift - -expect(["whale", "dolphin", "starfish"]).to(contain("dolphin", "starfish")) -``` - -```objc -// Objective-C - -expect(@[@"whale", @"dolphin", @"starfish"]).to(contain(@"dolphin")); -expect(@[@"whale", @"dolphin", @"starfish"]).to(contain(@"starfish")); -``` - -> `contain` and `beEmpty` expect collections to be instances of - `NSArray`, `NSSet`, or a Swift collection composed of `Equatable` elements. - -To test whether a set of elements is present at the beginning or end of -an ordered collection, use `beginWith` and `endWith`: - -```swift -// Swift - -// 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: -expect(actual).to(endWith(expected...)) -``` - -```objc -// Objective-C - -// 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: -expect(actual).to(endWith(expected)); -``` - -> `beginWith` and `endWith` expect collections to be instances of - `NSArray`, or ordered Swift collections composed of `Equatable` - elements. - - Like `contain`, in Objective-C `beginWith` and `endWith` only support - a single argument [for now](https://github.com/Quick/Nimble/issues/27). - -## Strings - -```swift -// Swift - -// Passes if actual contains substring expected: -expect(actual).to(contain(expected)) - -// Passes if actual begins with substring: -expect(actual).to(beginWith(expected)) - -// Passes if actual ends with substring: -expect(actual).to(endWith(expected)) - -// Passes if actual is an empty string, "": -expect(actual).to(beEmpty()) - -// Passes if actual matches the regular expression defined in expected: -expect(actual).to(match(expected)) -``` - -```objc -// Objective-C - -// Passes if actual contains substring expected: -expect(actual).to(contain(expected)); - -// Passes if actual begins with substring: -expect(actual).to(beginWith(expected)); - -// Passes if actual ends with substring: -expect(actual).to(endWith(expected)); - -// Passes if actual is an empty string, "": -expect(actual).to(beEmpty()); - -// 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 - -```swift -// Swift - -// with a custom function: -expect([1,2,3,4]).to(allPass({$0 < 5})) - -// with another matcher: -expect([1,2,3,4]).to(allPass(beLessThan(5))) -``` - -```objc -// Objective-C - -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 - -```swift -// Swift - -// passes if actual collection's count is equal to expected -expect(actual).to(haveCount(expected)) - -// passes if actual collection's count is not equal to expected -expect(actual).notTo(haveCount(expected)) -``` - -```objc -// Objective-C - -// passes if actual collection's count is equal to expected -expect(actual).to(haveCount(expected)) - -// passes if actual collection's count is not equal to expected -expect(actual).notTo(haveCount(expected)) -``` - -For Swift the actual value must be a `Collection` such as 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. - -## Foundation - -### Verifying a Notification was posted - -```swift -// Swift -let testNotification = Notification(name: "Foo", object: nil) - -// passes if the closure in expect { ... } posts a notification to the default -// notification center. -expect { - NotificationCenter.default.postNotification(testNotification) -}.to(postNotifications(equal([testNotification])) - -// passes if the closure in expect { ... } posts a notification to a given -// notification center -let notificationCenter = NotificationCenter() -expect { - notificationCenter.postNotification(testNotification) -}.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) -``` - -> This matcher is only available in Swift. - -## Matching a value to any of a group of matchers - -```swift -// passes if actual is either less than 10 or greater than 20 -expect(actual).to(satisfyAnyOf(beLessThan(10), beGreaterThan(20))) - -// can include any number of matchers -- the following will pass -// **be careful** -- too many matchers can be the sign of an unfocused test -expect(6).to(satisfyAnyOf(equal(2), equal(3), equal(4), equal(5), equal(6), equal(7))) - -// in Swift you also have the option to use the || operator to achieve a similar function -expect(82).to(beLessThan(50) || beGreaterThan(80)) -``` - -```objc -// passes if actual is either less than 10 or greater than 20 -expect(actual).to(satisfyAnyOf(beLessThan(@10), beGreaterThan(@20))) - -// can include any number of matchers -- the following will pass -// **be careful** -- too many matchers can be the sign of an unfocused test -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. - -# Writing Your Own Matchers - -In Nimble, matchers are Swift functions that take an expected -value and return a `MatcherFunc` closure. Take `equal`, for example: - -```swift -// Swift - -public func equal(expectedValue: T?) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(expectedValue)>" - if let actualValue = try actualExpression.evaluate() { - return actualValue == expectedValue - } else { - return false - } - } -} -``` - -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 actual `equal` matcher function does not match when either - `actual` or `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 -in an Xcode project you distribute to others. - -> If you write a matcher you think everyone can use, consider adding it - to Nimble's built-in set of matchers by sending a pull request! Or - distribute it yourself via GitHub. - -For examples of how to write your own matchers, just check out the -[`Matchers` directory](https://github.com/Quick/Nimble/tree/master/Sources/Nimble/Matchers) -to see how Nimble's built-in set of matchers are implemented. You can -also check out the tips below. - -## Lazy Evaluation - -`actualExpression` is a lazy, memoized closure around the value provided to the -`expect` function. The expression can either be a closure or a value directly -passed to `expect(...)`. In order to determine whether that value matches, -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 - } -} -``` - -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 -passed to the `expect` function by modifying the return type. - -For example, the following matcher, `haveDescription`, only accepts actual -values that implement the `Printable` protocol. It checks their `description` -against the one provided to the matcher function, and passes if they are the same: - -```swift -// Swift - -public func haveDescription(description: String) -> MatcherFunc { - return MatcherFunc { actual, failureMessage in - return actual.evaluate().description == description - } -} -``` - -## Customizing Failure Messages - -By default, Nimble outputs the following failure message when an -expectation fails: - -``` -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: - -```swift -// Swift - -// Outputs: expected to be under the sea, got <\(actual)> -failureMessage.postfixMessage = "be under the sea" -``` - -You can change how the `actual` value is displayed by updating -`failureMessage.actualValue`. Or, to remove it altogether, set it to -`nil`: - -```swift -// Swift - -// Outputs: expected to be under the sea -failureMessage.actualValue = nil -failureMessage.postfixMessage = "be under the sea" -``` - -## Supporting Objective-C - -To use a custom matcher written in Swift from Objective-C, you'll have -to extend the `NMBObjCMatcher` class, adding a new class method for your -custom matcher. The example below defines the class method -`+[NMBObjCMatcher beNilMatcher]`: - -```swift -// Swift - -extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualBlock, failureMessage, location in - let block = ({ actualBlock() as NSObject? }) - let expr = Expression(expression: block, location: location) - return beNil().matches(expr, failureMessage: failureMessage) - } - } -} -``` - -The above allows you to use the matcher from Objective-C: - -```objc -// Objective-C - -expect(actual).to([NMBObjCMatcher beNilMatcher]()); -``` - -To make the syntax easier to use, define a C function that calls the -class method: - -```objc -// Objective-C - -FOUNDATION_EXPORT id beNil() { - return [NMBObjCMatcher beNilMatcher]; -} -``` - -### Properly Handling `nil` in Objective-C Matchers - -When supporting Objective-C, make sure you handle `nil` appropriately. -Like [Cedar](https://github.com/pivotal/cedar/issues/100), -**most matchers do not match with nil**. This is to bring prevent test -writers from being surprised by `nil` values where they did not expect -them. - -Nimble provides the `beNil` matcher function for test writer that want -to make expectations on `nil` objects: - -```objc -// Objective-C - -expect(nil).to(equal(nil)); // fails -expect(nil).to(beNil()); // passes -``` - -If your matcher does not want to match with nil, you use `NonNilMatcherFunc` -and the `canMatchNil` constructor on `NMBObjCMatcher`. Using both types will -automatically generate expected value failure messages when they're nil. - -```swift - -public func beginWith(startingElement: T) -> NonNilMatcherFunc { - 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 - } -} - -extension NMBObjCMatcher { - public class func beginWithMatcher(expected: AnyObject) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = actualExpression.evaluate() - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return beginWith(expected).matches(expr, failureMessage: failureMessage) - } - } -} -``` - -# 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 - 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. - -## Installing Nimble as a Submodule - -To use Nimble as a submodule to test your macOS, iOS or tvOS applications, follow -these 4 easy steps: - -1. Clone the Nimble repository -2. Add Nimble.xcodeproj to the Xcode workspace for your project -3. Link Nimble.framework to your test target -4. Start writing expectations! - -For more detailed instructions on each of these steps, -read [How to Install Quick](https://github.com/Quick/Quick#how-to-install-quick). -Ignore the steps involving adding Quick to your project in order to -install just Nimble. - -## Installing Nimble via CocoaPods - -To use Nimble in CocoaPods to test your macOS, iOS or tvOS applications, add -Nimble to your podfile and add the ```use_frameworks!``` line to enable Swift -support for CocoaPods. - -```ruby -platform :ios, '8.0' - -source 'https://github.com/CocoaPods/Specs.git' - -# Whatever pods you need for your app go here - -target 'YOUR_APP_NAME_HERE_Tests', :exclusive => true do - use_frameworks! - pod 'Nimble', '~> 5.0.0' -end -``` - -Finally run `pod install`. - -## Using Nimble without XCTest - -Nimble is integrated with XCTest to allow it work well when used in Xcode test -bundles, however it can also be used in a standalone app. After installing -Nimble using one of the above methods, there are two additional steps required -to make this work. - -1. Create a custom assertion handler and assign an instance of it to the - global `NimbleAssertionHandler` variable. For example: - -```swift -class MyAssertionHandler : AssertionHandler { - func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) { - if (!assertion) { - print("Expectation failed: \(message.stringValue)") - } - } -} -``` -```swift -// Somewhere before you use any assertions -NimbleAssertionHandler = MyAssertionHandler() -``` - -2. Add a post-build action to fix an issue with the Swift XCTest support - library being unnecessarily copied into your app - * Edit your scheme in Xcode, and navigate to Build -> Post-actions - * Click the "+" icon and select "New Run Script Action" - * Open the "Provide build settings from" dropdown and select your target - * Enter the following script contents: -``` -rm "${SWIFT_STDLIB_TOOL_DESTINATION_DIR}/libswiftXCTest.dylib" -``` - -You can now use Nimble assertions in your code and handle failures as you see -fit. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/.gitignore b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/.gitignore deleted file mode 100644 index 5b05d7e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.DS_Store -project.xcworkspace/ -xcuserdata/ diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h deleted file mode 100644 index 6ec6a29..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// 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[]; - -__attribute__((visibility("hidden"))) -NSException* __nullable catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)()); diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m deleted file mode 100644 index 4f9772c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// 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" - -__attribute__((visibility("hidden"))) -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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift deleted file mode 100644 index b44a232..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// 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 - -// We can't simply cast to Self? in the catchInBlock method so we need this generic function wrapper to do the conversion for us. Mildly annoying. -private func catchReturnTypeConverter(_ type: T.Type, block: () -> Void) -> T? { - return catchExceptionOfKind(type, block) as? T -} - -extension NSException { - public static func catchException(in block: () -> Void) -> Self? { - return catchReturnTypeConverter(self, block: block) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/Info.plist deleted file mode 100644 index f14cf1e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSHumanReadableCopyright - Copyright © 2016 Matt Gallagher. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift deleted file mode 100644 index 2fa67c9..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// 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 - -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 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. - public class func catch_mach_exception_raise_state(_ exception_port: mach_port_t, exception: exception_type_t, code: UnsafePointer, codeCnt: mach_msg_type_number_t, flavor: UnsafeMutablePointer, old_state: UnsafePointer, old_stateCnt: mach_msg_type_number_t, new_state: thread_state_t, new_stateCnt: UnsafeMutablePointer) -> kern_return_t { - - #if arch(x86_64) - // Make sure we've been given enough memory - if old_stateCnt != x86_THREAD_STATE64_COUNT || new_stateCnt.pointee < x86_THREAD_STATE64_COUNT { - return 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 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 KERN_SUCCESS - #else - fatalError("Unavailable for this CPU architecture") - #endif - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h deleted file mode 100644 index 0333ed2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h +++ /dev/null @@ -1,61 +0,0 @@ -// -// CwlCatchBadInstruction.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. -// - -#if defined(__x86_64__) - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -// 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; - -extern boolean_t mach_exc_server(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); - -NS_ASSUME_NONNULL_END - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m deleted file mode 100644 index 22c1377..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// CwlCatchBadInstruction.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 "CwlCatchBadInstruction.h" - -// Assuming the "PRODUCT_NAME" macro is defined, this will create the name of the Swift generated header file -#define STRINGIZE_NO_EXPANSION(A) #A -#define STRINGIZE_WITH_EXPANSION(A) STRINGIZE_NO_EXPANSION(A) -#define SWIFT_INCLUDE STRINGIZE_WITH_EXPANSION(PRODUCT_NAME-Swift.h) - -// Include the Swift generated header file -#import SWIFT_INCLUDE - -/// 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) { - return [BadInstructionException catch_mach_exception_raise_state:exception_port exception:exception code:code codeCnt:codeCnt flavor:flavor old_state:old_state old_stateCnt:old_stateCnt new_state:new_state new_stateCnt:new_stateCnt]; -} - -// 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift deleted file mode 100644 index ab460b3..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift +++ /dev/null @@ -1,194 +0,0 @@ -// -// 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 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 subsquent 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift deleted file mode 100644 index b3afb12..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstructionPOSIX.swift +++ /dev/null @@ -1,100 +0,0 @@ -// -// CwlCatchBadInstructionPOSIX.swift -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 8/02/2016. -// 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 arch(x86_64) - -// This file is an alternative implementation to CwlCatchBadInstruction.swift that uses a SIGILL signal action and setenv/longjmp instead of a Mach exception handler and Objective-C exception raising. -// -// WARNING: -// This code is quick and dirty. It's a proof of concept for using a SIGILL handler and setjmp/longjmp where Mach exceptions and the Obj-C runtime aren't available. I ran the automated tests when I first wrote this code but I don't personally use it at all so by the time you're reading this comment, it probably broke and I didn't notice. -// Obvious limitations: -// * It doesn't work when debugging with lldb. -// * It doesn't scope correctly to the thread (it's global) -// * In violation of rules for signal handlers, it writes to the "red zone" on the stack -// * It isn't re-entrant -// * Plus all of the same caveats as the Mach exceptions version (doesn't play well with other handlers, probably leaks ARC memory, etc) -// Treat it like a loaded shotgun. Don't point it at your face. - -private var env = jmp_buf(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0) - -private func triggerLongJmp() { - longjmp(&env.0, 1) -} - -private func sigIllHandler(code: Int32, info: UnsafeMutablePointer<__siginfo>?, uap: UnsafeMutableRawPointer?) -> Void { - guard let context = uap?.assumingMemoryBound(to: ucontext64_t.self) else { return } - - // 1. Decrement the stack pointer - context.pointee.uc_mcontext64.pointee.__ss.__rsp -= __uint64_t(MemoryLayout.size) - - // 2. Save the old Instruction Pointer to the stack. - let rsp = context.pointee.uc_mcontext64.pointee.__ss.__rsp - if let ump = UnsafeMutablePointer<__uint64_t>(bitPattern: UInt(rsp)) { - ump.pointee = rsp - } - - // 3. Set the Instruction Pointer to the new function's address - var f: @convention(c) () -> Void = triggerLongJmp - withUnsafePointer(to: &f) { $0.withMemoryRebound(to: __uint64_t.self, capacity: 1) { ptr in - context.pointee.uc_mcontext64.pointee.__ss.__rip = ptr.pointee - } } -} - -/// Without Mach exceptions or the Objective-C runtime, there's nothing to put in the exception object. It's really just a boolean – either a SIGILL was caught or not. -public class BadInstructionException { -} - -/// Run the provided block. If a POSIX SIGILL is received, handle it and return a BadInstructionException (which is just an empty object in this POSIX signal version). 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 SIGILL is received, the block will be interrupted using a C `longjmp`. The risks associated with abrupt jumps apply here: most Swift functions are *not* interrupt-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 SIGILL is raised during the execution of `block` then a BadInstructionException will be returned, otherwise `nil`. -public func catchBadInstruction( block: () -> Void) -> BadInstructionException? { - // Construct the signal action - var sigActionPrev = sigaction() - let action = __sigaction_u(__sa_sigaction: sigIllHandler) - var sigActionNew = sigaction(__sigaction_u: action, sa_mask: sigset_t(), sa_flags: SA_SIGINFO) - - // Install the signal action - if sigaction(SIGILL, &sigActionNew, &sigActionPrev) != 0 { - fatalError("Sigaction error: \(errno)") - } - - defer { - // Restore the previous signal action - if sigaction(SIGILL, &sigActionPrev, nil) != 0 { - fatalError("Sigaction error: \(errno)") - } - } - - // Prepare the jump point - if setjmp(&env.0) != 0 { - // Handle jump received - return BadInstructionException() - } - - // Run the block - block() - - return nil -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift deleted file mode 100644 index 12a6b9f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift +++ /dev/null @@ -1,63 +0,0 @@ -// -// 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/port.h -// #define MACH_PORT_RIGHT_RECEIVE ((mach_port_right_t) 1) -let MACH_PORT_RIGHT_RECEIVE: mach_port_right_t = 1 - -// 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)) -let MACH_MSG_TYPE_MAKE_SEND: UInt32 = 20 -func MACH_MSGH_BITS_REMOTE(_ bits: UInt32) -> UInt32 { return bits & UInt32(MACH_MSGH_BITS_REMOTE_MASK) } -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) -// #define EXCEPTION_DEFAULT 1 -let EXC_BAD_INSTRUCTION: UInt32 = 2 -let EXC_MASK_BAD_INSTRUCTION: UInt32 = 1 << EXC_BAD_INSTRUCTION -let EXCEPTION_DEFAULT: Int32 = 1 - -// From /usr/include/mach/i386/thread_status.h -// #define THREAD_STATE_NONE 13 -// #define x86_THREAD_STATE64_COUNT ((mach_msg_type_number_t) \ -// ( sizeof (x86_thread_state64_t) / sizeof (int) )) -let THREAD_STATE_NONE: Int32 = 13 -let x86_THREAD_STATE64_COUNT = UInt32(MemoryLayout.size / MemoryLayout.size) - -let EXC_TYPES_COUNT = 14 -struct execTypesCountTuple { - // From /usr/include/mach/i386/exception.h - // #define EXC_TYPES_COUNT 14 /* incl. illegal exception 0 */ - 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) - init() { - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Info.plist deleted file mode 100644 index f14cf1e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSHumanReadableCopyright - Copyright © 2016 Matt Gallagher. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c deleted file mode 100644 index 2334538..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c +++ /dev/null @@ -1,537 +0,0 @@ -/* - * IDENTIFICATION: - * stub generated Mon Jan 11 00:24:26 2016 - * with a MiG generated by bootstrap_cmds-93 - * OPTIONS: - */ - -/* Module mach_exc */ - -#if defined(__x86_64__) - -#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; - - 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h deleted file mode 100644 index 766ba11..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h +++ /dev/null @@ -1,298 +0,0 @@ -#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 */ - - -#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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/README.md deleted file mode 100644 index a1a9a70..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Lib/CwlPreconditionTesting/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# CwlPreconditionTesting - -A Mach exception handler, written in Swift and Objective-C, that allows `EXC_BAD_INSTRUCTION` (as raised by Swift's `assertionFailure`/`preconditionFailure`/`fatalError`) to be caught and tested. - -For an extended discussion of this code, please see the Cocoa with Love article: - -[Partial functions in Swift, Part 2: Catching precondition failures](http://cocoawithlove.com/blog/2016/02/02/partial-functions-part-two-catching-precondition-failures.html) - -## Usage - -The short version is: - -1. `git clone https://github.com/mattgallagher/CwlPreconditionTesting.git` -2. drag the "CwlPreconditionTesting.xcodeproj" file into your project's file tree in Xcode -3. go to your testing target's Build Phase settings and under "Target Dependencies" press the "+" button and select the relevant "CwlPreconditionTesting" target ("_iOS" or "_OSX", depending on your testing target's SDK) -4. write `import CwlPreconditionTesting` at the top of any test file where you want to use `catchBadInstruction` (Swift should handle the linkage automatically when you do this) -5. use the `catchBadInstruction` function as shown in the [CwlCatchBadInstructionTests.swift tests file](https://github.com/mattgallagher/CwlPreconditionTesting/blob/master/CwlPreconditionTestingTests/CwlCatchBadInstructionTests.swift?ts=4) - -### Project details - -The "CwlPreconditionTesting.xcodeproj" contains two targets: - -* CwlPreconditionTesting_OSX -* CwlPreconditionTesting_iOS - -both build a framework named "CwlPreconditionTesting.framework". If you're linking manually, be certain to select the "CwlPreconditionTesting.framework" from the appropriate target. - -Remember: the iOS build is useful only in the simulator. All Mach exception handling code will be conditionally excluded in any device build. - -### Static inclusion - -Due to the complications associated with needing to call into and out of Objective-C, static inclusion in other projects is not a single file nor a quick drag and drop. There's at least 7 files and you'll need to add some project settings. - -All of the following files: - -* CwlCatchBadInstruction.swift -* CwlCatchBadInstruction.h -* CwlCatchBadInstruction.m -* CwlCatchException.swift -* CwlCatchException.h -* CwlCatchException.m - -and either: - -* $(SDKROOT)/usr/include/mach/mach_exc.defs -* mach_excServer.c - -need to be added to the testing target for OS X projects or iOS projects, respectively. - -Your target will also need to have the following macros defined in the "Apple LLVM - Preprocessing" → "Preprocessor Macros" build setting: - - PRODUCT_NAME=$(PRODUCT_NAME) - -This lets the Objective-C file generate the include directive for the autogenerated Swift header so it can call back into Swift during the Mach exception handler callbacks. This macro should stay in sync if you change the target name but if you do anything else in your project that changes the name of the autogenerated Swift header independent of the target name (or you want to add spaces or other command-line complications to the target name), you'll want to update "CwlCatchBadInstruction.m" directly with the correct include directive. - -Additionally, you'll need a standard Objective-C "Bridging header" for your testing target and it will need to include the following import statements: - -``` -#if defined(__x86_64__) -#import -#endif - -#import -``` - -### Using POSIX signals and setjmp/longjmp - -For comparison or for anyone running this code on a platform without Mach exceptions or the Objective-C runtime, I've added a proof-of-concept implementation of `catchBadInstruction` that uses a POSIX SIGILL `sigaction` and `setjmp`/`longjmp` to perform the throw. - -In Xcode, you can simply select the CwlPreconditionTesting_POSIX target (instead of the OSX or iOS targets). If you're building without Xcode: all you need is the CwlCatchBadInstructionPOSIX.swift file (compared to the Mach exception handler, the code is tiny doesn't have any weird Objective-C/MiG file dependencies). - -**Warning No. 1**: on OS X, this approach can't be used when lldb is attached since lldb's Mach exception handler blocks the SIGILL from ever occurring (I've disabled the "Debug Executable" setting for the tests in Xcode - re-enable it to witness the problem). - -**Warning No. 2**: if you're switching between the CwlPreconditionTesting_OSX and CwlPreconditionTesting_POSIX targets, Xcode (as of Xcode 7.2.1) will not detect the change and will not remove the old framework correctly so you'll need to *clean your project* otherwise the old framework will hang around. - -Additional problems in decreasing severity include: - -* the signal handler is whole process (rather than correctly scoped to the thread where the "catch" occurs) -* the signal handler doesn't deal with re-entrancy whereas the mach exception handler remains deterministic in the face of multiple fatal errors -* the signal handler overwrites the "[red zone](https://en.wikipedia.org/wiki/Red_zone_(computing))" which is technically frowned upon in signal handlers (although unlikely to cause problems here) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift deleted file mode 100644 index 2e58fdf..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation - -/// Protocol for the assertion handler that Nimble uses for all expectations. -public protocol AssertionHandler { - func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) -} - -/// Global backing interface for assertions that Nimble creates. -/// Defaults to a private test handler that passes through to XCTest. -/// -/// If XCTest is not available, you must assign your own assertion handler -/// before using any matchers, otherwise Nimble will abort the program. -/// -/// @see AssertionHandler -public var NimbleAssertionHandler: AssertionHandler = { () -> AssertionHandler in - return isXCTestAvailable() ? NimbleXCTestHandler() : NimbleXCTestUnavailableHandler() -}() diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift deleted file mode 100644 index 2e30f61..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift +++ /dev/null @@ -1,20 +0,0 @@ - -/// AssertionDispatcher allows multiple AssertionHandlers to receive -/// assertion messages. -/// -/// @warning Does not fully dispatch if one of the handlers raises an exception. -/// This is possible with XCTest-based assertion handlers. -/// -public class AssertionDispatcher: AssertionHandler { - let handlers: [AssertionHandler] - - public init(handlers: [AssertionHandler]) { - self.handlers = handlers - } - - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - for handler in handlers { - handler.assert(assertion, message: message, location: location) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift deleted file mode 100644 index 7d0bab2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift +++ /dev/null @@ -1,100 +0,0 @@ -import Foundation - -/// A data structure that stores information about an assertion when -/// AssertionRecorder is set as the Nimble assertion handler. -/// -/// @see AssertionRecorder -/// @see AssertionHandler -public struct AssertionRecord: CustomStringConvertible { - /// Whether the assertion succeeded or failed - public let success: Bool - /// The failure message the assertion would display on failure. - public let message: FailureMessage - /// The source location the expectation occurred on. - public let location: SourceLocation - - public var description: String { - return "AssertionRecord { success=\(success), message='\(message.stringValue)', location=\(location) }" - } -} - -/// An AssertionHandler that silently records assertions that Nimble makes. -/// This is useful for testing failure messages for matchers. -/// -/// @see AssertionHandler -public class AssertionRecorder : AssertionHandler { - /// All the assertions that were captured by this recorder - public var assertions = [AssertionRecord]() - - public init() {} - - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - assertions.append( - AssertionRecord( - success: assertion, - message: message, - location: location)) - } -} - -/// Allows you to temporarily replace the current Nimble assertion handler with -/// the one provided for the scope of the closure. -/// -/// Once the closure finishes, then the original Nimble assertion handler is restored. -/// -/// @see AssertionHandler -public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler, closure: @escaping () throws -> Void) { - let environment = NimbleEnvironment.activeInstance - let oldRecorder = environment.assertionHandler - let capturer = NMBExceptionCapture(handler: nil, finally: ({ - environment.assertionHandler = oldRecorder - })) - environment.assertionHandler = tempAssertionHandler - capturer.tryBlock { - try! closure() - } -} - -/// Captures expectations that occur in the given closure. Note that all -/// expectations will still go through to the default Nimble handler. -/// -/// This can be useful if you want to gather information about expectations -/// that occur within a closure. -/// -/// @param silently expectations are no longer send to the default Nimble -/// assertion handler when this is true. Defaults to false. -/// -/// @see gatherFailingExpectations -public func gatherExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { - let previousRecorder = NimbleEnvironment.activeInstance.assertionHandler - let recorder = AssertionRecorder() - let handlers: [AssertionHandler] - - if silently { - handlers = [recorder] - } else { - handlers = [recorder, previousRecorder] - } - - let dispatcher = AssertionDispatcher(handlers: handlers) - withAssertionHandler(dispatcher, closure: closure) - return recorder.assertions -} - -/// Captures failed expectations that occur in the given closure. Note that all -/// expectations will still go through to the default Nimble handler. -/// -/// This can be useful if you want to gather information about failed -/// expectations that occur within a closure. -/// -/// @param silently expectations are no longer send to the default Nimble -/// assertion handler when this is true. Defaults to false. -/// -/// @see gatherExpectations -/// @see raiseException source for an example use case. -public func gatherFailingExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { - let assertions = gatherExpectations(silently: silently, closure: closure) - return assertions.filter { assertion in - !assertion.success - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift deleted file mode 100644 index 47d4eed..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift +++ /dev/null @@ -1,131 +0,0 @@ -import Foundation - -#if _runtime(_ObjC) - -internal struct ObjCMatcherWrapper : Matcher { - let matcher: NMBMatcher - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.matches( - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.doesNotMatch( - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) - } -} - -// Equivalent to Expectation, but for Nimble's Objective-C interface -public class NMBExpectation : NSObject { - internal let _actualBlock: () -> NSObject! - internal var _negative: Bool - internal let _file: FileString - internal let _line: UInt - internal var _timeout: TimeInterval = 1.0 - - public init(actualBlock: @escaping () -> NSObject!, negative: Bool, file: FileString, line: UInt) { - self._actualBlock = actualBlock - self._negative = negative - self._file = file - self._line = line - } - - private var expectValue: Expectation { - return expect(_file, line: _line){ - self._actualBlock() as NSObject? - } - } - - public var withTimeout: (TimeInterval) -> NMBExpectation { - return ({ timeout in self._timeout = timeout - return self - }) - } - - public var to: (NMBMatcher) -> Void { - return ({ matcher in - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher)) - }) - } - - public var toWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher), description: description) - }) - } - - public var toNot: (NMBMatcher) -> Void { - return ({ matcher in - self.expectValue.toNot( - ObjCMatcherWrapper(matcher: matcher) - ) - }) - } - - public var toNotWithDescription: (NMBMatcher, String) -> Void { - return ({ matcher, description in - self.expectValue.toNot( - ObjCMatcherWrapper(matcher: matcher), description: description - ) - }) - } - - public var notTo: (NMBMatcher) -> Void { return toNot } - - public var notToWithDescription: (NMBMatcher, String) -> Void { return toNotWithDescription } - - public var toEventually: (NMBMatcher) -> Void { - return ({ matcher in - 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 - ) - }) - } - - public var toEventuallyNot: (NMBMatcher) -> Void { - return ({ matcher in - 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 - ) - }) - } - - public var toNotEventually: (NMBMatcher) -> Void { return toEventuallyNot } - - public var toNotEventuallyWithDescription: (NMBMatcher, String) -> Void { return toEventuallyNotWithDescription } - - public class func failWithMessage(_ message: String, file: FileString, line: UInt) { - fail(message, location: SourceLocation(file: file, line: line)) - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift deleted file mode 100644 index c609f69..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift +++ /dev/null @@ -1,81 +0,0 @@ -import Foundation - -#if _runtime(_ObjC) - -public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) -> Bool -public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) -> Bool - -public class NMBObjCMatcher : NSObject, NMBMatcher { - let _match: MatcherBlock - let _doesNotMatch: MatcherBlock - let canMatchNil: Bool - - public init(canMatchNil: Bool, matcher: @escaping MatcherBlock, notMatcher: @escaping MatcherBlock) { - self.canMatchNil = canMatchNil - self._match = matcher - self._doesNotMatch = notMatcher - } - - public convenience init(matcher: @escaping MatcherBlock) { - self.init(canMatchNil: true, matcher: matcher) - } - - public convenience init(canMatchNil: Bool, matcher: @escaping MatcherBlock) { - self.init(canMatchNil: canMatchNil, matcher: matcher, notMatcher: ({ actualExpression, failureMessage in - return !matcher(actualExpression, failureMessage) - })) - } - - public convenience init(matcher: @escaping FullMatcherBlock) { - self.init(canMatchNil: true, matcher: matcher) - } - - public convenience init(canMatchNil: Bool, matcher: @escaping FullMatcherBlock) { - self.init(canMatchNil: canMatchNil, matcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, false) - }), notMatcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, true) - })) - } - - private func canMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - do { - if !canMatchNil { - if try actualExpression.evaluate() == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - return false - } - } - } catch let error { - failureMessage.actualValue = "an unexpected error thrown: \(error)" - return false - } - return true - } - - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let expr = Expression(expression: actualBlock, location: location) - let result = _match( - expr, - failureMessage) - if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { - return result - } else { - return false - } - } - - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let expr = Expression(expression: actualBlock, location: location) - let result = _doesNotMatch( - expr, - failureMessage) - if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { - return result - } else { - return false - } - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift deleted file mode 100644 index a55cb27..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Dispatch -import Foundation - -/// "Global" state of Nimble is stored here. Only DSL functions should access / be aware of this -/// class' existance -internal class NimbleEnvironment { - static var activeInstance: NimbleEnvironment { - get { - let env = Thread.current.threadDictionary["NimbleEnvironment"] - if let env = env as? NimbleEnvironment { - return env - } else { - let newEnv = NimbleEnvironment() - self.activeInstance = newEnv - return newEnv - } - } - set { - Thread.current.threadDictionary["NimbleEnvironment"] = newValue - } - } - - // TODO: eventually migrate the global to this environment value - var assertionHandler: AssertionHandler { - get { return NimbleAssertionHandler } - set { NimbleAssertionHandler = newValue } - } - - var suppressTVOSAssertionWarning: Bool = false - var awaiter: Awaiter - - init() { - let timeoutQueue: DispatchQueue - if #available(OSX 10.10, *) { - timeoutQueue = DispatchQueue.global(qos: .userInitiated) - } else { - timeoutQueue = DispatchQueue.global(priority: .high) - } - - awaiter = Awaiter( - waitLock: AssertionWaitLock(), - asyncQueue: .main, - timeoutQueue: timeoutQueue) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift deleted file mode 100644 index 1aba8bc..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift +++ /dev/null @@ -1,77 +0,0 @@ -import Foundation -import XCTest - -/// Default handler for Nimble. This assertion handler passes failures along to -/// XCTest. -public class NimbleXCTestHandler : AssertionHandler { - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - if !assertion { - recordFailure("\(message.stringValue)\n", location: location) - } - } -} - -/// Alternative handler for Nimble. This assertion handler passes failures along -/// to XCTest by attempting to reduce the failure message size. -public class NimbleShortXCTestHandler: AssertionHandler { - public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) { - if !assertion { - let msg: String - if let actual = message.actualValue { - msg = "got: \(actual) \(message.postfixActual)" - } else { - msg = "expected \(message.to) \(message.postfixMessage)" - } - recordFailure("\(msg)\n", location: location) - } - } -} - -/// Fallback handler in case XCTest is unavailable. This assertion handler will abort -/// the program if it is invoked. -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 -@objc final internal class CurrentTestCaseTracker: NSObject, XCTestObservation { - @objc static let sharedInstance = CurrentTestCaseTracker() - - private(set) var currentTestCase: XCTestCase? - - @objc func testCaseWillStart(_ testCase: XCTestCase) { - currentTestCase = testCase - } - - @objc func testCaseDidFinish(_ testCase: XCTestCase) { - currentTestCase = nil - } -} -#endif - - -func isXCTestAvailable() -> Bool { -#if _runtime(_ObjC) - // XCTest is weakly linked and so may not be present - return NSClassFromString("XCTestCase") != nil -#else - return true -#endif -} - -private func recordFailure(_ message: String, location: SourceLocation) { -#if _runtime(_ObjC) - if let testCase = CurrentTestCaseTracker.sharedInstance.currentTestCase { - testCase.recordFailure(withDescription: message, inFile: location.file, atLine: location.line, expected: true) - } else { - let msg = "Attempted to report a test failure to XCTest while no test case was running. " + - "The failure was:\n\"\(message)\"\nIt occurred at: \(location.file):\(location.line)" - NSException(name: .internalInconsistencyException, reason: msg, userInfo: nil).raise() - } -#else - XCTFail("\(message)\n", file: location.file, line: location.line) -#endif -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift deleted file mode 100644 index dd02aa4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -#if !_runtime(_ObjC) -// swift-corelibs-foundation doesn't provide NSException at all, so provide a dummy -class NSException {} -#endif - -// NOTE: This file is not intended to be included in the Xcode project. It -// is picked up by the Swift Package Manager during its build process. - -/// A dummy reimplementation of the `NMBExceptionCapture` class to serve -/// as a stand-in for build and runtime environments that don't support -/// Objective C. -internal class ExceptionCapture { - let finally: (() -> Void)? - - init(handler: ((NSException) -> Void)?, finally: (() -> Void)?) { - self.finally = finally - } - - func tryBlock(_ unsafeBlock: (() -> Void)) { - // We have no way of handling Objective C exceptions in Swift, - // so we just go ahead and run the unsafeBlock as-is - unsafeBlock() - - finally?() - } -} - -/// Compatibility with the actual Objective-C implementation -typealias NMBExceptionCapture = ExceptionCapture diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift deleted file mode 100644 index 619b6dc..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift +++ /dev/null @@ -1,98 +0,0 @@ -import Dispatch -import Foundation - -private enum ErrorResult { - case exception(NSException) - case error(Error) - case none -} - -/// Only classes, protocols, methods, properties, and subscript declarations can be -/// bridges to Objective-C via the @objc keyword. This class encapsulates callback-style -/// asynchronous waiting logic so that it may be called from Objective-C and Swift. -internal class NMBWait: NSObject { - internal class func until( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) -> Void) -> Void { - return throwableUntil(timeout: timeout, file: file, line: line) { done in - action(done) - } - } - - // Using a throwable closure makes this method not objc compatible. - internal class func throwableUntil( - timeout: TimeInterval, - file: FileString = #file, - line: UInt = #line, - action: @escaping (@escaping () -> Void) throws -> Void) -> Void { - let awaiter = NimbleEnvironment.activeInstance.awaiter - let leeway = timeout / 2.0 - let result = awaiter.performBlock { (done: @escaping (ErrorResult) -> Void) throws -> Void in - DispatchQueue.main.async { - let capture = NMBExceptionCapture( - handler: ({ exception in - done(.exception(exception)) - }), - finally: ({ }) - ) - capture.tryBlock { - do { - try action() { - done(.none) - } - } catch let e { - done(.error(e)) - } - } - } - }.timeout(timeout, forcefullyAbortTimeout: leeway).wait("waitUntil(...)", file: file, line: line) - - switch result { - case .incomplete: internalError("Reached .incomplete state for waitUntil(...).") - case .blockedRunLoop: - fail(blockedRunLoopErrorMessageFor("-waitUntil()", leeway: leeway), - file: file, line: line) - case .timedOut: - let pluralize = (timeout == 1 ? "" : "s") - fail("Waited more than \(timeout) second\(pluralize)", file: file, line: line) - case let .raisedException(exception): - fail("Unexpected exception raised: \(exception)") - case let .errorThrown(error): - fail("Unexpected error thrown: \(error)") - case .completed(.exception(let exception)): - fail("Unexpected exception raised: \(exception)") - case .completed(.error(let error)): - fail("Unexpected error thrown: \(error)") - case .completed(.none): // success - break - } - } - - #if _runtime(_ObjC) - @objc(untilFile:line:action:) - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) -> Void { - until(timeout: 1, file: file, line: line, action: action) - } - #else - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) -> Void { - until(timeout: 1, file: file, line: line, action: action) - } - #endif -} - -internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterval) -> String { - return "\(fnName) timed out but was unable to run the timeout handler because the main thread is unresponsive (\(leeway) seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." -} - -/// Wait asynchronously until the done closure is called or the timeout has been reached. -/// -/// @discussion -/// Call the done() closure to indicate the waiting has completed. -/// -/// 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 { - NMBWait.until(timeout: timeout, file: file, line: line, action: action) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift deleted file mode 100644 index 7ebd684..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation - -/// Make an expectation on a given actual value. The value given is lazily evaluated. -public func expect(_ expression: @autoclosure @escaping () throws -> T?, file: FileString = #file, line: UInt = #line) -> Expectation { - return Expectation( - expression: Expression( - expression: expression, - location: SourceLocation(file: file, line: line), - isClosure: true)) -} - -/// Make an expectation on a given actual value. The closure is lazily invoked. -public func expect(_ file: FileString = #file, line: UInt = #line, expression: @escaping () throws -> T?) -> Expectation { - return Expectation( - expression: Expression( - expression: expression, - location: SourceLocation(file: file, line: line), - isClosure: true)) -} - -/// Always fails the test with a message and a specified location. -public func fail(_ message: String, location: SourceLocation) { - let handler = NimbleEnvironment.activeInstance.assertionHandler - handler.assert(false, message: FailureMessage(stringValue: message), location: location) -} - -/// Always fails the test with a message. -public func fail(_ message: String, file: FileString = #file, line: UInt = #line) { - fail(message, location: SourceLocation(file: file, line: line)) -} - -/// Always fails the test. -public func fail(_ file: FileString = #file, line: UInt = #line) { - fail("fail() always fails", file: file, line: line) -} - -/// Like Swift's precondition(), but raises NSExceptions instead of sigaborts -internal func nimblePrecondition( - _ expr: @autoclosure() -> Bool, - _ name: @autoclosure() -> String, - _ message: @autoclosure() -> String, - file: StaticString = #file, - line: UInt = #line) { - let result = expr() - if !result { -#if _runtime(_ObjC) - let e = NSException( - name: NSExceptionName(name()), - reason: message(), - userInfo: nil) - e.raise() -#else - preconditionFailure("\(name()) - \(message())", file: file, line: line) -#endif - } -} - -internal func internalError(_ msg: String, file: FileString = #file, line: UInt = #line) -> Never { - fatalError( - "Nimble Bug Found: \(msg) at \(file):\(line).\n" + - "Please file a bug to Nimble: https://github.com/Quick/Nimble/issues with the " + - "code snippet that caused this error." - ) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift deleted file mode 100644 index 16d7c3b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift +++ /dev/null @@ -1,76 +0,0 @@ -import Foundation - -internal func expressionMatches(_ expression: Expression, matcher: U, to: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T -{ - let msg = FailureMessage() - msg.userDescription = description - msg.to = to - do { - let pass = try matcher.matches(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" - } - return (pass, msg) - } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" - return (false, msg) - } -} - -internal func expressionDoesNotMatch(_ expression: Expression, matcher: U, toNot: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T -{ - let msg = FailureMessage() - msg.userDescription = description - msg.to = toNot - do { - let pass = try matcher.doesNotMatch(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" - } - return (pass, msg) - } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" - return (false, msg) - } -} - -public struct Expectation { - - public let expression: Expression - - public func verify(_ pass: Bool, _ message: FailureMessage) { - let handler = NimbleEnvironment.activeInstance.assertionHandler - handler.assert(pass, message: message, location: expression.location) - } - - /// Tests the actual value using a matcher to match. - public func to(_ matcher: U, description: String? = nil) - where U: Matcher, U.ValueType == T - { - let (pass, msg) = expressionMatches(expression, matcher: matcher, to: "to", description: description) - verify(pass, msg) - } - - /// Tests the actual value using a matcher to not match. - public func toNot(_ matcher: U, description: String? = nil) - 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. - /// - /// Alias to toNot(). - public func notTo(_ matcher: U, description: String? = nil) - where U: Matcher, U.ValueType == T - { - toNot(matcher, description: description) - } - - // see: - // - AsyncMatcherWrapper for extension - // - NMBExpectation for Objective-C interface -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift deleted file mode 100644 index 8ba53e4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift +++ /dev/null @@ -1,90 +0,0 @@ -import Foundation - -// Memoizes the given closure, only calling the passed -// closure once; even if repeat calls to the returned closure -internal func memoizedClosure(_ closure: @escaping () throws -> T) -> (Bool) throws -> T { - var cache: T? - return ({ withoutCaching in - if (withoutCaching || cache == nil) { - cache = try closure() - } - return cache! - }) -} - -/// Expression represents the closure of the value inside expect(...). -/// Expressions are memoized by default. This makes them safe to call -/// evaluate() multiple times without causing a re-evaluation of the underlying -/// closure. -/// -/// @warning Since the closure can be any code, Objective-C code may choose -/// to raise an exception. Currently, Expression does not memoize -/// exception raising. -/// -/// This provides a common consumable API for matchers to utilize to allow -/// Nimble to change internals to how the captured closure is managed. -public struct Expression { - internal let _expression: (Bool) throws -> T? - internal let _withoutCaching: Bool - public let location: SourceLocation - public let isClosure: Bool - - /// Creates a new expression struct. Normally, expect(...) will manage this - /// creation process. The expression is memoized. - /// - /// @param expression The closure that produces a given value. - /// @param location The source location that this closure originates from. - /// @param isClosure A bool indicating if the captured expression is a - /// closure or internally produced closure. Some matchers - /// may require closures. For example, toEventually() - /// requires an explicit closure. This gives Nimble - /// flexibility if @autoclosure behavior changes between - /// Swift versions. Nimble internals always sets this true. - public init(expression: @escaping () throws -> T?, location: SourceLocation, isClosure: Bool = true) { - self._expression = memoizedClosure(expression) - self.location = location - self._withoutCaching = false - self.isClosure = isClosure - } - - /// Creates a new expression struct. Normally, expect(...) will manage this - /// creation process. - /// - /// @param expression The closure that produces a given value. - /// @param location The source location that this closure originates from. - /// @param withoutCaching Indicates if the struct should memoize the given - /// closure's result. Subsequent evaluate() calls will - /// not call the given closure if this is true. - /// @param isClosure A bool indicating if the captured expression is a - /// closure or internally produced closure. Some matchers - /// may require closures. For example, toEventually() - /// requires an explicit closure. This gives Nimble - /// flexibility if @autoclosure behavior changes between - /// Swift versions. Nimble internals always sets this true. - public init(memoizedExpression: @escaping (Bool) throws -> T?, location: SourceLocation, withoutCaching: Bool, isClosure: Bool = true) { - self._expression = memoizedExpression - self.location = location - self._withoutCaching = withoutCaching - self.isClosure = isClosure - } - - /// Returns a new Expression from the given expression. Identical to a map() - /// on this type. This should be used only to typecast the Expression's - /// closure value. - /// - /// The returned expression will preserve location and isClosure. - /// - /// @param block The block that can cast the current Expression value to a - /// new type. - public func cast(_ block: @escaping (T?) throws -> U?) -> Expression { - return Expression(expression: ({ try block(self.evaluate()) }), location: self.location, isClosure: self.isClosure) - } - - public func evaluate() throws -> T? { - return try self._expression(_withoutCaching) - } - - public func withoutCaching() -> Expression { - return Expression(memoizedExpression: self._expression, location: location, withoutCaching: true, isClosure: isClosure) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/FailureMessage.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/FailureMessage.swift deleted file mode 100644 index 2d245e5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/FailureMessage.swift +++ /dev/null @@ -1,65 +0,0 @@ -import Foundation - -/// Encapsulates the failure message that matchers can report to the end user. -/// -/// This is shared state between Nimble and matchers that mutate this value. -public class FailureMessage: NSObject { - public var expected: String = "expected" - public var actualValue: String? = "" // empty string -> use default; nil -> exclude - public var to: String = "to" - public var postfixMessage: String = "match" - public var postfixActual: String = "" - /// 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 stringValue: String { - get { - if let value = _stringValueOverride { - return value - } else { - return computeStringValue() - } - } - set { - _stringValueOverride = newValue - } - } - - internal var _stringValueOverride: String? - - public override init() { - } - - public init(stringValue: String) { - _stringValueOverride = stringValue - } - - internal func stripNewlines(_ str: String) -> String { - let whitespaces = CharacterSet.whitespacesAndNewlines - return str - .components(separatedBy: "\n") - .map { line in line.trimmingCharacters(in: whitespaces) } - .joined(separator: "") - } - - internal func computeStringValue() -> String { - var value = "\(expected) \(to) \(postfixMessage)" - if let actualValue = actualValue { - value = "\(expected) \(to) \(postfixMessage), got \(actualValue)\(postfixActual)" - } - value = stripNewlines(value) - - if let extendedMessage = extendedMessage { - value += "\n\(stripNewlines(extendedMessage))" - } - - if let userDescription = userDescription { - return "\(userDescription)\n\(value)" - } - - return value - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Info.plist deleted file mode 100644 index 6ac80b8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSHumanReadableCopyright - Copyright © 2014 Jeff Hui. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift deleted file mode 100644 index 3a9258d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift +++ /dev/null @@ -1,100 +0,0 @@ -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 - (_ 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 - (_ matcher: V) -> NonNilMatcherFunc - where U: Sequence, V: Matcher, U.Iterator.Element == V.ValueType -{ - return createAllPassMatcher() { - try matcher.matches($0, failureMessage: $1) - } -} - -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() { - 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 - } - } - failureMessage.postfixMessage = "all \(failureMessage.postfixMessage)" - } else { - failureMessage.postfixMessage = "all pass (use beNil() to match nils)" - return false - } - - return true - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func allPassMatcher(_ matcher: NMBObjCMatcher) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage 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) - while let obj = generator.next() { - if let nsObject = obj as? NSObject { - nsObjects.append(nsObject) - } else { - collectionIsUsable = false - break - } - } - } else { - collectionIsUsable = false - } - - if !collectionIsUsable { - failureMessage.postfixMessage = - "allPass only works with NSFastEnumeration (NSArray, NSSet, ...) of NSObjects" - failureMessage.expected = "" - failureMessage.to = "" - return false - } - - 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) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift deleted file mode 100644 index 6b89c76..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift +++ /dev/null @@ -1,146 +0,0 @@ -import Foundation - -/// If you are running on a slower machine, it could be useful to increase the default timeout value -/// or slow down poll interval. Default timeout interval is 1, and poll interval is 0.01. -public struct AsyncDefaults { - public static var Timeout: TimeInterval = 1 - public static var PollInterval: TimeInterval = 0.01 -} - -internal struct AsyncMatcherWrapper: Matcher - where U: Matcher, U.ValueType == T -{ - let fullMatcher: U - let timeoutInterval: TimeInterval - let pollInterval: TimeInterval - - init(fullMatcher: U, timeoutInterval: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval) { - self.fullMatcher = fullMatcher - self.timeoutInterval = timeoutInterval - self.pollInterval = pollInterval - } - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let fnName = "expect(...).toEventually(...)" - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: fnName) { - try self.fullMatcher.matches(uncachedExpression, failureMessage: failureMessage) - } - switch (result) { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventually(...).") - } - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: "expect(...).toEventuallyNot(...)") { - try self.fullMatcher.doesNotMatch(uncachedExpression, failureMessage: failureMessage) - } - switch (result) { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventuallyNot(...).") - } - } -} - -private let toEventuallyRequiresClosureError = FailureMessage(stringValue: "expect(...).toEventually(...) requires an explicit closure (eg - expect { ... }.toEventually(...) )\nSwift 1.2 @autoclosure behavior has changed in an incompatible way for Nimble to function") - - -extension Expectation { - /// Tests the actual value using a matcher to match by checking continuously - /// at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T - { - if expression.isClosure { - let (pass, msg) = expressionMatches( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - to: "to eventually", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventuallyNot(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T - { - if expression.isClosure { - let (pass, msg) = expressionDoesNotMatch( - expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), - toNot: "to eventually not", - description: description - ) - verify(pass, msg) - } else { - verify(false, toEventuallyRequiresClosureError) - } - } - - /// Tests the actual value using a matcher to not match by checking - /// continuously at each pollInterval until the timeout is reached. - /// - /// Alias of toEventuallyNot() - /// - /// @discussion - /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function - /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toNotEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) - where U: Matcher, U.ValueType == T - { - return toEventuallyNot(matcher, timeout: timeout, pollInterval: pollInterval, description: description) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift deleted file mode 100644 index 99b8f8f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift +++ /dev/null @@ -1,38 +0,0 @@ -import Foundation - -#if _runtime(_ObjC) - -// 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 - } -} - -/// 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 - let instance = try actualExpression.evaluate() - if let validInstance = instance { - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" - } else { - failureMessage.actualValue = "" - } - failureMessage.postfixMessage = "be a kind of \(String(describing: expectedClass))" - return instance != nil && instance!.isKind(of: expectedClass) - } -} - -extension NMBObjCMatcher { - public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAKindOf(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift deleted file mode 100644 index 2298c78..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift +++ /dev/null @@ -1,40 +0,0 @@ -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 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 - let instance = try actualExpression.evaluate() - if let validInstance = instance { - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" - } else { - failureMessage.actualValue = "" - } - 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) -extension NMBObjCMatcher { - public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAnInstanceOf(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift deleted file mode 100644 index 48e9895..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift +++ /dev/null @@ -1,122 +0,0 @@ -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 -} - -/// 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) - } -} - -/// 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: NMBDoubleConvertible, within delta: Double = DefaultDelta) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta, failureMessage: failureMessage) - } -} - -#if _runtime(_ObjC) -public class NMBObjCBeCloseToMatcher : NSObject, NMBMatcher { - var _expected: NSNumber - var _delta: CDouble - init(expected: NSNumber, within: CDouble) { - _expected = expected - _delta = within - } - - public func matches(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.matches(expr, failureMessage: failureMessage) - } - - public func doesNotMatch(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.doesNotMatch(expr, failureMessage: failureMessage) - } - - public var within: (CDouble) -> NMBObjCBeCloseToMatcher { - return ({ delta in - return NMBObjCBeCloseToMatcher(expected: self._expected, within: delta) - }) - } -} - -extension NMBObjCMatcher { - public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToMatcher { - return NMBObjCBeCloseToMatcher(expected: expected, within: within) - } -} -#endif - -public func beCloseTo(_ expectedValues: [Double], within delta: Double = DefaultDelta) -> NonNilMatcherFunc <[Double]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be close to <\(stringify(expectedValues))> (each within \(stringify(delta)))" - if let actual = try actualExpression.evaluate() { - failureMessage.actualValue = "<\(stringify(actual))>" - - if actual.count != expectedValues.count { - return false - } else { - for (index, actualItem) in actual.enumerated() { - if fabs(actualItem - expectedValues[index]) > delta { - return false - } - } - return true - } - } - return false - } -} - -// MARK: - Operators - -infix operator ≈ : ComparisonPrecedence - -public func ≈(lhs: Expectation<[Double]>, rhs: [Double]) { - lhs.to(beCloseTo(rhs)) -} - -public func ≈(lhs: Expectation, rhs: NMBDoubleConvertible) { - lhs.to(beCloseTo(rhs)) -} - -public func ≈(lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) -} - -public func ==(lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) -} - -// make this higher precedence than exponents so the Doubles either end aren't pulled in -// unexpectantly -precedencegroup PlusMinusOperatorPrecedence { - higherThan: BitwiseShiftPrecedence -} - -infix operator ± : PlusMinusOperatorPrecedence -public func ±(lhs: NMBDoubleConvertible, rhs: Double) -> (expected: NMBDoubleConvertible, delta: Double) { - return (expected: lhs, delta: rhs) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift deleted file mode 100644 index 19df0d2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift +++ /dev/null @@ -1,92 +0,0 @@ -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" - let actualSeq = try actualExpression.evaluate() - if actualSeq == nil { - return true - } - var generator = actualSeq!.makeIterator() - return 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" - let actualString = try actualExpression.evaluate() - return 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" - let actualString = try actualExpression.evaluate() - return actualString == nil || actualString!.length == 0 - } -} - -// Without specific overrides, beEmpty() is ambiguous for NSDictionary, NSArray, -// etc, since they conform to Sequence as well as NMBCollection. - -/// 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" - let actualDictionary = try actualExpression.evaluate() - return 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" - let actualArray = try actualExpression.evaluate() - return 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" - let actual = try actualExpression.evaluate() - return actual == nil || actual!.count == 0 - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beEmptyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage 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) - } else if let value = actualValue as? NSString { - let expr = Expression(expression: ({ value as String }), location: location) - return try! beEmpty().matches(expr, failureMessage: failureMessage) - } 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" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift deleted file mode 100644 index 1345199..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift +++ /dev/null @@ -1,42 +0,0 @@ -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))>" - if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual > expected - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual value is greater than the expected value. -public func beGreaterThan(_ expectedValue: NMBComparable?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedDescending - return matches - } -} - -public func >(lhs: Expectation, rhs: T) { - lhs.to(beGreaterThan(rhs)) -} - -public func >(lhs: Expectation, rhs: NMBComparable?) { - lhs.to(beGreaterThan(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThan(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift deleted file mode 100644 index 2949fce..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is greater than -/// or equal to the expected value. -public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - if let actual = actualValue, let expected = expectedValue { - return actual >= expected - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual value is greater than -/// or equal to the expected value. -public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedAscending - return matches - } -} - -public func >=(lhs: Expectation, rhs: T) { - lhs.to(beGreaterThanOrEqualTo(rhs)) -} - -public func >=(lhs: Expectation, rhs: T) { - lhs.to(beGreaterThanOrEqualTo(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift deleted file mode 100644 index ca3357b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift +++ /dev/null @@ -1,47 +0,0 @@ -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 - #if os(Linux) - let actual = try actualExpression.evaluate() as? AnyObject - #else - let actual = try actualExpression.evaluate() as AnyObject? - #endif - failureMessage.actualValue = "\(identityAsString(actual))" - failureMessage.postfixMessage = "be identical to \(identityAsString(expected))" - #if os(Linux) - return actual === (expected as? AnyObject) && actual !== nil - #else - return actual === (expected as AnyObject?) && actual !== nil - #endif - } -} - -public func ===(lhs: Expectation, rhs: Any?) { - lhs.to(beIdenticalTo(rhs)) -} -public func !==(lhs: Expectation, rhs: Any?) { - lhs.toNot(beIdenticalTo(rhs)) -} - -/// A Nimble matcher that succeeds when the actual value is the same instance -/// as the expected instance. -/// -/// Alias for "beIdenticalTo". -public func be(_ expected: Any?) -> NonNilMatcherFunc { - return beIdenticalTo(expected) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let aExpr = actualExpression.cast { $0 as Any? } - return try! beIdenticalTo(expected).matches(aExpr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift deleted file mode 100644 index fbcd7c7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift +++ /dev/null @@ -1,41 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is less than the expected value. -public func beLessThan(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" - if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual < expected - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual value is less than the expected value. -public func beLessThan(_ expectedValue: NMBComparable?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedAscending - return matches - } -} - -public func <(lhs: Expectation, rhs: T) { - lhs.to(beLessThan(rhs)) -} - -public func <(lhs: Expectation, rhs: NMBComparable?) { - lhs.to(beLessThan(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThan(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift deleted file mode 100644 index a0cd2f0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift +++ /dev/null @@ -1,42 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is less than -/// or equal to the expected value. -public func beLessThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" - if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual <= expected - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual value is less than -/// or equal to the expected value. -public func beLessThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - return actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedDescending - } -} - -public func <=(lhs: Expectation, rhs: T) { - lhs.to(beLessThanOrEqualTo(rhs)) -} - -public func <=(lhs: Expectation, rhs: T) { - lhs.to(beLessThanOrEqualTo(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil:false) { actualExpression, failureMessage in - let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift deleted file mode 100644 index 49272a3..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift +++ /dev/null @@ -1,173 +0,0 @@ -import Foundation - -extension Int8: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int8Value - } -} - -extension UInt8: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint8Value - } -} - -extension Int16: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int16Value - } -} - -extension UInt16: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint16Value - } -} - -extension Int32: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int32Value - } -} - -extension UInt32: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint32Value - } -} - -extension Int64: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).int64Value - } -} - -extension UInt64: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uint64Value - } -} - -extension Float: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).floatValue - } -} - -extension Double: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).doubleValue - } -} - -extension Int: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).intValue - } -} - -extension UInt: ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Bool) { - self = NSNumber(value: value).uintValue - } -} - -internal func matcherWithFailureMessage(_ matcher: NonNilMatcherFunc, postprocessor: @escaping (FailureMessage) -> Void) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - defer { postprocessor(failureMessage) } - return try matcher.matcher(actualExpression, failureMessage) - } -} - -// 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" - } -} - -/// 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" - } -} - -// 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" - let actualValue = try actualExpression.evaluate() - if let actualValue = actualValue { - // FIXME: This is a workaround to SR-2290. - // See: - // - 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 actualValue == (true as T) - } - return 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" - let actualValue = try actualExpression.evaluate() - if let actualValue = actualValue { - // FIXME: This is a workaround to SR-2290. - // See: - // - 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 actualValue == (false as T) - } - return actualValue == nil - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beTruthyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTruthy().matches(expr, failureMessage: failureMessage) - } - } - - public class func beFalsyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalsy().matches(expr, failureMessage: failureMessage) - } - } - - public class func beTrueMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTrue().matches(expr, failureMessage: failureMessage) - } - } - - public class func beFalseMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalse().matches(expr, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift deleted file mode 100644 index a6fb31f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift +++ /dev/null @@ -1,20 +0,0 @@ -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" - let actualValue = try actualExpression.evaluate() - return actualValue == nil - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualExpression, failureMessage in - return try! beNil().matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift deleted file mode 100644 index 8f86265..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is Void. -public func beVoid() -> MatcherFunc<()> { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be void" - let actualValue: ()? = try actualExpression.evaluate() - return actualValue != nil - } -} - -public func ==(lhs: Expectation<()>, rhs: ()) { - lhs.to(beVoid()) -} - -public func !=(lhs: Expectation<()>, rhs: ()) { - lhs.toNot(beVoid()) -} \ No newline at end of file diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift deleted file mode 100644 index ef6c603..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift +++ /dev/null @@ -1,65 +0,0 @@ -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)>" - if let actualValue = try actualExpression.evaluate() { - var actualGenerator = actualValue.makeIterator() - return actualGenerator.next() == startingElement - } - return false - } -} - -/// 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 } - #if os(Linux) - guard let collectionValue = collection.object(at: 0) as? NSObject else { - return false - } - #else - let collectionValue = collection.object(at: 0) as AnyObject - #endif - return 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)>" - if let actual = try actualExpression.evaluate() { - let range = actual.range(of: startingSubstring) - return range != nil && range!.lowerBound == actual.startIndex - } - return false - } -} - -#if _runtime(_ObjC) -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 { - let expr = actualExpression.cast { $0 as? String } - return try! beginWith(expected as! String).matches(expr, failureMessage: failureMessage) - } else { - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! beginWith(expected).matches(expr, failureMessage: failureMessage) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift deleted file mode 100644 index 4400d30..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift +++ /dev/null @@ -1,96 +0,0 @@ -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 -{ - return contain(items) -} - -public func contain(_ items: [T]) -> NonNilMatcherFunc - where S.Iterator.Element == T -{ - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" - if let actual = try actualExpression.evaluate() { - return items.all { - return actual.contains($0) - } - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: String...) -> NonNilMatcherFunc { - return contain(substrings) -} - -public func contain(_ substrings: [String]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" - if let actual = try actualExpression.evaluate() { - return substrings.all { - let range = actual.range(of: $0) - return range != nil && !range!.isEmpty - } - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: NSString...) -> NonNilMatcherFunc { - return contain(substrings) -} - -public func contain(_ substrings: [NSString]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { 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 - } -} - -/// A Nimble matcher that succeeds when the actual collection contains the expected object. -public func contain(_ items: Any?...) -> NonNilMatcherFunc { - return contain(items) -} - -public func contain(_ items: [Any?]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" - guard let actual = try actualExpression.evaluate() else { return false } - return items.all { item in - return item != nil && actual.contains(item!) - } - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func containMatcher(_ expected: [NSObject]) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - if let value = actualValue as? NMBContainer { - let expr = Expression(expression: ({ value as NMBContainer }), location: location) - - // A straightforward cast on the array causes this to crash, so we have to cast the individual items - let expectedOptionals: [Any?] = expected.map({ $0 as Any? }) - return try! contain(expectedOptionals).matches(expr, failureMessage: failureMessage) - } else if let value = actualValue as? NSString { - let expr = Expression(expression: ({ value as String }), location: location) - return try! contain(expected as! [String]).matches(expr, failureMessage: failureMessage) - } else if actualValue != nil { - failureMessage.postfixMessage = "contain <\(arrayAsString(expected))> (only works for NSArrays, NSSets, NSHashTables, and NSStrings)" - } else { - failureMessage.postfixMessage = "contain <\(arrayAsString(expected))>" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift deleted file mode 100644 index b96e96c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift +++ /dev/null @@ -1,75 +0,0 @@ -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 - failureMessage.postfixMessage = "end with <\(endingElement)>" - - if let actualValue = try actualExpression.evaluate() { - var actualGenerator = actualValue.makeIterator() - var lastItem: T? - var item: T? - repeat { - lastItem = item - item = actualGenerator.next() - } while(item != nil) - - return lastItem == endingElement - } - return false - } -} - -/// A Nimble matcher that succeeds when the actual collection's last element -/// is equal to the expected object. -public func endWith(_ endingElement: Any) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingElement)>" - guard let collection = try actualExpression.evaluate() else { return false } - guard collection.count > 0 else { return false } - #if os(Linux) - guard let collectionValue = collection.object(at: collection.count - 1) as? NSObject else { - return false - } - #else - let collectionValue = collection.object(at: collection.count - 1) as AnyObject - #endif - - return collectionValue.isEqual(endingElement) - } -} - - -/// A Nimble matcher that succeeds when the actual string contains the expected substring -/// where the expected substring's location is the actual string's length minus the -/// expected substring's length. -public func endWith(_ endingSubstring: String) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingSubstring)>" - if let collection = try actualExpression.evaluate() { - return collection.hasSuffix(endingSubstring) - } - return false - } -} - -#if _runtime(_ObjC) -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 { - let expr = actualExpression.cast { $0 as? String } - return try! endWith(expected as! String).matches(expr, failureMessage: failureMessage) - } else { - let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! endWith(expected).matches(expr, failureMessage: failureMessage) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift deleted file mode 100644 index 53579e0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift +++ /dev/null @@ -1,181 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual value is equal to the expected value. -/// 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))>" - let actualValue = try actualExpression.evaluate() - let matches = actualValue == expectedValue && expectedValue != nil - if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - return false - } - return matches - } -} - -/// A Nimble matcher that succeeds when the actual value is equal to the expected value. -/// 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))>" - let actualValue = try actualExpression.evaluate() - if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - return false - } - return expectedValue! == actualValue! - } -} - -/// A Nimble matcher that succeeds when the actual collection is equal to the expected collection. -/// Items must implement the Equatable protocol. -public func equal(_ expectedValue: [T]?) -> NonNilMatcherFunc<[T]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" - let actualValue = try actualExpression.evaluate() - if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - return false - } - return expectedValue! == actualValue! - } -} - -/// A Nimble matcher allowing comparison of collection with optional type -public func equal(_ expectedValue: [T?]) -> NonNilMatcherFunc<[T?]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" - if let actualValue = try actualExpression.evaluate() { - if expectedValue.count != actualValue.count { - return false - } - - for (index, item) in actualValue.enumerated() { - let otherItem = expectedValue[index] - if item == nil && otherItem == nil { - continue - } else if item == nil && otherItem != nil { - return false - } else if item != nil && otherItem == nil { - return false - } else if item! != otherItem! { - return false - } - } - - return true - } else { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - - return false - } -} - -/// A Nimble matcher that succeeds when the actual set is equal to the expected set. -public func equal(_ expectedValue: Set?) -> NonNilMatcherFunc> { - 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> { - return equal(expectedValue, stringify: { - if let set = $0 { - return stringify(Array(set).sorted { $0 < $1 }) - } else { - return "nil" - } - }) -} - -private func equal(_ expectedValue: Set?, stringify: @escaping (Set?) -> String) -> NonNilMatcherFunc> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" - - if let expectedValue = expectedValue { - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "<\(stringify(actualValue))>" - - if expectedValue == actualValue { - return true - } - - let missing = expectedValue.subtracting(actualValue) - if missing.count > 0 { - failureMessage.postfixActual += ", missing <\(stringify(missing))>" - } - - let extra = actualValue.subtracting(expectedValue) - if extra.count > 0 { - failureMessage.postfixActual += ", extra <\(stringify(extra))>" - } - } - } else { - failureMessage.postfixActual = " (use beNil() to match nils)" - } - - return false - } -} - -public func ==(lhs: Expectation, rhs: T?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation, rhs: T?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation<[T]>, rhs: [T]?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation<[T]>, rhs: [T]?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation>, rhs: Set?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation>, rhs: Set?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation>, rhs: Set?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation>, rhs: Set?) { - lhs.toNot(equal(rhs)) -} - -public func ==(lhs: Expectation<[T: C]>, rhs: [T: C]?) { - lhs.to(equal(rhs)) -} - -public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { - lhs.toNot(equal(rhs)) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! equal(expected).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift deleted file mode 100644 index 5b24af2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Foundation - -// The `haveCount` matchers do not print the full string representation of the collection value, -// instead they only print the type name and the expected count. This makes it easier to understand -// the reason for failed expectations. See: https://github.com/Quick/Nimble/issues/308. -// The representation of the collection content is provided in a new line as an `extendedMessage`. - -/// 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 - if let actualValue = try actualExpression.evaluate() { - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" - let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result - } else { - return false - } - } -} - -/// 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 - if let actualValue = try actualExpression.evaluate() { - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" - let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result - } else { - return false - } - } -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func haveCountMatcher(_ expected: NSNumber) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() - if let value = actualValue as? NMBCollection { - let expr = Expression(expression: ({ value as NMBCollection}), location: location) - return try! haveCount(expected.intValue).matches(expr, failureMessage: failureMessage) - } else if let actualValue = actualValue { - failureMessage.postfixMessage = "get type of NSArray, NSSet, NSDictionary, or NSHashTable" - failureMessage.actualValue = "\(String(describing: type(of: actualValue)))" - } - return false - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift deleted file mode 100644 index 3ad5fb5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation - -/// A Nimble matcher that succeeds when the actual string satisfies the regular expression -/// described by the expected string. -public func match(_ expectedValue: String?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "match <\(stringify(expectedValue))>" - - if let actual = try actualExpression.evaluate() { - if let regexp = expectedValue { - return actual.range(of: regexp, options: .regularExpression) != nil - } - } - - return false - } -} - -#if _runtime(_ObjC) - -extension NMBObjCMatcher { - public class func matchMatcher(_ expected: NSString) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = actualExpression.cast { $0 as? String } - return try! match(expected.description).matches(actual, failureMessage: failureMessage) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift deleted file mode 100644 index 2092cb6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift +++ /dev/null @@ -1,26 +0,0 @@ -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 comparision by _domain and _code. -public func matchError(_ error: T) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() - - setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, error: error) - return errorMatchesNonNilFieldsOrClosure(actualError, error: error) - } -} - -/// A Nimble matcher that succeeds when the actual expression evaluates to an -/// error of the specified type -public func matchError(_ errorType: T.Type) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() - - setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, errorType: errorType) - return errorMatchesNonNilFieldsOrClosure(actualError, errorType: errorType) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift deleted file mode 100644 index 02d3245..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift +++ /dev/null @@ -1,69 +0,0 @@ -/// 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. -/// -/// 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. -public struct MatcherFunc: Matcher { - public let matcher: (Expression, FailureMessage) throws -> Bool - - public init(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) { - self.matcher = matcher - } - - public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - return try matcher(actualExpression, failureMessage) - } - - public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - return try !matcher(actualExpression, failureMessage) - } -} - -/// 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. -/// This applies regardless of using to() or toNot(). -/// -/// 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. -public struct NonNilMatcherFunc: Matcher { - public let matcher: (Expression, FailureMessage) throws -> Bool - - public init(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) { - self.matcher = matcher - } - - public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - let pass = try matcher(actualExpression, failureMessage) - if try attachNilErrorIfNeeded(actualExpression, failureMessage: failureMessage) { - return false - } - return pass - } - - public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - let pass = try !matcher(actualExpression, failureMessage) - if try attachNilErrorIfNeeded(actualExpression, failureMessage: failureMessage) { - return false - } - return pass - } - - internal func attachNilErrorIfNeeded(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { - if try actualExpression.evaluate() == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" - return true - } - return false - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift deleted file mode 100644 index ac1eb9d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift +++ /dev/null @@ -1,153 +0,0 @@ -import Foundation -// `CGFloat` is in Foundation (swift-corelibs-foundation) on Linux. -#if _runtime(_ObjC) - import CoreGraphics -#endif - -/// Implement this protocol to implement a custom matcher for Swift -public protocol Matcher { - associatedtype ValueType - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool -} - -#if _runtime(_ObjC) -/// Objective-C interface to the Swift variant of Matcher. -@objc public protocol NMBMatcher { - func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool - func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool -} -#endif - -#if _runtime(_ObjC) -/// Protocol for types that support contain() matcher. -@objc public protocol NMBContainer { - @objc(containsObject:) - func contains(_ anObject: Any) -> Bool -} - -// FIXME: NSHashTable can not conform to NMBContainer since swift-DEVELOPMENT-SNAPSHOT-2016-04-25-a -//extension NSHashTable : NMBContainer {} // Corelibs Foundation does not include this class yet -#else -public protocol NMBContainer { - func contains(_ anObject: Any) -> Bool -} -#endif - -extension NSArray : NMBContainer {} -extension NSSet : NMBContainer {} - -#if _runtime(_ObjC) -/// Protocol for types that support only beEmpty(), haveCount() matchers -@objc public protocol NMBCollection { - var count: Int { get } -} - -extension NSHashTable : NMBCollection {} // Corelibs Foundation does not include these classes yet -extension NSMapTable : NMBCollection {} -#else -public protocol NMBCollection { - var count: Int { get } -} -#endif - -extension NSSet : NMBCollection {} -extension NSIndexSet : NMBCollection {} -extension NSDictionary : NMBCollection {} - -#if _runtime(_ObjC) -/// Protocol for types that support beginWith(), endWith(), beEmpty() matchers -@objc public protocol NMBOrderedCollection : NMBCollection { - @objc(objectAtIndex:) - func object(at index: Int) -> Any -} -#else -public protocol NMBOrderedCollection : NMBCollection { - func object(at index: Int) -> Any -} -#endif - -extension NSArray : NMBOrderedCollection {} - -public protocol NMBDoubleConvertible { - var doubleValue: CDouble { get } -} - -extension Double : NMBDoubleConvertible { - public var doubleValue: CDouble { - return self - } -} - -extension Float : NMBDoubleConvertible { - public var doubleValue: CDouble { - return CDouble(self) - } -} - -extension CGFloat: NMBDoubleConvertible { - public var doubleValue: CDouble { - return CDouble(self) - } -} - -extension NSNumber : NMBDoubleConvertible { -} - -private let dateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSS" - formatter.locale = Locale(identifier: "en_US_POSIX") - - return formatter -}() - -extension Date: NMBDoubleConvertible { - public var doubleValue: CDouble { - return self.timeIntervalSinceReferenceDate - } -} - -extension NSDate: NMBDoubleConvertible { - public var doubleValue: CDouble { - return self.timeIntervalSinceReferenceDate - } -} - -extension Date: TestOutputStringConvertible { - public var testDescription: String { - return dateFormatter.string(from: self) - } -} - -extension NSDate: TestOutputStringConvertible { - public var testDescription: String { - return dateFormatter.string(from: Date(timeIntervalSinceReferenceDate: self.timeIntervalSinceReferenceDate)) - } -} - -/// Protocol for types to support beLessThan(), beLessThanOrEqualTo(), -/// beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers. -/// -/// Types that conform to Swift's Comparable protocol will work implicitly too -#if _runtime(_ObjC) -@objc public protocol NMBComparable { - func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult -} -#else -// This should become obsolete once Corelibs Foundation adds Comparable conformance to NSNumber -public protocol NMBComparable { - func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult -} -#endif - -extension NSNumber : NMBComparable { - public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { - return compare(otherObject as! NSNumber) - } -} -extension NSString : NMBComparable { - public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { - return compare(otherObject as! String) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift deleted file mode 100644 index 84b9d49..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ /dev/null @@ -1,70 +0,0 @@ -import Foundation - -internal class NotificationCollector { - private(set) var observedNotifications: [Notification] - private let notificationCenter: NotificationCenter - #if _runtime(_ObjC) - private var token: AnyObject? - #else - private var token: NSObjectProtocol? - #endif - - required init(notificationCenter: NotificationCenter) { - self.notificationCenter = notificationCenter - self.observedNotifications = [] - } - - func startObserving() { - self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil) { - // linux-swift gets confused by .append(n) - [weak self] n in self?.observedNotifications.append(n) - } - } - - deinit { - #if _runtime(_ObjC) - if let token = self.token { - self.notificationCenter.removeObserver(token) - } - #else - if let token = self.token as? AnyObject { - self.notificationCenter.removeObserver(token) - } - #endif - } -} - -private let mainThread = pthread_self() - -let notificationCenterDefault = NotificationCenter.default - -public func postNotifications( - _ notificationsMatcher: T, - fromNotificationCenter center: NotificationCenter = notificationCenterDefault) - -> MatcherFunc - where T: Matcher, T.ValueType == [Notification] -{ - let _ = mainThread // Force lazy-loading of this value - let collector = NotificationCollector(notificationCenter: center) - collector.startObserving() - var once: Bool = false - return MatcherFunc { actualExpression, failureMessage in - let collectorNotificationsExpression = Expression(memoizedExpression: { _ in - return collector.observedNotifications - }, location: actualExpression.location, withoutCaching: true) - - assert(pthread_equal(mainThread, pthread_self()) != 0, "Only expecting closure to be evaluated on main thread.") - if !once { - once = true - _ = try actualExpression.evaluate() - } - - let match = try notificationsMatcher.matches(collectorNotificationsExpression, failureMessage: failureMessage) - if collector.observedNotifications.isEmpty { - failureMessage.actualValue = "no notifications" - } else { - failureMessage.actualValue = "<\(stringify(collector.observedNotifications))>" - } - return match - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift deleted file mode 100644 index 09e28c7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift +++ /dev/null @@ -1,183 +0,0 @@ -import Foundation - -// This matcher requires the Objective-C, and being built by Xcode rather than the Swift Package Manager -#if _runtime(_ObjC) && !SWIFT_PACKAGE - -/// A Nimble matcher that succeeds when the actual expression raises an -/// exception with the specified name, reason, and/or userInfo. -/// -/// Alternatively, you can pass a closure to do any arbitrary custom matching -/// to the raised exception. The closure only gets called when an exception -/// is raised. -/// -/// nil arguments indicates that the matcher should not attempt to match against -/// that parameter. -public func raiseException( - named: String? = nil, - reason: String? = nil, - userInfo: NSDictionary? = nil, - closure: ((NSException) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - - var exception: NSException? - let capture = NMBExceptionCapture(handler: ({ e in - exception = e - }), finally: nil) - - capture.tryBlock { - _ = try! actualExpression.evaluate() - return - } - - setFailureMessageForException(failureMessage, exception: exception, named: named, reason: reason, userInfo: userInfo, closure: closure) - return exceptionMatchesNonNilFieldsOrClosure(exception, named: named, reason: reason, userInfo: userInfo, closure: closure) - } -} - -internal func setFailureMessageForException( - _ failureMessage: FailureMessage, - exception: NSException?, - named: String?, - reason: String?, - userInfo: NSDictionary?, - closure: ((NSException) -> Void)?) { - failureMessage.postfixMessage = "raise exception" - - if let named = named { - failureMessage.postfixMessage += " with name <\(named)>" - } - if let reason = reason { - failureMessage.postfixMessage += " with reason <\(reason)>" - } - if let userInfo = userInfo { - failureMessage.postfixMessage += " with userInfo <\(userInfo)>" - } - if let _ = closure { - failureMessage.postfixMessage += " that satisfies block" - } - if named == nil && reason == nil && userInfo == nil && closure == nil { - failureMessage.postfixMessage = "raise any exception" - } - - if let exception = exception { - failureMessage.actualValue = "\(String(describing: type(of: exception))) { name=\(exception.name), reason='\(stringify(exception.reason))', userInfo=\(stringify(exception.userInfo)) }" - } else { - failureMessage.actualValue = "no exception" - } -} - -internal func exceptionMatchesNonNilFieldsOrClosure( - _ exception: NSException?, - named: String?, - reason: String?, - userInfo: NSDictionary?, - closure: ((NSException) -> Void)?) -> Bool { - var matches = false - - if let exception = exception { - matches = true - - if let named = named, exception.name.rawValue != named { - matches = false - } - if reason != nil && exception.reason != reason { - matches = false - } - if let userInfo = userInfo, let exceptionUserInfo = exception.userInfo, - (exceptionUserInfo as NSDictionary) != userInfo { - matches = false - } - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(exception) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - - return matches -} - -public class NMBObjCRaiseExceptionMatcher : NSObject, NMBMatcher { - internal var _name: String? - internal var _reason: String? - internal var _userInfo: NSDictionary? - internal var _block: ((NSException) -> Void)? - - internal init(name: String?, reason: String?, userInfo: NSDictionary?, block: ((NSException) -> Void)?) { - _name = name - _reason = reason - _userInfo = userInfo - _block = block - } - - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let block: () -> Any? = ({ _ = actualBlock(); return nil }) - let expr = Expression(expression: block, location: location) - - return try! raiseException( - named: _name, - reason: _reason, - userInfo: _userInfo, - closure: _block - ).matches(expr, failureMessage: failureMessage) - } - - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - return !matches(actualBlock, failureMessage: failureMessage, location: location) - } - - public var named: (_ name: String) -> NMBObjCRaiseExceptionMatcher { - return ({ name in - return NMBObjCRaiseExceptionMatcher( - name: name, - reason: self._reason, - userInfo: self._userInfo, - block: self._block - ) - }) - } - - public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionMatcher { - return ({ reason in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: reason, - userInfo: self._userInfo, - block: self._block - ) - }) - } - - public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionMatcher { - return ({ userInfo in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, - userInfo: userInfo, - block: self._block - ) - }) - } - - public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionMatcher { - return ({ block in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, - userInfo: self._userInfo, - block: block - ) - }) - } -} - -extension NMBObjCMatcher { - public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionMatcher { - return NMBObjCRaiseExceptionMatcher(name: nil, reason: nil, userInfo: nil, block: nil) - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift deleted file mode 100644 index b24b3ec..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift +++ /dev/null @@ -1,65 +0,0 @@ -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 -{ - 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 - } - postfixMessages.add(NSString(string: "{\(failureMessage.postfixMessage)}")) - } - - failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "\(actualValue)" - } - - return matches - } -} - -public func ||(left: NonNilMatcherFunc, right: NonNilMatcherFunc) -> NonNilMatcherFunc { - return satisfyAnyOf(left, right) -} - -public func ||(left: MatcherFunc, right: MatcherFunc) -> NonNilMatcherFunc { - return satisfyAnyOf(left, right) -} - -#if _runtime(_ObjC) -extension NMBObjCMatcher { - public class func satisfyAnyOfMatcher(_ matchers: [NMBObjCMatcher]) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - if matchers.isEmpty { - failureMessage.stringValue = "satisfyAnyOf must be called with at least one matcher" - return false - } - - var elementEvaluators = [NonNilMatcherFunc]() - for matcher in matchers { - let elementEvaluator: (Expression, FailureMessage) -> Bool = { - expression, failureMessage in - return matcher.matches( - {try! expression.evaluate()}, failureMessage: failureMessage, location: actualExpression.location) - } - - elementEvaluators.append(NonNilMatcherFunc(elementEvaluator)) - } - - return try! satisfyAnyOf(elementEvaluators).matches(actualExpression, failureMessage: failureMessage) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift deleted file mode 100644 index 67f9cf6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift +++ /dev/null @@ -1,55 +0,0 @@ -import Foundation - -public func throwAssertion() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - #if arch(x86_64) && _runtime(_ObjC) && !SWIFT_PACKAGE - failureMessage.postfixMessage = "throw an assertion" - failureMessage.actualValue = nil - - var succeeded = true - - 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift deleted file mode 100644 index 8c9b91b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift +++ /dev/null @@ -1,53 +0,0 @@ -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 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? = 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 - } - - setFailureMessageForError(failureMessage, actualError: actualError, error: error, errorType: errorType, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, error: error, errorType: errorType, closure: closure) - } -} - -/// 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: ((Error) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - - var actualError: Error? - do { - _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError - } - - setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, closure: closure) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h deleted file mode 100644 index 790d16d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h +++ /dev/null @@ -1,14 +0,0 @@ -#import -#import "NMBExceptionCapture.h" -#import "NMBStringify.h" -#import "DSL.h" - -#import "CwlCatchException.h" -#import "CwlCatchBadInstruction.h" - -#if !TARGET_OS_TV - #import "mach_excServer.h" -#endif - -FOUNDATION_EXPORT double NimbleVersionNumber; -FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Async.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Async.swift deleted file mode 100644 index c902692..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Async.swift +++ /dev/null @@ -1,361 +0,0 @@ -import CoreFoundation -import Dispatch -import Foundation - -#if !_runtime(_ObjC) - import CDispatch -#endif - -private let timeoutLeeway = DispatchTimeInterval.milliseconds(1) -private let pollLeeway = DispatchTimeInterval.milliseconds(1) - -/// Stores debugging information about callers -internal struct WaitingInfo: CustomStringConvertible { - let name: String - let file: FileString - let lineNumber: UInt - - var description: String { - return "\(name) at \(file):\(lineNumber)" - } -} - -internal protocol WaitLock { - func acquireWaitingLock(_ fnName: String, file: FileString, line: UInt) - func releaseWaitingLock() - func isWaitingLocked() -> Bool -} - -internal class AssertionWaitLock: WaitLock { - private var currentWaiter: WaitingInfo? = nil - 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( - isMainThread, - "InvalidNimbleAPIUsage", - "\(fnName) can only run on the main thread." - ) - nimblePrecondition( - currentWaiter == nil, - "InvalidNimbleAPIUsage", - "Nested async expectations are not allowed to avoid creating flaky tests.\n\n" + - "The call to\n\t\(info)\n" + - "triggered this exception because\n\t\(currentWaiter!)\n" + - "is currently managing the main run loop." - ) - currentWaiter = info - } - - func isWaitingLocked() -> Bool { - return currentWaiter != nil - } - - func releaseWaitingLock() { - currentWaiter = nil - } -} - -internal enum AwaitResult { - /// Incomplete indicates None (aka - this value hasn't been fulfilled yet) - case incomplete - /// TimedOut indicates the result reached its defined timeout limit before returning - case timedOut - /// BlockedRunLoop indicates the main runloop is too busy processing other blocks to trigger - /// the timeout code. - /// - /// This may also mean the async code waiting upon may have never actually ran within the - /// required time because other timers & sources are running on the main run loop. - case blockedRunLoop - /// The async block successfully executed and returned a given result - case completed(T) - /// When a Swift Error is thrown - case errorThrown(Error) - /// When an Objective-C Exception is raised - case raisedException(NSException) - - func isIncomplete() -> Bool { - switch self { - case .incomplete: return true - default: return false - } - } - - func isCompleted() -> Bool { - switch self { - case .completed(_): return true - default: return false - } - } -} - -/// Holds the resulting value from an asynchronous expectation. -/// This class is thread-safe at receiving an "response" to this promise. -internal class AwaitPromise { - private(set) internal var asyncResult: AwaitResult = .incomplete - private var signal: DispatchSemaphore - - init() { - signal = DispatchSemaphore(value: 1) - } - - /// Resolves the promise with the given result if it has not been resolved. Repeated calls to - /// this method will resolve in a no-op. - /// - /// @returns a Bool that indicates if the async result was accepted or rejected because another - /// value was recieved first. - func resolveResult(_ result: AwaitResult) -> Bool { - if signal.wait(timeout: .now()) == .success { - self.asyncResult = result - return true - } else { - return false - } - } -} - -internal struct AwaitTrigger { - let timeoutSource: DispatchSourceTimer - let actionSource: DispatchSourceTimer? - let start: () throws -> Void -} - -/// Factory for building fully configured AwaitPromises and waiting for their results. -/// -/// This factory stores all the state for an async expectation so that Await doesn't -/// doesn't have to manage it. -internal class AwaitPromiseBuilder { - let awaiter: Awaiter - let waitLock: WaitLock - let trigger: AwaitTrigger - let promise: AwaitPromise - - internal init( - awaiter: Awaiter, - waitLock: WaitLock, - promise: AwaitPromise, - trigger: AwaitTrigger) { - self.awaiter = awaiter - self.waitLock = waitLock - self.promise = promise - self.trigger = trigger - } - - func timeout(_ timeoutInterval: TimeInterval, forcefullyAbortTimeout: TimeInterval) -> Self { - // = Discussion = - // - // There's a lot of technical decisions here that is useful to elaborate on. This is - // definitely more lower-level than the previous NSRunLoop based implementation. - // - // - // Why Dispatch Source? - // - // - // We're using a dispatch source to have better control of the run loop behavior. - // A timer source gives us deferred-timing control without having to rely as much on - // a run loop's traditional dispatching machinery (eg - NSTimers, DefaultRunLoopMode, etc.) - // which is ripe for getting corrupted by application code. - // - // And unlike dispatch_async(), we can control how likely our code gets prioritized to - // executed (see leeway parameter) + DISPATCH_TIMER_STRICT. - // - // This timer is assumed to run on the HIGH priority queue to ensure it maintains the - // highest priority over normal application / test code when possible. - // - // - // Run Loop Management - // - // In order to properly interrupt the waiting behavior performed by this factory class, - // this timer stops the main run loop to tell the waiter code that the result should be - // checked. - // - // In addition, stopping the run loop is used to halt code executed on the main run loop. - trigger.timeoutSource.scheduleOneshot( - deadline: DispatchTime.now() + timeoutInterval, - leeway: timeoutLeeway) - trigger.timeoutSource.setEventHandler() { - guard self.promise.asyncResult.isIncomplete() else { return } - let timedOutSem = DispatchSemaphore(value: 0) - let semTimedOutOrBlocked = DispatchSemaphore(value: 0) - semTimedOutOrBlocked.signal() - let runLoop = CFRunLoopGetMain() - #if _runtime(_ObjC) - let runLoopMode = CFRunLoopMode.defaultMode.rawValue - #else - let runLoopMode = kCFRunLoopDefaultMode - #endif - CFRunLoopPerformBlock(runLoop, runLoopMode) { - if semTimedOutOrBlocked.wait(timeout: .now()) == .success { - timedOutSem.signal() - semTimedOutOrBlocked.signal() - if self.promise.resolveResult(.timedOut) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - // potentially interrupt blocking code on run loop to let timeout code run - CFRunLoopStop(runLoop) - let now = DispatchTime.now() + forcefullyAbortTimeout - let didNotTimeOut = timedOutSem.wait(timeout: now) != .success - let timeoutWasNotTriggered = semTimedOutOrBlocked.wait(timeout: .now()) == .success - if didNotTimeOut && timeoutWasNotTriggered { - if self.promise.resolveResult(.blockedRunLoop) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - return self - } - - /// Blocks for an asynchronous result. - /// - /// @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. - /// - /// This method will return an AwaitResult in the following cases: - /// - /// - The main run loop is blocked by other operations and the async expectation cannot be - /// be stopped. - /// - The async expectation timed out - /// - The async expectation succeeded - /// - The async expectation raised an unexpected exception (objc) - /// - The async expectation raised an unexpected error (swift) - /// - /// The returned AwaitResult will NEVER be .incomplete. - func wait(_ fnName: String = #function, file: FileString = #file, line: UInt = #line) -> AwaitResult { - waitLock.acquireWaitingLock( - fnName, - file: file, - line: line) - - let capture = NMBExceptionCapture(handler: ({ exception in - _ = self.promise.resolveResult(.raisedException(exception)) - }), finally: ({ - self.waitLock.releaseWaitingLock() - })) - capture.tryBlock { - do { - try self.trigger.start() - } catch let error { - _ = self.promise.resolveResult(.errorThrown(error)) - } - 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) - } - self.trigger.timeoutSource.suspend() - self.trigger.timeoutSource.cancel() - if let asyncSource = self.trigger.actionSource { - asyncSource.cancel() - } - } - - return promise.asyncResult - } -} - -internal class Awaiter { - let waitLock: WaitLock - let timeoutQueue: DispatchQueue - let asyncQueue: DispatchQueue - - internal init( - waitLock: WaitLock, - asyncQueue: DispatchQueue, - timeoutQueue: DispatchQueue) { - self.waitLock = waitLock - self.asyncQueue = asyncQueue - self.timeoutQueue = timeoutQueue - } - - private func createTimerSource(_ queue: DispatchQueue) -> DispatchSourceTimer { - return DispatchSource.makeTimerSource(flags: .strict, queue: queue) - } - - func performBlock( - _ closure: @escaping (@escaping (T) -> Void) throws -> Void) -> AwaitPromiseBuilder { - let promise = AwaitPromise() - let timeoutSource = createTimerSource(timeoutQueue) - var completionCount = 0 - let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: nil) { - try closure() { - completionCount += 1 - nimblePrecondition( - completionCount < 2, - "InvalidNimbleAPIUsage", - "Done closure's was called multiple times. waitUntil(..) expects its " + - "completion closure to only be called once.") - if promise.resolveResult(.completed($0)) { - CFRunLoopStop(CFRunLoopGetMain()) - } - } - } - - return AwaitPromiseBuilder( - awaiter: self, - waitLock: waitLock, - promise: promise, - trigger: trigger) - } - - func poll(_ pollInterval: TimeInterval, closure: @escaping () throws -> T?) -> AwaitPromiseBuilder { - let promise = AwaitPromise() - let timeoutSource = createTimerSource(timeoutQueue) - let asyncSource = createTimerSource(asyncQueue) - 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() { - do { - if let result = try closure() { - if promise.resolveResult(.completed(result)) { - CFRunLoopStop(CFRunLoopGetCurrent()) - } - } - } catch let error { - if promise.resolveResult(.errorThrown(error)) { - CFRunLoopStop(CFRunLoopGetCurrent()) - } - } - } - asyncSource.resume() - } - - return AwaitPromiseBuilder( - awaiter: self, - waitLock: waitLock, - promise: promise, - trigger: trigger) - } -} - -internal func pollBlock( - pollInterval: TimeInterval, - timeoutInterval: TimeInterval, - file: FileString, - line: UInt, - fnName: String = #function, - 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 - } - }.timeout(timeoutInterval, forcefullyAbortTimeout: timeoutInterval / 2.0).wait(fnName, file: file, line: line) - - return result -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift deleted file mode 100644 index d424c98..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift +++ /dev/null @@ -1,142 +0,0 @@ -import Foundation - -// Generic - -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, - postfixMessageVerb: String = "throw", - actualError: Error?, - error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) { - failureMessage.postfixMessage = "\(postfixMessageVerb) error" - - if let error = error { - if let error = error as? CustomDebugStringConvertible { - failureMessage.postfixMessage += " <\(error.debugDescription)>" - } else { - failureMessage.postfixMessage += " <\(error)>" - } - } else if errorType != nil || closure != nil { - failureMessage.postfixMessage += " from type <\(T.self)>" - } - if let _ = closure { - failureMessage.postfixMessage += " that satisfies block" - } - if error == nil && errorType == nil && closure == nil { - failureMessage.postfixMessage = "\(postfixMessageVerb) any error" - } - - if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" - } else { - failureMessage.actualValue = "no error" - } -} - -internal func errorMatchesExpectedError( - _ actualError: Error, - expectedError: T) -> Bool { - return actualError._domain == expectedError._domain - && actualError._code == expectedError._code -} - -internal func errorMatchesExpectedError( - _ actualError: Error, - expectedError: T) -> Bool - where T: Equatable -{ - if let actualError = actualError as? T { - return actualError == expectedError - } - return false -} - -internal func errorMatchesNonNilFieldsOrClosure( - _ actualError: Error?, - error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) -> Bool { - var matches = false - - if let actualError = actualError { - matches = true - - if let error = error { - if !errorMatchesExpectedError(actualError, expectedError: error) { - matches = false - } - } - if let actualError = actualError as? T { - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(actualError as T) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } else if errorType != nil { - matches = (actualError is T) - // The closure expects another ErrorProtocol as argument, so this - // is _supposed_ to fail, so that it becomes more obvious. - if let closure = closure { - let assertions = gatherExpectations { - if let actual = actualError as? T { - closure(actual) - } - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - } - - return matches -} - -// Non-generic - -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, - actualError: Error?, - closure: ((Error) -> Void)?) { - failureMessage.postfixMessage = "throw error" - - if let _ = closure { - failureMessage.postfixMessage += " that satisfies block" - } else { - failureMessage.postfixMessage = "throw any error" - } - - if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" - } else { - 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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift deleted file mode 100644 index 6c5126a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation - -extension Sequence { - internal func all(_ fn: (Iterator.Element) -> Bool) -> Bool { - for item in self { - if !fn(item) { - return false - } - } - return true - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/SourceLocation.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/SourceLocation.swift deleted file mode 100644 index a7279aa..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/SourceLocation.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -// Ideally we would always use `StaticString` as the type for tracking the file name -// that expectations originate from, for consistency with `assert` etc. from the -// stdlib, and because recent versions of the XCTest overlay require `StaticString` -// when calling `XCTFail`. Under the Objective-C runtime (i.e. building on Mac), we -// have to use `String` instead because StaticString can't be generated from Objective-C -#if _runtime(_ObjC) -public typealias FileString = String -#else -public typealias FileString = StaticString -#endif - -public final class SourceLocation : NSObject { - public let file: FileString - public let line: UInt - - override init() { - file = "Unknown File" - line = 0 - } - - init(file: FileString, line: UInt) { - self.file = file - self.line = line - } - - override public var description: String { - return "\(file):\(line)" - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift deleted file mode 100644 index 012e1e3..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift +++ /dev/null @@ -1,213 +0,0 @@ -import Foundation - - -internal func identityAsString(_ value: Any?) -> String { - let anyObject: AnyObject? -#if os(Linux) - anyObject = value as? AnyObject -#else - anyObject = value as AnyObject? -#endif - if let value = anyObject { - return NSString(format: "<%p>", unsafeBitCast(value, to: Int.self)).description - } else { - return "nil" - } -} - -internal func arrayAsString(_ items: [T], joiner: String = ", ") -> String { - return items.reduce("") { accum, item in - let prefix = (accum.isEmpty ? "" : joiner) - return accum + prefix + "\(stringify(item))" - } -} - -/// A type with a customized test output text representation. -/// -/// This textual representation is produced when values will be -/// printed in test runs, and may be useful when producing -/// error messages in custom matchers. -/// -/// - SeeAlso: `CustomDebugStringConvertible` -public protocol TestOutputStringConvertible { - var testDescription: String { get } -} - -extension Double: TestOutputStringConvertible { - public var testDescription: String { - return NSNumber(value: self).testDescription - } -} - -extension Float: TestOutputStringConvertible { - public var testDescription: String { - return NSNumber(value: self).testDescription - } -} - -extension NSNumber: TestOutputStringConvertible { - // This is using `NSString(format:)` instead of - // `String(format:)` because the latter somehow breaks - // 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. - // Maybe this will change in a future snapshot. - let decimalPlaces = NSString(string: NSString(string: description) - .components(separatedBy: ".")[1]) - - // SeeAlso: https://bugs.swift.org/browse/SR-1464 - switch decimalPlaces.length { - case 1: - return NSString(format: "%0.1f", self.doubleValue).description - case 2: - return NSString(format: "%0.2f", self.doubleValue).description - case 3: - return NSString(format: "%0.3f", self.doubleValue).description - default: - return NSString(format: "%0.4f", self.doubleValue).description - } - } - return self.description - } -} - -extension Array: TestOutputStringConvertible { - public var testDescription: String { - let list = self.map(Nimble.stringify).joined(separator: ", ") - return "[\(list)]" - } -} - -extension AnySequence: TestOutputStringConvertible { - public var testDescription: String { - 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)]" - } -} - -extension NSArray: TestOutputStringConvertible { - public var testDescription: String { - let list = Array(self).map(Nimble.stringify).joined(separator: ", ") - return "(\(list))" - } -} - -extension NSIndexSet: TestOutputStringConvertible { - public var testDescription: String { - let list = Array(self).map(Nimble.stringify).joined(separator: ", ") - return "(\(list))" - } -} - -extension String: TestOutputStringConvertible { - public var testDescription: String { - return self - } -} - -extension Data: TestOutputStringConvertible { - public var testDescription: String { - #if os(Linux) - // FIXME: Swift on Linux triggers a segfault when calling NSData's hash() (last checked on 03-11-16) - return "Data" - #else - return "Data" - #endif - } -} - -/// -/// Returns a string appropriate for displaying in test output -/// from the provided value. -/// -/// - parameter value: A value that will show up in a test's output. -/// -/// - returns: The string that is returned can be -/// customized per type by conforming a type to the `TestOutputStringConvertible` -/// protocol. When stringifying a non-`TestOutputStringConvertible` type, this -/// function will return the value's debug description and then its -/// normal description if available and in that order. Otherwise it -/// will return the result of constructing a string from the value. -/// -/// - SeeAlso: `TestOutputStringConvertible` -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) -} - -/// -SeeAlso: `stringify(value: T)` -public func stringify(_ value: T?) -> String { - if let unboxed = value { - return stringify(unboxed) - } - return "nil" -} - -#if _runtime(_ObjC) -@objc public class NMBStringer: NSObject { - @objc public class func stringify(_ obj: Any?) -> String { - return Nimble.stringify(obj) - } -} -#endif - -// MARK: Collection Type Stringers - -/// Attempts to generate a pretty type string for a given value. If the value is of a Objective-C -/// collection type, or a subclass thereof, (e.g. `NSArray`, `NSDictionary`, etc.). -/// This function will return the type name of the root class of the class cluster for better -/// readability (e.g. `NSArray` instead of `__NSArrayI`). -/// -/// For values that don't have a type of an Objective-C collection, this function returns the -/// default type description. -/// -/// - parameter value: A value that will be used to determine a type name. -/// -/// - returns: The name of the class cluster root class for Objective-C collection types, or the -/// the `dynamicType` of the value for values of any other type. -public func prettyCollectionType(_ value: T) -> String { - switch value { - case is NSArray: - return String(describing: NSArray.self) - case is NSDictionary: - return String(describing: NSDictionary.self) - case is NSSet: - return String(describing: NSSet.self) - case is NSIndexSet: - return String(describing: NSIndexSet.self) - default: - return String(describing: value) - } -} - -/// Returns the type name for a given collection type. This overload is used by Swift -/// collection types. -/// -/// - parameter collection: A Swift `CollectionType` value. -/// -/// - returns: A string representing the `dynamicType` of the value. -public func prettyCollectionType(_ collection: T) -> String { - return String(describing: type(of: collection)) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h deleted file mode 100644 index 5d416e4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble22CurrentTestCaseTracker") -@interface CurrentTestCaseTracker : NSObject -+ (CurrentTestCaseTracker *)sharedInstance; -@end - -@interface CurrentTestCaseTracker (Register) @end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h deleted file mode 100644 index 54677ee..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h +++ /dev/null @@ -1,377 +0,0 @@ -#import - -@class NMBExpectation; -@class NMBObjCBeCloseToMatcher; -@class NMBObjCRaiseExceptionMatcher; -@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 - - - -#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); - - - -#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_EXPORT_INLINE id beAnInstanceOf(Class expectedClass) { - return NMB_beAnInstanceOf(expectedClass); -} - -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass); -NIMBLE_EXPORT_INLINE id beAKindOf(Class expectedClass) { - return NMB_beAKindOf(expectedClass); -} - -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring); -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(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), - NMB_beIdenticalTo(expectedInstance)); - -NIMBLE_EXPORT id NMB_be(id expectedInstance); -NIMBLE_SHORT(id be(id expectedInstance), - NMB_be(expectedInstance)); - - -#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), - NMB_beTruthy()); - -NIMBLE_EXPORT id NMB_beFalsy(void); -NIMBLE_SHORT(id beFalsy(void), - NMB_beFalsy()); - -NIMBLE_EXPORT id NMB_beTrue(void); -NIMBLE_SHORT(id beTrue(void), - NMB_beTrue()); - -NIMBLE_EXPORT id NMB_beFalse(void); -NIMBLE_SHORT(id beFalse(void), - NMB_beFalse()); - -NIMBLE_EXPORT id NMB_beNil(void); -NIMBLE_SHORT(id beNil(void), - NMB_beNil()); - -NIMBLE_EXPORT id NMB_beEmpty(void); -NIMBLE_SHORT(id beEmpty(void), - NMB_beEmpty()); - -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) NS_REQUIRES_NIL_TERMINATION; -#define NMB_contain(...) NMB_containWithNilTermination(__VA_ARGS__, nil) -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#define contain(...) NMB_contain(__VA_ARGS__) -#endif - -NIMBLE_EXPORT id NMB_endWith(id itemElementOrSubstring); -NIMBLE_SHORT(id endWith(id itemElementOrSubstring), - NMB_endWith(itemElementOrSubstring)); - -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException(void); -NIMBLE_SHORT(NMBObjCRaiseExceptionMatcher *raiseException(void), - NMB_raiseException()); - -NIMBLE_EXPORT id NMB_match(id expectedValue); -NIMBLE_SHORT(id match(id expectedValue), - NMB_match(expectedValue)); - -NIMBLE_EXPORT id NMB_allPass(id matcher); -NIMBLE_SHORT(id allPass(id matcher), - NMB_allPass(matcher)); - -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers); -#define NMB_satisfyAnyOf(...) NMB_satisfyAnyOfWithMatchers(@[__VA_ARGS__]) -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#define satisfyAnyOf(...) NMB_satisfyAnyOf(__VA_ARGS__) -#endif - -// In order to preserve breakpoint behavior despite using macros to fill in __FILE__ and __LINE__, -// define a builder that populates __FILE__ and __LINE__, and returns a block that takes timeout -// and action arguments. See https://github.com/Quick/Quick/pull/185 for details. -typedef void (^NMBWaitUntilTimeoutBlock)(NSTimeInterval timeout, void (^action)(void (^)(void))); -typedef void (^NMBWaitUntilBlock)(void (^action)(void (^)(void))); - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line); - -NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line); -NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line); - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line); - -#define NMB_waitUntilTimeout NMB_waitUntilTimeoutBuilder(@(__FILE__), __LINE__) -#define NMB_waitUntil NMB_waitUntilBuilder(@(__FILE__), __LINE__) - -#ifndef NIMBLE_DISABLE_SHORT_SYNTAX -#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") - - -#define waitUntilTimeout NMB_waitUntilTimeout -#define waitUntil NMB_waitUntil - -#undef NIMBLE_VALUE_OF - -#endif - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m deleted file mode 100644 index cd93ddd..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m +++ /dev/null @@ -1,156 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble7NMBWait") -@interface NMBWait : NSObject - -+ (void)untilTimeout:(NSTimeInterval)timeout file:(NSString *)file line:(NSUInteger)line action:(void(^)())action; -+ (void)untilFile:(NSString *)file line:(NSUInteger)line action:(void(^)())action; - -@end - - -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 - line:line]; -} - -NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(), NSString *file, NSUInteger line) { - return NMB_expect(^id{ - actualBlock(); - return nil; - }, file, line); -} - -NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger line) { - return [NMBExpectation failWithMessage:msg file:file line:line]; -} - -NIMBLE_EXPORT id NMB_beAnInstanceOf(Class expectedClass) { - return [NMBObjCMatcher beAnInstanceOfMatcher:expectedClass]; -} - -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass) { - return [NMBObjCMatcher beAKindOfMatcher:expectedClass]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beCloseToMatcher:expectedValue within:0.001]; -} - -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring) { - return [NMBObjCMatcher beginWithMatcher:itemElementOrSubstring]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanOrEqualToMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_beIdenticalTo(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; -} - -NIMBLE_EXPORT id NMB_be(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanOrEqualToMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_beTruthy() { - return [NMBObjCMatcher beTruthyMatcher]; -} - -NIMBLE_EXPORT id NMB_beFalsy() { - return [NMBObjCMatcher beFalsyMatcher]; -} - -NIMBLE_EXPORT id NMB_beTrue() { - return [NMBObjCMatcher beTrueMatcher]; -} - -NIMBLE_EXPORT id NMB_beFalse() { - return [NMBObjCMatcher beFalseMatcher]; -} - -NIMBLE_EXPORT id NMB_beNil() { - return [NMBObjCMatcher beNilMatcher]; -} - -NIMBLE_EXPORT id NMB_beEmpty() { - return [NMBObjCMatcher beEmptyMatcher]; -} - -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) { - NSMutableArray *itemOrSubstringArray = [NSMutableArray array]; - - if (itemOrSubstring) { - [itemOrSubstringArray addObject:itemOrSubstring]; - - va_list args; - va_start(args, itemOrSubstring); - id next; - while ((next = va_arg(args, id))) { - [itemOrSubstringArray addObject:next]; - } - va_end(args); - } - - return [NMBObjCMatcher containMatcher:itemOrSubstringArray]; -} - -NIMBLE_EXPORT id NMB_endWith(id itemElementOrSubstring) { - return [NMBObjCMatcher endWithMatcher:itemElementOrSubstring]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_equal(__nullable id expectedValue) { - return [NMBObjCMatcher equalMatcher:expectedValue]; -} - -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_haveCount(id expectedValue) { - return [NMBObjCMatcher haveCountMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_match(id expectedValue) { - return [NMBObjCMatcher matchMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_allPass(id expectedValue) { - return [NMBObjCMatcher allPassMatcher:expectedValue]; -} - -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers) { - return [NMBObjCMatcher satisfyAnyOfMatcher:matchers]; -} - -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException() { - return [NMBObjCMatcher raiseExceptionMatcher]; -} - -NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line) { - return ^(NSTimeInterval timeout, void (^action)(void (^)(void))) { - [NMBWait untilTimeout:timeout file:file line:line action:action]; - }; -} - -NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line) { - return ^(void (^action)(void (^)(void))) { - [NMBWait untilFile:file line:line action:action]; - }; -} - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h deleted file mode 100644 index e0ec05a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h +++ /dev/null @@ -1,11 +0,0 @@ -#import -#import - -@interface NMBExceptionCapture : NSObject - -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)())finally; -- (void)tryBlock:(void(^ _Nonnull)())unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); - -@end - -typedef void(^NMBSourceCallbackBlock)(BOOL successful); diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m deleted file mode 100644 index 0a882b7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m +++ /dev/null @@ -1,35 +0,0 @@ -#import "NMBExceptionCapture.h" - -@interface NMBExceptionCapture () -@property (nonatomic, copy) void(^ _Nullable handler)(NSException * _Nullable); -@property (nonatomic, copy) void(^ _Nullable finally)(); -@end - -@implementation NMBExceptionCapture - -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)())finally { - self = [super init]; - if (self) { - self.handler = handler; - self.finally = finally; - } - return self; -} - -- (void)tryBlock:(void(^ _Nonnull)())unsafeBlock { - @try { - unsafeBlock(); - } - @catch (NSException *exception) { - if (self.handler) { - self.handler(exception); - } - } - @finally { - if (self.finally) { - self.finally(); - } - } -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.h deleted file mode 100644 index e5d5ddd..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.h +++ /dev/null @@ -1,18 +0,0 @@ -@class NSString; - -/** - * 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. - * - * @return The string that is returned can be - * customized per type by conforming a type to the `TestOutputStringConvertible` - * protocol. When stringifying a non-`TestOutputStringConvertible` type, this - * function will return the value's debug description and then its - * normal description if available and in that order. Otherwise it - * will return the result of constructing a string from the value. - * - * @see `TestOutputStringConvertible` - */ -extern NSString *_Nonnull NMBStringify(id _Nullable anyObject) __attribute__((warn_unused_result)); diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.m deleted file mode 100644 index 329d39a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/NMBStringify.m +++ /dev/null @@ -1,6 +0,0 @@ -#import "NMBStringify.h" -#import - -NSString *_Nonnull NMBStringify(id _Nullable anyObject) { - return [NMBStringer stringify:anyObject]; -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m deleted file mode 100644 index 35f26fd..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m +++ /dev/null @@ -1,78 +0,0 @@ -#import "CurrentTestCaseTracker.h" -#import -#import - -#pragma mark - Method Swizzling - -/// Swaps the implementations between two instance methods. -/// -/// @param class The class containing `originalSelector`. -/// @param originalSelector Original method to replace. -/// @param replacementSelector Replacement method. -void swizzleSelectors(Class class, SEL originalSelector, SEL replacementSelector) { - Method originalMethod = class_getInstanceMethod(class, originalSelector); - Method replacementMethod = class_getInstanceMethod(class, replacementSelector); - - BOOL didAddMethod = - class_addMethod(class, - originalSelector, - method_getImplementation(replacementMethod), - method_getTypeEncoding(replacementMethod)); - - if (didAddMethod) { - class_replaceMethod(class, - replacementSelector, - method_getImplementation(originalMethod), - method_getTypeEncoding(originalMethod)); - } else { - method_exchangeImplementations(originalMethod, replacementMethod); - } -} - -#pragma mark - Private - -@interface XCTestObservationCenter (Private) -- (void)_addLegacyTestObserver:(id)observer; -@end - -@implementation XCTestObservationCenter (Register) - -/// Uses objc method swizzling to register `CurrentTestCaseTracker` as a test observer. This is necessary -/// because Xcode 7.3 introduced timing issues where if a custom `XCTestObservation` is registered too early -/// it suppresses all console output (generated by `XCTestLog`), breaking any tools that depend on this output. -/// This approach waits to register our custom test observer until XCTest adds its first "legacy" observer, -/// falling back to registering after the first normal observer if this private method ever changes. -+ (void)load { - if (class_getInstanceMethod([self class], @selector(_addLegacyTestObserver:))) { - // Swizzle -_addLegacyTestObserver: - swizzleSelectors([self class], @selector(_addLegacyTestObserver:), @selector(NMB_original__addLegacyTestObserver:)); - } else { - // Swizzle -addTestObserver:, only if -_addLegacyTestObserver: is not implemented - swizzleSelectors([self class], @selector(addTestObserver:), @selector(NMB_original_addTestObserver:)); - } -} - -#pragma mark - Replacement Methods - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -- (void)NMB_original__addLegacyTestObserver:(id)observer { - [self NMB_original__addLegacyTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -/// This method is only used if `-_addLegacyTestObserver:` is not impelemented. (added in Xcode 7.3) -- (void)NMB_original_addTestObserver:(id)observer { - [self NMB_original_addTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self NMB_original_addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/LinuxMain.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/LinuxMain.swift deleted file mode 100644 index 4210ef0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/LinuxMain.swift +++ /dev/null @@ -1,37 +0,0 @@ -import XCTest -@testable import NimbleTests - -// This is the entry point for NimbleTests on Linux - -XCTMain([ - testCase(AsyncTest.allTests), - testCase(SynchronousTest.allTests), - testCase(UserDescriptionTest.allTests), - - // Matchers - testCase(AllPassTest.allTests), - // testCase(BeAKindOfTest.allTests), - testCase(BeAnInstanceOfTest.allTests), - testCase(BeCloseToTest.allTests), - testCase(BeginWithTest.allTests), - testCase(BeGreaterThanOrEqualToTest.allTests), - testCase(BeGreaterThanTest.allTests), - testCase(BeIdenticalToObjectTest.allTests), - testCase(BeIdenticalToTest.allTests), - testCase(BeLessThanOrEqualToTest.allTests), - testCase(BeLessThanTest.allTests), - testCase(BeTruthyTest.allTests), - testCase(BeTrueTest.allTests), - testCase(BeFalsyTest.allTests), - testCase(BeFalseTest.allTests), - testCase(BeNilTest.allTests), - testCase(ContainTest.allTests), - testCase(EndWithTest.allTests), - testCase(EqualTest.allTests), - testCase(HaveCountTest.allTests), - testCase(MatchTest.allTests), - // testCase(RaisesExceptionTest.allTests), - testCase(ThrowErrorTest.allTests), - testCase(SatisfyAnyOfTest.allTests), - testCase(PostNotificationTest.allTests), -]) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift deleted file mode 100644 index ff78d47..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift +++ /dev/null @@ -1,222 +0,0 @@ -import Dispatch -import Foundation -import XCTest -import Nimble - -final class AsyncTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AsyncTest) -> () throws -> Void)] { - return [ - ("testToEventuallyPositiveMatches", testToEventuallyPositiveMatches), - ("testToEventuallyNegativeMatches", testToEventuallyNegativeMatches), - ("testWaitUntilPositiveMatches", testWaitUntilPositiveMatches), - ("testToEventuallyWithCustomDefaultTimeout", testToEventuallyWithCustomDefaultTimeout), - ("testWaitUntilTimesOutIfNotCalled", testWaitUntilTimesOutIfNotCalled), - ("testWaitUntilTimesOutWhenExceedingItsTime", testWaitUntilTimesOutWhenExceedingItsTime), - ("testWaitUntilNegativeMatches", testWaitUntilNegativeMatches), - ("testWaitUntilDetectsStalledMainThreadActivity", testWaitUntilDetectsStalledMainThreadActivity), - ("testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed", testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed), - ("testWaitUntilErrorsIfDoneIsCalledMultipleTimes", testWaitUntilErrorsIfDoneIsCalledMultipleTimes), - ("testWaitUntilMustBeInMainThread", testWaitUntilMustBeInMainThread), - ("testToEventuallyMustBeInMainThread", testToEventuallyMustBeInMainThread), - ] - } - - class Error: Swift.Error {} - let errorToThrow = Error() - - private func doThrowError() throws -> Int { - throw errorToThrow - } - - func testToEventuallyPositiveMatches() { - var value = 0 - deferToMainQueue { value = 1 } - expect { value }.toEventually(equal(1)) - - deferToMainQueue { value = 0 } - expect { value }.toEventuallyNot(equal(1)) - } - - func testToEventuallyNegativeMatches() { - let value = 0 - failsWithErrorMessage("expected to eventually not equal <0>, got <0>") { - expect { value }.toEventuallyNot(equal(0)) - } - failsWithErrorMessage("expected to eventually equal <1>, got <0>") { - expect { value }.toEventually(equal(1)) - } - failsWithErrorMessage("expected to eventually equal <1>, got an unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toEventually(equal(1)) - } - failsWithErrorMessage("expected to eventually not equal <0>, got an unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toEventuallyNot(equal(0)) - } - } - - func testToEventuallyWithCustomDefaultTimeout() { - AsyncDefaults.Timeout = 2 - defer { - AsyncDefaults.Timeout = 1 - } - - var value = 0 - - let sleepThenSetValueTo: (Int) -> () = { newValue in - Thread.sleep(forTimeInterval: 1.1) - value = newValue - } - - var asyncOperation: () -> () = { sleepThenSetValueTo(1) } - - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect { value }.toEventually(equal(1)) - - asyncOperation = { sleepThenSetValueTo(0) } - - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect { value }.toEventuallyNot(equal(1)) - } - - func testWaitUntilPositiveMatches() { - waitUntil { done in - done() - } - waitUntil { done in - deferToMainQueue { - done() - } - } - } - - func testWaitUntilTimesOutIfNotCalled() { - failsWithErrorMessage("Waited more than 1.0 second") { - waitUntil(timeout: 1) { done in return } - } - } - - func testWaitUntilTimesOutWhenExceedingItsTime() { - var waiting = true - failsWithErrorMessage("Waited more than 0.01 seconds") { - waitUntil(timeout: 0.01) { done in - let asyncOperation: () -> () = { - Thread.sleep(forTimeInterval: 0.1) - done() - waiting = false - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - } - } - - // "clear" runloop to ensure this test doesn't poison other tests - repeat { - RunLoop.main.run(until: Date().addingTimeInterval(0.2)) - } while(waiting) - } - - func testWaitUntilNegativeMatches() { - failsWithErrorMessage("expected to equal <2>, got <1>") { - waitUntil { done in - Thread.sleep(forTimeInterval: 0.1) - expect(1).to(equal(2)) - done() - } - } - } - - func testWaitUntilDetectsStalledMainThreadActivity() { - let msg = "-waitUntil() timed out but was unable to run the timeout handler because the main thread is unresponsive (0.5 seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." - failsWithErrorMessage(msg) { - waitUntil(timeout: 1) { done in - Thread.sleep(forTimeInterval: 5.0) - done() - } - } - } - - func testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed() { - // Currently we are unable to catch Objective-C exceptions when built by the Swift Package Manager -#if !SWIFT_PACKAGE - let referenceLine = #line + 9 - var msg = "Unexpected exception raised: Nested async expectations are not allowed " - msg += "to avoid creating flaky tests." - msg += "\n\n" - msg += "The call to\n\t" - msg += "expect(...).toEventually(...) at \(#file):\(referenceLine + 7)\n" - msg += "triggered this exception because\n\t" - msg += "waitUntil(...) at \(#file):\(referenceLine + 1)\n" - msg += "is currently managing the main run loop." - failsWithErrorMessage(msg) { // reference line - waitUntil(timeout: 2.0) { done in - var protected: Int = 0 - DispatchQueue.main.async { - protected = 1 - } - - expect(protected).toEventually(equal(1)) - done() - } - } -#endif - } - - func testWaitUntilErrorsIfDoneIsCalledMultipleTimes() { -#if !SWIFT_PACKAGE - waitUntil { done in - deferToMainQueue { - done() - expect { - done() - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - } - } -#endif - } - - func testWaitUntilMustBeInMainThread() { -#if !SWIFT_PACKAGE - var executedAsyncBlock: Bool = false - let asyncOperation: () -> () = { - expect { - waitUntil { done in done() } - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - executedAsyncBlock = true - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect(executedAsyncBlock).toEventually(beTruthy()) -#endif - } - - func testToEventuallyMustBeInMainThread() { -#if !SWIFT_PACKAGE - var executedAsyncBlock: Bool = false - let asyncOperation: () -> () = { - expect { - expect(1).toEventually(equal(2)) - }.to(raiseException(named: "InvalidNimbleAPIUsage")) - executedAsyncBlock = true - } - if #available(OSX 10.10, *) { - DispatchQueue.global().async(execute: asyncOperation) - } else { - DispatchQueue.global(priority: .default).async(execute: asyncOperation) - } - expect(executedAsyncBlock).toEventually(beTruthy()) -#endif - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift deleted file mode 100644 index 26e5a98..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/ObjectWithLazyProperty.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation - -class ObjectWithLazyProperty { - init() {} - lazy var value: String = "hello" - lazy var anotherValue: String = { return "world" }() -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift deleted file mode 100644 index f300d47..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest - -// XCTestCaseProvider should be adopted by all XCTestCase subclasses. It provides a -// mechanism for us to fail tests in Xcode which haven't been included in the `allTests` -// list for swift-corelibs-xctest which is unable to dynamically discover tests. Note -// that only `static var allTests` needs to be explicitly implemented, as `allTestNames` -// has a default implementation provided by a protocol extension. - -// Implementation note: This is broken down into two separate protocols because we need a -// protocol with no Self references to which we can cast XCTestCase instances in a non-generic context. - -public protocol XCTestCaseProviderStatic { - // This should be explicitly implemented by XCTestCase subclasses - static var allTests: [(String, (Self) -> () throws -> Void)] { get } -} - -public protocol XCTestCaseNameProvider { - // This does not need to be explicitly implemented because of the protocol extension below - var allTestNames: [String] { get } -} - -public protocol XCTestCaseProvider: XCTestCaseProviderStatic, XCTestCaseNameProvider {} - -extension XCTestCaseProvider where Self: XCTestCaseProviderStatic { - var allTestNames: [String] { - return type(of: self).allTests.map({ name, test in - return name - }) - } -} - -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) - -extension XCTestCase { - override open func tearDown() { - if let provider = self as? XCTestCaseNameProvider { - provider.assertContainsTest(invocation!.selector.description) - } - - super.tearDown() - } -} - -extension XCTestCaseNameProvider { - fileprivate func assertContainsTest(_ name: String) { - let contains = self.allTestNames.contains(name) - XCTAssert(contains, "Test '\(name)' is missing from the allTests array") - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/utils.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/utils.swift deleted file mode 100644 index 0b33ea6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/utils.swift +++ /dev/null @@ -1,98 +0,0 @@ -import Dispatch -import Foundation -@testable import Nimble -import XCTest - -func failsWithErrorMessage(_ messages: [String], file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () throws -> Void) { - var filePath = file - var lineNumber = line - - let recorder = AssertionRecorder() - withAssertionHandler(recorder, closure: closure) - - for msg in messages { - var lastFailure: AssertionRecord? - var foundFailureMessage = false - - for assertion in recorder.assertions { - lastFailure = assertion - if assertion.message.stringValue == msg { - foundFailureMessage = true - break - } - } - - if foundFailureMessage { - continue - } - - if preferOriginalSourceLocation { - if let failure = lastFailure { - filePath = failure.location.file - lineNumber = failure.location.line - } - } - - let message: String - if let lastFailure = lastFailure { - message = "Got failure message: \"\(lastFailure.message.stringValue)\", but expected \"\(msg)\"" - } else { - message = "expected failure message, but got none" - } - NimbleAssertionHandler.assert(false, - message: FailureMessage(stringValue: message), - location: SourceLocation(file: filePath, line: lineNumber)) - } -} - -func failsWithErrorMessage(_ message: String, file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () -> Void) { - return failsWithErrorMessage( - [message], - file: file, - line: line, - preferOriginalSourceLocation: preferOriginalSourceLocation, - closure: closure - ) -} - -func failsWithErrorMessageForNil(_ message: String, file: FileString = #file, line: UInt = #line, preferOriginalSourceLocation: Bool = false, closure: @escaping () -> Void) { - failsWithErrorMessage("\(message) (use beNil() to match nils)", file: file, line: line, preferOriginalSourceLocation: preferOriginalSourceLocation, closure: closure) -} - - func deferToMainQueue(action: @escaping () -> Void) { - DispatchQueue.main.async { - Thread.sleep(forTimeInterval: 0.01) - action() - } - } - -public class NimbleHelper : NSObject { - public class func expectFailureMessage(_ message: NSString, block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessage(String(describing: message), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } - - public class func expectFailureMessages(_ messages: [NSString], block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessage(messages.map({String(describing: $0)}), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } - - public class func expectFailureMessageForNil(_ message: NSString, block: @escaping () -> Void, file: FileString, line: UInt) { - failsWithErrorMessageForNil(String(describing: message), file: file, line: line, preferOriginalSourceLocation: true, closure: block) - } -} - -extension Date { - init(dateTimeString: String) { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - dateFormatter.locale = Locale(identifier: "en_US_POSIX") - let date = dateFormatter.date(from: dateTimeString)! - self.init(timeInterval:0, since:date) - } -} - -extension NSDate { - convenience init(dateTimeString: String) { - let date = Date(dateTimeString: dateTimeString) - self.init(timeIntervalSinceReferenceDate: date.timeIntervalSinceReferenceDate) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Info.plist deleted file mode 100644 index 6d32c15..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/LinuxSupport.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/LinuxSupport.swift deleted file mode 100644 index 03ff8e1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/LinuxSupport.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -#if os(Linux) - extension NSNotification.Name { - init(_ rawValue: String) { - self.init(rawValue: rawValue) - } - } -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift deleted file mode 100644 index 0f4327a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift +++ /dev/null @@ -1,126 +0,0 @@ -import XCTest -import Nimble - -/// Add operators to `Optional` for conforming `Comparable` that removed in Swift 3.0 -extension Optional where Wrapped: Comparable { - static func < (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l < r - case (nil, _?): - return true - default: - return false - } - } - - static func > (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l > r - default: - return rhs < lhs - } - } - - static func <= (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l <= r - default: - return !(rhs < lhs) - } - } - - static func >= (lhs: Optional, rhs: Optional) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l >= r - default: - return !(lhs < rhs) - } - } -} - -final class AllPassTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AllPassTest) -> () throws -> Void)] { - return [ - ("testAllPassArray", testAllPassArray), - ("testAllPassMatcher", testAllPassMatcher), - ("testAllPassCollectionsWithOptionalsDontWork", testAllPassCollectionsWithOptionalsDontWork), - ("testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer", testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer), - ("testAllPassSet", testAllPassSet), - ("testAllPassWithNilAsExpectedValue", testAllPassWithNilAsExpectedValue), - ] - } - - func testAllPassArray() { - expect([1,2,3,4]).to(allPass({$0 < 5})) - expect([1,2,3,4]).toNot(allPass({$0 > 5})) - - failsWithErrorMessage( - "expected to all pass a condition, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1,2,3,4]).to(allPass({$0 < 3})) - } - failsWithErrorMessage("expected to not all pass a condition") { - expect([1,2,3,4]).toNot(allPass({$0 < 5})) - } - failsWithErrorMessage( - "expected to all be something, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1,2,3,4]).to(allPass("be something", {$0 < 3})) - } - failsWithErrorMessage("expected to not all be something") { - expect([1,2,3,4]).toNot(allPass("be something", {$0 < 5})) - } - } - - func testAllPassMatcher() { - expect([1,2,3,4]).to(allPass(beLessThan(5))) - expect([1,2,3,4]).toNot(allPass(beGreaterThan(5))) - - failsWithErrorMessage( - "expected to all be less than <3>, but failed first at element <3> in <[1, 2, 3, 4]>") { - expect([1,2,3,4]).to(allPass(beLessThan(3))) - } - failsWithErrorMessage("expected to not all be less than <5>") { - expect([1,2,3,4]).toNot(allPass(beLessThan(5))) - } - } - - func testAllPassCollectionsWithOptionalsDontWork() { - failsWithErrorMessage("expected to all be nil, but failed first at element in <[nil, nil, nil]>") { - expect([nil, nil, nil] as [Int?]).to(allPass(beNil())) - } - failsWithErrorMessage("expected to all pass a condition, but failed first at element in <[nil, nil, nil]>") { - expect([nil, nil, nil] as [Int?]).to(allPass({$0 == nil})) - } - } - - func testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer() { - expect([nil, nil, nil] as [Int?]).to(allPass({$0! == nil})) - expect([nil, 1, nil] as [Int?]).toNot(allPass({$0! == nil})) - expect([1, 1, 1] as [Int?]).to(allPass({$0! == 1})) - expect([1, 1, nil] as [Int?]).toNot(allPass({$0! == 1})) - expect([1, 2, 3] as [Int?]).to(allPass({$0! < 4})) - expect([1, 2, 3] as [Int?]).toNot(allPass({$0! < 3})) - expect([1, 2, nil] as [Int?]).to(allPass({$0! < 3})) - } - - func testAllPassSet() { - expect(Set([1,2,3,4])).to(allPass({$0 < 5})) - expect(Set([1,2,3,4])).toNot(allPass({$0 > 5})) - - failsWithErrorMessage("expected to not all pass a condition") { - expect(Set([1,2,3,4])).toNot(allPass({$0 < 5})) - } - failsWithErrorMessage("expected to not all be something") { - expect(Set([1,2,3,4])).toNot(allPass("be something", {$0 < 5})) - } - } - - func testAllPassWithNilAsExpectedValue() { - failsWithErrorMessageForNil("expected to all pass") { - expect(nil as [Int]?).to(allPass(beLessThan(5))) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift deleted file mode 100644 index 121ecbd..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble - -#if _runtime(_ObjC) - -class TestNull : NSNull {} - -final class BeAKindOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAKindOfTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testFailureMessages", testFailureMessages), - ("testSwiftTypesFailureMessages", testSwiftTypesFailureMessages), - ] - } - - func testPositiveMatch() { - expect(TestNull()).to(beAKindOf(NSNull.self)) - expect(NSObject()).to(beAKindOf(NSObject.self)) - expect(NSNumber(value:1)).toNot(beAKindOf(NSDate.self)) - } - - func testFailureMessages() { - failsWithErrorMessageForNil("expected to not be a kind of NSNull, got ") { - expect(nil as NSNull?).toNot(beAKindOf(NSNull.self)) - } - failsWithErrorMessageForNil("expected to be a kind of NSString, got ") { - expect(nil as NSString?).to(beAKindOf(NSString.self)) - } - failsWithErrorMessage("expected to be a kind of NSString, got <__NSCFNumber instance>") { - expect(NSNumber(value:1)).to(beAKindOf(NSString.self)) - } - failsWithErrorMessage("expected to not be a kind of NSNumber, got <__NSCFNumber instance>") { - expect(NSNumber(value:1)).toNot(beAKindOf(NSNumber.self)) - } - } - - func testSwiftTypesFailureMessages() { - enum TestEnum { - case one, two - } - failsWithErrorMessage("beAKindOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect(1).to(beAKindOf(Int.self)) - } - failsWithErrorMessage("beAKindOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect("test").to(beAKindOf(String.self)) - } - failsWithErrorMessage("beAKindOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect(TestEnum.one).to(beAKindOf(TestEnum.self)) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift deleted file mode 100644 index c4a4954..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift +++ /dev/null @@ -1,58 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeAnInstanceOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeAnInstanceOfTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testFailureMessages", testFailureMessages), - ("testSwiftTypesFailureMessages", testSwiftTypesFailureMessages), - ] - } - - func testPositiveMatch() { - expect(NSNull()).to(beAnInstanceOf(NSNull.self)) - expect(NSNumber(value:1)).toNot(beAnInstanceOf(NSDate.self)) - } - - func testFailureMessages() { - failsWithErrorMessageForNil("expected to not be an instance of NSNull, got ") { - expect(nil as NSNull?).toNot(beAnInstanceOf(NSNull.self)) - } - failsWithErrorMessageForNil("expected to be an instance of NSString, got ") { - expect(nil as NSString?).to(beAnInstanceOf(NSString.self)) - } -#if _runtime(_ObjC) - let numberTypeName = "__NSCFNumber" -#else - let numberTypeName = "NSNumber" -#endif - failsWithErrorMessage("expected to be an instance of NSString, got <\(numberTypeName) instance>") { - expect(NSNumber(value:1)).to(beAnInstanceOf(NSString.self)) - } - failsWithErrorMessage("expected to not be an instance of NSNumber, got <\(numberTypeName) instance>") { - expect(NSNumber(value:1)).toNot(beAnInstanceOf(NSNumber.self)) - } - } - - func testSwiftTypesFailureMessages() { - enum TestEnum { - case one, two - } - - failsWithErrorMessage("beAnInstanceOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect(1).to(beAnInstanceOf(Int.self)) - } - failsWithErrorMessage("beAnInstanceOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect("test").to(beAnInstanceOf(String.self)) - } - failsWithErrorMessage("beAnInstanceOf only works on Objective-C types since the Swift compiler" - + " will automatically type check Swift-only types. This expectation is redundant.") { - expect(TestEnum.one).to(beAnInstanceOf(TestEnum.self)) - } - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift deleted file mode 100644 index c9e9c48..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift +++ /dev/null @@ -1,160 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeCloseToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeCloseToTest) -> () throws -> Void)] { - return [ - ("testBeCloseTo", testBeCloseTo), - ("testBeCloseToWithin", testBeCloseToWithin), - ("testBeCloseToWithNSNumber", testBeCloseToWithNSNumber), - ("testBeCloseToWithDate", testBeCloseToWithDate), - ("testBeCloseToWithNSDate", testBeCloseToWithNSDate), - ("testBeCloseToOperator", testBeCloseToOperator), - ("testBeCloseToWithinOperator", testBeCloseToWithinOperator), - ("testPlusMinusOperator", testPlusMinusOperator), - ("testBeCloseToOperatorWithDate", testBeCloseToOperatorWithDate), - ("testBeCloseToWithinOperatorWithDate", testBeCloseToWithinOperatorWithDate), - ("testPlusMinusOperatorWithDate", testPlusMinusOperatorWithDate), - ("testBeCloseToArray", testBeCloseToArray), - ("testBeCloseToWithCGFloat", testBeCloseToWithCGFloat), - ] - } - - func testBeCloseTo() { - expect(1.2).to(beCloseTo(1.2001)) - expect(1.2 as CDouble).to(beCloseTo(1.2001)) - expect(1.2 as Float).to(beCloseTo(1.2001)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 0.0001), got <1.2>") { - expect(1.2).toNot(beCloseTo(1.2001)) - } - } - - func testBeCloseToWithin() { - expect(1.2).to(beCloseTo(9.300, within: 10)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(1.2).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithNSNumber() { - expect(NSNumber(value:1.2)).to(beCloseTo(9.300, within: 10)) - expect(NSNumber(value:1.2)).to(beCloseTo(NSNumber(value:9.300), within: 10)) - expect(1.2).to(beCloseTo(NSNumber(value:9.300), within: 10)) - - failsWithErrorMessage("expected to not be close to <1.2001> (within 1), got <1.2>") { - expect(NSNumber(value:1.2)).toNot(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithCGFloat() { - expect(CGFloat(1.2)).to(beCloseTo(1.2001)) - expect(CGFloat(1.2)).to(beCloseTo(CGFloat(1.2001))) - - failsWithErrorMessage("expected to be close to <1.2001> (within 1), got <1.2>") { - expect(CGFloat(1.2)).to(beCloseTo(1.2001, within: 1.0)) - } - } - - func testBeCloseToWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")).to(beCloseTo(Date(dateTimeString: "2015-08-26 11:43:05"), within: 10)) - - failsWithErrorMessage("expected to not be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")).toNot(beCloseTo(expectedDate, within: 0.004)) - } - } - - func testBeCloseToWithNSDate() { - expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).to(beCloseTo(NSDate(dateTimeString: "2015-08-26 11:43:05"), within: 10)) - - failsWithErrorMessage("expected to not be close to <2015-08-26 11:43:00.0050> (within 0.004), got <2015-08-26 11:43:00.0000>") { - let expectedDate = NSDate(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).toNot(beCloseTo(expectedDate, within: 0.004)) - } - } - - func testBeCloseToOperator() { - expect(1.2) ≈ 1.2001 - expect(1.2 as CDouble) ≈ 1.2001 - - failsWithErrorMessage("expected to be close to <1.2002> (within 0.0001), got <1.2>") { - expect(1.2) ≈ 1.2002 - } - } - - func testBeCloseToWithinOperator() { - expect(1.2) ≈ (9.300, 10) - expect(1.2) == (9.300, 10) - - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) ≈ (1.0, 0.1) - } - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) == (1.0, 0.1) - } - } - - func testPlusMinusOperator() { - expect(1.2) ≈ 9.300 ± 10 - expect(1.2) == 9.300 ± 10 - - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) ≈ 1.0 ± 0.1 - } - failsWithErrorMessage("expected to be close to <1> (within 0.1), got <1.2>") { - expect(1.2) == 1.0 ± 0.1 - } - } - - func testBeCloseToOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ Date(dateTimeString: "2015-08-26 11:43:00") - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.0001), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ expectedDate - } - } - - func testBeCloseToWithinOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ (Date(dateTimeString: "2015-08-26 11:43:05"), 10) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == (Date(dateTimeString: "2015-08-26 11:43:05"), 10) - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ (expectedDate, 0.006) - } - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == (expectedDate, 0.006) - } - } - - func testPlusMinusOperatorWithDate() { - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ Date(dateTimeString: "2015-08-26 11:43:05") ± 10 - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == Date(dateTimeString: "2015-08-26 11:43:05") ± 10 - - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) ≈ expectedDate ± 0.006 - } - failsWithErrorMessage("expected to be close to <2015-08-26 11:43:00.0050> (within 0.006), got <2015-08-26 11:43:00.0000>") { - let expectedDate = Date(dateTimeString: "2015-08-26 11:43:00").addingTimeInterval(0.005) - expect(Date(dateTimeString: "2015-08-26 11:43:00")) == expectedDate ± 0.006 - } - } - - func testBeCloseToArray() { - expect([0.0, 1.1, 2.2]) ≈ [0.0001, 1.1001, 2.2001] - expect([0.0, 1.1, 2.2]).to(beCloseTo([0.1, 1.2, 2.3], within: 0.1)) - - failsWithErrorMessage("expected to be close to <[0, 1]> (each within 0.0001), got <[0, 1.1]>") { - expect([0.0, 1.1]) ≈ [0.0, 1.0] - } - failsWithErrorMessage("expected to be close to <[0.2, 1.2]> (each within 0.1), got <[0, 1.1]>") { - expect([0.0, 1.1]).to(beCloseTo([0.2, 1.2], within: 0.1)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift deleted file mode 100644 index d7f35aa..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift +++ /dev/null @@ -1,82 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeEmptyTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeEmptyTest) -> () throws -> Void)] { - return [ - ("testBeEmptyPositive", testBeEmptyPositive), - ("testBeEmptyNegative", testBeEmptyNegative), - ] - } - - func testBeEmptyPositive() { - expect([] as [Int]).to(beEmpty()) - expect([1]).toNot(beEmpty()) - - expect([] as [CInt]).to(beEmpty()) - expect([1] as [CInt]).toNot(beEmpty()) - -#if _runtime(_ObjC) - expect(NSDictionary() as? [Int:Int]).to(beEmpty()) - expect(NSDictionary(object: 1, forKey: 1 as NSNumber) as? [Int:Int]).toNot(beEmpty()) -#endif - - expect(Dictionary()).to(beEmpty()) - expect(["hi": 1]).toNot(beEmpty()) - -#if _runtime(_ObjC) - expect(NSArray() as? [Int]).to(beEmpty()) - expect(NSArray(array: [1]) as? [Int]).toNot(beEmpty()) -#endif - - expect(NSSet()).to(beEmpty()) - expect(NSSet(array: [NSNumber(value: 1)])).toNot(beEmpty()) - - expect(NSIndexSet()).to(beEmpty()) - expect(NSIndexSet(index: 1)).toNot(beEmpty()) - - expect(NSString()).to(beEmpty()) - expect(NSString(string: "hello")).toNot(beEmpty()) - - expect("").to(beEmpty()) - expect("foo").toNot(beEmpty()) - } - - func testBeEmptyNegative() { - failsWithErrorMessageForNil("expected to be empty, got ") { - expect(nil as NSString?).to(beEmpty()) - } - failsWithErrorMessageForNil("expected to not be empty, got ") { - expect(nil as [CInt]?).toNot(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <()>") { - expect(NSArray()).toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got <[1]>") { - expect([1]).to(beEmpty()) - } - - failsWithErrorMessage("expected to not be empty, got <{()}>") { - expect(NSSet()).toNot(beEmpty()); - } - failsWithErrorMessage("expected to be empty, got <{(1)}>") { - expect(NSSet(object: NSNumber(value: 1))).to(beEmpty()); - } - - failsWithErrorMessage("expected to not be empty, got <()>") { - expect(NSIndexSet()).toNot(beEmpty()); - } - failsWithErrorMessage("expected to be empty, got <(1)>") { - expect(NSIndexSet(index: 1)).to(beEmpty()); - } - - failsWithErrorMessage("expected to not be empty, got <>") { - expect("").toNot(beEmpty()) - } - failsWithErrorMessage("expected to be empty, got ") { - expect("foo").to(beEmpty()) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift deleted file mode 100644 index beec4d7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift +++ /dev/null @@ -1,50 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeGreaterThanOrEqualToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeGreaterThanOrEqualToTest) -> () throws -> Void)] { - return [ - ("testGreaterThanOrEqualTo", testGreaterThanOrEqualTo), - ("testGreaterThanOrEqualToOperator", testGreaterThanOrEqualToOperator), - ] - } - - func testGreaterThanOrEqualTo() { - expect(10).to(beGreaterThanOrEqualTo(10)) - expect(10).to(beGreaterThanOrEqualTo(2)) - expect(1).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value:1)).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value:2)).to(beGreaterThanOrEqualTo(NSNumber(value:2))) -#if _runtime(_ObjC) - expect(1).to(beGreaterThanOrEqualTo(NSNumber(value:0))) -#endif - - failsWithErrorMessage("expected to be greater than or equal to <2>, got <0>") { - expect(0).to(beGreaterThanOrEqualTo(2)) - return - } - failsWithErrorMessage("expected to not be greater than or equal to <1>, got <1>") { - expect(1).toNot(beGreaterThanOrEqualTo(1)) - return - } - failsWithErrorMessageForNil("expected to be greater than or equal to <-2>, got ") { - expect(nil as Int?).to(beGreaterThanOrEqualTo(-2)) - } - failsWithErrorMessageForNil("expected to not be greater than or equal to <1>, got ") { - expect(nil as Int?).toNot(beGreaterThanOrEqualTo(1)) - } - } - - func testGreaterThanOrEqualToOperator() { - expect(0) >= 0 - expect(1) >= 0 - expect(NSNumber(value:1)) >= 1 - expect(NSNumber(value:1)) >= NSNumber(value:1) - - failsWithErrorMessage("expected to be greater than or equal to <2>, got <1>") { - expect(1) >= 2 - return - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift deleted file mode 100644 index b7dbf47..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift +++ /dev/null @@ -1,50 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeGreaterThanTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeGreaterThanTest) -> () throws -> Void)] { - return [ - ("testGreaterThan", testGreaterThan), - ("testGreaterThanOperator", testGreaterThanOperator), - ] - } - - func testGreaterThan() { - expect(10).to(beGreaterThan(2)) - expect(1).toNot(beGreaterThan(2)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:3)).to(beGreaterThan(2)) -#else - expect(NSNumber(value:3)).to(beGreaterThan(2 as NSNumber)) -#endif - expect(NSNumber(value:1)).toNot(beGreaterThan(NSNumber(value:2))) - - failsWithErrorMessage("expected to be greater than <2>, got <0>") { - expect(0).to(beGreaterThan(2)) - } - failsWithErrorMessage("expected to not be greater than <0>, got <1>") { - expect(1).toNot(beGreaterThan(0)) - } - failsWithErrorMessageForNil("expected to be greater than <-2>, got ") { - expect(nil as Int?).to(beGreaterThan(-2)) - } - failsWithErrorMessageForNil("expected to not be greater than <0>, got ") { - expect(nil as Int?).toNot(beGreaterThan(0)) - } - } - - func testGreaterThanOperator() { - expect(1) > 0 - expect(NSNumber(value:1)) > NSNumber(value:0) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:1)) > 0 -#else - expect(NSNumber(value:1)) > 0 as NSNumber -#endif - failsWithErrorMessage("expected to be greater than <2>, got <1>") { - expect(1) > 2 - return - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift deleted file mode 100644 index a598bfb..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift +++ /dev/null @@ -1,64 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeIdenticalToObjectTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeIdenticalToObjectTest) -> () throws -> Void)] { - return [ - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testFailsOnNils", testFailsOnNils), - ("testOperators", testOperators), - ] - } - - private class BeIdenticalToObjectTester {} - private let testObjectA = BeIdenticalToObjectTester() - private let testObjectB = BeIdenticalToObjectTester() - - func testBeIdenticalToPositive() { - expect(self.testObjectA).to(beIdenticalTo(testObjectA)) - } - - func testBeIdenticalToNegative() { - expect(self.testObjectA).toNot(beIdenticalTo(testObjectB)) - } - - func testBeIdenticalToPositiveMessage() { - let message = String(describing: NSString(format: "expected to be identical to <%p>, got <%p>", - unsafeBitCast(testObjectB, to: Int.self), unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessage(message) { - expect(self.testObjectA).to(beIdenticalTo(self.testObjectB)) - } - } - - func testBeIdenticalToNegativeMessage() { - let message = String(describing: NSString(format: "expected to not be identical to <%p>, got <%p>", - unsafeBitCast(testObjectA, to: Int.self), unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessage(message) { - expect(self.testObjectA).toNot(beIdenticalTo(self.testObjectA)) - } - } - - func testFailsOnNils() { - let message1 = String(describing: NSString(format: "expected to be identical to <%p>, got nil", - unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessageForNil(message1) { - expect(nil as BeIdenticalToObjectTester?).to(beIdenticalTo(self.testObjectA)) - } - - let message2 = String(describing: NSString(format: "expected to not be identical to <%p>, got nil", - unsafeBitCast(testObjectA, to: Int.self))) - failsWithErrorMessageForNil(message2) { - expect(nil as BeIdenticalToObjectTester?).toNot(beIdenticalTo(self.testObjectA)) - } - } - - func testOperators() { - expect(self.testObjectA) === testObjectA - expect(self.testObjectA) !== testObjectB - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift deleted file mode 100644 index a68260a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift +++ /dev/null @@ -1,68 +0,0 @@ -import Foundation -import XCTest -@testable import Nimble - -final class BeIdenticalToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeIdenticalToTest) -> () throws -> Void)] { - return [ - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testOperators", testOperators), - ("testBeAlias", testBeAlias) - ] - } - - func testBeIdenticalToPositive() { - let value = NSDate() - expect(value).to(beIdenticalTo(value)) - } - - func testBeIdenticalToNegative() { - expect(NSNumber(value:1)).toNot(beIdenticalTo(NSString(string: "yo"))) - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) - } - - func testBeIdenticalToPositiveMessage() { - let num1 = NSNumber(value:1) - let num2 = NSNumber(value:2) - let message = "expected to be identical to \(identityAsString(num2)), got \(identityAsString(num1))" - failsWithErrorMessage(message) { - expect(num1).to(beIdenticalTo(num2)) - } - } - - func testBeIdenticalToNegativeMessage() { - let value1 = NSArray(array: []) - let value2 = NSArray(array: []) - let message = "expected to not be identical to \(identityAsString(value2)), got \(identityAsString(value1))" - failsWithErrorMessage(message) { - expect(value1).toNot(beIdenticalTo(value2)) - } - } - - func testOperators() { - let value = NSDate() - expect(value) === value - expect(NSNumber(value:1)) !== NSNumber(value:2) - } - - func testBeAlias() { - let value = NSDate() - expect(value).to(be(value)) - expect(NSNumber(value:1)).toNot(be(NSString(stringLiteral: "turtles"))) - #if _runtime(_ObjC) - expect([1]).toNot(be([1])) - #else - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) - #endif - - let value1 = NSArray(array: []) - let value2 = NSArray(array: []) - let message = "expected to not be identical to \(identityAsString(value2)), got \(identityAsString(value1))" - failsWithErrorMessage(message) { - expect(value1).toNot(be(value2)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift deleted file mode 100644 index 61cfec1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeLessThanOrEqualToTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeLessThanOrEqualToTest) -> () throws -> Void)] { - return [ - ("testLessThanOrEqualTo", testLessThanOrEqualTo), - ("testLessThanOrEqualToOperator", testLessThanOrEqualToOperator), - ] - } - - func testLessThanOrEqualTo() { - expect(10).to(beLessThanOrEqualTo(10)) - expect(2).to(beLessThanOrEqualTo(10)) - expect(2).toNot(beLessThanOrEqualTo(1)) - - expect(NSNumber(value:2)).to(beLessThanOrEqualTo(10)) - expect(NSNumber(value:2)).toNot(beLessThanOrEqualTo(1)) -#if _runtime(_ObjC) - expect(2).to(beLessThanOrEqualTo(NSNumber(value:10))) - expect(2).toNot(beLessThanOrEqualTo(NSNumber(value:1))) -#endif - - failsWithErrorMessage("expected to be less than or equal to <0>, got <2>") { - expect(2).to(beLessThanOrEqualTo(0)) - return - } - failsWithErrorMessage("expected to not be less than or equal to <0>, got <0>") { - expect(0).toNot(beLessThanOrEqualTo(0)) - return - } - failsWithErrorMessageForNil("expected to be less than or equal to <2>, got ") { - expect(nil as Int?).to(beLessThanOrEqualTo(2)) - return - } - failsWithErrorMessageForNil("expected to not be less than or equal to <-2>, got ") { - expect(nil as Int?).toNot(beLessThanOrEqualTo(-2)) - return - } - } - - func testLessThanOrEqualToOperator() { - expect(0) <= 1 - expect(1) <= 1 - - failsWithErrorMessage("expected to be less than or equal to <1>, got <2>") { - expect(2) <= 1 - return - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift deleted file mode 100644 index f1c3317..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeLessThanTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeLessThanTest) -> () throws -> Void)] { - return [ - ("testLessThan", testLessThan), - ("testLessThanOperator", testLessThanOperator), - ] - } - - func testLessThan() { - expect(2).to(beLessThan(10)) - expect(2).toNot(beLessThan(1)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:2)).to(beLessThan(10)) - expect(NSNumber(value:2)).toNot(beLessThan(1)) - - expect(2).to(beLessThan(NSNumber(value:10))) - expect(2).toNot(beLessThan(NSNumber(value:1))) -#else - expect(NSNumber(value:2)).to(beLessThan(10 as NSNumber)) - expect(NSNumber(value:2)).toNot(beLessThan(1 as NSNumber)) - - expect(2 as NSNumber).to(beLessThan(NSNumber(value:10))) - expect(2 as NSNumber).toNot(beLessThan(NSNumber(value:1))) -#endif - - failsWithErrorMessage("expected to be less than <0>, got <2>") { - expect(2).to(beLessThan(0)) - } - failsWithErrorMessage("expected to not be less than <1>, got <0>") { - expect(0).toNot(beLessThan(1)) - } - - failsWithErrorMessageForNil("expected to be less than <2>, got ") { - expect(nil as Int?).to(beLessThan(2)) - } - failsWithErrorMessageForNil("expected to not be less than <-1>, got ") { - expect(nil as Int?).toNot(beLessThan(-1)) - } - } - - func testLessThanOperator() { - expect(0) < 1 -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value:0)) < 1 -#else - expect(NSNumber(value:0)) < 1 as NSNumber -#endif - failsWithErrorMessage("expected to be less than <1>, got <2>") { - expect(2) < 1 - return - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift deleted file mode 100644 index 9b8735c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift +++ /dev/null @@ -1,270 +0,0 @@ -import XCTest -import Nimble -import Foundation - -enum ConvertsToBool : ExpressibleByBooleanLiteral, CustomStringConvertible { - case trueLike, falseLike - - typealias BooleanLiteralType = Bool - - init(booleanLiteral value: Bool) { - switch value { - case true: self = .trueLike - case false: self = .falseLike - } - } - - var boolValue : Bool { - switch self { - case .trueLike: return true - case .falseLike: return false - } - } - - var description : String { - switch self { - case .trueLike: return "TrueLike" - case .falseLike: return "FalseLike" - } - } -} - -final class BeTruthyTest : XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeTruthyTest) -> () throws -> Void)] { - return [ - ("testShouldMatchNonNilTypes", testShouldMatchNonNilTypes), - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchNilTypes", testShouldNotMatchNilTypes), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ("testShouldMatchBoolConvertibleTypesThatConvertToTrue", testShouldMatchBoolConvertibleTypesThatConvertToTrue), - ("testShouldNotMatchBoolConvertibleTypesThatConvertToFalse", testShouldNotMatchBoolConvertibleTypesThatConvertToFalse), - ] - } - - func testShouldMatchNonNilTypes() { - expect(true as Bool?).to(beTruthy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(1 as Int8?).to(beTruthy()) - expect(1 as UInt8?).to(beTruthy()) - expect(1 as Int16?).to(beTruthy()) - expect(1 as UInt16?).to(beTruthy()) - expect(1 as Int32?).to(beTruthy()) - expect(1 as UInt32?).to(beTruthy()) - expect(1 as Int64?).to(beTruthy()) - expect(1 as UInt64?).to(beTruthy()) - expect(1 as Float?).to(beTruthy()) - expect(1 as Double?).to(beTruthy()) - expect(1 as Int?).to(beTruthy()) - expect(1 as UInt?).to(beTruthy()) - } - - func testShouldMatchTrue() { - expect(true).to(beTruthy()) - - failsWithErrorMessage("expected to not be truthy, got ") { - expect(true).toNot(beTruthy()) - } - } - - func testShouldNotMatchNilTypes() { - expect(false as Bool?).toNot(beTruthy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(nil as Bool?).toNot(beTruthy()) - expect(nil as Int8?).toNot(beTruthy()) - expect(nil as UInt8?).toNot(beTruthy()) - expect(nil as Int16?).toNot(beTruthy()) - expect(nil as UInt16?).toNot(beTruthy()) - expect(nil as Int32?).toNot(beTruthy()) - expect(nil as UInt32?).toNot(beTruthy()) - expect(nil as Int64?).toNot(beTruthy()) - expect(nil as UInt64?).toNot(beTruthy()) - expect(nil as Float?).toNot(beTruthy()) - expect(nil as Double?).toNot(beTruthy()) - expect(nil as Int?).toNot(beTruthy()) - expect(nil as UInt?).toNot(beTruthy()) - } - - func testShouldNotMatchFalse() { - expect(false).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(false).to(beTruthy()) - } - } - - func testShouldNotMatchNilBools() { - expect(nil as Bool?).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(nil as Bool?).to(beTruthy()) - } - } - - func testShouldMatchBoolConvertibleTypesThatConvertToTrue() { - expect(ConvertsToBool.trueLike).to(beTruthy()) - - failsWithErrorMessage("expected to not be truthy, got ") { - expect(ConvertsToBool.trueLike).toNot(beTruthy()) - } - } - - func testShouldNotMatchBoolConvertibleTypesThatConvertToFalse() { - expect(ConvertsToBool.falseLike).toNot(beTruthy()) - - failsWithErrorMessage("expected to be truthy, got ") { - expect(ConvertsToBool.falseLike).to(beTruthy()) - } - } -} - -final class BeTrueTest : XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeTrueTest) -> () throws -> Void)] { - return [ - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ] - } - - func testShouldMatchTrue() { - expect(true).to(beTrue()) - - failsWithErrorMessage("expected to not be true, got ") { - expect(true).toNot(beTrue()) - } - } - - func testShouldNotMatchFalse() { - expect(false).toNot(beTrue()) - - failsWithErrorMessage("expected to be true, got ") { - expect(false).to(beTrue()) - } - } - - func testShouldNotMatchNilBools() { - failsWithErrorMessageForNil("expected to not be true, got ") { - expect(nil as Bool?).toNot(beTrue()) - } - - failsWithErrorMessageForNil("expected to be true, got ") { - expect(nil as Bool?).to(beTrue()) - } - } -} - -final class BeFalsyTest : XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeFalsyTest) -> () throws -> Void)] { - return [ - ("testShouldMatchNilTypes", testShouldMatchNilTypes), - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ("testShouldNotMatchNonNilTypes", testShouldNotMatchNonNilTypes), - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldMatchNilBools", testShouldMatchNilBools), - ] - } - - func testShouldMatchNilTypes() { - expect(false as Bool?).to(beFalsy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(nil as Bool?).to(beFalsy()) - expect(nil as Int8?).to(beFalsy()) - expect(nil as UInt8?).to(beFalsy()) - expect(nil as Int16?).to(beFalsy()) - expect(nil as UInt16?).to(beFalsy()) - expect(nil as Int32?).to(beFalsy()) - expect(nil as UInt32?).to(beFalsy()) - expect(nil as Int64?).to(beFalsy()) - expect(nil as UInt64?).to(beFalsy()) - expect(nil as Float?).to(beFalsy()) - expect(nil as Double?).to(beFalsy()) - expect(nil as Int?).to(beFalsy()) - expect(nil as UInt?).to(beFalsy()) - } - - func testShouldNotMatchTrue() { - expect(true).toNot(beFalsy()) - - failsWithErrorMessage("expected to be falsy, got ") { - expect(true).to(beFalsy()) - } - } - - func testShouldNotMatchNonNilTypes() { - expect(true as Bool?).toNot(beFalsy()) - - // Support types conforming to `ExpressibleByBooleanLiteral` - // Nimble extend following types as conforming to `ExpressibleByBooleanLiteral` - expect(1 as Int8?).toNot(beFalsy()) - expect(1 as UInt8?).toNot(beFalsy()) - expect(1 as Int16?).toNot(beFalsy()) - expect(1 as UInt16?).toNot(beFalsy()) - expect(1 as Int32?).toNot(beFalsy()) - expect(1 as UInt32?).toNot(beFalsy()) - expect(1 as Int64?).toNot(beFalsy()) - expect(1 as UInt64?).toNot(beFalsy()) - expect(1 as Float?).toNot(beFalsy()) - expect(1 as Double?).toNot(beFalsy()) - expect(1 as Int?).toNot(beFalsy()) - expect(1 as UInt?).toNot(beFalsy()) - } - - func testShouldMatchFalse() { - expect(false).to(beFalsy()) - - failsWithErrorMessage("expected to not be falsy, got ") { - expect(false).toNot(beFalsy()) - } - } - - func testShouldMatchNilBools() { - expect(nil as Bool?).to(beFalsy()) - - failsWithErrorMessage("expected to not be falsy, got ") { - expect(nil as Bool?).toNot(beFalsy()) - } - } -} - -final class BeFalseTest : XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeFalseTest) -> () throws -> Void)] { - return [ - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ] - } - - func testShouldNotMatchTrue() { - expect(true).toNot(beFalse()) - - failsWithErrorMessage("expected to be false, got ") { - expect(true).to(beFalse()) - } - } - - func testShouldMatchFalse() { - expect(false).to(beFalse()) - - failsWithErrorMessage("expected to not be false, got ") { - expect(false).toNot(beFalse()) - } - } - - func testShouldNotMatchNilBools() { - failsWithErrorMessageForNil("expected to be false, got ") { - expect(nil as Bool?).to(beFalse()) - } - - failsWithErrorMessageForNil("expected to not be false, got ") { - expect(nil as Bool?).toNot(beFalse()) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift deleted file mode 100644 index 78cade0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift +++ /dev/null @@ -1,28 +0,0 @@ -import XCTest -import Nimble - -final class BeNilTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeNilTest) -> () throws -> Void)] { - return [ - ("testBeNil", testBeNil), - ] - } - - func producesNil() -> Array? { - return nil - } - - func testBeNil() { - expect(nil as Int?).to(beNil()) - expect(1 as Int?).toNot(beNil()) - expect(self.producesNil()).to(beNil()) - - failsWithErrorMessage("expected to not be nil, got ") { - expect(nil as Int?).toNot(beNil()) - } - - failsWithErrorMessage("expected to be nil, got <1>") { - expect(1 as Int?).to(beNil()) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift deleted file mode 100644 index a8eefc1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift +++ /dev/null @@ -1,32 +0,0 @@ -import XCTest -import Nimble - -final class BeVoidTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeVoidTest) -> () throws -> Void)] { - return [ - ("testBeVoid", testBeVoid), - ] - } - - func testBeVoid() { - expect(()).to(beVoid()) - expect(() as ()?).to(beVoid()) - expect(nil as ()?).toNot(beVoid()) - - expect(()) == () - expect(() as ()?) == () - expect(nil as ()?) != () - - failsWithErrorMessage("expected to not be void, got <()>") { - expect(()).toNot(beVoid()) - } - - failsWithErrorMessage("expected to not be void, got <()>") { - expect(() as ()?).toNot(beVoid()) - } - - failsWithErrorMessage("expected to be void, got ") { - expect(nil as ()?).to(beVoid()) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift deleted file mode 100644 index a05707c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class BeginWithTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeginWithTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testNegativeMatches", testNegativeMatches), - ] - } - - func testPositiveMatches() { - expect([1, 2, 3]).to(beginWith(1)) - expect([1, 2, 3]).toNot(beginWith(2)) - - expect("foobar").to(beginWith("foo")) - expect("foobar").toNot(beginWith("oo")) - - expect("foobarfoo").to(beginWith("foo")) - - expect(NSString(string: "foobar").description).to(beginWith("foo")) - expect(NSString(string: "foobar").description).toNot(beginWith("oo")) - -#if _runtime(_ObjC) - expect(NSArray(array: ["a", "b"])).to(beginWith("a")) - expect(NSArray(array: ["a", "b"])).toNot(beginWith("b")) -#endif - } - - func testNegativeMatches() { - failsWithErrorMessageForNil("expected to begin with , got ") { - expect(nil as NSArray?).to(beginWith(NSString(string: "b"))) - } - failsWithErrorMessageForNil("expected to not begin with , got ") { - expect(nil as NSArray?).toNot(beginWith(NSString(string: "b"))) - } - - failsWithErrorMessage("expected to begin with <2>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(beginWith(2)) - } - failsWithErrorMessage("expected to not begin with <1>, got <[1, 2, 3]>") { - expect([1, 2, 3]).toNot(beginWith(1)) - } - failsWithErrorMessage("expected to begin with , got ") { - expect("batman").to(beginWith("atm")) - } - failsWithErrorMessage("expected to not begin with , got ") { - expect("batman").toNot(beginWith("bat")) - } - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift deleted file mode 100644 index 6b20d15..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift +++ /dev/null @@ -1,95 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class ContainTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ContainTest) -> () throws -> Void)] { - return [ - ("testContain", testContain), - ("testContainSubstring", testContainSubstring), - ("testContainObjCSubstring", testContainObjCSubstring), - ("testVariadicArguments", testVariadicArguments), - ("testCollectionArguments", testCollectionArguments), - ] - } - - func testContain() { - expect([1, 2, 3]).to(contain(1)) - expect([1, 2, 3] as [CInt]).to(contain(1 as CInt)) - expect([1, 2, 3] as Array).to(contain(1 as CInt)) - expect(["foo", "bar", "baz"]).to(contain("baz")) - expect([1, 2, 3]).toNot(contain(4)) - expect(["foo", "bar", "baz"]).toNot(contain("ba")) -#if _runtime(_ObjC) - expect(NSArray(array: ["a"])).to(contain(NSString(string: "a"))) - expect(NSArray(array: ["a"])).toNot(contain(NSString(string:"b"))) - expect(NSArray(object: 1) as NSArray?).to(contain(1)) -#endif - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain("bar")) - } - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain("b")) - } - - failsWithErrorMessageForNil("expected to contain , got ") { - expect(nil as [String]?).to(contain("bar")) - } - failsWithErrorMessageForNil("expected to not contain , got ") { - expect(nil as [String]?).toNot(contain("b")) - } - } - - func testContainSubstring() { - expect("foo").to(contain("o")) - expect("foo").to(contain("oo")) - expect("foo").toNot(contain("z")) - expect("foo").toNot(contain("zz")) - - failsWithErrorMessage("expected to contain , got ") { - expect("foo").to(contain("bar")) - } - failsWithErrorMessage("expected to not contain , got ") { - expect("foo").toNot(contain("oo")) - } - } - - func testContainObjCSubstring() { - let str = NSString(string: "foo") - expect(str).to(contain(NSString(string: "o"))) - expect(str).to(contain(NSString(string: "oo"))) - expect(str).toNot(contain(NSString(string: "z"))) - expect(str).toNot(contain(NSString(string: "zz"))) - } - - func testVariadicArguments() { - expect([1, 2, 3]).to(contain(1, 2)) - expect([1, 2, 3]).toNot(contain(1, 4)) - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain("a", "bar")) - } - - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain("bar", "b")) - } - } - - func testCollectionArguments() { - expect([1, 2, 3]).to(contain([1, 2])) - expect([1, 2, 3]).toNot(contain([1, 4])) - - let collection = Array(1...10) - let slice = Array(collection[3...5]) - expect(collection).to(contain(slice)) - - failsWithErrorMessage("expected to contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).to(contain(["a", "bar"])) - } - - failsWithErrorMessage("expected to not contain , got <[a, b, c]>") { - expect(["a", "b", "c"]).toNot(contain(["bar", "b"])) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift deleted file mode 100644 index 3e19426..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class EndWithTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (EndWithTest) -> () throws -> Void)] { - return [ - ("testEndWithPositives", testEndWithPositives), - ("testEndWithNegatives", testEndWithNegatives), - ] - } - - func testEndWithPositives() { - expect([1, 2, 3]).to(endWith(3)) - expect([1, 2, 3]).toNot(endWith(2)) - expect([]).toNot(endWith(1)) - expect(["a", "b", "a"]).to(endWith("a")) - - expect("foobar").to(endWith("bar")) - expect("foobar").toNot(endWith("oo")) - expect("foobarfoo").to(endWith("foo")) - - expect(NSString(string: "foobar").description).to(endWith("bar")) - expect(NSString(string: "foobar").description).toNot(endWith("oo")) - -#if _runtime(_ObjC) - expect(NSArray(array: ["a", "b"])).to(endWith("b")) - expect(NSArray(array: ["a", "b"])).toNot(endWith("a")) - expect(NSArray(array: [])).toNot(endWith("a")) - expect(NSArray(array: ["a", "b", "a"])).to(endWith("a")) -#endif - } - - func testEndWithNegatives() { - failsWithErrorMessageForNil("expected to end with <2>, got ") { - expect(nil as [Int]?).to(endWith(2)) - } - failsWithErrorMessageForNil("expected to not end with <2>, got ") { - expect(nil as [Int]?).toNot(endWith(2)) - } - - failsWithErrorMessage("expected to end with <2>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(endWith(2)) - } - failsWithErrorMessage("expected to not end with <3>, got <[1, 2, 3]>") { - expect([1, 2, 3]).toNot(endWith(3)) - } - failsWithErrorMessage("expected to end with , got ") { - expect("batman").to(endWith("atm")) - } - failsWithErrorMessage("expected to not end with , got ") { - expect("batman").toNot(endWith("man")) - } - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift deleted file mode 100644 index a66a784..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift +++ /dev/null @@ -1,274 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class EqualTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (EqualTest) -> () throws -> Void)] { - return [ - ("testEquality", testEquality), - ("testArrayEquality", testArrayEquality), - ("testSetEquality", testSetEquality), - ("testDoesNotMatchNils", testDoesNotMatchNils), - ("testDictionaryEquality", testDictionaryEquality), - ("testDataEquality", testDataEquality), - ("testNSObjectEquality", testNSObjectEquality), - ("testOperatorEquality", testOperatorEquality), - ("testOperatorEqualityWithArrays", testOperatorEqualityWithArrays), - ("testOperatorEqualityWithDictionaries", testOperatorEqualityWithDictionaries), - ("testOptionalEquality", testOptionalEquality), - ("testArrayOfOptionalsEquality", testArrayOfOptionalsEquality), - ("testDictionariesWithDifferentSequences", testDictionariesWithDifferentSequences), - ] - } - - func testEquality() { - expect(1 as CInt).to(equal(1 as CInt)) - expect(1 as CInt).to(equal(1)) - expect(1).to(equal(1)) - expect("hello").to(equal("hello")) - expect("hello").toNot(equal("world")) - - expect { - 1 - }.to(equal(1)) - - failsWithErrorMessage("expected to equal , got ") { - expect("hello").to(equal("world")) - } - failsWithErrorMessage("expected to not equal , got ") { - expect("hello").toNot(equal("hello")) - } - } - - func testArrayEquality() { - expect([1, 2, 3]).to(equal([1, 2, 3])) - expect([1, 2, 3]).toNot(equal([1, 2])) - expect([1, 2, 3]).toNot(equal([1, 2, 4])) - - let array1: Array = [1, 2, 3] - let array2: Array = [1, 2, 3] - expect(array1).to(equal(array2)) - expect(array1).to(equal([1, 2, 3])) - expect(array1).toNot(equal([1, 2] as Array)) - -#if _runtime(_ObjC) - expect(NSArray(array: [1, 2, 3])).to(equal(NSArray(array: [1, 2, 3]))) -#endif - - failsWithErrorMessage("expected to equal <[1, 2]>, got <[1, 2, 3]>") { - expect([1, 2, 3]).to(equal([1, 2])) - } - } - - func testSetEquality() { - expect(Set([1, 2])).to(equal(Set([1, 2]))) - expect(Set()).to(equal(Set())) - expect(Set()) == Set() - expect(Set([1, 2])) != Set() - - failsWithErrorMessageForNil("expected to equal <[1, 2]>, got ") { - expect(nil as Set?).to(equal(Set([1, 2]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3]>, missing <[1]>") { - expect(Set([2, 3])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[1, 2, 3, 4]>, extra <[4]>") { - expect(Set([1, 2, 3, 4])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3, 4]>, missing <[1]>, extra <[4]>") { - expect(Set([2, 3, 4])).to(equal(Set([1, 2, 3]))) - } - - failsWithErrorMessage("expected to equal <[1, 2, 3]>, got <[2, 3, 4]>, missing <[1]>, extra <[4]>") { - expect(Set([2, 3, 4])) == Set([1, 2, 3]) - } - - failsWithErrorMessage("expected to not equal <[1, 2, 3]>, got <[1, 2, 3]>") { - expect(Set([1, 2, 3])) != Set([1, 2, 3]) - } - } - - func testDoesNotMatchNils() { - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as String?).to(equal(nil as String?)) - } - failsWithErrorMessageForNil("expected to not equal , got ") { - expect("foo").toNot(equal(nil as String?)) - } - failsWithErrorMessageForNil("expected to not equal , got ") { - expect(nil as String?).toNot(equal("bar")) - } - - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as [Int]?).to(equal(nil as [Int]?)) - } - failsWithErrorMessageForNil("expected to not equal <[1]>, got ") { - expect(nil as [Int]?).toNot(equal([1])) - } - failsWithErrorMessageForNil("expected to not equal , got <[1]>") { - expect([1]).toNot(equal(nil as [Int]?)) - } - - failsWithErrorMessageForNil("expected to equal , got ") { - expect(nil as [Int: Int]?).to(equal(nil as [Int: Int]?)) - } - failsWithErrorMessageForNil("expected to not equal <[1: 1]>, got ") { - expect(nil as [Int: Int]?).toNot(equal([1: 1])) - } - failsWithErrorMessageForNil("expected to not equal , got <[1: 1]>") { - expect([1: 1]).toNot(equal(nil as [Int: Int]?)) - } - } - - func testDictionaryEquality() { - expect(["foo": "bar"]).to(equal(["foo": "bar"])) - expect(["foo": "bar"]).toNot(equal(["foo": "baz"])) - - let actual = ["foo": "bar"] - let expected = ["foo": "bar"] - let unexpected = ["foo": "baz"] - expect(actual).to(equal(expected)) - expect(actual).toNot(equal(unexpected)) - -#if _runtime(_ObjC) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString)).to(equal(["foo": "bar"])) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString) as? [String:String]).to(equal(expected)) -#endif - } - - func testDataEquality() { - let actual = "foobar".data(using: .utf8) - let expected = "foobar".data(using: .utf8) - let unexpected = "foobarfoo".data(using: .utf8) - - expect(actual).to(equal(expected)) - expect(actual).toNot(equal(unexpected)) - - #if os(Linux) - // FIXME: Swift on Linux triggers a segfault when calling NSData's hash() (last checked on 03-11) - let expectedErrorMessage = "expected to equal >, got >" - #else - let expectedErrorMessage = "expected to equal >," - + " got >" - #endif - - failsWithErrorMessage(expectedErrorMessage) { - expect(actual).to(equal(unexpected)) - } - } - - func testNSObjectEquality() { - expect(NSNumber(value:1)).to(equal(NSNumber(value:1))) - expect(NSNumber(value:1)) == NSNumber(value:1) - expect(NSNumber(value:1)) != NSNumber(value:2) - expect { NSNumber(value:1) }.to(equal(1)) - } - - func testOperatorEquality() { - expect("foo") == "foo" - expect("foo") != "bar" - - failsWithErrorMessage("expected to equal , got ") { - expect("hello") == "world" - return - } - failsWithErrorMessage("expected to not equal , got ") { - expect("hello") != "hello" - return - } - } - - func testOperatorEqualityWithArrays() { - let array1: Array = [1, 2, 3] - let array2: Array = [1, 2, 3] - let array3: Array = [1, 2] - expect(array1) == array2 - expect(array1) != array3 - } - - func testOperatorEqualityWithDictionaries() { - let dict1 = ["foo": "bar"] - let dict2 = ["foo": "bar"] - let dict3 = ["foo": "baz"] - expect(dict1) == dict2 - expect(dict1) != dict3 - } - - func testOptionalEquality() { - expect(1 as CInt?).to(equal(1)) - expect(1 as CInt?).to(equal(1 as CInt?)) - - expect(1).toNot(equal(nil)) - } - - func testArrayOfOptionalsEquality() { - let array1: Array = [1, nil, 3] - let array2: Array = [nil, 2, 3] - let array3: Array = [1, nil, 3] - - expect(array1).toNot(equal(array2)) - expect(array1).to(equal(array3)) - expect(array2).toNot(equal(array3)) - - let allNils1: Array = [nil, nil, nil, nil] - let allNils2: Array = [nil, nil, nil, nil] - let notReallyAllNils: Array = [nil, nil, nil, "turtles"] - - expect(allNils1).to(equal(allNils2)) - expect(allNils1).toNot(equal(notReallyAllNils)) - - let noNils1: Array = [1, 2, 3, 4, 5] - let noNils2: Array = [1, 3, 5, 7, 9] - - expect(noNils1).toNot(equal(noNils2)) - - failsWithErrorMessage("expected to equal <[Optional(1), nil]>, got <[nil, Optional(2)]>") { - let arrayOfOptionalInts: Array = [nil, 2] - let anotherArrayOfOptionalInts: Array = [1, nil] - expect(arrayOfOptionalInts).to(equal(anotherArrayOfOptionalInts)) - return - } - } - - func testDictionariesWithDifferentSequences() { - // see: https://github.com/Quick/Nimble/issues/61 - // these dictionaries generate different orderings of sequences. - let result = ["how":1, "think":1, "didnt":2, "because":1, - "interesting":1, "always":1, "right":1, "such":1, - "to":3, "say":1, "cool":1, "you":1, - "weather":3, "be":1, "went":1, "was":2, - "sometimes":1, "and":3, "mind":1, "rain":1, - "whole":1, "everything":1, "weather.":1, "down":1, - "kind":1, "mood.":1, "it":2, "everyday":1, "might":1, - "more":1, "have":2, "person":1, "could":1, "tenth":2, - "night":1, "write":1, "Youd":1, "affects":1, "of":3, - "Who":1, "us":1, "an":1, "I":4, "my":1, "much":2, - "wrong.":1, "peacefully.":1, "amazing":3, "would":4, - "just":1, "grade.":1, "Its":2, "The":2, "had":1, "that":1, - "the":5, "best":1, "but":1, "essay":1, "for":1, "summer":2, - "your":1, "grade":1, "vary":1, "pretty":1, "at":1, "rain.":1, - "about":1, "allow":1, "thought":1, "in":1, "sleep":1, "a":1, - "hot":1, "really":1, "beach":1, "life.":1, "we":1, "although":1] - - let storyCount = ["The":2, "summer":2, "of":3, "tenth":2, "grade":1, - "was":2, "the":5, "best":1, "my":1, "life.":1, "I":4, - "went":1, "to":3, "beach":1, "everyday":1, "and":3, - "we":1, "had":1, "amazing":3, "weather.":1, "weather":3, - "didnt":2, "really":1, "vary":1, "much":2, "always":1, - "pretty":1, "hot":1, "although":1, "sometimes":1, "at":1, - "night":1, "it":2, "would":4, "rain.":1, "mind":1, "rain":1, - "because":1, "cool":1, "everything":1, "down":1, "allow":1, - "us":1, "sleep":1, "peacefully.":1, "Its":2, "how":1, - "affects":1, "your":1, "mood.":1, "Who":1, "have":2, - "thought":1, "that":1, "could":1, "write":1, "a":1, - "whole":1, "essay":1, "just":1, "about":1, "in":1, - "grade.":1, "kind":1, "right":1, "Youd":1, "think":1, - "for":1, "such":1, "an":1, "interesting":1, "person":1, - "might":1, "more":1, "say":1, "but":1, "you":1, "be":1, "wrong.":1] - - expect(result).to(equal(storyCount)) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift deleted file mode 100644 index de5033d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble - -final class HaveCountTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (HaveCountTest) -> () throws -> Void)] { - return [ - ("testHaveCountForArray", testHaveCountForArray), - ("testHaveCountForDictionary", testHaveCountForDictionary), - ("testHaveCountForSet", testHaveCountForSet), - ] - } - - func testHaveCountForArray() { - expect([1, 2, 3]).to(haveCount(3)) - expect([1, 2, 3]).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Array with count 1, got 3\nActual Value: [1, 2, 3]") { - expect([1, 2, 3]).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Array with count 3, got 3\nActual Value: [1, 2, 3]") { - expect([1, 2, 3]).notTo(haveCount(3)) - } - } - - func testHaveCountForDictionary() { - let dictionary = ["1":1, "2":2, "3":3] - expect(dictionary).to(haveCount(3)) - expect(dictionary).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Dictionary with count 1, got 3\nActual Value: \(stringify(dictionary))") { - expect(dictionary).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Dictionary with count 3, got 3" + - "\nActual Value: \(stringify(dictionary))") { - expect(dictionary).notTo(haveCount(3)) - } - } - - func testHaveCountForSet() { - let set = Set([1, 2, 3]) - expect(set).to(haveCount(3)) - expect(set).notTo(haveCount(1)) - - failsWithErrorMessage("expected to have Set with count 1, got 3" + - "\nActual Value: \(stringify(set))") { - expect(set).to(haveCount(1)) - } - - failsWithErrorMessage("expected to not have Set with count 3, got 3" + - "\nActual Value: \(stringify(set))") { - expect(set).notTo(haveCount(3)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift deleted file mode 100644 index 940a214..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift +++ /dev/null @@ -1,83 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class MatchErrorTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (MatchErrorTest) -> () throws -> Void)] { - return [ - ("testMatchErrorPositive", testMatchErrorPositive), - ("testMatchErrorNegative", testMatchErrorNegative), - ("testMatchNSErrorPositive", testMatchNSErrorPositive), - ("testMatchNSErrorNegative", testMatchNSErrorNegative), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testDoesNotMatchNils", testDoesNotMatchNils), - ] - } - - func testMatchErrorPositive() { - expect(NimbleError.laugh).to(matchError(NimbleError.laugh)) - expect(NimbleError.laugh).to(matchError(NimbleError.self)) - expect(EquatableError.parameterized(x: 1)).to(matchError(EquatableError.parameterized(x: 1))) - - expect(NimbleError.laugh as Error).to(matchError(NimbleError.laugh)) - } - - func testMatchErrorNegative() { - expect(NimbleError.laugh).toNot(matchError(NimbleError.cry)) - expect(NimbleError.laugh as Error).toNot(matchError(NimbleError.cry)) - expect(NimbleError.laugh).toNot(matchError(EquatableError.self)) - } - - func testMatchNSErrorPositive() { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 0, userInfo: nil) - - expect(error1).to(matchError(error2)) - } - - func testMatchNSErrorNegative() { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 1, userInfo: nil) - - expect(error1).toNot(matchError(error2)) - } - - func testMatchPositiveMessage() { - failsWithErrorMessage("expected to match error , got ") { - expect(EquatableError.parameterized(x: 1)).to(matchError(EquatableError.parameterized(x: 2))) - } - failsWithErrorMessage("expected to match error , got ") { - expect(NimbleError.laugh).to(matchError(NimbleError.cry)) - } - failsWithErrorMessage("expected to match error , got ") { - expect(CustomDebugStringConvertibleError.a).to(matchError(CustomDebugStringConvertibleError.b)) - } - - failsWithErrorMessage("expected to match error , got ") { - let error1 = NSError(domain: "err", code: 0, userInfo: nil) - let error2 = NSError(domain: "err", code: 1, userInfo: nil) - expect(error1).to(matchError(error2)) - } - } - - func testMatchNegativeMessage() { - failsWithErrorMessage("expected to not match error , got ") { - expect(NimbleError.laugh).toNot(matchError(NimbleError.laugh)) - } - - failsWithErrorMessage("expected to match error from type , got ") { - expect(NimbleError.laugh).to(matchError(EquatableError.self)) - } - } - - func testDoesNotMatchNils() { - failsWithErrorMessageForNil("expected to match error , got no error") { - expect(nil as Error?).to(matchError(NimbleError.laugh)) - } - - failsWithErrorMessageForNil("expected to not match error , got no error") { - expect(nil as Error?).toNot(matchError(NimbleError.laugh)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift deleted file mode 100644 index 5b6d77f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift +++ /dev/null @@ -1,46 +0,0 @@ -import XCTest -import Nimble - -final class MatchTest:XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (MatchTest) -> () throws -> Void)] { - return [ - ("testMatchPositive", testMatchPositive), - ("testMatchNegative", testMatchNegative), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testMatchNils", testMatchNils), - ] - } - - func testMatchPositive() { - expect("11:14").to(match("\\d{2}:\\d{2}")) - } - - func testMatchNegative() { - expect("hello").toNot(match("\\d{2}:\\d{2}")) - } - - func testMatchPositiveMessage() { - let message = "expected to match <\\d{2}:\\d{2}>, got " - failsWithErrorMessage(message) { - expect("hello").to(match("\\d{2}:\\d{2}")) - } - } - - func testMatchNegativeMessage() { - let message = "expected to not match <\\d{2}:\\d{2}>, got <11:14>" - failsWithErrorMessage(message) { - expect("11:14").toNot(match("\\d{2}:\\d{2}")) - } - } - - func testMatchNils() { - failsWithErrorMessageForNil("expected to match <\\d{2}:\\d{2}>, got ") { - expect(nil as String?).to(match("\\d{2}:\\d{2}")) - } - - failsWithErrorMessageForNil("expected to not match <\\d{2}:\\d{2}>, got ") { - expect(nil as String?).toNot(match("\\d{2}:\\d{2}")) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift deleted file mode 100644 index 33b2ff0..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift +++ /dev/null @@ -1,91 +0,0 @@ -import XCTest -import Nimble -import Foundation - -final class PostNotificationTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (PostNotificationTest) -> () throws -> Void)] { - return [ - ("testPassesWhenNoNotificationsArePosted", testPassesWhenNoNotificationsArePosted), - ("testPassesWhenExpectedNotificationIsPosted", testPassesWhenExpectedNotificationIsPosted), - ("testPassesWhenAllExpectedNotificationsArePosted", testPassesWhenAllExpectedNotificationsArePosted), - ("testFailsWhenNoNotificationsArePosted", testFailsWhenNoNotificationsArePosted), - ("testFailsWhenNotificationWithWrongNameIsPosted", testFailsWhenNotificationWithWrongNameIsPosted), - ("testFailsWhenNotificationWithWrongObjectIsPosted", testFailsWhenNotificationWithWrongObjectIsPosted), - ("testPassesWhenExpectedNotificationEventuallyIsPosted", testPassesWhenExpectedNotificationEventuallyIsPosted), - ] - } - - let notificationCenter = NotificationCenter() - - func testPassesWhenNoNotificationsArePosted() { - expect { - // no notifications here! - return nil - }.to(postNotifications(beEmpty(), fromNotificationCenter: notificationCenter)) - } - - func testPassesWhenExpectedNotificationIsPosted() { - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - expect { - self.notificationCenter.post(testNotification) - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) - } - - func testPassesWhenAllExpectedNotificationsArePosted() { - let foo = NSNumber(value: 1) - let bar = NSNumber(value: 2) - let n1 = Notification(name: Notification.Name("Foo"), object: foo) - let n2 = Notification(name: Notification.Name("Bar"), object: bar) - expect { - self.notificationCenter.post(n1) - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1, n2]), fromNotificationCenter: notificationCenter)) - } - - func testFailsWhenNoNotificationsArePosted() { - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - failsWithErrorMessage("expected to equal <[\(testNotification)]>, got no notifications") { - expect { - // no notifications here! - return nil - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testFailsWhenNotificationWithWrongNameIsPosted() { - let n1 = Notification(name: Notification.Name("Foo"), object: nil) - let n2 = Notification(name: Notification.Name(n1.name.rawValue + "a"), object: nil) - failsWithErrorMessage("expected to equal <[\(n1)]>, got <[\(n2)]>") { - expect { - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testFailsWhenNotificationWithWrongObjectIsPosted() { - let n1 = Notification(name: Notification.Name("Foo"), object: nil) - let n2 = Notification(name: n1.name, object: NSObject()) - failsWithErrorMessage("expected to equal <[\(n1)]>, got <[\(n2)]>") { - expect { - self.notificationCenter.post(n2) - return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) - } - } - - func testPassesWhenExpectedNotificationEventuallyIsPosted() { - #if _runtime(_ObjC) - let testNotification = Notification(name: Notification.Name("Foo"), object: nil) - expect { - deferToMainQueue { - self.notificationCenter.post(testNotification) - } - return nil - }.toEventually(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) - #else - print("\(#function) is missing because toEventually is not implement on this platform") - #endif - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift deleted file mode 100644 index 302a2f5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift +++ /dev/null @@ -1,166 +0,0 @@ -import XCTest -import Nimble - -#if _runtime(_ObjC) && !SWIFT_PACKAGE - -final class RaisesExceptionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (RaisesExceptionTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testPositiveMatchesWithClosures", testPositiveMatchesWithClosures), - ("testNegativeMatches", testNegativeMatches), - ("testNegativeMatchesDoNotCallClosureWithoutException", testNegativeMatchesDoNotCallClosureWithoutException), - ("testNegativeMatchesWithClosure", testNegativeMatchesWithClosure), - ] - } - - var anException = NSException(name: NSExceptionName("laugh"), reason: "Lulz", userInfo: ["key": "value"]) - - func testPositiveMatches() { - expect { self.anException.raise() }.to(raiseException()) - expect { self.anException.raise() }.to(raiseException(named: "laugh")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) - } - - func testPositiveMatchesWithClosures() { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName("laugh"))) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("lau")) - }) - - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("as")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("df")) - }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).toNot(beginWith("as")) - }) - } - - func testNegativeMatches() { - failsWithErrorMessage("expected to raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "foo")) - } - - failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "bar")) - } - - failsWithErrorMessage( - "expected to raise exception with name with reason with userInfo <{k = v;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["k": "v"])) - } - - failsWithErrorMessage("expected to raise any exception, got no exception") { - expect { self.anException }.to(raiseException()) - } - failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) - } - failsWithErrorMessage("expected to raise exception with name with reason , got no exception") { - expect { self.anException }.to(raiseException(named: "laugh", reason: "Lulz")) - } - - failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "bar", reason: "Lulz")) - } - failsWithErrorMessage("expected to not raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh")) - } - failsWithErrorMessage("expected to not raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz")) - } - - failsWithErrorMessage("expected to not raise exception with name with reason with userInfo <{key = value;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) - } - } - - func testNegativeMatchesDoNotCallClosureWithoutException() { - failsWithErrorMessage("expected to raise exception that satisfies block, got no exception") { - expect { self.anException }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName(rawValue:"foo"))) - }) - } - - failsWithErrorMessage("expected to raise exception with name that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo") { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to raise exception with name with reason that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "ha") { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to raise exception with name with reason with userInfo <{}> that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "Lulz", userInfo: [:]) { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) - } - } - - func testNegativeMatchesWithClosure() { - failsWithErrorMessage("expected to raise exception that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in - expect(exception.name.rawValue).to(equal("foo")) - }) - } - - let innerFailureMessage = "expected to begin with , got " - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "wrong") { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{key = value;}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - - failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "Lulz", userInfo: [:]) { (exception: NSException) in - expect(exception.name.rawValue).to(beginWith("fo")) - }) - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift deleted file mode 100644 index 9378956..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift +++ /dev/null @@ -1,56 +0,0 @@ -import XCTest -import Nimble -import Foundation - -final class SatisfyAnyOfTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SatisfyAnyOfTest) -> () throws -> Void)] { - return [ - ("testSatisfyAnyOf", testSatisfyAnyOf), - ("testOperatorOr", testOperatorOr), - ] - } - - func testSatisfyAnyOf() { - expect(2).to(satisfyAnyOf(equal(2), equal(3))) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(satisfyAnyOf(equal(3), equal("turtles"))) -#else - expect(2 as NSNumber).toNot(satisfyAnyOf(equal(3 as NSNumber), equal("turtles" as NSString))) -#endif - expect([1,2,3]).to(satisfyAnyOf(equal([1,2,3]), allPass({$0 < 4}), haveCount(3))) - expect("turtle").toNot(satisfyAnyOf(contain("a"), endWith("magic"))) - expect(82.0).toNot(satisfyAnyOf(beLessThan(10.5), beGreaterThan(100.75), beCloseTo(50.1))) - expect(false).to(satisfyAnyOf(beTrue(), beFalse())) - expect(true).to(satisfyAnyOf(beTruthy(), beFalsy())) - - failsWithErrorMessage( - "expected to match one of: {equal <3>}, or {equal <4>}, or {equal <5>}, got 2") { - expect(2).to(satisfyAnyOf(equal(3), equal(4), equal(5))) - } - failsWithErrorMessage( - "expected to match one of: {all be less than 4, but failed first at element <5> in <[5, 6, 7]>}, or {equal <[1, 2, 3, 4]>}, got [5, 6, 7]") { - expect([5,6,7]).to(satisfyAnyOf(allPass("be less than 4", {$0 < 4}), equal([1,2,3,4]))) - } - failsWithErrorMessage( - "expected to match one of: {be true}, got false") { - expect(false).to(satisfyAnyOf(beTrue())) - } - failsWithErrorMessage( - "expected to not match one of: {be less than <10.5>}, or {be greater than <100.75>}, or {be close to <50.1> (within 0.0001)}, got 50.10001") { - expect(50.10001).toNot(satisfyAnyOf(beLessThan(10.5), beGreaterThan(100.75), beCloseTo(50.1))) - } - } - - func testOperatorOr() { - expect(2).to(equal(2) || equal(3)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(equal(3) || equal("turtles")) -#else - expect(2 as NSNumber).toNot(equal(3 as NSNumber) || equal("turtles" as NSString)) -#endif - expect("turtle").toNot(contain("a") || endWith("magic")) - expect(82.0).toNot(beLessThan(10.5) || beGreaterThan(100.75)) - expect(false).to(beTrue() || beFalse()) - expect(true).to(beTruthy() || beFalsy()) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift deleted file mode 100644 index c227b1b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift +++ /dev/null @@ -1,62 +0,0 @@ -import Foundation -import XCTest -import Nimble - -#if _runtime(_ObjC) && !SWIFT_PACKAGE - -final class ThrowAssertionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ThrowAssertionTest) -> () throws -> Void)] { - return [ - ("testPositiveMatch", testPositiveMatch), - ("testErrorThrown", testErrorThrown), - ("testPostAssertionCodeNotRun", testPostAssertionCodeNotRun), - ("testNegativeMatch", testNegativeMatch), - ("testPositiveMessage", testPositiveMessage), - ("testNegativeMessage", testNegativeMessage), - ] - } - - func testPositiveMatch() { - expect { () -> Void in fatalError() }.to(throwAssertion()) - } - - func testErrorThrown() { - expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion()) - } - - func testPostAssertionCodeNotRun() { - var reachedPoint1 = false - var reachedPoint2 = false - - expect { - reachedPoint1 = true - precondition(false, "condition message") - reachedPoint2 = true - }.to(throwAssertion()) - - expect(reachedPoint1) == true - expect(reachedPoint2) == false - } - - func testNegativeMatch() { - var reachedPoint1 = false - - expect { reachedPoint1 = true }.toNot(throwAssertion()) - - expect(reachedPoint1) == true - } - - func testPositiveMessage() { - failsWithErrorMessage("expected to throw an assertion") { - expect { () -> Void? in return }.to(throwAssertion()) - } - } - - func testNegativeMessage() { - failsWithErrorMessage("expected to not throw an assertion") { - expect { () -> Void in fatalError() }.toNot(throwAssertion()) - } - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift deleted file mode 100644 index d7cd312..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift +++ /dev/null @@ -1,154 +0,0 @@ -import XCTest -import Nimble - -enum NimbleError : Error { - case laugh - case cry -} - -enum EquatableError : Error { - case parameterized(x: Int) -} - -extension EquatableError : Equatable { -} - -func ==(lhs: EquatableError, rhs: EquatableError) -> Bool { - switch (lhs, rhs) { - case (.parameterized(let l), .parameterized(let r)): - return l == r - } -} - -enum CustomDebugStringConvertibleError : Error { - case a - case b -} - -extension CustomDebugStringConvertibleError : CustomDebugStringConvertible { - var debugDescription : String { - return "code=\(_code)" - } -} - -final class ThrowErrorTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ThrowErrorTest) -> () throws -> Void)] { - return [ - ("testPositiveMatches", testPositiveMatches), - ("testPositiveMatchesWithClosures", testPositiveMatchesWithClosures), - ("testNegativeMatches", testNegativeMatches), - ("testPositiveNegatedMatches", testPositiveNegatedMatches), - ("testNegativeNegatedMatches", testNegativeNegatedMatches), - ("testNegativeMatchesDoNotCallClosureWithoutError", testNegativeMatchesDoNotCallClosureWithoutError), - ("testNegativeMatchesWithClosure", testNegativeMatchesWithClosure), - ] - } - - func testPositiveMatches() { - expect { throw NimbleError.laugh }.to(throwError()) - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh)) - expect { throw NimbleError.laugh }.to(throwError(errorType: NimbleError.self)) - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 1))) - } - - func testPositiveMatchesWithClosures() { - // Generic typed closure - expect { throw EquatableError.parameterized(x: 42) }.to(throwError { error in - guard case EquatableError.parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Explicit typed closure - expect { throw EquatableError.parameterized(x: 42) }.to(throwError { (error: EquatableError) in - guard case .parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Typed closure over errorType argument - expect { throw EquatableError.parameterized(x: 42) }.to(throwError(errorType: EquatableError.self) { error in - guard case .parameterized(let x) = error else { fail(); return } - expect(x) >= 1 - }) - // Typed closure over error argument - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh) { (error: Error) in - expect(error._domain).to(beginWith("Nim")) - }) - // Typed closure over error argument - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh) { (error: Error) in - expect(error._domain).toNot(beginWith("as")) - }) - } - - func testNegativeMatches() { - // Same case, different arguments - failsWithErrorMessage("expected to throw error , got ") { - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 2))) - } - // Same case, different arguments - failsWithErrorMessage("expected to throw error , got ") { - expect { throw EquatableError.parameterized(x: 1) }.to(throwError(EquatableError.parameterized(x: 2))) - } - // Different case - failsWithErrorMessage("expected to throw error , got ") { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.cry)) - } - // Different case with closure - failsWithErrorMessage("expected to throw error that satisfies block, got ") { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.cry) { _ in return }) - } - // Different case, implementing CustomDebugStringConvertible - failsWithErrorMessage("expected to throw error , got ") { - expect { throw CustomDebugStringConvertibleError.a }.to(throwError(CustomDebugStringConvertibleError.b)) - } - } - - func testPositiveNegatedMatches() { - // No error at all - expect { return }.toNot(throwError()) - // Different case - expect { throw NimbleError.laugh }.toNot(throwError(NimbleError.cry)) - } - - func testNegativeNegatedMatches() { - // No error at all - failsWithErrorMessage("expected to not throw any error, got ") { - expect { throw NimbleError.laugh }.toNot(throwError()) - } - // Different error - failsWithErrorMessage("expected to not throw error , got ") { - expect { throw NimbleError.laugh }.toNot(throwError(NimbleError.laugh)) - } - } - - func testNegativeMatchesDoNotCallClosureWithoutError() { - failsWithErrorMessage("expected to throw error that satisfies block, got no error") { - expect { return }.to(throwError { error in - fail() - }) - } - - failsWithErrorMessage("expected to throw error that satisfies block, got no error") { - expect { return }.to(throwError(NimbleError.laugh) { error in - fail() - }) - } - } - - func testNegativeMatchesWithClosure() { - let moduleName = "NimbleTests" - let innerFailureMessage = "expected to equal , got <\(moduleName).NimbleError>" - let closure = { (error: Error) in - expect(error._domain).to(equal("foo")) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(closure: closure)) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error from type that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(errorType: NimbleError.self, closure: closure)) - } - - failsWithErrorMessage([innerFailureMessage, "expected to throw error that satisfies block, got "]) { - expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh, closure: closure)) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTests.swift deleted file mode 100644 index 6234932..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTests.swift +++ /dev/null @@ -1,129 +0,0 @@ -import Foundation -import XCTest -import Nimble - -final class SynchronousTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SynchronousTest) -> () throws -> Void)] { - return [ - ("testFailAlwaysFails", testFailAlwaysFails), - ("testUnexpectedErrorsThrownFails", testUnexpectedErrorsThrownFails), - ("testToMatchesIfMatcherReturnsTrue", testToMatchesIfMatcherReturnsTrue), - ("testToProvidesActualValueExpression", testToProvidesActualValueExpression), - ("testToProvidesAMemoizedActualValueExpression", testToProvidesActualValueExpression), - ("testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testToMatchAgainstLazyProperties", testToMatchAgainstLazyProperties), - ("testToNotMatchesIfMatcherReturnsTrue", testToNotMatchesIfMatcherReturnsTrue), - ("testToNotProvidesActualValueExpression", testToNotProvidesActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpression", testToNotProvidesAMemoizedActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testToNotNegativeMatches", testToNotNegativeMatches), - ("testNotToMatchesLikeToNot", testNotToMatchesLikeToNot), - ] - } - - class Error: Swift.Error {} - let errorToThrow = Error() - - private func doThrowError() throws -> Int { - throw errorToThrow - } - - func testFailAlwaysFails() { - failsWithErrorMessage("My error message") { - fail("My error message") - } - failsWithErrorMessage("fail() always fails") { - fail() - } - } - - func testUnexpectedErrorsThrownFails() { - failsWithErrorMessage("expected to equal <1>, got an unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.to(equal(1)) - } - failsWithErrorMessage("expected to not equal <1>, got an unexpected error thrown: <\(errorToThrow)>") { - expect { try self.doThrowError() }.toNot(equal(1)) - } - } - - func testToMatchesIfMatcherReturnsTrue() { - expect(1).to(MatcherFunc { expr, failure in true }) - expect{1}.to(MatcherFunc { expr, failure in true }) - } - - func testToProvidesActualValueExpression() { - var value: Int? - expect(1).to(MatcherFunc { expr, failure in value = try expr.evaluate(); return true }) - expect(value).to(equal(1)) - } - - func testToProvidesAMemoizedActualValueExpression() { - var callCount = 0 - expect{ callCount += 1 }.to(MatcherFunc { expr, failure in - _ = try expr.evaluate() - _ = try expr.evaluate() - return true - }) - expect(callCount).to(equal(1)) - } - - func testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { - var callCount = 0 - expect{ callCount += 1 }.to(MatcherFunc { expr, failure in - expect(callCount).to(equal(0)) - _ = try expr.evaluate() - return true - }) - expect(callCount).to(equal(1)) - } - - func testToMatchAgainstLazyProperties() { - expect(ObjectWithLazyProperty().value).to(equal("hello")) - expect(ObjectWithLazyProperty().value).toNot(equal("world")) - expect(ObjectWithLazyProperty().anotherValue).to(equal("world")) - expect(ObjectWithLazyProperty().anotherValue).toNot(equal("hello")) - } - - // repeated tests from to() for toNot() - func testToNotMatchesIfMatcherReturnsTrue() { - expect(1).toNot(MatcherFunc { expr, failure in false }) - expect{1}.toNot(MatcherFunc { expr, failure in false }) - } - - func testToNotProvidesActualValueExpression() { - var value: Int? - expect(1).toNot(MatcherFunc { expr, failure in value = try expr.evaluate(); return false }) - expect(value).to(equal(1)) - } - - func testToNotProvidesAMemoizedActualValueExpression() { - var callCount = 0 - expect{ callCount += 1 }.toNot(MatcherFunc { expr, failure in - _ = try expr.evaluate() - _ = try expr.evaluate() - return false - }) - expect(callCount).to(equal(1)) - } - - func testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { - var callCount = 0 - expect{ callCount += 1 }.toNot(MatcherFunc { expr, failure in - expect(callCount).to(equal(0)) - _ = try expr.evaluate() - return false - }) - expect(callCount).to(equal(1)) - } - - func testToNotNegativeMatches() { - failsWithErrorMessage("expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { expr, failure in true }) - } - } - - - func testNotToMatchesLikeToNot() { - expect(1).notTo(MatcherFunc { expr, failure in false }) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift deleted file mode 100644 index e22d64e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift +++ /dev/null @@ -1,64 +0,0 @@ -import XCTest -import Nimble - -final class UserDescriptionTest: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (UserDescriptionTest) -> () throws -> Void)] { - return [ - ("testToMatcher_CustomFailureMessage", testToMatcher_CustomFailureMessage), - ("testNotToMatcher_CustomFailureMessage", testNotToMatcher_CustomFailureMessage), - ("testToNotMatcher_CustomFailureMessage", testToNotMatcher_CustomFailureMessage), - ("testToEventuallyMatch_CustomFailureMessage", testToEventuallyMatch_CustomFailureMessage), - ("testToEventuallyNotMatch_CustomFailureMessage", testToEventuallyNotMatch_CustomFailureMessage), - ("testToNotEventuallyMatch_CustomFailureMessage", testToNotEventuallyMatch_CustomFailureMessage), - ] - } - - func testToMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to match, got <1>") { - expect(1).to(MatcherFunc { expr, failure in false }, description: "These aren't equal!") - } - } - - func testNotToMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to not match, got <1>") { - expect(1).notTo(MatcherFunc { expr, failure in true }, description: "These aren't equal!") - } - } - - func testToNotMatcher_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't equal!\n" + - "expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { expr, failure in true }, description: "These aren't equal!") - } - } - - func testToEventuallyMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These aren't eventually equal!\n" + - "expected to eventually equal <1>, got <0>") { - expect { 0 }.toEventually(equal(1), description: "These aren't eventually equal!") - } - } - - func testToEventuallyNotMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These are eventually equal!\n" + - "expected to eventually not equal <1>, got <1>") { - expect { 1 }.toEventuallyNot(equal(1), description: "These are eventually equal!") - } - } - - func testToNotEventuallyMatch_CustomFailureMessage() { - failsWithErrorMessage( - "These are eventually equal!\n" + - "expected to eventually not equal <1>, got <1>") { - expect { 1 }.toEventuallyNot(equal(1), description: "These are eventually equal!") - } - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h deleted file mode 100644 index 282993d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/NimbleSpecHelper.h +++ /dev/null @@ -1,15 +0,0 @@ -@import Nimble; -#import "NimbleTests-Swift.h" - -// Use this when you want to verify the failure message for when an expectation fails -#define expectFailureMessage(MSG, BLOCK) \ -[NimbleHelper expectFailureMessage:(MSG) block:(BLOCK) file:@(__FILE__) line:__LINE__]; - -#define expectFailureMessages(MSGS, BLOCK) \ -[NimbleHelper expectFailureMessages:(MSGS) block:(BLOCK) file:@(__FILE__) line:__LINE__]; - - -// Use this when you want to verify the failure message with the nil message postfixed -// to it: " (use beNil() to match nils)" -#define expectNilFailureMessage(MSG, BLOCK) \ -[NimbleHelper expectFailureMessageForNil:(MSG) block:(BLOCK) file:@(__FILE__) line:__LINE__]; diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m deleted file mode 100644 index 1146920..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAllPassTest.m +++ /dev/null @@ -1,38 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCAllPassTest : XCTestCase - -@end - -@implementation ObjCAllPassTest - -- (void)testPositiveMatches { - expect(@[@1, @2, @3,@4]).to(allPass(beLessThan(@5))); - expect(@[@1, @2, @3,@4]).toNot(allPass(beGreaterThan(@5))); - - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).to(allPass(beLessThan(@5))); - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).toNot(allPass(beGreaterThan(@5))); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to all be less than <3>, but failed first at element" - " <3> in <[1, 2, 3, 4]>", ^{ - expect(@[@1, @2, @3,@4]).to(allPass(beLessThan(@3))); - }); - expectFailureMessage(@"expected to not all be less than <5>", ^{ - expect(@[@1, @2, @3,@4]).toNot(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"expected to not all be less than <5>", ^{ - expect([NSSet setWithArray:@[@1, @2, @3,@4]]).toNot(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"allPass only works with NSFastEnumeration" - " (NSArray, NSSet, ...) of NSObjects, got <3>", ^{ - expect(@3).to(allPass(beLessThan(@5))); - }); - expectFailureMessage(@"allPass only works with NSFastEnumeration" - " (NSArray, NSSet, ...) of NSObjects, got <3>", ^{ - expect(@3).toNot(allPass(beLessThan(@5))); - }); -} -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m deleted file mode 100644 index f052e74..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCAsyncTest.m +++ /dev/null @@ -1,55 +0,0 @@ -#import -#import -#import "NimbleSpecHelper.h" - -@interface ObjCAsyncTest : XCTestCase - -@end - -@implementation ObjCAsyncTest - -- (void)testAsync { - __block id obj = @1; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - obj = nil; - }); - expect(obj).toEventually(beNil()); -} - - -- (void)testAsyncWithCustomTimeout { - __block id obj = nil; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - obj = @1; - }); - expect(obj).withTimeout(5).toEventuallyNot(beNil()); -} - -- (void)testAsyncCallback { - waitUntil(^(void (^done)(void)){ - done(); - }); - - expectFailureMessage(@"Waited more than 1.0 second", ^{ - waitUntil(^(void (^done)(void)){ /* ... */ }); - }); - - expectFailureMessage(@"Waited more than 0.01 seconds", ^{ - waitUntilTimeout(0.01, ^(void (^done)(void)){ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [NSThread sleepForTimeInterval:0.1]; - done(); - }); - }); - }); - - expectFailureMessage(@"expected to equal , got ", ^{ - waitUntil(^(void (^done)(void)){ - [NSThread sleepForTimeInterval:0.1]; - expect(@"hello").to(equal(@"goodbye")); - done(); - }); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m deleted file mode 100644 index f5fca2d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeAnInstanceOfTest.m +++ /dev/null @@ -1,34 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeAnInstanceOfTest : XCTestCase -@end - -@implementation ObjCBeAnInstanceOfTest - -- (void)testPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(beAnInstanceOf([NSNull class])); - expect(@1).toNot(beAnInstanceOf([NSNull class])); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be an instance of NSNull, got <__NSCFNumber instance>", ^{ - expect(@1).to(beAnInstanceOf([NSNull class])); - }); - expectFailureMessage(@"expected to not be an instance of NSNull, got ", ^{ - expect([NSNull null]).toNot(beAnInstanceOf([NSNull class])); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be an instance of NSNull, got ", ^{ - expect(nil).to(beAnInstanceOf([NSNull class])); - }); - - expectNilFailureMessage(@"expected to not be an instance of NSNull, got ", ^{ - expect(nil).toNot(beAnInstanceOf([NSNull class])); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m deleted file mode 100644 index c33d643..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeCloseToTest.m +++ /dev/null @@ -1,47 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeCloseToTest : XCTestCase - -@end - -@implementation ObjCBeCloseToTest - -- (void)testPositiveMatches { - expect(@1.2).to(beCloseTo(@1.2001)); - expect(@1.2).to(beCloseTo(@2).within(10)); - expect(@2).toNot(beCloseTo(@1)); - expect(@1.00001).toNot(beCloseTo(@1).within(0.00000001)); - - expect(1.2).to(beCloseTo(1.2001)); - expect(1.2).to(beCloseTo(2).within(10)); - expect(2).toNot(beCloseTo(1)); - expect(1.00001).toNot(beCloseTo(1).within(0.00000001)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be close to <0> (within 0.001), got <1>", ^{ - expect(@1).to(beCloseTo(@0)); - }); - expectFailureMessage(@"expected to not be close to <0> (within 0.001), got <0.0001>", ^{ - expect(@(0.0001)).toNot(beCloseTo(@0)); - }); - expectFailureMessage(@"expected to be close to <0> (within 0.001), got <1>", ^{ - expect(1).to(beCloseTo(0)); - }); - expectFailureMessage(@"expected to not be close to <0> (within 0.001), got <0.0001>", ^{ - expect(0.0001).toNot(beCloseTo(0)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be close to <0> (within 0.001), got ", ^{ - expect(nil).to(beCloseTo(@0)); - }); - expectNilFailureMessage(@"expected to not be close to <0> (within 0.001), got ", ^{ - expect(nil).toNot(beCloseTo(@0)); - }); -} - - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m deleted file mode 100644 index 723d642..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeEmptyTest.m +++ /dev/null @@ -1,89 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeEmptyTest : XCTestCase -@end - -@implementation ObjCBeEmptyTest - -- (void)testPositiveMatches { - expect(@[]).to(beEmpty()); - expect(@"").to(beEmpty()); - expect(@{}).to(beEmpty()); - expect([NSSet set]).to(beEmpty()); - expect([NSIndexSet indexSet]).to(beEmpty()); - expect([NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]).to(beEmpty()); - - expect(@[@1, @2]).toNot(beEmpty()); - expect(@"a").toNot(beEmpty()); - expect(@{@"key": @"value"}).toNot(beEmpty()); - expect([NSSet setWithObject:@1]).toNot(beEmpty()); - expect([NSIndexSet indexSetWithIndex:1]).toNot(beEmpty()); - - NSHashTable *table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - expect(table).toNot(beEmpty()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be empty, got ", ^{ - expect(@"foo").to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <(1)>", ^{ - expect(@[@1]).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <{key = value;}>", ^{ - expect(@{@"key": @"value"}).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <{(1)}>", ^{ - expect([NSSet setWithObject:@1]).to(beEmpty()); - }); - expectFailureMessage(@"expected to be empty, got <(1)>", ^{ - expect([NSIndexSet indexSetWithIndex:1]).to(beEmpty()); - }); - NSHashTable *table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - NSString *tableString = [[table description] stringByReplacingOccurrencesOfString:@"\n" withString:@""]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be empty, got <%@>", tableString]), ^{ - expect(table).to(beEmpty()); - }); - - expectFailureMessage(@"expected to not be empty, got <>", ^{ - expect(@"").toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <()>", ^{ - expect(@[]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <{}>", ^{ - expect(@{}).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <{(1)}>", ^{ - expect([NSSet setWithObject:@1]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got <(1)>", ^{ - expect([NSIndexSet indexSetWithIndex:1]).toNot(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty, got ", ^{ - expect([NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]).toNot(beEmpty()); - }); -} - -- (void)testItDoesNotMatchNil { - expectNilFailureMessage(@"expected to be empty, got ", ^{ - expect(nil).to(beEmpty()); - }); - expectNilFailureMessage(@"expected to not be empty, got ", ^{ - expect(nil).toNot(beEmpty()); - }); -} - -- (void)testItReportsTypesItMatchesAgainst { - expectFailureMessage(@"expected to be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings), got __NSCFNumber type", ^{ - expect(@1).to(beEmpty()); - }); - expectFailureMessage(@"expected to not be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings), got __NSCFNumber type", ^{ - expect(@1).toNot(beEmpty()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m deleted file mode 100644 index 5a5bce8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalseTest.m +++ /dev/null @@ -1,46 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeFalseTest : XCTestCase - -@end - -@implementation ObjCBeFalseTest - -- (void)testPositiveMatches { - expect(@NO).to(beFalse()); - expect(@YES).toNot(beFalse()); - - expect(false).to(beFalse()); - expect(true).toNot(beFalse()); - - expect(NO).to(beFalse()); - expect(YES).toNot(beFalse()); - - expect(10).toNot(beFalse()); -} - -- (void)testNegativeMatches { - expectNilFailureMessage(@"expected to be false, got ", ^{ - expect(nil).to(beFalse()); - }); - expectNilFailureMessage(@"expected to not be false, got ", ^{ - expect(nil).toNot(beFalse()); - }); - - expectFailureMessage(@"expected to be false, got <1>", ^{ - expect(true).to(beFalse()); - }); - expectFailureMessage(@"expected to not be false, got <0>", ^{ - expect(false).toNot(beFalse()); - }); - - expectFailureMessage(@"expected to be false, got <1>", ^{ - expect(YES).to(beFalse()); - }); - expectFailureMessage(@"expected to not be false, got <0>", ^{ - expect(NO).toNot(beFalse()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m deleted file mode 100644 index f3f5c98..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeFalsyTest.m +++ /dev/null @@ -1,58 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeFalsyTest : XCTestCase - -@end - -@implementation ObjCBeFalsyTest - -- (void)testPositiveMatches { - expect(@NO).to(beFalsy()); - expect(@YES).toNot(beFalsy()); - expect(nil).to(beFalsy()); - - expect(true).toNot(beFalsy()); - expect(false).to(beFalsy()); - - expect(YES).toNot(beFalsy()); - expect(NO).to(beFalsy()); - - expect(10).toNot(beFalsy()); - expect(0).to(beFalsy()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to not be falsy, got ", ^{ - expect(nil).toNot(beFalsy()); - }); - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(@1).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(@NO).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(true).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(false).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <1>", ^{ - expect(YES).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(NO).toNot(beFalsy()); - }); - - expectFailureMessage(@"expected to be falsy, got <10>", ^{ - expect(10).to(beFalsy()); - }); - expectFailureMessage(@"expected to not be falsy, got <0>", ^{ - expect(0).toNot(beFalsy()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m deleted file mode 100644 index 22cab3a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m +++ /dev/null @@ -1,42 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeGreaterThanOrEqualToTest : XCTestCase - -@end - -@implementation ObjCBeGreaterThanOrEqualToTest - -- (void)testPositiveMatches { - expect(@2).to(beGreaterThanOrEqualTo(@2)); - expect(@2).toNot(beGreaterThanOrEqualTo(@3)); - expect(2).to(beGreaterThanOrEqualTo(0)); - expect(2).to(beGreaterThanOrEqualTo(2)); - expect(2).toNot(beGreaterThanOrEqualTo(3)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be greater than or equal to <0>, got <-1>", ^{ - expect(@(-1)).to(beGreaterThanOrEqualTo(@0)); - }); - expectFailureMessage(@"expected to not be greater than or equal to <1>, got <2>", ^{ - expect(@2).toNot(beGreaterThanOrEqualTo(@(1))); - }); - expectFailureMessage(@"expected to be greater than or equal to <0>, got <-1>", ^{ - expect(-1).to(beGreaterThanOrEqualTo(0)); - }); - expectFailureMessage(@"expected to not be greater than or equal to <1>, got <2>", ^{ - expect(2).toNot(beGreaterThanOrEqualTo(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be greater than or equal to <-1>, got ", ^{ - expect(nil).to(beGreaterThanOrEqualTo(@(-1))); - }); - expectNilFailureMessage(@"expected to not be greater than or equal to <1>, got ", ^{ - expect(nil).toNot(beGreaterThanOrEqualTo(@(1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m deleted file mode 100644 index 13336d5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeGreaterThanTest.m +++ /dev/null @@ -1,41 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeGreaterThanTest : XCTestCase - -@end - -@implementation ObjCBeGreaterThanTest - -- (void)testPositiveMatches { - expect(@2).to(beGreaterThan(@1)); - expect(@2).toNot(beGreaterThan(@2)); - expect(@2).to(beGreaterThan(0)); - expect(@2).toNot(beGreaterThan(2)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be greater than <0>, got <-1>", ^{ - expect(@(-1)).to(beGreaterThan(@(0))); - }); - expectFailureMessage(@"expected to not be greater than <1>, got <0>", ^{ - expect(@0).toNot(beGreaterThan(@(1))); - }); - expectFailureMessage(@"expected to be greater than <0>, got <-1>", ^{ - expect(-1).to(beGreaterThan(0)); - }); - expectFailureMessage(@"expected to not be greater than <1>, got <0>", ^{ - expect(0).toNot(beGreaterThan(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be greater than <-1>, got ", ^{ - expect(nil).to(beGreaterThan(@(-1))); - }); - expectNilFailureMessage(@"expected to not be greater than <1>, got ", ^{ - expect(nil).toNot(beGreaterThan(@(1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m deleted file mode 100644 index a9d9d51..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeIdenticalToTest.m +++ /dev/null @@ -1,68 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeIdenticalToTest : XCTestCase - -@end - -@implementation ObjCBeIdenticalToTest - -- (void)testPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(beIdenticalTo([NSNull null])); - expect(@2).toNot(beIdenticalTo(@3)); -} - -- (void)testNegativeMatches { - NSNull *obj = [NSNull null]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be identical to <%p>, got <%p>", obj, @2]), ^{ - expect(@2).to(beIdenticalTo(obj)); - }); - expectFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got <%p>", obj, obj]), ^{ - expect(obj).toNot(beIdenticalTo(obj)); - }); -} - -- (void)testNilMatches { - NSNull *obj = [NSNull null]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnonnull" - expectNilFailureMessage(@"expected to be identical to nil, got nil", ^{ - expect(nil).to(beIdenticalTo(nil)); - }); -#pragma clang diagnostic pop - expectNilFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got nil", obj]), ^{ - expect(nil).toNot(beIdenticalTo(obj)); - }); -} - -- (void)testAliasPositiveMatches { - NSNull *obj = [NSNull null]; - expect(obj).to(be([NSNull null])); - expect(@2).toNot(be(@3)); -} - -- (void)testAliasNegativeMatches { - NSNull *obj = [NSNull null]; - expectFailureMessage(([NSString stringWithFormat:@"expected to be identical to <%p>, got <%p>", obj, @2]), ^{ - expect(@2).to(be(obj)); - }); - expectFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got <%p>", obj, obj]), ^{ - expect(obj).toNot(be(obj)); - }); -} - -- (void)testAliasNilMatches { - NSNull *obj = [NSNull null]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnonnull" - expectNilFailureMessage(@"expected to be identical to nil, got nil", ^{ - expect(nil).to(be(nil)); - }); -#pragma clang diagnostic pop - expectNilFailureMessage(([NSString stringWithFormat:@"expected to not be identical to <%p>, got nil", obj]), ^{ - expect(nil).toNot(be(obj)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m deleted file mode 100644 index 7eee261..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeKindOfTest.m +++ /dev/null @@ -1,34 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeKindOfTest : XCTestCase - -@end - -@implementation ObjCBeKindOfTest - -- (void)testPositiveMatches { - NSMutableArray *array = [NSMutableArray array]; - expect(array).to(beAKindOf([NSArray class])); - expect(@1).toNot(beAKindOf([NSNull class])); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be a kind of NSNull, got <__NSCFNumber instance>", ^{ - expect(@1).to(beAKindOf([NSNull class])); - }); - expectFailureMessage(@"expected to not be a kind of NSNull, got ", ^{ - expect([NSNull null]).toNot(beAKindOf([NSNull class])); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be a kind of NSNull, got ", ^{ - expect(nil).to(beAKindOf([NSNull class])); - }); - expectNilFailureMessage(@"expected to not be a kind of NSNull, got ", ^{ - expect(nil).toNot(beAKindOf([NSNull class])); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m deleted file mode 100644 index 4a738ec..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m +++ /dev/null @@ -1,43 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeLessThanOrEqualToTest : XCTestCase - -@end - -@implementation ObjCBeLessThanOrEqualToTest - -- (void)testPositiveMatches { - expect(@2).to(beLessThanOrEqualTo(@2)); - expect(@2).toNot(beLessThanOrEqualTo(@1)); - expect(2).to(beLessThanOrEqualTo(2)); - expect(2).toNot(beLessThanOrEqualTo(1)); - expect(2).toNot(beLessThanOrEqualTo(0)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be less than or equal to <1>, got <2>", ^{ - expect(@2).to(beLessThanOrEqualTo(@1)); - }); - expectFailureMessage(@"expected to not be less than or equal to <1>, got <1>", ^{ - expect(@1).toNot(beLessThanOrEqualTo(@1)); - }); - - expectFailureMessage(@"expected to be less than or equal to <1>, got <2>", ^{ - expect(2).to(beLessThanOrEqualTo(1)); - }); - expectFailureMessage(@"expected to not be less than or equal to <1>, got <1>", ^{ - expect(1).toNot(beLessThanOrEqualTo(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be less than or equal to <1>, got ", ^{ - expect(nil).to(beLessThanOrEqualTo(@1)); - }); - expectNilFailureMessage(@"expected to not be less than or equal to <-1>, got ", ^{ - expect(nil).toNot(beLessThanOrEqualTo(@(-1))); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m deleted file mode 100644 index 7ba38b2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeLessThanTest.m +++ /dev/null @@ -1,42 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeLessThanTest : XCTestCase - -@end - -@implementation ObjCBeLessThanTest - -- (void)testPositiveMatches { - expect(@2).to(beLessThan(@3)); - expect(@2).toNot(beLessThan(@2)); - expect(2).to(beLessThan(3)); - expect(2).toNot(beLessThan(2)); - expect(2).toNot(beLessThan(0)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be less than <0>, got <-1>", ^{ - expect(@(-1)).to(beLessThan(@0)); - }); - expectFailureMessage(@"expected to not be less than <1>, got <0>", ^{ - expect(@0).toNot(beLessThan(@1)); - }); - expectFailureMessage(@"expected to be less than <0>, got <-1>", ^{ - expect(-1).to(beLessThan(0)); - }); - expectFailureMessage(@"expected to not be less than <1>, got <0>", ^{ - expect(0).toNot(beLessThan(1)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to be less than <-1>, got ", ^{ - expect(nil).to(beLessThan(@(-1))); - }); - expectNilFailureMessage(@"expected to not be less than <1>, got ", ^{ - expect(nil).toNot(beLessThan(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m deleted file mode 100644 index a43ee50..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeNilTest.m +++ /dev/null @@ -1,24 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeNilTest : XCTestCase - -@end - -@implementation ObjCBeNilTest - -- (void)testPositiveMatches { - expect(nil).to(beNil()); - expect(@NO).toNot(beNil()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be nil, got <1>", ^{ - expect(@1).to(beNil()); - }); - expectFailureMessage(@"expected to not be nil, got ", ^{ - expect(nil).toNot(beNil()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m deleted file mode 100644 index c669475..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTrueTest.m +++ /dev/null @@ -1,47 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeTrueTest : XCTestCase - -@end - -@implementation ObjCBeTrueTest - -- (void)testPositiveMatches { - expect(@YES).to(beTrue()); - expect(@NO).toNot(beTrue()); - expect(nil).toNot(beTrue()); - - expect(true).to(beTrue()); - expect(false).toNot(beTrue()); - - expect(YES).to(beTrue()); - expect(NO).toNot(beTrue()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(@NO).to(beTrue()); - }); - expectFailureMessage(@"expected to be true, got ", ^{ - expect(nil).to(beTrue()); - }); - - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(false).to(beTrue()); - }); - - expectFailureMessage(@"expected to not be true, got <1>", ^{ - expect(true).toNot(beTrue()); - }); - - expectFailureMessage(@"expected to be true, got <0>", ^{ - expect(NO).to(beTrue()); - }); - - expectFailureMessage(@"expected to not be true, got <1>", ^{ - expect(YES).toNot(beTrue()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m deleted file mode 100644 index 1ad7913..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeTruthyTest.m +++ /dev/null @@ -1,55 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeTruthyTest : XCTestCase - -@end - -@implementation ObjCBeTruthyTest - -- (void)testPositiveMatches { - expect(@YES).to(beTruthy()); - expect(@NO).toNot(beTruthy()); - expect(nil).toNot(beTruthy()); - - expect(true).to(beTruthy()); - expect(false).toNot(beTruthy()); - - expect(YES).to(beTruthy()); - expect(NO).toNot(beTruthy()); - - expect(10).to(beTruthy()); - expect(0).toNot(beTruthy()); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to be truthy, got ", ^{ - expect(nil).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(@1).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(@NO).to(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(false).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(true).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(NO).to(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <1>", ^{ - expect(YES).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to not be truthy, got <10>", ^{ - expect(10).toNot(beTruthy()); - }); - expectFailureMessage(@"expected to be truthy, got <0>", ^{ - expect(0).to(beTruthy()); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m deleted file mode 100644 index 5ca7be4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCBeginWithTest.m +++ /dev/null @@ -1,37 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCBeginWithTest : XCTestCase - -@end - -@implementation ObjCBeginWithTest - -- (void)testPositiveMatches { - expect(@"hello world!").to(beginWith(@"hello")); - expect(@"hello world!").toNot(beginWith(@"world")); - - NSArray *array = @[@1, @2]; - expect(array).to(beginWith(@1)); - expect(array).toNot(beginWith(@2)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to begin with , got ", ^{ - expect(@"foo").to(beginWith(@"bar")); - }); - expectFailureMessage(@"expected to not begin with , got ", ^{ - expect(@"foo").toNot(beginWith(@"foo")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to begin with <1>, got ", ^{ - expect(nil).to(beginWith(@1)); - }); - expectNilFailureMessage(@"expected to not begin with <1>, got ", ^{ - expect(nil).toNot(beginWith(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m deleted file mode 100644 index 92bb9f9..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCContainTest.m +++ /dev/null @@ -1,67 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCContainTest : XCTestCase - -@end - -@implementation ObjCContainTest - -- (void)testPositiveMatches { - NSArray *array = @[@1, @2]; - expect(array).to(contain(@1)); - expect(array).toNot(contain(@"HI")); - expect(@"String").to(contain(@"Str")); - expect(@"Other").toNot(contain(@"Str")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to contain <3>, got <(1, 2)>", ^{ - expect((@[@1, @2])).to(contain(@3)); - }); - expectFailureMessage(@"expected to not contain <2>, got <(1, 2)>", ^{ - expect((@[@1, @2])).toNot(contain(@2)); - }); - - expectFailureMessage(@"expected to contain , got ", ^{ - expect(@"la").to(contain(@"hi")); - }); - expectFailureMessage(@"expected to not contain , got ", ^{ - expect(@"hihihi").toNot(contain(@"hi")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to contain <3>, got ", ^{ - expect(nil).to(contain(@3)); - }); - expectNilFailureMessage(@"expected to not contain <3>, got ", ^{ - expect(nil).toNot(contain(@3)); - }); - - expectNilFailureMessage(@"expected to contain , got ", ^{ - expect(nil).to(contain(@"hi")); - }); - expectNilFailureMessage(@"expected to not contain , got ", ^{ - expect(nil).toNot(contain(@"hi")); - }); -} - -- (void)testVariadicArguments { - NSArray *array = @[@1, @2]; - expect(array).to(contain(@1, @2)); - expect(array).toNot(contain(@"HI", @"whale")); - expect(@"String").to(contain(@"Str", @"ng")); - expect(@"Other").toNot(contain(@"Str", @"Oth")); - - - expectFailureMessage(@"expected to contain , got <(a, b, c)>", ^{ - expect(@[@"a", @"b", @"c"]).to(contain(@"a", @"bar")); - }); - - expectFailureMessage(@"expected to not contain , got <(a, b, c)>", ^{ - expect(@[@"a", @"b", @"c"]).toNot(contain(@"bar", @"b")); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m deleted file mode 100644 index b960f01..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEndWithTest.m +++ /dev/null @@ -1,37 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCEndWithTest : XCTestCase - -@end - -@implementation ObjCEndWithTest - -- (void)testPositiveMatches { - NSArray *array = @[@1, @2]; - expect(@"hello world!").to(endWith(@"world!")); - expect(@"hello world!").toNot(endWith(@"hello")); - expect(array).to(endWith(@2)); - expect(array).toNot(endWith(@1)); - expect(@1).toNot(contain(@"foo")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to end with , got ", ^{ - expect(@"hello world!").to(endWith(@"?")); - }); - expectFailureMessage(@"expected to not end with , got ", ^{ - expect(@"hello world!").toNot(endWith(@"!")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to end with <1>, got ", ^{ - expect(nil).to(endWith(@1)); - }); - expectNilFailureMessage(@"expected to not end with <1>, got ", ^{ - expect(nil).toNot(endWith(@1)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m deleted file mode 100644 index 6c20809..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCEqualTest.m +++ /dev/null @@ -1,94 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCEqualTest : XCTestCase - -@end - -@implementation ObjCEqualTest - -- (void)testPositiveMatches { - expect(@1).to(equal(@1)); - expect(@1).toNot(equal(@2)); - expect(@1).notTo(equal(@2)); - expect(@"hello").to(equal(@"hello")); - expect("hello").to(equal("hello")); - expect(NSMakeRange(0, 10)).to(equal(NSMakeRange(0, 10))); - expect(NSMakeRange(0, 10)).toNot(equal(NSMakeRange(0, 5))); - expect((NSInteger)1).to(equal((NSInteger)1)); - expect((NSInteger)1).toNot(equal((NSInteger)2)); - expect((NSUInteger)1).to(equal((NSUInteger)1)); - expect((NSUInteger)1).toNot(equal((NSUInteger)2)); - expect(0).to(equal(0)); - expect(1).to(equal(1)); - expect(1).toNot(equal(2)); - expect(1.0).to(equal(1.0)); // Note: not recommended, use beCloseTo() instead - expect(1.0).toNot(equal(2.0)); // Note: not recommended, use beCloseTo() instead - expect((float)1.0).to(equal((float)1.0)); // Note: not recommended, use beCloseTo() instead - expect((float)1.0).toNot(equal((float)2.0)); // Note: not recommended, use beCloseTo() instead - expect((double)1.0).to(equal((double)1.0)); // Note: not recommended, use beCloseTo() instead - expect((double)1.0).toNot(equal((double)2.0)); // Note: not recommended, use beCloseTo() instead - expect((long long)1).to(equal((long long)1)); - expect((long long)1).toNot(equal((long long)2)); - expect((unsigned long long)1).to(equal((unsigned long long)1)); - expect((unsigned long long)1).toNot(equal((unsigned long long)2)); -} - -- (void)testNimbleCurrentlyBoxesNumbersWhichAllowsImplicitTypeConversions { - expect(1).to(equal(1.0)); - expect((long long)1).to(equal((unsigned long long)1)); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(@1).to(equal(@2)); - }); - expectFailureMessage(@"expected to not equal <1>, got <1>", ^{ - expect(@1).toNot(equal(@1)); - }); - expectFailureMessage(@"expected to not equal , got ", ^{ - expect("bar").toNot(equal("foo")); - }); - expectFailureMessage(@"expected to equal , got ", ^{ - expect(NSMakeRange(0, 10)).to(equal(NSMakeRange(0, 5))); - }); - - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((NSInteger)1).to(equal((NSInteger)2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((NSUInteger)1).to(equal((NSUInteger)2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(1).to(equal(2)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect(1.0).to(equal(2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((float)1.0).to(equal((float)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((double)1.0).to(equal((double)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((long long)1.0).to(equal((long long)2.0)); - }); - expectFailureMessage(@"expected to equal <2>, got <1>", ^{ - expect((unsigned long long)1.0).to(equal((unsigned long long)2.0)); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to equal , got ", ^{ - expect(NULL).to(equal(NULL)); - }); - expectNilFailureMessage(@"expected to equal , got ", ^{ - expect(nil).to(equal(nil)); - }); - expectNilFailureMessage(@"expected to not equal , got ", ^{ - expect(nil).toNot(equal(nil)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m deleted file mode 100644 index 31053c8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCHaveCount.m +++ /dev/null @@ -1,174 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCHaveCountTest : XCTestCase - -@end - -@implementation ObjCHaveCountTest - -- (void)testHaveCountForNSArray { - expect(@[@1, @2, @3]).to(haveCount(@3)); - expect(@[@1, @2, @3]).notTo(haveCount(@1)); - - expect(@[]).to(haveCount(@0)); - expect(@[@1]).notTo(haveCount(@0)); - - expect(@[@1, @2, @3]).to(haveCount(3)); - expect(@[@1, @2, @3]).notTo(haveCount(1)); - - expect(@[]).to(haveCount(0)); - expect(@[@1]).notTo(haveCount(0)); - - expectFailureMessage(@"expected to have NSArray with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSArray with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSArray with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSArray with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(@[@1, @2, @3]).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSDictionary { - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(@3)); - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(@1)); - - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(3)); - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSDictionary with count 1, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSDictionary with count 3, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSDictionary with count 1, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSDictionary with count 3, got 3\nActual Value: {1 = 1;2 = 2;3 = 3;}", ^{ - expect(@{@"1":@1, @"2":@2, @"3":@3}).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSHashtable { - NSHashTable *const table = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory]; - [table addObject:@1]; - [table addObject:@2]; - [table addObject:@3]; - - expect(table).to(haveCount(@3)); - expect(table).notTo(haveCount(@1)); - - expect(table).to(haveCount(3)); - expect(table).notTo(haveCount(1)); - - NSString *msg = [NSString stringWithFormat: - @"expected to have NSHashTable {[2] 2[12] 1[13] 3}with count 1, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).to(haveCount(@1)); - }); - - msg = [NSString stringWithFormat: - @"expected to not have NSHashTable {[2] 2[12] 1[13] 3}with count 3, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).notTo(haveCount(@3)); - }); - - - msg = [NSString stringWithFormat: - @"expected to have NSHashTable {[2] 2[12] 1[13] 3}with count 1, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).to(haveCount(1)); - }); - - msg = [NSString stringWithFormat: - @"expected to not have NSHashTable {[2] 2[12] 1[13] 3}with count 3, got 3\nActual Value: %@", - [table.description stringByReplacingOccurrencesOfString:@"\n" withString:@""]]; - expectFailureMessage(msg, ^{ - expect(table).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSSet { - NSSet *const set = [NSSet setWithArray:@[@1, @2, @3]]; - - expect(set).to(haveCount(@3)); - expect(set).notTo(haveCount(@1)); - expect(set).to(haveCount(3)); - expect(set).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSSet with count 1, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSSet with count 3, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSSet with count 1, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSSet with count 3, got 3\nActual Value: {(3,1,2)}", ^{ - expect(set).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForNSIndexSet { - NSIndexSet *const set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]; - - expect(set).to(haveCount(@3)); - expect(set).notTo(haveCount(@1)); - expect(set).to(haveCount(3)); - expect(set).notTo(haveCount(1)); - - expectFailureMessage(@"expected to have NSIndexSet with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).to(haveCount(@1)); - }); - - expectFailureMessage(@"expected to not have NSIndexSet with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).notTo(haveCount(@3)); - }); - - expectFailureMessage(@"expected to have NSIndexSet with count 1, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).to(haveCount(1)); - }); - - expectFailureMessage(@"expected to not have NSIndexSet with count 3, got 3\nActual Value: (1, 2, 3)", ^{ - expect(set).notTo(haveCount(3)); - }); -} - -- (void)testHaveCountForUnsupportedTypes { - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFConstantString", ^{ - expect(@"string").to(haveCount(@6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFNumber", ^{ - expect(@1).to(haveCount(@6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFConstantString", ^{ - expect(@"string").to(haveCount(6)); - }); - - expectFailureMessage(@"expected to get type of NSArray, NSSet, NSDictionary, or NSHashTable, got __NSCFNumber", ^{ - expect(@1).to(haveCount(6)); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m deleted file mode 100644 index 2342ae4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCMatchTest.m +++ /dev/null @@ -1,33 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCMatchTest : XCTestCase - -@end - -@implementation ObjCMatchTest - -- (void)testPositiveMatches { - expect(@"11:14").to(match(@"\\d{2}:\\d{2}")); - expect(@"hello").toNot(match(@"\\d{2}:\\d{2}")); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to match <\\d{2}:\\d{2}>, got ", ^{ - expect(@"hello").to(match(@"\\d{2}:\\d{2}")); - }); - expectFailureMessage(@"expected to not match <\\d{2}:\\d{2}>, got <11:22>", ^{ - expect(@"11:22").toNot(match(@"\\d{2}:\\d{2}")); - }); -} - -- (void)testNilMatches { - expectNilFailureMessage(@"expected to match <\\d{2}:\\d{2}>, got ", ^{ - expect(nil).to(match(@"\\d{2}:\\d{2}")); - }); - expectNilFailureMessage(@"expected to not match <\\d{2}:\\d{2}>, got ", ^{ - expect(nil).toNot(match(@"\\d{2}:\\d{2}")); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m deleted file mode 100644 index d84915a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCRaiseExceptionTest.m +++ /dev/null @@ -1,178 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCRaiseExceptionTest : XCTestCase - -@end - -@implementation ObjCRaiseExceptionTest - -- (void)testPositiveMatches { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectAction(^{ @throw exception; }).to(raiseException()); - expectAction(^{ [exception raise]; }).to(raiseException()); - expectAction(^{ [exception raise]; }).to(raiseException().named(NSInvalidArgumentException)); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food")); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"})); - - expectAction(^{ }).toNot(raiseException()); -} - -- (void)testPositiveMatchesWithBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectAction(^{ [exception raise]; }).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); -} - -- (void)testNegativeMatches { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - - expectFailureMessage(@"expected to raise any exception, got no exception", ^{ - expectAction(^{ }).to(raiseException()); - }); - - expectFailureMessage(@"expected to raise exception with name , got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(@"foo")); - }); - - expectFailureMessage(@"expected to raise exception with name with reason , got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"cakes")); - }); - - expectFailureMessage(@"expected to raise exception with name with reason with userInfo <{k = v;}>, got no exception", ^{ - expectAction(^{ }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"k": @"v"})); - }); - - expectFailureMessage(@"expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }", ^{ - expectAction(^{ [exception raise]; }).toNot(raiseException()); - }); -} - -- (void)testNegativeMatchesWithPassingBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - expectFailureMessage(@"expected to raise exception that satisfies block, got no exception", ^{ - expect(exception).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"LOL")); - })); - }); - - NSString *outerFailureMessage = @"expected to raise exception that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(@"foo"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"bar"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); - - outerFailureMessage = @"expected to raise exception with name with reason with userInfo <{}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(NSInvalidArgumentException)); - })); - }); -} - -- (void)testNegativeMatchesWithNegativeBlocks { - __block NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException - reason:@"No food" - userInfo:@{@"key": @"value"}]; - NSString *outerFailureMessage; - - NSString const *innerFailureMessage = @"expected to equal , got "; - outerFailureMessage = @"expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); - - - outerFailureMessage = @"expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); - - - outerFailureMessage = @"expected to raise exception with name with reason with userInfo <{key = value;}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: NSInvalidArgumentException), reason='No food', userInfo=[AnyHashable(\"key\"): value] }"; - expectFailureMessages((@[outerFailureMessage, innerFailureMessage]), ^{ - expectAction(^{ [exception raise]; }).to(raiseException(). - named(NSInvalidArgumentException). - reason(@"No food"). - userInfo(@{@"key": @"value"}). - satisfyingBlock(^(NSException *exception) { - expect(exception.name).to(equal(@"foo")); - })); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m deleted file mode 100644 index 4c80abc..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSatisfyAnyOfTest.m +++ /dev/null @@ -1,32 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCSatisfyAnyOfTest : XCTestCase - -@end - -@implementation ObjCSatisfyAnyOfTest - -- (void)testPositiveMatches { - expect(@2).to(satisfyAnyOf(equal(@2), equal(@3))); - expect(@2).toNot(satisfyAnyOf(equal(@3), equal(@16))); - expect(@[@1, @2, @3]).to(satisfyAnyOf(equal(@[@1, @2, @3]), allPass(beLessThan(@4)))); - expect(@NO).to(satisfyAnyOf(beTrue(), beFalse())); - expect(@YES).to(satisfyAnyOf(beTrue(), beFalse())); -} - -- (void)testNegativeMatches { - expectFailureMessage(@"expected to match one of: {equal <3>}, or {equal <4>}, or {equal <5>}, got 2", ^{ - expect(@2).to(satisfyAnyOf(equal(@3), equal(@4), equal(@5))); - }); - - expectFailureMessage(@"expected to match one of: {all be less than <4>, but failed first at element" - " <5> in <[5, 6, 7]>}, or {equal <(1, 2, 3, 4)>}, got (5,6,7)", ^{ - expect(@[@5, @6, @7]).to(satisfyAnyOf(allPass(beLessThan(@4)), equal(@[@1, @2, @3, @4]))); - }); - - expectFailureMessage(@"satisfyAnyOf must be called with at least one matcher", ^{ - expect(@"turtles").to(satisfyAnyOf()); - }); -} -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m deleted file mode 100644 index 2aae816..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m +++ /dev/null @@ -1,21 +0,0 @@ -#import -#import -#import "NimbleSpecHelper.h" - -@interface ObjCSyncTest : XCTestCase - -@end - -@implementation ObjCSyncTest - -- (void)testFailureExpectation { - expectFailureMessage(@"fail() always fails", ^{ - fail(); - }); - - expectFailureMessage(@"This always fails", ^{ - failWithMessage(@"This always fails"); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m deleted file mode 100644 index ffb5407..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCUserDescriptionTest.m +++ /dev/null @@ -1,52 +0,0 @@ -#import -#import "NimbleSpecHelper.h" - -@interface ObjCUserDescriptionTest : XCTestCase - -@end - -@implementation ObjCUserDescriptionTest - -- (void)testToWithDescription { - expectFailureMessage(@"These are equal!\n" - "expected to equal <2>, got <1>", ^{ - expect(@1).toWithDescription(equal(@2), @"These are equal!"); - }); -} - -- (void)testToNotWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to not equal <1>, got <1>", ^{ - expect(@1).toNotWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testNotToWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to not equal <1>, got <1>", ^{ - expect(@1).notToWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testToEventuallyWithDescription { - expectFailureMessage(@"These are equal!\n" - "expected to eventually equal <2>, got <1>", ^{ - expect(@1).toEventuallyWithDescription(equal(@2), @"These are equal!"); - }); -} - -- (void)testToEventuallyNotWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to eventually not equal <1>, got <1>", ^{ - expect(@1).toEventuallyNotWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -- (void)testToNotEventuallyWithDescription { - expectFailureMessage(@"These aren't equal!\n" - "expected to eventually not equal <1>, got <1>", ^{ - expect(@1).toNotEventuallyWithDescription(equal(@1), @"These aren't equal!"); - }); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m deleted file mode 100644 index 4ba2eae..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjcStringersTest.m +++ /dev/null @@ -1,31 +0,0 @@ -@import XCTest; -@import Nimble; - -@interface ObjcStringersTest : XCTestCase - -@end - -@implementation ObjcStringersTest - -- (void)testItCanStringifyArrays { - NSArray *array = @[@1, @2, @3]; - NSString *result = NMBStringify(array); - - expect(result).to(equal(@"(1, 2, 3)")); -} - -- (void)testItCanStringifyIndexSets { - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]; - NSString *result = NMBStringify(indexSet); - - expect(result).to(equal(@"(1, 2, 3)")); -} - -- (void)testItRoundsLongDecimals { - NSNumber *num = @291.123782163; - NSString *result = NMBStringify(num); - - expect(result).to(equal(@"291.1238")); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/script/release b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/script/release deleted file mode 100755 index eb53530..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/script/release +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env sh -REMOTE_BRANCH=master -POD_NAME=Nimble -PODSPEC=Nimble.podspec - -POD=${COCOAPODS:-pod} - -function help { - echo "Usage: release VERSION RELEASE_NOTES [-f]" - echo - echo "VERSION should be the version to release, should not include the 'v' prefix" - echo "RELEASE_NOTES should be a file that lists all the release notes for this version" - echo " if file does not exist, creates a git-style commit with a diff as a comment" - echo - echo "FLAGS" - echo " -f Forces override of tag" - echo - echo " Example: ./release 1.0.0-rc.2 ./release-notes.txt" - echo - echo "HINT: use 'git diff ...HEAD' to build the release notes" - echo - exit 2 -} - -function die { - echo "[ERROR] $@" - echo - exit 1 -} - -if [ $# -lt 2 ]; then - help -fi - -VERSION=$1 -RELEASE_NOTES=$2 -FORCE_TAG=$3 - -VERSION_TAG="v$VERSION" - -echo "-> Verifying Local Directory for Release" - -if [ -z "`which $POD`" ]; then - die "Cocoapods is required to produce a release. Aborting." -fi -echo " > Cocoapods is installed" - -echo " > Is this a reasonable tag?" - -echo $VERSION_TAG | grep -q "^vv" -if [ $? -eq 0 ]; then - die "This tag ($VERSION) is an incorrect format. You should remove the 'v' prefix." -fi - -echo $VERSION_TAG | grep -q -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" -if [ $? -ne 0 ]; then - die "This tag ($VERSION) is an incorrect format. It should be in 'v{MAJOR}.{MINOR}.{PATCH}(-{PRERELEASE_NAME}.{PRERELEASE_VERSION})' form." -fi - -echo " > Is this version ($VERSION) unique?" -git describe --exact-match "$VERSION_TAG" > /dev/null 2>&1 -if [ $? -eq 0 ]; then - if [ -z "$FORCE_TAG" ]; then - die "This tag ($VERSION) already exists. Aborting. Append '-f' to override" - else - echo " > NO, but force was specified." - fi -else - echo " > Yes, tag is unique" -fi - -if [ ! -f "$RELEASE_NOTES" ]; then - echo " > Failed to find $RELEASE_NOTES. Prompting editor" - RELEASE_NOTES=/tmp/nimble.release.notes - LATEST_TAG=`git for-each-ref refs/tags --sort=-refname --format="%(refname:short)" | grep -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" | ruby -e 'puts STDIN.read.split("\n").sort { |a,b| Gem::Version.new(a.gsub(/^v/, "")) <=> Gem::Version.new(b.gsub(/^v/, "")) }.last'` - echo " > Latest tag ${LATEST_TAG}" - echo "${POD_NAME} v$VERSION" > $RELEASE_NOTES - echo "================" >> $RELEASE_NOTES - echo >> $RELEASE_NOTES - echo "# Changelog from ${LATEST_TAG}..HEAD" >> $RELEASE_NOTES - git log ${LATEST_TAG}..HEAD | sed -e 's/^/# /' >> $RELEASE_NOTES - $EDITOR $RELEASE_NOTES - diff -q $RELEASE_NOTES ${RELEASE_NOTES}.backup > /dev/null 2>&1 - STATUS=$? - rm ${RELEASE_NOTES}.backup - if [ $STATUS -eq 0 ]; then - rm $RELEASE_NOTES - die "No changes in release notes file. Aborting." - fi -fi -echo " > Release notes: $RELEASE_NOTES" - -if [ ! -f "$PODSPEC" ]; then - die "Cannot find podspec: $PODSPEC. Aborting." -fi -echo " > Podspec exists" - -git config --get user.signingkey > /dev/null || { - echo "[ERROR] No PGP found to sign tag. Aborting." - echo - echo " Creating a release requires signing the tag for security purposes. This allows users to verify the git cloned tree is from a trusted source." - echo " From a security perspective, it is not considered safe to trust the commits (including Author & Signed-off fields). It is easy for any" - echo " intermediate between you and the end-users to modify the git repository." - echo - echo " While not all users may choose to verify the PGP key for tagged releases. It is a good measure to ensure 'this is an official release'" - echo " from the official maintainers." - echo - echo " If you're creating your PGP key for the first time, use RSA with at least 4096 bits." - echo - echo "Related resources:" - echo " - Configuring your system for PGP: https://git-scm.com/book/tr/v2/Git-Tools-Signing-Your-Work" - echo " - Why: http://programmers.stackexchange.com/questions/212192/what-are-the-advantages-and-disadvantages-of-cryptographically-signing-commits-a" - echo - exit 2 -} -echo " > Found PGP key for git" - -# Verify cocoapods trunk ownership -pod trunk me | grep -q "$POD_NAME" || die "You do not have access to pod repository $POD_NAME. Aborting." -echo " > Verified ownership to $POD_NAME pod" - - -echo "--- Releasing version $VERSION (tag: $VERSION_TAG)..." - -function restore_podspec { - if [ -f "${PODSPEC}.backup" ]; then - mv -f ${PODSPEC}{.backup,} - fi -} - -echo "-> Ensuring no differences to origin/$REMOTE_BRANCH" -git fetch origin || die "Failed to fetch origin" -git diff --quiet HEAD "origin/$REMOTE_BRANCH" || die "HEAD is not aligned to origin/$REMOTE_BRANCH. Cannot update version safely" - - -echo "-> Setting podspec version" -cat "$PODSPEC" | grep 's.version' | grep -q "\"$VERSION\"" -SET_PODSPEC_VERSION=$? -if [ $SET_PODSPEC_VERSION -eq 0 ]; then - echo " > Podspec already set to $VERSION. Skipping." -else - sed -i.backup "s/s.version *= *\".*\"/s.version = \"$VERSION\"/g" "$PODSPEC" || { - restore_podspec - die "Failed to update version in podspec" - } - - git add ${PODSPEC} || { restore_podspec; die "Failed to add ${PODSPEC} to INDEX"; } - git commit -m "Bumping version to $VERSION" || { restore_podspec; die "Failed to push updated version: $VERSION"; } -fi - -if [ -z "$FORCE_TAG" ]; then - echo "-> Tagging version" - git tag -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin" - git push origin "$VERSION_TAG" || die "Failed to push tag '$VERSION_TAG' to origin" -else - echo "-> Tagging version (force)" - git tag -f -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin (force)" - git push origin "$VERSION_TAG" -f || die "Failed to push tag '$VERSION_TAG' to origin" -fi - -if [ $SET_PODSPEC_VERSION -ne 0 ]; then - git push origin "$REMOTE_BRANCH" || die "Failed to push to origin" - echo " > Pushed version to origin" -fi - -echo -echo "---------------- Released as $VERSION_TAG ----------------" -echo - -echo -echo "Pushing to pod trunk..." - -$POD trunk push "$PODSPEC" - -echo -echo "================ Finalizing the Release ================" -echo -echo " - Opening GitHub to mark this as a release..." -echo " - Paste the contents of $RELEASE_NOTES into the release notes. Tweak for GitHub styling." -echo " - Announce!" - -open "https://github.com/Quick/Nimble/releases/new?tag=$VERSION_TAG" - -rm ${PODSPEC}.backup diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/test b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/test deleted file mode 100755 index 8ea482e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Externals/Nimble/test +++ /dev/null @@ -1,142 +0,0 @@ -#!/bin/bash - -GREEN="\033[0;32m" -CLEAR="\033[0m" - -if which xcodebuild > /dev/null; then - echo -e "Gathering ${GREEN}xcodebuild sdk versions${CLEAR}..." - BUILD_DIR=`pwd`/build - LATEST_IOS_SDK_VERSION=`xcodebuild -showsdks | grep iphonesimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_TVOS_SDK_VERSION=`xcodebuild -showsdks | grep appletvsimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_MACOS_SDK_VERSION=`xcodebuild -showsdks | grep 'macosx' | cut -d ' ' -f 3 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - BUILD_IOS_SDK_VERSION=${NIMBLE_BUILD_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - RUNTIME_IOS_SDK_VERSION=${NIMBLE_RUNTIME_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - BUILD_TVOS_SDK_VERSION=${NIMBLE_BUILD_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - RUNTIME_TVOS_SDK_VERSION=${NIMBLE_RUNTIME_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - BUILD_MACOS_SDK_VERSION=${NIMBLE_BUILD_MACOS_SDK_VERSION:-$LATEST_MACOS_SDK_VERSION} -fi - -set -e - -function color_if_overridden { - local actual=$1 - local env_var=$2 - if [ -z "$env_var" ]; then - printf "$actual" - else - printf "$GREEN$actual$CLEAR" - fi -} - -function print_env { - echo "=== Environment ===" - echo " iOS:" - echo " Latest iOS SDK: $LATEST_IOS_SDK_VERSION" - echo " Building with iOS SDK: `color_if_overridden $BUILD_IOS_SDK_VERSION $NIMBLE_BUILD_IOS_SDK_VERSION`" - echo " Running with iOS SDK: `color_if_overridden $RUNTIME_IOS_SDK_VERSION $NIMBLE_RUNTIME_IOS_SDK_VERSION`" - echo - echo " tvOS:" - echo " Latest tvOS SDK: $LATEST_TVOS_SDK_VERSION" - echo " Building with tvOS SDK: `color_if_overridden $BUILD_TVOS_SDK_VERSION $NIMBLE_BUILD_TVOS_SDK_VERSION`" - echo " Running with tvOS SDK: `color_if_overridden $RUNTIME_TVOS_SDK_VERSION $NIMBLE_RUNTIME_TVOS_SDK_VERSION`" - echo - echo " macOS:" - echo " Latest macOS SDK: $LATEST_MACOS_SDK_VERSION" - echo " Building with macOS SDK: `color_if_overridden $BUILD_MACOS_SDK_VERSION $NIMBLE_BUILD_MACOS_SDK_VERSION`" - echo - echo "======= END =======" - echo -} - -function run { - echo -e "$GREEN==>$CLEAR $@" - "$@" -} - -function test_ios { - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPad Air,OS=$RUNTIME_IOS_SDK_VERSION" build-for-testing test-without-building - - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPhone 5s,OS=$RUNTIME_IOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_tvos { - run osascript -e 'tell app "Simulator" to quit' - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -sdk "appletvsimulator$BUILD_TVOS_SDK_VERSION" -destination "name=Apple TV 1080p,OS=$RUNTIME_TVOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_macos { - run xcodebuild -project Nimble.xcodeproj -scheme "Nimble-macOS" -configuration "Debug" -sdk "macosx$BUILD_MACOS_SDK_VERSION" build-for-testing test-without-building -} - -function test_podspec { - echo "Gathering CocoaPods installation information..." - run bundle exec pod --version - echo "Linting podspec..." - run bundle exec pod lib lint Nimble.podspec -} - -function test_swiftpm { - if [ -d .build ]; then - run swift build --clean - fi - run swift build && swift test -} - -function test() { - test_ios - test_tvos - test_macos - - if which swift-test; then - test_swiftpm - else - echo "Not testing with the Swift Package Manager because swift-test is not installed" - fi -} - -function clean { - run rm -rf ~/Library/Developer/Xcode/DerivedData\; true -} - -function help { - echo "Usage: $0 COMMANDS" - echo - echo "COMMANDS:" - echo " clean - Cleans the derived data directory of Xcode. Assumes default location" - echo " ios - Runs the tests as an iOS device" - echo " tvos - Runs the tests as an tvOS device" - echo " macos - Runs the tests on macOS 10.10 (Yosemite and newer only)" - echo " podspec - Runs pod lib lint against the podspec to detect breaking changes" - echo " all - Runs the all tests of macos, ios and tvos" - echo " swiftpm - Runs the tests built by the Swift Package Manager" - echo " help - Displays this help" - echo - exit 1 -} - -function main { - print_env - for arg in $@ - do - case "$arg" in - clean) clean ;; - ios) test_ios ;; - tvos) test_tvos ;; - macos) test_macos ;; - podspec) test_podspec ;; - test) test ;; - all) test ;; - swiftpm) test_swiftpm ;; - help) help ;; - esac - done - - if [ $# -eq 0 ]; then - clean - test - fi -} - -main $@ diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Gemfile b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Gemfile deleted file mode 100644 index f64c938..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Gemfile +++ /dev/null @@ -1,3 +0,0 @@ -source "https://rubygems.org" - -gem 'cocoapods', '~> 1.1.0.rc.2' diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Gemfile.lock b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Gemfile.lock deleted file mode 100644 index 5f9326b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Gemfile.lock +++ /dev/null @@ -1,67 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (4.2.6) - i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - claide (1.0.0) - cocoapods (1.0.0) - activesupport (>= 4.0.2) - claide (>= 1.0.0, < 2.0) - cocoapods-core (= 1.0.0) - cocoapods-deintegrate (>= 1.0.0, < 2.0) - cocoapods-downloader (>= 1.0.0, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.0.0, < 2.0) - cocoapods-try (>= 1.0.0, < 2.0) - colored (~> 1.2) - escape (~> 0.0.4) - fourflusher (~> 0.3.0) - molinillo (~> 0.4.5) - nap (~> 1.0) - xcodeproj (>= 1.0.0, < 2.0) - cocoapods-core (1.0.0) - activesupport (>= 4.0.2) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.0) - cocoapods-downloader (1.0.0) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.0.0) - cocoapods-trunk (1.0.0) - nap (>= 0.8, < 2.0) - netrc (= 0.7.8) - cocoapods-try (1.0.0) - colored (1.2) - escape (0.0.4) - fourflusher (0.3.0) - fuzzy_match (2.0.4) - i18n (0.7.0) - json (1.8.3) - minitest (5.8.4) - molinillo (0.4.5) - nap (1.1.0) - netrc (0.7.8) - thread_safe (0.3.5) - tzinfo (1.2.2) - thread_safe (~> 0.1) - xcodeproj (1.0.0) - activesupport (>= 3) - claide (>= 1.0.0, < 2.0) - colored (~> 1.2) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods (= 1.0) - -BUNDLED WITH - 1.11.2 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/LICENSE b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/LICENSE deleted file mode 100644 index e900165..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014, Quick Team - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Package.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Package.swift deleted file mode 100644 index 6d2fac9..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Package.swift +++ /dev/null @@ -1,13 +0,0 @@ -import PackageDescription - -let package = Package( - name: "Quick", - exclude: [ - "Sources/QuickObjectiveC", - "Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m", - "Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m", - "Tests/QuickTests/QuickTests/FunctionalTests/ObjC", - "Tests/QuickTests/QuickTests/Helpers", - "Tests/QuickTests/QuickTests/QuickConfigurationTests.m", - ] -) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.h deleted file mode 100644 index b934bcb..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -@import Quick; - -@interface ___FILEBASENAMEASIDENTIFIER___ : QuickConfiguration - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.m deleted file mode 100644 index cd3f486..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Objective-C/___FILEBASENAME___.m +++ /dev/null @@ -1,17 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -#import "___FILEBASENAMEASIDENTIFIER___.h" - -@implementation ___FILEBASENAMEASIDENTIFIER___ - -+ (void)configure:(Configuration *)configuration { - -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Swift/___FILEBASENAME___.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Swift/___FILEBASENAME___.swift deleted file mode 100644 index 3f25328..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/Swift/___FILEBASENAME___.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -import Quick - -class ___FILEBASENAMEASIDENTIFIER___: QuickConfiguration { - override class func configure(configuration: Configuration) { - - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateIcon.icns b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateIcon.icns deleted file mode 100644 index 5cb4ae999f06c9d5b5f3152a034c65f23137821e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529473 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%0D_YWU3_}$$FJi-@LKlix9Xblc5@0Ulz3?A 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%0Dl`^kCYc7e=RkY)F>z4{wSA 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�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

#OaG=$jQXJIUFE~t-iL6<6w#8rj zAj_b#pHrNw5Bus#4~NyvI|$wZ8YI=Mk^ep(%|~oBOQ5O`+Q2CxEBN@0mBl@4(UbX> zJ>?PXY2$49ohDQFuXNdms2|v8U`f|TRs1bgaX=m6f&JG{hBX1AwgS`aau27CDm;QC zn|E)+62KtgeA{B|lD@;F(@#%nW^uZm#C9@_jmE__|8ln~&lcF;K)`o6aE(1A?Z&BTcHza7mc*vdi)vwx$>n>Q6W~+Svp7V@1ryJt=zI z`ssMb5=@M69gzs%SZ;P5o7FT7R+==shgY^0;cwIorWRg7@Rq1PHcP4>4 zCgj)7JH8FI8E*tKbp!y+gNuL@Gxdf#QN;evsb1OTd2hFP5mbb_2j#|t-CH=~@Nb_B zzFWI#U8~-an1E@Yl9#r$=gwHND=inWxvwRGf}5Cy-D=sTSOt6N0Q-oHsjJHNc%?<- zv#S&F$q}UmNCgO)VhB*!{tMept!b)MO7QfDEXi*EdQaPh2T~iDWjb2d^8xK_6)U6W z4F$IdqHfoDRvhl;1$CNpPt2}?)6nGd6x-H2H;eS2;|gn;xnVWniVPqFyw zpLX9q&a6WH`!d*j6b#oygoA<`{ldEnRx?(6fB&m>Xi?-llI(+xe~1?e#w6gS7*uLh zHC<&crf)|OnlaIXyKK=lvYsIV?e4puOwyJvE#N~UbYQ*_H0bL)mh0gi=+-t4`&D~_ zv-M~S0&nO8J8xJS)_C8|ZWbBIE{IKF%iT}PdMaJ*reo*klGXhlTAneV^77BF@K{fD zec$rPF2pT2i?a#hT~^hMUtTTl&sgz+W_x}aKX+)q*}Y@ovBgvn74mjIvZQ2n0hhA5 zbp^aaMCcv!+$VY#GkrZ8NGe*GbNu!XG-SnZE^AejVeG2W@cbS{5jeFH(-+qTym0%Z z8V#n6rsV7;%Bg4WTsJ5>rY-K>jG~usGZovK`%_lNlFPj#L`wenN=EPV2GA`J^*BOe zc$NgaZWFpZ__B@HJg*$J59$akG|LeRd>6X7)I3AjqVv4*=Sh@^Z+aCoy-t5sYEq^6 zX}|kx(#^$V=1B8)rpS$4?UHKWke@aQ|J-Nk>=7Ng%W0%yAcbTf@=|$d3QXmAOC@$y zNJ$eRZ6mMi22aM;>`B`W{diukXuyT8M z*k7E1ahL6TNNkwsQ`?JTrNHCGh!OJ+SNbrHzj?>CDs+rtVi_Gky07!TLUt zpHlZr$Me^m`x#*mFlQ+-)}^4_HlDtE=}#GNA&n!sw1x}(LgVI2Y_78Fe@ZQhlvdJP zA|m*xMjl`uj{POn2Y$)+K@SD7_d@X%Ye4|=UlG#ZTU;XI;a%0SRjZlV@#Vwc zRrCIP7=_$T|LuT_EM*>LugPAk-|6_?s)co<#S7YN*gzbh)M}teQ=qk#l=p?6iAgNlBBq(>7S37g!NXPg#=p_SPe^|Q{(xgrPmeT#kn zA^j!mebObOmqH%cE><}zWIdpvI=^3iv96tM8RBRMKpU4r#sBvL2>wqWRU%-Yn9U(; zs+q0M^4_iV96?bQ9}?@-AeB#x+#as0ddUd}I{#d(pZ6|K>?M%;KX=B>0{&Upq(x^f zFS>bCR2xB%KReE{-cjy+8{%m&%X2UIC&~UyZogDk<|G1T&a(ytemSm#%>=X6u!PFi zX(?^0;l2AOY8E0&>2kK&p3HusX*-JqDzzSUf7MakWpB3&Fbx{muF$5b&*Uv{{nTAS|^9-cpRm8}3OEk-~M7W@!?Y?x9)YR)o}nPFT_yz0F1 z#ELx+AK$iJe6M8bb>31cS|LI`BLg%ibBS?1Mm|mZuf2u##3L!##-Hf9qFo zp!iv^ulOg2-gpP@k8=|f4Jb@_qTEJA5_-BOux~4*3fwODe-de;y`N7y^Q6xeYKOY@ z{@_**W)sTF!3YYVD6*8^s@w1hIc?nKs|HicRPj{^+NWc zb7K0B`A}RjxeKe|kDiwF87j`7dztarv~J^^{q-cZE`9g=%={SHHxr*4fB$z;mCcVv zvi9>?xw9+iFvZ$iEh7o9H^}wm%}w}DSJzu_gh%b1-(2zZ&V=jE!oKZJH0prZIWk@m zy#);U;;#atd^6&nA`&~1h)wyn3k?(U<7*yduM@+n0BGXe$wg6?)?yC6GAXx@ z7q{%>Z)7@^+ zemv)!iE&OfyFL-!Eb}qR2wFJrFcqu`XjVDr6Bm7@5cuUllsrw+Z&dv^TX2Fcwv&CI;z;Oj}Ms&kb3AmK(A6%9ODU6@^dvtt6HXy2j48=*2*oOd`*UF=fi z4i`;O`Gw&T?W|W6xWnG)bH-Sit-_gZDeHLI2)Ug~+)k18fxl!(HJS`a;*cebkm4we zqrE@1-9#V$)sd>>v0!Mv+tOztc5M2N7QD*b53F9e+`0o}IxA!bDb3?&W)_Bim~|GU zR1DM4P0V_Fmj_&~8{6aROm}PHQ#GX3Q={>{Dk7wn2P~nwGPYMD1K;l$bHmr>!_OIs z(_gL>0w&6_l&x`vy4-Nq+6q%M^-u7zQCMJT0B5)PgXGtg>JvoNmF=$8Y17P!9ZhAM|l;>>-u{Q0Xz$uo#tu70j|} zZ=-yk>DX%vkX4M8#qMWG=LHaa&-|vv?bh8gu=tF!nJL7~zKk3V+7;^*4EPnDb4o%O zA}^Y9ZT+Ph$J?5T12QD~*n$SW$vi51S7Z7{olBT0@mE~LU+?p3r&o<}(>cKeQHZ|f zOP2ST@!c22FJ?b{{|otm>RK>Inb*mxk4yN)=>`kRxV2RqScxhs-X~NsZ#?p0bETJM z3Um!LS-KM6o?jyrVEnqU6{Dh_R(fwdZDzk`4AZD$B{`OovM5faQ1<6vg`pu<3BAIe zT^hi754t!EvXZBh*vT-%ZLSxpHscrmLQ!n22R4UJ)Hz8uxXSIhY3Mh<`t2e@Z$B~?f&;3Rj3sVANnMG3a_!gz;P$xkKDBvXZee(5t+o& zBWrbP5v@wAxN(LHf>!*qALo~Fy!>eJH2gt!0o?Y;cSBvH!vC4mRPN^>3w~*-q{INV zh%7Va=mqNWDb6V2h)O{s3jU4Z-y;Ym@SjjOg6B>Od=Gug_`BYcccGH%a+3ZLNi`kz zTyIBr_O#D8GWO>bZ#^D%b6AmgMdo)>^gF=$A^6X$?Wu=+!G3<|>deC6q;Bu-O8VkH z7qwjpXyoiJccb)q=7z^pNZ>LTzJVf?($~MEN^LG7xbR_uOlp?|ilX7?7{N~gV5E1lm>qy-bWI^j_lRF*u>1-c{cfK zXXU8x##zy@o26vw+F9GnUUg|3smMn47Dk+d=Xc-sRo%EI&+{H1+f+q%+B+)#Ox-{k zjz4yzI6>lm>O`S~g^`po=1e>%uB-3AQ0rmzwT$k7eF+ZP{@!BR_C9Pj*QJKnS?4-JOIYpAkOQZMxf9WTZ6yrjkcJcXB95RHA5D`(rFb?7mb*Y&Oz1x`0j%b zVgTcCLv(GgcZNv3fu{!Ims|JE5_R{FJKue3ysJe>dwXFku`ile>c+=%$wckLFhfNz z#ECLop8u43a!AdEk}xw1pc4s@)%2)Cn5&oj^#G*NrxeQ?uM5x2M3FN0{hXf@-fC8W#BzkM5@6qd2%@zTixF9;WFB5AO3LrOvCRO4#;!@$o9^Uic} zJLsJ5xl&1)mC=U%#fp6OtzFQ>s5;FYUIV_bCIt{_nKpA)=8HgvOca~pKF+Rg1V0IB=wdrh7#k~wM}I3-^6G$f`1zN?NVmG8L^yeu(F zWVRBH?X)rb$lf4cVO!ZiP9Gud3X&E1Di)MOb^YSL$=MsFcdDhWFXDTn&T zX4~K+mYh4Yt<_0!^DZL{55xd2^cU ze6=)msZdQFzsdFdBywKR457!5>n)H9a=Y z;B8d8%&x{=CuCcIz;^taA>AR$~B%Po8yc@g4(Xo zn?pP2M0b1P2l)DZnkzm=;e9-28@>n8XdgZ-(B=pt&JTJ;Mj#~~mS;iy&TDi%vEqnq z^Gu*At?Itj66#B5k8)PWC~5w!`V4$?9wEm8#4i;+J4>yEW9T5)#&OP?^M{OSdd)9svz_sNFmcW8s(|!@(hFHzEKL3x(M_|A(F@Ni=jMrPN#54I~8}jo1+&%4?kvZ9gIhn zMn@Lfi3)S0PRl^?nY2yP4EzFT1HX)p9B%OWQQ62)`7G;PW&Ld%SB)ldx|U#|miaqd zs`7ZsaQq2kzwXQ|B*?y+`~k6KH)cg2@CmhjmU0)Cz@j1xD>X?JKhf>XpLG6^v1y9% zdE5WOkngTKS{6F;wym@P;-3m%yqnnR71_Xv^l4inb7k$OMGSiPHRziqG86x9kSD_)z@MtIFFA>$)L6*DK2zyE7W^eVr&Jk0q3J(&KKWhT?16d4qyh z4>VIQRW$}RN`%4_&TQ`o(LYmy3OO`*3+kruJ%ShB+)@jX9(;In6vd=UmTLEo-1ag0 z5NuFgX!4!xagMcBSlkC4SfhJ>AYBCQ;o-sEw}$nndGxh+uI)c<&Ei}NN3QZIZ)rr% zq-PMG+g7<7WPLYupSk+IAj6*zT=t5Dsd4yG6=ISHRHx2xP;1n7$1!$IaNxJ5=ASPp zgX-Yb3CbI1s>Y{3`fAip+!4s}uN`sfRBrn_K(oPcYd46PeoN|tQ$XyAmE95bi}7hu z1;sXSeOn$xfj0(|vBAeC$7gL%cXG~tP@h{$QqTwz;t7~b$R+Ie!?6vkZ2js=-|L@$ z#*5r+-8rEX4!kv*5B;i4?}Z|}(Q2QQa|MJ7T9BQQI{VprRpk!)Tjxj%eqr^jO2p_{ z_}({ui&yLxPhvO?b9B6Cer@@{&b-dY;)_51-)kuSht~gth4}<87KJx-#7lP>Ag8Cb z3BsBx!|!P>d@&r&_(;p<&9#w9N&0(#Is7V|3K|zL;uz7-F4!N>FEkjz-7A)iVa3Tg|^#qJ#)`|V6)W6*wdVq@ndK)=8D3~ zNniz}$K#b2I^p{42+=e1ypZd)-(Z0I3j3cffdD|w6#t_<*}=fqO9|bX=eH%^H-A7| zF=U?elCi&Bu1UvNmRum~BY6E>ILr4MCX=Z9D3aT18a1-90a1E*a3p7S%$IX3eK;vEU;)Va&sqxM zoXXhl%RgmzCQf~^IK01JcUe&I%EQd3w;I=~A5M1K2lolHH!TeBFBb$HKlLK8c<&!s zA5SDZQx8< zHjk=@;$RagrD02Ri1@YX`_@^-+U41+=)ymKH5E1|=%yf70(Ga{pTAKH8`p3$pRM)f zX)x?cu&I#OHDfBfAKkOpi+%Vrb>a`#1wq3}@>lcjXJa8*FDfsQzaIO{W$)q5m|+F; zYBS9_0O*m@TjAH0>n=IoO}9ZQS%j34Whl96(sWp0FY@ql2=RzSSp6sRHjc=#SM)S{ zB4PZKNbHUf4m&fy6Ne*1Y%2Fx0noX^3-Q$TiRy(~!?jSGdaloRrb6s#{1xow6Hh1F zaqF61_v?qp87hD2>x}INKDP}^b$>Pr%=NtWJy0dVc=q(`X({+F^PYcOXsck2z@1)tV!?P|*7J%NyPvKNzB>i~^wTja9(zTV%9w5ll2m=Io}PS3HK;N4cx9+y;Ts&uQ1|Ub z&UzA07Qw!=cXk$+I+sg;QkVKtvV!R5W&?>*Eg{wEi=ASK#aCpDXZAE@dltZ@rLDV< z-e@x)6Gu=WWzupOX}Zz(g;EUSFb$-R$e2EU;By68;j3@iEQa`Q13M~31us+eE56?p zy#0=Df!KjL7t%y%j#+Z9cykRS}?&_o6SwNa&d6i+086+(u5` zTiRJ=eQ6*yWH1V-o9WA1VOi1}PaHr%hh{bD#qR#&!I_ILNDj&kNA|bR)A?<7dMBZO$y@kQL zmhAuXx6T>lWz+0QW^6jPTRYjAHCChhHx|`hzhr0AK9O*VIOsi@T0a#i@bqO#^eeuQ z=GgjqN!HuU^H-UT_QF@Jg2DgsHM7SqCMKo~t~3P$YBzcmi)VkHAhYk`LfC$e#{4)o z1#x|XzgNY18A+WR1GTX2lzmHglhfjS$TE1vyaolbeX?ZaN)-w0C+VX z(Dcn)HCYfCo3>@gAQ{9S(v4vnSbg>9$1X<#x>CWI7aDN~sb|#fWaNJW6;g*CkLB}h z$0$g5>{^Q6>uW8LF}+-Z*zImRRk-l=$U);(IhYN`(Y^P6=D zH4g`H6f*4%+Hc%^*w;E9gv+x)Yp-Nc3!IlQcHw@;5zW)T??%5Bn=Zp%t}LBt8oSsD zMw}Gv*`6^YbM9FGC4`y{zbAzmGTnPzvYYO_=lfft^O(twTz!8_?Ykd$;o4)x1*Y4a zvkd{s?B_dSx}FU$R}NO!wcS2?ttXp3ZceAr!XCA--pL=y3fv3@nNL0QZHPwvD9@r_h#={ zy}858nMHEj21p;~V+-xyxTK53AJjr;Ytm87FsHT#u_n3_5~^ zx06~O>&yER@W;>R@=P6=#ZSezEWVbwjtntzw0xWzM3ZBQk}dbvXN#J>Bb=7j7Q0344hdmQdaL zCvj)8lxu`X=YAQ7vE-Ss zuk=P8KjYe!IUO_Gd(%csacBRBrne4@virV=XNHnakq%KpYAERvr9+TzM7q0S2tlM& zx=~uXn;94+q(Qp7b7%(UH_!L;zSsGCuKV0`uXFY}d#}BgN66LR7{LB{Ca?FT3&3_o zue?y4Qm1C#yj*DYG5mdBDawLiSN~}Z_*{1pAJEDupR***+?vgu>*aii0ly)4w};62 z++&XA9^Y`C6>NO$3M_JgKmJD~xtr05$#x~Y`S^bR)`8i)&D%ie@6Jf!?WZ@jEuH1< ze%txSxx49Hs#{My*mIen_`uLJBx<=MU=I^;n}h#RVjn~RikW)BVBdJ%!teKV9~%b1b_WtAbMx=cX=fC}Y6wp@PNE~iJXYE_?I?xw#Z+VnwU zY>Za7BSAKKKUO$=lAV#kGKDTXFY;dP{jJTZdo_vLaR^B}1|jdI9}*qsvK|WG@R$Ve z6!IADI}vp5q)5sCE1gq`&QdOFuejq#PZ(8~-s_`qRYRtHu(^4juou>^E;vCwo3Jb> z$^4*^ll_>%GrbHAfm#;$o#e&@9i9#hUSqU}n~mqQp_>rs5^#u!F8b9Iu*br&fb|7y zeK&QsGDH$^BzUZUODSXMBo}?nhB}FVc!{uIvFKYK(dMu=Ft9#GTqwUl8`k-djie5; zY?dY2o3R0IrcGQ3-)^WaM)LGl>4nEk@C~6AvoGt|&7(%1!|(yF1$@gW=>V4rOQYJQ z>!U-Lo`-uJ@+`D7b&A4m2tfIjS9o0x>`YY3qt$N2(0JzbEE57$iB=(@7XK zVG0@4ugzhRLSr(&y80BR9e(dGbwcNaA5kCwgyf3cU!=3$e;EpT?k&ivTW&l3_31FS zhSc_FMpXu+-_`ZTm&)|chk-c3k#IqYsUi8$SAZe;Dq8YP148)gD=vYobljwu0i(!) z*z{k+n&Os(jI-Ky5`3?Js2@;wz}VpCr16K}G3INnWR8xJ1Y-i8aq=8~w9t1i#LNBq zZ>iKXd5TZ&j6RQ#^jCb}?Qs!e%(=Be8jn;)b`ii%0~&V8K8f!%6(CRjiWg>e1xZ3s z`)Y{2j<&mBYj@GSIKQ5(7-Hl-Q`}h0=dbMJwOVf}|ESJ^S^vP4*y+S(qy2PqN2TpY z<~1oXZ4id^op${*2aMCcVM{g03L!C&X@b-1SlULr+ySEz4`BIwf^aa-UiF^?x#u!{ zpFr@!r5xY0g(NbT$<+a2khf<<)pvla7KR+xH6V*(L`O~7ZZWUQYs2&2OgNB?J1baQ z3`uW8Rj#>5*QB}-r!otcF7CR*kZ2opMSgw`%~(44a?I_Fj0pne92wC<ImG${ z&JoV+nE&y>73fgu@_y-_J_yUTY3^TfdW*}d7>)90?8xN_2fgr@M-Ayu4tiggkL8MJ4kCglpW0jJ%RB{G=g-7N4+nnBUN|J!NzVl4P{F4c5(d;g zian*;rO7o`CA++48Y}kR@zaddvP_7#n+S}qO+T51W|QtXE_A^KK345+%NDlvI{W*k zOorP)=0;Ba9nQYj;`8?LSgT#_%~0rjtRkHnf-fVUNhmg zdmMLK;vK=c?U<02&L#VtgTGc<2&Ju-#-9W1Spfw09QON*by9AT&WKq`RpskwV6JR8 z8I-L3K?S;>lLOKLq~+)eKQF?;x+(I5OW+?`(5ddpTx^W9(~i?@xJ8HG9Ck7J1@&&RTVHm!ZPh*6-e3aOGMK7pK^Z|;^pk`=V~t^|9)Zklef7O}DctLmRuI)idM zOI^tb0d|jfTYcM~I|0q?5zW9cnzWSInSNP9jRg&5Y)stwyUZU92-TBzCt|qGG*ZIU z+sWL=Ld{^aX1o95Y9#{j$Q3;JrChvu@DMT*%;f}EX# zZTPY*{KN28Atb%n35?e8c!u~o*UtW42!QytDHOgTq_)7uYZ^Gv0~%t;XQ9xf?Zl-!1f z$DL5T-b3yGx%b3a?KEYd)G=br{goD^xu{_rQaAMW9$>N>L=fPpQ>Pp_LapQKQ3&fCF-2rSP{oDe-1NZ3-@*W*p^}bI zNv|A0ZW`S~>OZiJTlb2bRF^yxsd&x?ZRP_jOP+=bHjey;$`9tjv~JN3Va{buSUY7K>+9re~h zp=~!7K5YgoCU)M$#2J^pX77jIGFp5mf3r+$!gR5OlZ{%LcR5}%RKn=2q5giM9B}=2 zyLZ8|q~nf3>+QRfDVKxj(H<#9nW%#H)-#2*g*ai{ zV=vsQ06?XRnrW?j&yckB!#Zlpm=Ev0&Ghn6nE&EKNC^Vf+EvjG+~`)Ud?moQ z+*tZ$A}E~`TOw*r>@SKxbxXpnj0S=zxO)0GrY5t&SbFl;NNglE>Z*^vG%WO&UHo*i zsKiJ^}cyHYVH#n(<34wCX4Ee?@(|5jb zcTzKsCecIbJxHO@p>3o0b!J?HTo7ZPpLcr)tmF(kKLsSTBSDH*lE8F(F}*yFJM zjx^wM)=Z=+K~rG#aW?f}xY?2xH4*fEmPUBP%J}f)y7K7Mxz)Kn^V}2*lBqShqdk%) z#2@f4uY?UT?D4n5TEGR*HIWgN?TkpryFmA}>~yK7etcCu!>Xn6e(+uGV$qC}>cG%o zPZ~w8FPoA8S2iN+Q{qbXjv$zA%K)ySjy_amWqE%nJoJV+|5D1nso!h6Rl7fqHp*C1 zO@879m3pjg$aFk@w}UN`TJ<^gC1~{10`+f%?aN5THR^)BRnMHz0MJqBlz_o#Pj(f; zu5N%RDgd+;XLIA!ngx60$%VezO>e==`B8r=IXObD&oY+McOxP@NL8DUXpr66xWMqO zkHCk-?|8XGL-868II zR+T7BQFO?9TV31o(CEoXHsJO*&+Tl`*W1S;i?w5No;6`&_+H{1Ba+cv-LlnJL~RBd zle;korCnJQ{!{tpPOWrLfQM~pCBbis+Qy(O7XxdZCq(C%LOu$6Vh-j12vsOIpf=*& z`qMV_!YN#HuhW;nrf>DtOy6N)cGfR@0PAE)FO?k7ItBdbv~-uE{g|Q5A1yq18WGGl z>R4B(Z6Sf6OY0IJCCK9}rLD9%jNGyNz2;|V9Vdg|m|f{-N_%B@LhRZ#A6okk3>M7k zm;}v9tEf4(>V|*&V5=tip?s8v-9_G92EKZ39mr~jnL;VFF;g0sFh4#j1#!bBAgh11Zf}!0CynfPo|G&PB_s);TtH;?W?nS!g zG6f9J*h>1FhOPcqs=oc(1vXD1NtCadv7z#c{VciV%4DGw?olI=>Yr+h8`KPO)%+6b zV4in%e=osLaz%BZ*0Zvzad}Xt<>@x_@qNh4T{wYmr2X%qdddjhz9j`;$o~ywbZPd*EzCB_x_tDch zDcV8@1N{9hX%`{A(!?=GVvb6^R(Hd_Ahm~-gf%qVF4xrJZea*{sVVJ!f6aaAo$phm zaO4obvzzm?X^0i$(y#&EwrA4o-8-i=quwL_m^0qA7pIXa8$kt?AazOqDMZzAp-#nN z7$^W~R5z5UJQfc*wettI-T;BwX6@@elOo z*#l6ZQwL}c>RPHIj55yX;E^O;PV%!5o6jSKV8Q@FZ~d-L@K!G@0ZMT<~SR zHW{fpfC4^DcoZNfKgU0OQgqo=@>{mMMm4!KP0XN<9j>JX-ESjbw0WD#-Y>?#wV`@W z;OgR1<#)NSQ)^;-$2R)oN+0G(3UakP^$CCtr(qBXd|2-;2-WblQ&b2{Yu!j)>tQ4C z?b(={o3leFCuW#R0Ejhs)bL$vCo(S(GBeB~B-x~LI<@lg@oxdbohB9j$kq^Qso!W5 zI;Ccbbo7D$jDcGZ>_}`p4&)-05Pc!YzTreR4fQyOr+}goQJS}N@0G7921Z|grR8p( zlN^nm;uW+lnMBwgYQCP*#@n@&ZM`y}#cJWrJAN!SivXCj;=`>{OyZfFE$+bk6S>>k z@!S!&ZXY<;7DgL4J`xM8zRi(n?!spV&<2uVDjJRKDs=H9$yO$+A}mm4=ER(%R^9g+ zs0)qBA;#?lfS+Mt8NfB&{+gmWiSVaq0%(s9B+uYXOyhdxn%M`x@o5xt_$F-Arm}sa zo#S`c@i`Y`p4vg&i+HypB;F?}bRnc(o=Mr-wYNbWaZF^+eN3&n;eaIUV|+@LwI}|L zR)Be8Jsbb{eV_9g4PXA~3tlnLO#ZIxg;hHYo%mQG@)rKdLoQIc=?ICT3`cz`4@;h( z4W7ALCiE#^R-n&~`wzVubnn=n}R++v#mC@sS*=-3y@v7zbY~&0F4z zEWX|YtDpExtYUXQWMOBz3V6etpib~jddswUmzyV`-s@Vh`zfD#BZu7Hc95aKEBeR$ z?xN2@x@YE(Ar}fEN!E|HVcVfLPtn4Yl=hXGj#LQ~}D1odBv>BX{KKZ{Qex#Ge*^#i?avKu}>2o39Op}b0k=Y*}!+;2Z zsEv8yS)JT2@~~Uckeve|H@LtrG-W$LWO0kXGyjD6$_uC#ctUFuvLP`w_S`R$7jc!FK9 zvb?MgCP5p-u3h@4i8xQ6o<+6Pb)wMrAU(6V(12@a!~k2aARQyiBIpYON9woLa%fi$ z03RGLP|6b>)zwJ5c$AYAJbh}g=DiURm?5-+hz-#l%H`Jvu1YwZ6ChsEdhanL7vk98 zIW!BPrA1X8zobLkeYJcC*W_i(A7{RU20zkC!JG_s5if@nTLeJHRiP3-0mbu-B!_pmXY`s1`UwS<2H+F zv|OCr_n8C4vDalBcmAT6jo;mmt|I&ACZ2-}!H};=1LxlideAK0A)mZ59{mkD{{0;qF4v4Dv_Lj@O!W=31g(OD z863V`^h`-*fh3f!fb@-z$ZGmMNu+?zk^ zrLyVy8xb%012^71NVeB4FPhB6Tf(^yol2ukkN3;lj)Be4)*runx7dFzJ+YY=V2(_f zrvTk?kaM*HKA3)7e0{#~QVqd@?5MCwGx!uTwO zzf#&pJ{0lkk>VE~z(zM&j~)!~Wc*8pp^!p30eSZF(1w^H$=y-*%ju(jN7vvf9W;Bb zaWBhdbNZKsLi|oc$j02{leZ(>rqrYwSpxsq?fnPN;uPaa-uy7-7wZ+aaVdMY%uy{w zRTM=YE5%Jh-E_N29i+!%9%xQUHF~;mj-5skhPcts6#q0-*P;iJkl1yxyJ~K1pGAf< z1}#f0x3gTYl63i_4zfG8x2A(%x%{$Ms}ay&z0W39(f3}Cs!zCM|UQV2jLnb|<+pni_`7$mdC%pdE?6+HU`B-EpC&XP5gtqv@6|d&jO_Bpf&%s1FFRp86;*rT&=q!F7vC%^FMd}3bWB2Az;{!@diYWq=6DYr~AaE zS5Ai9Zlx;4X-G^zTI#N-%;5Ql4e&wluaAYJ3^RZuM+-g~XnUk4zaOZ_U}G!-qG@eF z=FO@lFcLXXMS)!j*SEdXvL3SHn0yBg`Mctv)UGqB0Hlec{c_a#M0gb|vU_sG*kpTz zKriAiGtn2H`}x;&3&89ZIynr|-iv7o_Kv2&{?$ZY(tG;&+{C$klZM=&cIy-BIw25u zv$|Br`a8(ve-VhfmD({Td#xo+6t*m1KlS7jjN5eXd-rDodmq;~gv9-lgvafDsrUbC z-YM8N{+g4xI@f}B@UV^!osRsb`i^}c(4_n4CN*;<0GZdqc^z^#JeuLvQT0`mFk{17 z;r5(PB^;Kwe@@)n@hBxYCsev1Je`sea(XYV?v#2p*y10*#tb-(CxJOK6#WgSm0u7V zOLUz+5mkPY-%FBOJlK=PaKks4Aio``^+0h0s51WT>Ypb420sj7H$aEp=OIW*7J_5mI6%JAp)-JsRSK^&Av9+@!!S>IjOZd70ce7`WTB^ zEz&$ESThd@VEe;K-R1^QK$c_4kbpbm!zBkG@Ky3H#tTNu)M+89PWXqO^}a3Mc2+U` zET**ner|RX=)jpyv+lz2}>Clsn8_jTx4R%52-^qVMyI75#0ofaZWEf z$O`^zleM!OC_ICao9GbE6DjPo_J?cE1OVbEeO7CZV{4j@yzO)4BrM}+{}}qHj};A` z#wJ{o_*%P&5b2!^F~QleXQ>K6Rl$%V1*6W_vg)}%MHx2^jFG`fl2@1G^!0e0D)_^{ zwTDq%sR=#pshPP_t(jEU3CA_2RR;OqhXVO*v9cc}@v$Rq+J+V4DHX74g97l@hIQ1dgoQi1~ zocS!j&CrbUWNl%U#$gd)j~+gp6={!rJWmjIW&^I)SRa=SejLhZVF4^o5Is&(VV7t| z=Dk$n8JyrR|2k$%o8*;Co!!bizd9(>4NOqac)rm+7cGd?!P%5Zou@i#PG}jy%%3REx#8clJhcbO&OS=nbN@HiN7>a!&;!Da zjp2ta%2UI6;h}OZHx&E|)CPE6C#w)6qHCSyG2Neb`bKTZtK{mP(^9AEoxNB$S8xWa zRtxy)LD9>&b#CNU6Ld*?R!{n2Ph-X_V_k75$m}MNf=H3O?{_iA_$P%EB>?0sCYptb zuIm(QM?W}fR^og|^3O|RhSPzy0q#4`O!H?Qp+1FX@0aLHolPGPZKUsyM;{MIy-5m^ z%>1#*V$Vd{QiNG2%P8L#Zhdv2J?Q86{O#fTg*yHG2iDjC5@HzAg|yBzu*ltO_x^Dp zq~$%Cpqhd~XQuNb7V)`|%*tu4#9&mcyHB`B+FAO7ot#Qk7O~Ln| zO0Nm)jd48X3FUhc@s$I*-)Dzb&Sf@Ri!5(feJpWRp08Q{ERlSf zO&(t{y{+$*=#L+2f@sjCQPgR*hi83!GyjZ~w-(Z;V#F5yjbr;)#81Lu>lvc>Oz3T9 zg42st1qMD0XN+37&t>AML3%Asp4lsxtAhA;3E4*}cUxm~STwffDXs2k!Oz8#;+1y4 z$!%uqG%AT$yl|%K+6kj|Fa{@r>oYNO&}YM7zK7aIevNaUOBvwHezOwza5-~wK?Iln zSI3riH@gF>yOUe%53pDA?~~T1v9D|=R|uA0qY~>cxS5k~p_e_o?kQDX;=hTJDC>6)fY6Hf{n23t8o0K$@-qBh7{`G6wLmZS`e^|H z>E+bOvF~evOu4Vm@-QOb#L*v!1ER>JR)i#hu$m}7`lv!NPFMSfo#XzC7ge>3@0P)3 z1wYtMx6{LPXz*bT5 z0_|SGk>jTL{dr}Fb!~F-du0qvzoY$2@u}2Lp~-J|pvXa}V~%9NH1akVb^Fh?3;-4? zb+&&?yw@lxF;CQbGhFizgTKrDi|D4 z7;(8gXsyGblKykq$ixNbNB`L-)cB^`tp(hBvw51OMc-<$|2rI5g&QR`Jg&8$tm;_ziuls%?7SAT4W>7%Mh9cT~DY-Ep&iG`EWQE{g&~+J5+514|Ue5~ZSNX1a&v>G8 z$=fAo`bJsAqeGw$1-*%Z+Nz(It}>hWykHQ@(^{SQ0I95HVh*ejbv$-7?#HWD?Y4epVMzJx1pAK@=-$oL4v&#{Tjk9HLbePCztM!A zO6q34;Vl%T*U1mmTKxWpij1ilUtvO6BH(cyzVdjq(lOCVR! zH~0)+OY1IuRS#(Xq)TIK$_^q}DMij*eVL(cb$oZMwD!%LPTWn!^2f2r3H)Qnfe!f1+>6tylA z<>tb^I2n)<`>CkL{q6KiiFbRt=4`&0-#8B?e?w%Ac)sqZ&+RQaC`1YXdm~nlBf6Tg zpf-FC7WO%|Yg^@P7G!`6zbiOAPTa?|qH>q1T2Ye{Ay}+f#8Zx|bCf9yq|u-2pVw+* zoX@Wc-tn#s-R%p69yPl z+j^VYcl=}H+}xX3C6lGt?nW1-!B(60jtklu85~1B6ngH2+Hpl8-pI?t| z1Ijw%r4-E{DVpscj``PV0~O`;*X2urpG0jmeSlp1yNt9^Tz3=!B&C*QlN!?{Z zHAkP6+!1G35s8zpo2wl9-%ybYrD~%(yX$)$cZA>CZ>QA9#SI{dUK@pP^q})Z=Fg+w z4yRD7k+#UU=;Lh`jRH9zyDyBN#TXBFXyu`Y`D;913KpGQqrm8V$f8AFUOE+&uLK0) z&^(gDv&G=bG~bFs4wwy!ebh-yq;(A8zm1IQsEM<% zx@I+O;KX``9`YaZ@BsOC9{F-2dOt=sO@&_h;##mTQ$CBt)*b!-X08bA4MGYU*iuIjHSKGDBuDqTLDM>xstx}=2*_`++B zZW=M-SK1q0cEeBSza92-2>8B!D6Fjxgnv*gltB+zLmot4LCsUJlY6&U4HK}!sJ=%9 zEM`ErWVmwEysaWJiFAovj^WFWffo&0+DuM%iJs_F@?s+jHDZbAW6gs8dy!XIJQ!H= z2oFBg2WEXN$cOJI?k^+fJg~|LyCIDCY7Q%AM)p@14Z`tf=N*U~TvmHENVtS0W6Q#F z`wT92nj7u6+WnAlFCT#C=S1f)hVCgHj`!%{%FQvBeL8H|k0yyJ*QikC%0piCH+9@T ziZFg$yDCA~M1<~||3r5Rcm8%UEjRss;1Q)W@T;>tRSai8#6(G~f_1Z=-kyqQs_Or~ z;wrxu`u`@k$Lh7%c1usk5ZTxIBEM3vz7io1@V(g8tZQsc!34Pai1t36vqEYyjv7o~ zK*h(83om0O0{zkZpU*Bt9tOnroSy`l9`pa|>!fUpO6`1pvdB6=IcED@Yz~U~|7!t! zqxtziVlu4mn+W7k~}_yDbK}7_%86%1VI*NuF>EG({5?e z|NRIZ8~nBM>;aVq9fn%lgBAw|2Z#Uu{W~j3@UpU?r3^pRJ7)0n-_x?K zoJQ7GA>RgNgPID867)z*LGxy)hZBNZSNnM zp3GiX`cvu0b8m#FL*ea8$V24-BaW(4z@gx|-OR}q90s_orLK0- zv7Am=#SkR2D&JuMG*(0gGqb!;qeNKP@fMH>P5y725h#Qm(yghEw@AR!-(^Op=&$X} zdF_QzFRu1(Tn4*>X3o>GG|rIQWdUWw;YMY{Hcc}bO#utT_e-92&W52lDG5h?oe+kL z&(XzLbTb6PRGtZHQBXNctQEUY*P!mnF9i=kN%jtk7rU(cpRbJJ6IXA_%Ko<~136%6 zn>F~?$len4GH+w8+g~y_aSA?}her_frOS`8Pr`3n9umAltdWN}s{sJh>zyFOOQ_qb z2SAK;*0GZ3K=}a+7l3dG9N9Q@^r4)a{3Ti1Jwh~x*Ydvy82^W1(#=RsB1;$?DGw3R zbHN05V)pw(u>jNeCyOnUHe0VaUY#4QZVyXlm+bF^ye;AUf zAho^Slj-5{n@{6_#So6z72RVfzyB5U?|GP=;!>daNd@cA4KuU<;hQH66su%M$KrwA zWVH$yX5NB86<8Tge3l`e(aU&XIb!)H=<56O3Y50C zGqOIT)bJYGDa27sWBNaY{-h`Y!JeGMxuW<~kvwITfc9C;-Quhx^4H}O@UJJnJZ#0l z$NbUP8N@hhh-V=Wzx}Q(#FvQDeC?ww8p$7kowN)X#aOX0K=?7v;^Y%5^%st7)an+A zy&<2kF?RsZ$=7FA|A&RT0)XX@KDk8%Z9X~%q+Gtnauk^3_(c@AegVEmm#~D18KqS1 zLzdA}rI`^xvW!wqd6aDemN6q^KWKYc&9i$kuVD$akS)z@BRwcSE}nh=oM@}9nO3Uj2p`6{1*Ul z*2>N;DYu?|@fzMFNhm|rfdy<+vH?OwFInsWo@Fu~M!9&)%QHFQgTJvA1%f@of0ln_ zSE^*?q%%xf%ZYxGel+O5gmyA%2^ydFbZEQ}Zc%w(Q$~>%24d(f`Xc6#^c$F#{4rHT zYABNsQfTp7I*yrJ;fbF<9@ui%l;PrL`Xj>C>*wugaQ&QwA9MzJuwxWGMYK7-RnS7Z zu#n+Bx|;o1e~r^~jpbkVDTyToqv+^e?--Q{Bdq~9ZiM5%{$pFlu}F7IGc59Ecm7Wn zN-EmDCSLTpRh@WNB_g_b#u8ZQ&w1wMYENM9POxcwe~&K8U2p@C`jn?MQt1Rn8$0oU zbr_W*YI`{I$_PZq@<}7qh4QV)?EJhv(F-Q769yrNsJ=KU%2_&0X;ClHZ4iVU@03px z{P^eH72l~4e2?m0$0D?DQn`C=Ei^v*I9e);Qq*25@Mf$%xZ+N?L+f~tT`*t-p$@DB z-(6lB4fk#@c}{#z(5a}Xw4*-suB(>_3L2$t!mH9UU#7_G2r$m@k*@fU#vI01WI&$$ zO=K_v^BDyJTCBXoA^3LCj8&e928=Ek&J8Ju%mdS!8$b~?Zr==~f~(A+&N&i(KaNS6 zhS_ohCy=`e(#md66hwT{bc|MqRgan&g~766GhSrDt!w+DV=?VbFGVNZ1RdB#mGoG~ zQZc)Rs1I@Bu){MJdKygY zTY{4RYNpQc3JX}mg$kb83}o;sX-PhlcwspgHl3^T1{lGq1PaJWtXtEec zD9S;wKT`+kTdIBe`R6cX1&~RON|FE&vY2L(odISrR7RpQYHsqvT|WZch{3Y9IiNAtns-T!t4S_k3P&|-f^_Mq>sL^FO>06%#y%b)|x?&rOQ8N4Gs*wlQduZ95q&yn&boAeUY@pR1b`7DYzTAjf$gCQ zUcs2a?!7cF3?_DPnF3&y9y@>UfP>Y1S~*!FjcGgfZx zt8V`gS7oC1Tzp<&_WXdWeg>Zmkbk)n6314@FR)M$tta(x4$kF3Jg@!h$4$6pA0z)D z!+wRm8EPCq7n3v9QOrbjWUre@rJ;^9xnr;?2uPJ)b4hEo8P4lH$p=^hH{gB5jG2tV z_u3mU@8^8MQSs(ybn6^JXvhBTV+Hm;~kh@qmby7a~%JTHM*>{Gb++G}^ z963yY9ljaVFPW9BjI(UGI5+sWD=+oMexRqb&}RF8Ck8~(4fWPeJl+Ruj9hBbp>~4s zIROM)Jmb1KGJX{XQxzi~YwVDap<5@%VRa4gD!oOHxFc4AYs;#zj|EW&_W?@euHaDS zg4n@aB9!el_NEBhq4L`@-jf@d+oaoAcb{{{r$_d8EKI$11=NVIJRXKdmIJ%GMk{s6 zF+yvKq(|Y`hvUFa>u=V3_Pp(r-Y~X#1GcU-z4Kp3aeV;*bcoI`uMpSa}5dQG5&y~?W1onLdld-Ni;^J#!REj8*wrm#Gf3bj4 zy91C$@GJ1D2}ud~9W=Tv8~rjAin>MxBW`zc*+LEju8#{P0iM%n!;Y6~0K>3KX1eVJ zY(OS3?V_SOPxhl_P{r-u4sixr28ZEDMULrcl~yoIkS)ef=2*(0{Z30@vx& z7}uww;nJjX$@y8;Bd=+pkLU8ROBzIlQER1P)^_|=Ete7rgk^lYx=fTBE03{HzDc`J z!Jc>M!mK^;rzLE3a*uQ$(w7NxLvXm?Wn5bqp!p0K@rI0SWrSMk-i;bWrK$#4kRLR9 z|I~K!>ylSMdF%u?LpQiKFywj+?*vX56_O8pa-PPN2^77Twx`6QW1z)$jvyisXpL*5 z9oCzdJ7wVuN1gc)XX+V64Wp2HE}44b3d6h?SY71lBe8)=@_EHyS!LPA38961W#PK+ZSKI@jP>+C3@#b~IKsT&s)O!&1+edj=8@M#8B>$N%5-@?9s70qAx z0A_bn#uT}~56E~3dB3nu*%>U?uJ5m}Je2F*nBjc1;3#!}_yHGieNV1>>&=yncnr19 z{*dFCY>kD9(tL^R!2O-e;3FcE%_q@6m}wkWvUg2ow&2ulE?(up(~3?E<&;7#xN#q72{jlygGJ4A-K?#a%vpjp ze+j0EoY5U(y-sd$JugY-S7Onn<)0W=k>LM3MY!tDW;xo+vrD{DuM4x-aGK}ogI-;E z{}?V8w_YCe{Wb!|QLQJ$H2(&8)~S}~v4P{pVm0Tj6^1K)!D0Tk)pnuA&WR)nH_zTR z3M4z3mIqcklUqWVJ1!jgtDhkIH;q7>G|R8G3ho53utp+-|GN|Wi-j`&TH_IiRTqrA zVauKFyjns_=`dHMPyC$qjQX41Ag~&*EdJ!k{stDCs(bNd3AI^v-^#REa@%L-BzS@* zmxbK^$C#h)>}2)r?f|leQhPHXytXZNo%RVs583nKwXPhV_&NK=rggyq$NJHy%TYPV-MXM)OVdT~-nV=B z88ohDzi&H+zE*kUV7cr7=`RbaxN99fOKghvBp$#CxxYzK)PU~0^DN60^uUCXo^AGez!MNS$a_!Vo2edow^ov~PI%vM>>uI|gTwcdM=~J|`NXYU zg2c;5LJJd5cHv>M&ua6(=hl}d+E6i3eRUM~*i{@HP>^r_3w(I1Sd5{a6}&RARRTk>ycB##-fxokG$X7))cge3u*iA+ZGDPw zw7&`3wR6f3`@f4PHHjCUB8~5DY)rsW_rEo2&*O3)VbrB?uHr+$EON5yM43s%{&AF1 z>NRg6=?yeD#I|uxEDJk_nw@FZE^rN}iQ)WQ0DKb*QVXNCCR?&*_jvB6oD{7(ZxFia zWi>NZK49dj@K4XTjt|T&Sm-T76T#5kPuylT&$7y{+@k}cD)98OQyq zxZc3OfE~WL`5`v`6kqH>I$4zO3MTxA**KWeJig$MsG`H$^F;H;;<)Vl*5y=Q1$P{P z9uoUS@o`gVV()9$XIXNEb5q~fv$L1#BOrM*G-DGi<1(hWZ4oM5YnL0dMJ=WAOd3fH z!lPNLPXXI+`|Y~M*8bYed(J#Jb#A6H&3GE8j6d;2qBGy6xr$+zjCo1B+4W!G)tYWy znMqjHgl4Vnft|UGe_r$AG z&E|JSFA0?on!NHeJD=Z}IqzP{s*ya>9`Q?!`NLM)$6pF$_#s281iu_?*SM@Wu>LFz zJ6U#+|7DPsiih{b?!(%5Z0n!_nPu=p_eBTABmItBKzSbdd$Rxv5M$$?e@=4+ANxkTEAPesw!;Kt1>I3<^}YCa1rn2w8cwhU6fB&udZ7t^hsWz48|d`tf@iyb|pMe(5ACIuJk zQ-jtT&-P)iD;)tV5|c}K0o@3aP;=$LF6uOJpw##F@=;a~(a~_6Yp-Yhmh>}i$#s#ia&4W z1kD?`vJv>~-ybynxe!j4zE0*6HVeMB@;JEiudAhgqe3rE&XL%=r}$RoLG4Jqq2h_y zrOQ)*x>|Q4keyaIn}ZN!#VblZ%bEO@-@^^RES8f-20qrEkhvminh2;~Y@eIiRtmCm zH44WLz%qXfAR}qqOsTU%Eb``A6t%EiK`TQ`a#_Z`R^P)ITz+GlO9b(FlpKsS5Rkun z7*dNWscvZ?*~TW912Dz5;ZFozS>mA+=6ssktBd(HRg>aip|n?Zx)f>(VryinT%qsG zNzidrA=GDujW7eZ9snN4z=bkO1=}un1ZAEo0A%v{2s<~i7LA&w>ql+nKr+UJ@l39$ zN69xE8%njrIt>oYf?L-Xzd)Zi3)=~h5tdI zD0XKWN4xKzUtqKUKbFojkj?jf`$?>rv070h)NYN~dzBisOIy?kDyY4w6`Pu^y{Xxy z6g5kXQhVFgH#Q%DCR78!R+4bj> zN4lS(uU<+bIpff@pa~IIV-u%pwyIjqQM2vb2yQ((Sz`?ad-}g3n~`0MU`#=nQp1DT zuo`=@`J;Rw>NDr-Hb4M{xY(csUT#^9#gHAJ$!05EUD>9fMgzdcGu*%0j6dbwr$|bk zh5#2N`W_nGJic?eIclRm4pA!narhf_We!d}oZhy(VhFew zk#HX<@h#74AI!V}i<+)MR#-apHBGZAm^bsKhz0x}L|=zP>Y4(s&FUf$ZKVxCU$?!6 zHBkb2^D2J9?{0Db>4e!-#_{o~No%3!_lO_a3dF}xMJvIg<(|@ymfy(SYAU5QyWJBQ z7NtVD1@X0Qqzw?wTx6Wey_ZWoT~+>Xxr+WP7VuCC1tY}gzY}aHBH8{}hK*{^0qj8s z3TA`VUTYfRqG3O(58m~>c3ISsxqv(>SLgv}c))Zg!rd?PCuG%V7L#Aqh zqd|w+S~e}Va%$fb02SXKJ1nSy6=*2iK(LzVoE;uVY8KG3-dxXa%t&j6MLsfi3Je+o zEZ!Us!b)@Yy~V1BwaHRt@k|mLd4WKQy~d$^%mvH$!@IRtEq1@;oa~kt6peE)Scw6G zJPKe1LyKQzf&6%Nv2C?Q59=P9FmAI0Ks^l;|LE-zbzs2PD}H=GJC7Ht2Bi+`R#zuI z=1+3xcZJSN0e1$WZFmKtLlvp$h3SpWaQoJfGkvo{MNhF zNI4f01x=9|JTh%1+h5*}^J&=sW@9e{4Ta+|_S=}^t z{q5)+n@o2!9%tNNPMv*Hrz_M-M#vcZrDY7R{YUL`ANJN91(gPMHy^0?CDS+BxE>Li z!Hpc>-iyzE0>*|rTZZY0Ew%aw!>q!7tZ=a4haoUG7l|axKdrh{6y(O*>8>sH5w`Gm z%a9}*x$k{Ez>!2Qs}wEb!N6a5ujZ*oKF1Da$e@(y-*Kh_{@Of+g&Pkac3bCw3=M8O ziXHfVzl(PIMmj?9qCivT_@N4J7xJ{52Q$A}s&b~5|@lNaftZTJg^h_t4JwiG*rNk_ohNpbo{hdma^Y&ky04M`$Qdj{(7cA4?4ut&WDnL!tjyY>#l?yO~ZFdqDTB$48s3*nu3%Vk_=_VbOAs2APPArBwUFmjy(L6;2{QkF8#GeF; zOsM$tW{pe!((X9nb{O`)QeN$HR8>Rit%9!36lp`CgyZMGp07H84?F!W`Sk&u;sH1= z{O{5b@BIN+NpLo zst#u{)xC-Fq9S`Vwwc&*?d-HECJz-cU&5Y@4vvURMtpDxxG~)-wFM!r;09NG70bk( zPmSlPXg6lzQc#v_Ac)THi;(`)#|33P%zl6obk$mOtbm2o^;KB?bbalD7+ER)ttzQuR=?`vIM+sbVytb9@1l%Qgud5GnESUR zOMI_~D7!#3i(**nV7RJ419Qz`hIk3sQjVLRrYjJ6nF0h}ul# zh+dmgx-(jjO!EHmN$@Deze$M{0q?F5jPB%(t6bwpo^Wf=B(VH@E`4vQ@(gxpNIeu3 zxN)7qz!mmPoVlsX=R=5Z65XI~Apj~=*GX-Kfk4N$Ly|{Q*|e`56e4VL}14$aaEa>;yi`Yh4`>9)%E zPAL(g!oFd;ze)#X_xJ6hg%@Y#t8D1IKn7sVPlX4WI*run_SP&igZ>0XxIK>&TY>AS zx?bzeMVGu2!|!5uU5Ur6DB${+Onxn_lOJ?W25osvnU?YL!5W5fye}LyB)aCnobE6P zV1{l6AF7y=YcP3s&D}I!A++Fr_<+6BpxdS5^4@?_DWn&ZI6z1@0zj#HO!-rCP1EjV3ts*`d(`g89Z2BuNm1p9#8P}Q@~)}qZa^)u3y0R z{XGd}ei>4VB)wpk^TlQ^#j`liRqjN5NwJwfxAf3Q+q-^^CVv{U@bRGP-6$TmC*HQe zPYZwMF0y8ny8}o(+Z{$d(v<3%{P|Gw2f0F;7F!dOfa4tS0mSVWJHES=o)=xIRRRdqo@9_O)O@t7? z3VD_|uJsLfey@#sC4?Q(`nd-X0~(N*)7B}{f=iy}sc+w1?)gCVuaf4r+0N4V|3w$$I}yuR zGMRx?Fb@8eTBnmIi|F@!B(LBmv?zM)29e*rGN8a2v?oeVMv0W9NPA8~4e&Ta?qn8fxkXXW9j%NJ`&$iyoK44u`X= zo2)406UhjBMxK;aOSYY1FRQAnnD#my(rpYG@QU8GT*+ukjZNZ)sN;flke(ocb89}P zs2U34WNfj{!Rkh#;HD>t@RWRX>6gMm_N$FI z^wj!md*Mfwfe0uYG;abWJoiR~Z!UdyqSyx8%vV0Fqg^M7SM7dgB z3mfvctBtTD=Nq!Av074z4`>x7%+Lg+ngVu0hNYnR#EbShTKRm&)D&&hB6eIE{h{h6 z+d)CC{yPph;dG1rQB7vTSpCf!Rr9)lNijX@R^)+A+MiQWy!F8bNTiN^(x}L(G+$HJ z1IUBS_~Rl)+?uT3PgQ}?^^lQbdE4bS30FUe+;kUyDVhRG0fo{=ky~0OK3`~;vGTqu zV_MGreI_h5;=&W31}LF7paQ^8%*9wA`gDvao~*itx`Cnpp8vI$2C;j*^jPIHmg@}T zASQtCQN9FCQk%iIlN*m>$>X!TxhU2TA)ciQnWx(yS>~r-3^Es{r0Cu#m0Eqje*EfL ze$!t(MZ9#JYh6U^9$=vI-cSL(4B`Sx2!yuexhoeVU+}nC^T7G;NKWNL#7kY$cVV0_ z-j$tNY>g(Nnj2dZ4w$R%(zVW!+l4GoncG-#EJhNwd(;3CjYtc&i%^Ctf0xsej=J?c znI|Nh#Q1$H#p6S6iqtCil_;N}6%~TJ@rZyZ4sbk~+cHFVN*dwg6ZWI&OZ|uc>ORSr zetilauj-3@(&g=aZ|?*4)9h|wKT)H+CE^PGAGc0iV_5kjp2=AL9Ifg`MgZ?l3{Bm^ z$DfL~?JRHJ@EKcv>}%%wx}UMRzt@@J8|JXzv@VoqM2^k!^wDO*Pm1RVexAPHRwPeJ zQLYXcmd@i}b9S|34dB0cY}#^tu*ent!Mzl)ARN_5VJV4Pj-Qv^zpbmFOp9WT^&hKQ zYSeHb8T+8HtAz*x!NwKY05W^0Hqj`TRPf$>OO{+S-nXZJjK-Pq+jrX+PDj448%2ci z$MSz`Cfn{cBuV%B)uoavS3v?89o;ezq$k^$^1oOvl)LOUmLHJ^0YU&di9~mAagtKT zpl9CV;q8`nab}^7nU}gO!}rR;>b*892cr`Z`ymsjc4~AmRIraJf`X)wtWS9CraFQ^ zu!G=xLCb@I0~Mg%jn&J5vQeVHe_HIh13}QuxvIV z`PI-+E_Ar~DRiy2<;L;2HmKJu9HRbrYHm(_)5=_-s5f8#_Mfl|%Xj>PtIh=M{PmQ! zzc}V_dC&vWrc(`B)RszX2|>8L7H1$yE7!AodN?{M5XaVPx9g;R8t{Mw|DKY&j26~z z8P`=ee%8;*Tm>9+lQAQS5^YRu6L?D~8~N!4WeUjV8St?B%?4Xv)G~dJb%*fit~xO* z{A6BL33|^`lab<^qWm&+Cgj`9tF;lUH+(O4E{zPwR73GY1Q&0vy)$VKT=Ps@!z$S% zlznqvXG{Wn34J9i>6rQPLDfLlH}E|r45xzF^SvKGRTW_Kl4A#X18WcxfT_>v4Njv; z0$4ZsA?O~}D>fjxooQN(PAOJMux@v_i4~v_UUvFthzHAaYS0z&YPV_|N-J8j31wEr zj?kTZ6byYFJFsxG!$%lFh@RA*7i^>(K~G4YH|dc1Obj zjvTirBP-+glzr7YDEp`cP)oApFpmaTfWqgN$qbyPK%#V}I7w)`6z}2gwXD>B)Q6R9 zm#kM}eNx&s4Q#sSrbE3lJDvPVfDau0&Fjt|?n0imlzol*K#bOk z3EF(Wly|%G`1@+rAclMH6}r-*lML~bC^!im=4uY;VhQ*rkLKDEfRY zr4Ul8-?TGhr5uC;6U05|cmBStr7ud7eVXj#^KmEUpjnPTNGj0oiU`w($WG5NlTJudOny3duqarnP5wE(Uc@PaaB>7g44cVBGv73Fw*1Jks_REkq zTT=Ml3nq7~AJUU26u*YdEcvJF3$t7(@ex;9S>82!x9XV|S&C^THmBr*i{vXqF zZoznidGb08@29uX&+!;;-bD}-X+TU~7B$hXul7zwhEe|fQW$C;bhErRstU=Rtvxzi z{&-tA>Q~$LPEym$8XBSBmX}@E$<2d)-cLV-v%PbC7@Uez&W+zyqd^0dOSM(@s+bc8 z>TK`%7o+L*0V=dNVa=ebB+&`VuDqM@P1iK}ZOl|3&In;+1sZ&jbE%q>C-;=sM0dYd z;;TfRWIV3KSTIyI{wVIp}>;BB=e@O zTvT{?0uP0c>x1a(^kfR?=J(rwwEtBn+4h-=(XHHs6}qFvgO*>GODOyYE=(47pgl6# zp1a$xw~hsj)Yo0>(+*wQ{dXhdDw&*D1<1%b34)f}r51BpfNw5%$TwFM7|_--bs5EZ zDO3?7FU#`2{wTdI$Bvy^qchwd1>F|)=Ky0XP#0y}4Q73)FrUzs1qQ;xDyUnqtDl&8>8k+q{zw~wc0A*S)X=ZEX z0vvpn(T104QPBul<~98TIb56dMESV)H`z*h-ju~#p!|m+5%n$AKc)q@ujdFyzS2PT z7)N7F>fF*qFXPBf69udy#x(@x>9mq!0ufV(n-+GL#e1p@x+8l~iVUwScWOWZLc>uK zKj~yu?vj`P=beS3wYk>hwQ&qIDVm^v#XAX!awfoO2tC4Z^M>o@Y(J5?Pg>Ip0rg*O1dt*{RDG?1f{80itrn$T^}$HR=M zRWl0RXPr$C-o<_D3Vvp>j3g*IhqHL#6FwCS7pz!ZtBh706PCgHS;Xt_COv1dr4N+~ zy%xdqHzKP0%y2!;9IgZQDLZ!lVb5gx#ckrZh0kVcV?j5wW0PoU;LFnxSp&gjvUeWfxPsM+v@LMwnrvxDY2%1`)Q;2 zB((#uimRzSx1U!7h!|zD2^33s&xWPY=~urZtXM2gp&Gzio`)%WmC+?6jQw^c&&=5R zp9C95nrO5Ea-zQ|TO#8iz+h=$r(lQOQ6_tKA1H{Mm(}UTV#R?GMn^waNLyTfepFxO z*YhQoDU$o)ec~v2&5vhLMkwCDWK+hKMxV5XU;aX)0xW{C!c4gs&gYs|#H0Hr1+`I!#KxmKvD7k5N%t zi{c=lG5G5(4moFiWzHY_-?F1R(*6x`(mhc4bXGl#=(bc8Ok1dFnJT=}${QT%fiWuS z(n>${mRQY76Le^2lV@n-wtp{Ntx2ZL+|=-^z~K6XmU~l%!kB(=Z-kR?zg_cUbj{Wr zJOUR?#s8%Bv7}}HLKt0XMq%}d?;6Svs+|>qzxTJ(__GanxWZh z>7Yl{2|3oJFzgJJx%az;JBlL2(Fb@zWUD)@_cPcH+*{c5#C{}Op6I9uKGjVf$p)JL zkP*W?9-ODC_BzOSTzr_n%{Q)RD_YGvgfvD9fs3y+KPhPZRi`Q?!C9>h-bk6UdutN% zBU$=R8YAMpW}Jcfgey^ta8~qz5i-4_D7qKb&2Lf8@l;8#BmpQ9PfOKxsV6q^%4jA% zGS~@uRF|>pLQCQgU%}&RC6ZqTmXDjjNZv3*^Tx(Se^nDq{BT}qPC6T|(3eBzX8R=w zA1BK}<%kGFr(1lF8!pFx1b*K}nU~6;2^+`*KBalSTVl~2$~AnJDbe@niKUwn_q}I5 zel64Y%;1j3n4gH@()tx5Nb`J`)mr)lre;+BjK?-1@l3oz6M6wgkuij+`9;rcvdjsdo5)lzLc^U~ypDAKqvSJsI40XFufzIVZc3@}l@M+;{Yk-VB^9c)+kPC5ahHFu(> zvDM`P_ZXElW%V|n&pmnwI%6U>*(pG{wGwKIaM2PUK+=%Vj7*!)5Jqni>}2InpgdBT_4nu%N&EKwNq&fPcr zE91>ewE0YY6<-6R={@_V(mb=B1`Xg%u?ndjy5GjM8}8#uMJKEu)*~w$BlWBETYzV{09fU!5;}U8 z3~>}_P4hF4jn^k??viiq_HCEIOE>_iwyDG5BE5ukt>6-dwrg%i!v`#T^JYcsNQJ8> z(|HYcJPSX?t}27w)T{h9h-SO~*5=jrMix`1*CgY;@4Y46w;)k`OwBz!5JrlS@(LzK)HUJZ)wEdXyAWtZL_DAJ!Yq7!=o$d6zunBlmLaV^`t-X zm5Oc=SLcVr-cG=T{eOdD23Yu;qs3}aTX%3O{Yxst6CJ;~kzwhHuJhBT3Bk@Z0W(pU zXQ}*dM&pgVT5*Cx=o2#zXk2*DFD_(5u{0o`*tgl|@|o`mX*VIjzd00@8sDtQd|p$O zCPy5rVz!!qedqgxLBL%3s;1hc?KhrayG?YwEO^gqfDfO)=Xht@o$p?=j)>_bbz98( z)(=~!Fo^FDQmzdxv)USYVr<=y)`w3ZOZ{G++eou9ToKg7?MsY-PYI%pI0mogaIi7` z((qt6&5g;HTTj13%21{(5IrTFEPa(1Bp!M{Cl8+fSo6MkU=bIj9VOV_L{2KxBTHOV z$wS|C43|T0I83~|Ildo;CqtL?jt01hLV8BKVZ)cY&5!|YeU1URP;w36Z z{(kbvlOl(|e%2gk?EaUl`$f^fHXJQZZiE@f(-fu4hdXAlC)(??Fwhqa-UjXvP5m>- z8>v&62k#F}Nl3^i(1G`PquH-GXP%hz@z_Qo=-2n=$afcgq1Vjp{=pDX*O5?{2v-f! zx|i^dt^JogNrqQ9*{v^K{xfkB=Oncfh%*V2KeId%qR_XFxAB&B9^quD~wu`UfT@)q>P2a0t_m$Iw)ccs~k@BS$WC~226DJp{w7kldae26*3=;?w&LG^E@ zLomesr()_^mRMm4z1X$BC7u7y66CL{!-U4$>$x$N+HnE7XSUYn8f{M;#k^r`!r@Fe zIh7g}chXuS9E|HvYtPy-A$U8fb<$Yv@AN5rEYPfBmgkW#t5^~pv1D=u<<&g#2MIq{ z&K@um9k-M$26;S1n!_h-}F&%Z`Z;-Njptb;+8^Sf=~;C-w{Vj&WB5-?@%r8Adr#Mi&%ZU~&$4|cZ<()^ z$0qt#LI|`5^1S+eZ;F1VF^r#ecJ3AxkZ?Xuso&#Kh|_Kioo-c#hWU{#8!|rN+Y?0b zd}2b}J&~77a%CmF$d_yJ-2Qd-@I-;MRXRWzdAE~-P!IVHxR^6b_(4-5>i+^LvNbnF z(|2w7_ZgQOVk^zu|1f;R-&}%OUFlrA;^GSe7ZSx7Fi}bsMxB0`q}hb`h?6{)p0R6X zQ6$7)|CW^^v19k)$ij~KXxo{8nH~-vzp19$_&#DF?imH)d*dAM^v7G`=>nbB?Q0e+ zRsf!xXnSP;mAuVe8H_u+r)Hi+b|FPBv}b4k)+no&1gEtmb?8J|`B{I1Wmo@+G9GBZ}Z zQ669s;Uny@9^HEO_PW|PEVy55ulPdb^zr=u+a#tgTAJ_4Zxjz-BF-A@gM2R)K<#sD zqdIm!T#r!2k~7ZL=lSYAwo4F@A9y9t|42>PgDJ(JxopfA@&|kdH9nW*S;`pzs zA*VeC3I}E;LqEw?rC&H>K9rN+=O-?8TFSb}wfnHKD3wXWgd3Z2Ju&lwd#I#83MD0@ zPLleBMdU*rgx$Q&!U%;uu{%1(Sb7s)cFd&c#dKcNZ}nlaT%!jUfXJr5u+9Mhx&Jyb z*+^n89DB%CJ{NXew5=+tWYI55fACiFC0+Yf;6sv?FHYli^?@b}iA^@|K&b7g2K7md z6!qcthy)_}`(Lt%v9BUP!Q~gPOBwXM$*prmHd8Sa#U~J{(BJ>AHv|Torm8R~M~i>P*7yULl{Sj!NS{g3SJYH<_|uxo z%jn^BV?}j4o&e6iJZF5DQeb9vfB$tufPl6bZvJCTB7&zNpLiBJi(g~z7HgrN_%Q6u z(p@R-0S{~=1`{#?QChgY_%JHLaogTnLLrqb1pvSY)Rh$tjtXukL)B&YB$s7@PsGu@~MaCB% zyU{RVc=t92P{1O_C`_L(5Z^9;@WM1I@bevKX7FRH1R>C8`YlTbs<#-!|L_I8zDP*+ zn4KNg#u`zLOt0IFD!XT7B_4|1`ud~D3oAm--(istADBW;)XBDY?Mj4MRT#Cf-;@an zO8its8G$a_8GX_>k15P-0X{?&lVr!AUn2R#-1`M8l!_N-Mbw}XA~Kk07c?dm(JBPQ zlb>w3a<8;eI}7WLyP^^tXQx&QD!W?Jl=l2tZtp8DCN^p;cDg2px4W!)`Nd$ZQiVLU z$vZ)K;j$6R^_itr%MpSs=nc?a-`|qMhKJ`M6rPJ5Uz$MKF6QcK*87yC6I=KSw%@kq z9ramqGt~JJlMpsHH%~aI?e1mVHB5BrU*qYta>)rF)X8Hc=3-jPMg4HD4oByp5t%@2 zMo(*UwyUL7QAo4amJP2`Md7>#C@ahVH5x>jNx0i*W0Oa%NHmC}gUZ5#D`Q^1DT_P` zIGg7B;#>`m+?=tBXBy4xz1nZ%j6GbAzmn{w22(XTJ8V2a5-WEns*2kDFFrvsdQbol z%8K`q9FNp~2Z;&0X@y}GEz_B^nI`vt9ePW3RhmEWIBi3%0sjSdxUNSY(hNvLF8(vx zzFnX{@yWg)+=}pTziI2Ap-T@EjTC{a#zX8 z0YYMO%3n;>QfQAccOpH=LHee8=Er;*xaq9MAZa*Zy9yZ7I@FqBZN+9GT(yQLRh*be z2>iprxAzVx0+hO8oFv;`^V3X?8S7L1Oy5f^#Tgmm@T20`l?(#vbDOF+V4jDe#EZ#Ng~)E zY`>t0LXWM9+=Nrf8AH~Wr5xaR^2lY4t5npim2t~?th<9;AxP3l!S_=Dvz=M%Xg;=?ZIv1Z{0zfneYEc;8sCSN91X0`J`$9vZp9klu+UU`bj2f`2YATLT znMalCj0ANIysgv>2vC9@k}>)G?U|~~$aho7+=y+gLzW#RW?N)*3axmvcSBHQ(K!$c z>(rF6kUL)pSHJDB?v&F6vjo=in#v2nD4j1x`)is9<3OJzg|(6BmwxWwVvV@A7u(5% z2kWHew_*m*nbjY=a1vsNBxo;!>3os*CwMp76>SOri6j4np1K=gdmd$24Tm1Jw%H~` z*6CHMmSMwmt~L@UhAj$*ls1h>hO&?&jct)%-F>s>61{uOeM{wkAI||TGEm_aPX5S9 z9g^nOM3;L8X#S{dqN@TKq8Y>Jmrlmmq)z2sj?Y+vJq1tqhr1o!@1N^O<9fYy$bJNL zG~1hMuGQke)k{)J7AFga@dD7;$N*9RV|2S4{*zE0P#?`Xw20d`)23LF6el?;RIprA zm3p4(HQx@p&wdhzFhhRaf@o%RdEpP84_F!en2TL8X3NtZUp9Y;c-x6g5x0+tkeFlzml(^<31#30 zjyLn1v(BlPoiSjLH(9LTM#_ez}k1A~aEuov!9 zByjFxF#w%#0noRBcx^NB(es3kA5rei17VRuZF0{{1Zch%Py14S>*rk@_LBw@^mN4X zIm~1g3jSUL9~lQf>XuIk!R0OB-?Pv~8d}o|KOk)Bef#VmHxc2iwOf6ZO^NI`UXE;` z?31uov@azH73vs_@=gz;cQR3nDM4GjWcb)w(LLxh!|%#{%#~x|T20It|H2Hr?eVE- z2Kz6q_EeQ#fHbhP{S5mS^Cpp>l)12?W#=NU?fT0VE+6H~#6QX=3;$f#b`c}UEeH2Vv<^{K?=$}iXi`A!+~}#4T#Mk+gYCF)r2sdk zq|9NH;-A9`h<|Y9f62gz-uj?_7t<2_eXx=k)_52Kt$XQ1iQDU148d(k0T(@(9eq9Dtn4*zm%W*0O-9X7xAW$}wFy!J&R z)^Q*bXaoV_!D=fdVL8S&J14cm1Aph+Ksp!Mmd^jt!+ig1ldfwW+GoM~Xj3FLnM$H} zMFZ0L`xeL;BVwiUME%nFJGcCxl7!Hg=f@Oe6PJhLG~Om{u6U#j7j>;fDg#2m%hywA zLh~j3&;+e0UObGd#O7c5F#P%DKDP!Zz6BGNW}MdOe;_L+5;gakc=L9FX(>CSFNBz) z}aeLjkGwd791T2L;{lnjw40I@~*qO|uOJ2_wxDs1;Jw|}`4ifjsh23vC?Oqdge zZzHA(^bUBL|NW)OBC_(Y%%L#xgjXPiU9VQAF9nY~8#`jog~-Gc4n_H= zA`-|ck_$Tq?Sko7$*=}tZ~yNG;oxt&xGTp7cE9)AA`t!tR%0dBZ{$C=0@oZY+f|v1 ze?R}lYe|0Se6AmJxXzuM!H)|pUZ+2IyAQbEETgE=^FD2<=mj0; zpU3mA54^ghe?L%lSXRo&E+Omc&kds!Fk=S-n(91kodx0n<=?`7Ar$kBH5%{2jb#bo zv0MM+uwj1cqbj#~JAdFH9%q?(KzV5Ki#50!ve)7LF)m9XU1GmONgvgTG7_=V*bUBb z%8=b`yuIia{f+KJ7F?(QOglwV{3FLs=l{I=Xn6A^9WWKPe z6{|n-p%L#vAm%F<&%;X_S`$QI_qta{6)_t9QY5eRt+>+h-qMyhjKb0hoUWT zaqaE4Oh_a{)%LvVN9yC0_ssg`S{dp|^Y&-$Y9uC05`iIUu0*i0yKE739M7R(U|1-f zE01*V1N0wfPsbP5%G}-cvjacIzx?l@bQ2?3d zFayZq{kIJF+7^1bMdT3NTsSZ-)MxcKV3iu^>Qk$W;EZos1Z17S_beh@1oSAK{CP;> z+(ZZ6L>HKL75NcKIoBu+X0W(}CH}z3^Bq^i=Y}bO+q<&?hu#mfYWZJMd23|OHW*(| zRPNB-1mE15W6~}GvKNYl^j~Fhe2P=!nB|AQRUu`X{4d_nrA4_bbVLAzs1=m?*|QqA z3T1SeC5$01r$4VBr#}P4dp-HbBoRE6A4~fWpbk=~2q&VTv~B%NT#?Ed3weY85>MhC z{;Lx=2FGdb2eLDnE^j0y{7Jld09|daKD<+avJW&^o|F9)d8_An%Y_OpcSR-M?q&hW zL_K(`!Nia;3dzM}t2b0E$+nWQoIcc0I83QCB*b<~G6>{czF>M?Ue{`*pISzThZX&xg}Bto5X0a+1I!6X`(31-`!PwR&C0^zEF9}C!b5b=IS zt?||1BL!bf-G3+Gn%7c1Of%JTd$oP`F9(BNm%pp$05%Z;xYy6IAA%15(CyzGCIm5t zzN4tae+l9PW}-+AM5RH26Ko0$7+<*rIdwoZzWjre>xH}K-;oM_JF-EyO$7GT0GH;* zA6i#CT~<#<5+dd3A;AmysAfqOk`}y!t??j{`h~n2Brn1Lor<9hdcG#%<|{SIDg$WW zsg7cYx`p=%+)>dI*Bt=gmZuZ18ELa{{55tH$G7{jwOFXMl&|H(37FzcOu|nDpx2)< zGk_$lI!dl$BL&^*+8+CLg~XA?tIBphF=v+k#WPj1c{=X6Fs;4#zvJc0Pzso((P($! z;rB6SOA6V&ecw7R1q*<=q*yZ;5#3TcM5^ndqqU;-}%kUjNTT;loqW2f>4;_4GZn0O) zL-c5%@a=Mo@$lbPR&wFA8eLKfqqb_^=E5KV}*8CY)+$UW-gzY9YHHb41*IFIw&7_x(?@R)Kz( zoI7ORJhpd>L@hJlZe}RfXuUSV>iORX$wN9E=Vt*v@-zw4?@!f$WeZJ#r)z(D(*%~Z z7e(#aZ!@nsZ?o8(i1}6Mx5Xx$G$?bGV_#Q?&1xbzSKg}DFzO%6tHYg z)>4#^MVEgwVRLftZDH)~Qcu>QpzZ}Df_D$yPUvX6FB#hGD1&HCN>M@XXN?bc`MnaK zd^MOGaJ?HtC$NB-#XRlGobMY*e#rsQHp5B zC`4V-TiXs{mA$#JV|Q(dw)&TUQ#5?48PH-@B{E-6WGOE{bF8!yTN89IoE!S;tGK-X z-E!~U<-*-9zZpgRK3f-w@6n1BDB#VGQg*Cp!12mb_kk+wuw2Nhs5&TEge4?sqXsQq zZjN{I7dognYELT#Z6A0J8s3>Bd_zs$sYLr!U`F|FC^qGcPH_HQU00J47kJ4K&)T{0 zF?hn2^lbSrA-i1V9Sg!?Qcy7Pa`n&b`ruuQsVqTn?55(c$3UONYl^Rez)6&xs1RuR zk?%r8blRypOTHEWP25B1iYMw-A|`Y?YpIc=waIxHH6lQeAGcg#{t=H_E^ZU~! z>e%J(3Qh8lT3v0-2T~4QpB%h_5+w;s+U+k+E^i5m0XK;NEY9M%%#=}khy!Y^?ePJl z1b?d2F_sg}7{t}PieNG=f6sLcMwknpEi%Z<%iUdWWjQwo9FHF78G|UV@quTLdh%&K z@rUY+?X-+5D5eux!U*5RHG8UPfJ-JEt5D32nSuVlSoXfUPrY|!OOHA0e`&%3{7;DO_KKLY^B3q&iux%3>_DB>UzzL8+0R+4^pk`&f5c)r zxB%5kUX2f(1+Bkr423Z6TBM2I8|OucPgt>drVijQtfMU8Ibi^LsZkmx)HW?rwOS(ZEf}j=(!L;tHThQJ$Yymu^;-tl z%5^qxvN=&xyt*)aSYl@0;r{z+1;v%rS+WX5sn2oN$N7^eQ_TSMRkb;$eJbLR;vztP zF6Ka;5poaaZ0V4;xRiCU8=y4_0nW|36V14oBnmIT<|?I^qAjnezuC9K4}BbbKYzZ% zOg}!s(Zg|ca+2rTDBCCpku zJnGsNhvoHmSB7(M>q0H>Vqv-7l4IZB5ixIQTlHl#LFaxGuMxOc60H{qZJObtPkb4_ z@lC!S6R*5)c5~F*5_oa@|7yDScqZTX|IEgWGE&N!5{W2so;g(1H<>>B2oXw3&dg!V zVWZMP4ylmCltQ7U9CDt*9Ac!L4+}$P&W4Totv>ypf1lUue%<%=T-WtnulM`D-WO*f z8a8m@t5?i+#*v4na(2UFjS_BmRXSQP#z{T>>Ui>&tx@thO9wCc2og1j;gZwVTgCQ5jq81#rI5zDlW%JC z@$NiF+%%O8d<+ONVa+x9rlM2*T|H6J_RBw7>wqzchnM*^T=T{Emhd1owv9MJ6@J_$ z)3LK&wU#noQfGfYUJSuXa2XFZuiNDH@E{J}D zS2!*|bn^rm$`Ws4igLH_OcQ`*sS>XS~MCPXtFOO0AIz5_$qb zte&NgqhDd4iKzhrf#>#+`zOZfncm z*UyU6OFczvGp;|2b>ku*Z#hEH$Jl9f&>E7 zmczjdqr!4NsYz_PN>}k)CjpzQP?6Hx3bV?&KJj9>!B-&&LOC}h-q+kNqa}|Vm3N(i zji)nT9`D3vO|xy4F0p;DaL$Dt22y-gZ!8ef{C!pw(>g(hkRMk&c3l<|*Xgs42gbdS1K{8a~^SQCOy@q8SxN`;MU1kpt*!@^){Qp4MO0ycc|i=GCCx zt0XOm&Dl)_$)|%lTnB?<;T|`01f&fL-m0Ob%U`2{ZU?9f3w-d7WhFrO(P{YdJht@7 zXC^-!r+h8K)Du91T)mISU)aLPx6u!R`@kjs5-vEL0dl(ivU-%9zioC++R zzzKKt&F)xQ7^0pUEU7yH=SR%9T(SJ=Ue;G)0lNgj)in!r#*Bx4ehv0%kjN(NmW@5R z{3ZvQXs(Mg@_`Nlk~!Hrh@jnzvnMRf3`&`Kp6t$uA=D3+_F+fLN`IisV0%q)hy~BG zxoSe`E5O6_we$Ebo~~RoAT00NAbvb7s`FS7cpkaN%y?c0iZO^j+t|kdV)RU+8nKAG z%J<+wn-d39_IlfNOZ z>u!fK^jh`+KI8>j7>#g8OWXPmG0fI|x>Rh?d8U#&(l(>FOY=LdzA)OK3}4V#&tkfB z-%K#};L#>r!#YR!q)t+w7$ew>^EjKJ3q7tY>cRKcOovfo@`dUXBLg;pMb!_($e{+);|w*HFHSRz!UwJ*NO$X(`` zmsT&swn$|Zgx%-$6yNj%kqGRXs{;ca$cGX0VtCMT=$wro{;S%S%mGfV^yRQ;_t7^w z=_t$6r_kNmx5AvASXz_o{NCO5bup~@b8;(}SSSM!O$mGO1A6)N03FsAnWeoCZ&=2lB=kV@MQ1R8tXp@mtC|P^4(unUWR%^j8MTNzk|jEtqnkF7{GdYviMtiO4hM4 zH6IDy47MCWJUY<7_gq^6f7rL){*^YTq0xXGzeR7#68WYTB=E6-GxByHV+gLpI+mUn zy$2A!5Acr+hnANKMV~b`^|^U{QMjAW^q9y9{Q?*sfINFjd?T#D)yudv9cyr8dr()FPT z&2Z3`(%-5JO42#)_xG?W=2xDG<0Fj;~UYbpHWRnK9jA7+hjx2@8k$wkHoh5 zOemXoo%Cmc9Hh$$y%KITq1&G=AdjpnrBk-wQnUE5rRcG87G|tUej$=66JE{L$FaL8 zCVEIrW0S=e>OUX>!Fl?W{Fi6v@OsLj*5i zW$omv_oEq^{AP$@a5yh$3OlI(iOt)fPi9AJ=bhHM#*yaE*4YnfmByVez)EoaE*^BE z65Vv3wokBV@slAn2U*d33rapkU06y16mm`G)mK@PaFDe0%*#_ap+tT`TJ**j`Dfft zeH9>{*@H6iVGo}GJSH~YYziraubzr7_iOV)>h?0r(~YPDeXE$W<35o=XWfX>=R?EO z3NUY>O=DOt)8qT9=Q%pkRAvQ6um$yFFl%|pv1ZM@DuGe%?;7dsm zh1`0o$xcL#7M10Hv>_eI|9JQ6Il-COk_~HuVdc~&@*H1e&s}b0K6&DBLk`gglp#0W zRvu;$cWszs|0Zh2oVqlu-`6@lD0`5&f>Wn_TnM-(AN@XIPOWz|xM-lSUyc?4PHWmh^C2X&euo|k2&PH!fHTtU8yI_21aD}i9Q2fbkWaf5pOBI; zm{T0__L9rMQK^B<;ipC_eO$A?>1+TSgJHrLsG_Zp?_lw0h59kqNmN<-H=SGl+AnGw z_C|D$9!2x z-o;>y>;~isV7=rn4jkuHiBrKpkL(Q}#u!CCi!1mwT}9y-*XDOqj~^zE({)wu5Kr+X zp$hcNQrg9Z5$TrD0vd>)5d*vgJl`GzE{hTI|c`!HK)8pWEgp za^sIiuR^{c62%>#`KwgHnrkWUPGhlgvZ$^EgaCs!Um0bI6A^3%G z$PB>^1*Dy97jvt{WO{f!Kxq1o5Z52D`4mvl$GTF4%3)u{l}X8eaSn%l`CWJ# z+1}vogTx_7I9E6F$^5TyJjtdw=DA*B4aWXMl%{J?Tp(A*(L`<&zNQr7wo`L|zh@Yf z99hOJzB&}yClxiCF+${AB`@r6$@Cp7pMk+;-1v?M95A{{hxJQ%DuMQ&xbMal3FD{6 zHBE;{6hw6TE>XXLr@12L^-&@FlH}Z2tJ8s30@pPtY1_Nr5sNEig_*;)@N!TIBu_!$WQg}h67Xw`#H3?6QP`WwCm?|1Uj*0S)i9?NH5PV zKW1j)&-!1~&xPQvPy2Doy6U?5o#ihotBBuDU3w3NXY#yKB|W8m(9y=qTPUbncI^w? zq-K)`h;!#2@E)B(f~>1nXrv>X^rR(~ak~>iC5vJ*liuhuXL^vftF?QVy!L zKt<< z1|y;aq%$3gL||}}IgLaU(p?L<>`eZ}?8XKA`kmDJEqY2lca21Bvg<)UFiEexN4&Rf z>wOlowVsQ(Kb83Kg?d_8+abW zY;!+hj-9{to{SrGnL_I^@E>wnpldQejJ1hYdIbItu^Jw_`&=eG2kxR z@IGLHJ`*l{9yfyxRqXnEhAuh(g=-NL|4fr3H?vN$ z(!S2Bj?jT;#UeH~1YH$ZB$4HxOkcW!r6M2bzESPxFHoJ~OHk>FeT57iC!no>^5FQC z_>l3i&jtpVz?^sD2P9p;9k*F?_`_C+^nmAW=Y!+-3~&2-YF@9`2APg+Q*$m{Adrf^ zRVL=sUtC_am($PZot&bS8SDH^McpSSoi^~yu!W#5umAt6w1el+lEah&(5=-;Iypf^ zi$06`F~irUr9rJy)d*@T98G~*pWqEvgN6OmT4AAra*Z);+SR8(J;sf2lt&7iMMj)W z7AZBB$kF(Zd`tWVS~ptPrW`csnTwOm8DIdbs`H8C!{dF=Dz+{N)r|O!n_ei95AZ>& zwIi60ahDr35dIHfrmTnJ%~F!$UtK#OdqW8}+5vBp!Lu~Yp`-&x^vrA$t8)GjCWvRy zDo+>J5Gm7sED4QCJaS@hbvT=67_R6ZNqJ3BEFM%yb6sN_0-Elm+g zkKije%b44j3216|CF@qNX#l$99~F;ueEwvBWwINNyzTo#|9fkhSyl*bQ^Yhc`Or!h z;Qij^bC29fpB&DfqQlO44ZR6qB(5%vEEpET|^KGsK@3!B5x=HqC_vPF3h69PSf zYz0)+Z0HODa~??ZHuy9#ivTs?q-62uGGdLxt$jWBpYby}{gqfV{ zME;Td6v0rB>-(~o)TbJ5`8$wZJ5Y$*W%JU0Fo=>|U7j0+I({GGl^zMOT z>HX%=FzW+a#n$f{{+e7dTw&o(yk-wg!o6^E=Do`lkccd0CZ#9{E^CjhJaHhU6xyu` z$m!pKxW;~Q`lnUAg-nXk^1S}t>auBg&Rvut7=ajRqlWq>i<+Nje%jh|O~U8`TlUhJNJhY!U5HI1k-8Tn(uHhrGn zR%DQ8AnX1e;9U3ZOVj2R8w&&A{A}R(&t2nHS}1en!=MZ)+JkJzON;n7r}3mRpe;~- zk1|9hV4zozfjw9aT@&}f5&@^xMy3W!zk2?xL{<4 z3B(u6(2~uD1Pt(z8Y^qvomu2t!lOwC2L*JpO+zL))BwF+iP`K8sB`Z{i+!O z{hcOV9V?2SyINUGoN+!dXs2A9zBI`zVU^ z<<^s%yZ@#FnGeuq?zDbBwvB!H%KDjGt7NH*YycnHGU++Q| zM)LlAHgecq@K1?8gQ309g_FriZu~hcF9_}6|ML02yIGe|{U=>Mfp!l5X3*DukzzIfn2%1t ctdZ+MF{u8`MzL@;fcKm`V}1Iaxogb-0j2+a@c;k- diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateInfo.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateInfo.plist deleted file mode 100755 index 146a6df..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Configuration Class.xctemplate/TemplateInfo.plist +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Kind - Xcode.IDEKit.TextSubstitutionFileTemplateKind - Description - A QuickConfiguration subclass. - Summary - A QuickConfiguration subclass, overload +configure: to configure the behaviour when running specs, shared examples that are used across spec files. - SortOrder - 1 - BuildableType - Test - DefaultCompletionName - Spec - Options - - - Description - Name of the Quick Configuration - Identifier - productName - Name - QuickConfiguration Name: - NotPersisted - - Required - - Type - text - - - AllowedTypes - - Swift - - public.swift-source - - Objective-C - - public.objective-c-source - public.objective-c-plus-plus-source - - - Default - Swift - Description - The implementation language - Identifier - languageChoice - MainTemplateFiles - - Objective-C - ___FILEBASENAME___.m - Swift - ___FILEBASENAME___.swift - - Name - Language: - Required - Yes - Type - popup - Values - - Swift - Objective-C - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m deleted file mode 100644 index 3e8da5b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -#import -#import - -QuickSpecBegin(___FILEBASENAMEASIDENTIFIER___) - -QuickSpecEnd diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Swift/___FILEBASENAME___.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Swift/___FILEBASENAME___.swift deleted file mode 100644 index a8371cf..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Swift/___FILEBASENAME___.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// ___FILENAME___ -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -//___COPYRIGHT___ -// - -import Quick -import Nimble - -class ___FILEBASENAMEASIDENTIFIER___: QuickSpec { - override func spec() { - - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateIcon.icns b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateIcon.icns deleted file mode 100644 index 5cb4ae999f06c9d5b5f3152a034c65f23137821e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529473 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%0D_YWU3_}$$FJi-@LKlix9Xblc5@0Ulz3?A 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%0Dl`^kCYc7e=RkY)F>z4{wSA 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�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

#OaG=$jQXJIUFE~t-iL6<6w#8rj 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 diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateInfo.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateInfo.plist deleted file mode 100755 index 7b8088f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/TemplateInfo.plist +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Kind - Xcode.IDEKit.TextSubstitutionFileTemplateKind - Description - A class implementing a Quick spec. - Summary - A class implementing a Quick spec - SortOrder - 1 - BuildableType - Test - DefaultCompletionName - Spec - Options - - - Description - Name of the Quick spec class - Identifier - productName - Name - Spec Name: - NotPersisted - - Required - - Type - text - - - AllowedTypes - - Swift - - public.swift-source - - Objective-C - - public.objective-c-source - public.objective-c-plus-plus-source - - - Default - Swift - Description - The implementation language - Identifier - languageChoice - MainTemplateFiles - - Objective-C - ___FILEBASENAME___.m - Swift - ___FILEBASENAME___.swift - - Name - Language: - Required - Yes - Type - popup - Values - - Swift - Objective-C - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.podspec b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.podspec deleted file mode 100644 index 1cdc852..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.podspec +++ /dev/null @@ -1,38 +0,0 @@ -Pod::Spec.new do |s| - s.name = "Quick" - s.version = "1.0.0" - s.summary = "The Swift (and Objective-C) testing framework." - - s.description = <<-DESC - Quick is a behavior-driven development framework for Swift and Objective-C. Inspired by RSpec, Specta, and Ginkgo. - DESC - - s.homepage = "https://github.com/Quick/Quick" - s.license = { :type => "Apache 2.0", :file => "LICENSE" } - - s.author = "Quick Contributors" - s.ios.deployment_target = "7.0" - s.osx.deployment_target = "10.9" - s.tvos.deployment_target = '9.0' - - s.source = { :git => "https://github.com/Quick/Quick.git", :tag => "v#{s.version}" } - s.source_files = "Sources/**/*.{swift,h,m}" - - s.public_header_files = [ - 'Sources/QuickObjectiveC/Configuration/QuickConfiguration.h', - 'Sources/QuickObjectiveC/DSL/QCKDSL.h', - 'Sources/QuickObjectiveC/Quick.h', - 'Sources/QuickObjectiveC/QuickSpec.h', - ] - - s.exclude_files = [ - 'Sources/Quick/Configuration/QuickConfiguration.swift', - 'Sources/Quick/QuickSpec.swift', - 'Sources/Quick/QuickMain.swift', - ] - - s.framework = "XCTest" - s.requires_arc = true - s.user_target_xcconfig = { 'FRAMEWORK_SEARCH_PATHS' => '$(PLATFORM_DIR)/Developer/Library/Frameworks' } - s.pod_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' } -end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj deleted file mode 100644 index 613590c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2641 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1F118CDF1BDCA4AB005013A2 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118CD51BDCA4AB005013A2 /* Quick.framework */; }; - 1F118CF51BDCA4BB005013A2 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118CD51BDCA4AB005013A2 /* Quick.framework */; }; - 1F118CFB1BDCA536005013A2 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */; }; - 1F118CFC1BDCA536005013A2 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA169E4719FF5DF100619816 /* Configuration.swift */; }; - 1F118CFD1BDCA536005013A2 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E519FCAEE8002858A7 /* World+DSL.swift */; }; - 1F118CFE1BDCA536005013A2 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E219FCAEE8002858A7 /* DSL.swift */; }; - 1F118CFF1BDCA536005013A2 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E419FCAEE8002858A7 /* QCKDSL.m */; }; - 1F118D001BDCA536005013A2 /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BDF19FF5599005DF92A /* Closures.swift */; }; - 1F118D011BDCA536005013A2 /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE019FF5599005DF92A /* ExampleHooks.swift */; }; - 1F118D021BDCA536005013A2 /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE119FF5599005DF92A /* SuiteHooks.swift */; }; - 1F118D031BDCA536005013A2 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A619515CA700CE1B99 /* World.swift */; }; - 1F118D041BDCA536005013A2 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759E19515CA700CE1B99 /* Example.swift */; }; - 1F118D051BDCA536005013A2 /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA02C91819A8073100093156 /* ExampleMetadata.swift */; }; - 1F118D061BDCA536005013A2 /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */; }; - 1F118D071BDCA536005013A2 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759C19515CA700CE1B99 /* Callsite.swift */; }; - 1F118D081BDCA536005013A2 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6B30171A4DB0D500FFB148 /* Filter.swift */; }; - 1F118D091BDCA536005013A2 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A519515CA700CE1B99 /* QuickSpec.m */; }; - 1F118D0A1BDCA536005013A2 /* NSString+QCKSelectorName.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A119515CA700CE1B99 /* NSString+QCKSelectorName.m */; }; - 1F118D0C1BDCA543005013A2 /* QuickConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */; }; - 1F118D0D1BDCA547005013A2 /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - 1F118D0E1BDCA547005013A2 /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - 1F118D0F1BDCA54B005013A2 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */; }; - 1F118D101BDCA556005013A2 /* Configuration+AfterEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */; }; - 1F118D111BDCA556005013A2 /* Configuration+AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */; }; - 1F118D121BDCA556005013A2 /* ItTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7AE6F019FC493F000AFDCE /* ItTests.swift */; }; - 1F118D131BDCA556005013A2 /* ItTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */; }; - 1F118D141BDCA556005013A2 /* FailureTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */; }; - 1F118D151BDCA556005013A2 /* FailureUsingXCTAssertTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */; }; - 1F118D161BDCA556005013A2 /* BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA87078219F48775008C04AC /* BeforeEachTests.swift */; }; - 1F118D171BDCA556005013A2 /* BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */; }; - 1F118D181BDCA556005013A2 /* AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA05D60F19F73A3800771050 /* AfterEachTests.swift */; }; - 1F118D191BDCA556005013A2 /* AfterEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */; }; - 1F118D1A1BDCA556005013A2 /* PendingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA63EA219F7637300CD0A3B /* PendingTests.swift */; }; - 1F118D1B1BDCA556005013A2 /* PendingTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */; }; - 1F118D1C1BDCA556005013A2 /* BeforeSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */; }; - 1F118D1D1BDCA556005013A2 /* BeforeSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */; }; - 1F118D201BDCA556005013A2 /* SharedExamplesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */; }; - 1F118D211BDCA556005013A2 /* SharedExamplesTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */; }; - 1F118D221BDCA556005013A2 /* SharedExamples+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */; }; - 1F118D231BDCA556005013A2 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */; }; - 1F118D241BDCA561005013A2 /* FocusedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9876BF1A4C87200004AA17 /* FocusedTests.swift */; }; - 1F118D251BDCA561005013A2 /* FocusedTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */; }; - 1F118D261BDCA5AF005013A2 /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC81B110699006F61EC /* World+DSL.h */; }; - 1F118D271BDCA5AF005013A2 /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC21B1105BC006F61EC /* World.h */; }; - 1F118D281BDCA5AF005013A2 /* NSString+QCKSelectorName.h in Headers */ = {isa = PBXBuildFile; fileRef = 34F375A019515CA700CE1B99 /* NSString+QCKSelectorName.h */; }; - 1F118D291BDCA5B6005013A2 /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F118D2A1BDCA5B6005013A2 /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3124E319FCAEE8002858A7 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F118D2B1BDCA5B6005013A2 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB6B931943873100289F44 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F118D2C1BDCA5B6005013A2 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 34F375A419515CA700CE1B99 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F118D351BDCA657005013A2 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118D341BDCA657005013A2 /* Nimble.framework */; }; - 1F118D371BDCA65C005013A2 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118D361BDCA65C005013A2 /* Nimble.framework */; }; - 1F118D381BDCA6E1005013A2 /* Configuration+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */; }; - 1F118D391BDCA6E6005013A2 /* Configuration+BeforeEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */; }; - 1FD0CFAD1AFA0B8C00874CC1 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - 34C586011C4ABD3F00D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586021C4ABD3F00D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586031C4ABD4000D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586041C4ABD4000D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586051C4ABD4100D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586061C4ABD4100D4F057 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */; }; - 34C586081C4AC5E500D4F057 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */; }; - 34C586091C4AC5E500D4F057 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */; }; - 34C5860A1C4AC5E500D4F057 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */; }; - 34F375A719515CA700CE1B99 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759C19515CA700CE1B99 /* Callsite.swift */; }; - 34F375A819515CA700CE1B99 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759C19515CA700CE1B99 /* Callsite.swift */; }; - 34F375AB19515CA700CE1B99 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759E19515CA700CE1B99 /* Example.swift */; }; - 34F375AC19515CA700CE1B99 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759E19515CA700CE1B99 /* Example.swift */; }; - 34F375AD19515CA700CE1B99 /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */; }; - 34F375AE19515CA700CE1B99 /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */; }; - 34F375AF19515CA700CE1B99 /* NSString+QCKSelectorName.h in Headers */ = {isa = PBXBuildFile; fileRef = 34F375A019515CA700CE1B99 /* NSString+QCKSelectorName.h */; }; - 34F375B019515CA700CE1B99 /* NSString+QCKSelectorName.h in Headers */ = {isa = PBXBuildFile; fileRef = 34F375A019515CA700CE1B99 /* NSString+QCKSelectorName.h */; }; - 34F375B119515CA700CE1B99 /* NSString+QCKSelectorName.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A119515CA700CE1B99 /* NSString+QCKSelectorName.m */; }; - 34F375B219515CA700CE1B99 /* NSString+QCKSelectorName.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A119515CA700CE1B99 /* NSString+QCKSelectorName.m */; }; - 34F375B719515CA700CE1B99 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 34F375A419515CA700CE1B99 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 34F375B819515CA700CE1B99 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 34F375A419515CA700CE1B99 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 34F375B919515CA700CE1B99 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A519515CA700CE1B99 /* QuickSpec.m */; }; - 34F375BA19515CA700CE1B99 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A519515CA700CE1B99 /* QuickSpec.m */; }; - 34F375BB19515CA700CE1B99 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A619515CA700CE1B99 /* World.swift */; }; - 34F375BC19515CA700CE1B99 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F375A619515CA700CE1B99 /* World.swift */; }; - 470D6ECB1A43442400043E50 /* AfterEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */; }; - 470D6ECC1A43442900043E50 /* AfterEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */; }; - 471590401A488F3F00FBA644 /* PendingTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */; }; - 471590411A488F3F00FBA644 /* PendingTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */; }; - 4728253B1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */; }; - 4728253C1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */; }; - 4748E8941A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */; }; - 4748E8951A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */; }; - 47876F7D1A49AD63002575C7 /* BeforeSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */; }; - 47876F7E1A49AD71002575C7 /* BeforeSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */; }; - 479C31E31A36171B00DA8718 /* ItTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */; }; - 479C31E41A36172700DA8718 /* ItTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */; }; - 47FAEA361A3F49E6005A1D2F /* BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */; }; - 47FAEA371A3F49EB005A1D2F /* BeforeEachTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */; }; - 5A5D118719473F2100F6D13D /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A5D117C19473F2100F6D13D /* Quick.framework */; }; - 5A5D11A7194740E000F6D13D /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB6B931943873100289F44 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 64076CEF1D6D7C2000E2B499 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEB6B8E1943873100289F44 /* Quick.framework */; }; - 64076CF01D6D7C2000E2B499 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - 64076D021D6D7CD600E2B499 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A5D117C19473F2100F6D13D /* Quick.framework */; }; - 64076D031D6D7CD600E2B499 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - 64076D141D6D7CEA00E2B499 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118CD51BDCA4AB005013A2 /* Quick.framework */; }; - 64076D151D6D7CEA00E2B499 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F118D361BDCA65C005013A2 /* Nimble.framework */; }; - 64076D211D6D7E4D00E2B499 /* AfterSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */; }; - 64076D221D6D7E5B00E2B499 /* AfterSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */; }; - 64076D231D6D7E6B00E2B499 /* AfterSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */; }; - 64076D261D6D80B500E2B499 /* AfterSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */; }; - 64076D271D6D80B500E2B499 /* AfterSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */; }; - 7B44ADBE1C5444940007AF2E /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */; }; - 7B44ADBF1C5444940007AF2E /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */; }; - 7B44ADC01C5444940007AF2E /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */; }; - 7B5358CE1C3D4FBC00A23FAA /* ContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */; }; - 7B5358CF1C3D4FBE00A23FAA /* ContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */; }; - 7B5358D01C3D4FC000A23FAA /* ContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */; }; - 8D010A571C11726F00633E2B /* DescribeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D010A561C11726F00633E2B /* DescribeTests.swift */; }; - 8D010A581C11726F00633E2B /* DescribeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D010A561C11726F00633E2B /* DescribeTests.swift */; }; - 8D010A591C11726F00633E2B /* DescribeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D010A561C11726F00633E2B /* DescribeTests.swift */; }; - 96327C631C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */ = {isa = PBXBuildFile; fileRef = 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */; }; - 96327C641C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */ = {isa = PBXBuildFile; fileRef = 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */; }; - 96327C651C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */ = {isa = PBXBuildFile; fileRef = 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */; }; - 96327C661C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */ = {isa = PBXBuildFile; fileRef = 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */; }; - 96327C671C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */ = {isa = PBXBuildFile; fileRef = 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */; }; - 96327C681C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */ = {isa = PBXBuildFile; fileRef = 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */; }; - AE4E58131C73097A00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58141C73097A00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58151C73097C00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58161C73097C00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58171C73097E00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AE4E58181C73097E00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */; }; - AED9C8631CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */; }; - AED9C8641CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */; }; - AED9C8651CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */; }; - CD264DBD1DDA147A0038B0EB /* AfterSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */; }; - CE57CEDD1C430BD200D63004 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */; }; - CE57CEDE1C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */; }; - CE57CEDF1C430BD200D63004 /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */; }; - CE57CEE01C430BD200D63004 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDB1C430BD200D63004 /* URL+FileName.swift */; }; - CE57CEE11C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */; }; - CE590E1A1C431FE300253D19 /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */; }; - CE590E1B1C431FE300253D19 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */; }; - CE590E1C1C431FE300253D19 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */; }; - CE590E1D1C431FE300253D19 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDB1C430BD200D63004 /* URL+FileName.swift */; }; - CE590E1E1C431FE300253D19 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */; }; - CE590E1F1C431FE400253D19 /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */; }; - CE590E201C431FE400253D19 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */; }; - CE590E211C431FE400253D19 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */; }; - CE590E221C431FE400253D19 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDB1C430BD200D63004 /* URL+FileName.swift */; }; - CE590E231C431FE400253D19 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */; }; - DA02C91919A8073100093156 /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA02C91819A8073100093156 /* ExampleMetadata.swift */; }; - DA02C91A19A8073100093156 /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA02C91819A8073100093156 /* ExampleMetadata.swift */; }; - DA05D61019F73A3800771050 /* AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA05D60F19F73A3800771050 /* AfterEachTests.swift */; }; - DA05D61119F73A3800771050 /* AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA05D60F19F73A3800771050 /* AfterEachTests.swift */; }; - DA07722E1A4E5B7B0098839D /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - DA07722F1A4E5B7C0098839D /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - DA169E4819FF5DF100619816 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA169E4719FF5DF100619816 /* Configuration.swift */; }; - DA169E4919FF5DF100619816 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA169E4719FF5DF100619816 /* Configuration.swift */; }; - DA3124E619FCAEE8002858A7 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E219FCAEE8002858A7 /* DSL.swift */; }; - DA3124E719FCAEE8002858A7 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E219FCAEE8002858A7 /* DSL.swift */; }; - DA3124E819FCAEE8002858A7 /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3124E319FCAEE8002858A7 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA3124E919FCAEE8002858A7 /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3124E319FCAEE8002858A7 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA3124EA19FCAEE8002858A7 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E419FCAEE8002858A7 /* QCKDSL.m */; }; - DA3124EB19FCAEE8002858A7 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E419FCAEE8002858A7 /* QCKDSL.m */; }; - DA3124EC19FCAEE8002858A7 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E519FCAEE8002858A7 /* World+DSL.swift */; }; - DA3124ED19FCAEE8002858A7 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3124E519FCAEE8002858A7 /* World+DSL.swift */; }; - DA3E7A341A1E66C600CCE408 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - DA3E7A351A1E66CB00CCE408 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - DA408BE219FF5599005DF92A /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BDF19FF5599005DF92A /* Closures.swift */; }; - DA408BE319FF5599005DF92A /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BDF19FF5599005DF92A /* Closures.swift */; }; - DA408BE419FF5599005DF92A /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE019FF5599005DF92A /* ExampleHooks.swift */; }; - DA408BE519FF5599005DF92A /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE019FF5599005DF92A /* ExampleHooks.swift */; }; - DA408BE619FF5599005DF92A /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE119FF5599005DF92A /* SuiteHooks.swift */; }; - DA408BE719FF5599005DF92A /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA408BE119FF5599005DF92A /* SuiteHooks.swift */; }; - DA5663EE1A4C8D8500193C88 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEB6B8E1943873100289F44 /* Quick.framework */; }; - DA5663F41A4C8D9A00193C88 /* FocusedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9876BF1A4C87200004AA17 /* FocusedTests.swift */; }; - DA6B30181A4DB0D500FFB148 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6B30171A4DB0D500FFB148 /* Filter.swift */; }; - DA6B30191A4DB0D500FFB148 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6B30171A4DB0D500FFB148 /* Filter.swift */; }; - DA7AE6F119FC493F000AFDCE /* ItTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7AE6F019FC493F000AFDCE /* ItTests.swift */; }; - DA7AE6F219FC493F000AFDCE /* ItTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7AE6F019FC493F000AFDCE /* ItTests.swift */; }; - DA8940F01B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */; }; - DA8940F11B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */; }; - DA8C00211A01E4B900CE58A6 /* QuickConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */; }; - DA8C00221A01E4B900CE58A6 /* QuickConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */; }; - DA8F919919F31680006F6675 /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - DA8F919A19F31680006F6675 /* QCKSpecRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919619F31680006F6675 /* QCKSpecRunner.m */; }; - DA8F919D19F31921006F6675 /* FailureTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */; }; - DA8F919E19F31921006F6675 /* FailureTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */; }; - DA8F91A519F3208B006F6675 /* BeforeSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */; }; - DA8F91A619F3208B006F6675 /* BeforeSuiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */; }; - DA8F91AB19F3299E006F6675 /* SharedExamplesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */; }; - DA8F91AC19F3299E006F6675 /* SharedExamplesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */; }; - DA8F91AE19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */; }; - DA8F91AF19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */; }; - DA9876B81A4C70EB0004AA17 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A5D117C19473F2100F6D13D /* Quick.framework */; }; - DA9876C11A4C87200004AA17 /* FocusedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9876BF1A4C87200004AA17 /* FocusedTests.swift */; }; - DAA63EA319F7637300CD0A3B /* PendingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA63EA219F7637300CD0A3B /* PendingTests.swift */; }; - DAA63EA419F7637300CD0A3B /* PendingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA63EA219F7637300CD0A3B /* PendingTests.swift */; }; - DAA7C0D719F777EB0093D1D9 /* BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA87078219F48775008C04AC /* BeforeEachTests.swift */; }; - DAB0136F19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */; }; - DAB0137019FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */; }; - DAB067E919F7801C00F970AC /* BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA87078219F48775008C04AC /* BeforeEachTests.swift */; }; - DAD297651AA8129D001D25CD /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; - DAE714F019FF65D3005905B8 /* Configuration+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */; }; - DAE714F119FF65D3005905B8 /* Configuration+BeforeEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */; }; - DAE714F319FF65E7005905B8 /* Configuration+BeforeEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */; }; - DAE714F419FF65E7005905B8 /* Configuration+BeforeEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */; }; - DAE714F719FF6812005905B8 /* Configuration+AfterEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */; }; - DAE714F819FF6812005905B8 /* Configuration+AfterEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */; }; - DAE714FA19FF682A005905B8 /* Configuration+AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */; }; - DAE714FB19FF682A005905B8 /* Configuration+AfterEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */; }; - DAE714FE19FF6A62005905B8 /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAE714FF19FF6A62005905B8 /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAE7150019FF6A62005905B8 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */; }; - DAE7150119FF6A62005905B8 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */; }; - DAEB6B941943873100289F44 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB6B931943873100289F44 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAEB6B9A1943873100289F44 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEB6B8E1943873100289F44 /* Quick.framework */; }; - DAED1EC41B1105BC006F61EC /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC21B1105BC006F61EC /* World.h */; }; - DAED1EC51B1105BC006F61EC /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC21B1105BC006F61EC /* World.h */; }; - DAED1ECA1B110699006F61EC /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC81B110699006F61EC /* World+DSL.h */; }; - DAED1ECB1B110699006F61EC /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = DAED1EC81B110699006F61EC /* World+DSL.h */; }; - DAF28BC31A4DB8EC00A5D9BF /* FocusedTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */; }; - DAF28BC41A4DB8EC00A5D9BF /* FocusedTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 047655511949F4CB00B288BB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 047655531949F4CB00B288BB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04765555194A327000B288BB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97E4194B4A6000CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97E6194B4A6000CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97E8194B4B7E00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97EA194B4B9B00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97F0194B82DB00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97F2194B82DE00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97F6194B831200CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97F8194B834000CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97FA194B834100CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97FC194B834B00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97FE194B835E00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC9800194B836100CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC9802194B836300CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC9804194B838400CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC9806194B838700CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC9808194B838B00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 1F118CE01BDCA4AB005013A2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F118CD41BDCA4AB005013A2; - remoteInfo = "Quick-tvOS"; - }; - 1F118CF61BDCA4BB005013A2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F118CD41BDCA4AB005013A2; - remoteInfo = "Quick-tvOS"; - }; - 5A5D118819473F2100F6D13D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 5A5D11EF194741B500F6D13D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 5A5D11F1194741B500F6D13D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 64076CE71D6D7C2000E2B499 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = "Quick-OSX"; - }; - 64076CFA1D6D7CD600E2B499 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 64076D0C1D6D7CEA00E2B499 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F118CD41BDCA4AB005013A2; - remoteInfo = "Quick-tvOS"; - }; - 93625F381951DDC8006B1FE1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - DA5663EF1A4C8D8500193C88 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = "Quick-OSX"; - }; - DA9876B91A4C70EB0004AA17 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - DAEB6B9B1943873100289F44 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1F118CD51BDCA4AB005013A2 /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F118CDE1BDCA4AB005013A2 /* Quick-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Quick-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F118CF01BDCA4BB005013A2 /* QuickFocused-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickFocused-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F118D341BDCA657005013A2 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = "Externals/Nimble/build/Debug-appletvos/Nimble.framework"; sourceTree = ""; }; - 1F118D361BDCA65C005013A2 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = "Externals/Nimble/build/Debug-appletvos/Nimble.framework"; sourceTree = ""; }; - 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = XCTestCaseProvider.swift; path = ../../QuickTestHelpers/XCTestCaseProvider.swift; sourceTree = ""; }; - 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorUtility.swift; sourceTree = ""; }; - 34F3759C19515CA700CE1B99 /* Callsite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Callsite.swift; sourceTree = ""; }; - 34F3759E19515CA700CE1B99 /* Example.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Example.swift; sourceTree = ""; }; - 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExampleGroup.swift; sourceTree = ""; }; - 34F375A019515CA700CE1B99 /* NSString+QCKSelectorName.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+QCKSelectorName.h"; sourceTree = ""; }; - 34F375A119515CA700CE1B99 /* NSString+QCKSelectorName.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+QCKSelectorName.m"; sourceTree = ""; }; - 34F375A419515CA700CE1B99 /* QuickSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickSpec.h; sourceTree = ""; }; - 34F375A519515CA700CE1B99 /* QuickSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuickSpec.m; sourceTree = ""; }; - 34F375A619515CA700CE1B99 /* World.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = World.swift; sourceTree = ""; }; - 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AfterEachTests+ObjC.m"; sourceTree = ""; }; - 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "PendingTests+ObjC.m"; sourceTree = ""; }; - 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SharedExamplesTests+ObjC.m"; sourceTree = ""; }; - 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SharedExamples+BeforeEachTests+ObjC.m"; sourceTree = ""; }; - 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "BeforeSuiteTests+ObjC.m"; sourceTree = ""; }; - 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ItTests+ObjC.m"; sourceTree = ""; }; - 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "BeforeEachTests+ObjC.m"; sourceTree = ""; }; - 5A5D117C19473F2100F6D13D /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5A5D118619473F2100F6D13D /* Quick-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Quick-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 64076CF51D6D7C2000E2B499 /* QuickAfterSuite-macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickAfterSuite-macOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 64076D081D6D7CD600E2B499 /* QuickAfterSuite-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickAfterSuite-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 64076D1A1D6D7CEA00E2B499 /* QuickAfterSuite-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickAfterSuite-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AfterSuiteTests.swift; sourceTree = ""; }; - 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AfterSuiteTests+ObjC.m"; sourceTree = ""; }; - 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HooksPhase.swift; sourceTree = ""; }; - 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContextTests.swift; sourceTree = ""; }; - 8D010A561C11726F00633E2B /* DescribeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DescribeTests.swift; sourceTree = ""; }; - 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QuickSpec+QuickSpec_MethodList.h"; sourceTree = ""; }; - 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QuickSpec+QuickSpec_MethodList.m"; sourceTree = ""; }; - AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCTestObservationCenter+QCKSuspendObservation.m"; sourceTree = ""; }; - AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrossReferencingSpecs.swift; sourceTree = ""; }; - CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; - CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; - CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickTestSuite.swift; sourceTree = ""; }; - CE57CEDB1C430BD200D63004 /* URL+FileName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URL+FileName.swift"; sourceTree = ""; }; - CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; - DA02C91819A8073100093156 /* ExampleMetadata.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExampleMetadata.swift; sourceTree = ""; }; - DA05D60F19F73A3800771050 /* AfterEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AfterEachTests.swift; sourceTree = ""; }; - DA169E4719FF5DF100619816 /* Configuration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = ""; }; - DA3124E219FCAEE8002858A7 /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSL.swift; sourceTree = ""; }; - DA3124E319FCAEE8002858A7 /* QCKDSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QCKDSL.h; sourceTree = ""; }; - DA3124E419FCAEE8002858A7 /* QCKDSL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QCKDSL.m; sourceTree = ""; }; - DA3124E519FCAEE8002858A7 /* World+DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "World+DSL.swift"; sourceTree = ""; }; - DA408BDF19FF5599005DF92A /* Closures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Closures.swift; sourceTree = ""; }; - DA408BE019FF5599005DF92A /* ExampleHooks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExampleHooks.swift; sourceTree = ""; }; - DA408BE119FF5599005DF92A /* SuiteHooks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SuiteHooks.swift; sourceTree = ""; }; - DA5663E81A4C8D8500193C88 /* QuickFocused-macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickFocused-macOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - DA6B30171A4DB0D500FFB148 /* Filter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Filter.swift; sourceTree = ""; }; - DA7AE6F019FC493F000AFDCE /* ItTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItTests.swift; sourceTree = ""; }; - DA87078219F48775008C04AC /* BeforeEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeforeEachTests.swift; sourceTree = ""; }; - DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FailureUsingXCTAssertTests+ObjC.m"; sourceTree = ""; }; - DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuickConfigurationTests.m; sourceTree = ""; }; - DA8F919519F31680006F6675 /* QCKSpecRunner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QCKSpecRunner.h; sourceTree = ""; }; - DA8F919619F31680006F6675 /* QCKSpecRunner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QCKSpecRunner.m; sourceTree = ""; }; - DA8F919719F31680006F6675 /* QuickTestsBridgingHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickTestsBridgingHeader.h; sourceTree = ""; }; - DA8F919819F31680006F6675 /* XCTestObservationCenter+QCKSuspendObservation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "XCTestObservationCenter+QCKSuspendObservation.h"; sourceTree = ""; }; - DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FailureTests+ObjC.m"; sourceTree = ""; }; - DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeforeSuiteTests.swift; sourceTree = ""; }; - DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedExamplesTests.swift; sourceTree = ""; }; - DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FunctionalTests_SharedExamplesTests_SharedExamples.swift; sourceTree = ""; }; - DA9876B21A4C70EB0004AA17 /* QuickFocused-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QuickFocused-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - DA9876BF1A4C87200004AA17 /* FocusedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FocusedTests.swift; sourceTree = ""; }; - DA9876C01A4C87200004AA17 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DAA63EA219F7637300CD0A3B /* PendingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PendingTests.swift; sourceTree = ""; }; - DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SharedExamples+BeforeEachTests.swift"; sourceTree = ""; }; - DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Configuration+BeforeEachTests.swift"; sourceTree = ""; }; - DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Configuration+BeforeEach.swift"; sourceTree = ""; }; - DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Configuration+AfterEach.swift"; sourceTree = ""; }; - DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Configuration+AfterEachTests.swift"; sourceTree = ""; }; - DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickConfiguration.h; sourceTree = ""; }; - DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuickConfiguration.m; sourceTree = ""; }; - DAEB6B8E1943873100289F44 /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DAEB6B921943873100289F44 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DAEB6B931943873100289F44 /* Quick.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Quick.h; sourceTree = ""; }; - DAEB6B991943873100289F44 /* Quick-macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Quick-macOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - DAEB6B9F1943873100289F44 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DAED1EC21B1105BC006F61EC /* World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = World.h; sourceTree = ""; }; - DAED1EC81B110699006F61EC /* World+DSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "World+DSL.h"; sourceTree = ""; }; - DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FocusedTests+ObjC.m"; sourceTree = ""; }; - F8100E901A1E4447007595ED /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1F118CD11BDCA4AB005013A2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CDB1BDCA4AB005013A2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118CDF1BDCA4AB005013A2 /* Quick.framework in Frameworks */, - 1F118D351BDCA657005013A2 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CED1BDCA4BB005013A2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118CF51BDCA4BB005013A2 /* Quick.framework in Frameworks */, - 1F118D371BDCA65C005013A2 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D117819473F2100F6D13D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D118319473F2100F6D13D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5A5D118719473F2100F6D13D /* Quick.framework in Frameworks */, - DA3E7A351A1E66CB00CCE408 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076CEE1D6D7C2000E2B499 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076CEF1D6D7C2000E2B499 /* Quick.framework in Frameworks */, - 64076CF01D6D7C2000E2B499 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D011D6D7CD600E2B499 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D021D6D7CD600E2B499 /* Quick.framework in Frameworks */, - 64076D031D6D7CD600E2B499 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D131D6D7CEA00E2B499 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D141D6D7CEA00E2B499 /* Quick.framework in Frameworks */, - 64076D151D6D7CEA00E2B499 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA5663E51A4C8D8500193C88 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DA5663EE1A4C8D8500193C88 /* Quick.framework in Frameworks */, - 1FD0CFAD1AFA0B8C00874CC1 /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA9876AF1A4C70EB0004AA17 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DA9876B81A4C70EB0004AA17 /* Quick.framework in Frameworks */, - DAD297651AA8129D001D25CD /* Nimble.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B8A1943873100289F44 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B961943873100289F44 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DA3E7A341A1E66C600CCE408 /* Nimble.framework in Frameworks */, - DAEB6B9A1943873100289F44 /* Quick.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1F118D331BDCA645005013A2 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1F118D361BDCA65C005013A2 /* Nimble.framework */, - 1F118D341BDCA657005013A2 /* Nimble.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 64076D1C1D6D7D0B00E2B499 /* QuickAfterSuiteTests */ = { - isa = PBXGroup; - children = ( - 64076D1D1D6D7D0B00E2B499 /* AfterSuiteTests.swift */, - 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */, - ); - name = QuickAfterSuiteTests; - path = Tests/QuickTests/QuickAfterSuiteTests; - sourceTree = ""; - }; - 6C3983EE1D1E930D00637469 /* QuickObjectiveC */ = { - isa = PBXGroup; - children = ( - 6C3983EF1D1E93B700637469 /* Configuration */, - 6C3983F01D1E93CE00637469 /* DSL */, - DAEB6B931943873100289F44 /* Quick.h */, - DAED1EC21B1105BC006F61EC /* World.h */, - 34F375A419515CA700CE1B99 /* QuickSpec.h */, - 34F375A519515CA700CE1B99 /* QuickSpec.m */, - 34F375A019515CA700CE1B99 /* NSString+QCKSelectorName.h */, - 34F375A119515CA700CE1B99 /* NSString+QCKSelectorName.m */, - CE57CEDC1C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m */, - ); - name = QuickObjectiveC; - path = Sources/QuickObjectiveC; - sourceTree = ""; - }; - 6C3983EF1D1E93B700637469 /* Configuration */ = { - isa = PBXGroup; - children = ( - DAE714FC19FF6A62005905B8 /* QuickConfiguration.h */, - DAE714FD19FF6A62005905B8 /* QuickConfiguration.m */, - ); - path = Configuration; - sourceTree = ""; - }; - 6C3983F01D1E93CE00637469 /* DSL */ = { - isa = PBXGroup; - children = ( - DAED1EC81B110699006F61EC /* World+DSL.h */, - DA3124E319FCAEE8002858A7 /* QCKDSL.h */, - DA3124E419FCAEE8002858A7 /* QCKDSL.m */, - ); - path = DSL; - sourceTree = ""; - }; - CDB2AA5E1D6C84CF005600C3 /* ObjC */ = { - isa = PBXGroup; - children = ( - 470D6EC91A43409600043E50 /* AfterEachTests+ObjC.m */, - 47FAEA341A3F45ED005A1D2F /* BeforeEachTests+ObjC.m */, - 47876F7B1A4999B0002575C7 /* BeforeSuiteTests+ObjC.m */, - DA8F919C19F31921006F6675 /* FailureTests+ObjC.m */, - DA8940EF1B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m */, - 479C31E11A36156E00DA8718 /* ItTests+ObjC.m */, - 4715903F1A488F3F00FBA644 /* PendingTests+ObjC.m */, - 4748E8931A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m */, - 4728253A1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m */, - ); - path = ObjC; - sourceTree = ""; - }; - DA169E4619FF5DF100619816 /* Configuration */ = { - isa = PBXGroup; - children = ( - DA169E4719FF5DF100619816 /* Configuration.swift */, - ); - path = Configuration; - sourceTree = ""; - }; - DA3124E119FCAEE8002858A7 /* DSL */ = { - isa = PBXGroup; - children = ( - DA3124E519FCAEE8002858A7 /* World+DSL.swift */, - DA3124E219FCAEE8002858A7 /* DSL.swift */, - ); - path = DSL; - sourceTree = ""; - }; - DA408BDE19FF5599005DF92A /* Hooks */ = { - isa = PBXGroup; - children = ( - DA408BDF19FF5599005DF92A /* Closures.swift */, - DA408BE019FF5599005DF92A /* ExampleHooks.swift */, - DA408BE119FF5599005DF92A /* SuiteHooks.swift */, - 7B44ADBD1C5444940007AF2E /* HooksPhase.swift */, - ); - path = Hooks; - sourceTree = ""; - }; - DA8F919419F31680006F6675 /* Helpers */ = { - isa = PBXGroup; - children = ( - DA8F919719F31680006F6675 /* QuickTestsBridgingHeader.h */, - DA8F919519F31680006F6675 /* QCKSpecRunner.h */, - DA8F919619F31680006F6675 /* QCKSpecRunner.m */, - 34ACFB7B1C34859300942064 /* XCTestCaseProvider.swift */, - DA8F919819F31680006F6675 /* XCTestObservationCenter+QCKSuspendObservation.h */, - 96327C611C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h */, - 96327C621C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m */, - AEB080BB1C72F028004917D3 /* XCTestObservationCenter+QCKSuspendObservation.m */, - ); - path = Helpers; - sourceTree = ""; - }; - DA8F919B19F3189D006F6675 /* FunctionalTests */ = { - isa = PBXGroup; - children = ( - DAE714E919FF65A6005905B8 /* Configuration */, - CDB2AA5E1D6C84CF005600C3 /* ObjC */, - DA7AE6F019FC493F000AFDCE /* ItTests.swift */, - 8D010A561C11726F00633E2B /* DescribeTests.swift */, - DA87078219F48775008C04AC /* BeforeEachTests.swift */, - DA05D60F19F73A3800771050 /* AfterEachTests.swift */, - DAA63EA219F7637300CD0A3B /* PendingTests.swift */, - DA8F91A419F3208B006F6675 /* BeforeSuiteTests.swift */, - DA8F91AA19F3299E006F6675 /* SharedExamplesTests.swift */, - DAB0136E19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift */, - 7B5358CA1C3D4E2A00A23FAA /* ContextTests.swift */, - AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */, - ); - path = FunctionalTests; - sourceTree = ""; - }; - DA9876BE1A4C87200004AA17 /* QuickFocusedTests */ = { - isa = PBXGroup; - children = ( - DA9876BF1A4C87200004AA17 /* FocusedTests.swift */, - DAF28BC21A4DB8EC00A5D9BF /* FocusedTests+ObjC.m */, - DA9876C31A4C87310004AA17 /* Supporting Files */, - ); - name = QuickFocusedTests; - path = Tests/QuickTests/QuickFocusedTests; - sourceTree = ""; - }; - DA9876C31A4C87310004AA17 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DA9876C01A4C87200004AA17 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - DAE714E919FF65A6005905B8 /* Configuration */ = { - isa = PBXGroup; - children = ( - DAE714F519FF67FF005905B8 /* AfterEach */, - DAE714EA19FF65A6005905B8 /* BeforeEach */, - ); - path = Configuration; - sourceTree = ""; - }; - DAE714EA19FF65A6005905B8 /* BeforeEach */ = { - isa = PBXGroup; - children = ( - DAE714F219FF65E7005905B8 /* Configuration+BeforeEach.swift */, - DAE714EF19FF65D3005905B8 /* Configuration+BeforeEachTests.swift */, - ); - path = BeforeEach; - sourceTree = ""; - }; - DAE714F519FF67FF005905B8 /* AfterEach */ = { - isa = PBXGroup; - children = ( - DAE714F619FF6812005905B8 /* Configuration+AfterEach.swift */, - DAE714F919FF682A005905B8 /* Configuration+AfterEachTests.swift */, - ); - path = AfterEach; - sourceTree = ""; - }; - DAEB6B841943873100289F44 = { - isa = PBXGroup; - children = ( - DAEB6B901943873100289F44 /* Quick */, - 6C3983EE1D1E930D00637469 /* QuickObjectiveC */, - DAEB6B9D1943873100289F44 /* QuickTests */, - DA9876BE1A4C87200004AA17 /* QuickFocusedTests */, - 64076D1C1D6D7D0B00E2B499 /* QuickAfterSuiteTests */, - DAEB6B8F1943873100289F44 /* Products */, - 1F118D331BDCA645005013A2 /* Frameworks */, - ); - indentWidth = 4; - sourceTree = ""; - tabWidth = 4; - }; - DAEB6B8F1943873100289F44 /* Products */ = { - isa = PBXGroup; - children = ( - DAEB6B8E1943873100289F44 /* Quick.framework */, - DAEB6B991943873100289F44 /* Quick-macOSTests.xctest */, - 5A5D117C19473F2100F6D13D /* Quick.framework */, - 5A5D118619473F2100F6D13D /* Quick-iOSTests.xctest */, - DA9876B21A4C70EB0004AA17 /* QuickFocused-iOSTests.xctest */, - DA5663E81A4C8D8500193C88 /* QuickFocused-macOSTests.xctest */, - 1F118CD51BDCA4AB005013A2 /* Quick.framework */, - 1F118CDE1BDCA4AB005013A2 /* Quick-tvOSTests.xctest */, - 1F118CF01BDCA4BB005013A2 /* QuickFocused-tvOSTests.xctest */, - 64076CF51D6D7C2000E2B499 /* QuickAfterSuite-macOSTests.xctest */, - 64076D081D6D7CD600E2B499 /* QuickAfterSuite-iOSTests.xctest */, - 64076D1A1D6D7CEA00E2B499 /* QuickAfterSuite-tvOSTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - DAEB6B901943873100289F44 /* Quick */ = { - isa = PBXGroup; - children = ( - DA169E4619FF5DF100619816 /* Configuration */, - DA3124E119FCAEE8002858A7 /* DSL */, - DA408BDE19FF5599005DF92A /* Hooks */, - 34F375A619515CA700CE1B99 /* World.swift */, - 34F3759E19515CA700CE1B99 /* Example.swift */, - DA02C91819A8073100093156 /* ExampleMetadata.swift */, - 34F3759F19515CA700CE1B99 /* ExampleGroup.swift */, - 34F3759C19515CA700CE1B99 /* Callsite.swift */, - DA6B30171A4DB0D500FFB148 /* Filter.swift */, - CE57CEDA1C430BD200D63004 /* QuickTestSuite.swift */, - CE57CED91C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift */, - CE57CED81C430BD200D63004 /* NSBundle+CurrentTestBundle.swift */, - CE57CEDB1C430BD200D63004 /* URL+FileName.swift */, - 34C586071C4AC5E500D4F057 /* ErrorUtility.swift */, - DAEB6B911943873100289F44 /* Supporting Files */, - ); - name = Quick; - path = Sources/Quick; - sourceTree = ""; - }; - DAEB6B911943873100289F44 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DAEB6B921943873100289F44 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - DAEB6B9D1943873100289F44 /* QuickTests */ = { - isa = PBXGroup; - children = ( - DA8C00201A01E4B900CE58A6 /* QuickConfigurationTests.m */, - DA8F919419F31680006F6675 /* Helpers */, - DAEB6BCD194387D700289F44 /* Fixtures */, - DA8F919B19F3189D006F6675 /* FunctionalTests */, - F8100E941A1E4469007595ED /* Frameworks */, - DAEB6B9E1943873100289F44 /* Supporting Files */, - ); - name = QuickTests; - path = Tests/QuickTests/QuickTests; - sourceTree = ""; - }; - DAEB6B9E1943873100289F44 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DAEB6B9F1943873100289F44 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - DAEB6BCD194387D700289F44 /* Fixtures */ = { - isa = PBXGroup; - children = ( - DA8F91AD19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift */, - ); - path = Fixtures; - sourceTree = ""; - }; - F8100E941A1E4469007595ED /* Frameworks */ = { - isa = PBXGroup; - children = ( - F8100E901A1E4447007595ED /* Nimble.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 1F118CD21BDCA4AB005013A2 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118D2B1BDCA5B6005013A2 /* Quick.h in Headers */, - 1F118D261BDCA5AF005013A2 /* World+DSL.h in Headers */, - 96327C651C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */, - 1F118D271BDCA5AF005013A2 /* World.h in Headers */, - 1F118D2A1BDCA5B6005013A2 /* QCKDSL.h in Headers */, - 1F118D2C1BDCA5B6005013A2 /* QuickSpec.h in Headers */, - 1F118D281BDCA5AF005013A2 /* NSString+QCKSelectorName.h in Headers */, - 1F118D291BDCA5B6005013A2 /* QuickConfiguration.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D117919473F2100F6D13D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 34F375B019515CA700CE1B99 /* NSString+QCKSelectorName.h in Headers */, - DAE714FF19FF6A62005905B8 /* QuickConfiguration.h in Headers */, - 96327C641C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */, - DA3124E919FCAEE8002858A7 /* QCKDSL.h in Headers */, - DAED1ECB1B110699006F61EC /* World+DSL.h in Headers */, - DAED1EC51B1105BC006F61EC /* World.h in Headers */, - 34F375B819515CA700CE1B99 /* QuickSpec.h in Headers */, - 5A5D11A7194740E000F6D13D /* Quick.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B8B1943873100289F44 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 34F375AF19515CA700CE1B99 /* NSString+QCKSelectorName.h in Headers */, - DAE714FE19FF6A62005905B8 /* QuickConfiguration.h in Headers */, - 96327C631C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.h in Headers */, - DA3124E819FCAEE8002858A7 /* QCKDSL.h in Headers */, - DAED1ECA1B110699006F61EC /* World+DSL.h in Headers */, - DAED1EC41B1105BC006F61EC /* World.h in Headers */, - 34F375B719515CA700CE1B99 /* QuickSpec.h in Headers */, - DAEB6B941943873100289F44 /* Quick.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F118CE61BDCA4AB005013A2 /* Build configuration list for PBXNativeTarget "Quick-tvOS" */; - buildPhases = ( - 1F118CD01BDCA4AB005013A2 /* Sources */, - 1F118CD11BDCA4AB005013A2 /* Frameworks */, - 1F118CD21BDCA4AB005013A2 /* Headers */, - 1F118CD31BDCA4AB005013A2 /* Resources */, - A870E6171DE00FC7006891AD /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Quick-tvOS"; - productName = "Quick-tvOS"; - productReference = 1F118CD51BDCA4AB005013A2 /* Quick.framework */; - productType = "com.apple.product-type.framework"; - }; - 1F118CDD1BDCA4AB005013A2 /* Quick-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F118CE91BDCA4AB005013A2 /* Build configuration list for PBXNativeTarget "Quick-tvOSTests" */; - buildPhases = ( - 1F118CDA1BDCA4AB005013A2 /* Sources */, - 1F118CDB1BDCA4AB005013A2 /* Frameworks */, - 1F118CDC1BDCA4AB005013A2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F118CE11BDCA4AB005013A2 /* PBXTargetDependency */, - ); - name = "Quick-tvOSTests"; - productName = "Quick-tvOSTests"; - productReference = 1F118CDE1BDCA4AB005013A2 /* Quick-tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 1F118CEF1BDCA4BB005013A2 /* QuickFocused-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1F118CF81BDCA4BC005013A2 /* Build configuration list for PBXNativeTarget "QuickFocused-tvOSTests" */; - buildPhases = ( - 1F118CEC1BDCA4BB005013A2 /* Sources */, - 1F118CED1BDCA4BB005013A2 /* Frameworks */, - 1F118CEE1BDCA4BB005013A2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1F118CF71BDCA4BB005013A2 /* PBXTargetDependency */, - ); - name = "QuickFocused-tvOSTests"; - productName = "QuickFocused-tvOSTests"; - productReference = 1F118CF01BDCA4BB005013A2 /* QuickFocused-tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 5A5D117B19473F2100F6D13D /* Quick-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5A5D119319473F2100F6D13D /* Build configuration list for PBXNativeTarget "Quick-iOS" */; - buildPhases = ( - 5A5D117719473F2100F6D13D /* Sources */, - 5A5D117819473F2100F6D13D /* Frameworks */, - 5A5D117919473F2100F6D13D /* Headers */, - 5A5D117A19473F2100F6D13D /* Resources */, - A870E6161DE00E50006891AD /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Quick-iOS"; - productName = "Quick-iOS"; - productReference = 5A5D117C19473F2100F6D13D /* Quick.framework */; - productType = "com.apple.product-type.framework"; - }; - 5A5D118519473F2100F6D13D /* Quick-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5A5D119419473F2100F6D13D /* Build configuration list for PBXNativeTarget "Quick-iOSTests" */; - buildPhases = ( - 5A5D118219473F2100F6D13D /* Sources */, - 5A5D118319473F2100F6D13D /* Frameworks */, - 5A5D118419473F2100F6D13D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5A5D118919473F2100F6D13D /* PBXTargetDependency */, - 5A5D11F0194741B500F6D13D /* PBXTargetDependency */, - 5A5D11F2194741B500F6D13D /* PBXTargetDependency */, - 04DC97E9194B4B7E00CE00B6 /* PBXTargetDependency */, - 04DC97EB194B4B9B00CE00B6 /* PBXTargetDependency */, - 04DC97F3194B82DE00CE00B6 /* PBXTargetDependency */, - 04DC97F7194B831200CE00B6 /* PBXTargetDependency */, - 04DC97FB194B834100CE00B6 /* PBXTargetDependency */, - 04DC97FF194B835E00CE00B6 /* PBXTargetDependency */, - 04DC9803194B836300CE00B6 /* PBXTargetDependency */, - 04DC9807194B838700CE00B6 /* PBXTargetDependency */, - ); - name = "Quick-iOSTests"; - productName = "Quick-iOSTests"; - productReference = 5A5D118619473F2100F6D13D /* Quick-iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 64076CE51D6D7C2000E2B499 /* QuickAfterSuite-macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 64076CF21D6D7C2000E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite-macOSTests" */; - buildPhases = ( - 64076CE81D6D7C2000E2B499 /* Sources */, - 64076CEE1D6D7C2000E2B499 /* Frameworks */, - 64076CF11D6D7C2000E2B499 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 64076CE61D6D7C2000E2B499 /* PBXTargetDependency */, - ); - name = "QuickAfterSuite-macOSTests"; - productName = "QuickFocused-macOSTests"; - productReference = 64076CF51D6D7C2000E2B499 /* QuickAfterSuite-macOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 64076CF81D6D7CD600E2B499 /* QuickAfterSuite-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 64076D051D6D7CD600E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite-iOSTests" */; - buildPhases = ( - 64076CFB1D6D7CD600E2B499 /* Sources */, - 64076D011D6D7CD600E2B499 /* Frameworks */, - 64076D041D6D7CD600E2B499 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 64076CF91D6D7CD600E2B499 /* PBXTargetDependency */, - ); - name = "QuickAfterSuite-iOSTests"; - productName = "QuickFocused-iOSTests"; - productReference = 64076D081D6D7CD600E2B499 /* QuickAfterSuite-iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 64076D0A1D6D7CEA00E2B499 /* QuickAfterSuite-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 64076D171D6D7CEA00E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite-tvOSTests" */; - buildPhases = ( - 64076D0D1D6D7CEA00E2B499 /* Sources */, - 64076D131D6D7CEA00E2B499 /* Frameworks */, - 64076D161D6D7CEA00E2B499 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 64076D0B1D6D7CEA00E2B499 /* PBXTargetDependency */, - ); - name = "QuickAfterSuite-tvOSTests"; - productName = "QuickFocused-tvOSTests"; - productReference = 64076D1A1D6D7CEA00E2B499 /* QuickAfterSuite-tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - DA5663E71A4C8D8500193C88 /* QuickFocused-macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DA5663F31A4C8D8500193C88 /* Build configuration list for PBXNativeTarget "QuickFocused-macOSTests" */; - buildPhases = ( - DA5663E41A4C8D8500193C88 /* Sources */, - DA5663E51A4C8D8500193C88 /* Frameworks */, - DA5663E61A4C8D8500193C88 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - DA5663F01A4C8D8500193C88 /* PBXTargetDependency */, - ); - name = "QuickFocused-macOSTests"; - productName = "QuickFocused-macOSTests"; - productReference = DA5663E81A4C8D8500193C88 /* QuickFocused-macOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - DA9876B11A4C70EB0004AA17 /* QuickFocused-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DA9876BD1A4C70EB0004AA17 /* Build configuration list for PBXNativeTarget "QuickFocused-iOSTests" */; - buildPhases = ( - DA9876AE1A4C70EB0004AA17 /* Sources */, - DA9876AF1A4C70EB0004AA17 /* Frameworks */, - DA9876B01A4C70EB0004AA17 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - DA9876BA1A4C70EB0004AA17 /* PBXTargetDependency */, - ); - name = "QuickFocused-iOSTests"; - productName = "QuickFocused-iOSTests"; - productReference = DA9876B21A4C70EB0004AA17 /* QuickFocused-iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - DAEB6B8D1943873100289F44 /* Quick-macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = DAEB6BA41943873200289F44 /* Build configuration list for PBXNativeTarget "Quick-macOS" */; - buildPhases = ( - DAEB6B891943873100289F44 /* Sources */, - DAEB6B8A1943873100289F44 /* Frameworks */, - DAEB6B8B1943873100289F44 /* Headers */, - DAEB6B8C1943873100289F44 /* Resources */, - A870E6151DE00E37006891AD /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Quick-macOS"; - productName = Quick; - productReference = DAEB6B8E1943873100289F44 /* Quick.framework */; - productType = "com.apple.product-type.framework"; - }; - DAEB6B981943873100289F44 /* Quick-macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DAEB6BA71943873200289F44 /* Build configuration list for PBXNativeTarget "Quick-macOSTests" */; - buildPhases = ( - DAEB6B951943873100289F44 /* Sources */, - DAEB6B961943873100289F44 /* Frameworks */, - DAEB6B971943873100289F44 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - DAEB6B9C1943873100289F44 /* PBXTargetDependency */, - 047655521949F4CB00B288BB /* PBXTargetDependency */, - 047655541949F4CB00B288BB /* PBXTargetDependency */, - 04765556194A327000B288BB /* PBXTargetDependency */, - 04DC97E5194B4A6000CE00B6 /* PBXTargetDependency */, - 04DC97E7194B4A6000CE00B6 /* PBXTargetDependency */, - 04DC97F1194B82DB00CE00B6 /* PBXTargetDependency */, - 04DC97F9194B834000CE00B6 /* PBXTargetDependency */, - 04DC97FD194B834B00CE00B6 /* PBXTargetDependency */, - 04DC9801194B836100CE00B6 /* PBXTargetDependency */, - 04DC9805194B838400CE00B6 /* PBXTargetDependency */, - 04DC9809194B838B00CE00B6 /* PBXTargetDependency */, - 93625F391951DDC8006B1FE1 /* PBXTargetDependency */, - ); - name = "Quick-macOSTests"; - productName = QuickTests; - productReference = DAEB6B991943873100289F44 /* Quick-macOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - DAEB6B851943873100289F44 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0710; - LastUpgradeCheck = 0810; - ORGANIZATIONNAME = "Brian Ivan Gesiak"; - TargetAttributes = { - 1F118CD41BDCA4AB005013A2 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 1F118CDD1BDCA4AB005013A2 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 1F118CEF1BDCA4BB005013A2 = { - CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0800; - }; - 5A5D117B19473F2100F6D13D = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - }; - 5A5D118519473F2100F6D13D = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - TestTargetID = 5A5D117B19473F2100F6D13D; - }; - DA5663E71A4C8D8500193C88 = { - CreatedOnToolsVersion = 6.2; - LastSwiftMigration = 0800; - }; - DA9876B11A4C70EB0004AA17 = { - CreatedOnToolsVersion = 6.2; - LastSwiftMigration = 0800; - }; - DAEB6B8D1943873100289F44 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - }; - DAEB6B981943873100289F44 = { - CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; - TestTargetID = DAEB6B8D1943873100289F44; - }; - }; - }; - buildConfigurationList = DAEB6B881943873100289F44 /* Build configuration list for PBXProject "Quick" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = DAEB6B841943873100289F44; - productRefGroup = DAEB6B8F1943873100289F44 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - DAEB6B8D1943873100289F44 /* Quick-macOS */, - DAEB6B981943873100289F44 /* Quick-macOSTests */, - DA5663E71A4C8D8500193C88 /* QuickFocused-macOSTests */, - 64076CE51D6D7C2000E2B499 /* QuickAfterSuite-macOSTests */, - 5A5D117B19473F2100F6D13D /* Quick-iOS */, - 5A5D118519473F2100F6D13D /* Quick-iOSTests */, - DA9876B11A4C70EB0004AA17 /* QuickFocused-iOSTests */, - 64076CF81D6D7CD600E2B499 /* QuickAfterSuite-iOSTests */, - 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */, - 1F118CDD1BDCA4AB005013A2 /* Quick-tvOSTests */, - 1F118CEF1BDCA4BB005013A2 /* QuickFocused-tvOSTests */, - 64076D0A1D6D7CEA00E2B499 /* QuickAfterSuite-tvOSTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1F118CD31BDCA4AB005013A2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CDC1BDCA4AB005013A2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CEE1BDCA4BB005013A2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D117A19473F2100F6D13D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D118419473F2100F6D13D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076CF11D6D7C2000E2B499 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D041D6D7CD600E2B499 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D161D6D7CEA00E2B499 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA5663E61A4C8D8500193C88 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA9876B01A4C70EB0004AA17 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B8C1943873100289F44 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B971943873100289F44 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - A870E6151DE00E37006891AD /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; - }; - A870E6161DE00E50006891AD /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; - }; - A870E6171DE00FC7006891AD /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1F118CD01BDCA4AB005013A2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 96327C681C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */, - 1F118D031BDCA536005013A2 /* World.swift in Sources */, - CE590E201C431FE400253D19 /* QuickSelectedTestSuiteBuilder.swift in Sources */, - 1F118CFC1BDCA536005013A2 /* Configuration.swift in Sources */, - 1F118D021BDCA536005013A2 /* SuiteHooks.swift in Sources */, - 1F118CFB1BDCA536005013A2 /* QuickConfiguration.m in Sources */, - 34C5860A1C4AC5E500D4F057 /* ErrorUtility.swift in Sources */, - 1F118D041BDCA536005013A2 /* Example.swift in Sources */, - 1F118CFF1BDCA536005013A2 /* QCKDSL.m in Sources */, - CE590E211C431FE400253D19 /* NSBundle+CurrentTestBundle.swift in Sources */, - 1F118D071BDCA536005013A2 /* Callsite.swift in Sources */, - CE590E231C431FE400253D19 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, - 1F118D081BDCA536005013A2 /* Filter.swift in Sources */, - 1F118CFD1BDCA536005013A2 /* World+DSL.swift in Sources */, - CE590E221C431FE400253D19 /* URL+FileName.swift in Sources */, - 1F118D0A1BDCA536005013A2 /* NSString+QCKSelectorName.m in Sources */, - 1F118CFE1BDCA536005013A2 /* DSL.swift in Sources */, - 7B44ADC01C5444940007AF2E /* HooksPhase.swift in Sources */, - 1F118D001BDCA536005013A2 /* Closures.swift in Sources */, - 1F118D051BDCA536005013A2 /* ExampleMetadata.swift in Sources */, - 1F118D061BDCA536005013A2 /* ExampleGroup.swift in Sources */, - CE590E1F1C431FE400253D19 /* QuickTestSuite.swift in Sources */, - 1F118D091BDCA536005013A2 /* QuickSpec.m in Sources */, - 1F118D011BDCA536005013A2 /* ExampleHooks.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CDA1BDCA4AB005013A2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118D381BDCA6E1005013A2 /* Configuration+BeforeEachTests.swift in Sources */, - 1F118D121BDCA556005013A2 /* ItTests.swift in Sources */, - 1F118D1C1BDCA556005013A2 /* BeforeSuiteTests.swift in Sources */, - 1F118D1D1BDCA556005013A2 /* BeforeSuiteTests+ObjC.m in Sources */, - 1F118D0E1BDCA547005013A2 /* QCKSpecRunner.m in Sources */, - 1F118D141BDCA556005013A2 /* FailureTests+ObjC.m in Sources */, - 1F118D0F1BDCA54B005013A2 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */, - 1F118D101BDCA556005013A2 /* Configuration+AfterEach.swift in Sources */, - 1F118D1A1BDCA556005013A2 /* PendingTests.swift in Sources */, - 1F118D171BDCA556005013A2 /* BeforeEachTests+ObjC.m in Sources */, - 1F118D231BDCA556005013A2 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */, - 1F118D151BDCA556005013A2 /* FailureUsingXCTAssertTests+ObjC.m in Sources */, - 1F118D131BDCA556005013A2 /* ItTests+ObjC.m in Sources */, - 1F118D191BDCA556005013A2 /* AfterEachTests+ObjC.m in Sources */, - 1F118D221BDCA556005013A2 /* SharedExamples+BeforeEachTests.swift in Sources */, - AE4E58171C73097E00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - AED9C8651CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */, - 1F118D211BDCA556005013A2 /* SharedExamplesTests+ObjC.m in Sources */, - 1F118D201BDCA556005013A2 /* SharedExamplesTests.swift in Sources */, - 1F118D0C1BDCA543005013A2 /* QuickConfigurationTests.m in Sources */, - 1F118D391BDCA6E6005013A2 /* Configuration+BeforeEach.swift in Sources */, - 1F118D181BDCA556005013A2 /* AfterEachTests.swift in Sources */, - 1F118D1B1BDCA556005013A2 /* PendingTests+ObjC.m in Sources */, - 34C586051C4ABD4100D4F057 /* XCTestCaseProvider.swift in Sources */, - 8D010A591C11726F00633E2B /* DescribeTests.swift in Sources */, - 1F118D111BDCA556005013A2 /* Configuration+AfterEachTests.swift in Sources */, - 1F118D161BDCA556005013A2 /* BeforeEachTests.swift in Sources */, - 7B5358D01C3D4FC000A23FAA /* ContextTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1F118CEC1BDCA4BB005013A2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1F118D0D1BDCA547005013A2 /* QCKSpecRunner.m in Sources */, - 34C586061C4ABD4100D4F057 /* XCTestCaseProvider.swift in Sources */, - 1F118D241BDCA561005013A2 /* FocusedTests.swift in Sources */, - 1F118D251BDCA561005013A2 /* FocusedTests+ObjC.m in Sources */, - AE4E58181C73097E00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D117719473F2100F6D13D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 96327C671C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */, - 34F375B219515CA700CE1B99 /* NSString+QCKSelectorName.m in Sources */, - CE590E1B1C431FE300253D19 /* QuickSelectedTestSuiteBuilder.swift in Sources */, - DA3124EB19FCAEE8002858A7 /* QCKDSL.m in Sources */, - DA408BE319FF5599005DF92A /* Closures.swift in Sources */, - DA02C91A19A8073100093156 /* ExampleMetadata.swift in Sources */, - 34C586091C4AC5E500D4F057 /* ErrorUtility.swift in Sources */, - DA408BE719FF5599005DF92A /* SuiteHooks.swift in Sources */, - 34F375BA19515CA700CE1B99 /* QuickSpec.m in Sources */, - CE590E1C1C431FE300253D19 /* NSBundle+CurrentTestBundle.swift in Sources */, - DAE7150119FF6A62005905B8 /* QuickConfiguration.m in Sources */, - CE590E1E1C431FE300253D19 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, - 34F375A819515CA700CE1B99 /* Callsite.swift in Sources */, - 34F375AE19515CA700CE1B99 /* ExampleGroup.swift in Sources */, - CE590E1D1C431FE300253D19 /* URL+FileName.swift in Sources */, - 34F375BC19515CA700CE1B99 /* World.swift in Sources */, - DA169E4919FF5DF100619816 /* Configuration.swift in Sources */, - 7B44ADBF1C5444940007AF2E /* HooksPhase.swift in Sources */, - DA3124ED19FCAEE8002858A7 /* World+DSL.swift in Sources */, - DA408BE519FF5599005DF92A /* ExampleHooks.swift in Sources */, - 34F375AC19515CA700CE1B99 /* Example.swift in Sources */, - CE590E1A1C431FE300253D19 /* QuickTestSuite.swift in Sources */, - DA3124E719FCAEE8002858A7 /* DSL.swift in Sources */, - DA6B30191A4DB0D500FFB148 /* Filter.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5A5D118219473F2100F6D13D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DAE714F819FF6812005905B8 /* Configuration+AfterEach.swift in Sources */, - DAA7C0D719F777EB0093D1D9 /* BeforeEachTests.swift in Sources */, - DA8F919A19F31680006F6675 /* QCKSpecRunner.m in Sources */, - DA8940F11B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m in Sources */, - 4728253C1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m in Sources */, - DAE714F119FF65D3005905B8 /* Configuration+BeforeEachTests.swift in Sources */, - DA05D61119F73A3800771050 /* AfterEachTests.swift in Sources */, - DAB0137019FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */, - DA8F91A619F3208B006F6675 /* BeforeSuiteTests.swift in Sources */, - DA8C00221A01E4B900CE58A6 /* QuickConfigurationTests.m in Sources */, - DAA63EA419F7637300CD0A3B /* PendingTests.swift in Sources */, - DA8F91AC19F3299E006F6675 /* SharedExamplesTests.swift in Sources */, - DA7AE6F219FC493F000AFDCE /* ItTests.swift in Sources */, - 4748E8951A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */, - DA8F91AF19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */, - DAE714FB19FF682A005905B8 /* Configuration+AfterEachTests.swift in Sources */, - AE4E58151C73097C00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - AED9C8641CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */, - 471590411A488F3F00FBA644 /* PendingTests+ObjC.m in Sources */, - DA8F919E19F31921006F6675 /* FailureTests+ObjC.m in Sources */, - DAE714F419FF65E7005905B8 /* Configuration+BeforeEach.swift in Sources */, - 479C31E41A36172700DA8718 /* ItTests+ObjC.m in Sources */, - 34C586031C4ABD4000D4F057 /* XCTestCaseProvider.swift in Sources */, - 8D010A581C11726F00633E2B /* DescribeTests.swift in Sources */, - 47FAEA371A3F49EB005A1D2F /* BeforeEachTests+ObjC.m in Sources */, - 470D6ECC1A43442900043E50 /* AfterEachTests+ObjC.m in Sources */, - 47876F7E1A49AD71002575C7 /* BeforeSuiteTests+ObjC.m in Sources */, - 7B5358CF1C3D4FBE00A23FAA /* ContextTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076CE81D6D7C2000E2B499 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D211D6D7E4D00E2B499 /* AfterSuiteTests.swift in Sources */, - CD264DBD1DDA147A0038B0EB /* AfterSuiteTests+ObjC.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076CFB1D6D7CD600E2B499 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D221D6D7E5B00E2B499 /* AfterSuiteTests.swift in Sources */, - 64076D261D6D80B500E2B499 /* AfterSuiteTests+ObjC.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 64076D0D1D6D7CEA00E2B499 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 64076D231D6D7E6B00E2B499 /* AfterSuiteTests.swift in Sources */, - 64076D271D6D80B500E2B499 /* AfterSuiteTests+ObjC.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA5663E41A4C8D8500193C88 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DA07722E1A4E5B7B0098839D /* QCKSpecRunner.m in Sources */, - 34C586021C4ABD3F00D4F057 /* XCTestCaseProvider.swift in Sources */, - DA5663F41A4C8D9A00193C88 /* FocusedTests.swift in Sources */, - DAF28BC31A4DB8EC00A5D9BF /* FocusedTests+ObjC.m in Sources */, - AE4E58141C73097A00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA9876AE1A4C70EB0004AA17 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DA07722F1A4E5B7C0098839D /* QCKSpecRunner.m in Sources */, - 34C586041C4ABD4000D4F057 /* XCTestCaseProvider.swift in Sources */, - DA9876C11A4C87200004AA17 /* FocusedTests.swift in Sources */, - DAF28BC41A4DB8EC00A5D9BF /* FocusedTests+ObjC.m in Sources */, - AE4E58161C73097C00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B891943873100289F44 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 96327C661C56E90C00405AB3 /* QuickSpec+QuickSpec_MethodList.m in Sources */, - 34F375B119515CA700CE1B99 /* NSString+QCKSelectorName.m in Sources */, - CE57CEDE1C430BD200D63004 /* QuickSelectedTestSuiteBuilder.swift in Sources */, - DA3124EA19FCAEE8002858A7 /* QCKDSL.m in Sources */, - DA408BE219FF5599005DF92A /* Closures.swift in Sources */, - CE57CEDD1C430BD200D63004 /* NSBundle+CurrentTestBundle.swift in Sources */, - DA02C91919A8073100093156 /* ExampleMetadata.swift in Sources */, - CE57CEDF1C430BD200D63004 /* QuickTestSuite.swift in Sources */, - 34C586081C4AC5E500D4F057 /* ErrorUtility.swift in Sources */, - DA408BE619FF5599005DF92A /* SuiteHooks.swift in Sources */, - 34F375B919515CA700CE1B99 /* QuickSpec.m in Sources */, - CE57CEE11C430BD200D63004 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, - DAE7150019FF6A62005905B8 /* QuickConfiguration.m in Sources */, - 34F375A719515CA700CE1B99 /* Callsite.swift in Sources */, - CE57CEE01C430BD200D63004 /* URL+FileName.swift in Sources */, - 34F375AD19515CA700CE1B99 /* ExampleGroup.swift in Sources */, - 34F375BB19515CA700CE1B99 /* World.swift in Sources */, - DA169E4819FF5DF100619816 /* Configuration.swift in Sources */, - 7B44ADBE1C5444940007AF2E /* HooksPhase.swift in Sources */, - DA3124EC19FCAEE8002858A7 /* World+DSL.swift in Sources */, - DA408BE419FF5599005DF92A /* ExampleHooks.swift in Sources */, - 34F375AB19515CA700CE1B99 /* Example.swift in Sources */, - DA3124E619FCAEE8002858A7 /* DSL.swift in Sources */, - DA6B30181A4DB0D500FFB148 /* Filter.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAEB6B951943873100289F44 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DAE714F719FF6812005905B8 /* Configuration+AfterEach.swift in Sources */, - DAB067E919F7801C00F970AC /* BeforeEachTests.swift in Sources */, - DA8F919919F31680006F6675 /* QCKSpecRunner.m in Sources */, - DA8940F01B35B1FA00161061 /* FailureUsingXCTAssertTests+ObjC.m in Sources */, - 4728253B1A5EECCE008DC74F /* SharedExamplesTests+ObjC.m in Sources */, - DAE714F019FF65D3005905B8 /* Configuration+BeforeEachTests.swift in Sources */, - DA05D61019F73A3800771050 /* AfterEachTests.swift in Sources */, - DAB0136F19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */, - DA8F91A519F3208B006F6675 /* BeforeSuiteTests.swift in Sources */, - DA8C00211A01E4B900CE58A6 /* QuickConfigurationTests.m in Sources */, - DAA63EA319F7637300CD0A3B /* PendingTests.swift in Sources */, - DA8F91AB19F3299E006F6675 /* SharedExamplesTests.swift in Sources */, - DA7AE6F119FC493F000AFDCE /* ItTests.swift in Sources */, - 4748E8941A6AEBB3009EC992 /* SharedExamples+BeforeEachTests+ObjC.m in Sources */, - DA8F91AE19F32CE2006F6675 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */, - DAE714FA19FF682A005905B8 /* Configuration+AfterEachTests.swift in Sources */, - AE4E58131C73097A00420A2E /* XCTestObservationCenter+QCKSuspendObservation.m in Sources */, - AED9C8631CC8A7BD00432F62 /* CrossReferencingSpecs.swift in Sources */, - 471590401A488F3F00FBA644 /* PendingTests+ObjC.m in Sources */, - DA8F919D19F31921006F6675 /* FailureTests+ObjC.m in Sources */, - DAE714F319FF65E7005905B8 /* Configuration+BeforeEach.swift in Sources */, - 479C31E31A36171B00DA8718 /* ItTests+ObjC.m in Sources */, - 34C586011C4ABD3F00D4F057 /* XCTestCaseProvider.swift in Sources */, - 8D010A571C11726F00633E2B /* DescribeTests.swift in Sources */, - 47FAEA361A3F49E6005A1D2F /* BeforeEachTests+ObjC.m in Sources */, - 470D6ECB1A43442400043E50 /* AfterEachTests+ObjC.m in Sources */, - 47876F7D1A49AD63002575C7 /* BeforeSuiteTests+ObjC.m in Sources */, - 7B5358CE1C3D4FBC00A23FAA /* ContextTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 047655521949F4CB00B288BB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 047655511949F4CB00B288BB /* PBXContainerItemProxy */; - }; - 047655541949F4CB00B288BB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 047655531949F4CB00B288BB /* PBXContainerItemProxy */; - }; - 04765556194A327000B288BB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04765555194A327000B288BB /* PBXContainerItemProxy */; - }; - 04DC97E5194B4A6000CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97E4194B4A6000CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97E7194B4A6000CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97E6194B4A6000CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97E9194B4B7E00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97E8194B4B7E00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97EB194B4B9B00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97EA194B4B9B00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F1194B82DB00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97F0194B82DB00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F3194B82DE00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97F2194B82DE00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F7194B831200CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97F6194B831200CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F9194B834000CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97F8194B834000CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97FB194B834100CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97FA194B834100CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97FD194B834B00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97FC194B834B00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97FF194B835E00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97FE194B835E00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9801194B836100CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC9800194B836100CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9803194B836300CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC9802194B836300CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9805194B838400CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC9804194B838400CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9807194B838700CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC9806194B838700CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9809194B838B00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC9808194B838B00CE00B6 /* PBXContainerItemProxy */; - }; - 1F118CE11BDCA4AB005013A2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */; - targetProxy = 1F118CE01BDCA4AB005013A2 /* PBXContainerItemProxy */; - }; - 1F118CF71BDCA4BB005013A2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */; - targetProxy = 1F118CF61BDCA4BB005013A2 /* PBXContainerItemProxy */; - }; - 5A5D118919473F2100F6D13D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 5A5D118819473F2100F6D13D /* PBXContainerItemProxy */; - }; - 5A5D11F0194741B500F6D13D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 5A5D11EF194741B500F6D13D /* PBXContainerItemProxy */; - }; - 5A5D11F2194741B500F6D13D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 5A5D11F1194741B500F6D13D /* PBXContainerItemProxy */; - }; - 64076CE61D6D7C2000E2B499 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 64076CE71D6D7C2000E2B499 /* PBXContainerItemProxy */; - }; - 64076CF91D6D7CD600E2B499 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 64076CFA1D6D7CD600E2B499 /* PBXContainerItemProxy */; - }; - 64076D0B1D6D7CEA00E2B499 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */; - targetProxy = 64076D0C1D6D7CEA00E2B499 /* PBXContainerItemProxy */; - }; - 93625F391951DDC8006B1FE1 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 93625F381951DDC8006B1FE1 /* PBXContainerItemProxy */; - }; - DA5663F01A4C8D8500193C88 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = DA5663EF1A4C8D8500193C88 /* PBXContainerItemProxy */; - }; - DA9876BA1A4C70EB0004AA17 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = DA9876B91A4C70EB0004AA17 /* PBXContainerItemProxy */; - }; - DAEB6B9C1943873100289F44 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = DAEB6B9B1943873100289F44 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1F118CE71BDCA4AB005013A2 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Sources/Quick/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Quick; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 1F118CE81BDCA4AB005013A2 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Sources/Quick/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Quick; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 1F118CEA1BDCA4AB005013A2 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 1F118CEB1BDCA4AB005013A2 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 1F118CF91BDCA4BC005013A2 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 1F118CFA1BDCA4BC005013A2 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 5A5D118F19473F2100F6D13D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/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"; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Quick; - PRODUCT_NAME = Quick; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 5A5D119019473F2100F6D13D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Sources/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"; - METAL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Quick; - PRODUCT_NAME = Quick; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 5A5D119119473F2100F6D13D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 5A5D119219473F2100F6D13D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 64076CF31D6D7C2000E2B499 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 64076CF41D6D7C2000E2B499 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 64076D061D6D7CD600E2B499 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 64076D071D6D7CD600E2B499 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 64076D181D6D7CEA00E2B499 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 64076D191D6D7CEA00E2B499 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Externals/Nimble/build/Debug-appletvos", - ); - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = Tests/QuickTests/QuickAfterSuiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - DA5663F11A4C8D8500193C88 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - DA5663F21A4C8D8500193C88 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - DA9876BB1A4C70EB0004AA17 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - DA9876BC1A4C70EB0004AA17 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickFocusedTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - DAEB6BA21943873200289F44 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - DAEB6BA31943873200289F44 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - METAL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - DAEB6BA51943873200289F44 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = Sources/Quick/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.9; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Quick; - PRODUCT_NAME = Quick; - SKIP_INSTALL = YES; - VALID_ARCHS = x86_64; - }; - name = Debug; - }; - DAEB6BA61943873200289F44 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = Sources/Quick/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.9; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_MODULE_NAME = Quick; - PRODUCT_NAME = Quick; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALID_ARCHS = x86_64; - }; - name = Release; - }; - DAEB6BA81943873200289F44 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - METAL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - DAEB6BA91943873200289F44 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(DEVELOPER_FRAMEWORKS_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - METAL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1F118CE61BDCA4AB005013A2 /* Build configuration list for PBXNativeTarget "Quick-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F118CE71BDCA4AB005013A2 /* Debug */, - 1F118CE81BDCA4AB005013A2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F118CE91BDCA4AB005013A2 /* Build configuration list for PBXNativeTarget "Quick-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F118CEA1BDCA4AB005013A2 /* Debug */, - 1F118CEB1BDCA4AB005013A2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1F118CF81BDCA4BC005013A2 /* Build configuration list for PBXNativeTarget "QuickFocused-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1F118CF91BDCA4BC005013A2 /* Debug */, - 1F118CFA1BDCA4BC005013A2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5A5D119319473F2100F6D13D /* Build configuration list for PBXNativeTarget "Quick-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5A5D118F19473F2100F6D13D /* Debug */, - 5A5D119019473F2100F6D13D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5A5D119419473F2100F6D13D /* Build configuration list for PBXNativeTarget "Quick-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5A5D119119473F2100F6D13D /* Debug */, - 5A5D119219473F2100F6D13D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 64076CF21D6D7C2000E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite-macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 64076CF31D6D7C2000E2B499 /* Debug */, - 64076CF41D6D7C2000E2B499 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 64076D051D6D7CD600E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 64076D061D6D7CD600E2B499 /* Debug */, - 64076D071D6D7CD600E2B499 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 64076D171D6D7CEA00E2B499 /* Build configuration list for PBXNativeTarget "QuickAfterSuite-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 64076D181D6D7CEA00E2B499 /* Debug */, - 64076D191D6D7CEA00E2B499 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DA5663F31A4C8D8500193C88 /* Build configuration list for PBXNativeTarget "QuickFocused-macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DA5663F11A4C8D8500193C88 /* Debug */, - DA5663F21A4C8D8500193C88 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DA9876BD1A4C70EB0004AA17 /* Build configuration list for PBXNativeTarget "QuickFocused-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DA9876BB1A4C70EB0004AA17 /* Debug */, - DA9876BC1A4C70EB0004AA17 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DAEB6B881943873100289F44 /* Build configuration list for PBXProject "Quick" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DAEB6BA21943873200289F44 /* Debug */, - DAEB6BA31943873200289F44 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DAEB6BA41943873200289F44 /* Build configuration list for PBXNativeTarget "Quick-macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DAEB6BA51943873200289F44 /* Debug */, - DAEB6BA61943873200289F44 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DAEB6BA71943873200289F44 /* Build configuration list for PBXNativeTarget "Quick-macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DAEB6BA81943873200289F44 /* Debug */, - DAEB6BA91943873200289F44 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = DAEB6B851943873100289F44 /* Project object */; -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a459aa8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-iOS.xcscheme b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-iOS.xcscheme deleted file mode 100644 index 988da03..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-iOS.xcscheme +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme deleted file mode 100644 index a4551d2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-tvOS.xcscheme b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-tvOS.xcscheme deleted file mode 100644 index bfb06ad..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-tvOS.xcscheme +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 48af53a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Quick.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/README.md deleted file mode 100644 index 637a989..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/README.md +++ /dev/null @@ -1,85 +0,0 @@ -![](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) - -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). - -![](https://raw.githubusercontent.com/Quick/Assets/master/Screenshots/QuickSpec%20screenshot.png) - -```swift -// Swift - -import Quick -import Nimble - -class TableOfContentsSpec: QuickSpec { - override func spec() { - describe("the 'Documentation' directory") { - it("has everything you need to get started") { - let sections = Directory("Documentation").sections - expect(sections).to(contain("Organized Tests with Quick Examples and Example Groups")) - expect(sections).to(contain("Installing Quick")) - } - - context("if it doesn't have what you're looking for") { - it("needs to be updated") { - let you = You(awesome: true) - expect{you.submittedAnIssue}.toEventually(beTruthy()) - } - } - } - } -} -``` -#### Nimble -Quick comes together with [Nimble](https://github.com/Quick/Nimble) — a matcher framework for your tests. You can learn why `XCTAssert()` statements make your expectations unclear and how to fix that using Nimble assertions [here](./Documentation/en-us/NimbleAssertions.md). - -## Swift Version - -Certain versions of Quick and Nimble only support certain versions of Swift. Depending on which version of Swift your project uses, you should use specific versions of Quick and Nimble. Use the table below to determine which versions of Quick and Nimble are compatible with your project. - -|Swift version |Quick version |Nimble version | -|:--------------------|:---------------|:--------------| -|Swift 3 |v0.10.0 or later|v5.0.0 or later| -|Swift 2.2 / Swift 2.3|v0.9.3 |v4.1.0 | - -## Documentation - -All documentation can be found in the [Documentation folder](./Documentation), including [detailed installation instructions](./Documentation/en-us/InstallingQuick.md) for CocoaPods, Carthage, Git submodules, and more. For example, you can install Quick and [Nimble](https://github.com/Quick/Nimble) using CocoaPods by adding the following to your Podfile: - -```rb -# Podfile - -use_frameworks! - -def testing_pods - pod 'Quick' - pod 'Nimble' -end - -target 'MyTests' do - testing_pods -end - -target 'MyUITests' do - testing_pods -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. - -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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Rakefile b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Rakefile deleted file mode 100644 index 7eb39cd..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Rakefile +++ /dev/null @@ -1,68 +0,0 @@ -def run(command) - system(command) or raise "RAKE TASK FAILED: #{command}" -end - -def has_xcodebuild - system "which xcodebuild >/dev/null" -end - -def xcode_action - ENV["XCODE_ACTION"] || "build test" -end - -namespace "podspec" do - desc "Run lint for podspec" - task :lint do - run "bundle exec pod lib lint" - end -end - -namespace "test" do - desc "Run unit tests for all iOS targets" - task :ios do |t| - run "xcodebuild -workspace Quick.xcworkspace -scheme Quick-iOS -destination 'platform=iOS Simulator,name=iPhone 6' clean #{xcode_action}" - end - - desc "Run unit tests for all tvOS targets" - task :tvos do |t| - run "xcodebuild -workspace Quick.xcworkspace -scheme Quick-tvOS -destination 'platform=tvOS Simulator,name=Apple TV 1080p' clean #{xcode_action}" - end - - desc "Run unit tests for all macOS targets" - task :macos do |t| - run "xcodebuild -workspace Quick.xcworkspace -scheme Quick-macOS clean #{xcode_action}" - end - - desc "Run unit tests for the current platform built by the Swift Package Manager" - task :swiftpm do |t| - run "mv Package.swift .Package.swift && cp .Package.test.swift Package.swift" - run "swift build --clean && swift build && swift test" - run "mv .Package.swift Package.swift" - end -end - -namespace "templates" do - install_dir = File.expand_path("~/Library/Developer/Xcode/Templates/File Templates/Quick") - src_dir = File.expand_path("../Quick Templates", __FILE__) - - desc "Install Quick templates" - task :install do - if File.exists? install_dir - raise "RAKE TASK FAILED: Quick templates are already installed at #{install_dir}" - else - mkdir_p install_dir - cp_r src_dir, install_dir - end - end - - desc "Uninstall Quick templates" - task :uninstall do - rm_rf install_dir - end -end - -if has_xcodebuild then - task default: ["test:ios", "test:tvos", "test:macos"] -else - task default: ["test:swiftpm"] -end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift deleted file mode 100644 index e617bc7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation - -/** - An object encapsulating the file and line number at which - a particular example is defined. -*/ -final public class Callsite: NSObject { - /** - The absolute path of the file in which an example is defined. - */ - public let file: String - - /** - The line number on which an example is defined. - */ - public let line: UInt - - internal init(file: String, line: UInt) { - self.file = file - self.line = line - } -} - -/** - 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 -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift deleted file mode 100644 index 99c1c93..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift +++ /dev/null @@ -1,161 +0,0 @@ -import Foundation - -/** - A closure that temporarily exposes a Configuration object within - the scope of the closure. -*/ -public typealias QuickConfigurer = (_ configuration: Configuration) -> () - -/** - A closure that, given metadata about an example, returns a boolean value - indicating whether that example should be run. -*/ -public typealias ExampleFilter = (_ example: Example) -> Bool - -/** - A configuration encapsulates various options you can use - to configure Quick's behavior. -*/ -final public class Configuration: NSObject { - internal let exampleHooks = ExampleHooks() - internal let suiteHooks = SuiteHooks() - internal var exclusionFilters: [ExampleFilter] = [ { example in - if let pending = example.filterFlags[Filter.pending] { - return pending - } else { - return false - } - }] - internal var inclusionFilters: [ExampleFilter] = [ { example in - if let focused = example.filterFlags[Filter.focused] { - return focused - } else { - return false - } - }] - - /** - Run all examples if none match the configured filters. True by default. - */ - public var runAllWhenEverythingFiltered = true - - /** - Registers an inclusion filter. - - All examples are filtered using all inclusion filters. - The remaining examples are run. If no examples remain, all examples are run. - - - parameter filter: A filter that, given an example, returns a value indicating - whether that example should be included in the examples - that are run. - */ - public func include(_ filter: @escaping ExampleFilter) { - inclusionFilters.append(filter) - } - - /** - Registers an exclusion filter. - - All examples that remain after being filtered by the inclusion filters are - then filtered via all exclusion filters. - - - parameter filter: A filter that, given an example, returns a value indicating - whether that example should be excluded from the examples - that are run. - */ - public func exclude(_ filter: @escaping ExampleFilter) { - exclusionFilters.append(filter) - } - - /** - Identical to Quick.Configuration.beforeEach, except the closure is - provided with metadata on the example that the closure is being run - prior to. - */ -#if _runtime(_ObjC) - @objc(beforeEachWithMetadata:) - public func beforeEach(_ closure: @escaping BeforeExampleWithMetadataClosure) { - exampleHooks.appendBefore(closure) - } -#else - public func beforeEach(_ closure: @escaping BeforeExampleWithMetadataClosure) { - exampleHooks.appendBefore(closure) - } -#endif - - /** - Like Quick.DSL.beforeEach, this configures Quick to execute the - given closure before each example that is run. The closure - passed to this method is executed before each example Quick runs, - globally across the test suite. You may call this method multiple - times across mulitple +[QuickConfigure configure:] methods in order - to define several closures to run before each example. - - Note that, since Quick makes no guarantee as to the order in which - +[QuickConfiguration configure:] methods are evaluated, there is no - guarantee as to the order in which beforeEach closures are evaluated - either. Mulitple beforeEach defined on a single configuration, however, - will be executed in the order they're defined. - - - parameter closure: The closure to be executed before each example - in the test suite. - */ - public func beforeEach(_ closure: @escaping BeforeExampleClosure) { - exampleHooks.appendBefore(closure) - } - - /** - Identical to Quick.Configuration.afterEach, except the closure - is provided with metadata on the example that the closure is being - run after. - */ -#if _runtime(_ObjC) - @objc(afterEachWithMetadata:) - public func afterEach(_ closure: @escaping AfterExampleWithMetadataClosure) { - exampleHooks.appendAfter(closure) - } -#else - public func afterEach(_ closure: @escaping AfterExampleWithMetadataClosure) { - exampleHooks.appendAfter(closure) - } -#endif - - /** - Like Quick.DSL.afterEach, this configures Quick to execute the - given closure after each example that is run. The closure - passed to this method is executed after each example Quick runs, - globally across the test suite. You may call this method multiple - times across mulitple +[QuickConfigure configure:] methods in order - to define several closures to run after each example. - - Note that, since Quick makes no guarantee as to the order in which - +[QuickConfiguration configure:] methods are evaluated, there is no - guarantee as to the order in which afterEach closures are evaluated - either. Mulitple afterEach defined on a single configuration, however, - will be executed in the order they're defined. - - - parameter closure: The closure to be executed before each example - in the test suite. - */ - public func afterEach(_ closure: @escaping AfterExampleClosure) { - exampleHooks.appendAfter(closure) - } - - /** - Like Quick.DSL.beforeSuite, this configures Quick to execute - the given closure prior to any and all examples that are run. - The two methods are functionally equivalent. - */ - public func beforeSuite(_ closure: @escaping BeforeSuiteClosure) { - suiteHooks.appendBefore(closure) - } - - /** - Like Quick.DSL.afterSuite, this configures Quick to execute - the given closure after all examples have been run. - The two methods are functionally equivalent. - */ - public func afterSuite(_ closure: @escaping AfterSuiteClosure) { - suiteHooks.appendAfter(closure) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift deleted file mode 100644 index c0378f4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift +++ /dev/null @@ -1,8 +0,0 @@ -import XCTest - -// NOTE: This file is not intended to be included in the Xcode project or CocoaPods. -// It is picked up by the Swift Package Manager during its build process. - -open class QuickConfiguration { - open class func configure(_ configuration: Configuration) {} -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/DSL/DSL.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/DSL/DSL.swift deleted file mode 100644 index b514b82..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/DSL/DSL.swift +++ /dev/null @@ -1,227 +0,0 @@ -/** - Defines a closure to be run prior to any examples in the test suite. - You may define an unlimited number of these closures, but there is no - guarantee as to the order in which they're run. - - If the test suite crashes before the first example is run, this closure - will not be executed. - - - parameter closure: The closure to be run prior to any examples in the test suite. -*/ -public func beforeSuite(_ closure: @escaping BeforeSuiteClosure) { - World.sharedWorld.beforeSuite(closure) -} - -/** - Defines a closure to be run after all of the examples in the test suite. - You may define an unlimited number of these closures, but there is no - guarantee as to the order in which they're run. - - If the test suite crashes before all examples are run, this closure - will not be executed. - - - parameter closure: The closure to be run after all of the examples in the test suite. -*/ -public func afterSuite(_ closure: @escaping AfterSuiteClosure) { - World.sharedWorld.afterSuite(closure) -} - -/** - Defines a group of shared examples. These examples can be re-used in several locations - by using the `itBehavesLike` function. - - - parameter name: The name of the shared example group. This must be unique across all shared example - groups defined in a test suite. - - parameter closure: A closure containing the examples. This behaves just like an example group defined - 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() }) -} - -/** - Defines a group of shared examples. These examples can be re-used in several locations - by using the `itBehavesLike` function. - - - parameter name: The name of the shared example group. This must be unique across all shared example - groups defined in a test suite. - - parameter closure: A closure containing the examples. This behaves just like an example group defined - 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`). - - The closure takes a SharedExampleContext as an argument. This context is a function - that can be executed to retrieve parameters passed in via an `itBehavesLike` function. -*/ -public func sharedExamples(_ name: String, closure: @escaping SharedExampleClosure) { - World.sharedWorld.sharedExamples(name, closure: closure) -} - -/** - Defines an example group. Example groups are logical groupings of examples. - Example groups can share setup and teardown code. - - - parameter description: An arbitrary string describing the example group. - - 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: () -> ()) { - World.sharedWorld.describe(description, flags: flags, closure: closure) -} - -/** - Defines an example group. Equivalent to `describe`. -*/ -public func context(_ description: String, flags: FilterFlags = [:], closure: () -> ()) { - World.sharedWorld.context(description, flags: flags, closure: closure) -} - -/** - Defines a closure to be run prior to each example in the current example - group. This closure is not run for pending or otherwise disabled examples. - An example group may contain an unlimited number of beforeEach. They'll be - run in the order they're defined, but you shouldn't rely on that behavior. - - - parameter closure: The closure to be run prior to each example. -*/ -public func beforeEach(_ closure: @escaping BeforeExampleClosure) { - World.sharedWorld.beforeEach(closure) -} - -/** - Identical to Quick.DSL.beforeEach, except the closure is provided with - metadata on the example that the closure is being run prior to. -*/ -public func beforeEach(_ closure: @escaping BeforeExampleWithMetadataClosure) { - World.sharedWorld.beforeEach(closure: closure) -} - -/** - Defines a closure to be run after each example in the current example - group. This closure is not run for pending or otherwise disabled examples. - An example group may contain an unlimited number of afterEach. They'll be - run in the order they're defined, but you shouldn't rely on that behavior. - - - parameter closure: The closure to be run after each example. -*/ -public func afterEach(_ closure: @escaping AfterExampleClosure) { - World.sharedWorld.afterEach(closure) -} - -/** - Identical to Quick.DSL.afterEach, except the closure is provided with - metadata on the example that the closure is being run after. -*/ -public func afterEach(_ closure: @escaping AfterExampleWithMetadataClosure) { - World.sharedWorld.afterEach(closure: closure) -} - -/** - Defines an example. Examples use assertions to demonstrate how code should - behave. These are like "tests" in XCTest. - - - parameter description: An arbitrary string describing what the example is meant to specify. - - parameter closure: A closure that can contain assertions. - - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. - Empty by default. - - parameter file: The absolute path to the file containing the 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 () -> ()) { - World.sharedWorld.it(description, flags: flags, file: file, line: line, closure: closure) -} - -/** - Inserts the examples defined using a `sharedExamples` function into the current example group. - The shared examples are executed at this location, as if they were written out manually. - - - parameter name: The name of the shared examples group to be executed. This must be identical to the - name of a shared examples group defined using `sharedExamples`. If there are no shared - examples that match the name given, an exception is thrown and the test suite will crash. - - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. - Empty by default. - - parameter file: The absolute path to the file containing the current example group. A sensible default is provided. - - parameter line: The line containing the current example group. A sensible default is provided. -*/ -public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line) { - itBehavesLike(name, flags: flags, file: file, line: line, sharedExampleContext: { return [:] }) -} - -/** - Inserts the examples defined using a `sharedExamples` function into the current example group. - The shared examples are executed at this location, as if they were written out manually. - This function also passes those shared examples a context that can be evaluated to give the shared - examples extra information on the subject of the example. - - - parameter name: The name of the shared examples group to be executed. This must be identical to the - name of a shared examples group defined using `sharedExamples`. If there are no shared - examples that match the name given, an exception is thrown and the test suite will crash. - - parameter sharedExampleContext: A closure that, when evaluated, returns key-value pairs that provide the - shared examples with extra information on the subject of the example. - - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. - Empty by default. - - parameter file: The absolute path to the file containing the current example group. A sensible default is provided. - - parameter line: The line containing the current example group. A sensible default is provided. -*/ -public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, sharedExampleContext: @escaping SharedExampleContext) { - World.sharedWorld.itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) -} - -/** - Defines an example or example group that should not be executed. Use `pending` to temporarily disable - examples or groups that should not be run yet. - - - 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: () -> ()) { - World.sharedWorld.pending(description, closure: 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: () -> ()) { - World.sharedWorld.xdescribe(description, flags: flags, closure: 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: () -> ()) { - xdescribe(description, flags: flags, closure: 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 () -> ()) { - World.sharedWorld.xit(description, flags: flags, file: file, line: line, closure: closure) -} - -/** - Use this to quickly focus a `describe` closure, focusing the examples in the closure. - If any examples in the test suite are focused, only those examples are executed. - 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: () -> ()) { - 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: () -> ()) { - fdescribe(description, flags: flags, closure: 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 () -> ()) { - World.sharedWorld.fit(description, flags: flags, file: file, line: line, closure: closure) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift deleted file mode 100644 index ab35341..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift +++ /dev/null @@ -1,169 +0,0 @@ -import Foundation - -/** - Adds methods to World to support top-level DSL functions (Swift) and - macros (Objective-C). These functions map directly to the DSL that test - writers use in their specs. -*/ -extension World { - internal func beforeSuite(_ closure: @escaping BeforeSuiteClosure) { - suiteHooks.appendBefore(closure) - } - - internal func afterSuite(_ closure: @escaping AfterSuiteClosure) { - suiteHooks.appendAfter(closure) - } - - internal func sharedExamples(_ name: String, closure: @escaping SharedExampleClosure) { - registerSharedExample(name, closure: closure) - } - - internal func describe(_ description: String, flags: FilterFlags, closure: () -> ()) { - guard currentExampleMetadata == nil else { - raiseError("'describe' cannot be used inside '\(currentPhase)', 'describe' may only be used inside 'context' or 'describe'. ") - } - guard currentExampleGroup != nil else { - raiseError("Error: example group was not created by its parent QuickSpec spec. Check that describe() or context() was used in QuickSpec.spec() and not a more general context (i.e. an XCTestCase test)") - } - let group = ExampleGroup(description: description, flags: flags) - currentExampleGroup.appendExampleGroup(group) - performWithCurrentExampleGroup(group, closure: closure) - } - - internal func context(_ description: String, flags: FilterFlags, closure: () -> ()) { - 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: () -> ()) { - var focusedFlags = flags - focusedFlags[Filter.focused] = true - self.describe(description, flags: focusedFlags, closure: closure) - } - - internal func xdescribe(_ description: String, flags: FilterFlags, closure: () -> ()) { - var pendingFlags = flags - pendingFlags[Filter.pending] = true - self.describe(description, flags: pendingFlags, closure: closure) - } - - internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { - guard currentExampleMetadata == nil else { - raiseError("'beforeEach' cannot be used inside '\(currentPhase)', 'beforeEach' may only be used inside 'context' or 'describe'. ") - } - currentExampleGroup.hooks.appendBefore(closure) - } - -#if _runtime(_ObjC) - @objc(beforeEachWithMetadata:) - internal func beforeEach(closure: @escaping BeforeExampleWithMetadataClosure) { - currentExampleGroup.hooks.appendBefore(closure) - } -#else - internal func beforeEach(closure: @escaping BeforeExampleWithMetadataClosure) { - currentExampleGroup.hooks.appendBefore(closure) - } -#endif - - internal func afterEach(_ closure: @escaping AfterExampleClosure) { - guard currentExampleMetadata == nil else { - raiseError("'afterEach' cannot be used inside '\(currentPhase)', 'afterEach' may only be used inside 'context' or 'describe'. ") - } - currentExampleGroup.hooks.appendAfter(closure) - } - -#if _runtime(_ObjC) - @objc(afterEachWithMetadata:) - internal func afterEach(closure: @escaping AfterExampleWithMetadataClosure) { - currentExampleGroup.hooks.appendAfter(closure) - } -#else - internal func afterEach(closure: @escaping AfterExampleWithMetadataClosure) { - currentExampleGroup.hooks.appendAfter(closure) - } -#endif - - internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> ()) { - if beforesCurrentlyExecuting { - raiseError("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'. ") - } - if aftersCurrentlyExecuting { - raiseError("'it' cannot be used inside 'afterEach', 'it' may only be used inside 'context' or 'describe'. ") - } - guard currentExampleMetadata == nil else { - raiseError("'it' cannot be used inside 'it', 'it' may only be used inside 'context' or 'describe'. ") - } - let callsite = Callsite(file: file, line: line) - let example = Example(description: description, callsite: callsite, flags: flags, closure: closure) - currentExampleGroup.appendExample(example) - } - - internal func fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> ()) { - 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 () -> ()) { - var pendingFlags = flags - pendingFlags[Filter.pending] = true - self.it(description, flags: pendingFlags, file: file, line: line, closure: closure) - } - - internal func itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { - guard currentExampleMetadata == nil else { - raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") - } - let callsite = Callsite(file: file, line: line) - let closure = World.sharedWorld.sharedExample(name) - - let group = ExampleGroup(description: name, flags: flags) - currentExampleGroup.appendExampleGroup(group) - performWithCurrentExampleGroup(group) { - closure(sharedExampleContext) - } - - group.walkDownExamples { (example: Example) in - example.isSharedExample = true - example.callsite = callsite - } - } - -#if _runtime(_ObjC) - @objc(itWithDescription:flags:file:line:closure:) - private func objc_it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> ()) { - 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 () -> ()) { - 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 () -> ()) { - xit(description, flags: flags, file: file, line: line, closure: closure) - } - - @objc(itBehavesLikeSharedExampleNamed:sharedExampleContext:flags:file:line:) - private func objc_itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { - itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) - } -#endif - - internal func pending(_ description: String, closure: () -> ()) { - print("Pending: \(description)") - } - - private var currentPhase: String { - if beforesCurrentlyExecuting { - return "beforeEach" - } else if aftersCurrentlyExecuting { - return "afterEach" - } - - return "it" - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ErrorUtility.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ErrorUtility.swift deleted file mode 100644 index 8405a81..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ErrorUtility.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -internal func raiseError(_ message: String) -> Never { -#if _runtime(_ObjC) - NSException(name: .internalInconsistencyException, reason: message, userInfo: nil).raise() -#endif - - // This won't be reached when ObjC is available and the exception above is raisd - fatalError(message) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Example.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Example.swift deleted file mode 100644 index 07bc529..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Example.swift +++ /dev/null @@ -1,111 +0,0 @@ -import Foundation - -private var numberOfExamplesRun = 0 - -/** - Examples, defined with the `it` function, use assertions to - demonstrate how code should behave. These are like "tests" in XCTest. -*/ -final public class Example: NSObject { - /** - A boolean indicating whether the example is a shared example; - i.e.: whether it is an example defined with `itBehavesLike`. - */ - public var isSharedExample = false - - /** - The site at which the example is defined. - This must be set correctly in order for Xcode to highlight - the correct line in red when reporting a failure. - */ - public var callsite: Callsite - - weak internal var group: ExampleGroup? - - private let internalDescription: String - private let closure: () -> () - private let flags: FilterFlags - - internal init(description: String, callsite: Callsite, flags: FilterFlags, closure: @escaping () -> ()) { - self.internalDescription = description - self.closure = closure - self.callsite = callsite - self.flags = flags - } - - public override var description: String { - return internalDescription - } - - /** - The example name. A name is a concatenation of the name of - the example group the example belongs to, followed by the - description of the example itself. - - The example name is used to generate a test method selector - to be displayed in Xcode's test navigator. - */ - public var name: String { - guard let groupName = group?.name else { return description } - return "\(groupName), \(description)" - } - - /** - Executes the example closure, as well as all before and after - closures defined in the its surrounding example groups. - */ - public func run() { - let world = World.sharedWorld - - if numberOfExamplesRun == 0 { - world.suiteHooks.executeBefores() - } - - let exampleMetadata = ExampleMetadata(example: self, exampleIndex: numberOfExamplesRun) - world.currentExampleMetadata = exampleMetadata - - world.exampleHooks.executeBefores(exampleMetadata) - group!.phase = .beforesExecuting - for before in group!.befores { - before(exampleMetadata) - } - group!.phase = .beforesFinished - - closure() - - group!.phase = .aftersExecuting - for after in group!.afters { - after(exampleMetadata) - } - group!.phase = .aftersFinished - world.exampleHooks.executeAfters(exampleMetadata) - - numberOfExamplesRun += 1 - - if !world.isRunningAdditionalSuites && numberOfExamplesRun >= world.includedExampleCount { - world.suiteHooks.executeAfters() - } - } - - /** - Evaluates the filter flags set on this example and on the example groups - this example belongs to. Flags set on the example are trumped by flags on - the example group it belongs to. Flags on inner example groups are trumped - by flags on outer example groups. - */ - internal var filterFlags: FilterFlags { - var aggregateFlags = flags - for (key, value) in group!.filterFlags { - aggregateFlags[key] = value - } - return aggregateFlags - } -} - -/** - 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 -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ExampleGroup.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ExampleGroup.swift deleted file mode 100644 index 79f24ca..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ExampleGroup.swift +++ /dev/null @@ -1,103 +0,0 @@ -import Foundation - -/** - Example groups are logical groupings of examples, defined with - the `describe` and `context` functions. Example groups can share - setup and teardown code. -*/ -final public class ExampleGroup: NSObject { - weak internal var parent: ExampleGroup? - internal let hooks = ExampleHooks() - - internal var phase: HooksPhase = .nothingExecuted - - private let internalDescription: String - private let flags: FilterFlags - private let isInternalRootExampleGroup: Bool - private var childGroups = [ExampleGroup]() - private var childExamples = [Example]() - - internal init(description: String, flags: FilterFlags, isInternalRootExampleGroup: Bool = false) { - self.internalDescription = description - self.flags = flags - self.isInternalRootExampleGroup = isInternalRootExampleGroup - } - - public override var description: String { - return internalDescription - } - - /** - Returns a list of examples that belong to this example group, - or to any of its descendant example groups. - */ - public var examples: [Example] { - var examples = childExamples - for group in childGroups { - examples.append(contentsOf: group.examples) - } - return examples - } - - internal var name: String? { - if let parent = parent { - guard let name = parent.name else { return description } - return "\(name), \(description)" - } else { - return isInternalRootExampleGroup ? nil : description - } - } - - internal var filterFlags: FilterFlags { - var aggregateFlags = flags - walkUp() { (group: ExampleGroup) -> () in - for (key, value) in group.flags { - aggregateFlags[key] = value - } - } - return aggregateFlags - } - - internal var befores: [BeforeExampleWithMetadataClosure] { - var closures = Array(hooks.befores.reversed()) - walkUp() { (group: ExampleGroup) -> () in - closures.append(contentsOf: Array(group.hooks.befores.reversed())) - } - return Array(closures.reversed()) - } - - internal var afters: [AfterExampleWithMetadataClosure] { - var closures = hooks.afters - walkUp() { (group: ExampleGroup) -> () in - closures.append(contentsOf: group.hooks.afters) - } - return closures - } - - internal func walkDownExamples(_ callback: (_ example: Example) -> ()) { - for example in childExamples { - callback(example) - } - for group in childGroups { - group.walkDownExamples(callback) - } - } - - internal func appendExampleGroup(_ group: ExampleGroup) { - group.parent = self - childGroups.append(group) - } - - internal func appendExample(_ example: Example) { - example.group = self - childExamples.append(example) - } - - private func walkUp(_ callback: (_ group: ExampleGroup) -> ()) { - var group = self - while let parent = group.parent { - callback(parent) - group = parent - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift deleted file mode 100644 index e7510f7..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift +++ /dev/null @@ -1,24 +0,0 @@ -import Foundation - -/** - A class that encapsulates information about an example, - including the index at which the example was executed, as - well as the example itself. -*/ -final public class ExampleMetadata: NSObject { - /** - The example for which this metadata was collected. - */ - public let example: Example - - /** - The index at which this example was executed in the - test suite. - */ - public let exampleIndex: Int - - internal init(example: Example, exampleIndex: Int) { - self.example = example - self.exampleIndex = exampleIndex - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift deleted file mode 100644 index d452efe..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation - -/** - A mapping of string keys to booleans that can be used to - filter examples or example groups. For example, a "focused" - example would have the flags [Focused: true]. -*/ -public typealias FilterFlags = [String: Bool] - -/** - A namespace for filter flag keys, defined primarily to make the - keys available in Objective-C. -*/ -final public class Filter: NSObject { - /** - Example and example groups with [Focused: true] are included in test runs, - excluding all other examples without this flag. Use this to only run one or - two tests that you're currently focusing on. - */ - public class var focused: String { - return "focused" - } - - /** - Example and example groups with [Pending: true] are excluded from test runs. - Use this to temporarily suspend examples that you know do not pass yet. - */ - public class var pending: String { - return "pending" - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/Closures.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/Closures.swift deleted file mode 100644 index a241b33..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/Closures.swift +++ /dev/null @@ -1,35 +0,0 @@ -// MARK: Example Hooks - -/** - A closure executed before an example is run. -*/ -public typealias BeforeExampleClosure = () -> () - -/** - 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) -> () - -/** - A closure executed after an example is run. -*/ -public typealias AfterExampleClosure = BeforeExampleClosure - -/** - A closure executed after an example is run. The closure is given example metadata, - which contains information about the example that has just finished running. -*/ -public typealias AfterExampleWithMetadataClosure = BeforeExampleWithMetadataClosure - -// MARK: Suite Hooks - -/** - A closure executed before any examples are run. -*/ -public typealias BeforeSuiteClosure = () -> () - -/** - A closure executed after all examples have finished running. -*/ -public typealias AfterSuiteClosure = BeforeSuiteClosure diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/ExampleHooks.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/ExampleHooks.swift deleted file mode 100644 index 565287b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/ExampleHooks.swift +++ /dev/null @@ -1,42 +0,0 @@ -/** - A container for closures to be executed before and after each example. -*/ -final internal class ExampleHooks { - internal var befores: [BeforeExampleWithMetadataClosure] = [] - internal var afters: [AfterExampleWithMetadataClosure] = [] - internal var phase: HooksPhase = .nothingExecuted - - internal func appendBefore(_ closure: @escaping BeforeExampleWithMetadataClosure) { - befores.append(closure) - } - - internal func appendBefore(_ closure: @escaping BeforeExampleClosure) { - befores.append { (exampleMetadata: ExampleMetadata) in closure() } - } - - internal func appendAfter(_ closure: @escaping AfterExampleWithMetadataClosure) { - afters.append(closure) - } - - internal func appendAfter(_ closure: @escaping AfterExampleClosure) { - afters.append { (exampleMetadata: ExampleMetadata) in closure() } - } - - internal func executeBefores(_ exampleMetadata: ExampleMetadata) { - phase = .beforesExecuting - for before in befores { - before(exampleMetadata) - } - - phase = .beforesFinished - } - - internal func executeAfters(_ exampleMetadata: ExampleMetadata) { - phase = .aftersExecuting - for after in afters { - after(exampleMetadata) - } - - phase = .aftersFinished - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/HooksPhase.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/HooksPhase.swift deleted file mode 100644 index 2440158..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/HooksPhase.swift +++ /dev/null @@ -1,11 +0,0 @@ -/** - A description of the execution cycle of the current example with - respect to the hooks of that example. - */ -internal enum HooksPhase { - case nothingExecuted - case beforesExecuting - case beforesFinished - case aftersExecuting - case aftersFinished -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/SuiteHooks.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/SuiteHooks.swift deleted file mode 100644 index b39292b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Hooks/SuiteHooks.swift +++ /dev/null @@ -1,32 +0,0 @@ -/** - A container for closures to be executed before and after all examples. -*/ -final internal class SuiteHooks { - internal var befores: [BeforeSuiteClosure] = [] - internal var afters: [AfterSuiteClosure] = [] - internal var phase: HooksPhase = .nothingExecuted - - internal func appendBefore(_ closure: @escaping BeforeSuiteClosure) { - befores.append(closure) - } - - internal func appendAfter(_ closure: @escaping AfterSuiteClosure) { - afters.append(closure) - } - - internal func executeBefores() { - phase = .beforesExecuting - for before in befores { - before() - } - phase = .beforesFinished - } - - internal func executeAfters() { - phase = .aftersExecuting - for after in afters { - after() - } - phase = .aftersFinished - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Info.plist deleted file mode 100644 index 9667430..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSHumanReadableCopyright - Copyright © 2014 - present, Quick Team. All rights reserved. - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift deleted file mode 100644 index 730843e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift +++ /dev/null @@ -1,16 +0,0 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) - -import Foundation - -extension Bundle { - - /** - Locates the first bundle with a '.xctest' file extension. - */ - internal static var currentTestBundle: Bundle? { - return allBundles.first { $0.bundlePath.hasSuffix(".xctest") } - } - -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickMain.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickMain.swift deleted file mode 100644 index e3bed9f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickMain.swift +++ /dev/null @@ -1,33 +0,0 @@ -import XCTest -#if os(Linux) -// NOTE: This file is not intended to be included in the Xcode project or CocoaPods. -// It is picked up by the Swift Package Manager during its build process. - -/// When using Quick with swift-corelibs-xctest, automatic discovery of specs and -/// configurations is not available. Instead, you should create a standalone -/// executable and call this function from its main.swift file. This will execute -/// the specs and then terminate the process with an exit code of 0 if the tests -/// passed, or 1 if there were any failures. -/// -/// Quick is known to work with the DEVELOPMENT-SNAPSHOT-2016-02-08-a Swift toolchain. -/// -/// - parameter specs: An array of QuickSpec subclasses to run -/// - parameter configurations: An array QuickConfiguration subclasses for setting up -// global suite configuration (optional) -/// - parameter testCases: An array of XCTestCase test cases, just as would be passed -/// info `XCTMain` if you were using swift-corelibs-xctest directly. -/// This allows for mixing Quick specs and XCTestCase tests in one run. -public func QCKMain(_ specs: [QuickSpec.Type], - configurations: [QuickConfiguration.Type] = [], - testCases: [XCTestCaseEntry] = []) -> Never { - // Perform all configuration (ensures that shared examples have been discovered) - World.sharedWorld.configure { configuration in - for configurationClass in configurations { - configurationClass.configure(configuration) - } - } - World.sharedWorld.finalizeConfiguration() - - XCTMain(specs.flatMap { testCase($0.allTests) } + testCases) -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift deleted file mode 100644 index ec2e308..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift +++ /dev/null @@ -1,75 +0,0 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) -import Foundation - -/** - Responsible for building a "Selected tests" suite. This corresponds to a single - spec, and all its examples. - */ -internal class QuickSelectedTestSuiteBuilder: QuickTestSuiteBuilder { - - /** - The test spec class to run. - */ - let testCaseClass: AnyClass! - - /** - For Objective-C classes, returns the class name. For Swift classes without, - an explicit Objective-C name, returns a module-namespaced class name - (e.g., "FooTests.FooSpec"). - */ - var testSuiteClassName: String { - return NSStringFromClass(testCaseClass) - } - - /** - Given a test case name: - - FooSpec/testFoo - - Optionally constructs a test suite builder for the named test case class - in the running test bundle. - - If no test bundle can be found, or the test case class can't be found, - initialization fails and returns `nil`. - */ - init?(forTestCaseWithName name: String) { - guard let testCaseClass = testCaseClassForTestCaseWithName(name) else { - self.testCaseClass = nil - return nil - } - - self.testCaseClass = testCaseClass - } - - /** - Returns a `QuickTestSuite` that runs the associated test case class. - */ - func buildTestSuite() -> QuickTestSuite { - return QuickTestSuite(forTestCaseClass: testCaseClass) - } - -} - -/** - Searches `Bundle.allBundles()` for an xctest bundle, then looks up the named - test case class in that bundle. - - Returns `nil` if a bundle or test case class cannot be found. - */ -private func testCaseClassForTestCaseWithName(_ name: String) -> AnyClass? { - func extractClassName(_ name: String) -> String? { - return name.components(separatedBy: "/").first - } - - guard let className = extractClassName(name) else { return nil } - guard let bundle = Bundle.currentTestBundle else { return nil } - - if let testCaseClass = bundle.classNamed(className) { return testCaseClass } - - let bundleFileName = bundle.bundleURL.fileName - let moduleName = bundleFileName.replacingOccurrences(of: " ", with: "_") - - return NSClassFromString("\(moduleName).\(className)") -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift deleted file mode 100644 index e4dd728..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift +++ /dev/null @@ -1,48 +0,0 @@ -import XCTest - -// NOTE: This file is not intended to be included in the Xcode project or CocoaPods. -// It is picked up by the Swift Package Manager during its build process. - -open class QuickSpec: XCTestCase { - open func spec() {} - -#if os(Linux) - public required init() { - super.init(name: "", testClosure: { _ in }) - } - public required init(name: String, testClosure: @escaping (XCTestCase) throws -> Swift.Void) { - super.init(name: name, testClosure: testClosure) - } -#else - public required override init() { - super.init() - } -#endif - - static var allTestsCache = [String : [(String, (XCTestCase) -> () throws -> Void)]]() - - public class var allTests: [(String, (XCTestCase) -> () throws -> Void)] { - if let cached = allTestsCache[String(describing: self)] { - return cached - } - - gatherExamplesIfNeeded() - - let examples = World.sharedWorld.examples(self) - let result = examples.map { example -> (String, (XCTestCase) -> () throws -> Void) in - return (example.name, { _ in { example.run() } }) - } - allTestsCache[String(describing: self)] = result - return result - } - - internal static func gatherExamplesIfNeeded() { - let world = World.sharedWorld - let rootExampleGroup = world.rootExampleGroupForSpecClass(self) - if rootExampleGroup.examples.isEmpty { - world.currentExampleGroup = rootExampleGroup - self.init().spec() - world.currentExampleGroup = nil - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickTestSuite.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickTestSuite.swift deleted file mode 100644 index 0cb5187..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/QuickTestSuite.swift +++ /dev/null @@ -1,52 +0,0 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) - -import XCTest - -/** - This protocol defines the role of an object that builds test suites. - */ -internal protocol QuickTestSuiteBuilder { - - /** - Construct a `QuickTestSuite` instance with the appropriate test cases added as tests. - - Subsequent calls to this method should return equivalent test suites. - */ - func buildTestSuite() -> QuickTestSuite - -} - -/** - A base class for a class cluster of Quick test suites, that should correctly - build dynamic test suites for XCTest to execute. - */ -public class QuickTestSuite: XCTestSuite { - - private static var builtTestSuites: Set = Set() - - /** - Construct a test suite for a specific, selected subset of test cases (rather - than the default, which as all test cases). - - If this method is called multiple times for the same test case class, e.g.. - - FooSpec/testFoo - FooSpec/testBar - - It is expected that the first call should return a valid test suite, and - all subsequent calls should return `nil`. - */ - public static func selectedTestSuite(forTestCaseWithName name: String) -> QuickTestSuite? { - guard let builder = QuickSelectedTestSuiteBuilder(forTestCaseWithName: name) else { return nil } - - if builtTestSuites.contains(builder.testSuiteClassName) { - return nil - } else { - builtTestSuites.insert(builder.testSuiteClassName) - return builder.buildTestSuite() - } - } - -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/URL+FileName.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/URL+FileName.swift deleted file mode 100644 index 23c4781..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/URL+FileName.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation - -extension URL { - - /** - Returns the path file name without file extension. - */ - var fileName: String { - return self.deletingPathExtension().lastPathComponent - } - -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/World.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/World.swift deleted file mode 100644 index 487902e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/Quick/World.swift +++ /dev/null @@ -1,232 +0,0 @@ -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) - -/** - 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) -> () - -/** - A collection of state Quick builds up in order to work its magic. - World is primarily responsible for maintaining a mapping of QuickSpec - classes to root example groups for those classes. - - It also maintains a mapping of shared example names to shared - example closures. - - You may configure how Quick behaves by calling the -[World configure:] - method from within an overridden +[QuickConfiguration configure:] method. -*/ -final internal class World: NSObject { - /** - The example group that is currently being run. - The DSL requires that this group is correctly set in order to build a - correct hierarchy of example groups and their examples. - */ - internal var currentExampleGroup: ExampleGroup! - - /** - The example metadata of the test that is currently being run. - This is useful for using the Quick test metadata (like its name) at - runtime. - */ - - internal var currentExampleMetadata: ExampleMetadata? - - /** - A flag that indicates whether additional test suites are being run - within this test suite. This is only true within the context of Quick - functional tests. - */ -#if _runtime(_ObjC) - // Convention of generating Objective-C selector has been changed on Swift 3 - @objc(isRunningAdditionalSuites) - internal var isRunningAdditionalSuites = false -#else - internal var isRunningAdditionalSuites = false -#endif - - private var specs: Dictionary = [:] - private var sharedExamples: [String: SharedExampleClosure] = [:] - private let configuration = Configuration() - private var isConfigurationFinalized = false - - internal var exampleHooks: ExampleHooks {return configuration.exampleHooks } - internal var suiteHooks: SuiteHooks { return configuration.suiteHooks } - - // MARK: Singleton Constructor - - private override init() {} - static let sharedWorld = World() - - // MARK: Public Interface - - /** - Exposes the World's Configuration object within the scope of the closure - so that it may be configured. This method must not be called outside of - an overridden +[QuickConfiguration configure:] method. - - - parameter closure: A closure that takes a Configuration object that can - be mutated to change Quick's behavior. - */ - internal func configure(_ closure: QuickConfigurer) { - assert(!isConfigurationFinalized, - "Quick cannot be configured outside of a +[QuickConfiguration configure:] method. You should not call -[World configure:] directly. Instead, subclass QuickConfiguration and override the +[QuickConfiguration configure:] method.") - closure(configuration) - } - - /** - Finalizes the World's configuration. - Any subsequent calls to World.configure() will raise. - */ - internal func finalizeConfiguration() { - isConfigurationFinalized = true - } - - /** - Returns an internally constructed root example group for the given - QuickSpec class. - - A root example group with the description "root example group" is lazily - initialized for each QuickSpec class. This root example group wraps the - top level of a -[QuickSpec spec] method--it's thanks to this group that - users can define beforeEach and it closures at the top level, like so: - - override func spec() { - // These belong to the root example group - beforeEach {} - it("is at the top level") {} - } - - - parameter cls: The QuickSpec class for which to retrieve the root example group. - - returns: The root example group for the class. - */ - internal func rootExampleGroupForSpecClass(_ cls: AnyClass) -> ExampleGroup { - let name = String(describing: cls) - - if let group = specs[name] { - return group - } else { - let group = ExampleGroup( - description: "root example group", - flags: [:], - isInternalRootExampleGroup: true - ) - specs[name] = group - return group - } - } - - /** - Returns all examples that should be run for a given spec class. - There are two filtering passes that occur when determining which examples should be run. - That is, these examples are the ones that are included by inclusion filters, and are - not excluded by exclusion filters. - - - parameter specClass: The QuickSpec subclass for which examples are to be returned. - - returns: A list of examples to be run as test invocations. - */ - internal func examples(_ specClass: AnyClass) -> [Example] { - // 1. Grab all included examples. - let included = includedExamples - // 2. Grab the intersection of (a) examples for this spec, and (b) included examples. - let spec = rootExampleGroupForSpecClass(specClass).examples.filter { included.contains($0) } - // 3. Remove all excluded examples. - return spec.filter { example in - !self.configuration.exclusionFilters.reduce(false) { $0 || $1(example) } - } - } - -#if _runtime(_ObjC) - @objc(examplesForSpecClass:) - private func objc_examples(_ specClass: AnyClass) -> [Example] { - return examples(specClass) - } -#endif - - // MARK: Internal - - internal func registerSharedExample(_ name: String, closure: @escaping SharedExampleClosure) { - raiseIfSharedExampleAlreadyRegistered(name) - sharedExamples[name] = closure - } - - internal func sharedExample(_ name: String) -> SharedExampleClosure { - raiseIfSharedExampleNotRegistered(name) - return sharedExamples[name]! - } - - internal var includedExampleCount: Int { - return includedExamples.count - } - - internal var beforesCurrentlyExecuting: Bool { - let suiteBeforesExecuting = suiteHooks.phase == .beforesExecuting - let exampleBeforesExecuting = exampleHooks.phase == .beforesExecuting - var groupBeforesExecuting = false - 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 - var groupAftersExecuting = false - if let runningExampleGroup = currentExampleMetadata?.example.group { - groupAftersExecuting = runningExampleGroup.phase == .aftersExecuting - } - - return suiteAftersExecuting || exampleAftersExecuting || groupAftersExecuting - } - - internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { - let previousExampleGroup = currentExampleGroup - currentExampleGroup = group - - closure() - - currentExampleGroup = previousExampleGroup - } - - private var allExamples: [Example] { - var all: [Example] = [] - for (_, group) in specs { - group.walkDownExamples { all.append($0) } - } - return all - } - - private var includedExamples: [Example] { - let all = allExamples - let included = all.filter { example in - return self.configuration.inclusionFilters.reduce(false) { $0 || $1(example) } - } - - if included.isEmpty && configuration.runAllWhenEverythingFiltered { - return all - } else { - return included - } - } - - private func raiseIfSharedExampleAlreadyRegistered(_ name: String) { - if sharedExamples[name] != nil { - raiseError("A shared example named '\(name)' has already been registered.") - } - } - - private func raiseIfSharedExampleNotRegistered(_ name: String) { - if sharedExamples[name] == nil { - raiseError("No shared example named '\(name)' has been registered. Registered shared examples: '\(Array(sharedExamples.keys))'") - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.h deleted file mode 100644 index 5646199..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.h +++ /dev/null @@ -1,30 +0,0 @@ -#import - -@class Configuration; - -/** - Subclass QuickConfiguration and override the +[QuickConfiguration configure:] - method in order to configure how Quick behaves when running specs, or to define - shared examples that are used across spec files. - */ -@interface QuickConfiguration : NSObject - -/** - This method is executed on each subclass of this class before Quick runs - any examples. You may override this method on as many subclasses as you like, but - there is no guarantee as to the order in which these methods are executed. - - You can override this method in order to: - - 1. Configure how Quick behaves, by modifying properties on the Configuration object. - Setting the same properties in several methods has undefined behavior. - - 2. Define shared examples using `sharedExamples`. - - @param configuration A mutable object that is used to configure how Quick behaves on - a framework level. For details on all the options, see the - documentation in Configuration.swift. - */ -+ (void)configure:(Configuration *)configuration; - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m deleted file mode 100644 index 937b818..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m +++ /dev/null @@ -1,83 +0,0 @@ -#import "QuickConfiguration.h" -#import "World.h" -#import - -typedef void (^QCKClassEnumerationBlock)(Class klass); - -/** - Finds all direct subclasses of the given class and passes them to the block provided. - The classes are iterated over in the order that objc_getClassList returns them. - - @param klass The base class to find subclasses of. - @param block A block that takes a Class. This block will be executed once for each subclass of klass. - */ -void qck_enumerateSubclasses(Class klass, QCKClassEnumerationBlock block) { - Class *classes = NULL; - int classesCount = objc_getClassList(NULL, 0); - - if (classesCount > 0) { - classes = (Class *)calloc(sizeof(Class), classesCount); - classesCount = objc_getClassList(classes, classesCount); - - Class subclass, superclass; - for(int i = 0; i < classesCount; i++) { - subclass = classes[i]; - superclass = class_getSuperclass(subclass); - if (superclass == klass && block) { - block(subclass); - } - } - - free(classes); - } -} - -@implementation QuickConfiguration - -#pragma mark - Object Lifecycle - -/** - QuickConfiguration is not meant to be instantiated; it merely provides a hook - for users to configure how Quick behaves. Raise an exception if an instance of - QuickConfiguration is created. - */ -- (instancetype)init { - NSString *className = NSStringFromClass([self class]); - NSString *selectorName = NSStringFromSelector(@selector(configure:)); - [NSException raise:NSInternalInconsistencyException - format:@"%@ is not meant to be instantiated; " - @"subclass %@ and override %@ to configure Quick.", - className, className, selectorName]; - return nil; -} - -#pragma mark - NSObject Overrides - -/** - Hook into when QuickConfiguration is initialized in the runtime in order to - call +[QuickConfiguration configure:] on each of its subclasses. - */ -+ (void)initialize { - // Only enumerate over the subclasses of QuickConfiguration, not any of its subclasses. - if ([self class] == [QuickConfiguration class]) { - - // Only enumerate over subclasses once, even if +[QuickConfiguration initialize] - // were to be called several times. This is necessary because +[QuickSpec initialize] - // manually calls +[QuickConfiguration initialize]. - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - qck_enumerateSubclasses([QuickConfiguration class], ^(__unsafe_unretained Class klass) { - [[World sharedWorld] configure:^(Configuration *configuration) { - [klass configure:configuration]; - }]; - }); - [[World sharedWorld] finalizeConfiguration]; - }); - } -} - -#pragma mark - Public Interface - -+ (void)configure:(Configuration *)configuration { } - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.h deleted file mode 100644 index c5f3152..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.h +++ /dev/null @@ -1,234 +0,0 @@ -#import - -@class ExampleMetadata; - -/** - Provides a hook for Quick to be configured before any examples are run. - Within this scope, override the +[QuickConfiguration configure:] method - to set properties on a configuration object to customize Quick behavior. - For details, see the documentation for Configuraiton.swift. - - @param name The name of the configuration class. Like any Objective-C - class name, this must be unique to the current runtime - environment. - */ -#define QuickConfigurationBegin(name) \ - @interface name : QuickConfiguration; @end \ - @implementation name \ - - -/** - Marks the end of a Quick configuration. - Make sure you put this after `QuickConfigurationBegin`. - */ -#define QuickConfigurationEnd \ - @end \ - - -/** - Defines a new QuickSpec. Define examples and example groups within the space - between this and `QuickSpecEnd`. - - @param name The name of the spec class. Like any Objective-C class name, this - must be unique to the current runtime environment. - */ -#define QuickSpecBegin(name) \ - @interface name : QuickSpec; @end \ - @implementation name \ - - (void)spec { \ - - -/** - Marks the end of a QuickSpec. Make sure you put this after `QuickSpecBegin`. - */ -#define QuickSpecEnd \ - } \ - @end \ - -typedef NSDictionary *(^QCKDSLSharedExampleContext)(void); -typedef void (^QCKDSLSharedExampleBlock)(QCKDSLSharedExampleContext); -typedef void (^QCKDSLEmptyBlock)(void); -typedef void (^QCKDSLExampleMetadataBlock)(ExampleMetadata *exampleMetadata); - -#define QUICK_EXPORT FOUNDATION_EXPORT - -QUICK_EXPORT void qck_beforeSuite(QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_afterSuite(QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_sharedExamples(NSString *name, QCKDSLSharedExampleBlock closure); -QUICK_EXPORT void qck_describe(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_context(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_beforeEach(QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_beforeEachWithMetadata(QCKDSLExampleMetadataBlock closure); -QUICK_EXPORT void qck_afterEach(QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_afterEachWithMetadata(QCKDSLExampleMetadataBlock closure); -QUICK_EXPORT void qck_pending(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_xdescribe(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_xcontext(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_fdescribe(NSString *description, QCKDSLEmptyBlock closure); -QUICK_EXPORT void qck_fcontext(NSString *description, QCKDSLEmptyBlock closure); - -#ifndef QUICK_DISABLE_SHORT_SYNTAX -/** - Defines a closure to be run prior to any examples in the test suite. - You may define an unlimited number of these closures, but there is no - guarantee as to the order in which they're run. - - If the test suite crashes before the first example is run, this closure - will not be executed. - - @param closure The closure to be run prior to any examples in the test suite. - */ -static inline void beforeSuite(QCKDSLEmptyBlock closure) { - qck_beforeSuite(closure); -} - - -/** - Defines a closure to be run after all of the examples in the test suite. - You may define an unlimited number of these closures, but there is no - guarantee as to the order in which they're run. - - If the test suite crashes before all examples are run, this closure - will not be executed. - - @param closure The closure to be run after all of the examples in the test suite. - */ -static inline void afterSuite(QCKDSLEmptyBlock closure) { - qck_afterSuite(closure); -} - -/** - Defines a group of shared examples. These examples can be re-used in several locations - by using the `itBehavesLike` function. - - @param name The name of the shared example group. This must be unique across all shared example - groups defined in a test suite. - @param closure A closure containing the examples. This behaves just like an example group defined - 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`). - */ -static inline void sharedExamples(NSString *name, QCKDSLSharedExampleBlock closure) { - qck_sharedExamples(name, closure); -} - -/** - Defines an example group. Example groups are logical groupings of examples. - Example groups can share setup and teardown code. - - @param description An arbitrary string describing the example group. - @param closure A closure that can contain other examples. - */ -static inline void describe(NSString *description, QCKDSLEmptyBlock closure) { - qck_describe(description, closure); -} - -/** - Defines an example group. Equivalent to `describe`. - */ -static inline void context(NSString *description, QCKDSLEmptyBlock closure) { - qck_context(description, closure); -} - -/** - Defines a closure to be run prior to each example in the current example - group. This closure is not run for pending or otherwise disabled examples. - An example group may contain an unlimited number of beforeEach. They'll be - run in the order they're defined, but you shouldn't rely on that behavior. - - @param closure The closure to be run prior to each example. - */ -static inline void beforeEach(QCKDSLEmptyBlock closure) { - qck_beforeEach(closure); -} - -/** - Identical to QCKDSL.beforeEach, except the closure is provided with - metadata on the example that the closure is being run prior to. - */ -static inline void beforeEachWithMetadata(QCKDSLExampleMetadataBlock closure) { - qck_beforeEachWithMetadata(closure); -} - -/** - Defines a closure to be run after each example in the current example - group. This closure is not run for pending or otherwise disabled examples. - An example group may contain an unlimited number of afterEach. They'll be - run in the order they're defined, but you shouldn't rely on that behavior. - - @param closure The closure to be run after each example. - */ -static inline void afterEach(QCKDSLEmptyBlock closure) { - qck_afterEach(closure); -} - -/** - Identical to QCKDSL.afterEach, except the closure is provided with - metadata on the example that the closure is being run after. - */ -static inline void afterEachWithMetadata(QCKDSLExampleMetadataBlock closure) { - qck_afterEachWithMetadata(closure); -} - -/** - Defines an example or example group that should not be executed. Use `pending` to temporarily disable - examples or groups that should not be run yet. - - @param description An arbitrary string describing the example or example group. - @param closure A closure that will not be evaluated. - */ -static inline void pending(NSString *description, QCKDSLEmptyBlock closure) { - qck_pending(description, closure); -} - -/** - Use this to quickly mark a `describe` block as pending. - This disables all examples within the block. - */ -static inline void xdescribe(NSString *description, QCKDSLEmptyBlock closure) { - qck_xdescribe(description, closure); -} - -/** - Use this to quickly mark a `context` block as pending. - This disables all examples within the block. - */ -static inline void xcontext(NSString *description, QCKDSLEmptyBlock closure) { - qck_xcontext(description, closure); -} - -/** - Use this to quickly focus a `describe` block, focusing the examples in the block. - If any examples in the test suite are focused, only those examples are executed. - This trumps any explicitly focused or unfocused examples within the block--they are all treated as focused. - */ -static inline void fdescribe(NSString *description, QCKDSLEmptyBlock closure) { - qck_fdescribe(description, closure); -} - -/** - Use this to quickly focus a `context` block. Equivalent to `fdescribe`. - */ -static inline void fcontext(NSString *description, QCKDSLEmptyBlock closure) { - qck_fcontext(description, closure); -} - -#define it qck_it -#define xit qck_xit -#define fit qck_fit -#define itBehavesLike qck_itBehavesLike -#define xitBehavesLike qck_xitBehavesLike -#define fitBehavesLike qck_fitBehavesLike -#endif - -#define qck_it qck_it_builder(@{}, @(__FILE__), __LINE__) -#define qck_xit qck_it_builder(@{Filter.pending: @YES}, @(__FILE__), __LINE__) -#define qck_fit qck_it_builder(@{Filter.focused: @YES}, @(__FILE__), __LINE__) -#define qck_itBehavesLike qck_itBehavesLike_builder(@{}, @(__FILE__), __LINE__) -#define qck_xitBehavesLike qck_itBehavesLike_builder(@{Filter.pending: @YES}, @(__FILE__), __LINE__) -#define qck_fitBehavesLike qck_itBehavesLike_builder(@{Filter.focused: @YES}, @(__FILE__), __LINE__) - -typedef void (^QCKItBlock)(NSString *description, QCKDSLEmptyBlock closure); -typedef void (^QCKItBehavesLikeBlock)(NSString *description, QCKDSLSharedExampleContext context); - -QUICK_EXPORT QCKItBlock qck_it_builder(NSDictionary *flags, NSString *file, NSUInteger line); -QUICK_EXPORT QCKItBehavesLikeBlock qck_itBehavesLike_builder(NSDictionary *flags, NSString *file, NSUInteger line); diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m deleted file mode 100644 index 10e8a3d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m +++ /dev/null @@ -1,79 +0,0 @@ -#import "QCKDSL.h" -#import "World.h" -#import "World+DSL.h" - -void qck_beforeSuite(QCKDSLEmptyBlock closure) { - [[World sharedWorld] beforeSuite:closure]; -} - -void qck_afterSuite(QCKDSLEmptyBlock closure) { - [[World sharedWorld] afterSuite:closure]; -} - -void qck_sharedExamples(NSString *name, QCKDSLSharedExampleBlock closure) { - [[World sharedWorld] sharedExamples:name closure:closure]; -} - -void qck_describe(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] describe:description flags:@{} closure:closure]; -} - -void qck_context(NSString *description, QCKDSLEmptyBlock closure) { - qck_describe(description, closure); -} - -void qck_beforeEach(QCKDSLEmptyBlock closure) { - [[World sharedWorld] beforeEach:closure]; -} - -void qck_beforeEachWithMetadata(QCKDSLExampleMetadataBlock closure) { - [[World sharedWorld] beforeEachWithMetadata:closure]; -} - -void qck_afterEach(QCKDSLEmptyBlock closure) { - [[World sharedWorld] afterEach:closure]; -} - -void qck_afterEachWithMetadata(QCKDSLExampleMetadataBlock closure) { - [[World sharedWorld] afterEachWithMetadata:closure]; -} - -QCKItBlock qck_it_builder(NSDictionary *flags, NSString *file, NSUInteger line) { - return ^(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] itWithDescription:description - flags:flags - file:file - line:line - closure:closure]; - }; -} - -QCKItBehavesLikeBlock qck_itBehavesLike_builder(NSDictionary *flags, NSString *file, NSUInteger line) { - return ^(NSString *name, QCKDSLSharedExampleContext context) { - [[World sharedWorld] itBehavesLikeSharedExampleNamed:name - sharedExampleContext:context - flags:flags - file:file - line:line]; - }; -} - -void qck_pending(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] pending:description closure:closure]; -} - -void qck_xdescribe(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] xdescribe:description flags:@{} closure:closure]; -} - -void qck_xcontext(NSString *description, QCKDSLEmptyBlock closure) { - qck_xdescribe(description, closure); -} - -void qck_fdescribe(NSString *description, QCKDSLEmptyBlock closure) { - [[World sharedWorld] fdescribe:description flags:@{} closure:closure]; -} - -void qck_fcontext(NSString *description, QCKDSLEmptyBlock closure) { - qck_fdescribe(description, closure); -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h deleted file mode 100644 index a3b8524..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -@interface World (SWIFT_EXTENSION(Quick)) -- (void)beforeSuite:(void (^ __nonnull)(void))closure; -- (void)afterSuite:(void (^ __nonnull)(void))closure; -- (void)sharedExamples:(NSString * __nonnull)name closure:(void (^ __nonnull)(NSDictionary * __nonnull (^ __nonnull)(void)))closure; -- (void)describe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)context:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)fdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)xdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)beforeEach:(void (^ __nonnull)(void))closure; -- (void)beforeEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)afterEach:(void (^ __nonnull)(void))closure; -- (void)afterEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)itWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)fitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)xitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)itBehavesLikeSharedExampleNamed:(NSString * __nonnull)name sharedExampleContext:(NSDictionary * __nonnull (^ __nonnull)(void))sharedExampleContext flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line; -- (void)pending:(NSString * __nonnull)description closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.h deleted file mode 100644 index 2da524e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/NSString+QCKSelectorName.m deleted file mode 100644 index d374be6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/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/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Quick.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Quick.h deleted file mode 100644 index 87dad10..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/Quick.h +++ /dev/null @@ -1,11 +0,0 @@ -#import - -//! Project version number for Quick. -FOUNDATION_EXPORT double QuickVersionNumber; - -//! Project version string for Quick. -FOUNDATION_EXPORT const unsigned char QuickVersionString[]; - -#import "QuickSpec.h" -#import "QCKDSL.h" -#import "QuickConfiguration.h" diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.h deleted file mode 100644 index 105a97e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.h +++ /dev/null @@ -1,50 +0,0 @@ -#import - -/** - QuickSpec is a base class all specs written in Quick inherit from. - They need to inherit from QuickSpec, a subclass of XCTestCase, in - order to be discovered by the XCTest framework. - - XCTest automatically compiles a list of XCTestCase subclasses included - in the test target. It iterates over each class in that list, and creates - a new instance of that class for each test method. It then creates an - "invocation" to execute that test method. The invocation is an instance of - NSInvocation, which represents a single message send in Objective-C. - The invocation is set on the XCTestCase instance, and the test is run. - - Most of the code in QuickSpec is dedicated to hooking into XCTest events. - First, when the spec is first loaded and before it is sent any messages, - the +[NSObject initialize] method is called. QuickSpec overrides this method - to call +[QuickSpec spec]. This builds the example group stacks and - registers them with Quick.World, a global register of examples. - - Then, XCTest queries QuickSpec for a list of test methods. Normally, XCTest - automatically finds all methods whose selectors begin with the string "test". - However, QuickSpec overrides this default behavior by implementing the - +[XCTestCase testInvocations] method. This method iterates over each example - registered in Quick.World, defines a new method for that example, and - returns an invocation to call that method to XCTest. Those invocations are - the tests that are run by XCTest. Their selector names are displayed in - the Xcode test navigation bar. - */ -@interface QuickSpec : XCTestCase - -/** - Override this method in your spec to define a set of example groups - and examples. - - @code - override func spec() { - describe("winter") { - it("is coming") { - // ... - } - } - } - @endcode - - See DSL.swift for more information on what syntax is available. - */ -- (void)spec; - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m deleted file mode 100644 index ea64934..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m +++ /dev/null @@ -1,170 +0,0 @@ -#import "QuickSpec.h" -#import "QuickConfiguration.h" -#import "NSString+QCKSelectorName.h" -#import "World.h" -#import - -static QuickSpec *currentSpec = nil; - -const void * const QCKExampleKey = &QCKExampleKey; - -@interface QuickSpec () -@property (nonatomic, strong) Example *example; -@end - -@implementation QuickSpec - -#pragma mark - XCTestCase Overrides - -/** - The runtime sends initialize to each class in a program just before the class, or any class - that inherits from it, is sent its first message from within the program. QuickSpec hooks into - this event to compile the example groups for this spec subclass. - - If an exception occurs when compiling the examples, report it to the user. Chances are they - included an expectation outside of a "it", "describe", or "context" block. - */ -+ (void)initialize { - [QuickConfiguration initialize]; - - World *world = [World sharedWorld]; - [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ - QuickSpec *spec = [self new]; - - @try { - [spec spec]; - } - @catch (NSException *exception) { - [NSException raise:NSInternalInconsistencyException - format:@"An exception occurred when building Quick's example groups.\n" - @"Some possible reasons this might happen include:\n\n" - @"- An 'expect(...).to' expectation was evaluated outside of " - @"an 'it', 'context', or 'describe' block\n" - @"- 'sharedExamples' was called twice with the same name\n" - @"- 'itBehavesLike' was called with a name that is not registered as a shared example\n\n" - @"Here's the original exception: '%@', reason: '%@', userInfo: '%@'", - exception.name, exception.reason, exception.userInfo]; - } - [self testInvocations]; - }]; -} - -/** - 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 *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; - NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; - - NSMutableSet *selectorNames = [NSMutableSet set]; - - for (Example *example in examples) { - SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; - NSInvocation *invocation = [self invocationForInstanceMethodWithSelector:selector - example:example]; - [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 { } - -#pragma mark - Internal Methods - -/** - QuickSpec uses this method to dynamically define a new instance method for the - given example. The instance method runs the example, catching any exceptions. - The exceptions are then reported as test failures. - - In order to report the correct file and line number, examples must raise exceptions - containing following keys in their userInfo: - - - "SenTestFilenameKey": A String representing the file name - - "SenTestLineNumberKey": An Int representing the line number - - These keys used to be used by SenTestingKit, and are still used by some testing tools - in the wild. See: https://github.com/Quick/Quick/pull/41 - - @return The selector of the newly defined instance method. - */ -+ (SEL)addInstanceMethodForExample:(Example *)example classSelectorNames:(NSMutableSet *)selectorNames { - IMP implementation = imp_implementationWithBlock(^(QuickSpec *self){ - 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]; - - NSString *originalName = example.name.qck_selectorName; - NSString *selectorName = originalName; - NSUInteger i = 2; - - while ([selectorNames containsObject:selectorName]) { - selectorName = [NSString stringWithFormat:@"%@_%tu", originalName, i++]; - } - - [selectorNames addObject:selectorName]; - - SEL selector = NSSelectorFromString(selectorName); - class_addMethod(self, selector, implementation, types); - - 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 - and teardown. By default, the failure will be reported as an - XCTest failure, and the example will be highlighted in Xcode. - */ -- (void)recordFailureWithDescription:(NSString *)description - inFile:(NSString *)filePath - atLine:(NSUInteger)lineNumber - expected:(BOOL)expected { - if (self.example.isSharedExample) { - filePath = self.example.callsite.file; - lineNumber = self.example.callsite.line; - } - [currentSpec.testRun recordFailureWithDescription:description - inFile:filePath - atLine:lineNumber - expected:expected]; -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/World.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/World.h deleted file mode 100644 index e638cf6..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/World.h +++ /dev/null @@ -1,18 +0,0 @@ -#import - -@class ExampleGroup; -@class ExampleMetadata; - -SWIFT_CLASS("_TtC5Quick5World") -@interface World - -@property (nonatomic) ExampleGroup * __nullable currentExampleGroup; -@property (nonatomic) ExampleMetadata * __nullable currentExampleMetadata; -@property (nonatomic) BOOL isRunningAdditionalSuites; -+ (World * __nonnull)sharedWorld; -- (void)configure:(void (^ __nonnull)(Configuration * __nonnull))closure; -- (void)finalizeConfiguration; -- (ExampleGroup * __nonnull)rootExampleGroupForSpecClass:(Class __nonnull)cls; -- (NSArray * __nonnull)examplesForSpecClass:(Class __nonnull)specClass; -- (void)performWithCurrentExampleGroup:(ExampleGroup * __nonnull)group closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m deleted file mode 100644 index e49939e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m +++ /dev/null @@ -1,40 +0,0 @@ -#import -#import -#import - -@interface XCTestSuite (QuickTestSuiteBuilder) -@end - -@implementation XCTestSuite (QuickTestSuiteBuilder) - -/** - In order to ensure we can correctly build dynamic test suites, we need to - replace some of the default test suite constructors. - */ -+ (void)load { - Method testCaseWithName = class_getClassMethod(self, @selector(testSuiteForTestCaseWithName:)); - Method hooked_testCaseWithName = class_getClassMethod(self, @selector(qck_hooked_testSuiteForTestCaseWithName:)); - method_exchangeImplementations(testCaseWithName, hooked_testCaseWithName); -} - -/** - The `+testSuiteForTestCaseWithName:` method is called when a specific test case - class is run from the Xcode test navigator. If the built test suite is `nil`, - Xcode will not run any tests for that test case. - - Given if the following test case class is run from the Xcode test navigator: - - FooSpec - testFoo - testBar - - XCTest will invoke this once per test case, with test case names following this format: - - FooSpec/testFoo - FooSpec/testBar - */ -+ (nullable instancetype)qck_hooked_testSuiteForTestCaseWithName:(nonnull NSString *)name { - return [QuickTestSuite selectedTestSuiteForTestCaseWithName:name]; -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/LinuxMain.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/LinuxMain.swift deleted file mode 100644 index 938f54f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/LinuxMain.swift +++ /dev/null @@ -1,45 +0,0 @@ -import XCTest -import Quick - -@testable import QuickTests - -Quick.QCKMain([ - FunctionalTests_AfterEachSpec.self, - AfterSuiteTests.self, - FunctionalTests_BeforeEachSpec.self, - FunctionalTests_BeforeSuite_BeforeSuiteSpec.self, - FunctionalTests_BeforeSuite_Spec.self, - FunctionalTests_ItSpec.self, - FunctionalTests_PendingSpec.self, - FunctionalTests_SharedExamples_BeforeEachSpec.self, - FunctionalTests_SharedExamples_Spec.self, - FunctionalTests_SharedExamples_ContextSpec.self, - Configuration_AfterEachSpec.self, - Configuration_BeforeEachSpec.self, - FunctionalTests_CrossReferencingSpecA.self, - FunctionalTests_CrossReferencingSpecB.self, - FunctionalTests_FocusedSpec_Focused.self, - FunctionalTests_FocusedSpec_Unfocused.self, -], -configurations: [ - FunctionalTests_SharedExamples_BeforeEachTests_SharedExamples.self, - FunctionalTests_SharedExamplesTests_SharedExamples.self, - FunctionalTests_Configuration_AfterEach.self, - FunctionalTests_Configuration_BeforeEach.self, - FunctionalTests_FocusedSpec_SharedExamplesConfiguration.self, -], -testCases: [ - testCase(AfterEachTests.allTests), - testCase(BeforeEachTests.allTests), - testCase(BeforeSuiteTests.allTests), - // testCase(DescribeTests.allTests), - testCase(ItTests.allTests), - testCase(PendingTests.allTests), - testCase(SharedExamples_BeforeEachTests.allTests), - testCase(SharedExamplesTests.allTests), - testCase(Configuration_AfterEachTests.allTests), - testCase(Configuration_BeforeEachTests.allTests), - testCase(FocusedTests.allTests), - testCase(FunctionalTests_CrossReferencingSpecA.allTests), - testCase(FunctionalTests_CrossReferencingSpecB.allTests), -]) diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m deleted file mode 100644 index cd3522d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests+ObjC.m +++ /dev/null @@ -1,32 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -static BOOL afterSuiteFirstTestExecuted = NO; -static BOOL afterSuiteTestsWasExecuted = NO; - -@interface AfterSuiteTests_ObjC : QuickSpec - -@end - -@implementation AfterSuiteTests_ObjC - -- (void)spec { - it(@"is executed before afterSuite", ^{ - expect(@(afterSuiteTestsWasExecuted)).to(beFalsy()); - }); - - afterSuite(^{ - afterSuiteTestsWasExecuted = YES; - }); -} - -+ (void)tearDown { - if (afterSuiteFirstTestExecuted) { - assert(afterSuiteTestsWasExecuted); - } else { - afterSuiteFirstTestExecuted = true; - } -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests.swift deleted file mode 100644 index ea4fc3e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/AfterSuiteTests.swift +++ /dev/null @@ -1,26 +0,0 @@ -import XCTest -import Quick -import Nimble - -var afterSuiteFirstTestExecuted = false -var afterSuiteTestsWasExecuted = false - -class AfterSuiteTests: QuickSpec { - override func spec() { - afterSuite { - afterSuiteTestsWasExecuted = true - } - - it("is executed before afterSuite") { - expect(afterSuiteTestsWasExecuted).to(beFalsy()) - } - } - - override class func tearDown() { - if afterSuiteFirstTestExecuted { - assert(afterSuiteTestsWasExecuted, "afterSuiteTestsWasExecuted needs to be true") - } else { - afterSuiteFirstTestExecuted = true - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickAfterSuiteTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m deleted file mode 100644 index 5069f2b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests+ObjC.m +++ /dev/null @@ -1,56 +0,0 @@ -@import Quick; -@import Nimble; -@import XCTest; - -#import "QCKSpecRunner.h" - -QuickConfigurationBegin(FunctionalTests_SharedExamplesConfiguration_ObjC) - -+ (void)configure:(Configuration *)configuration { - sharedExamples(@"two passing shared examples (Objective-C)", ^(QCKDSLSharedExampleContext exampleContext) { - it(@"has an example that passes (4)", ^{}); - it(@"has another example that passes (5)", ^{}); - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(FunctionalTests_FocusedSpec_Focused_ObjC) - -it(@"has an unfocused example that fails, but is never run", ^{ XCTFail(); }); -fit(@"has a focused example that passes (1)", ^{}); - -fdescribe(@"a focused example group", ^{ - it(@"has an example that is not focused, but will be run, and passes (2)", ^{}); - fit(@"has a focused example that passes (3)", ^{}); -}); - -fitBehavesLike(@"two passing shared examples (Objective-C)", ^NSDictionary *{ return @{}; }); - -QuickSpecEnd - -QuickSpecBegin(FunctionalTests_FocusedSpec_Unfocused_ObjC) - -it(@"has an unfocused example thay fails, but is never run", ^{ XCTFail(); }); - -describe(@"an unfocused example group that is never run", ^{ - beforeEach(^{ [NSException raise:NSInternalInconsistencyException format:@""]; }); - it(@"has an example that fails, but is never run", ^{ XCTFail(); }); -}); - -QuickSpecEnd - -@interface FocusedTests_ObjC: XCTestCase -@end - -@implementation FocusedTests_ObjC - -- (void)testOnlyFocusedExamplesAreExecuted { - XCTestRun *result = qck_runSpecs(@[ - [FunctionalTests_FocusedSpec_Focused_ObjC class], - [FunctionalTests_FocusedSpec_Unfocused_ObjC class] - ]); - XCTAssertEqual(result.executionCount, 5); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift deleted file mode 100644 index 0569a7b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Quick -import Nimble -import XCTest - -class FunctionalTests_FocusedSpec_SharedExamplesConfiguration: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("two passing shared examples") { - it("has an example that passes (4)") {} - it("has another example that passes (5)") {} - } - } -} - -class FunctionalTests_FocusedSpec_Focused: QuickSpec { - override func spec() { - it("has an unfocused example that fails, but is never run") { fail() } - fit("has a focused example that passes (1)") {} - - fdescribe("a focused example group") { - it("has an example that is not focused, but will be run, and passes (2)") {} - fit("has a focused example that passes (3)") {} - } - - itBehavesLike("two passing shared examples", flags: [Filter.focused: true]) - } -} - -class FunctionalTests_FocusedSpec_Unfocused: QuickSpec { - override func spec() { - it("has an unfocused example that fails, but is never run") { fail() } - - describe("an unfocused example group that is never run") { - beforeEach { assert(false) } - it("has an example that fails, but is never run") { fail() } - } - } -} - -final class FocusedTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (FocusedTests) -> () throws -> Void)] { - return [ - ("testOnlyFocusedExamplesAreExecuted", testOnlyFocusedExamplesAreExecuted), - ] - } - - func testOnlyFocusedExamplesAreExecuted() { - let result = qck_runSpecs([ - FunctionalTests_FocusedSpec_Focused.self, - FunctionalTests_FocusedSpec_Unfocused.self - ]) - XCTAssertEqual(result?.executionCount, 5 as UInt) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/SpecRunner.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/SpecRunner.swift deleted file mode 100644 index 66dec1b..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/SpecRunner.swift +++ /dev/null @@ -1,30 +0,0 @@ -@testable import Quick -import Nimble - -@discardableResult -public func qck_runSpec(_ specClass: QuickSpec.Type) -> TestRun? { - return qck_runSpecs([specClass]) -} - -@discardableResult -public func qck_runSpecs(_ specClasses: [QuickSpec.Type]) -> TestRun? { - Quick.World.sharedWorld.isRunningAdditionalSuites = true - - var executionCount: UInt = 0 - var hadUnexpectedFailure = false - - let fails = gatherFailingExpectations(silently: true) { - for specClass in specClasses { - for (_, test) in specClass.allTests { - do { - try test(specClass.init())() - } catch { - hadUnexpectedFailure = true - } - executionCount += 1 - } - } - } - - return TestRun(executionCount: executionCount, hasSucceeded: fails.isEmpty && !hadUnexpectedFailure) -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/TestRun.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/TestRun.swift deleted file mode 100644 index 3ef0d6c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/TestRun.swift +++ /dev/null @@ -1,9 +0,0 @@ -public struct TestRun { - public var executionCount: UInt - public var hasSucceeded: Bool - - public init(executionCount: UInt, hasSucceeded: Bool) { - self.executionCount = executionCount - self.hasSucceeded = hasSucceeded - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/XCTestCaseProvider.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/XCTestCaseProvider.swift deleted file mode 100644 index 0b02978..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTestHelpers/XCTestCaseProvider.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Foundation -import XCTest - -// XCTestCaseProvider should be adopted by all XCTestCase subclasses. It provides a -// mechanism for us to fail tests in Xcode which haven't been included in the `allTests` -// list for swift-corelibs-xctest which is unable to dynamically discover tests. Note -// that only `static var allTests` needs to be explicitly implemented, as `allTestNames` -// has a default implementation provided by a protocol extension. - -// Implementation note: This is broken down into two separate protocols because we need a -// protocol with no Self references to which we can cast XCTestCase instances in a non-generic context. - -public protocol XCTestCaseProviderStatic { - // This should be explicitly implemented by XCTestCase subclasses - static var allTests: [(String, (Self) -> () throws -> Void)] { get } -} - -public protocol XCTestCaseNameProvider { - // This does not need to be explicitly implemented because of the protocol extension below - var allTestNames: [String] { get } -} - -public protocol XCTestCaseProvider: XCTestCaseProviderStatic, XCTestCaseNameProvider {} - -public extension XCTestCaseProvider where Self: XCTestCaseProviderStatic { - var allTestNames: [String] { - return type(of: self).allTests.map({ name, test in - return name - }) - } -} - -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) - - extension XCTestCase { - override open func tearDown() { - if let provider = self as? XCTestCaseNameProvider { - provider.assertContainsTest(invocation!.selector.description) - } - - super.tearDown() - } - } - - extension XCTestCaseNameProvider { - fileprivate func assertContainsTest(_ name: String) { - let contains = self.allTestNames.contains(name) - XCTAssert(contains, "Test '\(name)' is missing from the allTests array") - } - } - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_SharedExamplesTests_SharedExamples.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_SharedExamplesTests_SharedExamples.swift deleted file mode 100644 index e5eed68..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Fixtures/FunctionalTests_SharedExamplesTests_SharedExamples.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation -import Quick -import Nimble - -class FunctionalTests_SharedExamplesTests_SharedExamples: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("a group of three shared examples") { - it("passes once") { expect(true).to(beTruthy()) } - it("passes twice") { expect(true).to(beTruthy()) } - it("passes three times") { expect(true).to(beTruthy()) } - } - - sharedExamples("shared examples that take a context") { (sharedExampleContext: @escaping SharedExampleContext) in - it("is passed the correct parameters via the context") { - let callsite = sharedExampleContext()["callsite"] as? String - expect(callsite).to(equal("SharedExamplesSpec")) - } - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift deleted file mode 100644 index 713e8ae..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift +++ /dev/null @@ -1,93 +0,0 @@ -import XCTest -import Quick -import Nimble - -private enum AfterEachType { - case OuterOne - case OuterTwo - case OuterThree - case InnerOne - case InnerTwo - case NoExamples -} - -private var afterEachOrder = [AfterEachType]() - -class FunctionalTests_AfterEachSpec: QuickSpec { - override func spec() { - describe("afterEach ordering") { - afterEach { afterEachOrder.append(AfterEachType.OuterOne) } - afterEach { afterEachOrder.append(AfterEachType.OuterTwo) } - afterEach { afterEachOrder.append(AfterEachType.OuterThree) } - - it("executes the outer afterEach closures once, but not before this closure [1]") { - // No examples have been run, so no afterEach will have been run either. - // The list should be empty. - expect(afterEachOrder).to(beEmpty()) - } - - it("executes the outer afterEach closures a second time, but not before this closure [2]") { - // The afterEach for the previous example should have been run. - // The list should contain the afterEach for that example, executed from top to bottom. - expect(afterEachOrder).to(equal([AfterEachType.OuterOne, AfterEachType.OuterTwo, AfterEachType.OuterThree])) - } - - context("when there are nested afterEach") { - afterEach { afterEachOrder.append(AfterEachType.InnerOne) } - afterEach { afterEachOrder.append(AfterEachType.InnerTwo) } - - it("executes the outer and inner afterEach closures, but not before this closure [3]") { - // The afterEach for the previous two examples should have been run. - // The list should contain the afterEach for those example, executed from top to bottom. - expect(afterEachOrder).to(equal([ - AfterEachType.OuterOne, AfterEachType.OuterTwo, AfterEachType.OuterThree, - AfterEachType.OuterOne, AfterEachType.OuterTwo, AfterEachType.OuterThree, - ])) - } - } - - context("when there are nested afterEach without examples") { - afterEach { afterEachOrder.append(AfterEachType.NoExamples) } - } - } -#if _runtime(_ObjC) && !SWIFT_PACKAGE - describe("error handling when misusing ordering") { - it("should throw an exception when including afterEach in it block") { - expect { - afterEach { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'afterEach' cannot be used inside 'it', 'afterEach' may only be used inside 'context' or 'describe'. ")) - }) - } - } -#endif - } -} - -final class AfterEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (AfterEachTests) -> () throws -> Void)] { - return [ - ("testAfterEachIsExecutedInTheCorrectOrder", testAfterEachIsExecutedInTheCorrectOrder), - ] - } - - func testAfterEachIsExecutedInTheCorrectOrder() { - afterEachOrder = [] - - qck_runSpec(FunctionalTests_AfterEachSpec.self) - let expectedOrder = [ - // [1] The outer afterEach closures are executed from top to bottom. - AfterEachType.OuterOne, AfterEachType.OuterTwo, AfterEachType.OuterThree, - // [2] The outer afterEach closures are executed from top to bottom. - AfterEachType.OuterOne, AfterEachType.OuterTwo, AfterEachType.OuterThree, - // [3] The inner afterEach closures are executed from top to bottom, - // then the outer afterEach closures are executed from top to bottom. - AfterEachType.InnerOne, AfterEachType.InnerTwo, - AfterEachType.OuterOne, AfterEachType.OuterTwo, AfterEachType.OuterThree, - ] - XCTAssertEqual(afterEachOrder, expectedOrder) - - afterEachOrder = [] - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift deleted file mode 100644 index d46ae68..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift +++ /dev/null @@ -1,76 +0,0 @@ -import XCTest -import Quick -import Nimble - -private enum BeforeEachType { - case OuterOne - case OuterTwo - case InnerOne - case InnerTwo - case InnerThree - case NoExamples -} - -private var beforeEachOrder = [BeforeEachType]() - -class FunctionalTests_BeforeEachSpec: QuickSpec { - override func spec() { - - describe("beforeEach ordering") { - beforeEach { beforeEachOrder.append(BeforeEachType.OuterOne) } - beforeEach { beforeEachOrder.append(BeforeEachType.OuterTwo) } - - it("executes the outer beforeEach closures once [1]") {} - it("executes the outer beforeEach closures a second time [2]") {} - - context("when there are nested beforeEach") { - beforeEach { beforeEachOrder.append(BeforeEachType.InnerOne) } - beforeEach { beforeEachOrder.append(BeforeEachType.InnerTwo) } - beforeEach { beforeEachOrder.append(BeforeEachType.InnerThree) } - - it("executes the outer and inner beforeEach closures [3]") {} - } - - context("when there are nested beforeEach without examples") { - beforeEach { beforeEachOrder.append(BeforeEachType.NoExamples) } - } - } -#if _runtime(_ObjC) && !SWIFT_PACKAGE - describe("error handling when misusing ordering") { - it("should throw an exception when including beforeEach in it block") { - expect { - beforeEach { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'beforeEach' cannot be used inside 'it', 'beforeEach' may only be used inside 'context' or 'describe'. ")) - }) - } - } -#endif - } -} - -final class BeforeEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeforeEachTests) -> () throws -> Void)] { - return [ - ("testBeforeEachIsExecutedInTheCorrectOrder", testBeforeEachIsExecutedInTheCorrectOrder), - ] - } - - func testBeforeEachIsExecutedInTheCorrectOrder() { - beforeEachOrder = [] - - qck_runSpec(FunctionalTests_BeforeEachSpec.self) - let expectedOrder = [ - // [1] The outer beforeEach closures are executed from top to bottom. - BeforeEachType.OuterOne, BeforeEachType.OuterTwo, - // [2] The outer beforeEach closures are executed from top to bottom. - BeforeEachType.OuterOne, BeforeEachType.OuterTwo, - // [3] The outer beforeEach closures are executed from top to bottom, - // then the inner beforeEach closures are executed from top to bottom. - BeforeEachType.OuterOne, BeforeEachType.OuterTwo, - BeforeEachType.InnerOne, BeforeEachType.InnerTwo, BeforeEachType.InnerThree, - ] - XCTAssertEqual(beforeEachOrder, expectedOrder) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift deleted file mode 100644 index d3d6bc1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift +++ /dev/null @@ -1,39 +0,0 @@ -import XCTest -import Quick -import Nimble - -var beforeSuiteWasExecuted = false - -class FunctionalTests_BeforeSuite_BeforeSuiteSpec: QuickSpec { - override func spec() { - beforeSuite { - beforeSuiteWasExecuted = true - } - } -} - -class FunctionalTests_BeforeSuite_Spec: QuickSpec { - override func spec() { - it("is executed after beforeSuite") { - expect(beforeSuiteWasExecuted).to(beTruthy()) - } - } -} - -final class BeforeSuiteTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (BeforeSuiteTests) -> () throws -> Void)] { - return [ - ("testBeforeSuiteIsExecutedBeforeAnyExamples", testBeforeSuiteIsExecutedBeforeAnyExamples), - ] - } - - func testBeforeSuiteIsExecutedBeforeAnyExamples() { - // Execute the spec with an assertion before the one with a beforeSuite - let result = qck_runSpecs([ - FunctionalTests_BeforeSuite_Spec.self, - FunctionalTests_BeforeSuite_BeforeSuiteSpec.self - ]) - - XCTAssert(result!.hasSucceeded) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEach.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEach.swift deleted file mode 100644 index c3f6717..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEach.swift +++ /dev/null @@ -1,11 +0,0 @@ -import Quick - -public var FunctionalTests_Configuration_AfterEachWasExecuted = false - -class FunctionalTests_Configuration_AfterEach: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - configuration.afterEach { - FunctionalTests_Configuration_AfterEachWasExecuted = true - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift deleted file mode 100644 index 2cb0113..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift +++ /dev/null @@ -1,31 +0,0 @@ -import XCTest -import Quick -import Nimble - -class Configuration_AfterEachSpec: QuickSpec { - override func spec() { - beforeEach { - FunctionalTests_Configuration_AfterEachWasExecuted = false - } - it("is executed before the configuration afterEach") { - expect(FunctionalTests_Configuration_AfterEachWasExecuted).to(beFalsy()) - } - } -} - -final class Configuration_AfterEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (Configuration_AfterEachTests) -> () throws -> Void)] { - return [ - ("testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted", testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted), - ] - } - - func testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted() { - FunctionalTests_Configuration_AfterEachWasExecuted = false - - qck_runSpec(Configuration_BeforeEachSpec.self) - XCTAssert(FunctionalTests_Configuration_AfterEachWasExecuted) - - FunctionalTests_Configuration_AfterEachWasExecuted = false - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEach.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEach.swift deleted file mode 100644 index 228ab98..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEach.swift +++ /dev/null @@ -1,11 +0,0 @@ -import Quick - -public var FunctionalTests_Configuration_BeforeEachWasExecuted = false - -class FunctionalTests_Configuration_BeforeEach: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - configuration.beforeEach { - FunctionalTests_Configuration_BeforeEachWasExecuted = true - } - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift deleted file mode 100644 index a7a8c3c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift +++ /dev/null @@ -1,28 +0,0 @@ -import XCTest -import Quick -import Nimble - -class Configuration_BeforeEachSpec: QuickSpec { - override func spec() { - it("is executed after the configuration beforeEach") { - expect(FunctionalTests_Configuration_BeforeEachWasExecuted).to(beTruthy()) - } - } -} - -final class Configuration_BeforeEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (Configuration_BeforeEachTests) -> () throws -> Void)] { - return [ - ("testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted", testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted), - ] - } - - func testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted() { - FunctionalTests_Configuration_BeforeEachWasExecuted = false - - qck_runSpec(Configuration_BeforeEachSpec.self) - XCTAssert(FunctionalTests_Configuration_BeforeEachWasExecuted) - - FunctionalTests_Configuration_BeforeEachWasExecuted = false - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift deleted file mode 100644 index c626478..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift +++ /dev/null @@ -1,20 +0,0 @@ -import XCTest -import Quick -import Nimble - -#if _runtime(_ObjC) && !SWIFT_PACKAGE -class QuickContextTests: QuickSpec { - override func spec() { - describe("Context") { - it("should throw an exception if used in an it block") { - expect { - context("A nested context that should throw") { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'context' cannot be used inside 'it', 'context' may only be used inside 'context' or 'describe'. ")) - }) - } - } - } -} -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/CrossReferencingSpecs.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/CrossReferencingSpecs.swift deleted file mode 100644 index 56d1eb4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/CrossReferencingSpecs.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Quick -import Nimble - -// This is a functional test ensuring that no crash occurs when a spec class -// references another spec class during its spec setup. - -class FunctionalTests_CrossReferencingSpecA: QuickSpec { - override func spec() { - let _ = FunctionalTests_CrossReferencingSpecB() - it("does not crash") {} - } -} - -class FunctionalTests_CrossReferencingSpecB: QuickSpec { - override func spec() { - let _ = FunctionalTests_CrossReferencingSpecA() - it("does not crash") {} - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift deleted file mode 100644 index df79d91..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift +++ /dev/null @@ -1,34 +0,0 @@ -import XCTest -import Nimble -import Quick - -#if _runtime(_ObjC) && !SWIFT_PACKAGE - -final class DescribeTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (DescribeTests) -> () throws -> Void)] { - return [ - ("testDescribeThrowsIfUsedOutsideOfQuickSpec", testDescribeThrowsIfUsedOutsideOfQuickSpec), - ] - } - - func testDescribeThrowsIfUsedOutsideOfQuickSpec() { - expect { describe("this should throw an exception", {}) }.to(raiseException()) - } -} - -class QuickDescribeTests: QuickSpec { - override func spec() { - describe("Describe") { - it("should throw an exception if used in an it block") { - expect { - describe("A nested describe that should throw") { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'describe' cannot be used inside 'it', 'describe' may only be used inside 'context' or 'describe'. ")) - }) - } - } - } -} - -#endif diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift deleted file mode 100644 index 61e4504..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift +++ /dev/null @@ -1,127 +0,0 @@ -import XCTest -@testable import Quick -import Nimble - -class FunctionalTests_ItSpec: QuickSpec { - override func spec() { - var exampleMetadata: ExampleMetadata? - beforeEach { metadata in exampleMetadata = metadata } - - it("") { - expect(exampleMetadata!.example.name).to(equal("")) - } - - it("has a description with セレクター名に使えない文字が入っている 👊💥") { - let name = "has a description with セレクター名に使えない文字が入っている 👊💥" - expect(exampleMetadata!.example.name).to(equal(name)) - } - -#if _runtime(_ObjC) && !SWIFT_PACKAGE - - describe("when an example has a unique name") { - it("has a unique name") {} - - it("doesn't add multiple selectors for it") { - let allSelectors = [String]( - FunctionalTests_ItSpec.allSelectors() - .filter { $0.hasPrefix("when_an_example_has_a_unique_name__") }) - .sorted(by: <) - - expect(allSelectors) == [ - "when_an_example_has_a_unique_name__doesn_t_add_multiple_selectors_for_it", - "when_an_example_has_a_unique_name__has_a_unique_name" - ] - } - } - - describe("when two examples have the exact name") { - it("has exactly the same name") {} - it("has exactly the same name") {} - - it("makes a unique name for each of the above") { - let allSelectors = [String]( - FunctionalTests_ItSpec.allSelectors() - .filter { $0.hasPrefix("when_two_examples_have_the_exact_name__") }) - .sorted(by: <) - - expect(allSelectors) == [ - "when_two_examples_have_the_exact_name__has_exactly_the_same_name", - "when_two_examples_have_the_exact_name__has_exactly_the_same_name_2", - "when_two_examples_have_the_exact_name__makes_a_unique_name_for_each_of_the_above" - ] - } - - } - - describe("error handling when misusing ordering") { - it("an it") { - expect { - it("will throw an error when it is nested in another it") { } - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'it' cannot be used inside 'it', 'it' may only be used inside 'context' or 'describe'. ")) - }) - } - - describe("behavior with an 'it' inside a 'beforeEach'") { - var exception: NSException? - - beforeEach { - let capture = NMBExceptionCapture(handler: ({ e in - exception = e - }), finally: nil) - - capture.tryBlock { - it("a rogue 'it' inside a 'beforeEach'") { } - return - } - } - - it("should have thrown an exception with the correct error message") { - expect(exception).toNot(beNil()) - expect(exception!.reason).to(equal("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'. ")) - } - } - - describe("behavior with an 'it' inside an 'afterEach'") { - var exception: NSException? - - afterEach { - let capture = NMBExceptionCapture(handler: ({ e in - exception = e - expect(exception).toNot(beNil()) - expect(exception!.reason).to(equal("'it' cannot be used inside 'afterEach', 'it' may only be used inside 'context' or 'describe'. ")) - }), finally: nil) - - capture.tryBlock { - it("a rogue 'it' inside an 'afterEach'") { } - return - } - } - - it("should throw an exception with the correct message after this 'it' block executes") { } - } - } -#endif - } -} - -final class ItTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (ItTests) -> () throws -> Void)] { - return [ - ("testAllExamplesAreExecuted", testAllExamplesAreExecuted), - ] - } - -#if _runtime(_ObjC) && !SWIFT_PACKAGE - func testAllExamplesAreExecuted() { - let result = qck_runSpec(FunctionalTests_ItSpec.self) - XCTAssertEqual(result?.executionCount, 10 as UInt) - } -#else - func testAllExamplesAreExecuted() { - let result = qck_runSpec(FunctionalTests_ItSpec.self) - XCTAssertEqual(result?.executionCount, 2 as UInt) - } -#endif -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/AfterEachTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/AfterEachTests+ObjC.m deleted file mode 100644 index 4216a86..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/AfterEachTests+ObjC.m +++ /dev/null @@ -1,81 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -typedef NS_ENUM(NSUInteger, AfterEachType) { - OuterOne, - OuterTwo, - OuterThree, - InnerOne, - InnerTwo, - NoExamples, -}; - -static NSMutableArray *afterEachOrder; - -QuickSpecBegin(FunctionalTests_AfterEachSpec_ObjC) - -afterEach(^{ [afterEachOrder addObject:@(OuterOne)]; }); -afterEach(^{ [afterEachOrder addObject:@(OuterTwo)]; }); -afterEach(^{ [afterEachOrder addObject:@(OuterThree)]; }); - -it(@"executes the outer afterEach closures once, but not before this closure [1]", ^{ - expect(afterEachOrder).to(equal(@[])); -}); - -it(@"executes the outer afterEach closures a second time, but not before this closure [2]", ^{ - expect(afterEachOrder).to(equal(@[@(OuterOne), @(OuterTwo), @(OuterThree)])); -}); - -context(@"when there are nested afterEach", ^{ - afterEach(^{ [afterEachOrder addObject:@(InnerOne)]; }); - afterEach(^{ [afterEachOrder addObject:@(InnerTwo)]; }); - - it(@"executes the outer and inner afterEach closures, but not before this closure [3]", ^{ - // The afterEach for the previous two examples should have been run. - // The list should contain the afterEach for those example, executed from top to bottom. - expect(afterEachOrder).to(equal(@[ - @(OuterOne), @(OuterTwo), @(OuterThree), - @(OuterOne), @(OuterTwo), @(OuterThree), - ])); - }); -}); - -context(@"when there are nested afterEach without examples", ^{ - afterEach(^{ [afterEachOrder addObject:@(NoExamples)]; }); -}); - -QuickSpecEnd - -@interface AfterEachTests_ObjC : XCTestCase; @end - -@implementation AfterEachTests_ObjC - -- (void)setUp { - [super setUp]; - afterEachOrder = [NSMutableArray array]; -} - -- (void)tearDown { - afterEachOrder = [NSMutableArray array]; - [super tearDown]; -} - -- (void)testAfterEachIsExecutedInTheCorrectOrder { - qck_runSpec([FunctionalTests_AfterEachSpec_ObjC class]); - NSArray *expectedOrder = @[ - // [1] The outer afterEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), @(OuterThree), - // [2] The outer afterEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), @(OuterThree), - // [3] The outer afterEach closures are executed from top to bottom, - // then the outer afterEach closures are executed from top to bottom. - @(InnerOne), @(InnerTwo), @(OuterOne), @(OuterTwo), @(OuterThree), - ]; - - XCTAssertEqualObjects(afterEachOrder, expectedOrder); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeEachTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeEachTests+ObjC.m deleted file mode 100644 index c7a5897..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeEachTests+ObjC.m +++ /dev/null @@ -1,68 +0,0 @@ -@import XCTest; -@import Quick; - -#import "QCKSpecRunner.h" - -typedef NS_ENUM(NSUInteger, BeforeEachType) { - OuterOne, - OuterTwo, - InnerOne, - InnerTwo, - InnerThree, - NoExamples, -}; - -static NSMutableArray *beforeEachOrder; - -QuickSpecBegin(FunctionalTests_BeforeEachSpec_ObjC) - -beforeEach(^{ [beforeEachOrder addObject:@(OuterOne)]; }); -beforeEach(^{ [beforeEachOrder addObject:@(OuterTwo)]; }); - -it(@"executes the outer beforeEach closures once [1]", ^{}); -it(@"executes the outer beforeEach closures a second time [2]", ^{}); - -context(@"when there are nested beforeEach", ^{ - beforeEach(^{ [beforeEachOrder addObject:@(InnerOne)]; }); - beforeEach(^{ [beforeEachOrder addObject:@(InnerTwo)]; }); - beforeEach(^{ [beforeEachOrder addObject:@(InnerThree)]; }); - - it(@"executes the outer and inner beforeEach closures [3]", ^{}); -}); - -context(@"when there are nested beforeEach without examples", ^{ - beforeEach(^{ [beforeEachOrder addObject:@(NoExamples)]; }); -}); - -QuickSpecEnd - -@interface BeforeEachTests_ObjC : XCTestCase; @end - -@implementation BeforeEachTests_ObjC - -- (void)setUp { - beforeEachOrder = [NSMutableArray array]; - [super setUp]; -} - -- (void)tearDown { - beforeEachOrder = [NSMutableArray array]; - [super tearDown]; -} - -- (void)testBeforeEachIsExecutedInTheCorrectOrder { - qck_runSpec([FunctionalTests_BeforeEachSpec_ObjC class]); - NSArray *expectedOrder = @[ - // [1] The outer beforeEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), - // [2] The outer beforeEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), - // [3] The outer beforeEach closures are executed from top to bottom, - // then the inner beforeEach closures are executed from top to bottom. - @(OuterOne), @(OuterTwo), @(InnerOne), @(InnerTwo), @(InnerThree), - ]; - - XCTAssertEqualObjects(beforeEachOrder, expectedOrder); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeSuiteTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeSuiteTests+ObjC.m deleted file mode 100644 index ce7efc9..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/BeforeSuiteTests+ObjC.m +++ /dev/null @@ -1,39 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -static BOOL beforeSuiteWasExecuted = NO; - -QuickSpecBegin(FunctionalTests_BeforeSuite_BeforeSuiteSpec_ObjC) - -beforeSuite(^{ - beforeSuiteWasExecuted = YES; -}); - -QuickSpecEnd - -QuickSpecBegin(FunctionalTests_BeforeSuite_Spec_ObjC) - -it(@"is executed after beforeSuite", ^{ - expect(@(beforeSuiteWasExecuted)).to(beTruthy()); -}); - -QuickSpecEnd - -@interface BeforeSuiteTests_ObjC : XCTestCase; @end - -@implementation BeforeSuiteTests_ObjC - -- (void)testBeforeSuiteIsExecutedBeforeAnyExamples { - // Execute the spec with an assertion before the one with a beforeSuite - NSArray *specs = @[ - [FunctionalTests_BeforeSuite_Spec_ObjC class], - [FunctionalTests_BeforeSuite_BeforeSuiteSpec_ObjC class] - ]; - XCTestRun *result = qck_runSpecs(specs); - XCTAssert(result.hasSucceeded); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureTests+ObjC.m deleted file mode 100644 index dc786e8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureTests+ObjC.m +++ /dev/null @@ -1,61 +0,0 @@ -@import XCTest; - -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -static BOOL isRunningFunctionalTests = NO; - -#pragma mark - Spec - -QuickSpecBegin(FunctionalTests_FailureSpec_ObjC) - -describe(@"a group of failing examples", ^{ - it(@"passes", ^{ - expect(@YES).to(beTruthy()); - }); - - it(@"fails (but only when running the functional tests)", ^{ - expect(@(isRunningFunctionalTests)).to(beFalsy()); - }); - - it(@"fails again (but only when running the functional tests)", ^{ - expect(@(isRunningFunctionalTests)).to(beFalsy()); - }); -}); - -QuickSpecEnd - -#pragma mark - Tests - -@interface FailureTests_ObjC : XCTestCase; @end - -@implementation FailureTests_ObjC - -- (void)setUp { - [super setUp]; - isRunningFunctionalTests = YES; -} - -- (void)tearDown { - isRunningFunctionalTests = NO; - [super tearDown]; -} - -- (void)testFailureSpecHasSucceededIsFalse { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureSpec_ObjC class]); - XCTAssertFalse(result.hasSucceeded); -} - -- (void)testFailureSpecExecutedAllExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureSpec_ObjC class]); - XCTAssertEqual(result.executionCount, 3); -} - -- (void)testFailureSpecFailureCountIsEqualToTheNumberOfFailingExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureSpec_ObjC class]); - XCTAssertEqual(result.failureCount, 2); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureUsingXCTAssertTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureUsingXCTAssertTests+ObjC.m deleted file mode 100644 index 1f05853..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/FailureUsingXCTAssertTests+ObjC.m +++ /dev/null @@ -1,55 +0,0 @@ -@import XCTest; -@import Quick; - -#import "QCKSpecRunner.h" - -static BOOL isRunningFunctionalTests = NO; - -QuickSpecBegin(FunctionalTests_FailureUsingXCTAssertSpec_ObjC) - -it(@"fails using an XCTAssert (but only when running the functional tests)", ^{ - XCTAssertFalse(isRunningFunctionalTests); -}); - -it(@"fails again using an XCTAssert (but only when running the functional tests)", ^{ - XCTAssertFalse(isRunningFunctionalTests); -}); - -it(@"succeeds using an XCTAssert", ^{ - XCTAssertTrue(YES); -}); - -QuickSpecEnd - -#pragma mark - Tests - -@interface FailureUsingXCTAssertTests_ObjC : XCTestCase; @end - -@implementation FailureUsingXCTAssertTests_ObjC - -- (void)setUp { - [super setUp]; - isRunningFunctionalTests = YES; -} - -- (void)tearDown { - isRunningFunctionalTests = NO; - [super tearDown]; -} - -- (void)testFailureUsingXCTAssertSpecHasSucceededIsFalse { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureUsingXCTAssertSpec_ObjC class]); - XCTAssertFalse(result.hasSucceeded); -} - -- (void)testFailureUsingXCTAssertSpecExecutedAllExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureUsingXCTAssertSpec_ObjC class]); - XCTAssertEqual(result.executionCount, 3); -} - -- (void)testFailureUsingXCTAssertSpecFailureCountIsEqualToTheNumberOfFailingExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_FailureUsingXCTAssertSpec_ObjC class]); - XCTAssertEqual(result.failureCount, 2); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/ItTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/ItTests+ObjC.m deleted file mode 100644 index 39e0b7d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/ItTests+ObjC.m +++ /dev/null @@ -1,42 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" -#import "QuickSpec+QuickSpec_MethodList.h" - -QuickSpecBegin(FunctionalTests_ItSpec_ObjC) - -__block ExampleMetadata *exampleMetadata = nil; -beforeEachWithMetadata(^(ExampleMetadata *metadata) { - exampleMetadata = metadata; -}); - -it(@" ", ^{ - expect(exampleMetadata.example.name).to(equal(@" ")); -}); - -it(@"has a description with セレクター名に使えない文字が入っている 👊💥", ^{ - NSString *name = @"has a description with セレクター名に使えない文字が入っている 👊💥"; - expect(exampleMetadata.example.name).to(equal(name)); -}); - -it(@"is a test with a unique name", ^{ - NSSet *allSelectors = [FunctionalTests_ItSpec_ObjC allSelectors]; - - expect(allSelectors).to(contain(@"is_a_test_with_a_unique_name")); - expect(allSelectors).toNot(contain(@"is_a_test_with_a_unique_name_2")); -}); - -QuickSpecEnd - -@interface ItTests_ObjC : XCTestCase; @end - -@implementation ItTests_ObjC - -- (void)testAllExamplesAreExecuted { - XCTestRun *result = qck_runSpec([FunctionalTests_ItSpec_ObjC class]); - XCTAssertEqual(result.executionCount, 3); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/PendingTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/PendingTests+ObjC.m deleted file mode 100644 index 970175f..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/PendingTests+ObjC.m +++ /dev/null @@ -1,60 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -static NSUInteger oneExampleBeforeEachExecutedCount = 0; -static NSUInteger onlyPendingExamplesBeforeEachExecutedCount = 0; - -QuickSpecBegin(FunctionalTests_PendingSpec_ObjC) - -pending(@"an example that will not run", ^{ - expect(@YES).to(beFalsy()); -}); - -describe(@"a describe block containing only one enabled example", ^{ - beforeEach(^{ oneExampleBeforeEachExecutedCount += 1; }); - it(@"an example that will run", ^{}); - pending(@"an example that will not run", ^{}); -}); - -describe(@"a describe block containing only pending examples", ^{ - beforeEach(^{ onlyPendingExamplesBeforeEachExecutedCount += 1; }); - pending(@"an example that will not run", ^{}); -}); - -QuickSpecEnd - -@interface PendingTests_ObjC : XCTestCase; @end - -@implementation PendingTests_ObjC - -- (void)setUp { - [super setUp]; - oneExampleBeforeEachExecutedCount = 0; - onlyPendingExamplesBeforeEachExecutedCount = 0; -} - -- (void)tearDown { - oneExampleBeforeEachExecutedCount = 0; - onlyPendingExamplesBeforeEachExecutedCount = 0; - [super tearDown]; -} - -- (void)testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail { - XCTestRun *result = qck_runSpec([FunctionalTests_PendingSpec_ObjC class]); - XCTAssert(result.hasSucceeded); -} - -- (void)testBeforeEachOnlyRunForEnabledExamples { - qck_runSpec([FunctionalTests_PendingSpec_ObjC class]); - XCTAssertEqual(oneExampleBeforeEachExecutedCount, 1); -} - -- (void)testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples { - qck_runSpec([FunctionalTests_PendingSpec_ObjC class]); - XCTAssertEqual(onlyPendingExamplesBeforeEachExecutedCount, 0); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamples+BeforeEachTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamples+BeforeEachTests+ObjC.m deleted file mode 100644 index cdbf259..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamples+BeforeEachTests+ObjC.m +++ /dev/null @@ -1,59 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -static NSUInteger specBeforeEachExecutedCount = 0; -static NSUInteger sharedExamplesBeforeEachExecutedCount = 0; - -QuickConfigurationBegin(FunctionalTests_SharedExamples_BeforeEachTests_SharedExamples_ObjC) - -+ (void)configure:(Configuration *)configuration { - sharedExamples(@"a group of three shared examples with a beforeEach in Obj-C", - ^(QCKDSLSharedExampleContext context) { - beforeEach(^{ sharedExamplesBeforeEachExecutedCount += 1; }); - it(@"passes once", ^{}); - it(@"passes twice", ^{}); - it(@"passes three times", ^{}); - }); -} - -QuickConfigurationEnd - -QuickSpecBegin(FunctionalTests_SharedExamples_BeforeEachSpec_ObjC) - -beforeEach(^{ specBeforeEachExecutedCount += 1; }); -it(@"executes the spec beforeEach once", ^{}); -itBehavesLike(@"a group of three shared examples with a beforeEach in Obj-C", - ^NSDictionary*{ return @{}; }); - -QuickSpecEnd - -@interface SharedExamples_BeforeEachTests_ObjC : XCTestCase; @end - -@implementation SharedExamples_BeforeEachTests_ObjC - -- (void)setUp { - [super setUp]; - specBeforeEachExecutedCount = 0; - sharedExamplesBeforeEachExecutedCount = 0; -} - -- (void)tearDown { - specBeforeEachExecutedCount = 0; - sharedExamplesBeforeEachExecutedCount = 0; - [super tearDown]; -} - -- (void)testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample { - qck_runSpec([FunctionalTests_SharedExamples_BeforeEachSpec_ObjC class]); - XCTAssertEqual(specBeforeEachExecutedCount, 4); -} - -- (void)testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample { - qck_runSpec([FunctionalTests_SharedExamples_BeforeEachSpec_ObjC class]); - XCTAssertEqual(sharedExamplesBeforeEachExecutedCount, 3); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamplesTests+ObjC.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamplesTests+ObjC.m deleted file mode 100644 index 7fcb8b1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ObjC/SharedExamplesTests+ObjC.m +++ /dev/null @@ -1,65 +0,0 @@ -@import XCTest; -@import Quick; -@import Nimble; - -#import "QCKSpecRunner.h" - -QuickSpecBegin(FunctionalTests_SharedExamples_Spec_ObjC) - -itBehavesLike(@"a group of three shared examples", ^NSDictionary*{ return @{}; }); - -QuickSpecEnd - -QuickSpecBegin(FunctionalTests_SharedExamples_ContextSpec_ObjC) - -itBehavesLike(@"shared examples that take a context", ^NSDictionary *{ - return @{ @"callsite": @"SharedExamplesSpec" }; -}); - -QuickSpecEnd - -QuickSpecBegin(FunctionalTests_SharedExamples_SameContextSpec_ObjC) - -__block NSInteger counter = 0; - -afterEach(^{ - counter++; -}); - -sharedExamples(@"gets called with a different context from within the same spec file", ^(QCKDSLSharedExampleContext exampleContext) { - - it(@"tracks correctly", ^{ - NSString *payload = exampleContext()[@"payload"]; - BOOL expected = [payload isEqualToString:[NSString stringWithFormat:@"%ld", (long)counter]]; - expect(@(expected)).to(beTrue()); - }); - -}); - -itBehavesLike(@"gets called with a different context from within the same spec file", ^{ - return @{ @"payload" : @"0" }; -}); - -itBehavesLike(@"gets called with a different context from within the same spec file", ^{ - return @{ @"payload" : @"1" }; -}); - -QuickSpecEnd - - -@interface SharedExamplesTests_ObjC : XCTestCase; @end - -@implementation SharedExamplesTests_ObjC - -- (void)testAGroupOfThreeSharedExamplesExecutesThreeExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_SharedExamples_Spec_ObjC class]); - XCTAssert(result.hasSucceeded); - XCTAssertEqual(result.executionCount, 3); -} - -- (void)testSharedExamplesWithContextPassContextToExamples { - XCTestRun *result = qck_runSpec([FunctionalTests_SharedExamples_ContextSpec_ObjC class]); - XCTAssert(result.hasSucceeded); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift deleted file mode 100644 index f8db0f2..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift +++ /dev/null @@ -1,54 +0,0 @@ -import XCTest -import Quick -import Nimble - -var oneExampleBeforeEachExecutedCount = 0 -var onlyPendingExamplesBeforeEachExecutedCount = 0 - -class FunctionalTests_PendingSpec: QuickSpec { - override func spec() { - xit("an example that will not run") { - expect(true).to(beFalsy()) - } - - describe("a describe block containing only one enabled example") { - beforeEach { oneExampleBeforeEachExecutedCount += 1 } - it("an example that will run") {} - pending("an example that will not run") {} - } - - describe("a describe block containing only pending examples") { - beforeEach { onlyPendingExamplesBeforeEachExecutedCount += 1 } - pending("an example that will not run") {} - } - } -} - -final class PendingTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (PendingTests) -> () throws -> Void)] { - return [ - ("testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail", testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail), - ("testBeforeEachOnlyRunForEnabledExamples", testBeforeEachOnlyRunForEnabledExamples), - ("testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples", testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples), - ] - } - - func testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail() { - let result = qck_runSpec(FunctionalTests_PendingSpec.self) - XCTAssertTrue(result!.hasSucceeded) - } - - func testBeforeEachOnlyRunForEnabledExamples() { - oneExampleBeforeEachExecutedCount = 0 - - qck_runSpec(FunctionalTests_PendingSpec.self) - XCTAssertEqual(oneExampleBeforeEachExecutedCount, 1) - } - - func testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples() { - onlyPendingExamplesBeforeEachExecutedCount = 0 - - qck_runSpec(FunctionalTests_PendingSpec.self) - XCTAssertEqual(onlyPendingExamplesBeforeEachExecutedCount, 0) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift deleted file mode 100644 index c458075..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift +++ /dev/null @@ -1,48 +0,0 @@ -import XCTest -import Quick -import Nimble - -var specBeforeEachExecutedCount = 0 -var sharedExamplesBeforeEachExecutedCount = 0 - -class FunctionalTests_SharedExamples_BeforeEachTests_SharedExamples: QuickConfiguration { - override class func configure(_ configuration: Configuration) { - sharedExamples("a group of three shared examples with a beforeEach") { - beforeEach { sharedExamplesBeforeEachExecutedCount += 1 } - it("passes once") {} - it("passes twice") {} - it("passes three times") {} - } - } -} - -class FunctionalTests_SharedExamples_BeforeEachSpec: QuickSpec { - override func spec() { - beforeEach { specBeforeEachExecutedCount += 1 } - it("executes the spec beforeEach once") {} - itBehavesLike("a group of three shared examples with a beforeEach") - } -} - -final class SharedExamples_BeforeEachTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SharedExamples_BeforeEachTests) -> () throws -> Void)] { - return [ - ("testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample", testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample), - ("testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample", testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample), - ] - } - - func testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample() { - specBeforeEachExecutedCount = 0 - - qck_runSpec(FunctionalTests_SharedExamples_BeforeEachSpec.self) - XCTAssertEqual(specBeforeEachExecutedCount, 4) - } - - func testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample() { - sharedExamplesBeforeEachExecutedCount = 0 - - qck_runSpec(FunctionalTests_SharedExamples_BeforeEachSpec.self) - XCTAssertEqual(sharedExamplesBeforeEachExecutedCount, 3) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift deleted file mode 100644 index 9b2834d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift +++ /dev/null @@ -1,54 +0,0 @@ -import Foundation -import XCTest -import Quick -import Nimble - -class FunctionalTests_SharedExamples_Spec: QuickSpec { - override func spec() { - itBehavesLike("a group of three shared examples") - } -} - -class FunctionalTests_SharedExamples_ContextSpec: QuickSpec { - override func spec() { - itBehavesLike("shared examples that take a context") { ["callsite": "SharedExamplesSpec"] } - } -} - -#if _runtime(_ObjC) && !SWIFT_PACKAGE -class FunctionalTests_SharedExamples_ErrorSpec: QuickSpec { - override func spec() { - describe("error handling when misusing ordering") { - it("should throw an exception when including itBehavesLike in it block") { - expect { - itBehavesLike("a group of three shared examples") - }.to(raiseException { (exception: NSException) in - expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'itBehavesLike' cannot be used inside 'it', 'itBehavesLike' may only be used inside 'context' or 'describe'. ")) - }) - } - } - } -} -#endif - -// Shared examples are defined in QuickTests/Fixtures -final class SharedExamplesTests: XCTestCase, XCTestCaseProvider { - static var allTests: [(String, (SharedExamplesTests) -> () throws -> Void)] { - return [ - ("testAGroupOfThreeSharedExamplesExecutesThreeExamples", testAGroupOfThreeSharedExamplesExecutesThreeExamples), - ("testSharedExamplesWithContextPassContextToExamples", testSharedExamplesWithContextPassContextToExamples), - ] - } - - func testAGroupOfThreeSharedExamplesExecutesThreeExamples() { - let result = qck_runSpec(FunctionalTests_SharedExamples_Spec.self) - XCTAssert(result!.hasSucceeded) - XCTAssertEqual(result!.executionCount, 3 as UInt) - } - - func testSharedExamplesWithContextPassContextToExamples() { - let result = qck_runSpec(FunctionalTests_SharedExamples_ContextSpec.self) - XCTAssert(result!.hasSucceeded) - } -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.h deleted file mode 100644 index 183118e..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.h +++ /dev/null @@ -1,22 +0,0 @@ -@import XCTest; - -/** - Runs an XCTestSuite instance containing only the given XCTestCase subclass. - Use this to run QuickSpec subclasses from within a set of unit tests. - - Due to implicit dependencies in _XCTFailureHandler, this function raises an - exception when used in Swift to run a failing test case. - - @param specClass The class of the spec to be run. - @return An XCTestRun instance that contains information such as the number of failures, etc. - */ -extern XCTestRun * _Nullable qck_runSpec(Class _Nonnull specClass); - -/** - Runs an XCTestSuite instance containing the given XCTestCase subclasses, in the order provided. - See the documentation for `qck_runSpec` for more details. - - @param specClasses An array of QuickSpec classes, in the order they should be run. - @return An XCTestRun instance that contains information such as the number of failures, etc. - */ -extern XCTestRun * _Nullable qck_runSpecs(NSArray * _Nonnull specClasses); diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.m deleted file mode 100644 index a2aa78c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QCKSpecRunner.m +++ /dev/null @@ -1,33 +0,0 @@ -@import Quick; - -#import "QCKSpecRunner.h" -#import "XCTestObservationCenter+QCKSuspendObservation.h" -#import "World.h" - -@interface XCTest (Redeclaration) -- (XCTestRun *)run; -@end - -XCTestRun * _Nullable qck_runSuite(XCTestSuite * _Nonnull suite) { - [World sharedWorld].isRunningAdditionalSuites = YES; - - __block XCTestRun *result = nil; - [[XCTestObservationCenter sharedTestObservationCenter] qck_suspendObservationForBlock:^{ - [suite runTest]; - result = suite.testRun; - }]; - return result; -} - -XCTestRun *qck_runSpec(Class specClass) { - return qck_runSuite([XCTestSuite testSuiteForTestCaseClass:specClass]); -} - -XCTestRun * _Nullable qck_runSpecs(NSArray * _Nonnull specClasses) { - XCTestSuite *suite = [XCTestSuite testSuiteWithName:@"MySpecs"]; - for (Class specClass in specClasses) { - [suite addTest:[XCTestSuite testSuiteForTestCaseClass:specClass]]; - } - - return qck_runSuite(suite); -} diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.h deleted file mode 100644 index 99e20f8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.h +++ /dev/null @@ -1,11 +0,0 @@ -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QuickSpec (QuickSpec_MethodList) - -+ (NSSet *)allSelectors; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.m deleted file mode 100644 index c648bd1..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpec+QuickSpec_MethodList.m +++ /dev/null @@ -1,31 +0,0 @@ -#import "QuickSpec+QuickSpec_MethodList.h" -#import - - -@implementation QuickSpec (QuickSpec_MethodList) - -/** - * This method will instantiate an instance of the class on which it is called, - * returning a list of selector names for it. - * - * @warning Only intended to be used in test assertions! - * - * @return a set of NSStrings representing the list of selectors it contains - */ -+ (NSSet *)allSelectors { - QuickSpec *specInstance = [[[self class] alloc] init]; - NSMutableSet *allSelectors = [NSMutableSet set]; - - unsigned int methodCount = 0; - Method *mlist = class_copyMethodList(object_getClass(specInstance), &methodCount); - - for(unsigned int i = 0; i < methodCount; i++) { - SEL selector = method_getName(mlist[i]); - [allSelectors addObject:NSStringFromSelector(selector)]; - } - - free(mlist); - return [allSelectors copy]; -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h deleted file mode 100644 index 301c5d5..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h +++ /dev/null @@ -1,2 +0,0 @@ -#import "QCKSpecRunner.h" -#import "QuickSpec+QuickSpec_MethodList.h" diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.h b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.h deleted file mode 100644 index d69f808..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -/** - Add the ability to temporarily disable internal XCTest execution observation in - order to run isolated XCTestSuite instances while the QuickTests test suite is running. - */ -@interface XCTestObservationCenter (QCKSuspendObservation) - -/** - Suspends test suite observation for XCTest-provided observers for the duration that - the block is executing. Any test suites that are executed within the block do not - generate any log output. Failures are still reported. - - Use this method to run XCTestSuite objects while another XCTestSuite is running. - Without this method, tests fail with the message: "Timed out waiting for IDE - barrier message to complete" or "Unexpected TestSuiteDidStart". - */ -- (void)qck_suspendObservationForBlock:(void (^)(void))block; - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.m deleted file mode 100644 index 1a32e10..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/XCTestObservationCenter+QCKSuspendObservation.m +++ /dev/null @@ -1,54 +0,0 @@ -@import XCTest; -#import - -@interface XCTestObservationCenter (Redeclaration) -- (id)observers; -- (void)removeTestObserver:(id)testObserver; -@end - -@implementation XCTestObservationCenter (QCKSuspendObservation) - -/// This allows us to only suspend observation for observers by provided by Apple -/// as a part of the XCTest framework. In particular it is important that we not -/// suspend the observer added by Nimble, otherwise it is unable to properly -/// report assertion failures. -static BOOL (^isFromApple)(id) = ^BOOL(id observer){ - return [[NSBundle bundleForClass:[observer class]].bundleIdentifier containsString:@"com.apple.dt.XCTest"]; -}; - -- (void)qck_suspendObservationForBlock:(void (^)(void))block { - id originalObservers = [[self observers] copy]; - NSMutableArray *suspendedObservers = [NSMutableArray new]; - - for (id observer in originalObservers) { - if (isFromApple(observer)) { - [suspendedObservers addObject:observer]; - - if ([self respondsToSelector:@selector(removeTestObserver:)]) { - [self removeTestObserver:observer]; - } - else if ([[self observers] respondsToSelector:@selector(removeObject:)]) { - [[self observers] removeObject:observer]; - } - else { - NSAssert(NO, @"unexpected type: unable to remove observers: %@", originalObservers); - } - } - } - - @try { - block(); - } - @finally { - for (id observer in suspendedObservers) { - if ([[self observers] respondsToSelector:@selector(addObject:)]) { - [[self observers] addObject:observer]; - } - else if ([self respondsToSelector:@selector(addTestObserver:)]) { - [self addTestObserver:observer]; - } - } - } -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Info.plist b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Info.plist deleted file mode 100644 index 6d32c15..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/QuickConfigurationTests.m b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/QuickConfigurationTests.m deleted file mode 100644 index ace4577..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/QuickConfigurationTests.m +++ /dev/null @@ -1,12 +0,0 @@ -#import -#import - -@interface QuickConfigurationTests : XCTestCase; @end - -@implementation QuickConfigurationTests - -- (void)testInitThrows { - XCTAssertThrowsSpecificNamed([QuickConfiguration new], NSException, NSInternalInconsistencyException); -} - -@end diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/release b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/release deleted file mode 100755 index 26409c4..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/release +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/env sh -REMOTE_BRANCH=master -POD_NAME=Quick -PODSPEC=Quick.podspec - -POD=${COCOAPODS:-pod} - -function help { - echo "Usage: release VERSION RELEASE_NOTES [-f]" - echo - echo "VERSION should be the version to release, should not include the 'v' prefix" - echo "RELEASE_NOTES should be a file that lists all the release notes for this version" - echo " if file does not exist, creates a git-style commit with a diff as a comment" - echo - echo "FLAGS" - echo " -f Forces override of tag" - echo - echo " Example: ./release 1.0.0-rc.2 ./release-notes.txt" - echo - echo "HINT: use 'git diff ...HEAD' to build the release notes" - echo - exit 2 -} - -function die { - echo "[ERROR] $@" - echo - exit 1 -} - -if [ $# -lt 2 ]; then - help -fi - -VERSION=$1 -RELEASE_NOTES=$2 -FORCE_TAG=$3 - -VERSION_TAG="v$VERSION" - -echo "-> Verifying Local Directory for Release" - -if [ -z "`which $POD`" ]; then - die "Cocoapods is required to produce a release. Aborting." -fi -echo " > Cocoapods is installed" - -echo " > Is this a reasonable tag?" - -echo $VERSION_TAG | grep -q "^vv" -if [ $? -eq 0 ]; then - die "This tag ($VERSION) is an incorrect format. You should remove the 'v' prefix." -fi - -echo $VERSION_TAG | grep -q -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" -if [ $? -ne 0 ]; then - die "This tag ($VERSION) is an incorrect format. It should be in 'v{MAJOR}.{MINOR}.{PATCH}(-{PRERELEASE_NAME}.{PRERELEASE_VERSION})' form." -fi - -echo " > Is this version ($VERSION) unique?" -git describe --exact-match "$VERSION_TAG" > /dev/null 2>&1 -if [ $? -eq 0 ]; then - if [ -z "$FORCE_TAG" ]; then - die "This tag ($VERSION) already exists. Aborting. Append '-f' to override" - else - echo " > NO, but force was specified." - fi -else - echo " > Yes, tag is unique" -fi - -if [ ! -f "$RELEASE_NOTES" ]; then - echo " > Failed to find $RELEASE_NOTES. Prompting editor" - RELEASE_NOTES=.release-changes - LATEST_TAG=`git for-each-ref refs/tags --sort=-refname --format="%(refname:short)" | grep -E "^v\d+\.\d+\.\d+(-\w+(\.\d)?)?\$" | ruby -e 'puts STDIN.read.split("\n").sort { |a,b| Gem::Version.new(a.gsub(/^v/, "")) <=> Gem::Version.new(b.gsub(/^v/, "")) }.last'` - echo " > Latest tag ${LATEST_TAG}" - echo "${POD_NAME} v$VERSION" > $RELEASE_NOTES - echo "================" >> $RELEASE_NOTES - echo >> $RELEASE_NOTES - echo "# Changelog from ${LATEST_TAG}..HEAD" >> $RELEASE_NOTES - git log ${LATEST_TAG}..HEAD | sed -e 's/^/# /' >> $RELEASE_NOTES - $EDITOR $RELEASE_NOTES - diff -q $RELEASE_NOTES ${RELEASE_NOTES}.backup > /dev/null 2>&1 - STATUS=$? - rm ${RELEASE_NOTES}.backup - if [ $STATUS -eq 0 ]; then - rm $RELEASE_NOTES - die "No changes in release notes file. Aborting." - fi -fi -echo " > Release notes: $RELEASE_NOTES" - -if [ ! -f "$PODSPEC" ]; then - die "Cannot find podspec: $PODSPEC. Aborting." -fi -echo " > Podspec exists" - -git config --get user.signingkey > /dev/null || { - echo "[ERROR] No PGP found to sign tag. Aborting." - echo - echo " Creating a release requires signing the tag for security purposes. This allows users to verify the git cloned tree is from a trusted source." - echo " From a security perspective, it is not considered safe to trust the commits (including Author & Signed-off fields). It is easy for any" - echo " intermediate between you and the end-users to modify the git repository." - echo - echo " While not all users may choose to verify the PGP key for tagged releases. It is a good measure to ensure 'this is an official release'" - echo " from the official maintainers." - echo - echo " If you're creating your PGP key for the first time, use RSA with at least 4096 bits." - echo - echo "Related resources:" - echo " - Configuring your system for PGP: https://git-scm.com/book/tr/v2/Git-Tools-Signing-Your-Work" - echo " - Why: http://programmers.stackexchange.com/questions/212192/what-are-the-advantages-and-disadvantages-of-cryptographically-signing-commits-a" - echo - exit 2 -} -echo " > Found PGP key for git" - -# Verify cocoapods trunk ownership -pod trunk me | grep -q "$POD_NAME" || die "You do not have access to pod repository $POD_NAME. Aborting." -echo " > Verified ownership to $POD_NAME pod" - - -echo "--- Releasing version $VERSION (tag: $VERSION_TAG)..." - -function restore_podspec { - if [ -f "${PODSPEC}.backup" ]; then - mv -f ${PODSPEC}{.backup,} - fi -} - -echo "-> Ensuring no differences to origin/$REMOTE_BRANCH" -git fetch origin || die "Failed to fetch origin" -git diff --quiet HEAD "origin/$REMOTE_BRANCH" || die "HEAD is not aligned to origin/$REMOTE_BRANCH. Cannot update version safely" - -echo "-> Setting podspec version" -cat "$PODSPEC" | grep 's.version' | grep -q "\"$VERSION\"" -SET_PODSPEC_VERSION=$? -if [ $SET_PODSPEC_VERSION -eq 0 ]; then - echo " > Podspec already set to $VERSION. Skipping." -else - sed -i.backup "s/s.version *= *\".*\"/s.version = \"$VERSION\"/g" "$PODSPEC" || { - restore_podspec - die "Failed to update version in podspec" - } - - git add ${PODSPEC} || { restore_podspec; die "Failed to add ${PODSPEC} to INDEX"; } - git commit -m "Bumping version to $VERSION" || { restore_podspec; die "Failed to push updated version: $VERSION"; } -fi - -if [ -z "$FORCE_TAG" ]; then - echo "-> Tagging version" - git tag -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin" - git push origin "$VERSION_TAG" || die "Failed to push tag '$VERSION_TAG' to origin" -else - echo "-> Tagging version (force)" - git tag -f -s "$VERSION_TAG" -F "$RELEASE_NOTES" || die "Failed to tag version" - echo "-> Pushing tag to origin (force)" - git push origin "$VERSION_TAG" -f || die "Failed to push tag '$VERSION_TAG' to origin" -fi - -if [ $SET_PODSPEC_VERSION -ne 0 ]; then - rm $RELEASE_NOTES - git push origin "$REMOTE_BRANCH" || die "Failed to push to origin" - echo " > Pushed version to origin" -fi - -echo -echo "Pushing to pod trunk..." - -$POD trunk push "$PODSPEC" - -echo -echo "================ Finalizing the Release ================" -echo -echo " - Opening GitHub to mark this as a release..." -echo " - Paste the contents of $RELEASE_NOTES into the release notes. Tweak for Github styling." -echo " - Announce!" - -open "https://github.com/Quick/Quick/releases/new?tag=$VERSION_TAG" - -rm ${PODSPEC}.backup diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-install-linux b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-install-linux deleted file mode 100755 index 279cd88..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-install-linux +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -set -e - -# See: https://github.com/kylef/swiftenv/wiki/Travis-CI -curl -sL https://gist.github.com/kylef/5c0475ff02b7c7671d2a/raw/621ef9b29bbb852fdfd2e10ed147b321d792c1e4/swiftenv-install.sh | bash diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-install-macos b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-install-macos deleted file mode 100755 index 64edf92..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-install-macos +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -set -e - -git submodule update --init --recursive diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-script-linux b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-script-linux deleted file mode 100755 index 7a6558d..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-script-linux +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh - -. ~/.swiftenv/init -rake test:swiftpm diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-script-macos b/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-script-macos deleted file mode 100755 index ac60f1c..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/Quick/script/travis-script-macos +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env sh - -if [ "$PODSPEC" ]; then - TASK="podspec:lint" -else - TASK="test:$PLATFORM" -fi - -echo "Executing rake task: $TASK" -rake "$TASK" diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/.gitignore b/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/.gitignore deleted file mode 100644 index b29206a..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Carthage/Build diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Common.xcconfig b/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Common.xcconfig deleted file mode 100644 index 99b7fc8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Common.xcconfig +++ /dev/null @@ -1,179 +0,0 @@ -// -// This file defines common settings that should be enabled for every new -// project. Typically, you want to use Debug, Release, or a similar variant -// instead. -// - -// Disable legacy-compatible header searching -ALWAYS_SEARCH_USER_PATHS = NO - -// Architectures to build -ARCHS = $(ARCHS_STANDARD) - -// Whether to warn when a floating-point value is used as a loop counter -CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES - -// Whether to warn about use of rand() and random() being used instead of arc4random() -CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES - -// Whether to warn about strcpy() and strcat() -CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES - -// Whether to enable module imports -CLANG_ENABLE_MODULES = YES - -// Enable ARC -CLANG_ENABLE_OBJC_ARC = YES - -// Warn about implicit conversions to boolean values that are suspicious. -// For example, writing 'if (foo)' with 'foo' being the name a function will trigger a warning. -CLANG_WARN_BOOL_CONVERSION = YES - -// Warn about implicit conversions of constant values that cause the constant value to change, -// either through a loss of precision, or entirely in its meaning. -CLANG_WARN_CONSTANT_CONVERSION = YES - -// Whether to warn when overriding deprecated methods -CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES - -// Warn about direct accesses to the Objective-C 'isa' pointer instead of using a runtime API. -CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR - -// Warn about declaring the same method more than once within the same @interface. -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES - -// Warn about loop bodies that are suspiciously empty. -CLANG_WARN_EMPTY_BODY = YES - -// Warn about implicit conversions between different kinds of enum values. -// For example, this can catch issues when using the wrong enum flag as an argument to a function or method. -CLANG_WARN_ENUM_CONVERSION = YES - -// Whether to warn on implicit conversions between signed/unsigned types -CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO - -// Warn about implicit conversions between pointers and integers. -// For example, this can catch issues when one incorrectly intermixes using NSNumbers and raw integers. -CLANG_WARN_INT_CONVERSION = YES - -// Don't warn about repeatedly using a weak reference without assigning the weak reference to a strong reference. Too many false positives. -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO - -// Warn about classes that unintentionally do not subclass a root class (such as NSObject). -CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR - -// Whether to warn on suspicious implicit conversions -CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES - -// Warn about potentially unreachable code -CLANG_WARN_UNREACHABLE_CODE = YES - -// The format of debugging symbols -DEBUG_INFORMATION_FORMAT = dwarf-with-dsym - -// Whether to compile assertions in -ENABLE_NS_ASSERTIONS = YES - -// Whether to require objc_msgSend to be cast before invocation -ENABLE_STRICT_OBJC_MSGSEND = YES - -// Which C variant to use -GCC_C_LANGUAGE_STANDARD = gnu99 - -// Whether to enable exceptions for Objective-C -GCC_ENABLE_OBJC_EXCEPTIONS = YES - -// Whether to generate debugging symbols -GCC_GENERATE_DEBUGGING_SYMBOLS = YES - -// Whether to precompile the prefix header (if one is specified) -GCC_PRECOMPILE_PREFIX_HEADER = YES - -// Whether to enable strict aliasing, meaning that two pointers of different -// types (other than void * or any id type) cannot point to the same memory -// location -GCC_STRICT_ALIASING = YES - -// Whether symbols not explicitly exported are hidden by default (this primarily -// only affects C++ code) -GCC_SYMBOLS_PRIVATE_EXTERN = NO - -// Whether static variables are thread-safe by default -GCC_THREADSAFE_STATICS = NO - -// Which compiler to use -GCC_VERSION = com.apple.compilers.llvm.clang.1_0 - -// Whether warnings are treated as errors -GCC_TREAT_WARNINGS_AS_ERRORS = YES - -// Whether to warn about 64-bit values being implicitly shortened to 32 bits -GCC_WARN_64_TO_32_BIT_CONVERSION = YES - -// Whether to warn about fields missing from structure initializers (only if -// designated initializers aren't used) -GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES - -// Whether to warn about missing function prototypes -GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO - -// Whether to warn about implicit conversions in the signedness of the type -// a pointer is pointing to (e.g., 'int *' getting converted to 'unsigned int *') -GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES - -// Whether to warn when the value returned from a function/method/block does not -// match its return type -GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR - -// Whether to warn on a class not implementing all the required methods of -// a protocol it declares conformance to -GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES - -// Whether to warn when switching on an enum value, and all possibilities are -// not accounted for -GCC_WARN_CHECK_SWITCH_STATEMENTS = YES - -// Whether to warn about the use of four-character constants -GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES - -// Whether to warn about an aggregate data type's initializer not being fully -// bracketed (e.g., array initializer syntax) -GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES - -// Whether to warn about missing braces or parentheses that make the meaning of -// the code ambiguous -GCC_WARN_MISSING_PARENTHESES = YES - -// Whether to warn about unsafe comparisons between values of different -// signedness -GCC_WARN_SIGN_COMPARE = YES - -// Whether to warn about the arguments to printf-style functions not matching -// the format specifiers -GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES - -// Warn if a "@selector(...)" expression referring to an undeclared selector is found -GCC_WARN_UNDECLARED_SELECTOR = YES - -// Warn if a variable might be clobbered by a setjmp call or if an automatic variable is used without prior initialization. -GCC_WARN_UNINITIALIZED_AUTOS = YES - -// Whether to warn about static functions that are unused -GCC_WARN_UNUSED_FUNCTION = YES - -// Whether to warn about labels that are unused -GCC_WARN_UNUSED_LABEL = YES - -// Whether to warn about variables that are never used -GCC_WARN_UNUSED_VARIABLE = YES - -// Whether to run the static analyzer with every build -RUN_CLANG_STATIC_ANALYZER = YES - -// Don't treat unknown warnings as errors, and disable GCC compatibility warnings and unused static const variable warnings -WARNING_CFLAGS = -Wno-error=unknown-warning-option -Wno-gcc-compat -Wno-unused-const-variable -Wno-nullability-completeness - -// This setting is on for new projects as of Xcode ~6.3, though it is still not -// the default. It warns if the same variable is declared in two binaries that -// are linked together. -GCC_NO_COMMON_BLOCKS = YES diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Debug.xcconfig b/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Debug.xcconfig deleted file mode 100644 index 6ef0040..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Debug.xcconfig +++ /dev/null @@ -1,43 +0,0 @@ -// -// This file defines the base configuration for a Debug build of any project. -// This should be set at the project level for the Debug configuration. -// - -#include "../Common.xcconfig" - -// Whether to strip debugging symbols when copying resources (like included -// binaries) -COPY_PHASE_STRIP = NO - -// The optimization level (0, 1, 2, 3, s) for the produced binary -GCC_OPTIMIZATION_LEVEL = 0 - -// Preproccessor definitions to apply to each file compiled -GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 - -// Whether to enable link-time optimizations (such as inlining across translation -// units) -LLVM_LTO = NO - -// Whether to only build the active architecture -ONLY_ACTIVE_ARCH = YES - -// Other compiler flags -// -// These settings catch some errors in integer arithmetic -OTHER_CFLAGS = -ftrapv - -// Other flags to pass to the Swift compiler -// -// This enables conditional compilation with #if DEBUG -OTHER_SWIFT_FLAGS = -D DEBUG - -// Whether to strip debugging symbols when copying the built product to its -// final installation location -STRIP_INSTALLED_PRODUCT = NO - -// The optimization level (-Onone, -O, -Ofast) for the produced Swift binary -SWIFT_OPTIMIZATION_LEVEL = -Onone - -// Disable Developer ID timestamping -OTHER_CODE_SIGN_FLAGS = --timestamp=none diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Test.xcconfig b/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Test.xcconfig deleted file mode 100644 index 2da35e8..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Test.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -// -// This file defines the base configuration for a Test build of any project. -// This should be set at the project level for the Test configuration. -// - -#include "Debug.xcconfig" - -// Sandboxed apps can't be unit tested since they can't load some random -// external bundle. So we disable sandboxing for testing. -CODE_SIGN_ENTITLEMENTS = diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/README.md b/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/README.md deleted file mode 100644 index 8b69024..0000000 --- a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/README.md +++ /dev/null @@ -1,13 +0,0 @@ -This project intends to aggregate common or universal Xcode configuration settings, keeping them in hierarchial Xcode configuration files for easy modification and reuse. - -## License - -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. - -In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to [unlicense.org](http://unlicense.org). diff --git a/Carthage/Checkouts/Swinject/Configurations/Base/Common.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Base/Common.xcconfig deleted file mode 100644 index 99b7fc8..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Base/Common.xcconfig +++ /dev/null @@ -1,179 +0,0 @@ -// -// This file defines common settings that should be enabled for every new -// project. Typically, you want to use Debug, Release, or a similar variant -// instead. -// - -// Disable legacy-compatible header searching -ALWAYS_SEARCH_USER_PATHS = NO - -// Architectures to build -ARCHS = $(ARCHS_STANDARD) - -// Whether to warn when a floating-point value is used as a loop counter -CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES - -// Whether to warn about use of rand() and random() being used instead of arc4random() -CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES - -// Whether to warn about strcpy() and strcat() -CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES - -// Whether to enable module imports -CLANG_ENABLE_MODULES = YES - -// Enable ARC -CLANG_ENABLE_OBJC_ARC = YES - -// Warn about implicit conversions to boolean values that are suspicious. -// For example, writing 'if (foo)' with 'foo' being the name a function will trigger a warning. -CLANG_WARN_BOOL_CONVERSION = YES - -// Warn about implicit conversions of constant values that cause the constant value to change, -// either through a loss of precision, or entirely in its meaning. -CLANG_WARN_CONSTANT_CONVERSION = YES - -// Whether to warn when overriding deprecated methods -CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES - -// Warn about direct accesses to the Objective-C 'isa' pointer instead of using a runtime API. -CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR - -// Warn about declaring the same method more than once within the same @interface. -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES - -// Warn about loop bodies that are suspiciously empty. -CLANG_WARN_EMPTY_BODY = YES - -// Warn about implicit conversions between different kinds of enum values. -// For example, this can catch issues when using the wrong enum flag as an argument to a function or method. -CLANG_WARN_ENUM_CONVERSION = YES - -// Whether to warn on implicit conversions between signed/unsigned types -CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO - -// Warn about implicit conversions between pointers and integers. -// For example, this can catch issues when one incorrectly intermixes using NSNumbers and raw integers. -CLANG_WARN_INT_CONVERSION = YES - -// Don't warn about repeatedly using a weak reference without assigning the weak reference to a strong reference. Too many false positives. -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO - -// Warn about classes that unintentionally do not subclass a root class (such as NSObject). -CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR - -// Whether to warn on suspicious implicit conversions -CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES - -// Warn about potentially unreachable code -CLANG_WARN_UNREACHABLE_CODE = YES - -// The format of debugging symbols -DEBUG_INFORMATION_FORMAT = dwarf-with-dsym - -// Whether to compile assertions in -ENABLE_NS_ASSERTIONS = YES - -// Whether to require objc_msgSend to be cast before invocation -ENABLE_STRICT_OBJC_MSGSEND = YES - -// Which C variant to use -GCC_C_LANGUAGE_STANDARD = gnu99 - -// Whether to enable exceptions for Objective-C -GCC_ENABLE_OBJC_EXCEPTIONS = YES - -// Whether to generate debugging symbols -GCC_GENERATE_DEBUGGING_SYMBOLS = YES - -// Whether to precompile the prefix header (if one is specified) -GCC_PRECOMPILE_PREFIX_HEADER = YES - -// Whether to enable strict aliasing, meaning that two pointers of different -// types (other than void * or any id type) cannot point to the same memory -// location -GCC_STRICT_ALIASING = YES - -// Whether symbols not explicitly exported are hidden by default (this primarily -// only affects C++ code) -GCC_SYMBOLS_PRIVATE_EXTERN = NO - -// Whether static variables are thread-safe by default -GCC_THREADSAFE_STATICS = NO - -// Which compiler to use -GCC_VERSION = com.apple.compilers.llvm.clang.1_0 - -// Whether warnings are treated as errors -GCC_TREAT_WARNINGS_AS_ERRORS = YES - -// Whether to warn about 64-bit values being implicitly shortened to 32 bits -GCC_WARN_64_TO_32_BIT_CONVERSION = YES - -// Whether to warn about fields missing from structure initializers (only if -// designated initializers aren't used) -GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES - -// Whether to warn about missing function prototypes -GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO - -// Whether to warn about implicit conversions in the signedness of the type -// a pointer is pointing to (e.g., 'int *' getting converted to 'unsigned int *') -GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES - -// Whether to warn when the value returned from a function/method/block does not -// match its return type -GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR - -// Whether to warn on a class not implementing all the required methods of -// a protocol it declares conformance to -GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES - -// Whether to warn when switching on an enum value, and all possibilities are -// not accounted for -GCC_WARN_CHECK_SWITCH_STATEMENTS = YES - -// Whether to warn about the use of four-character constants -GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES - -// Whether to warn about an aggregate data type's initializer not being fully -// bracketed (e.g., array initializer syntax) -GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES - -// Whether to warn about missing braces or parentheses that make the meaning of -// the code ambiguous -GCC_WARN_MISSING_PARENTHESES = YES - -// Whether to warn about unsafe comparisons between values of different -// signedness -GCC_WARN_SIGN_COMPARE = YES - -// Whether to warn about the arguments to printf-style functions not matching -// the format specifiers -GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES - -// Warn if a "@selector(...)" expression referring to an undeclared selector is found -GCC_WARN_UNDECLARED_SELECTOR = YES - -// Warn if a variable might be clobbered by a setjmp call or if an automatic variable is used without prior initialization. -GCC_WARN_UNINITIALIZED_AUTOS = YES - -// Whether to warn about static functions that are unused -GCC_WARN_UNUSED_FUNCTION = YES - -// Whether to warn about labels that are unused -GCC_WARN_UNUSED_LABEL = YES - -// Whether to warn about variables that are never used -GCC_WARN_UNUSED_VARIABLE = YES - -// Whether to run the static analyzer with every build -RUN_CLANG_STATIC_ANALYZER = YES - -// Don't treat unknown warnings as errors, and disable GCC compatibility warnings and unused static const variable warnings -WARNING_CFLAGS = -Wno-error=unknown-warning-option -Wno-gcc-compat -Wno-unused-const-variable -Wno-nullability-completeness - -// This setting is on for new projects as of Xcode ~6.3, though it is still not -// the default. It warns if the same variable is declared in two binaries that -// are linked together. -GCC_NO_COMMON_BLOCKS = YES diff --git a/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Debug.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Debug.xcconfig deleted file mode 100644 index 6ef0040..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Debug.xcconfig +++ /dev/null @@ -1,43 +0,0 @@ -// -// This file defines the base configuration for a Debug build of any project. -// This should be set at the project level for the Debug configuration. -// - -#include "../Common.xcconfig" - -// Whether to strip debugging symbols when copying resources (like included -// binaries) -COPY_PHASE_STRIP = NO - -// The optimization level (0, 1, 2, 3, s) for the produced binary -GCC_OPTIMIZATION_LEVEL = 0 - -// Preproccessor definitions to apply to each file compiled -GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 - -// Whether to enable link-time optimizations (such as inlining across translation -// units) -LLVM_LTO = NO - -// Whether to only build the active architecture -ONLY_ACTIVE_ARCH = YES - -// Other compiler flags -// -// These settings catch some errors in integer arithmetic -OTHER_CFLAGS = -ftrapv - -// Other flags to pass to the Swift compiler -// -// This enables conditional compilation with #if DEBUG -OTHER_SWIFT_FLAGS = -D DEBUG - -// Whether to strip debugging symbols when copying the built product to its -// final installation location -STRIP_INSTALLED_PRODUCT = NO - -// The optimization level (-Onone, -O, -Ofast) for the produced Swift binary -SWIFT_OPTIMIZATION_LEVEL = -Onone - -// Disable Developer ID timestamping -OTHER_CODE_SIGN_FLAGS = --timestamp=none diff --git a/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Profile.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Profile.xcconfig deleted file mode 100644 index 0d01553..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Profile.xcconfig +++ /dev/null @@ -1,27 +0,0 @@ -// -// This file defines the base configuration for an optional profiling-specific -// build of any project. To use these settings, create a Profile configuration -// in your project, and use this file at the project level for the new -// configuration. -// - -// based on the Release configuration, with some stuff related to debugging -// symbols re-enabled -#include "Release.xcconfig" - -// Whether to strip debugging symbols when copying resources (like included -// binaries) -COPY_PHASE_STRIP = NO - -// Whether to only build the active architecture -ONLY_ACTIVE_ARCH = YES - -// Whether to strip debugging symbols when copying the built product to its -// final installation location -STRIP_INSTALLED_PRODUCT = NO - -// Whether to perform App Store validation checks -VALIDATE_PRODUCT = NO - -// Disable Developer ID timestamping -OTHER_CODE_SIGN_FLAGS = --timestamp=none diff --git a/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Release.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Release.xcconfig deleted file mode 100644 index c83729b..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Release.xcconfig +++ /dev/null @@ -1,34 +0,0 @@ -// -// This file defines the base configuration for a Release build of any project. -// This should be set at the project level for the Release configuration. -// - -#include "../Common.xcconfig" - -// Whether to strip debugging symbols when copying resources (like included -// binaries) -COPY_PHASE_STRIP = YES - -// The optimization level (0, 1, 2, 3, s) for the produced binary -GCC_OPTIMIZATION_LEVEL = s - -// Preproccessor definitions to apply to each file compiled -GCC_PREPROCESSOR_DEFINITIONS = NDEBUG=1 - -// Whether to enable link-time optimizations (such as inlining across translation -// units) -LLVM_LTO = NO - -// Whether to only build the active architecture -ONLY_ACTIVE_ARCH = NO - -// Whether to strip debugging symbols when copying the built product to its -// final installation location -STRIP_INSTALLED_PRODUCT = YES - -// The optimization level (-Onone, -O, -Owholemodule) for the produced Swift binary -SWIFT_OPTIMIZATION_LEVEL = -Owholemodule - -// Whether to perform App Store validation checks -VALIDATE_PRODUCT = YES - diff --git a/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Test.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Test.xcconfig deleted file mode 100644 index 2da35e8..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Base/Configurations/Test.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -// -// This file defines the base configuration for a Test build of any project. -// This should be set at the project level for the Test configuration. -// - -#include "Debug.xcconfig" - -// Sandboxed apps can't be unit tested since they can't load some random -// external bundle. So we disable sandboxing for testing. -CODE_SIGN_ENTITLEMENTS = diff --git a/Carthage/Checkouts/Swinject/Configurations/Base/Targets/Application.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Base/Targets/Application.xcconfig deleted file mode 100644 index a91feca..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Base/Targets/Application.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application. Typically, you want to use a platform-specific variant -// instead. -// - -// Whether to strip out code that isn't called from anywhere -DEAD_CODE_STRIPPING = NO - -// Sets the @rpath for the application such that it can include frameworks in -// the application bundle (inside the "Frameworks" folder) -LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks @loader_path/../Frameworks @executable_path/Frameworks diff --git a/Carthage/Checkouts/Swinject/Configurations/Base/Targets/Framework.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Base/Targets/Framework.xcconfig deleted file mode 100644 index c92f57f..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Base/Targets/Framework.xcconfig +++ /dev/null @@ -1,37 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework. Typically, you want to use a platform-specific variant -// instead. -// - -// Disable code signing for successful device builds with Xcode 8. Frameworks do -// need to be signed, but they don't need to be signed at compile time because -// they'll be re-signed when you include them in your app. -CODE_SIGNING_REQUIRED = NO -CODE_SIGN_IDENTITY = - -// Whether to strip out code that isn't called from anywhere -DEAD_CODE_STRIPPING = NO - -// Whether this framework should define an LLVM module -DEFINES_MODULE = YES - -// Whether function calls should be position-dependent (should always be -// disabled for library code) -GCC_DYNAMIC_NO_PIC = NO - -// Default frameworks to the name of the project, instead of any -// platform-specific target -PRODUCT_NAME = $(PROJECT_NAME) - -// Enables the framework to be included from any location as long as the -// loader’s runpath search paths includes it. For example from an application -// bundle (inside the "Frameworks" folder) or shared folder -INSTALL_PATH = @rpath -LD_DYLIB_INSTALL_NAME = @rpath/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/$(PRODUCT_NAME) -SKIP_INSTALL = YES - -// Disallows use of APIs that are not available -// to app extensions and linking to frameworks -// that have not been built with this setting enabled. -APPLICATION_EXTENSION_API_ONLY = YES diff --git a/Carthage/Checkouts/Swinject/Configurations/Base/Targets/StaticLibrary.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Base/Targets/StaticLibrary.xcconfig deleted file mode 100644 index b3b2b87..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Base/Targets/StaticLibrary.xcconfig +++ /dev/null @@ -1,32 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library. Typically, you want to use a platform-specific variant -// instead. -// - -// Whether to strip out code that isn't called from anywhere -DEAD_CODE_STRIPPING = NO - -// Whether to strip debugging symbols when copying resources (like included -// binaries). -// -// Overrides Release.xcconfig when used at the target level. -COPY_PHASE_STRIP = NO - -// Whether function calls should be position-dependent (should always be -// disabled for library code) -GCC_DYNAMIC_NO_PIC = NO - -// Copy headers to "include/LibraryName" in the build folder by default. This -// lets consumers use #import syntax even for static -// libraries -PUBLIC_HEADERS_FOLDER_PATH = include/$PRODUCT_NAME - -// Don't include in an xcarchive -SKIP_INSTALL = YES - -// Disallows use of APIs that are not available -// to app extensions and linking to frameworks -// that have not been built with this setting enabled. -APPLICATION_EXTENSION_API_ONLY = YES - diff --git a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Application.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Application.xcconfig deleted file mode 100644 index 2e552c7..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Application.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application on Mac OS X. This should be set at the target level for -// each project configuration. -// - -// Import base application settings -#include "../Base/Targets/Application.xcconfig" - -// Apply common settings specific to Mac OS X -#include "Mac-Base.xcconfig" - -// Whether function calls should be position-dependent (should always be -// disabled for library code) -GCC_DYNAMIC_NO_PIC = YES diff --git a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Base.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Base.xcconfig deleted file mode 100644 index 8fdeccc..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Base.xcconfig +++ /dev/null @@ -1,19 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for Mac OS X. This file is not standalone -- it is meant to be included into -// a configuration file for a specific type of target. -// - -// Whether to combine multiple image resolutions into a multirepresentational -// TIFF -COMBINE_HIDPI_IMAGES = YES - -// Where to find embedded frameworks -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks - -// The base SDK to use (if no version is specified, the latest version is -// assumed) -SDKROOT = macosx - -// Supported build architectures -VALID_ARCHS = x86_64 diff --git a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-DynamicLibrary.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-DynamicLibrary.xcconfig deleted file mode 100644 index 1e2a37c..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-DynamicLibrary.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a dynamic library on Mac OS X. This should be set at the target level -// for each project configuration. -// - -// Import common settings specific to Mac OS X -#include "Mac-Base.xcconfig" - -// Whether to strip out code that isn't called from anywhere -DEAD_CODE_STRIPPING = NO - -// Whether function calls should be position-dependent (should always be -// disabled for library code) -GCC_DYNAMIC_NO_PIC = NO - -// Don't include in an xcarchive -SKIP_INSTALL = YES diff --git a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Framework.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Framework.xcconfig deleted file mode 100644 index dd98764..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-Framework.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework on OS X. This should be set at the target level for each -// project configuration. -// - -// Import base framework settings -#include "../Base/Targets/Framework.xcconfig" - -// Import common settings specific to Mac OS X -#include "Mac-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-StaticLibrary.xcconfig b/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-StaticLibrary.xcconfig deleted file mode 100644 index 97d0318..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/Mac OS X/Mac-StaticLibrary.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library on Mac OS X. This should be set at the target level for -// each project configuration. -// - -// Import base static library settings -#include "../Base/Targets/StaticLibrary.xcconfig" - -// Apply common settings specific to Mac OS X -#include "Mac-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Application.xcconfig b/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Application.xcconfig deleted file mode 100644 index a700868..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Application.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application on iOS. This should be set at the target level for each -// project configuration. -// - -// Import base application settings -#include "../Base/Targets/Application.xcconfig" - -// Apply common settings specific to iOS -#include "iOS-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Base.xcconfig b/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Base.xcconfig deleted file mode 100644 index f45f905..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Base.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for iOS. This file is not standalone -- it is meant to be included into -// a configuration file for a specific type of target. -// - -// Xcode needs this to find archived headers if SKIP_INSTALL is set -HEADER_SEARCH_PATHS = $(OBJROOT)/UninstalledProducts/include - -// Where to find embedded frameworks -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks - -// The base SDK to use (if no version is specified, the latest version is -// assumed) -SDKROOT = iphoneos - -// Supported device families (1 is iPhone, 2 is iPad) -TARGETED_DEVICE_FAMILY = 1,2 diff --git a/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Framework.xcconfig b/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Framework.xcconfig deleted file mode 100644 index e538a7d..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-Framework.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework on iOS. This should be set at the target level for each -// project configuration. -// - -// Import base framework settings -#include "../Base/Targets/Framework.xcconfig" - -// Import common settings specific to iOS -#include "iOS-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-StaticLibrary.xcconfig b/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-StaticLibrary.xcconfig deleted file mode 100644 index 7e3b507..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/iOS/iOS-StaticLibrary.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library on iOS. This should be set at the target level for each -// project configuration. -// - -// Import base static library settings -#include "../Base/Targets/StaticLibrary.xcconfig" - -// Apply common settings specific to iOS -#include "iOS-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Application.xcconfig b/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Application.xcconfig deleted file mode 100644 index 74f892c..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Application.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application on tvOS. This should be set at the target level for -// each project configuration. -// - -// Import base application settings -#include "../Base/Targets/Application.xcconfig" - -// Apply common settings specific to tvOS -#include "tvOS-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Base.xcconfig b/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Base.xcconfig deleted file mode 100644 index e5cb616..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Base.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for tvOS. This file is not standalone -- it is meant to be included into -// a configuration file for a specific type of target. -// - -// Where to find embedded frameworks -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks - -// The base SDK to use (if no version is specified, the latest version is -// assumed) -SDKROOT = appletvos - -// Supported device families -TARGETED_DEVICE_FAMILY = 3 diff --git a/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Framework.xcconfig b/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Framework.xcconfig deleted file mode 100644 index cb08820..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-Framework.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework on tvOS. This should be set at the target level for each -// project configuration. -// - -// Import base framework settings -#include "../Base/Targets/Framework.xcconfig" - -// Import common settings specific to iOS -#include "tvOS-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-StaticLibrary.xcconfig b/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-StaticLibrary.xcconfig deleted file mode 100644 index 34d0200..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/tvOS/tvOS-StaticLibrary.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library on tvOS. This should be set at the target level for -// each project configuration. -// - -// Import base static library settings -#include "../Base/Targets/StaticLibrary.xcconfig" - -// Apply common settings specific to tvOS -#include "tvOS-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Application.xcconfig b/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Application.xcconfig deleted file mode 100644 index 5d88df9..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Application.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application on watchOS. This should be set at the target level for -// each project configuration. -// - -// Import base application settings -#include "../Base/Targets/Application.xcconfig" - -// Apply common settings specific to watchOS -#include "watchOS-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Base.xcconfig b/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Base.xcconfig deleted file mode 100644 index 21e4a82..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Base.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for watchOS. This file is not standalone -- it is meant to be included into -// a configuration file for a specific type of target. -// - -// Where to find embedded frameworks -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks - -// The base SDK to use (if no version is specified, the latest version is -// assumed) -SDKROOT = watchos - -// Supported device families -TARGETED_DEVICE_FAMILY = 4 diff --git a/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Framework.xcconfig b/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Framework.xcconfig deleted file mode 100644 index 3893494..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-Framework.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework on watchOS. This should be set at the target level for each -// project configuration. -// - -// Import base framework settings -#include "../Base/Targets/Framework.xcconfig" - -// Import common settings specific to iOS -#include "watchOS-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-StaticLibrary.xcconfig b/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-StaticLibrary.xcconfig deleted file mode 100644 index b9f92d8..0000000 --- a/Carthage/Checkouts/Swinject/Configurations/watchOS/watchOS-StaticLibrary.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library on watchOS. This should be set at the target level for -// each project configuration. -// - -// Import base static library settings -#include "../Base/Targets/StaticLibrary.xcconfig" - -// Apply common settings specific to watchOS -#include "watchOS-Base.xcconfig" diff --git a/Carthage/Checkouts/Swinject/Documentation/Assembler.md b/Carthage/Checkouts/Swinject/Documentation/Assembler.md deleted file mode 100644 index b97fc5a..0000000 --- a/Carthage/Checkouts/Swinject/Documentation/Assembler.md +++ /dev/null @@ -1,170 +0,0 @@ -# Modularizing Service Registration - -This feature provides your implementation the ability to group related service definitions together -in an `Assembly`. This allows your application to: - - - Keep things organized by keeping like services in one place. - - Provide a shared `Container`. - - Allow registering different assembly configurations, which is useful for swapping in mock implementations. - - To be notified when the container is fully configured. - -This feature is an opinionated way to how your can register services in your `Container` and using it is not required. - -There are several parts to this feature. - -## Assembly - -The `Assembly` is a protocol that is provided a shared `Container` where service definitions -can be registered. The shared `Container` will contain **all** service definitions from every -`Assembly` registered to the `Assembler`. Let's look at an example: - -```swift -class ServiceAssembly: Assembly { - func assemble(container: Container) { - container.register(FooServiceProtocol.self) { r in - return FooService() - } - container.register(BarServiceProtocol.self) { r in - return BarService() - } - } -} - -class ManagerAssembly: Assembly { - func assemble(container: Container) { - container.register(FooManagerProtocol.self) { r in - return FooManager(service: r.resolve(FooServiceProtocol.self)!) - } - container.register(BarManagerProtocol.self) { r in - return BarManager(service: r.resolve(BarServiceProtocol.self)!) - } - } -} -``` - -Here we have created 2 assemblies: 1 for services and 1 for managers. As you can see the `ManagerAssembly` -leverages service definitions registered in the `ServiceAssembly`. Using this pattern the `ManagerAssembly` -doesn't care where the `FooServiceProtocol` and `BarServiceProtocol` are registered, it just requires them to -be registered else where. - -### Load aware - -The `Assembly` allows the assembly to be aware when the container has been fully loaded -by the `Assembler`. - -Let's imagine you have an simple Logger class that can be configured with different log handlers: - -```swift -protocol LogHandler { - func log(message: String) -} - -class Logger { - - class var sharedInstance: Logger! - - var logHandlers = [LogHandler]() - - func addHandler(logHandler: LogHandler) { - logHandlers.append(logHandler) - } - - func log(message: String) { - for logHandler in logHandlers { - logHandler.log(message) - } - } -} -``` - -This singleton is accessed in global logging functions to make it easy to add logging anywhere -without having to deal with injects: - -```swift -func logDebug(message: String) { - Logger.sharedInstance.log("DEBUG: \(message)") -} -``` - -In order to configure the `Logger` shared instance in the container we will need to resolve the -`Logger` after the `Container` has been built. Using a `Assembly` you can keep this -bootstrapping in the assembly: - -```swift -class LoggerAssembly: Assembly { - func assemble(container: Container) { - container.register(LogHandler.self, name: "console") { r in - return ConsoleLogHandler() - } - container.register(LogHandler.self, name: "file") { r in - return FileLogHandler() - } - } - - func loaded(resolver: Resolver) { - Logger.sharedInstance.addHandler( - resolver.resolve(LogHandler.self, name: "console")!) - Logger.sharedInstance.addHandler( - resolver.resolve(LogHandler.self, name: "file")!) - } -} -``` - -## Assembler - -The `Assembler` is responsible for managing the `Assembly` instances and the `Container`. Using -the `Assembler`, the `Container` is only exposed to assemblies registered with the assembler and -only provides your application access via the `Resolver` protocol which limits registration -access strictly to the assemblies. - -Using the `ServiceAssembly` and `ManagerAssembly` above we can create our assembler: - -```swift -let assembler = Assembler([ - ServiceAssembly(), - ManagerAssembly() -]) -``` - -Now you can resolve any components from either assembly: - -```swift -let fooManager = assembler.resolver.resolve(FooManagerProtocol.self)! -``` - -You can also lazy load assemblies: - -```swift -assembler.applyAssembly(LoggerAssembly()) -``` - -The assembler also supports managing your property files as well via construction or lazy loading: - -```swift -let assembler = Assembler([ - ServiceAssembly(), - ManagerAssembly() - ], propertyLoaders: [ - JsonPropertyLoader(bundle: .mainBundle(), name: "properties") - ]) - - // or lazy load them -assembler.applyPropertyLoader( - JsonPropertyLoader(bundle: .mainBundle(), name: "properties")) -``` - -## IMPORTANT: - - - You **MUST** hold a strong reference to the `Assembler` otherwise the `Container` - will be deallocated along with your assembler - - - If you are lazy loading your properties and assemblies you must load your properties **first** if - you want your properties to be available to load aware assemblies when `loaded` is called - - - If you are lazy loading assemblies and you want your load aware assemblies to be invoked after - all assemblies have been loaded then you must use `addAssemblies` and pass all lazy loaded assemblies - at once - -_[Next page: Thread Safety](ThreadSafety.md)_ - -_[Table of Contents](README.md)_ diff --git a/Carthage/Checkouts/Swinject/Documentation/Assets/AnimalViewControllerScreenshot1.png b/Carthage/Checkouts/Swinject/Documentation/Assets/AnimalViewControllerScreenshot1.png deleted file mode 100644 index f05a6023ab03f62d6073667efc52f2e66bd34bc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44301 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

lioJ@(xu4R&pIH;YeVk^2 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 RvLL{hn2@w!1;4KE{{iXfC8+=a diff --git a/Carthage/Checkouts/Swinject/Documentation/Assets/AnimalViewControllerScreenshot2.png b/Carthage/Checkouts/Swinject/Documentation/Assets/AnimalViewControllerScreenshot2.png deleted file mode 100644 index 0be16aee250886b0e1a8c4b2ff4f278f38dd4448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57041 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 Animal) -container.register(Animal.self) { _, name in Cat(name: name) } - -// This is the correct Registration Key (Animal, (String) -> Animal) -let name1: String = "Mimi" -let mimi1 = container.resolve(Animal.self, argument: name1) // Returns a Cat instance. - -// Cannot resolve since the container has no Registration Key matching (Animal, (NSString) -> Animal) -let name2: NSString = "Mimi" -let mimi2 = container.resolve(Animal.self, argument: name2) // Returns nil. - -// Cannot resolve since the container has no Registration Key matching (Animal, (Optional) -> Animal) -let name3: String? = "Mimi" -let mimi3 = container.resolve(Animal.self, argument: name3) // Returns nil. - -// Cannot resolve since the container has no Registration Key matching (Animal, (ImplicitlyUnwrappedOptional) -> Animal) -let name4: String! = "Mimi" -let mimi4 = container.resolve(Animal.self, argument: name4) // Returns nil. -``` - -_[Next page: Injection Patterns](InjectionPatterns.md)_ - -_[Table of Contents](README.md)_ diff --git a/Carthage/Checkouts/Swinject/Documentation/InjectionPatterns.md b/Carthage/Checkouts/Swinject/Documentation/InjectionPatterns.md deleted file mode 100644 index a1f640d..0000000 --- a/Carthage/Checkouts/Swinject/Documentation/InjectionPatterns.md +++ /dev/null @@ -1,127 +0,0 @@ -# Injection Patterns - -## Initializer Injection - -_Initializer injection_ is a pattern for passing dependencies to a dependent instance by its initializers. Initializer injection is appropriate if the dependent instance cannot work without the dependencies. - -The following code defines initializer injection to `PetOwner`, which depends on `Animal`: - -```swift -let container = Container() -container.register(Animal.self) { _ in Cat() } -container.register(Person.self) { r in - PetOwner(pet: r.resolve(Animal.self)!) -} -``` - -Where the protocols and classes are - -```swift -protocol Animal { - func sound() -> String -} - -class Cat: Animal { - init() { } - - func sound() -> String { - return "Meow" - } -} - -protocol Person { } - -class PetOwner: Person { - let pet: Animal - - init(pet: Animal) { - self.pet = pet - } -} -``` - -Note that the actual type of `Animal` passed to the initializer of `PetOwner` is automatically resolved by Swinject when the `PetOwner` instance is created: - -## Property Injection - -_Property injection_ is a pattern to pass a dependency to a dependent instance via a setter property. Property injection is appropriate if the dependency is optional to the dependent instance. - -The following code defines property injection to `PetOwner2`: - -```swift -let container = Container() -container.register(Animal.self) { _ in Cat() } -container.register(Person.self) { r in - let owner = PetOwner2() - owner.pet = r.resolve(Animal.self) - return owner -} -``` - -Where - -```swift -class PetOwner2: Person { - var pet: Animal? - - init() { } -} -``` - -Or, you can use `initCompleted` callback instead of defining the injection in the registration closure: - -```swift -let container = Container() -container.register(Animal.self) { _ in Cat() } -container.register(Person.self) { _ in PetOwner2() } - .initCompleted { r, p in - let owner = p as! PetOwner2 - owner.pet = r.resolve(Animal.self) - } -``` - -## Method Injection - -_Method injection_ is a similar pattern to _property injection_, but it uses a method to pass dependencies to a dependent instance. - -The following code defines Method Injection to `PetOwner3`: - -```swift -let container = Container() -container.register(Animal.self) { _ in Cat() } -container.register(Person.self) { r in - let owner = PetOwner3() - owner.setPet(r.resolve(Animal.self)!) - return owner -} -``` - -Where - -```swift -class PetOwner3: Person { - var pet: Animal? - - init() { } - - func setPet(pet: Animal) { - self.pet = pet - } -} -``` - -Or, you can use `initCompleted` callback instead of defining the injection in the registration closure: - -```swift -let container = Container() -container.register(Animal.self) { _ in Cat() } -container.register(Person.self) { _ in PetOwner3() } - .initCompleted { r, p in - let owner = p as! PetOwner3 - owner.setPet(r.resolve(Animal.self)!) - } -``` - -_[Next page: Circular Dependencies](CircularDependencies.md)_ - -_[Table of Contents](README.md)_ diff --git a/Carthage/Checkouts/Swinject/Documentation/Misc.md b/Carthage/Checkouts/Swinject/Documentation/Misc.md deleted file mode 100644 index 25e80f4..0000000 --- a/Carthage/Checkouts/Swinject/Documentation/Misc.md +++ /dev/null @@ -1,96 +0,0 @@ -# Misc - -## Value Types - -Swift 2 has introduced [Protocol Extensions](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID521), which reinforces [Protocol Oriented Programming](http://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2) and usage of value types. Swinject can handle not only a reference type but also a value type as a component created by a factory. - -Here you have `Turtle` struct implementing `Animal` protocol. - -```swift -protocol Animal { - var name: String { get set } -} - -struct Turtle: Animal { - var name: String -} -``` - -The struct instance can be registered and resolved as below. - -```swift -let container = Container() -container.register(Animal.self) { _ in Turtle(name: "Ninja") } - -var turtle1 = container.resolve(Animal.self)! -print(turtle1.name) // prints "Ninja" -``` - -Because `turtle1` is actually a struct instance although its type is inferred as protocol `Animal` there, assigning it to a new parameter creates a new instance. - -```swift -var turtle2 = turtle1 -turtle2.name = "Samurai" -print(turtle2.name) // prints "Samurai" -print(turtle1.name) // prints "Ninja" -``` - -## Self-registration (Self-binding) - -In Swinject or other DI frameworks, a service type can not only be a protocol but also a concrete or abstract classes. A special case is when the service type and component type are identical. This case is called _self-registration_ or _self-binding_. Here is an example of self-binding with Swinject: - -```swift -let container = Container() -container.register(Animal.self) { _ in Cat(name: "Mimi") } -container.register(PetOwner.self) { r in - PetOwner(name: "Selfie", pet: r.resolve(Animal.self)!) -} -``` - -Then a `PetOwner` service is resolved as itself: - -```swift -let owner = container.resolve(PetOwner.self)! -print(owner.name) // prints "Selfie" -print(owner.pet.name) // prints "Mimi" -``` - -Where the protocols and classes are: - -```swift -protocol Animal { - var name: String { get set } -} - -class Cat: Animal { - var name: String - - init(name: String) { - self.name = name - } -} - -class PetOwner { - let name: String - let pet: Animal - - init(name: String, pet: Animal) { - self.name = name - self.pet = pet - } -} -``` - -## Resolution failure logging - -When `resolve` method fails, Swinject will log information about expected and available registrations to make DI debugging easier. This feature can be disabled / customized by modifying `Container.loggingFunction` variable, e.g.: -```swift -func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - Container.loggingFunction = nil // disable logging - ... -} -``` - -_[Next page: Container Hierarchy](ContainerHierarchy.md)_ - -_[Table of Contents](README.md)_ diff --git a/Carthage/Checkouts/Swinject/Documentation/ObjectScopes.md b/Carthage/Checkouts/Swinject/Documentation/ObjectScopes.md deleted file mode 100644 index 1c70e94..0000000 --- a/Carthage/Checkouts/Swinject/Documentation/ObjectScopes.md +++ /dev/null @@ -1,55 +0,0 @@ -# Object Scopes - -Object scope is a configuration option to determine how an instance provided by a DI container is shared in the system. It is represented by enum `ObjectScope` in Swinject. - -The object scope is specified with `inObjectScope` method when you register a pair of a service type and component factory. For example: - -```swift -container.register(Animal.self) { _ in Cat() } - .inObjectScope(.container) -``` - -The object scope is ignored if the factory closure returns a value type because its instance is never shared per the Swift specification. - -## Built-in scopes -### Transient - -If `ObjectScope.transient` is specified, an instance provided by a container is not shared. In other words, the container always creates a new instance when the type is resolved. - -If this scope is specified, circular dependencies resolution will not work properly. - -### Graph (the default scope) - -With `ObjectScope.graph`, an instance is always created, as in `ObjectScope.transient`, if you directly call `resolve` method of a container, but instances resolved in factory closures are shared during the resolution of the root instance to construct the object graph. - -### Container - -In `ObjectScope.container`, an instance provided by a container is shared within the container and its child containers (see [Container Hierarchy](ContainerHierarchy.md)). In other words, when you resolve the type for the first time, it is created by the container by invoking the factory closure. The same instance is returned by the container in any succeeding resolution of the type. - -This scope is also known as _Singleton_ in other DI frameworks. - -### Weak - -In `ObjectScope.weak` an instance provided by a container is shared within the container and its child containers as long as there are other strong references to it. Once all strong references to an instance cease to exist, it won't be shared anymore and new instance will be created during next resolution of the type. - -Above holds for reference types - value types are not shared in this object scope. - -## Custom Scopes - -Custom object scopes can be defined like this: -```swift -extension ObjectScope { - static let custom = ObjectScope(storageFactory: PersistentStorage.init) -} -``` -Instances in `.custom` scope will be shared in the same way as in `.container` scope but can be discarded as needed: -```swift -container.resetObjectScope(.custom) -``` -After scope is reset, container will create a new instance first time the type is resolved and will share this instance in any succeeding resolution of the type. - -Behavior of custom scopes can be additionally modified by providing different `storageFactory`, or writing custom implementation of `ObjectScopeProtocol` protocol. - -_[Next page: Misc](Misc.md)_ - -_[Table of Contents](README.md)_ diff --git a/Carthage/Checkouts/Swinject/Documentation/README.md b/Carthage/Checkouts/Swinject/Documentation/README.md deleted file mode 100644 index aeb034b..0000000 --- a/Carthage/Checkouts/Swinject/Documentation/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Documentation - -This is documentation for Swinject v2.x series. Documentation for v1.x is [here](https://github.com/Swinject/Swinject/tree/v1/Documentation). - -Swinject is a lightweight dependency injection framework for Swift apps. It allows you to split your app into loosely-coupled components, which can then be maintained and tested more easily. Swinject supports pure Swift types, and is powered by the Swift generic type system and [first class functions](https://en.wikipedia.org/wiki/First-class_function). This makes it syntactically elegant and simple to define the object dependencies for your app. - -## Table of Contents - -### Basics - -1. [DI Container](DIContainer.md) -2. [Injection Patterns](InjectionPatterns.md) -3. [Circular Dependencies](CircularDependencies.md) -4. [Object Scopes](ObjectScopes.md) -5. [Misc](Misc.md) - -### Advanced Features - -1. [Container Hierarchy](ContainerHierarchy.md) -2. [Modularizing Service Registration (Assembly)](Assembler.md) -3. [Thread Safety](ThreadSafety.md) - -### Extensions - -1. [SwinjectPropertyLoader](https://github.com/Swinject/SwinjectPropertyLoader): Loading property values from resources -2. [SwinjectStoryboard](https://github.com/Swinject/SwinjectStoryboard): Automatic dependency injection via Storyboard -3. [Swinject-CodeGen](https://github.com/Swinject/Swinject-CodeGen): Type-safe code generation of `Container` from a CSV/YAML file defining dependencies -4. [SwinjectAutoregistration](https://github.com/Swinject/SwinjectAutoregistration): Automatic registration of services by leveraging the Swift Generics. \ No newline at end of file diff --git a/Carthage/Checkouts/Swinject/Documentation/ThreadSafety.md b/Carthage/Checkouts/Swinject/Documentation/ThreadSafety.md deleted file mode 100644 index 14b5635..0000000 --- a/Carthage/Checkouts/Swinject/Documentation/ThreadSafety.md +++ /dev/null @@ -1,79 +0,0 @@ -# Thread Safety - -Swinject is designed to be used in concurrent applications. `Container` itself is not thread safe, but its `synchronize` method returns a thread safe view to the container as `Resolvable` type. - -```swift -let container = Container() -container.register(SomeType.self) { _ in SomeImplementation() } - -let threadSafeContainer: Resolvable = container.synchronize() - -// Do something concurrently. -for _ in 0..<4 { - dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) { - let resolvedInstance = threadSafeContainer.resolve(SomeType.self) - // ... - } -} -``` - -## Component Registrations - -Since the thread safe view of a container is `Resolvable` type, which has only overloads of `resolve` methods, registrations to the container are not thread safe. Registrations must be performed on a single thread, typically at the time when an app starts up. - -## Service Resolutions - -Only resolutions through the `Resolvable` instance returned by `synchronize` method are thread safe. Calling `resolve` method directly on a `Container` instance is not thread safe. - -If you have a container hierarchy (parent-child relationship of containers), all the containers must be accessed through the thread safe views when you resolve services. - -```swift -let parentContainer = Container() -parentContainer.register(SomeType.self) { _ in SomeImplementation() } - -let parentResolver = parentContainer.synchronize() -let childResolver = Container(parent: parentContainer).synchronize() - -// Do something concurrently. -for _ in 0..<4 { - dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) { - let instanceFromParent = parentResolver.resolve(SomeType.self) - // ... - } - dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) { - let instanceFromChild = childResolver.resolve(SomeType.self) - // ... - } -} -``` - -## SwinjectStoryboard - -`SwinjectStoryboard` does not require the thread safe view of a container in most of the cases because instantiation of a view controller is normally performed on the main thread. Only if you use the same container in another thread, the synchronized view should be passed to `SwinjectStoryboard` when you create its instance and be used in the other thread too. - -```swift -let threadSafeContainer: Resolvable = Container() { container in - container.registerForStoryboard(SomeViewController.self) { r, c in - c.something = r.resolve(SomeType.self) - } - container.register(SomeType.self) { _ in SomeImplementation() } -}.synchronize() - -let storyboard = SwinjectStoryboard.create( - name: "Main", - bundle: NSBundle.mainBundle(), - container: threadSafeContainer) - -// Do something on a background thread. -dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) { - let something = threadSafeContainer.resolve(SomeType.self) - // ... -} - -// Instantiate a view controller on the main thread. -let viewController = storyboard.instantiateInitialViewController() -``` - -Refer to [Storyboard README](https://github.com/Swinject/SwinjectStoryboard) for more details about `SwinjectStoryboard` itself. - -_[Table of Contents](README.md)_ diff --git a/Carthage/Checkouts/Swinject/LICENSE.txt b/Carthage/Checkouts/Swinject/LICENSE.txt deleted file mode 100644 index be78b88..0000000 --- a/Carthage/Checkouts/Swinject/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Swinject Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Carthage/Checkouts/Swinject/Package.swift b/Carthage/Checkouts/Swinject/Package.swift deleted file mode 100644 index 88eb754..0000000 --- a/Carthage/Checkouts/Swinject/Package.swift +++ /dev/null @@ -1,5 +0,0 @@ -import PackageDescription - -let package = Package( - name: "Swinject" -) diff --git a/Carthage/Checkouts/Swinject/README.md b/Carthage/Checkouts/Swinject/README.md deleted file mode 100644 index 8339a3d..0000000 --- a/Carthage/Checkouts/Swinject/README.md +++ /dev/null @@ -1,287 +0,0 @@ -

- -

- -Swinject -======== - -[![Travis CI](https://travis-ci.org/Swinject/Swinject.svg?branch=master)](https://travis-ci.org/Swinject/Swinject) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) -[![CocoaPods Version](https://img.shields.io/cocoapods/v/Swinject.svg?style=flat)](http://cocoapods.org/pods/Swinject) -[![License](https://img.shields.io/cocoapods/l/Swinject.svg?style=flat)](http://cocoapods.org/pods/Swinject) -[![Platforms](https://img.shields.io/badge/platform-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-lightgrey.svg)](http://cocoapods.org/pods/Swinject) -[![Swift Version](https://img.shields.io/badge/Swift-2.2--3.1.x-F16D39.svg?style=flat)](https://developer.apple.com/swift) - -Swinject is a lightweight [dependency injection](https://en.wikipedia.org/wiki/Dependency_injection) framework for Swift. - -Dependency injection (DI) is a software design pattern that implements Inversion of Control (IoC) for resolving dependencies. In the pattern, Swinject helps your app split into loosely-coupled components, which can be developed, tested and maintained more easily. Swinject is powered by the Swift generic type system and first class functions to define dependencies of your app simply and fluently. - -## Features - -- [x] [Pure Swift Type Support](./Documentation/README.md#user-content-pure-swift-type-support) -- [x] [Injection with Arguments](./Documentation/DIContainer.md#registration-with-arguments-to-di-container) -- [x] [Initializer/Property/Method Injections](./Documentation/InjectionPatterns.md) -- [x] [Initialization Callback](./Documentation/InjectionPatterns.md#user-content-initialization-callback) -- [x] [Circular Dependency Injection](./Documentation/CircularDependencies.md) -- [x] [Object Scopes as None (Transient), Graph, Container (Singleton) and Hierarchy](./Documentation/ObjectScopes.md) -- [x] Support of both Reference and [Value Types](./Documentation/Misc.md#value-types) -- [x] [Self-registration (Self-binding)](./Documentation/Misc.md#self-registration-self-binding) -- [x] [Container Hierarchy](./Documentation/ContainerHierarchy.md) -- [x] [Thread Safety](./Documentation/ThreadSafety.md) -- [x] [Modular Components](./Documentation/Assembler.md) - -## Extensions - -- **[SwinjectPropertyLoader](https://github.com/Swinject/SwinjectPropertyLoader)**: Loading property values from resources. -- **[SwinjectStoryboard](https://github.com/Swinject/SwinjectStoryboard)**: Automatic dependency injection via Storyboard. -- **[Swinject-CodeGen](https://github.com/Swinject/Swinject-CodeGen)**: Type-safe code generation of `Container` from a CSV/YAML file defining dependencies. -- **[SwinjectAutoregistration](https://github.com/Swinject/SwinjectAutoregistration)**: Automatic registration of services by leveraging the Swift Generics. - -## Requirements - -- iOS 8.0+ / Mac OS X 10.10+ / watchOS 2.0+ / tvOS 9.0+ -- Swift 2.2 or 2.3 - - Xcode 7.0+ -- Swift 3 - - Xcode 8.0+ -- Carthage 0.18+ (if you use) -- CocoaPods 1.1.1+ (if you use) - -## Installation - -Swinject is available through [Carthage](https://github.com/Carthage/Carthage) or [CocoaPods](https://cocoapods.org). - -### Carthage - -To install Swinject with Carthage, add the following line to your `Cartfile`. - -#### Swift 2.2 or 2.3 - -``` -github "Swinject/Swinject" ~> 1.1.4 -``` - -#### Swift 3.x - -``` -github "Swinject/Swinject" ~> 2.0.0 - -# Uncomment if you use SwinjectStoryboard -# github "Swinject/SwinjectStoryboard" ~> 1.0.0 -``` - -Then run `carthage update --no-use-binaries` command or just `carthage update`. For details of the installation and usage of Carthage, visit [its project page](https://github.com/Carthage/Carthage). - - -### CocoaPods - -To install Swinject with CocoaPods, add the following lines to your `Podfile`. - -#### Swift 2.2 or 2.3 - -```ruby -source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '8.0' # or platform :osx, '10.10' if your target is OS X. -use_frameworks! - -pod 'Swinject', '~> 1.1.4' -``` - -#### Swift 3.x - -```ruby -source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '8.0' # or platform :osx, '10.10' if your target is OS X. -use_frameworks! - -pod 'Swinject', '~> 2.1.0' - -# Uncomment if you use SwinjectStoryboard -# pod 'SwinjectStoryboard', '~> 1.0.0' -``` - -Then run `pod install` command. For details of the installation and usage of CocoaPods, visit [its official website](https://cocoapods.org). - -## Documentation - -- [Technical documents](./Documentation) including patterns of dependency injection and examples. -- [API reference](http://cocoadocs.org/docsets/Swinject/) - -## Basic Usage - -First, register a service and component pair to a `Container`, where the component is created by the registered closure as a factory. In this example, `Cat` and `PetOwner` are component classes implementing `Animal` and `Person` service protocols, respectively. - -```swift -let container = Container() -container.register(Animal.self) { _ in Cat(name: "Mimi") } -container.register(Person.self) { r in - PetOwner(pet: r.resolve(Animal.self)!) -} -``` - -Then get an instance of a service from the container. The person is resolved to a pet owner, and playing with the cat named Mimi! - -```swift -let person = container.resolve(Person.self)! -person.play() // prints "I'm playing with Mimi." -``` - -Where definitions of the protocols and classes are - -```swift -protocol Animal { - var name: String? { get } -} - -class Cat: Animal { - let name: String? - - init(name: String?) { - self.name = name - } -} -``` - -and - -```swift -protocol Person { - func play() -} - -class PetOwner: Person { - let pet: Animal - - init(pet: Animal) { - self.pet = pet - } - - func play() { - let name = pet.name ?? "someone" - print("I'm playing with \(name).") - } -} -``` - -Notice that the `pet` of `PetOwner` is automatically set as the instance of `Cat` when `Person` is resolved to the instance of `PetOwner`. If a container already set up is given, you do not have to care what are the actual types of the services and how they are created with their dependency. - -## Where to Register Services - -Services must be registered to a container before they are used. Typical ways of the registrations are different between the cases with/without `SwinjectStoryboard`. - -The following view controller class is used in addition to the protocols and classes above in the examples below. - -```swift -class PersonViewController: UIViewController { - var person: Person? -} -``` - -### With SwinjectStoryboard - -Import SwinjectStoryboard at the top of your swift source file if you use Swinject v2 in Swift 3. - -```swift -// Only Swinject v2 in Swift 3. -import SwinjectStoryboard -``` - -Services should be registered in an extension of `SwinjectStoryboard` if you use `SwinjectStoryboard`. Refer to [the project page of SwinjectStoryboard](https://github.com/Swinject/SwinjectStoryboard) for its details. - -```swift -extension SwinjectStoryboard { - class func setup() { - defaultContainer.register(Animal.self) { _ in Cat(name: "Mimi") } - defaultContainer.register(Person.self) { r in - PetOwner(pet: r.resolve(Animal.self)!) - } - defaultContainer.register(PersonViewController.self) { r in - let controller = PersonViewController() - controller.person = r.resolve(Person.self) - return controller - } - } -} -``` - -### Without SwinjectStoryboard - -Typically services are registered to a container in `AppDelegate` if you do not use `SwinjectStoryboard` to instantiate view controllers. If you register the services in `AppDelegate` especially before exiting the call of `application:didFinishLaunchingWithOptions:`, it is ensured that the services are registered before they are used. - -```swift -class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? - let container: Container = { - let container = Container() - container.register(Animal.self) { _ in Cat(name: "Mimi") } - container.register(Person.self) { r in - PetOwner(pet: r.resolve(Animal.self)!) - } - container.register(PersonViewController.self) { r in - let controller = PersonViewController() - controller.person = r.resolve(Person.self) - return controller - } - return container - }() - - func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { - - // Instantiate a window. - let window = UIWindow(frame: UIScreen.main.bounds) - window.makeKeyAndVisible() - self.window = window - - // Instantiate the root view controller with dependencies injected by the container. - window.rootViewController = container.resolve(PersonViewController.self) - - return true - } -} -``` - -Notice that the example uses a convenience initializer taking a closure to register services to the new instance of `Container`. - -## Play in Playground! - -The project contains `Sample-iOS.playground` to demonstrate the features of Swinject. Download or clone the project, run the playground, modify it, and play with it to learn Swinject. - -To run the playground in the project, first build the project, then select `Editor > Execute Playground` menu in Xcode. - -## Example Apps - -- [SwinjectSimpleExample](https://github.com/Swinject/SwinjectSimpleExample) demonstrates dependency injection and Swinject in a simple weather app that lists current weather information at some locations. -- [SwinjectMVVMExample](https://github.com/Swinject/SwinjectMVVMExample) demonstrates dependency injection with Swift and reactive programming with [ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa) in MVVM architecture. - -## Blog Posts - -The following blog posts introduce Swinject and the concept of dependency injection. - -- [Dependency Injection Framework for Swift - Introduction to Swinject](https://yoichitgy.github.io/post/dependency-injection-framework-for-swift-introduction-to-swinject/) -- [Dependency Injection Framework for Swift - Simple Weather App Example with Swinject Part 1/2](https://yoichitgy.github.io/post/dependency-injection-framework-for-swift-simple-weather-app-example-with-swinject-part-1/) -- [Dependency Injection Framework for Swift - Simple Weather App Example with Swinject Part 2/2](https://yoichitgy.github.io/post/dependency-injection-framework-for-swift-simple-weather-app-example-with-swinject-part-2/) - -## Contribution Guide - -A guide to [submit issues](https://github.com/Swinject/Swinject/issues), to ask general questions, or to [open pull requests](https://github.com/Swinject/Swinject/pulls) is [here](CONTRIBUTING.md). - -## Question? - -If you have a general question and hesitate to submit an issue at GitHub, you can feel free to ask the question at [Stack Overflow](http://stackoverflow.com). The author of Swinject monitors `swinject` tag there to answer as quickly as possible. - -## Credits - -The DI container features of Swinject are inspired by: - -- [Ninject](http://ninject.org) - [Enkari, Ltd](https://github.com/enkari) and [the Ninject project contributors](https://github.com/ninject/Ninject/graphs/contributors). -- [Autofac](http://autofac.org) - [Autofac Project](https://github.com/autofac/Autofac). - -and highly inspired by: - -- [Funq](http://funq.codeplex.com) - [Daniel Cazzulino](http://www.codeplex.com/site/users/view/dcazzulino) and [the project team](http://funq.codeplex.com/team/view). - -## License - -MIT license. See the [LICENSE file](LICENSE.txt) for details. diff --git a/Carthage/Checkouts/Swinject/Sample-iOS.playground/Contents.swift b/Carthage/Checkouts/Swinject/Sample-iOS.playground/Contents.swift deleted file mode 100644 index 8545757..0000000 --- a/Carthage/Checkouts/Swinject/Sample-iOS.playground/Contents.swift +++ /dev/null @@ -1,392 +0,0 @@ -/*: -# Swinject Sample for iOS -*/ - -import Swinject - -/*: -## Basic Use -*/ - -protocol Animal { - var name: String? { get set } - func sound() -> String -} - -class Cat: Animal { - var name: String? - - init(name: String?) { - self.name = name - } - - func sound() -> String { - return "Meow!" - } -} - -protocol Person { - func play() -> String -} - -class PetOwner: Person { - let pet: Animal - - init(pet: Animal) { - self.pet = pet - } - - func play() -> String { - let name = pet.name ?? "someone" - return "I'm playing with \(name). \(pet.sound())" - } -} - -// Create a container and register service and component pairs. -let container = Container() -container.register(Animal.self) { _ in Cat(name: "Mimi") } -container.register(Person.self) { r in PetOwner(pet: r.resolve(Animal.self)!) } - -// The person is resolved to a PetOwner with a Cat. -let person = container.resolve(Person.self)! -print(person.play()) - -/*: -## Named Registration -*/ - -class Dog: Animal { - var name: String? - - init(name: String?) { - self.name = name - } - - func sound() -> String { - return "Bow wow!" - } -} - -// Add more registrations to the container already containing the PetOwner with the Cat. -container.register(Animal.self, name: "dog") { _ in Dog(name: "Hachi") } -container.register(Person.self, name: "doggy") { r in PetOwner(pet: r.resolve(Animal.self, name: "dog")!) } - -// Resolve the service with the registration name to differentiate from the cat owner. -let doggyPerson = container.resolve(Person.self, name:"doggy")! -print(doggyPerson.play()) - -/*: -## Initialization Callback -*/ - -// A closure can be registered as an initCompleted callback. -var called = false -container.register(Animal.self, name: "cb") { _ in Cat(name: "Mew") } - .initCompleted { _, _ in called = true } -print(called) - -// The closure is executed when the instance is created. -let catWithCallback = container.resolve(Animal.self, name: "cb") -print(called) - -/*: -## Injection Patterns -*/ - -class InjectablePerson: Person { - var pet: Animal? { - didSet { - log = "Injected by property." - } - } - var log = "" - - init() { } - - init(pet: Animal) { - self.pet = pet - log = "Injected by initializer." - } - - func setPet(_ pet: Animal) { - self.pet = pet - log = "Injected by method." - } - - func play() -> String { - return log - } -} - -// Initializer injection -container.register(Person.self, name: "initializer") { r in - InjectablePerson(pet: r.resolve(Animal.self)!) -} - -let initializerInjection = container.resolve(Person.self, name:"initializer")! -print(initializerInjection.play()) - -// Property injection 1 (in the component factory) -container.register(Person.self, name: "property1") { r in - let person = InjectablePerson() - person.pet = r.resolve(Animal.self) - return person -} - -let propertyInjection1 = container.resolve(Person.self, name:"property1")! -print(propertyInjection1.play()) - -// Property injection 2 (in the initCompleted callback) -container.register(Person.self, name: "property2") { _ in InjectablePerson() } - .initCompleted { r, p in - let injectablePerson = p as! InjectablePerson - injectablePerson.pet = r.resolve(Animal.self) - } - -let propertyInjection2 = container.resolve(Person.self, name:"property2")! -print(propertyInjection2.play()) - -// Method injection 1 (in the component factory) -container.register(Person.self, name: "method1") { r in - let person = InjectablePerson() - person.setPet(r.resolve(Animal.self)!) - return person -} - -let methodInjection1 = container.resolve(Person.self, name:"method1")! -print(methodInjection1.play()) - -// Method injection 2 (in the initCompleted callback) -container.register(Person.self, name: "method2") { _ in InjectablePerson() } - .initCompleted { r, p in - let injectablePerson = p as! InjectablePerson - injectablePerson.setPet(r.resolve(Animal.self)!) - } - -let methodInjection2 = container.resolve(Person.self, name:"method2")! -print(methodInjection2.play()) - -/*: -## Circular Dependency -*/ - -internal protocol ParentProtocol: AnyObject { } -internal protocol ChildProtocol: AnyObject { } - -internal class Parent: ParentProtocol { - let child: ChildProtocol? - - init(child: ChildProtocol?) { - self.child = child - } -} - -internal class Child: ChildProtocol { - weak var parent: ParentProtocol? -} - -// Use initCompleted callback to set the circular dependency to avoid infinite recursion. -container.register(ParentProtocol.self) { r in Parent(child: r.resolve(ChildProtocol.self)!) } -container.register(ChildProtocol.self) { _ in Child() } - .initCompleted { r, c in - let child = c as! Child - child.parent = r.resolve(ParentProtocol.self) - } - -let parent = container.resolve(ParentProtocol.self) as! Parent -let child = parent.child as! Child - -// The parent and child are referencing each other. -print(parent === child.parent) - -/*: -## Injection with Arguments -*/ - -class Horse: Animal { - var name: String? - var running: Bool - - convenience init(name: String) { - self.init(name: name, running: false) - } - - init(name: String, running: Bool) { - self.name = name - self.running = running - } - - func sound() -> String { - return "Whinny!" - } -} - -// The factory closure can take arguments after the `Resolvable` parameter (in this example, unused as `_`). -// Note that the container already has an Animal without a registration name, -// but the factory with the arguments is recognized as a different registration to resolve. -container.register(Animal.self) { _, name in Horse(name: name) } -container.register(Animal.self) { _, name, running in Horse(name: name, running: running) } - -// The arguments to the factory are specified on the resolution. -// If you pass an argument, pass it to `argument` parameter. -// If you pass more arguments, pass them as a tuple to `arguments` parameter. -let horse1 = container.resolve(Animal.self, argument: "Spirit") as! Horse -print(horse1.name) -print(horse1.running) - -let horse2 = container.resolve(Animal.self, arguments: "Lucky", true) as! Horse -print(horse2.name) -print(horse2.running) - -/*: -## Self-binding -*/ - -protocol MyData { - var data: String { get } -} - -class MyImportantData: MyData { - let data = "Important data" -} - -class MyController { - var myData: MyData? - - func showData() -> String { - return myData.map { $0.data } ?? "" - } -} - -// Register MyController as both service and component s to inject dependency to its property. -container.register(MyController.self) { r in MyController() } - .initCompleted { r, c in c.myData = r.resolve(MyData.self)! } -container.register(MyData.self) { _ in MyImportantData() } - -let myController = container.resolve(MyController.self)! -print(myController.showData()) - -/*: -## Container Hierarchy -*/ - -let parentContainer = Container() -parentContainer.register(Animal.self, name: "cat") { _ in Cat(name: "Mimi") } - -let childContainer = Container(parent: parentContainer) -childContainer.register(Animal.self, name: "dog") { _ in Dog(name: "Hachi") } - -// The registration on the parent container is resolved on the child container. -let cat = childContainer.resolve(Animal.self, name: "cat") -print(cat != nil) - -// The registration on the child container is not resolved on the parent container. -let dog = parentContainer.resolve(Animal.self, name: "dog") -print(dog == nil) - -/*: -## Object Scopes -*/ - -class A { - let b: B - let c: C - - init(b: B, c: C) { - self.b = b - self.c = c - } -} - -class B { - let c: C - - init(c: C) { - self.c = c - } -} - -class C { } - -//: ### ObjectScope.transient - -// New instatnces are created every time. -let container1 = Container() -container1.register(C.self) { _ in C() } - .inObjectScope(.transient) - -let c1 = container1.resolve(C.self) -let c2 = container1.resolve(C.self) -print(c1 !== c2) - -// New instances are created in a object graph. -container1.register(A.self) { r in A(b: r.resolve(B.self)!, c: r.resolve(C.self)!) } -container1.register(B.self) { r in B(c: r.resolve(C.self)!) } - -let a1 = container1.resolve(A.self)! -print(a1.b.c !== a1.c) - -//: ### ObjectScope.graph - -// New instances are created like ObjectScope.transient. -let container2 = Container() -container2.register(C.self) { _ in C() } - .inObjectScope(.graph) // This is the default scope. - -let c3 = container2.resolve(C.self) -let c4 = container2.resolve(C.self) -print(c3 !== c4) - -// But unlike ObjectScope.transient, the same instance is resolved in the object graph. -container2.register(A.self) { r in A(b: r.resolve(B.self)!, c: r.resolve(C.self)!) } -container2.register(B.self) { r in B(c: r.resolve(C.self)!) } - -let a2 = container2.resolve(A.self)! -print(a2.b.c === a2.c) - -//: ### ObjectScope.container - -// The same instance is shared in the container -let container4 = Container() -container4.register(C.self) { _ in C() } - .inObjectScope(.container) - -let c8 = container4.resolve(C.self) -let c9 = container4.resolve(C.self) -print(c8 === c9) - -// The instance in the parent container is shared to its child container. -let childOfContainer4 = Container(parent: container4) -let c10 = childOfContainer4.resolve(C.self) -print(c8 === c10) - -/*: -## Injection of Value s -*/ - -struct Turtle: Animal { - var name: String? - - init(name: String?) { - self.name = name - } - - func sound() -> String { - return "Ninja!" - } -} - -// A value can be registered as a component. -// The object scope is ignored because a value always creates a new instance. -let container5 = Container() -container5.register(Animal.self) { _ in Turtle(name: "Reo") } - .inObjectScope(.container) - -var turtle1 = container5.resolve(Animal.self)! -var turtle2 = container5.resolve(Animal.self)! - -// Still the of turtle1 and turtle2 is Animal protocol, they work as value s. -// (Try editing 'var turtle1' to 'let turtle1', then you see a compilation error!) -turtle1.name = "Laph" -print(turtle1.name!) -print(turtle2.name!) diff --git a/Carthage/Checkouts/Swinject/Sample-iOS.playground/contents.xcplayground b/Carthage/Checkouts/Swinject/Sample-iOS.playground/contents.xcplayground deleted file mode 100644 index 3596865..0000000 --- a/Carthage/Checkouts/Swinject/Sample-iOS.playground/contents.xcplayground +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Carthage/Checkouts/Swinject/Sources/Assembler.swift b/Carthage/Checkouts/Swinject/Sources/Assembler.swift deleted file mode 100644 index 7e8d115..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Assembler.swift +++ /dev/null @@ -1,118 +0,0 @@ -// -// Assembler.swift -// Swinject -// -// Created by mike.owens on 12/9/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -/// The `Assembler` provides a means to build a container via `Assembly` instances. -public final class Assembler { - - /// the container that each assembly will build its `Service` definitions into - private let container: Container - - /// expose the container as a resolver so `Service` registration only happens within an assembly - public var resolver: Resolver { - return container - } - - /// Will create an empty `Assembler` - /// - /// - parameter container: the baseline container - /// - public init(container: Container? = Container()) { - self.container = container! - } - - /// Will create an empty `Assembler` - /// - /// - parameter parentAssembler: the baseline assembler - /// - public init(parentAssembler: Assembler?) { - container = Container(parent: parentAssembler?.container) - } - - /// Will create a new `Assembler` with the given `Assembly` instances to build a `Container` - /// - /// - parameter assemblies: the list of assemblies to build the container from - /// - parameter container: the baseline container - /// - @available(*, deprecated, message: "Use not throwing alternative: init(_:, container:)") - public convenience init(assemblies: [Assembly], container: Container? = Container()) throws { - if let container = container { - self.init(assemblies, container: container) - } else { - self.init(assemblies) - } - } - - /// Will create a new `Assembler` with the given `Assembly` instances to build a `Container` - /// - /// - parameter assemblies: the list of assemblies to build the container from - /// - parameter container: the baseline container - /// - public init(_ assemblies: [Assembly], container: Container = Container()) { - self.container = container - run(assemblies: assemblies) - } - - /// Will create a new `Assembler` with the given `Assembly` instances to build a `Container` - /// - /// - parameter assemblies: the list of assemblies to build the container from - /// - parameter parentAssembler: the baseline assembler - /// - @available(*, deprecated, message: "Use not throwing alternative: init(_:, parent:)") - public convenience init(assemblies: [Assembly], parentAssembler: Assembler?) throws { - self.init(_: assemblies, parent: parentAssembler) - } - - /// Will create a new `Assembler` with the given `Assembly` instances to build a `Container` - /// - /// - parameter assemblies: the list of assemblies to build the container from - /// - parameter parent: the baseline assembler - /// - public init(_ assemblies: [Assembly], parent: Assembler?) { - container = Container(parent: parent?.container) - run(assemblies: assemblies) - } - - /// Will apply the assembly to the container. This is useful if you want to lazy load an assembly into the - /// assembler's container. - /// - /// If this assembly type is load aware, the loaded hook will be invoked right after the container has assembled - /// since after each call to `addAssembly` the container is fully loaded in its current state. If you wish to - /// lazy load several assemblies that have interdependencies between each other use `appyAssemblies` - /// - /// - parameter assembly: the assembly to apply to the container - /// - public func apply(assembly: Assembly) { - run(assemblies: [assembly]) - } - - /// Will apply the assemblies to the container. This is useful if you want to lazy load several assemblies into the - /// assembler's container - /// - /// If this assembly type is load aware, the loaded hook will be invoked right after the container has assembled - /// since after each call to `addAssembly` the container is fully loaded in its current state. - /// - /// - parameter assemblies: the assemblies to apply to the container - /// - public func apply(assemblies: [Assembly]) { - run(assemblies: assemblies) - } - - // MARK: Private - - private func run(assemblies: [Assembly]) { - // build the container from each assembly - for assembly in assemblies { - assembly.assemble(container: self.container) - } - - // inform all of the assemblies that the container is loaded - for assembly in assemblies { - assembly.loaded(resolver: self.resolver) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Sources/Assembly.swift b/Carthage/Checkouts/Swinject/Sources/Assembly.swift deleted file mode 100644 index fcb9a42..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Assembly.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// Assembly.swift -// Swinject -// -// Created by mike.owens on 12/9/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -/// The `Assembly` provides a means to organize your `Service` registration in logic groups which allows -/// the user to swap out different implementations of `Services` by providing different `Assembly` instances -/// to the `Assembler` -public protocol Assembly { - - /// Provide hook for `Assembler` to load Services into the provided container - /// - /// - parameter container: the container provided by the `Assembler` - /// - func assemble(container: Container) - - /// Provides a hook to the `Assembly` that will be called once the `Assembler` has loaded all `Assembly` - /// instances into the container. - /// - /// - parameter resolver: the resolver that can resolve instances from the built container - /// - func loaded(resolver: Resolver) -} - -public extension Assembly { - func loaded(resolver: Resolver) { - // no-op - } -} diff --git a/Carthage/Checkouts/Swinject/Sources/Container.Arguments.erb b/Carthage/Checkouts/Swinject/Sources/Container.Arguments.erb deleted file mode 100644 index c7c2550..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Container.Arguments.erb +++ /dev/null @@ -1,93 +0,0 @@ -// -// Container.Arguments.swift -// Swinject -// -// Created by Yoichi Tagaya on 8/18/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -// -// NOTICE: -// -// Container.Arguments.swift is generated from Container.Arguments.erb by ERB. -// Do NOT modify Container.Arguments.swift directly. -// Instead, modify Container.Arguments.erb and run `script/gencode` at the project root directory to generate the code. -// - -<% arg_count = 9 %> - -import Foundation - -// MARK: - Registeration with Arguments -extension Container { -<% (1..arg_count).each do |i| %> -<% arg_types = (1..i).map { |n| "Arg#{n}" }.join(", ") %> -<% arg_description = i == 1 ? "#{i} argument" : "#{i} arguments" %> - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and <%= arg_description %> to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register>( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, <%= arg_types %>) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - -<% end %> -} - -// MARK: - Resolver with Arguments -extension Container { -<% (1..arg_count).each do |i| %> -<% arg_types = (1..i).map { |n| "Arg#{n}" }.join(", ") %> -<% arg_param_def = i == 1 ? "argument: Arg1" : "arguments arg1: Arg1, " + (2..i).map{ |n| "_ arg#{n}: Arg#{n}" }.join(", ") %> -<% arg_param_call = i == 1 ? "argument" : (1..i).map{ |n| "arg#{n}" }.join(", ") %> -<% arg_param_name = i == 1 ? "argument" : "arguments" %> -<% arg_param_type = i == 1 ? arg_types : "(" + arg_types + ")" %> -<% arg_param_description = i == 1 ? "#{i} argument" : "list of #{i} arguments" %> - /// Retrieves the instance with the specified service type and <%= arg_param_description %> to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - <%= arg_param_name %>: <%= arg_param_description.capitalize %> to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and <%= arg_param_description %> is found in the `Container`. - public func resolve>( - _ serviceType: Service.Type, - <%= arg_param_def %>) -> Service? - { - return resolve(serviceType, name: nil, <%= arg_param_name %>: <%= arg_param_call %>) - } - - /// Retrieves the instance with the specified service type, <%= arg_param_description %> to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - <%= arg_param_name %>: <%= arg_param_description.capitalize %> to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// <%= arg_param_description %> and name is found in the `Container`. - public func resolve>( - _ serviceType: Service.Type, - name: String?, - <%= arg_param_def %>) -> Service? - { - typealias FactoryType = (Resolver, <%= arg_types %>) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, <%= arg_param_call %>) } - } - -<% end %> -} diff --git a/Carthage/Checkouts/Swinject/Sources/Container.Arguments.swift b/Carthage/Checkouts/Swinject/Sources/Container.Arguments.swift deleted file mode 100644 index e0a74a5..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Container.Arguments.swift +++ /dev/null @@ -1,512 +0,0 @@ -// -// Container.Arguments.swift -// Swinject -// -// Created by Yoichi Tagaya on 8/18/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -// -// NOTICE: -// -// Container.Arguments.swift is generated from Container.Arguments.erb by ERB. -// Do NOT modify Container.Arguments.swift directly. -// Instead, modify Container.Arguments.erb and run `script/gencode` at the project root directory to generate the code. -// - - -import Foundation - -// MARK: - Registeration with Arguments -extension Container { - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and 1 argument to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, Arg1) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and 2 arguments to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, Arg1, Arg2) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and 3 arguments to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, Arg1, Arg2, Arg3) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and 4 arguments to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, Arg1, Arg2, Arg3, Arg4) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and 5 arguments to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and 6 arguments to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and 7 arguments to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and 8 arguments to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - - /// Adds a registration for the specified service with the factory closure to specify how the service is resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` instance and 9 arguments to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9) -> Service) -> ServiceEntry - { - return _register(serviceType, factory: factory, name: name) - } - -} - -// MARK: - Resolver with Arguments -extension Container { - /// Retrieves the instance with the specified service type and 1 argument to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - argument: 1 argument to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and 1 argument is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - argument: Arg1) -> Service? - { - return resolve(serviceType, name: nil, argument: argument) - } - - /// Retrieves the instance with the specified service type, 1 argument to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - argument: 1 argument to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// 1 argument and name is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - name: String?, - argument: Arg1) -> Service? - { - typealias FactoryType = (Resolver, Arg1) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, argument) } - } - - /// Retrieves the instance with the specified service type and list of 2 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 2 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 2 arguments is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2) -> Service? - { - return resolve(serviceType, name: nil, arguments: arg1, arg2) - } - - /// Retrieves the instance with the specified service type, list of 2 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 2 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 2 arguments and name is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2) -> Service? - { - typealias FactoryType = (Resolver, Arg1, Arg2) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, arg1, arg2) } - } - - /// Retrieves the instance with the specified service type and list of 3 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 3 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 3 arguments is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3) -> Service? - { - return resolve(serviceType, name: nil, arguments: arg1, arg2, arg3) - } - - /// Retrieves the instance with the specified service type, list of 3 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 3 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 3 arguments and name is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3) -> Service? - { - typealias FactoryType = (Resolver, Arg1, Arg2, Arg3) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, arg1, arg2, arg3) } - } - - /// Retrieves the instance with the specified service type and list of 4 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 4 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 4 arguments is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4) -> Service? - { - return resolve(serviceType, name: nil, arguments: arg1, arg2, arg3, arg4) - } - - /// Retrieves the instance with the specified service type, list of 4 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 4 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 4 arguments and name is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4) -> Service? - { - typealias FactoryType = (Resolver, Arg1, Arg2, Arg3, Arg4) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, arg1, arg2, arg3, arg4) } - } - - /// Retrieves the instance with the specified service type and list of 5 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 5 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 5 arguments is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5) -> Service? - { - return resolve(serviceType, name: nil, arguments: arg1, arg2, arg3, arg4, arg5) - } - - /// Retrieves the instance with the specified service type, list of 5 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 5 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 5 arguments and name is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5) -> Service? - { - typealias FactoryType = (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, arg1, arg2, arg3, arg4, arg5) } - } - - /// Retrieves the instance with the specified service type and list of 6 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 6 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 6 arguments is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6) -> Service? - { - return resolve(serviceType, name: nil, arguments: arg1, arg2, arg3, arg4, arg5, arg6) - } - - /// Retrieves the instance with the specified service type, list of 6 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 6 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 6 arguments and name is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6) -> Service? - { - typealias FactoryType = (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, arg1, arg2, arg3, arg4, arg5, arg6) } - } - - /// Retrieves the instance with the specified service type and list of 7 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 7 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 7 arguments is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7) -> Service? - { - return resolve(serviceType, name: nil, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7) - } - - /// Retrieves the instance with the specified service type, list of 7 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 7 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 7 arguments and name is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7) -> Service? - { - typealias FactoryType = (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, arg1, arg2, arg3, arg4, arg5, arg6, arg7) } - } - - /// Retrieves the instance with the specified service type and list of 8 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 8 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 8 arguments is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8) -> Service? - { - return resolve(serviceType, name: nil, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) - } - - /// Retrieves the instance with the specified service type, list of 8 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 8 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 8 arguments and name is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8) -> Service? - { - typealias FactoryType = (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) } - } - - /// Retrieves the instance with the specified service type and list of 9 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 9 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 9 arguments is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8, _ arg9: Arg9) -> Service? - { - return resolve(serviceType, name: nil, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) - } - - /// Retrieves the instance with the specified service type, list of 9 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 9 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 9 arguments and name is found in the `Container`. - public func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8, _ arg9: Arg9) -> Service? - { - typealias FactoryType = (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) } - } - -} diff --git a/Carthage/Checkouts/Swinject/Sources/Container.Logging.swift b/Carthage/Checkouts/Swinject/Sources/Container.Logging.swift deleted file mode 100644 index 81334d4..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Container.Logging.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// Container.Logging.swift -// Swinject -// -// Created by Jakub Vaňo on 30/09/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// - -public typealias LoggingFunctionType = (String) -> Void - -public extension Container { - /// Function to be used for logging debugging data. - /// Default implementation writes to standard output. - public static var loggingFunction: LoggingFunctionType? { - get { return _loggingFunction } - set { _loggingFunction = newValue } - } - - internal static func log(_ message: String) { - _loggingFunction?(message) - } -} - -private var _loggingFunction: LoggingFunctionType? = { print($0) } diff --git a/Carthage/Checkouts/Swinject/Sources/Container.swift b/Carthage/Checkouts/Swinject/Sources/Container.swift deleted file mode 100644 index 2030425..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Container.swift +++ /dev/null @@ -1,268 +0,0 @@ -// -// Container.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/23/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -import Foundation - -/// The `Container` class represents a dependency injection container, which stores registrations of services -/// and retrieves registered services with dependencies injected. -/// -/// **Example to register:** -/// -/// let container = Container() -/// container.register(A.self) { _ in B() } -/// container.register(X.self) { r in Y(a: r.resolve(A.self)!) } -/// -/// **Example to retrieve:** -/// -/// let x = container.resolve(X.self)! -/// -/// where `A` and `X` are protocols, `B` is a type conforming `A`, and `Y` is a type conforming `X` -/// and depending on `A`. -public final class Container { - fileprivate var services = [ServiceKey: ServiceEntryProtocol]() - fileprivate let parent: Container? // Used by HierarchyObjectScope - fileprivate var resolutionDepth = 0 - fileprivate let debugHelper: DebugHelper - internal let lock: SpinLock // Used by SynchronizedResolver. - - internal init(parent: Container? = nil, debugHelper: DebugHelper) { - self.parent = parent - self.debugHelper = debugHelper - self.lock = parent.map { $0.lock } ?? SpinLock() - } - - /// Instantiates a `Container` with its parent `Container`. The parent is optional. - /// - /// - Parameter parent: The optional parent `Container`. - public convenience init(parent: Container? = nil) { - self.init(parent: parent, debugHelper: LoggingDebugHelper()) - } - - /// Instantiates a `Container` with its parent `Container` and a closure registering services. - /// The parent is optional. - /// - /// - Parameters: - /// - parent: The optional parent `Container`. - /// - registeringClosure: The closure registering services to the new container instance. - /// - Remark: Compile time may be long if you pass a long closure to this initializer. - /// Use `init()` or `init(parent:)` instead. - public convenience init(parent: Container? = nil, registeringClosure: (Container) -> Void) { - self.init(parent: parent) - registeringClosure(self) - } - - /// Removes all registrations in the container. - public func removeAll() { - services.removeAll() - } - - /// Discards instances for services registered in the given `ObjectsScopeType`. - /// - /// **Example usage:** - /// container.resetObjectScope(ObjectScope.container) - /// - /// - Parameters: - /// - objectScope: All instances registered in given `ObjectsScopeType` will be discarded. - public func resetObjectScope(_ objectScope: ObjectScopeProtocol) { - services.values - .filter { $0.objectScope === objectScope } - .forEach { $0.storage.instance = nil } - - parent?.resetObjectScope(objectScope) - } - - /// Discards instances for services registered in the given `ObjectsScope`. It performs the same operation - /// as `resetObjectScope(_:ObjectScopeProtocol)`, but provides more convenient usage syntax. - /// - /// **Example usage:** - /// container.resetObjectScope(.container) - /// - /// - Parameters: - /// - objectScope: All instances registered in given `ObjectsScope` will be discarded. - public func resetObjectScope(_ objectScope: ObjectScope) { - resetObjectScope(objectScope as ObjectScopeProtocol) - } - - /// Adds a registration for the specified service with the factory closure to specify how the service is - /// resolved with dependencies. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - name: A registration name, which is used to differentiate from other registrations - /// that have the same service and factory types. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - public func register( - _ serviceType: Service.Type, - name: String? = nil, - factory: @escaping (Resolver) -> Service - ) -> ServiceEntry { - return _register(serviceType, factory: factory, name: name) - } - - /// This method is designed for the use to extend Swinject functionality. - /// Do NOT use this method unless you intend to write an extension or plugin to Swinject framework. - /// - /// - Parameters: - /// - serviceType: The service type to register. - /// - factory: The closure to specify how the service type is resolved with the dependencies of the type. - /// It is invoked when the `Container` needs to instantiate the instance. - /// It takes a `Resolver` to inject dependencies to the instance, - /// and returns the instance of the component type for the service. - /// - name: A registration name. - /// - option: A service key option for an extension/plugin. - /// - /// - Returns: A registered `ServiceEntry` to configure more settings with method chaining. - @discardableResult - // swiftlint:disable:next identifier_name - public func _register( - _ serviceType: Service.Type, - factory: Factory, - name: String? = nil, - option: ServiceKeyOption? = nil - ) -> ServiceEntry { - let key = ServiceKey(factoryType: type(of: factory), name: name, option: option) - let entry = ServiceEntry(serviceType: serviceType, factory: factory) - services[key] = entry - return entry - } - - /// Returns a synchronized view of the container for thread safety. - /// The returned container is `Resolver` type. Call this method after you finish all service registrations - /// to the original container. - /// - /// - Returns: A synchronized container as `Resolver`. - public func synchronize() -> Resolver { - return SynchronizedResolver(container: self) - } -} - -// MARK: - _Resolver -extension Container: _Resolver { - // swiftlint:disable:next identifier_name - public func _resolve( - name: String?, - option: ServiceKeyOption? = nil, - invoker: (Factory) -> Service - ) -> Service? { - incrementResolutionDepth() - defer { decrementResolutionDepth() } - - var resolvedInstance: Service? - let key = ServiceKey(factoryType: Factory.self, name: name, option: option) - - if let entry = getEntry(key) as ServiceEntry? { - resolvedInstance = resolve(entry: entry, key: key, invoker: invoker) - } - - if resolvedInstance == nil { - debugHelper.resolutionFailed( - serviceType: Service.self, - key: key, - availableRegistrations: getRegistrations() - ) - } - - return resolvedInstance - } - - private func getRegistrations() -> [ServiceKey: ServiceEntryProtocol] { - var registrations = parent?.getRegistrations() ?? [:] - services.forEach { key, value in registrations[key] = value } - return registrations - } - - private var maxResolutionDepth: Int { return 200 } - - private func incrementResolutionDepth() { - guard resolutionDepth < maxResolutionDepth else { - fatalError("Infinite recursive call for circular dependency has been detected. " + - "To avoid the infinite call, 'initCompleted' handler should be used to inject circular dependency.") - } - resolutionDepth += 1 - } - - private func decrementResolutionDepth() { - assert(resolutionDepth > 0, "The depth cannot be negative.") - - resolutionDepth -= 1 - if resolutionDepth == 0 { - resetObjectScope(.graph) - } - } -} - -// MARK: - Resolver -extension Container: Resolver { - /// Retrieves the instance with the specified service type. - /// - /// - Parameter serviceType: The service type to resolve. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// is found in the `Container`. - public func resolve(_ serviceType: Service.Type) -> Service? { - return resolve(serviceType, name: nil) - } - - /// Retrieves the instance with the specified service type and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type and name - /// is found in the `Container`. - public func resolve(_ serviceType: Service.Type, name: String?) -> Service? { - typealias FactoryType = (Resolver) -> Service - return _resolve(name: name) { (factory: FactoryType) in factory(self) } - } - - fileprivate func getEntry(_ key: ServiceKey) -> ServiceEntry? { - if let entry = services[key] as? ServiceEntry { - return entry - } else { - return parent?.getEntry(key) - } - } - - fileprivate func resolve( - entry: ServiceEntry, - key: ServiceKey, - invoker: (Factory) -> Service - ) -> Service { - if let persistedInstance = entry.storage.instance as? Service { - return persistedInstance - } - - let resolvedInstance = invoker(entry.factory as! Factory) - if let persistedInstance = entry.storage.instance as? Service { - // An instance for the key might be added by the factory invocation. - return persistedInstance - } - entry.storage.instance = resolvedInstance as Any - - if let completed = entry.initCompleted as? (Resolver, Service) -> Void { - completed(self, resolvedInstance) - } - return resolvedInstance - } -} - -// MARK: CustomStringConvertible -extension Container: CustomStringConvertible { - public var description: String { - return "[" - + services.map { "\n { \($1.describeWithKey($0)) }" }.sorted().joined(separator: ",") - + "\n]" - } -} diff --git a/Carthage/Checkouts/Swinject/Sources/DebugHelper.swift b/Carthage/Checkouts/Swinject/Sources/DebugHelper.swift deleted file mode 100644 index 3b1419c..0000000 --- a/Carthage/Checkouts/Swinject/Sources/DebugHelper.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// DebugHelper.swift -// Swinject -// -// Created by Jakub Vaňo on 26/09/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// - -internal protocol DebugHelper { - func resolutionFailed( - serviceType: Service.Type, - key: ServiceKey, - availableRegistrations: [ServiceKey: ServiceEntryProtocol] - ) -} - -internal final class LoggingDebugHelper: DebugHelper { - - func resolutionFailed( - serviceType: Service.Type, - key: ServiceKey, - availableRegistrations: [ServiceKey: ServiceEntryProtocol] - ) { - var output = [ - "Swinject: Resolution failed. Expected registration:", - "\t{ \(description(serviceType: serviceType, serviceKey: key)) }", - "Available registrations:" - ] - output += availableRegistrations - .filter { $0.1 is ServiceEntry } - .map { "\t{ " + $0.1.describeWithKey($0.0) + " }" } - - Container.log(output.joined(separator: "\n")) - } -} - -internal func description( - serviceType: Service.Type, - serviceKey: ServiceKey, - objectScope: ObjectScopeProtocol? = nil, - initCompleted: FunctionType? = nil -) -> String { - // The protocol order in "protocol<>" is non-deterministic. - let nameDescription = serviceKey.name.map { ", Name: \"\($0)\"" } ?? "" - let optionDescription = serviceKey.option.map { ", \($0)" } ?? "" - let initCompletedDescription = initCompleted.map { _ in ", InitCompleted: Specified" } ?? "" - let objectScopeDescription = objectScope.map { ", ObjectScope: \($0)" } ?? "" - return "Service: \(serviceType)" - + nameDescription - + optionDescription - + ", Factory: \(serviceKey.factoryType)" - + objectScopeDescription - + initCompletedDescription -} diff --git a/Carthage/Checkouts/Swinject/Sources/FunctionType.swift b/Carthage/Checkouts/Swinject/Sources/FunctionType.swift deleted file mode 100644 index d9af935..0000000 --- a/Carthage/Checkouts/Swinject/Sources/FunctionType.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// FunctionType.swift -// Swinject -// -// Created by Yoichi Tagaya on 11/28/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -// Type alias to expect a closure. -internal typealias FunctionType = Any diff --git a/Carthage/Checkouts/Swinject/Sources/Info.plist b/Carthage/Checkouts/Swinject/Sources/Info.plist deleted file mode 100644 index 449c7b6..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 2.1.1 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/Swinject/Sources/InstanceStorage.swift b/Carthage/Checkouts/Swinject/Sources/InstanceStorage.swift deleted file mode 100644 index 88c1721..0000000 --- a/Carthage/Checkouts/Swinject/Sources/InstanceStorage.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// InstanceStorage.swift -// Swinject -// -// Created by Jakub Vaňo on 11/11/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// - -/// Storage provided by `ObjectScope`. It is used by `Container` to persist resolved instances. -public protocol InstanceStorage: AnyObject { - var instance: Any? { get set } -} - -/// Persists stored instance until it is explicitly discarded. -public final class PermanentStorage: InstanceStorage { - public var instance: Any? - - public init() {} -} - -/// Does not persist stored instance. -public final class TransientStorage: InstanceStorage { - public var instance: Any? { - get { return nil } - set {} - } - - public init() {} -} - -/// Does not persist value types. -/// Persists reference types as long as there are strong references to given instance. -public final class WeakStorage: InstanceStorage { - private weak var object: AnyObject? - - #if os(Linux) - public var instance: Any? { - get { return object } - set { object = newValue.flatMap { $0 as? AnyObject } } - } - #else - public var instance: Any? { - get { return object } - set { object = newValue as AnyObject? } - } - #endif - - public init () {} -} diff --git a/Carthage/Checkouts/Swinject/Sources/ObjectScope.Standard.swift b/Carthage/Checkouts/Swinject/Sources/ObjectScope.Standard.swift deleted file mode 100644 index 9ad9e92..0000000 --- a/Carthage/Checkouts/Swinject/Sources/ObjectScope.Standard.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// ObjectScope.Standard.swift -// Swinject -// -// Created by Jakub Vaňo on 11/11/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// - -extension ObjectScope { - /// A new instance is always created by the `Container` when a type is resolved. - /// The instance is not shared. - public static let transient = ObjectScope(storageFactory: TransientStorage.init, description: "transient") - - /// Instances are shared only when an object graph is being created, - /// otherwise a new instance is created by the `Container`. This is the default scope. - public static let graph = ObjectScope(storageFactory: PermanentStorage.init, description: "graph") - - /// An instance provided by the `Container` is shared within the `Container` and its child `Containers`. - public static let container = ObjectScope(storageFactory: PermanentStorage.init, description: "container") - - /// An instance provided by the `Container` is shared within the `Container` and its child `Container`s - /// as long as there are strong references to given instance. Otherwise new instance is created - /// when resolving the type. - public static let weak = ObjectScope(storageFactory: WeakStorage.init, description: "weak") -} diff --git a/Carthage/Checkouts/Swinject/Sources/ObjectScope.swift b/Carthage/Checkouts/Swinject/Sources/ObjectScope.swift deleted file mode 100644 index 0bfa376..0000000 --- a/Carthage/Checkouts/Swinject/Sources/ObjectScope.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// ObjectScope.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/24/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -/// A configuration how an instance provided by a `Container` is shared in the system. -/// The configuration is ignored if it is applied to a value type. -public protocol ObjectScopeProtocol: AnyObject { - - /// Used to create `InstanceStorage` to persist an instance for single service. - /// Will be invoked once for each service registered in given scope. - func makeStorage() -> InstanceStorage -} - -/// Basic implementation of `ObjectScopeProtocol`. -public class ObjectScope: ObjectScopeProtocol, CustomStringConvertible { - - public private(set) var description: String - private var storageFactory: () -> InstanceStorage - - /// Instantiates an `ObjectScope` with storage factory and description. - /// - Parameters: - /// - storageFactory: Closure for creating an `InstanceStorage` - /// - description: Description of object scope for `CustomStringConvertible` implementation - public init( - storageFactory: @escaping () -> InstanceStorage, - description: String = "" - ) { - self.storageFactory = storageFactory - self.description = description - } - - /// Will invoke and return the result of `storageFactory` closure provided during initialisation. - public func makeStorage() -> InstanceStorage { - return storageFactory() - } -} diff --git a/Carthage/Checkouts/Swinject/Sources/Resolver.erb b/Carthage/Checkouts/Swinject/Sources/Resolver.erb deleted file mode 100644 index 0eeb036..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Resolver.erb +++ /dev/null @@ -1,69 +0,0 @@ -// -// Resolver.swift -// Swinject -// -// Created by Yoichi Tagaya on 8/18/15. -// Copyright (c) 2015 Swinject Contributors. All rights reserved. -// - -// -// NOTICE: -// -// Resolver.swift is generated from Resolver.erb by ERB. -// Do NOT modify Container.Arguments.swift directly. -// Instead, modify Resolver.erb and run `script/gencode` at the project root directory to generate the code. -// - -<% arg_count = 9 %> - -public protocol Resolver { - /// Retrieves the instance with the specified service type. - /// - /// - Parameter serviceType: The service type to resolve. - /// - /// - Returns: The resolved service type instance, or nil if no service is found. - func resolve(_ serviceType: Service.Type) -> Service? - - /// Retrieves the instance with the specified service type and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - /// - Returns: The resolved service type instance, or nil if no service with the name is found. - func resolve(_ serviceType: Service.Type, name: String?) -> Service? - -<% (1..arg_count).each do |i| %> -<% arg_types = (1..i).map { |n| "Arg#{n}" }.join(", ") %> -<% arg_param = i == 1 ? "argument: Arg1" : "arguments arg1: Arg1, " + (2..i).map{ |n| "_ arg#{n}: Arg#{n}" }.join(", ") %> -<% arg_param_name = i == 1 ? "argument" : "arguments" %> -<% arg_param_description = i == 1 ? "#{i} argument" : "list of #{i} arguments" %> - /// Retrieves the instance with the specified service type and <%= arg_param_description %> to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - <%= arg_param_name %>: <%= arg_param_description.capitalize %> to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and <%= arg_param_description %> is found. - func resolve>( - _ serviceType: Service.Type, - <%= arg_param %>) -> Service? - - /// Retrieves the instance with the specified service type, <%= arg_param_description %> to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - <%= arg_param_name %>: <%= arg_param_description.capitalize %> to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// <%= arg_param_description %> and name is found. - func resolve>( - _ serviceType: Service.Type, - name: String?, - <%= arg_param %>) -> Service? - -<% end %> - -} diff --git a/Carthage/Checkouts/Swinject/Sources/Resolver.swift b/Carthage/Checkouts/Swinject/Sources/Resolver.swift deleted file mode 100644 index cf56060..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Resolver.swift +++ /dev/null @@ -1,270 +0,0 @@ -// -// Resolver.swift -// Swinject -// -// Created by Yoichi Tagaya on 8/18/15. -// Copyright (c) 2015 Swinject Contributors. All rights reserved. -// - -// -// NOTICE: -// -// Resolver.swift is generated from Resolver.erb by ERB. -// Do NOT modify Container.Arguments.swift directly. -// Instead, modify Resolver.erb and run `script/gencode` at the project root directory to generate the code. -// - - -public protocol Resolver { - /// Retrieves the instance with the specified service type. - /// - /// - Parameter serviceType: The service type to resolve. - /// - /// - Returns: The resolved service type instance, or nil if no service is found. - func resolve(_ serviceType: Service.Type) -> Service? - - /// Retrieves the instance with the specified service type and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - /// - Returns: The resolved service type instance, or nil if no service with the name is found. - func resolve(_ serviceType: Service.Type, name: String?) -> Service? - - /// Retrieves the instance with the specified service type and 1 argument to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - argument: 1 argument to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and 1 argument is found. - func resolve( - _ serviceType: Service.Type, - argument: Arg1) -> Service? - - /// Retrieves the instance with the specified service type, 1 argument to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - argument: 1 argument to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// 1 argument and name is found. - func resolve( - _ serviceType: Service.Type, - name: String?, - argument: Arg1) -> Service? - - /// Retrieves the instance with the specified service type and list of 2 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 2 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 2 arguments is found. - func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2) -> Service? - - /// Retrieves the instance with the specified service type, list of 2 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 2 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 2 arguments and name is found. - func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2) -> Service? - - /// Retrieves the instance with the specified service type and list of 3 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 3 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 3 arguments is found. - func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3) -> Service? - - /// Retrieves the instance with the specified service type, list of 3 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 3 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 3 arguments and name is found. - func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3) -> Service? - - /// Retrieves the instance with the specified service type and list of 4 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 4 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 4 arguments is found. - func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4) -> Service? - - /// Retrieves the instance with the specified service type, list of 4 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 4 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 4 arguments and name is found. - func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4) -> Service? - - /// Retrieves the instance with the specified service type and list of 5 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 5 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 5 arguments is found. - func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5) -> Service? - - /// Retrieves the instance with the specified service type, list of 5 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 5 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 5 arguments and name is found. - func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5) -> Service? - - /// Retrieves the instance with the specified service type and list of 6 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 6 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 6 arguments is found. - func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6) -> Service? - - /// Retrieves the instance with the specified service type, list of 6 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 6 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 6 arguments and name is found. - func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6) -> Service? - - /// Retrieves the instance with the specified service type and list of 7 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 7 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 7 arguments is found. - func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7) -> Service? - - /// Retrieves the instance with the specified service type, list of 7 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 7 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 7 arguments and name is found. - func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7) -> Service? - - /// Retrieves the instance with the specified service type and list of 8 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 8 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 8 arguments is found. - func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8) -> Service? - - /// Retrieves the instance with the specified service type, list of 8 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 8 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 8 arguments and name is found. - func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8) -> Service? - - /// Retrieves the instance with the specified service type and list of 9 arguments to the factory closure. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - arguments: List of 9 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type - /// and list of 9 arguments is found. - func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8, _ arg9: Arg9) -> Service? - - /// Retrieves the instance with the specified service type, list of 9 arguments to the factory closure and registration name. - /// - /// - Parameters: - /// - serviceType: The service type to resolve. - /// - name: The registration name. - /// - arguments: List of 9 arguments to pass to the factory closure. - /// - /// - Returns: The resolved service type instance, or nil if no registration for the service type, - /// list of 9 arguments and name is found. - func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8, _ arg9: Arg9) -> Service? - - -} diff --git a/Carthage/Checkouts/Swinject/Sources/ServiceEntry.swift b/Carthage/Checkouts/Swinject/Sources/ServiceEntry.swift deleted file mode 100644 index de581d0..0000000 --- a/Carthage/Checkouts/Swinject/Sources/ServiceEntry.swift +++ /dev/null @@ -1,88 +0,0 @@ -// -// ServiceEntry.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/24/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -import Foundation - -// A generic-type-free protocol to be the type of values in a strongly-typed collection. -internal protocol ServiceEntryProtocol: Any { - func describeWithKey(_ serviceKey: ServiceKey) -> String - var objectScope: ObjectScopeProtocol { get } - var storage: InstanceStorage { get } -} - -/// The `ServiceEntry` class represents an entry of a registered service type. -/// As a returned instance from a `register` method of a `Container`, some configurations can be added. -public final class ServiceEntry { - fileprivate let serviceType: Service.Type - internal let factory: FunctionType - - internal var objectScope: ObjectScopeProtocol = ObjectScope.graph - internal lazy var storage: InstanceStorage = { [unowned self] in - self.objectScope.makeStorage() - }() - internal var initCompleted: FunctionType? - - internal init(serviceType: Service.Type, factory: FunctionType) { - self.serviceType = serviceType - self.factory = factory - } - - internal func copyExceptInstance() -> ServiceEntry { - let copy = ServiceEntry(serviceType: serviceType, factory: factory) - copy.objectScope = objectScope - copy.initCompleted = initCompleted - return copy - } - - /// Specifies the object scope to resolve the service. - /// - /// - Parameter scope: The `ObjectScopeProtocol` value. - /// - /// - Returns: `self` to add another configuration fluently. - @discardableResult - public func inObjectScope(_ objectScope: ObjectScopeProtocol) -> Self { - self.objectScope = objectScope - return self - } - - /// Specifies the object scope to resolve the service. - /// Performs the same functionality as `inObjectScope(_: ObjectScopeProtocol) -> Self`, - /// but provides more convenient usage syntax. - /// - /// - Parameter scope: The `ObjectScope` value. - /// - /// - Returns: `self` to add another configuration fluently. - @discardableResult - public func inObjectScope(_ objectScope: ObjectScope) -> Self { - return inObjectScope(objectScope as ObjectScopeProtocol) - } - - /// Adds the callback to setup the instance after its `init` completes. - /// *Property or method injections* can be performed in the callback. - /// To resolve *circular dependencies*, `initCompleted` must be used. - /// - /// - Parameter completed: The closure to be called after the instantiation of the registered service. - /// - /// - Returns: `self` to add another configuration fluently. - @discardableResult - public func initCompleted(_ completed: @escaping (Resolver, Service) -> Void) -> Self { - initCompleted = completed - return self - } -} - -extension ServiceEntry: ServiceEntryProtocol { - internal func describeWithKey(_ serviceKey: ServiceKey) -> String { - return description( - serviceType: serviceType, - serviceKey: serviceKey, - objectScope: objectScope, - initCompleted: initCompleted - ) - } -} diff --git a/Carthage/Checkouts/Swinject/Sources/ServiceKey.swift b/Carthage/Checkouts/Swinject/Sources/ServiceKey.swift deleted file mode 100644 index 3197e52..0000000 --- a/Carthage/Checkouts/Swinject/Sources/ServiceKey.swift +++ /dev/null @@ -1,50 +0,0 @@ -// -// ServiceKey.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/23/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -import Foundation - -// MARK: ServiceKeyOption -public protocol ServiceKeyOption: CustomStringConvertible { - func isEqualTo(_ another: ServiceKeyOption) -> Bool - var hashValue: Int { get } -} - -// MARK: - ServiceKey -internal struct ServiceKey { - internal let factoryType: FunctionType.Type - internal let name: String? - internal let option: ServiceKeyOption? // Used for SwinjectStoryboard or other extensions. - - internal init(factoryType: FunctionType.Type, name: String? = nil, option: ServiceKeyOption? = nil) { - self.factoryType = factoryType - self.name = name - self.option = option - } -} - -// MARK: Hashable -extension ServiceKey: Hashable { - var hashValue: Int { - return String(describing: factoryType).hashValue ^ (name?.hashValue ?? 0) ^ (option?.hashValue ?? 0) - } -} - -// MARK: Equatable -func == (lhs: ServiceKey, rhs: ServiceKey) -> Bool { - return lhs.factoryType == rhs.factoryType - && lhs.name == rhs.name - && equalOptions(opt1: lhs.option, opt2: rhs.option) -} - -private func equalOptions(opt1: ServiceKeyOption?, opt2: ServiceKeyOption?) -> Bool { - switch (opt1, opt2) { - case let (opt1?, opt2?): return opt1.isEqualTo(opt2) - case (nil, nil): return true - default: return false - } -} diff --git a/Carthage/Checkouts/Swinject/Sources/SpinLock.swift b/Carthage/Checkouts/Swinject/Sources/SpinLock.swift deleted file mode 100644 index b99138c..0000000 --- a/Carthage/Checkouts/Swinject/Sources/SpinLock.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// SpinLock.swift -// Swinject -// -// Created by Yoichi Tagaya on 11/26/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -import Foundation - -internal final class SpinLock { - private let lock = NSLock() - - func sync(action: () -> T) -> T { - lock.lock() - defer { lock.unlock() } - return action() - } -} diff --git a/Carthage/Checkouts/Swinject/Sources/Swinject.h b/Carthage/Checkouts/Swinject/Sources/Swinject.h deleted file mode 100644 index edc80b4..0000000 --- a/Carthage/Checkouts/Swinject/Sources/Swinject.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// Swinject.h -// Swinject -// -// Created by Yoichi Tagaya on 7/22/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -#import - -//! Project version number for Swinject. -FOUNDATION_EXPORT double SwinjectVersionNumber; - -//! Project version string for Swinject. -FOUNDATION_EXPORT const unsigned char SwinjectVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import diff --git a/Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.Arguments.erb b/Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.Arguments.erb deleted file mode 100644 index 840aa80..0000000 --- a/Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.Arguments.erb +++ /dev/null @@ -1,46 +0,0 @@ -// -// SynchronizedResolver.Arguments.swift -// Swinject -// -// Created by Yoichi Tagaya on 11/23/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -// -// NOTICE: -// -// SynchronizedResolver.Arguments.swift is generated from SynchronizedResolver.Arguments.erb by ERB. -// Do NOT modify SynchronizedResolver.Arguments.swift directly. -// Instead, modify SynchronizedResolver.Arguments.erb and run `script/gencode` at the project root directory to generate the code. -// - -<% arg_count = 9 %> - -// MARK: - Resolver with Arguments -extension SynchronizedResolver { -<% (1..arg_count).each do |i| %> -<% arg_types = (1..i).map { |n| "Arg#{n}" }.join(", ") %> -<% arg_param_name = i == 1 ? "argument" : "arguments" %> -<% arg_param_def = i == 1 ? "argument: Arg1" : "arguments arg1: Arg1, " + (2..i).map{ |n| "_ arg#{n}: Arg#{n}" }.join(", ") %> -<% arg_param_call = i == 1 ? "argument" : (1..i).map{ |n| "arg#{n}" }.join(", ") %> - internal func resolve>( - _ serviceType: Service.Type, - <%= arg_param_def %>) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, <%= arg_param_name %>: <%= arg_param_call %>) - } - } - - internal func resolve>( - _ serviceType: Service.Type, - name: String?, - <%= arg_param_def %>) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, <%= arg_param_name %>: <%= arg_param_call %>) - } - } - -<% end %> -} diff --git a/Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.Arguments.swift b/Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.Arguments.swift deleted file mode 100644 index 0f43575..0000000 --- a/Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.Arguments.swift +++ /dev/null @@ -1,191 +0,0 @@ -// -// SynchronizedResolver.Arguments.swift -// Swinject -// -// Created by Yoichi Tagaya on 11/23/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -// -// NOTICE: -// -// SynchronizedResolver.Arguments.swift is generated from SynchronizedResolver.Arguments.erb by ERB. -// Do NOT modify SynchronizedResolver.Arguments.swift directly. -// Instead, modify SynchronizedResolver.Arguments.erb and run `script/gencode` at the project root directory to generate the code. -// - - -// MARK: - Resolver with Arguments -extension SynchronizedResolver { - internal func resolve( - _ serviceType: Service.Type, - argument: Arg1) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, argument: argument) - } - } - - internal func resolve( - _ serviceType: Service.Type, - name: String?, - argument: Arg1) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, argument: argument) - } - } - - internal func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, arguments: arg1, arg2) - } - } - - internal func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, arguments: arg1, arg2) - } - } - - internal func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, arguments: arg1, arg2, arg3) - } - } - - internal func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, arguments: arg1, arg2, arg3) - } - } - - internal func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, arguments: arg1, arg2, arg3, arg4) - } - } - - internal func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4) - } - } - - internal func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5) - } - } - - internal func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5) - } - } - - internal func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5, arg6) - } - } - - internal func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5, arg6) - } - } - - internal func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7) - } - } - - internal func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7) - } - } - - internal func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) - } - } - - internal func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) - } - } - - internal func resolve( - _ serviceType: Service.Type, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8, _ arg9: Arg9) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) - } - } - - internal func resolve( - _ serviceType: Service.Type, - name: String?, - arguments arg1: Arg1, _ arg2: Arg2, _ arg3: Arg3, _ arg4: Arg4, _ arg5: Arg5, _ arg6: Arg6, _ arg7: Arg7, _ arg8: Arg8, _ arg9: Arg9) -> Service? - { - return container.lock.sync { - return self.container.resolve(serviceType, name: name, arguments: arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) - } - } - -} diff --git a/Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.swift b/Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.swift deleted file mode 100644 index a494c4e..0000000 --- a/Carthage/Checkouts/Swinject/Sources/SynchronizedResolver.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// SynchronizedResolver.swift -// Swinject -// -// Created by Yoichi Tagaya on 11/23/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -internal final class SynchronizedResolver { - internal let container: Container - - internal init(container: Container) { - self.container = container - } -} - -extension SynchronizedResolver: _Resolver { - // swiftlint:disable:next identifier_name - internal func _resolve( - name: String?, - option: ServiceKeyOption?, - invoker: (Factory) -> Service - ) -> Service? { - return container.lock.sync { - return self.container._resolve(name: name, option: option, invoker: invoker) - } - } -} - -extension SynchronizedResolver: Resolver { - internal func resolve(_ serviceType: Service.Type) -> Service? { - return container.lock.sync { - return self.container.resolve(serviceType) - } - } - - internal func resolve(_ serviceType: Service.Type, name: String?) -> Service? { - return container.lock.sync { - return self.container.resolve(serviceType, name: name) - } - } -} diff --git a/Carthage/Checkouts/Swinject/Sources/UnavailableItems.swift b/Carthage/Checkouts/Swinject/Sources/UnavailableItems.swift deleted file mode 100644 index b24ecda..0000000 --- a/Carthage/Checkouts/Swinject/Sources/UnavailableItems.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// UnavailableItems.swift -// Swinject -// -// Created by Yoichi Tagaya on 11/30/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// - -// MARK: For auto migration from Swinject v1 to v2. -extension ObjectScope { - @available(*, unavailable, renamed: "transient") - public static let none = transient - - @available(*, unavailable, renamed: "container") - public static let hierarchy = container -} - -@available(*, unavailable, renamed: "Resolver") -public protocol ResolverType { } - -@available(*, unavailable, renamed: "Assembly") -public protocol AssemblyType { } - -@available(*, unavailable, renamed: "ServiceKeyOption") -public protocol ServiceKeyOptionType { } diff --git a/Carthage/Checkouts/Swinject/Sources/_Resolver.swift b/Carthage/Checkouts/Swinject/Sources/_Resolver.swift deleted file mode 100644 index 1f86d86..0000000 --- a/Carthage/Checkouts/Swinject/Sources/_Resolver.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// _Resolver.swift -// Swinject -// -// Created by Yoichi Tagaya on 5/4/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// - -/// This protocol is designed for the use to extend Swinject functionality. -/// Do NOT use this protocol unless you intend to write an extension or plugin to Swinject framework. -/// -/// A type conforming Resolver protocol must conform _Resolver protocol too. -public protocol _Resolver { - /// This method is designed for the use to extend Swinject functionality. - /// Do NOT use this method unless you intend to write an extension or plugin to Swinject framework. - /// - /// - Parameter name: The registration name. - /// - Parameter option: A service key option for an extension/plugin. - /// - Parameter invoker: A closure to execute service resolution. - /// - /// - Returns: The resolved service type instance, or nil if no service is found. - // swiftlint:disable:next identifier_name - func _resolve(name: String?, option: ServiceKeyOption?, invoker: (Factory) -> Service) -> Service? -} diff --git a/Carthage/Checkouts/Swinject/Swinject.podspec b/Carthage/Checkouts/Swinject/Swinject.podspec deleted file mode 100644 index a379a8e..0000000 --- a/Carthage/Checkouts/Swinject/Swinject.podspec +++ /dev/null @@ -1,19 +0,0 @@ -Pod::Spec.new do |s| - s.name = "Swinject" - s.version = "2.1.1" - s.summary = "Dependency injection framework for Swift" - s.description = <<-DESC - Swinject is a dependency injection framework for Swift, to manage the dependencies of types in your system. - DESC - s.homepage = "https://github.com/Swinject/Swinject" - s.license = 'MIT' - s.author = 'Swinject Contributors' - s.source = { :git => "https://github.com/Swinject/Swinject.git", :tag => s.version.to_s } - - s.source_files = 'Sources/**/*.{swift,h}' - s.ios.deployment_target = '8.0' - s.osx.deployment_target = '10.10' - s.watchos.deployment_target = '2.0' - s.tvos.deployment_target = '9.0' - s.requires_arc = true -end diff --git a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/project.pbxproj b/Carthage/Checkouts/Swinject/Swinject.xcodeproj/project.pbxproj deleted file mode 100644 index 08650f7..0000000 --- a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1373 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 90B029751C18599200A6A521 /* Assembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029741C18599200A6A521 /* Assembly.swift */; }; - 90B029761C18599200A6A521 /* Assembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029741C18599200A6A521 /* Assembly.swift */; }; - 90B029771C18599200A6A521 /* Assembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029741C18599200A6A521 /* Assembly.swift */; }; - 90B029791C185B1600A6A521 /* Assembler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029781C185B1600A6A521 /* Assembler.swift */; }; - 90B0297A1C185B1600A6A521 /* Assembler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029781C185B1600A6A521 /* Assembler.swift */; }; - 90B0297B1C185B1600A6A521 /* Assembler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029781C185B1600A6A521 /* Assembler.swift */; }; - 90B0297C1C185B1600A6A521 /* Assembler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029781C185B1600A6A521 /* Assembler.swift */; }; - 90B0297D1C185B2200A6A521 /* Assembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029741C18599200A6A521 /* Assembly.swift */; }; - 90B0297F1C18666200A6A521 /* AssemblerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B0297E1C18666200A6A521 /* AssemblerSpec.swift */; }; - 90B029801C18666200A6A521 /* AssemblerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B0297E1C18666200A6A521 /* AssemblerSpec.swift */; }; - 90B029811C18666200A6A521 /* AssemblerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B0297E1C18666200A6A521 /* AssemblerSpec.swift */; }; - 90B029831C18670000A6A521 /* BasicAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029821C18670000A6A521 /* BasicAssembly.swift */; }; - 90B029841C18670000A6A521 /* BasicAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029821C18670000A6A521 /* BasicAssembly.swift */; }; - 90B029851C18670000A6A521 /* BasicAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B029821C18670000A6A521 /* BasicAssembly.swift */; }; - 90B0298B1C186D5300A6A521 /* LoadAwareAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B0298A1C186D5300A6A521 /* LoadAwareAssembly.swift */; }; - 90B0298C1C186D5300A6A521 /* LoadAwareAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B0298A1C186D5300A6A521 /* LoadAwareAssembly.swift */; }; - 90B0298D1C186D5300A6A521 /* LoadAwareAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B0298A1C186D5300A6A521 /* LoadAwareAssembly.swift */; }; - 981577F11B675B7F00BF686B /* Circularity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981577F01B675B7F00BF686B /* Circularity.swift */; }; - 981577F21B675B7F00BF686B /* Circularity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981577F01B675B7F00BF686B /* Circularity.swift */; }; - 981899C61B5FE63F00C702D0 /* Swinject.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 981899BC1B5FE63F00C702D0 /* Swinject.framework */; }; - 981899E11B5FF88800C702D0 /* ContainerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981899E01B5FF88800C702D0 /* ContainerSpec.swift */; }; - 981899E21B5FF88800C702D0 /* ContainerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981899E01B5FF88800C702D0 /* ContainerSpec.swift */; }; - 981899E41B5FFE5800C702D0 /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981899E31B5FFE5800C702D0 /* Container.swift */; }; - 981899E51B5FFE5800C702D0 /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981899E31B5FFE5800C702D0 /* Container.swift */; }; - 9819701F1B6145D600EEB942 /* ObjectScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9819701E1B6145D600EEB942 /* ObjectScope.swift */; }; - 981970201B6145D600EEB942 /* ObjectScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9819701E1B6145D600EEB942 /* ObjectScope.swift */; }; - 981A0D0F1BE5B93F0030DD85 /* AVKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 981A0D0E1BE5B93F0030DD85 /* AVKit.framework */; }; - 981A0D111BE5B9460030DD85 /* AVKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 981A0D101BE5B9460030DD85 /* AVKit.framework */; }; - 981ABE8C1B5FC9DF00294975 /* Swinject.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 981ABE811B5FC9DF00294975 /* Swinject.framework */; }; - 983B98311C06ECB2006A23D4 /* SpinLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 983B98301C06ECB2006A23D4 /* SpinLock.swift */; }; - 983B98321C06ECB2006A23D4 /* SpinLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 983B98301C06ECB2006A23D4 /* SpinLock.swift */; }; - 983B98331C06ECB2006A23D4 /* SpinLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 983B98301C06ECB2006A23D4 /* SpinLock.swift */; }; - 983B98341C06ECB2006A23D4 /* SpinLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 983B98301C06ECB2006A23D4 /* SpinLock.swift */; }; - 984774F01C02F25D0092A757 /* SynchronizedResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774EF1C02F25D0092A757 /* SynchronizedResolver.swift */; }; - 984774F11C02F25D0092A757 /* SynchronizedResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774EF1C02F25D0092A757 /* SynchronizedResolver.swift */; }; - 984774F21C02F25D0092A757 /* SynchronizedResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774EF1C02F25D0092A757 /* SynchronizedResolver.swift */; }; - 984774F31C02F25D0092A757 /* SynchronizedResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774EF1C02F25D0092A757 /* SynchronizedResolver.swift */; }; - 984774FA1C02F5A50092A757 /* SynchronizedResolver.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774F91C02F5A50092A757 /* SynchronizedResolver.Arguments.swift */; }; - 984774FB1C02F5A50092A757 /* SynchronizedResolver.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774F91C02F5A50092A757 /* SynchronizedResolver.Arguments.swift */; }; - 984774FC1C02F5A50092A757 /* SynchronizedResolver.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774F91C02F5A50092A757 /* SynchronizedResolver.Arguments.swift */; }; - 984774FD1C02F5A50092A757 /* SynchronizedResolver.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774F91C02F5A50092A757 /* SynchronizedResolver.Arguments.swift */; }; - 984774FF1C034C5C0092A757 /* SynchronizedResolverSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774FE1C034C5C0092A757 /* SynchronizedResolverSpec.swift */; }; - 984775001C034C5C0092A757 /* SynchronizedResolverSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774FE1C034C5C0092A757 /* SynchronizedResolverSpec.swift */; }; - 984775011C034C5C0092A757 /* SynchronizedResolverSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984774FE1C034C5C0092A757 /* SynchronizedResolverSpec.swift */; }; - 9848611C1B6F9B7000C07072 /* ContainerSpec.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9848611B1B6F9B7000C07072 /* ContainerSpec.Arguments.swift */; }; - 9848611D1B6F9B7000C07072 /* ContainerSpec.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9848611B1B6F9B7000C07072 /* ContainerSpec.Arguments.swift */; }; - 984BE3131CDA3FCF00BCF2AC /* _Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984BE3121CDA3FCF00BCF2AC /* _Resolver.swift */; }; - 984BE3141CDA3FCF00BCF2AC /* _Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984BE3121CDA3FCF00BCF2AC /* _Resolver.swift */; }; - 984BE3151CDA3FCF00BCF2AC /* _Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984BE3121CDA3FCF00BCF2AC /* _Resolver.swift */; }; - 984BE3161CDA3FCF00BCF2AC /* _Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984BE3121CDA3FCF00BCF2AC /* _Resolver.swift */; }; - 984E8A521C317AC90039943D /* Swinject.h in Headers */ = {isa = PBXBuildFile; fileRef = 984E8A511C317AC90039943D /* Swinject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 984E8A531C317AC90039943D /* Swinject.h in Headers */ = {isa = PBXBuildFile; fileRef = 984E8A511C317AC90039943D /* Swinject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 984E8A541C317AC90039943D /* Swinject.h in Headers */ = {isa = PBXBuildFile; fileRef = 984E8A511C317AC90039943D /* Swinject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 984E8A551C317AC90039943D /* Swinject.h in Headers */ = {isa = PBXBuildFile; fileRef = 984E8A511C317AC90039943D /* Swinject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9850111E1BBE7E8900A2CCFC /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981899E31B5FFE5800C702D0 /* Container.swift */; }; - 9850111F1BBE7E8900A2CCFC /* ServiceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9884E2A61B60B77400120259 /* ServiceKey.swift */; }; - 985011201BBE7E8900A2CCFC /* ServiceEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 985BAFA81B625E0F0055F998 /* ServiceEntry.swift */; }; - 985011221BBE7E8900A2CCFC /* ObjectScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9819701E1B6145D600EEB942 /* ObjectScope.swift */; }; - 985011241BBE7E8900A2CCFC /* Container.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B012B71B82D67300053A32 /* Container.Arguments.swift */; }; - 985011251BBE7E8900A2CCFC /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B012BE1B82F68E00053A32 /* Resolver.swift */; }; - 9855C5BF1B686F5900DADB0B /* ContainerSpec.Circularity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9855C5BE1B686F5900DADB0B /* ContainerSpec.Circularity.swift */; }; - 9855C5C01B686F5900DADB0B /* ContainerSpec.Circularity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9855C5BE1B686F5900DADB0B /* ContainerSpec.Circularity.swift */; }; - 9855C5C51B689B7B00DADB0B /* Food.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9855C5C41B689B7B00DADB0B /* Food.swift */; }; - 9855C5C61B689B7B00DADB0B /* Food.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9855C5C41B689B7B00DADB0B /* Food.swift */; }; - 9855C5C81B689D9000DADB0B /* ServiceEntrySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9855C5C71B689D9000DADB0B /* ServiceEntrySpec.swift */; }; - 9855C5C91B689D9000DADB0B /* ServiceEntrySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9855C5C71B689D9000DADB0B /* ServiceEntrySpec.swift */; }; - 985BAFA91B625E0F0055F998 /* ServiceEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 985BAFA81B625E0F0055F998 /* ServiceEntry.swift */; }; - 985BAFAA1B625E0F0055F998 /* ServiceEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 985BAFA81B625E0F0055F998 /* ServiceEntry.swift */; }; - 98689C991BBFC7EB0005C6D3 /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981899E31B5FFE5800C702D0 /* Container.swift */; }; - 98689C9A1BBFC7EB0005C6D3 /* ServiceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9884E2A61B60B77400120259 /* ServiceKey.swift */; }; - 98689C9B1BBFC7EB0005C6D3 /* ServiceEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 985BAFA81B625E0F0055F998 /* ServiceEntry.swift */; }; - 98689C9D1BBFC7EB0005C6D3 /* ObjectScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9819701E1B6145D600EEB942 /* ObjectScope.swift */; }; - 98689C9F1BBFC7EB0005C6D3 /* Container.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B012B71B82D67300053A32 /* Container.Arguments.swift */; }; - 98689CA01BBFC7EB0005C6D3 /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B012BE1B82F68E00053A32 /* Resolver.swift */; }; - 98689CB61BBFD5110005C6D3 /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9878C63B1B65CA8700CBEFEF /* Person.swift */; }; - 98689CB71BBFD5110005C6D3 /* Animal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9878C6371B65C9E000CBEFEF /* Animal.swift */; }; - 98689CB81BBFD5110005C6D3 /* Food.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9855C5C41B689B7B00DADB0B /* Food.swift */; }; - 98689CB91BBFD5110005C6D3 /* Circularity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981577F01B675B7F00BF686B /* Circularity.swift */; }; - 98689CBA1BBFD5110005C6D3 /* ContainerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981899E01B5FF88800C702D0 /* ContainerSpec.swift */; }; - 98689CBB1BBFD5110005C6D3 /* ContainerSpec.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9848611B1B6F9B7000C07072 /* ContainerSpec.Arguments.swift */; }; - 98689CBC1BBFD5110005C6D3 /* ContainerSpec.Circularity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9855C5BE1B686F5900DADB0B /* ContainerSpec.Circularity.swift */; }; - 98689CBD1BBFD5110005C6D3 /* ServiceKeySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9884E2A91B60C51C00120259 /* ServiceKeySpec.swift */; }; - 98689CBE1BBFD5110005C6D3 /* ServiceEntrySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9855C5C71B689D9000DADB0B /* ServiceEntrySpec.swift */; }; - 98689CD51BBFDEBC0005C6D3 /* Swinject.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98689C7F1BBFC7A50005C6D3 /* Swinject.framework */; }; - 9878C6381B65C9E000CBEFEF /* Animal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9878C6371B65C9E000CBEFEF /* Animal.swift */; }; - 9878C6391B65C9E000CBEFEF /* Animal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9878C6371B65C9E000CBEFEF /* Animal.swift */; }; - 9878C63C1B65CA8700CBEFEF /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9878C63B1B65CA8700CBEFEF /* Person.swift */; }; - 9878C63D1B65CA8700CBEFEF /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9878C63B1B65CA8700CBEFEF /* Person.swift */; }; - 9880E70E1C09EE2900ED5293 /* FunctionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9880E70D1C09EE2800ED5293 /* FunctionType.swift */; }; - 9880E70F1C09EE2900ED5293 /* FunctionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9880E70D1C09EE2800ED5293 /* FunctionType.swift */; }; - 9880E7101C09EE2900ED5293 /* FunctionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9880E70D1C09EE2800ED5293 /* FunctionType.swift */; }; - 9880E7111C09EE2900ED5293 /* FunctionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9880E70D1C09EE2800ED5293 /* FunctionType.swift */; }; - 9884E2A71B60B77400120259 /* ServiceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9884E2A61B60B77400120259 /* ServiceKey.swift */; }; - 9884E2A81B60B77400120259 /* ServiceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9884E2A61B60B77400120259 /* ServiceKey.swift */; }; - 9884E2AA1B60C51C00120259 /* ServiceKeySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9884E2A91B60C51C00120259 /* ServiceKeySpec.swift */; }; - 9884E2AB1B60C51C00120259 /* ServiceKeySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9884E2A91B60C51C00120259 /* ServiceKeySpec.swift */; }; - 98B012B81B82D67300053A32 /* Container.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B012B71B82D67300053A32 /* Container.Arguments.swift */; }; - 98B012B91B82D67300053A32 /* Container.Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B012B71B82D67300053A32 /* Container.Arguments.swift */; }; - 98B012BF1B82F68E00053A32 /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B012BE1B82F68E00053A32 /* Resolver.swift */; }; - 98B012C01B82F68E00053A32 /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B012BE1B82F68E00053A32 /* Resolver.swift */; }; - 98E550C31DEF066300BE6304 /* UnavailableItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98E550C21DEF066300BE6304 /* UnavailableItems.swift */; }; - CD3B32921DD6121500B208A3 /* InstanceStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B32911DD6121500B208A3 /* InstanceStorage.swift */; }; - CD3B32931DD6123F00B208A3 /* InstanceStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B32911DD6121500B208A3 /* InstanceStorage.swift */; }; - CD3B32941DD6123F00B208A3 /* InstanceStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B32911DD6121500B208A3 /* InstanceStorage.swift */; }; - CD3B32951DD6124000B208A3 /* InstanceStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B32911DD6121500B208A3 /* InstanceStorage.swift */; }; - CD3B32971DD6126E00B208A3 /* ObjectScope.Standard.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B32961DD6126E00B208A3 /* ObjectScope.Standard.swift */; }; - CD3B32981DD6126E00B208A3 /* ObjectScope.Standard.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B32961DD6126E00B208A3 /* ObjectScope.Standard.swift */; }; - CD3B32991DD6126E00B208A3 /* ObjectScope.Standard.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B32961DD6126E00B208A3 /* ObjectScope.Standard.swift */; }; - CD3B329A1DD6126E00B208A3 /* ObjectScope.Standard.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B32961DD6126E00B208A3 /* ObjectScope.Standard.swift */; }; - CD3B329C1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B329B1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift */; }; - CD3B329D1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B329B1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift */; }; - CD3B329E1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B329B1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift */; }; - CD3C2CDF1D98E47000863421 /* DebugHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3C2CDE1D98E47000863421 /* DebugHelper.swift */; }; - CD3C2CE01D98E47000863421 /* DebugHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3C2CDE1D98E47000863421 /* DebugHelper.swift */; }; - CD3C2CE11D98E47000863421 /* DebugHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3C2CDE1D98E47000863421 /* DebugHelper.swift */; }; - CD3C2CE21D98E47000863421 /* DebugHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3C2CDE1D98E47000863421 /* DebugHelper.swift */; }; - CD3C2CF21D98EF4A00863421 /* ContainerSpec.DebugHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3C2CF11D98EF4A00863421 /* ContainerSpec.DebugHelper.swift */; }; - CD3C2CF31D98EF4A00863421 /* ContainerSpec.DebugHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3C2CF11D98EF4A00863421 /* ContainerSpec.DebugHelper.swift */; }; - CD3C2CF41D98EF4A00863421 /* ContainerSpec.DebugHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3C2CF11D98EF4A00863421 /* ContainerSpec.DebugHelper.swift */; }; - CD6A9F821EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6A9F811EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift */; }; - CD6A9F831EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6A9F811EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift */; }; - CD6A9F841EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6A9F811EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift */; }; - CDBBACF61D9EAD60002F5EF9 /* Container.Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBBACF51D9EAD60002F5EF9 /* Container.Logging.swift */; }; - CDBBACF71D9EAD60002F5EF9 /* Container.Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBBACF51D9EAD60002F5EF9 /* Container.Logging.swift */; }; - CDBBACF81D9EAD60002F5EF9 /* Container.Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBBACF51D9EAD60002F5EF9 /* Container.Logging.swift */; }; - CDBBACF91D9EAD60002F5EF9 /* Container.Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBBACF51D9EAD60002F5EF9 /* Container.Logging.swift */; }; - CDD44AD71DEEED1000916595 /* WeakStorageSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD44AD61DEEED1000916595 /* WeakStorageSpec.swift */; }; - CDD44AD81DEEED1000916595 /* WeakStorageSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD44AD61DEEED1000916595 /* WeakStorageSpec.swift */; }; - CDD44AD91DEEED1000916595 /* WeakStorageSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD44AD61DEEED1000916595 /* WeakStorageSpec.swift */; }; - FF15F7831EDCE81B00F96686 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF15F77F1EDCE81600F96686 /* Nimble.framework */; }; - FF15F7841EDCE81B00F96686 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF15F7801EDCE81600F96686 /* Quick.framework */; }; - FF15F7871EDCE82600F96686 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF15F7851EDCE82600F96686 /* Nimble.framework */; }; - FF15F7881EDCE82600F96686 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF15F7861EDCE82600F96686 /* Quick.framework */; }; - FF15F78B1EDCE83100F96686 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF15F7891EDCE83100F96686 /* Nimble.framework */; }; - FF15F78C1EDCE83100F96686 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF15F78A1EDCE83100F96686 /* Quick.framework */; }; - FF15F7901EDD99DB00F96686 /* Nimble.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FF15F77F1EDCE81600F96686 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - FF15F7911EDD99DB00F96686 /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FF15F7801EDCE81600F96686 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - FF15F7961EDD9A1900F96686 /* Nimble.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FF15F7851EDCE82600F96686 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - FF15F7971EDD9A1900F96686 /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FF15F7861EDCE82600F96686 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - FF15F7991EDD9A2B00F96686 /* Nimble.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FF15F7891EDCE83100F96686 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - FF15F79A1EDD9A2B00F96686 /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FF15F78A1EDCE83100F96686 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 981899C71B5FE63F00C702D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 981ABE781B5FC9DF00294975 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 981899BB1B5FE63F00C702D0; - remoteInfo = "Swinject-OSX"; - }; - 981ABE8D1B5FC9DF00294975 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 981ABE781B5FC9DF00294975 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 981ABE801B5FC9DF00294975; - remoteInfo = Swinject; - }; - 98689C8A1BBFC7A60005C6D3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 981ABE781B5FC9DF00294975 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 98689C7E1BBFC7A50005C6D3; - remoteInfo = "Swinject-tvOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - FF15F78F1EDD99B500F96686 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - FF15F7901EDD99DB00F96686 /* Nimble.framework in CopyFiles */, - FF15F7911EDD99DB00F96686 /* Quick.framework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FF15F7951EDD9A0B00F96686 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - FF15F7961EDD9A1900F96686 /* Nimble.framework in CopyFiles */, - FF15F7971EDD9A1900F96686 /* Quick.framework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FF15F7981EDD9A1F00F96686 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - FF15F7991EDD9A2B00F96686 /* Nimble.framework in CopyFiles */, - FF15F79A1EDD9A2B00F96686 /* Quick.framework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 90B029741C18599200A6A521 /* Assembly.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Assembly.swift; sourceTree = ""; }; - 90B029781C185B1600A6A521 /* Assembler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Assembler.swift; sourceTree = ""; }; - 90B0297E1C18666200A6A521 /* AssemblerSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssemblerSpec.swift; sourceTree = ""; }; - 90B029821C18670000A6A521 /* BasicAssembly.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasicAssembly.swift; sourceTree = ""; }; - 90B0298A1C186D5300A6A521 /* LoadAwareAssembly.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = LoadAwareAssembly.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 981577F01B675B7F00BF686B /* Circularity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Circularity.swift; sourceTree = ""; }; - 981899BC1B5FE63F00C702D0 /* Swinject.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Swinject.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 981899C51B5FE63F00C702D0 /* SwinjectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwinjectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 981899E01B5FF88800C702D0 /* ContainerSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerSpec.swift; sourceTree = ""; }; - 981899E31B5FFE5800C702D0 /* Container.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Container.swift; sourceTree = ""; }; - 9819701E1B6145D600EEB942 /* ObjectScope.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectScope.swift; sourceTree = ""; }; - 981A0D0E1BE5B93F0030DD85 /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.1.sdk/System/Library/Frameworks/AVKit.framework; sourceTree = DEVELOPER_DIR; }; - 981A0D101BE5B9460030DD85 /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/AVKit.framework; sourceTree = DEVELOPER_DIR; }; - 981ABE811B5FC9DF00294975 /* Swinject.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Swinject.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 981ABE861B5FC9DF00294975 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 981ABE8B1B5FC9DF00294975 /* SwinjectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwinjectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 981ABE921B5FC9DF00294975 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 983B98301C06ECB2006A23D4 /* SpinLock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpinLock.swift; sourceTree = ""; }; - 984774EF1C02F25D0092A757 /* SynchronizedResolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronizedResolver.swift; sourceTree = ""; }; - 984774F41C02F4EA0092A757 /* SynchronizedResolver.Arguments.erb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SynchronizedResolver.Arguments.erb; sourceTree = ""; }; - 984774F91C02F5A50092A757 /* SynchronizedResolver.Arguments.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronizedResolver.Arguments.swift; sourceTree = ""; }; - 984774FE1C034C5C0092A757 /* SynchronizedResolverSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronizedResolverSpec.swift; sourceTree = ""; }; - 9848611A1B6F21EC00C07072 /* Sample-iOS.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = "Sample-iOS.playground"; sourceTree = ""; }; - 9848611B1B6F9B7000C07072 /* ContainerSpec.Arguments.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerSpec.Arguments.swift; sourceTree = ""; }; - 984BE3121CDA3FCF00BCF2AC /* _Resolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = _Resolver.swift; sourceTree = ""; }; - 984E8A511C317AC90039943D /* Swinject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Swinject.h; sourceTree = ""; }; - 985010BD1BBE76AB00A2CCFC /* watchOS-Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "watchOS-Application.xcconfig"; sourceTree = ""; }; - 985010BE1BBE76AB00A2CCFC /* watchOS-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "watchOS-Base.xcconfig"; sourceTree = ""; }; - 985010BF1BBE76AB00A2CCFC /* watchOS-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "watchOS-Framework.xcconfig"; sourceTree = ""; }; - 985010C01BBE76AB00A2CCFC /* watchOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "watchOS-StaticLibrary.xcconfig"; sourceTree = ""; }; - 985010C61BBE76D400A2CCFC /* Swinject.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Swinject.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9855C5BE1B686F5900DADB0B /* ContainerSpec.Circularity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerSpec.Circularity.swift; sourceTree = ""; }; - 9855C5C41B689B7B00DADB0B /* Food.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Food.swift; sourceTree = ""; }; - 9855C5C71B689D9000DADB0B /* ServiceEntrySpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceEntrySpec.swift; sourceTree = ""; }; - 985BAFA81B625E0F0055F998 /* ServiceEntry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceEntry.swift; sourceTree = ""; }; - 98689C761BBFC77F0005C6D3 /* tvOS-Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-Application.xcconfig"; sourceTree = ""; }; - 98689C771BBFC77F0005C6D3 /* tvOS-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-Base.xcconfig"; sourceTree = ""; }; - 98689C781BBFC77F0005C6D3 /* tvOS-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-Framework.xcconfig"; sourceTree = ""; }; - 98689C791BBFC77F0005C6D3 /* tvOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-StaticLibrary.xcconfig"; sourceTree = ""; }; - 98689C7F1BBFC7A50005C6D3 /* Swinject.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Swinject.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 98689C881BBFC7A60005C6D3 /* SwinjectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwinjectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 9878C6371B65C9E000CBEFEF /* Animal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Animal.swift; sourceTree = ""; }; - 9878C63B1B65CA8700CBEFEF /* Person.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Person.swift; sourceTree = ""; }; - 9880E70D1C09EE2800ED5293 /* FunctionType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FunctionType.swift; sourceTree = ""; }; - 9884E2A61B60B77400120259 /* ServiceKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceKey.swift; sourceTree = ""; }; - 9884E2A91B60C51C00120259 /* ServiceKeySpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceKeySpec.swift; sourceTree = ""; }; - 98AA74461BB70CBB00E2F48A /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 98AA74481BB70CBB00E2F48A /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 98AA74491BB70CBB00E2F48A /* Profile.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Profile.xcconfig; sourceTree = ""; }; - 98AA744A1BB70CBB00E2F48A /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 98AA744B1BB70CBB00E2F48A /* Test.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Test.xcconfig; sourceTree = ""; }; - 98AA744D1BB70CBB00E2F48A /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 98AA744E1BB70CBB00E2F48A /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Framework.xcconfig; sourceTree = ""; }; - 98AA744F1BB70CBB00E2F48A /* StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticLibrary.xcconfig; sourceTree = ""; }; - 98AA74511BB70CBB00E2F48A /* iOS-Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-Application.xcconfig"; sourceTree = ""; }; - 98AA74521BB70CBB00E2F48A /* iOS-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-Base.xcconfig"; sourceTree = ""; }; - 98AA74531BB70CBB00E2F48A /* iOS-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-Framework.xcconfig"; sourceTree = ""; }; - 98AA74541BB70CBB00E2F48A /* iOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-StaticLibrary.xcconfig"; sourceTree = ""; }; - 98AA74561BB70CBB00E2F48A /* Mac-Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-Application.xcconfig"; sourceTree = ""; }; - 98AA74571BB70CBB00E2F48A /* Mac-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-Base.xcconfig"; sourceTree = ""; }; - 98AA74581BB70CBB00E2F48A /* Mac-DynamicLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-DynamicLibrary.xcconfig"; sourceTree = ""; }; - 98AA74591BB70CBB00E2F48A /* Mac-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-Framework.xcconfig"; sourceTree = ""; }; - 98AA745A1BB70CBB00E2F48A /* Mac-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Mac-StaticLibrary.xcconfig"; sourceTree = ""; }; - 98B012B71B82D67300053A32 /* Container.Arguments.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Container.Arguments.swift; sourceTree = ""; }; - 98B012BA1B82D6A400053A32 /* Container.Arguments.erb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Container.Arguments.erb; sourceTree = ""; }; - 98B012BE1B82F68E00053A32 /* Resolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Resolver.swift; sourceTree = ""; }; - 98B012C11B82F70A00053A32 /* Resolver.erb */ = {isa = PBXFileReference; lastKnownFileType = text; path = Resolver.erb; sourceTree = ""; }; - 98E550C21DEF066300BE6304 /* UnavailableItems.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnavailableItems.swift; sourceTree = ""; }; - CD3B32911DD6121500B208A3 /* InstanceStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstanceStorage.swift; sourceTree = ""; }; - CD3B32961DD6126E00B208A3 /* ObjectScope.Standard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectScope.Standard.swift; sourceTree = ""; }; - CD3B329B1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerSpec.CustomScope.swift; sourceTree = ""; }; - CD3C2CDE1D98E47000863421 /* DebugHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugHelper.swift; sourceTree = ""; }; - CD3C2CF11D98EF4A00863421 /* ContainerSpec.DebugHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerSpec.DebugHelper.swift; sourceTree = ""; }; - CD6A9F811EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerSpec.CustomStringConvertible.swift; sourceTree = ""; }; - CDBBACF51D9EAD60002F5EF9 /* Container.Logging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Container.Logging.swift; sourceTree = ""; }; - CDD44AD61DEEED1000916595 /* WeakStorageSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeakStorageSpec.swift; sourceTree = ""; }; - FF15F77F1EDCE81600F96686 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = ""; }; - FF15F7801EDCE81600F96686 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/iOS/Quick.framework; sourceTree = ""; }; - FF15F7851EDCE82600F96686 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/Mac/Nimble.framework; sourceTree = ""; }; - FF15F7861EDCE82600F96686 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/Mac/Quick.framework; sourceTree = ""; }; - FF15F7891EDCE83100F96686 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/tvOS/Nimble.framework; sourceTree = ""; }; - FF15F78A1EDCE83100F96686 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/tvOS/Quick.framework; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 981899B81B5FE63F00C702D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981899C21B5FE63F00C702D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 981899C61B5FE63F00C702D0 /* Swinject.framework in Frameworks */, - FF15F7871EDCE82600F96686 /* Nimble.framework in Frameworks */, - FF15F7881EDCE82600F96686 /* Quick.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981ABE7D1B5FC9DF00294975 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981ABE881B5FC9DF00294975 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - FF15F7841EDCE81B00F96686 /* Quick.framework in Frameworks */, - FF15F7831EDCE81B00F96686 /* Nimble.framework in Frameworks */, - 981A0D0F1BE5B93F0030DD85 /* AVKit.framework in Frameworks */, - 981ABE8C1B5FC9DF00294975 /* Swinject.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 985010C21BBE76D400A2CCFC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 98689C7B1BBFC7A50005C6D3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 98689C851BBFC7A60005C6D3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - FF15F78C1EDCE83100F96686 /* Quick.framework in Frameworks */, - FF15F78B1EDCE83100F96686 /* Nimble.framework in Frameworks */, - 981A0D111BE5B9460030DD85 /* AVKit.framework in Frameworks */, - 98689CD51BBFDEBC0005C6D3 /* Swinject.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9802C9B11B5FD7E80088018E /* Frameworks */ = { - isa = PBXGroup; - children = ( - FF15F77F1EDCE81600F96686 /* Nimble.framework */, - FF15F7801EDCE81600F96686 /* Quick.framework */, - FF15F7851EDCE82600F96686 /* Nimble.framework */, - FF15F7861EDCE82600F96686 /* Quick.framework */, - FF15F7891EDCE83100F96686 /* Nimble.framework */, - FF15F78A1EDCE83100F96686 /* Quick.framework */, - 981A0D0E1BE5B93F0030DD85 /* AVKit.framework */, - 981A0D101BE5B9460030DD85 /* AVKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 981ABE771B5FC9DF00294975 = { - isa = PBXGroup; - children = ( - 9848611A1B6F21EC00C07072 /* Sample-iOS.playground */, - 981ABE831B5FC9DF00294975 /* Sources */, - 981ABE8F1B5FC9DF00294975 /* SwinjectTests */, - 981ABE821B5FC9DF00294975 /* Products */, - 98AA74441BB70C8C00E2F48A /* Configuration */, - 9802C9B11B5FD7E80088018E /* Frameworks */, - ); - sourceTree = ""; - }; - 981ABE821B5FC9DF00294975 /* Products */ = { - isa = PBXGroup; - children = ( - 981ABE811B5FC9DF00294975 /* Swinject.framework */, - 981ABE8B1B5FC9DF00294975 /* SwinjectTests.xctest */, - 981899BC1B5FE63F00C702D0 /* Swinject.framework */, - 981899C51B5FE63F00C702D0 /* SwinjectTests.xctest */, - 985010C61BBE76D400A2CCFC /* Swinject.framework */, - 98689C7F1BBFC7A50005C6D3 /* Swinject.framework */, - 98689C881BBFC7A60005C6D3 /* SwinjectTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 981ABE831B5FC9DF00294975 /* Sources */ = { - isa = PBXGroup; - children = ( - 90B029781C185B1600A6A521 /* Assembler.swift */, - 90B029741C18599200A6A521 /* Assembly.swift */, - 981899E31B5FFE5800C702D0 /* Container.swift */, - 98B012BA1B82D6A400053A32 /* Container.Arguments.erb */, - CD3C2CDE1D98E47000863421 /* DebugHelper.swift */, - CDBBACF51D9EAD60002F5EF9 /* Container.Logging.swift */, - 984774EF1C02F25D0092A757 /* SynchronizedResolver.swift */, - 984774F41C02F4EA0092A757 /* SynchronizedResolver.Arguments.erb */, - 9880E70D1C09EE2800ED5293 /* FunctionType.swift */, - 9884E2A61B60B77400120259 /* ServiceKey.swift */, - 985BAFA81B625E0F0055F998 /* ServiceEntry.swift */, - 9819701E1B6145D600EEB942 /* ObjectScope.swift */, - CD3B32961DD6126E00B208A3 /* ObjectScope.Standard.swift */, - CD3B32911DD6121500B208A3 /* InstanceStorage.swift */, - 984BE3121CDA3FCF00BCF2AC /* _Resolver.swift */, - 98B012C11B82F70A00053A32 /* Resolver.erb */, - 983B98301C06ECB2006A23D4 /* SpinLock.swift */, - 98E550C21DEF066300BE6304 /* UnavailableItems.swift */, - 98B012BD1B82D6B000053A32 /* GeneratedCode */, - 984E8A511C317AC90039943D /* Swinject.h */, - 981ABE861B5FC9DF00294975 /* Info.plist */, - ); - path = Sources; - sourceTree = ""; - }; - 981ABE8F1B5FC9DF00294975 /* SwinjectTests */ = { - isa = PBXGroup; - children = ( - 9878C63A1B65CA0600CBEFEF /* Fakes */, - 90B0297E1C18666200A6A521 /* AssemblerSpec.swift */, - 981899E01B5FF88800C702D0 /* ContainerSpec.swift */, - 9848611B1B6F9B7000C07072 /* ContainerSpec.Arguments.swift */, - 9855C5BE1B686F5900DADB0B /* ContainerSpec.Circularity.swift */, - CD3C2CF11D98EF4A00863421 /* ContainerSpec.DebugHelper.swift */, - CD3B329B1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift */, - CD6A9F811EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift */, - 984774FE1C034C5C0092A757 /* SynchronizedResolverSpec.swift */, - 9884E2A91B60C51C00120259 /* ServiceKeySpec.swift */, - 9855C5C71B689D9000DADB0B /* ServiceEntrySpec.swift */, - CDD44AD61DEEED1000916595 /* WeakStorageSpec.swift */, - 981ABE921B5FC9DF00294975 /* Info.plist */, - ); - name = SwinjectTests; - path = Tests/SwinjectTests; - sourceTree = ""; - }; - 985010BC1BBE76AB00A2CCFC /* watchOS */ = { - isa = PBXGroup; - children = ( - 985010BD1BBE76AB00A2CCFC /* watchOS-Application.xcconfig */, - 985010BE1BBE76AB00A2CCFC /* watchOS-Base.xcconfig */, - 985010BF1BBE76AB00A2CCFC /* watchOS-Framework.xcconfig */, - 985010C01BBE76AB00A2CCFC /* watchOS-StaticLibrary.xcconfig */, - ); - path = watchOS; - sourceTree = ""; - }; - 98689C751BBFC77F0005C6D3 /* tvOS */ = { - isa = PBXGroup; - children = ( - 98689C761BBFC77F0005C6D3 /* tvOS-Application.xcconfig */, - 98689C771BBFC77F0005C6D3 /* tvOS-Base.xcconfig */, - 98689C781BBFC77F0005C6D3 /* tvOS-Framework.xcconfig */, - 98689C791BBFC77F0005C6D3 /* tvOS-StaticLibrary.xcconfig */, - ); - name = tvOS; - path = Configurations/tvOS; - sourceTree = SOURCE_ROOT; - }; - 9878C63A1B65CA0600CBEFEF /* Fakes */ = { - isa = PBXGroup; - children = ( - 9878C63B1B65CA8700CBEFEF /* Person.swift */, - 9878C6371B65C9E000CBEFEF /* Animal.swift */, - 9855C5C41B689B7B00DADB0B /* Food.swift */, - 981577F01B675B7F00BF686B /* Circularity.swift */, - 90B029821C18670000A6A521 /* BasicAssembly.swift */, - 90B0298A1C186D5300A6A521 /* LoadAwareAssembly.swift */, - ); - name = Fakes; - sourceTree = ""; - }; - 98AA74441BB70C8C00E2F48A /* Configuration */ = { - isa = PBXGroup; - children = ( - 98AA74451BB70CBB00E2F48A /* Base */, - 98AA74501BB70CBB00E2F48A /* iOS */, - 98AA74551BB70CBB00E2F48A /* Mac OS X */, - 98689C751BBFC77F0005C6D3 /* tvOS */, - 985010BC1BBE76AB00A2CCFC /* watchOS */, - ); - name = Configuration; - path = Configurations; - sourceTree = ""; - }; - 98AA74451BB70CBB00E2F48A /* Base */ = { - isa = PBXGroup; - children = ( - 98AA74461BB70CBB00E2F48A /* Common.xcconfig */, - 98AA74471BB70CBB00E2F48A /* Configurations */, - 98AA744C1BB70CBB00E2F48A /* Targets */, - ); - path = Base; - sourceTree = ""; - }; - 98AA74471BB70CBB00E2F48A /* Configurations */ = { - isa = PBXGroup; - children = ( - 98AA74481BB70CBB00E2F48A /* Debug.xcconfig */, - 98AA74491BB70CBB00E2F48A /* Profile.xcconfig */, - 98AA744A1BB70CBB00E2F48A /* Release.xcconfig */, - 98AA744B1BB70CBB00E2F48A /* Test.xcconfig */, - ); - path = Configurations; - sourceTree = ""; - }; - 98AA744C1BB70CBB00E2F48A /* Targets */ = { - isa = PBXGroup; - children = ( - 98AA744D1BB70CBB00E2F48A /* Application.xcconfig */, - 98AA744E1BB70CBB00E2F48A /* Framework.xcconfig */, - 98AA744F1BB70CBB00E2F48A /* StaticLibrary.xcconfig */, - ); - path = Targets; - sourceTree = ""; - }; - 98AA74501BB70CBB00E2F48A /* iOS */ = { - isa = PBXGroup; - children = ( - 98AA74511BB70CBB00E2F48A /* iOS-Application.xcconfig */, - 98AA74521BB70CBB00E2F48A /* iOS-Base.xcconfig */, - 98AA74531BB70CBB00E2F48A /* iOS-Framework.xcconfig */, - 98AA74541BB70CBB00E2F48A /* iOS-StaticLibrary.xcconfig */, - ); - path = iOS; - sourceTree = ""; - }; - 98AA74551BB70CBB00E2F48A /* Mac OS X */ = { - isa = PBXGroup; - children = ( - 98AA74561BB70CBB00E2F48A /* Mac-Application.xcconfig */, - 98AA74571BB70CBB00E2F48A /* Mac-Base.xcconfig */, - 98AA74581BB70CBB00E2F48A /* Mac-DynamicLibrary.xcconfig */, - 98AA74591BB70CBB00E2F48A /* Mac-Framework.xcconfig */, - 98AA745A1BB70CBB00E2F48A /* Mac-StaticLibrary.xcconfig */, - ); - path = "Mac OS X"; - sourceTree = ""; - }; - 98B012BD1B82D6B000053A32 /* GeneratedCode */ = { - isa = PBXGroup; - children = ( - 98B012B71B82D67300053A32 /* Container.Arguments.swift */, - 984774F91C02F5A50092A757 /* SynchronizedResolver.Arguments.swift */, - 98B012BE1B82F68E00053A32 /* Resolver.swift */, - ); - name = GeneratedCode; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 981899B91B5FE63F00C702D0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 984E8A531C317AC90039943D /* Swinject.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981ABE7E1B5FC9DF00294975 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 984E8A521C317AC90039943D /* Swinject.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 985010C31BBE76D400A2CCFC /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 984E8A541C317AC90039943D /* Swinject.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 98689C7C1BBFC7A50005C6D3 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 984E8A551C317AC90039943D /* Swinject.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 981899BB1B5FE63F00C702D0 /* Swinject-OSX */ = { - isa = PBXNativeTarget; - buildConfigurationList = 981899D11B5FE64000C702D0 /* Build configuration list for PBXNativeTarget "Swinject-OSX" */; - buildPhases = ( - 981899B71B5FE63F00C702D0 /* Sources */, - 981899B81B5FE63F00C702D0 /* Frameworks */, - 981899B91B5FE63F00C702D0 /* Headers */, - 981899BA1B5FE63F00C702D0 /* Resources */, - 98AEB3B51BE7848C0009F188 /* Run SwiftLint */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Swinject-OSX"; - productName = "Swinject-OSX"; - productReference = 981899BC1B5FE63F00C702D0 /* Swinject.framework */; - productType = "com.apple.product-type.framework"; - }; - 981899C41B5FE63F00C702D0 /* Swinject-OSXTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 981899D21B5FE64000C702D0 /* Build configuration list for PBXNativeTarget "Swinject-OSXTests" */; - buildPhases = ( - 981899C11B5FE63F00C702D0 /* Sources */, - 981899C21B5FE63F00C702D0 /* Frameworks */, - 981899C31B5FE63F00C702D0 /* Resources */, - FF15F7951EDD9A0B00F96686 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 981899C81B5FE63F00C702D0 /* PBXTargetDependency */, - ); - name = "Swinject-OSXTests"; - productName = "Swinject-OSXTests"; - productReference = 981899C51B5FE63F00C702D0 /* SwinjectTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 981ABE801B5FC9DF00294975 /* Swinject-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 981ABE951B5FC9DF00294975 /* Build configuration list for PBXNativeTarget "Swinject-iOS" */; - buildPhases = ( - 981ABE7C1B5FC9DF00294975 /* Sources */, - 981ABE7D1B5FC9DF00294975 /* Frameworks */, - 981ABE7E1B5FC9DF00294975 /* Headers */, - 981ABE7F1B5FC9DF00294975 /* Resources */, - 98AEB3B11BE783DC0009F188 /* Run SwiftLint */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Swinject-iOS"; - productName = Swinject; - productReference = 981ABE811B5FC9DF00294975 /* Swinject.framework */; - productType = "com.apple.product-type.framework"; - }; - 981ABE8A1B5FC9DF00294975 /* Swinject-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 981ABE981B5FC9DF00294975 /* Build configuration list for PBXNativeTarget "Swinject-iOSTests" */; - buildPhases = ( - 981ABE871B5FC9DF00294975 /* Sources */, - 981ABE881B5FC9DF00294975 /* Frameworks */, - 981ABE891B5FC9DF00294975 /* Resources */, - FF15F78F1EDD99B500F96686 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 981ABE8E1B5FC9DF00294975 /* PBXTargetDependency */, - ); - name = "Swinject-iOSTests"; - productName = SwinjectTests; - productReference = 981ABE8B1B5FC9DF00294975 /* SwinjectTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 985010C51BBE76D400A2CCFC /* Swinject-watchOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 985010CB1BBE76D400A2CCFC /* Build configuration list for PBXNativeTarget "Swinject-watchOS" */; - buildPhases = ( - 985010C11BBE76D400A2CCFC /* Sources */, - 985010C21BBE76D400A2CCFC /* Frameworks */, - 985010C31BBE76D400A2CCFC /* Headers */, - 985010C41BBE76D400A2CCFC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Swinject-watchOS"; - productName = "Swinject-watchOS"; - productReference = 985010C61BBE76D400A2CCFC /* Swinject.framework */; - productType = "com.apple.product-type.framework"; - }; - 98689C7E1BBFC7A50005C6D3 /* Swinject-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 98689C901BBFC7A60005C6D3 /* Build configuration list for PBXNativeTarget "Swinject-tvOS" */; - buildPhases = ( - 98689C7A1BBFC7A50005C6D3 /* Sources */, - 98689C7B1BBFC7A50005C6D3 /* Frameworks */, - 98689C7C1BBFC7A50005C6D3 /* Headers */, - 98689C7D1BBFC7A50005C6D3 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Swinject-tvOS"; - productName = "Swinject-tvOS"; - productReference = 98689C7F1BBFC7A50005C6D3 /* Swinject.framework */; - productType = "com.apple.product-type.framework"; - }; - 98689C871BBFC7A60005C6D3 /* Swinject-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 98689C941BBFC7A60005C6D3 /* Build configuration list for PBXNativeTarget "Swinject-tvOSTests" */; - buildPhases = ( - 98689C841BBFC7A60005C6D3 /* Sources */, - 98689C851BBFC7A60005C6D3 /* Frameworks */, - 98689C861BBFC7A60005C6D3 /* Resources */, - FF15F7981EDD9A1F00F96686 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 98689C8B1BBFC7A60005C6D3 /* PBXTargetDependency */, - ); - name = "Swinject-tvOSTests"; - productName = "Swinject-tvOSTests"; - productReference = 98689C881BBFC7A60005C6D3 /* SwinjectTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 981ABE781B5FC9DF00294975 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0800; - ORGANIZATIONNAME = "Swinject Contributors"; - TargetAttributes = { - 981899BB1B5FE63F00C702D0 = { - CreatedOnToolsVersion = 7.0; - }; - 981899C41B5FE63F00C702D0 = { - CreatedOnToolsVersion = 7.0; - }; - 981ABE801B5FC9DF00294975 = { - CreatedOnToolsVersion = 7.0; - LastSwiftMigration = 0800; - }; - 981ABE8A1B5FC9DF00294975 = { - CreatedOnToolsVersion = 7.0; - LastSwiftMigration = 0800; - }; - 985010C51BBE76D400A2CCFC = { - CreatedOnToolsVersion = 7.0.1; - }; - 98689C7E1BBFC7A50005C6D3 = { - CreatedOnToolsVersion = 7.1; - }; - 98689C871BBFC7A60005C6D3 = { - CreatedOnToolsVersion = 7.1; - }; - }; - }; - buildConfigurationList = 981ABE7B1B5FC9DF00294975 /* Build configuration list for PBXProject "Swinject" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 981ABE771B5FC9DF00294975; - productRefGroup = 981ABE821B5FC9DF00294975 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 981ABE801B5FC9DF00294975 /* Swinject-iOS */, - 981ABE8A1B5FC9DF00294975 /* Swinject-iOSTests */, - 981899BB1B5FE63F00C702D0 /* Swinject-OSX */, - 981899C41B5FE63F00C702D0 /* Swinject-OSXTests */, - 985010C51BBE76D400A2CCFC /* Swinject-watchOS */, - 98689C7E1BBFC7A50005C6D3 /* Swinject-tvOS */, - 98689C871BBFC7A60005C6D3 /* Swinject-tvOSTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 981899BA1B5FE63F00C702D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981899C31B5FE63F00C702D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981ABE7F1B5FC9DF00294975 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981ABE891B5FC9DF00294975 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 985010C41BBE76D400A2CCFC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 98689C7D1BBFC7A50005C6D3 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 98689C861BBFC7A60005C6D3 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 98AEB3B11BE783DC0009F188 /* Run SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run SwiftLint"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n if which swiftlint >/dev/null; then\n swiftlint\n fi\nfi\n"; - }; - 98AEB3B51BE7848C0009F188 /* Run SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run SwiftLint"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n if which swiftlint >/dev/null; then\n swiftlint\n fi\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 981899B71B5FE63F00C702D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 983B98321C06ECB2006A23D4 /* SpinLock.swift in Sources */, - 985BAFAA1B625E0F0055F998 /* ServiceEntry.swift in Sources */, - CD3B32981DD6126E00B208A3 /* ObjectScope.Standard.swift in Sources */, - 9880E70F1C09EE2900ED5293 /* FunctionType.swift in Sources */, - 98B012C01B82F68E00053A32 /* Resolver.swift in Sources */, - CD3C2CE01D98E47000863421 /* DebugHelper.swift in Sources */, - 90B0297A1C185B1600A6A521 /* Assembler.swift in Sources */, - 90B029761C18599200A6A521 /* Assembly.swift in Sources */, - CD3B32931DD6123F00B208A3 /* InstanceStorage.swift in Sources */, - 984774F11C02F25D0092A757 /* SynchronizedResolver.swift in Sources */, - 981899E51B5FFE5800C702D0 /* Container.swift in Sources */, - 98B012B91B82D67300053A32 /* Container.Arguments.swift in Sources */, - 9884E2A81B60B77400120259 /* ServiceKey.swift in Sources */, - 984BE3141CDA3FCF00BCF2AC /* _Resolver.swift in Sources */, - 981970201B6145D600EEB942 /* ObjectScope.swift in Sources */, - CDBBACF71D9EAD60002F5EF9 /* Container.Logging.swift in Sources */, - 984774FB1C02F5A50092A757 /* SynchronizedResolver.Arguments.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981899C11B5FE63F00C702D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 90B029841C18670000A6A521 /* BasicAssembly.swift in Sources */, - 9855C5C61B689B7B00DADB0B /* Food.swift in Sources */, - 9855C5C91B689D9000DADB0B /* ServiceEntrySpec.swift in Sources */, - CD3C2CF31D98EF4A00863421 /* ContainerSpec.DebugHelper.swift in Sources */, - 984775001C034C5C0092A757 /* SynchronizedResolverSpec.swift in Sources */, - CD6A9F831EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift in Sources */, - CD3B329D1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift in Sources */, - 9848611D1B6F9B7000C07072 /* ContainerSpec.Arguments.swift in Sources */, - 9878C63D1B65CA8700CBEFEF /* Person.swift in Sources */, - CDD44AD81DEEED1000916595 /* WeakStorageSpec.swift in Sources */, - 9884E2AB1B60C51C00120259 /* ServiceKeySpec.swift in Sources */, - 90B0298C1C186D5300A6A521 /* LoadAwareAssembly.swift in Sources */, - 90B029801C18666200A6A521 /* AssemblerSpec.swift in Sources */, - 9878C6391B65C9E000CBEFEF /* Animal.swift in Sources */, - 981899E21B5FF88800C702D0 /* ContainerSpec.swift in Sources */, - 981577F21B675B7F00BF686B /* Circularity.swift in Sources */, - 9855C5C01B686F5900DADB0B /* ContainerSpec.Circularity.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981ABE7C1B5FC9DF00294975 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 983B98311C06ECB2006A23D4 /* SpinLock.swift in Sources */, - 90B029791C185B1600A6A521 /* Assembler.swift in Sources */, - 9880E70E1C09EE2900ED5293 /* FunctionType.swift in Sources */, - CD3B32971DD6126E00B208A3 /* ObjectScope.Standard.swift in Sources */, - 985BAFA91B625E0F0055F998 /* ServiceEntry.swift in Sources */, - 984774F01C02F25D0092A757 /* SynchronizedResolver.swift in Sources */, - CD3C2CDF1D98E47000863421 /* DebugHelper.swift in Sources */, - 98B012BF1B82F68E00053A32 /* Resolver.swift in Sources */, - CD3B32921DD6121500B208A3 /* InstanceStorage.swift in Sources */, - 981899E41B5FFE5800C702D0 /* Container.swift in Sources */, - 98B012B81B82D67300053A32 /* Container.Arguments.swift in Sources */, - 9884E2A71B60B77400120259 /* ServiceKey.swift in Sources */, - 9819701F1B6145D600EEB942 /* ObjectScope.swift in Sources */, - 984BE3131CDA3FCF00BCF2AC /* _Resolver.swift in Sources */, - 984774FA1C02F5A50092A757 /* SynchronizedResolver.Arguments.swift in Sources */, - CDBBACF61D9EAD60002F5EF9 /* Container.Logging.swift in Sources */, - 98E550C31DEF066300BE6304 /* UnavailableItems.swift in Sources */, - 90B029751C18599200A6A521 /* Assembly.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 981ABE871B5FC9DF00294975 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9855C5C51B689B7B00DADB0B /* Food.swift in Sources */, - 9855C5C81B689D9000DADB0B /* ServiceEntrySpec.swift in Sources */, - 9878C63C1B65CA8700CBEFEF /* Person.swift in Sources */, - CD3C2CF21D98EF4A00863421 /* ContainerSpec.DebugHelper.swift in Sources */, - 90B0298B1C186D5300A6A521 /* LoadAwareAssembly.swift in Sources */, - CD6A9F821EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift in Sources */, - CD3B329C1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift in Sources */, - 9848611C1B6F9B7000C07072 /* ContainerSpec.Arguments.swift in Sources */, - 90B0297F1C18666200A6A521 /* AssemblerSpec.swift in Sources */, - CDD44AD71DEEED1000916595 /* WeakStorageSpec.swift in Sources */, - 9884E2AA1B60C51C00120259 /* ServiceKeySpec.swift in Sources */, - 984774FF1C034C5C0092A757 /* SynchronizedResolverSpec.swift in Sources */, - 9878C6381B65C9E000CBEFEF /* Animal.swift in Sources */, - 90B029831C18670000A6A521 /* BasicAssembly.swift in Sources */, - 981899E11B5FF88800C702D0 /* ContainerSpec.swift in Sources */, - 981577F11B675B7F00BF686B /* Circularity.swift in Sources */, - 9855C5BF1B686F5900DADB0B /* ContainerSpec.Circularity.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 985010C11BBE76D400A2CCFC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 983B98331C06ECB2006A23D4 /* SpinLock.swift in Sources */, - 9880E7101C09EE2900ED5293 /* FunctionType.swift in Sources */, - 985011221BBE7E8900A2CCFC /* ObjectScope.swift in Sources */, - CD3B32991DD6126E00B208A3 /* ObjectScope.Standard.swift in Sources */, - 985011251BBE7E8900A2CCFC /* Resolver.swift in Sources */, - 9850111E1BBE7E8900A2CCFC /* Container.swift in Sources */, - CD3C2CE11D98E47000863421 /* DebugHelper.swift in Sources */, - 9850111F1BBE7E8900A2CCFC /* ServiceKey.swift in Sources */, - CD3B32941DD6123F00B208A3 /* InstanceStorage.swift in Sources */, - 90B0297B1C185B1600A6A521 /* Assembler.swift in Sources */, - 985011201BBE7E8900A2CCFC /* ServiceEntry.swift in Sources */, - 984BE3151CDA3FCF00BCF2AC /* _Resolver.swift in Sources */, - 985011241BBE7E8900A2CCFC /* Container.Arguments.swift in Sources */, - 984774F21C02F25D0092A757 /* SynchronizedResolver.swift in Sources */, - 90B029771C18599200A6A521 /* Assembly.swift in Sources */, - CDBBACF81D9EAD60002F5EF9 /* Container.Logging.swift in Sources */, - 984774FC1C02F5A50092A757 /* SynchronizedResolver.Arguments.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 98689C7A1BBFC7A50005C6D3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 90B0297D1C185B2200A6A521 /* Assembly.swift in Sources */, - 983B98341C06ECB2006A23D4 /* SpinLock.swift in Sources */, - 9880E7111C09EE2900ED5293 /* FunctionType.swift in Sources */, - CD3B329A1DD6126E00B208A3 /* ObjectScope.Standard.swift in Sources */, - 98689C9D1BBFC7EB0005C6D3 /* ObjectScope.swift in Sources */, - 984774F31C02F25D0092A757 /* SynchronizedResolver.swift in Sources */, - CD3C2CE21D98E47000863421 /* DebugHelper.swift in Sources */, - 98689CA01BBFC7EB0005C6D3 /* Resolver.swift in Sources */, - 98689C991BBFC7EB0005C6D3 /* Container.swift in Sources */, - CD3B32951DD6124000B208A3 /* InstanceStorage.swift in Sources */, - 98689C9A1BBFC7EB0005C6D3 /* ServiceKey.swift in Sources */, - 90B0297C1C185B1600A6A521 /* Assembler.swift in Sources */, - 98689C9B1BBFC7EB0005C6D3 /* ServiceEntry.swift in Sources */, - 984BE3161CDA3FCF00BCF2AC /* _Resolver.swift in Sources */, - 98689C9F1BBFC7EB0005C6D3 /* Container.Arguments.swift in Sources */, - CDBBACF91D9EAD60002F5EF9 /* Container.Logging.swift in Sources */, - 984774FD1C02F5A50092A757 /* SynchronizedResolver.Arguments.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 98689C841BBFC7A60005C6D3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 98689CBB1BBFD5110005C6D3 /* ContainerSpec.Arguments.swift in Sources */, - 98689CBE1BBFD5110005C6D3 /* ServiceEntrySpec.swift in Sources */, - 98689CBC1BBFD5110005C6D3 /* ContainerSpec.Circularity.swift in Sources */, - CD3C2CF41D98EF4A00863421 /* ContainerSpec.DebugHelper.swift in Sources */, - 98689CB61BBFD5110005C6D3 /* Person.swift in Sources */, - CD6A9F841EEFCB7A0087E851 /* ContainerSpec.CustomStringConvertible.swift in Sources */, - CD3B329E1DD61F2400B208A3 /* ContainerSpec.CustomScope.swift in Sources */, - 90B0298D1C186D5300A6A521 /* LoadAwareAssembly.swift in Sources */, - 98689CBA1BBFD5110005C6D3 /* ContainerSpec.swift in Sources */, - CDD44AD91DEEED1000916595 /* WeakStorageSpec.swift in Sources */, - 90B029811C18666200A6A521 /* AssemblerSpec.swift in Sources */, - 98689CBD1BBFD5110005C6D3 /* ServiceKeySpec.swift in Sources */, - 984775011C034C5C0092A757 /* SynchronizedResolverSpec.swift in Sources */, - 98689CB81BBFD5110005C6D3 /* Food.swift in Sources */, - 90B029851C18670000A6A521 /* BasicAssembly.swift in Sources */, - 98689CB71BBFD5110005C6D3 /* Animal.swift in Sources */, - 98689CB91BBFD5110005C6D3 /* Circularity.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 981899C81B5FE63F00C702D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 981899BB1B5FE63F00C702D0 /* Swinject-OSX */; - targetProxy = 981899C71B5FE63F00C702D0 /* PBXContainerItemProxy */; - }; - 981ABE8E1B5FC9DF00294975 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 981ABE801B5FC9DF00294975 /* Swinject-iOS */; - targetProxy = 981ABE8D1B5FC9DF00294975 /* PBXContainerItemProxy */; - }; - 98689C8B1BBFC7A60005C6D3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 98689C7E1BBFC7A50005C6D3 /* Swinject-tvOS */; - targetProxy = 98689C8A1BBFC7A60005C6D3 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 981899CD1B5FE64000C702D0 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA74591BB70CBB00E2F48A /* Mac-Framework.xcconfig */; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - INFOPLIST_FILE = Sources/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.Swinject"; - }; - name = Debug; - }; - 981899CE1B5FE64000C702D0 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA74591BB70CBB00E2F48A /* Mac-Framework.xcconfig */; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - INFOPLIST_FILE = Sources/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.Swinject"; - }; - name = Release; - }; - 981899CF1B5FE64000C702D0 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA74561BB70CBB00E2F48A /* Mac-Application.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Tests/SwinjectTests/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.SwinjectTests"; - PRODUCT_NAME = "$(PROJECT_NAME)Tests"; - }; - name = Debug; - }; - 981899D01B5FE64000C702D0 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA74561BB70CBB00E2F48A /* Mac-Application.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Tests/SwinjectTests/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.SwinjectTests"; - PRODUCT_NAME = "$(PROJECT_NAME)Tests"; - }; - name = Release; - }; - 981ABE931B5FC9DF00294975 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA74481BB70CBB00E2F48A /* Debug.xcconfig */; - buildSettings = { - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CURRENT_PROJECT_VERSION = 1; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = YES; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Debug; - }; - 981ABE941B5FC9DF00294975 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA744A1BB70CBB00E2F48A /* Release.xcconfig */; - buildSettings = { - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CURRENT_PROJECT_VERSION = 1; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = NO; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Release; - }; - 981ABE961B5FC9DF00294975 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA74531BB70CBB00E2F48A /* iOS-Framework.xcconfig */; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Sources/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.Swinject"; - }; - name = Debug; - }; - 981ABE971B5FC9DF00294975 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA74531BB70CBB00E2F48A /* iOS-Framework.xcconfig */; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Sources/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.Swinject"; - }; - name = Release; - }; - 981ABE991B5FC9DF00294975 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA74511BB70CBB00E2F48A /* iOS-Application.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Tests/SwinjectTests/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.SwinjectTests"; - PRODUCT_NAME = "$(PROJECT_NAME)Tests"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 981ABE9A1B5FC9DF00294975 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98AA74511BB70CBB00E2F48A /* iOS-Application.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Tests/SwinjectTests/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.SwinjectTests"; - PRODUCT_NAME = "$(PROJECT_NAME)Tests"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - 985010CC1BBE76D400A2CCFC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 985010BF1BBE76AB00A2CCFC /* watchOS-Framework.xcconfig */; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - INFOPLIST_FILE = Sources/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.Swinject"; - TARGETED_DEVICE_FAMILY = 4; - }; - name = Debug; - }; - 985010CD1BBE76D400A2CCFC /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 985010BF1BBE76AB00A2CCFC /* watchOS-Framework.xcconfig */; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - INFOPLIST_FILE = Sources/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.Swinject"; - TARGETED_DEVICE_FAMILY = 4; - }; - name = Release; - }; - 98689C911BBFC7A60005C6D3 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98689C781BBFC77F0005C6D3 /* tvOS-Framework.xcconfig */; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - INFOPLIST_FILE = Sources/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.Swinject"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Debug; - }; - 98689C921BBFC7A60005C6D3 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98689C781BBFC77F0005C6D3 /* tvOS-Framework.xcconfig */; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - INFOPLIST_FILE = Sources/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.Swinject"; - TARGETED_DEVICE_FAMILY = 3; - }; - name = Release; - }; - 98689C951BBFC7A60005C6D3 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98689C761BBFC77F0005C6D3 /* tvOS-Application.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/tvOS", - ); - INFOPLIST_FILE = Tests/SwinjectTests/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.SwinjectTests"; - PRODUCT_NAME = "$(PROJECT_NAME)Tests"; - }; - name = Debug; - }; - 98689C961BBFC7A60005C6D3 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98689C761BBFC77F0005C6D3 /* tvOS-Application.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/tvOS", - ); - INFOPLIST_FILE = Tests/SwinjectTests/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = "com.el-eleven.SwinjectTests"; - PRODUCT_NAME = "$(PROJECT_NAME)Tests"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 981899D11B5FE64000C702D0 /* Build configuration list for PBXNativeTarget "Swinject-OSX" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 981899CD1B5FE64000C702D0 /* Debug */, - 981899CE1B5FE64000C702D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 981899D21B5FE64000C702D0 /* Build configuration list for PBXNativeTarget "Swinject-OSXTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 981899CF1B5FE64000C702D0 /* Debug */, - 981899D01B5FE64000C702D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 981ABE7B1B5FC9DF00294975 /* Build configuration list for PBXProject "Swinject" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 981ABE931B5FC9DF00294975 /* Debug */, - 981ABE941B5FC9DF00294975 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 981ABE951B5FC9DF00294975 /* Build configuration list for PBXNativeTarget "Swinject-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 981ABE961B5FC9DF00294975 /* Debug */, - 981ABE971B5FC9DF00294975 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 981ABE981B5FC9DF00294975 /* Build configuration list for PBXNativeTarget "Swinject-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 981ABE991B5FC9DF00294975 /* Debug */, - 981ABE9A1B5FC9DF00294975 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 985010CB1BBE76D400A2CCFC /* Build configuration list for PBXNativeTarget "Swinject-watchOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 985010CC1BBE76D400A2CCFC /* Debug */, - 985010CD1BBE76D400A2CCFC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 98689C901BBFC7A60005C6D3 /* Build configuration list for PBXNativeTarget "Swinject-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 98689C911BBFC7A60005C6D3 /* Debug */, - 98689C921BBFC7A60005C6D3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 98689C941BBFC7A60005C6D3 /* Build configuration list for PBXNativeTarget "Swinject-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 98689C951BBFC7A60005C6D3 /* Debug */, - 98689C961BBFC7A60005C6D3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 981ABE781B5FC9DF00294975 /* Project object */; -} diff --git a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Swinject/Swinject.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-OSX.xcscheme b/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-OSX.xcscheme deleted file mode 100644 index 076c5dd..0000000 --- a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-OSX.xcscheme +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-iOS.xcscheme b/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-iOS.xcscheme deleted file mode 100644 index 5e0f52e..0000000 --- a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-iOS.xcscheme +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-tvOS.xcscheme b/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-tvOS.xcscheme deleted file mode 100644 index e26f127..0000000 --- a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-tvOS.xcscheme +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-watchOS.xcscheme b/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-watchOS.xcscheme deleted file mode 100644 index da91c1b..0000000 --- a/Carthage/Checkouts/Swinject/Swinject.xcodeproj/xcshareddata/xcschemes/Swinject-watchOS.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/Swinject/Tests/LinuxMain.swift b/Carthage/Checkouts/Swinject/Tests/LinuxMain.swift deleted file mode 100755 index 3c4f3bb..0000000 --- a/Carthage/Checkouts/Swinject/Tests/LinuxMain.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// LinuxMain.swift -// Swinject -// -// Created by Yoichi Tagaya on 11/25/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// - -import XCTest -import Quick - -@testable import SwinjectTests - -Quick.QCKMain([ - AssemblerSpec.self, - ContainerSpec.self, - ContainerSpec_Arguments.self, - ContainerSpec_Circularity.self, - ContainerSpec_DebugHelper.self, - ContainerSpec_CustomScope.self, - SynchronizedResolverSpec.self, - ServiceKeySpec.self, - ServiceEntrySpec.self -]) diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Animal.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Animal.swift deleted file mode 100644 index c434737..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Animal.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// Animal.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/27/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -import Foundation - -internal protocol Animal { - var name: String? { get set } -} - -internal class Cat: Animal { - var name: String? - var sleeping = false - var favoriteFood: Food? - - init() { - } - - init(name: String) { - self.name = name - } - - init(name: String, sleeping: Bool) { - self.name = name - self.sleeping = sleeping - } -} - -internal class Siamese: Cat { -} - -internal class Dog: Animal { - var name: String? - - init() { - } - - init(name: String) { - self.name = name - } -} - -internal struct Turtle: Animal { - var name: String? -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/AssemblerSpec.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/AssemblerSpec.swift deleted file mode 100644 index a57f04e..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/AssemblerSpec.swift +++ /dev/null @@ -1,275 +0,0 @@ -// -// AssemblerSpec.swift -// Swinject -// -// Created by mike.owens on 12/9/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Foundation -import Quick -import Nimble -import Swinject - -class AssemblerSpec: QuickSpec { - override func spec() { - - describe("Assembler basic init") { - it("can assembly a single container") { - let assembler = Assembler([ - AnimalAssembly() - ]) - let cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Whiskers" - - let sushi = assembler.resolver.resolve(Food.self) - expect(sushi).to(beNil()) - } - - it("can assembly a container with nil parent") { - let assembler = Assembler(parentAssembler: nil) - - let sushi = assembler.resolver.resolve(Food.self) - expect(sushi).to(beNil()) - } - - it("can assembly a container with nil parent and assemblies") { - let assembler = Assembler([ - AnimalAssembly() - ], parent: nil) - let cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Whiskers" - - let sushi = assembler.resolver.resolve(Food.self) - expect(sushi).to(beNil()) - } - - it("can assembly a multiple container") { - let assembler = Assembler([ - AnimalAssembly(), - FoodAssembly() - ]) - let cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Whiskers" - - let sushi = assembler.resolver.resolve(Food.self) - expect(sushi).toNot(beNil()) - expect(sushi is Sushi) == true - } - - it("can assembly a multiple container with inter dependencies") { - let assembler = Assembler([ - AnimalAssembly(), - FoodAssembly(), - PersonAssembly() - ]) - let petOwner = assembler.resolver.resolve(PetOwner.self) - expect(petOwner).toNot(beNil()) - - let cat = petOwner!.pet - expect(cat).toNot(beNil()) - expect(cat!.name) == "Whiskers" - - let sushi = petOwner!.favoriteFood - expect(sushi).toNot(beNil()) - expect(sushi is Sushi) == true - } - - it("can assembly a multiple container with inter dependencies in any order") { - let assembler = Assembler([ - PersonAssembly(), - AnimalAssembly(), - FoodAssembly() - ]) - let petOwner = assembler.resolver.resolve(PetOwner.self) - expect(petOwner).toNot(beNil()) - - let cat = petOwner!.pet - expect(cat).toNot(beNil()) - expect(cat!.name) == "Whiskers" - - let sushi = petOwner!.favoriteFood - expect(sushi).toNot(beNil()) - expect(sushi is Sushi) == true - } - } - - describe("Assembler lazy build") { - it("can assembly a single container") { - let assembler = Assembler([]) - var cat = assembler.resolver.resolve(Animal.self) - expect(cat).to(beNil()) - - assembler.apply(assembly: AnimalAssembly()) - - cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Whiskers" - } - - it("can assembly a single load aware container") { - let assembler = Assembler([]) - var cat = assembler.resolver.resolve(Animal.self) - expect(cat).to(beNil()) - - let loadAwareAssembly = LoadAwareAssembly { resolver in - let cat = resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Bojangles" - } - - expect(loadAwareAssembly.loaded) == false - assembler.apply(assembly: loadAwareAssembly) - expect(loadAwareAssembly.loaded) == true - - cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Bojangles" - } - - it("can assembly a multiple containers 1 by 1") { - let assembler = Assembler([]) - var cat = assembler.resolver.resolve(Animal.self) - expect(cat).to(beNil()) - - var sushi = assembler.resolver.resolve(Food.self) - expect(sushi).to(beNil()) - - assembler.apply(assembly: AnimalAssembly()) - - cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Whiskers" - - sushi = assembler.resolver.resolve(Food.self) - expect(sushi).to(beNil()) - - assembler.apply(assembly: FoodAssembly()) - - sushi = assembler.resolver.resolve(Food.self) - expect(sushi).toNot(beNil()) - } - - it("can assembly a multiple containers at once") { - let assembler = Assembler([]) - var cat = assembler.resolver.resolve(Animal.self) - expect(cat).to(beNil()) - - var sushi = assembler.resolver.resolve(Food.self) - expect(sushi).to(beNil()) - - assembler.apply(assemblies: [ - AnimalAssembly(), - FoodAssembly() - ]) - - cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Whiskers" - - sushi = assembler.resolver.resolve(Food.self) - expect(sushi).toNot(beNil()) - } - } - - describe("Assembler load aware") { - it("can assembly a single container") { - let loadAwareAssembly = LoadAwareAssembly { resolver in - let cat = resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Bojangles" - } - - expect(loadAwareAssembly.loaded) == false - let assembler = Assembler([ - loadAwareAssembly - ]) - expect(loadAwareAssembly.loaded) == true - - let cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Bojangles" - } - - it("can assembly a multiple container") { - let loadAwareAssembly = LoadAwareAssembly { resolver in - let cat = resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Bojangles" - - let sushi = resolver.resolve(Food.self) - expect(sushi).toNot(beNil()) - } - - expect(loadAwareAssembly.loaded) == false - let assembler = Assembler([ - loadAwareAssembly, - FoodAssembly() - ]) - expect(loadAwareAssembly.loaded) == true - - let cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Bojangles" - - let sushi = assembler.resolver.resolve(Food.self) - expect(sushi).toNot(beNil()) - } - } - - describe("Empty Assembler") { - it("can create an empty assembler and build it") { - let assembler = Assembler() - - var cat = assembler.resolver.resolve(Animal.self) - expect(cat).to(beNil()) - - assembler.apply(assembly: AnimalAssembly()) - - cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - expect(cat!.name) == "Whiskers" - } - } - - describe("Child Assembler") { - it("can be empty") { - let assembler = Assembler([ - AnimalAssembly() - ]) - - let childAssembler = Assembler(parentAssembler: assembler) - - let cat = assembler.resolver.resolve(Animal.self) - expect(cat).toNot(beNil()) - - let sushi = assembler.resolver.resolve(Food.self) - expect(sushi).to(beNil()) - - let childCat = childAssembler.resolver.resolve(Animal.self) - expect(childCat).toNot(beNil()) - - let childSushi = childAssembler.resolver.resolve(Food.self) - expect(childSushi).to(beNil()) - } - - it("can't give entities to parent") { - let assembler = Assembler() - let childAssembler = Assembler([ - AnimalAssembly() - ], parent: assembler) - - let cat = assembler.resolver.resolve(Animal.self) - expect(cat).to(beNil()) - - let childCat = childAssembler.resolver.resolve(Animal.self) - expect(childCat).toNot(beNil()) - } - } - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/BasicAssembly.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/BasicAssembly.swift deleted file mode 100644 index 575010a..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/BasicAssembly.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// BasicAssembly.swift -// Swinject -// -// Created by mike.owens on 12/9/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -import Swinject - -class AnimalAssembly: Assembly { - - func assemble(container: Container) { - container.register(Animal.self) { _ in - return Cat(name: "Whiskers") - } - } -} - -class FoodAssembly: Assembly { - - func assemble(container: Container) { - container.register(Food.self) { _ in - return Sushi() - } - } -} - -class PersonAssembly: Assembly { - - func assemble(container: Container) { - container.register(PetOwner.self) { r in - let definition = PetOwner() - definition.favoriteFood = r.resolve(Food.self) - definition.pet = r.resolve(Animal.self) - return definition - } - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Circularity.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Circularity.swift deleted file mode 100644 index c35fe5c..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Circularity.swift +++ /dev/null @@ -1,73 +0,0 @@ -// -// Circularity.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/28/15. -// Copyright (c) 2015 Swinject Contributors. All rights reserved. -// - -import Foundation - -// MARK: Circular dependency of two objects -internal protocol ParentProtocol: AnyObject { } -internal protocol ChildProtocol: AnyObject { } - -internal class Parent: ParentProtocol { - var child: ChildProtocol? - - init() { - } - - init(child: ChildProtocol) { - self.child = child - } -} - -internal class Child: ChildProtocol { - weak var parent: ParentProtocol? -} - -// MARK: - Circular dependency of more than two objects -internal protocol A: AnyObject { } -internal protocol B: AnyObject { } -internal protocol C: AnyObject { } -internal protocol D: AnyObject { } - -internal class ADependingOnB: A { - var b: B? - - init() { - } - - init(b: B) { - self.b = b - } -} - -internal class BDependingOnC: B { - var c: C? - - init() { - } - - init(c: C) { - self.c = c - } -} - -internal class CDependingOnAD: C { - weak var a: A? - var d: D? - - init() { - } - - init(d: D) { - self.d = d - } -} - -internal class DDependingOnBC: D { - weak var b: B? - weak var c: C? -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.Arguments.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.Arguments.swift deleted file mode 100644 index 5647482..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.Arguments.swift +++ /dev/null @@ -1,104 +0,0 @@ -// -// ContainerSpec.Arguments.swift -// Swinject -// -// Created by Yoichi Tagaya on 8/3/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Quick -import Nimble -@testable import Swinject - -class ContainerSpec_Arguments: QuickSpec { - override func spec() { - var container: Container! - beforeEach { - container = Container() - } - - it("accepts 1 argument.") { - container.register(Animal.self) { _, arg1 in - Cat(name: arg1) - } - let animal = container.resolve( - Animal.self, - argument: "1")! - expect(animal.name) == "1" - } - it("accepts 2 arguments.") { - container.register(Animal.self) { _, arg1, arg2 in - Cat(name: arg1 + arg2) - } - let animal = container.resolve( - Animal.self, - arguments: "1", "2")! - expect(animal.name) == "12" - } - it("accepts 3 arguments.") { - container.register(Animal.self) { _, arg1, arg2, arg3 in - Cat(name: arg1 + arg2 + arg3) - } - let animal = container.resolve( - Animal.self, - arguments: "1", "2", "3")! - expect(animal.name) == "123" - } - it("accepts 4 arguments.") { - container.register(Animal.self) { _, arg1, arg2, arg3, arg4 in - Cat(name: arg1 + arg2 + arg3 + arg4) - } - let animal = container.resolve( - Animal.self, - arguments: "1", "2", "3", "4")! - expect(animal.name) == "1234" - } - it("accepts 5 arguments.") { - container.register(Animal.self) { _, arg1, arg2, arg3, arg4, arg5 in - Cat(name: arg1 + arg2 + arg3 + arg4 + arg5) - } - let animal = container.resolve( - Animal.self, - arguments: "1", "2", "3", "4", "5")! - expect(animal.name) == "12345" - } - it("accepts 6 arguments.") { - container.register(Animal.self) { _, arg1, arg2, arg3, arg4, arg5, arg6 in - Cat(name: arg1 + arg2 + arg3 + arg4 + arg5 + arg6) - } - let animal = container.resolve( - Animal.self, - arguments: "1", "2", "3", "4", "5", "6")! - expect(animal.name) == "123456" - } - it("accepts 7 arguments.") { - container.register(Animal.self) { _, arg1, arg2, arg3, arg4, arg5, arg6, arg7 in - Cat(name: arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7) - } - let animal = container.resolve( - Animal.self, - arguments: "1", "2", "3", "4", "5", "6", "7")! - expect(animal.name) == "1234567" - } - it("accepts 8 arguments.") { - container.register(Animal.self) { _, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 in - Cat(name: arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8) - } - let animal = container.resolve( - Animal.self, - arguments: "1", "2", "3", "4", "5", "6", "7", "8")! - expect(animal.name) == "12345678" - } - it("accepts 9 arguments.") { - container.register(Animal.self) { _, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 in - Cat(name: arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9) - } - let animal = container.resolve( - Animal.self, - arguments: "1", "2", "3", "4", "5", "6", "7", "8", "9")! - expect(animal.name) == "123456789" - } - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.Circularity.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.Circularity.swift deleted file mode 100644 index 49748e3..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.Circularity.swift +++ /dev/null @@ -1,126 +0,0 @@ -// -// ContainerSpec.Circularity.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/29/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Quick -import Nimble -@testable import Swinject - -class ContainerSpec_Circularity: QuickSpec { - override func spec() { - var container: Container! - beforeEach { - container = Container() - } - - describe("Two objects") { - it("resolves circular dependency on each property.") { - let runInObjectScope: (ObjectScope) -> Void = { scope in - container.removeAll() - container.register(ParentProtocol.self) { _ in Parent() } - .initCompleted { r, s in - let parent = s as! Parent - parent.child = r.resolve(ChildProtocol.self) - } - .inObjectScope(scope) - container.register(ChildProtocol.self) { _ in Child() } - .initCompleted { r, s in - let child = s as! Child - child.parent = r.resolve(ParentProtocol.self)! - } - .inObjectScope(scope) - - let parent = container.resolve(ParentProtocol.self) as! Parent - let child = parent.child as! Child - expect(child.parent as? Parent === parent).to(beTrue()) // Workaround for crash in Nimble - } - - runInObjectScope(.graph) - runInObjectScope(.container) - } - it("resolves circular dependency on the initializer and property.") { - let runInObjectScope: (ObjectScope) -> Void = { scope in - container.removeAll() - container.register(ParentProtocol.self) { r in Parent(child: r.resolve(ChildProtocol.self)!) } - .inObjectScope(scope) - container.register(ChildProtocol.self) { _ in Child() } - .initCompleted { r, s in - let child = s as! Child - child.parent = r.resolve(ParentProtocol.self) - } - .inObjectScope(scope) - - let parent = container.resolve(ParentProtocol.self) as! Parent - let child = parent.child as! Child - expect(child.parent as? Parent === parent).to(beTrue()) // Workaround for crash in Nimble - } - - runInObjectScope(.graph) - runInObjectScope(.container) - } - } - describe("More than two objects") { - it("resolves circular dependency on properties.") { - container.register(A.self) { _ in ADependingOnB() } - .initCompleted { - let a = $1 as! ADependingOnB - a.b = $0.resolve(B.self) - } - container.register(B.self) { _ in BDependingOnC() } - .initCompleted { - let b = $1 as! BDependingOnC - b.c = $0.resolve(C.self) - } - container.register(C.self) { _ in CDependingOnAD() } - .initCompleted { - let c = $1 as! CDependingOnAD - c.a = $0.resolve(A.self) - c.d = $0.resolve(D.self) - } - container.register(D.self) { _ in DDependingOnBC() } - .initCompleted { - let d = $1 as! DDependingOnBC - d.b = $0.resolve(B.self) - d.c = $0.resolve(C.self) - } - - let a = container.resolve(A.self) as! ADependingOnB - let b = a.b as! BDependingOnC - let c = b.c as! CDependingOnAD - let d = c.d as! DDependingOnBC - expect(c.a as? ADependingOnB === a).to(beTrue()) // Workaround for crash in Nimble - expect(d.b as? BDependingOnC === b).to(beTrue()) // Workaround for crash in Nimble - expect(d.c as? CDependingOnAD === c).to(beTrue()) // Workaround for crash in Nimble - } - it("resolves circular dependency on initializers and properties.") { - container.register(A.self) { r in ADependingOnB(b: r.resolve(B.self)!) } - container.register(B.self) { r in BDependingOnC(c: r.resolve(C.self)!) } - container.register(C.self) { r in CDependingOnAD(d: r.resolve(D.self)!) } - .initCompleted { - let c = $1 as! CDependingOnAD - c.a = $0.resolve(A.self) - } - container.register(D.self) { _ in DDependingOnBC() } - .initCompleted { - let d = $1 as! DDependingOnBC - d.b = $0.resolve(B.self) - d.c = $0.resolve(C.self) - } - - let a = container.resolve(A.self) as! ADependingOnB - let b = a.b as! BDependingOnC - let c = b.c as! CDependingOnAD - let d = c.d as! DDependingOnBC - expect(c.a as? ADependingOnB === a).to(beTrue()) // Workaround for crash in Nimble - expect(d.b as? BDependingOnC === b).to(beTrue()) // Workaround for crash in Nimble - expect(d.c as? CDependingOnAD === c).to(beTrue()) // Workaround for crash in Nimble - } - } - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.CustomScope.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.CustomScope.swift deleted file mode 100644 index 1c20f39..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.CustomScope.swift +++ /dev/null @@ -1,93 +0,0 @@ -// -// ContainerSpec.CustomScope.swift -// Swinject -// -// Created by Jakub Vaňo on 11/11/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Quick -import Nimble -@testable import Swinject - -class ContainerSpec_CustomScope: QuickSpec { - override func spec() { - var container: Container! - beforeEach { - container = Container() - } - - describe("Resolving from custom scope") { - it("creates new instance storage for each service") { - var instances = 0 - let custom = ObjectScope(storageFactory: { instances += 1; return FakeStorage() }) - - container.register(Int.self) { _ in 0 }.inObjectScope(custom) - container.register(Double.self) { _ in 0}.inObjectScope(custom) - _ = container.resolve(Int.self) - _ = container.resolve(Double.self) - - expect(instances) == 2 - } - it("stores instance to storage during resolution") { - let storage = FakeStorage() - let custom = ObjectScope(storageFactory: { storage }) - - container.register(Int.self) { _ in 42 }.inObjectScope(custom) - _ = container.resolve(Int.self) - - expect(storage.instance as? Int) == 42 - } - it("returns stored instance if storage is not empty") { - let storage = FakeStorage() - let custom = ObjectScope(storageFactory: { storage }) - - container.register(Int.self) { _ in 0 }.inObjectScope(custom) - storage.instance = 42 - let result = container.resolve(Int.self) - - expect(result) == 42 - } - } - describe("Resetting scope") { - it("removes instance from services in given scope") { - let storage = FakeStorage() - let custom = ObjectScope(storageFactory: { storage }) - - container.register(Int.self) { _ in 0}.inObjectScope(custom) - storage.instance = 42 - container.resetObjectScope(custom) - - expect(storage.instance).to(beNil()) - } - it("does not remove instances from other scopes") { - let storage = FakeStorage() - let custom1 = ObjectScope(storageFactory: { storage }) - let custom2 = ObjectScope(storageFactory: FakeStorage.init) - - container.register(Int.self) { _ in 0}.inObjectScope(custom1) - storage.instance = 42 - container.resetObjectScope(custom2) - - expect(storage.instance as? Int) == 42 - } - it("removes instance from service registered in parent container") { - let storage = FakeStorage() - let custom = ObjectScope(storageFactory: { storage }) - let child = Container(parent: container) - - container.register(Int.self) { _ in 0 }.inObjectScope(custom) - storage.instance = 42 - child.resetObjectScope(custom) - - expect(storage.instance).to(beNil()) - } - } - } -} - -private class FakeStorage: InstanceStorage { - var instance: Any? -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.CustomStringConvertible.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.CustomStringConvertible.swift deleted file mode 100644 index 955cb0a..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.CustomStringConvertible.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// ContainerSpec.CustomStringConvertible.swift -// Swinject -// -// Created by Jakub Vaňo on 13/06/2017. -// Copyright © 2017 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length -// swiftlint:disable line_length - -import Quick -import Nimble -@testable import Swinject - -class ContainerSpec_CustomStringConvertible: QuickSpec { - override func spec() { - var container: Container! - beforeEach { - container = Container() - } - - it("describes empty description without service registrations.") { - expect(container.description) == "[\n]" - } - it("describes a registration.") { - container.register(Animal.self) { _ in Cat() } - - expect(container.description) == - "[\n" - + " { Service: Animal, Factory: (Resolver) -> Animal, ObjectScope: graph }\n" - + "]" - } - it("describes a registration with name.") { - container.register(Animal.self, name: "My Cat") { _ in Cat() } - - expect(container.description) == - "[\n" - + " { Service: Animal, Name: \"My Cat\", Factory: (Resolver) -> Animal, ObjectScope: graph }\n" - + "]" - } - it("describes a registration with arguments.") { - container.register(Animal.self) { _, arg1, arg2 in Cat(name: arg1, sleeping: arg2) } - - expect(container.description) == - "[\n" - + " { Service: Animal, Factory: (Resolver, String, Bool) -> Animal, ObjectScope: graph }\n" - + "]" - } - it("describes a registration with a specified object scope.") { - container.register(Animal.self) { _ in Cat() } - .inObjectScope(.container) - - expect(container.description) == - "[\n" - + " { Service: Animal, Factory: (Resolver) -> Animal, ObjectScope: container }\n" - + "]" - } - it("describes a registration with initCompleted.") { - container.register(Animal.self) { _ in Cat() } - .initCompleted { _, _ in } - - expect(container.description) == - "[\n" - + " { Service: Animal, Factory: (Resolver) -> Animal, ObjectScope: graph, InitCompleted: Specified }\n" - + "]" - } - it("describes multiple registrations.") { - container.register(Animal.self, name: "1") { _ in Cat() } - container.register(Animal.self, name: "2") { _ in Cat() } - - expect(container.description) == - "[\n" - + " { Service: Animal, Name: \"1\", Factory: (Resolver) -> Animal, ObjectScope: graph },\n" - + " { Service: Animal, Name: \"2\", Factory: (Resolver) -> Animal, ObjectScope: graph }\n" - + "]" - } - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.DebugHelper.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.DebugHelper.swift deleted file mode 100644 index 00149c4..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.DebugHelper.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// ContainerSpec.DebugHelper.swift -// Swinject -// -// Created by Jakub Vaňo on 26/09/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Quick -import Nimble -@testable import Swinject - -class ContainerSpec_DebugHelper: QuickSpec { - override func spec() { - var spy: DebugHelperSpy! - beforeEach { spy = DebugHelperSpy() } - - describe("resolution fails") { - it("should call debug helper with failing service and key") { - let container = Container(debugHelper: spy) - - _ = container._resolve(name: "name") { (_: Int, _: Int) in return 1 as Double } - - expect("\(spy.serviceType)") == "Double" - expect(spy.key) == ServiceKey(factoryType: (Int, Int).self, name: "name", option: nil) - } - - it("should call helper with all registrations") { - let container = Container(debugHelper: spy) - container.register(Int.self) { _ in 0 } - container.register(Double.self) { _ in 0} - - _ = container.resolve(String.self) - - expect(spy.availableRegistrations?.count) == 2 - } - - context("has parent container") { - it("should call helper with parent registrations") { - let parent = Container() - parent.register(Int.self) { _ in 0 } - let container = Container(parent: parent, debugHelper: spy) - container.register(Double.self) { _ in 0 } - - _ = container.resolve(String.self) - - expect(spy.availableRegistrations?.count) == 2 - } - } - } - } -} - -private class DebugHelperSpy: DebugHelper { - - var serviceType: Any = "" - var key: ServiceKey? - var availableRegistrations: [ServiceKey : ServiceEntryProtocol]? - - func resolutionFailed( - serviceType: Service.Type, - key: ServiceKey, - availableRegistrations: [ServiceKey : ServiceEntryProtocol] - ) { - self.serviceType = serviceType - self.key = key - self.availableRegistrations = availableRegistrations - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.swift deleted file mode 100644 index 8bec53f..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ContainerSpec.swift +++ /dev/null @@ -1,343 +0,0 @@ -// -// ContainerSpec.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/23/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Quick -import Nimble -@testable import Swinject - -class ContainerSpec: QuickSpec { - override func spec() { - var container: Container! - beforeEach { - container = Container() - } - - describe("Resolution of a non-registered service") { - it("returns nil.") { - let animal = container.resolve(Animal.self) - expect(animal).to(beNil()) - } - } - describe("Resolution of the same service") { - it("resolves by arguments.") { - container.register(Animal.self) { _ in Cat() } - container.register(Animal.self) { _, arg in Cat(name: arg) } - container.register(Animal.self) { _, arg1, arg2 in Cat(name: arg1, sleeping: arg2) } - - let noname = container.resolve(Animal.self) as! Cat - let mimi = container.resolve(Animal.self, argument: "Mimi") as! Cat - let mew = container.resolve(Animal.self, arguments: "Mew", true) as! Cat - expect(noname.name).to(beNil()) - expect(mimi.name) == "Mimi" - expect(mew.name) == "Mew" - expect(mew.sleeping) == true - } - it("resolves by the registered name.") { - container.register(Animal.self, name: "RegMimi") { _ in Cat(name: "Mimi") } - container.register(Animal.self, name: "RegMew") { _ in Cat(name: "Mew") } - container.register(Animal.self) { _ in Cat() } - - let mimi = container.resolve(Animal.self, name: "RegMimi") as! Cat - let mew = container.resolve(Animal.self, name: "RegMew") as! Cat - let noname = container.resolve(Animal.self) as! Cat - expect(mimi.name) == "Mimi" - expect(mew.name) == "Mew" - expect(noname.name).to(beNil()) - } - } - describe("Removal of registered services") { - it("can remove all registered services.") { - container.register(Animal.self, name: "RegMimi") { _ in Cat(name: "Mimi") } - container.register(Animal.self, name: "RegMew") { _ in Cat(name: "Mew") } - container.removeAll() - - let mimi = container.resolve(Animal.self, name: "RegMimi") - let mew = container.resolve(Animal.self, name: "RegMew") - expect(mimi).to(beNil()) - expect(mew).to(beNil()) - } - } - describe("Container hierarchy") { - it("resolves a service registered on the parent container.") { - let parent = Container() - parent.register(Animal.self) { _ in Cat() } - let child = Container(parent: parent) - - let cat = child.resolve(Animal.self) - expect(cat).notTo(beNil()) - } - it("does not resolve a service registred on the child container.") { - let parent = Container() - let child = Container(parent: parent) - child.register(Animal.self) { _ in Cat() } - - let cat = parent.resolve(Animal.self) - expect(cat).to(beNil()) - } - } - describe("Scope") { - let registerCatAndPetOwnerDependingOnFood: (Container) -> Void = { - $0.register(Animal.self) { - let cat = Cat() - cat.favoriteFood = $0.resolve(Food.self) - return cat - } - $0.register(Person.self) { - let owner = PetOwner(pet: $0.resolve(Animal.self)!) - owner.favoriteFood = $0.resolve(Food.self) - return owner - } - } - - context("in transient scope") { - it("does not have a shared object in a container.") { - container.register(Animal.self) { _ in Cat() } - .inObjectScope(.transient) - - let cat1 = container.resolve(Animal.self) as! Cat - let cat2 = container.resolve(Animal.self) as! Cat - expect(cat1 !== cat2).to(beTrue()) // Workaround for crash in Nimble. - } - it("resolves a service to new objects in a graph") { - registerCatAndPetOwnerDependingOnFood(container) - container.register(Food.self) { _ in Sushi() } - .inObjectScope(.transient) - - let owner = container.resolve(Person.self) as! PetOwner - let ownersSushi = owner.favoriteFood as! Sushi - let catsSushi = (owner.pet as! Cat).favoriteFood as! Sushi - expect(ownersSushi !== catsSushi).to(beTrue()) // Workaround for crash in Nimble. - } - } - context("in graph scope") { - it("does not have a shared object in a container.") { - container.register(Animal.self) { _ in Cat() } - .inObjectScope(.graph) - - let cat1 = container.resolve(Animal.self) as! Cat - let cat2 = container.resolve(Animal.self) as! Cat - expect(cat1 !== cat2).to(beTrue()) // Workaround for crash in Nimble. - } - it("resolves a service to the same object in a graph") { - registerCatAndPetOwnerDependingOnFood(container) - container.register(Food.self) { _ in Sushi() } - .inObjectScope(.graph) - - let owner = container.resolve(Person.self) as! PetOwner - let ownersSushi = owner.favoriteFood as! Sushi - let catsSushi = (owner.pet as! Cat).favoriteFood as! Sushi - expect(ownersSushi === catsSushi).to(beTrue()) // Workaround for crash in Nimble. - } - } - context("in container scope") { - it("shares an object in the own container.") { - container.register(Animal.self) { _ in Cat() } - .inObjectScope(.container) - - let cat1 = container.resolve(Animal.self) as! Cat - let cat2 = container.resolve(Animal.self) as! Cat - expect(cat1 === cat2).to(beTrue()) // Workaround for crash in Nimble. - } - it("shares an object from a parent container to its child.") { - let parent = Container() - parent.register(Animal.self) { _ in Cat() } - .inObjectScope(.container) - parent.register(Animal.self, name: "dog") { _ in Dog() } - .inObjectScope(.container) - let child = Container(parent: parent) - - // Case resolving on the parent first. - let cat1 = parent.resolve(Animal.self) as! Cat - let cat2 = child.resolve(Animal.self) as! Cat - expect(cat1 === cat2).to(beTrue()) // Workaround for crash in Nimble. - - // Case resolving on the child first. - let dog1 = child.resolve(Animal.self, name: "dog") as! Dog - let dog2 = parent.resolve(Animal.self, name: "dog") as! Dog - expect(dog1 === dog2).to(beTrue()) // Workaround for crash in Nimble. - } - it("resolves a service in the parent container to the same object in a graph") { - let parent = Container() - parent.register(Food.self) { _ in Sushi() } - .inObjectScope(.container) - let child = Container(parent: parent) - registerCatAndPetOwnerDependingOnFood(child) - - let owner = child.resolve(Person.self) as! PetOwner - let ownersSushi = owner.favoriteFood as! Sushi - let catsSushi = (owner.pet as! Cat).favoriteFood as! Sushi - expect(ownersSushi === catsSushi).to(beTrue()) // Workaround for crash in Nimble. - } - } - context("in weak scope") { - it("shares the object in the container") { - container.register(Animal.self) { _ in Cat() } - .inObjectScope(.weak) - - let cat1 = container.resolve(Animal.self) as! Cat - let cat2 = container.resolve(Animal.self) as! Cat - expect(cat1).notTo(beNil()) - expect(cat1 === cat2).to(beTrue()) // Workaround for crash in Nimble. - } - it("does not maintain a strong reference to the object") { - container.register(Animal.self) { _ in Cat() } - .inObjectScope(.weak) - - weak var cat = container.resolve(Animal.self) as? Cat - expect(cat).to(beNil()) - } - } - } - describe("Init completed event") { - it("raises the event when a new instance is created.") { - var eventRaised = false - container.register(Animal.self) { _ in Cat() } - .initCompleted { _, _ in eventRaised = true } - - let cat = container.resolve(Animal.self) - expect(cat).notTo(beNil()) - expect(eventRaised) == true - } - } - describe("Injection types") { - it("accepts initializer injection.") { - container.register(Animal.self) { _ in Cat() } - container.register(Person.self) { r in PetOwner(pet: r.resolve(Animal.self)!) } - - let owner = container.resolve(Person.self) as! PetOwner - expect(owner.pet).notTo(beNil()) - } - it("accepts property injection in registration.") { - container.register(Animal.self) { _ in Cat() } - container.register(Person.self) { r in - let owner = PetOwner() - owner.pet = r.resolve(Animal.self)! - return owner - } - - let owner = container.resolve(Person.self) as! PetOwner - expect(owner.pet).notTo(beNil()) - } - it("accepts property injection in initCompleted event.") { - container.register(Animal.self) { _ in Cat() } - container.register(Person.self) { _ in PetOwner() } - .initCompleted { r, s in - let owner = s as! PetOwner - owner.pet = r.resolve(Animal.self)! - } - - let owner = container.resolve(Person.self) as! PetOwner - expect(owner.pet).notTo(beNil()) - } - it("accepts method injection in registration.") { - container.register(Animal.self) { _ in Cat() } - container.register(Person.self) { r in - let owner = PetOwner() - owner.injectAnimal(r.resolve(Animal.self)!) - return owner - } - - let owner = container.resolve(Person.self) as! PetOwner - expect(owner.pet).notTo(beNil()) - } - it("accepts method injection in initCompleted event.") { - container.register(Animal.self) { _ in Cat() } - container.register(Person.self) { _ in PetOwner() } - .initCompleted { r, s in - let owner = s as! PetOwner - owner.injectAnimal(r.resolve(Animal.self)!) - } - - let owner = container.resolve(Person.self) as! PetOwner - expect(owner.pet).notTo(beNil()) - } - } - describe("Value type resolution") { - it("resolves struct instances ignoring object scopes.") { - let runInObjectScope: (ObjectScope) -> Void = { scope in - container.removeAll() - container.register(Animal.self) { _ in Turtle(name: "Ninja") } - .inObjectScope(scope) - var turtle1 = container.resolve(Animal.self)! - var turtle2 = container.resolve(Animal.self)! - turtle1.name = "Samurai" - expect(turtle1.name) == "Samurai" - expect(turtle2.name) == "Ninja" - } - - runInObjectScope(.transient) - runInObjectScope(.graph) - runInObjectScope(.container) - } - it("resolves struct instances defined in the parent container ignoring object scopes.") { - let runInObjectScope: (ObjectScope) -> Void = { scope in - container.removeAll() - container.register(Animal.self) { _ in Turtle(name: "Ninja") } - .inObjectScope(scope) - let childContainer = Container(parent: container) - - var turtle1 = childContainer.resolve(Animal.self)! - var turtle2 = childContainer.resolve(Animal.self)! - turtle1.name = "Samurai" - expect(turtle1.name) == "Samurai" - expect(turtle2.name) == "Ninja" - } - - runInObjectScope(.transient) - runInObjectScope(.graph) - runInObjectScope(.container) - } - context("object scope is container or hierarchy") { - it("resolves only once to simulate singleton (instantiation only once).") { - let runInObjectScope: (ObjectScope, Int) -> Void = { scope, expectation in - var invokedCount = 0 - container.removeAll() - container.register(Animal.self) { _ in - invokedCount += 1 - return Turtle(name: "Ninja") - }.inObjectScope(scope) - _ = container.resolve(Animal.self)! - _ = container.resolve(Animal.self)! - expect(invokedCount) == expectation - } - - runInObjectScope(.transient, 2) - runInObjectScope(.graph, 2) - runInObjectScope(.container, 1) - } - } - } - describe("Class as a service type") { - it("resolves a registred subclass of a service type class.") { - container.register(Cat.self) { _ in Siamese(name: "Siam") } - - let siam = container.resolve(Cat.self) as! Siamese - expect(siam.name) == "Siam" - } - it("resolves a self-binding with dependency injected.") { - container.register(PetOwner.self) { r in PetOwner(pet: r.resolve(Animal.self)!) } - container.register(Animal.self) { _ in Siamese(name: "Siam") } - - let owner = container.resolve(PetOwner.self)! - let siam = owner.pet as! Siamese - expect(siam.name) == "Siam" - } - } - describe("Convenience initializers") { - it("takes a closure registering services.") { - let container = Container { - $0.register(Animal.self) { _ in Cat() } - } - - expect(container.resolve(Animal.self) as? Cat).notTo(beNil()) - } - } - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Food.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Food.swift deleted file mode 100644 index 3eec931..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Food.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// Food.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/29/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -import Foundation - -internal protocol Food { } - -internal class Sushi: Food { } diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Info.plist b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Info.plist deleted file mode 100644 index 01eb78a..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 2.1.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/LoadAwareAssembly.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/LoadAwareAssembly.swift deleted file mode 100644 index b79bc2a..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/LoadAwareAssembly.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// LoadAwareAssembly.swift -// Swinject -// -// Created by mike.owens on 12/9/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -import Swinject - -class LoadAwareAssembly: Assembly { - var onLoad: (Resolver) -> Void - var loaded = false - - init(onLoad: @escaping (Resolver) -> Void) { - self.onLoad = onLoad - } - - func assemble(container: Container) { - container.register(Animal.self) { _ in - return Cat(name: "Bojangles") - } - } - - func loaded(resolver: Resolver) { - onLoad(resolver) - loaded = true - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Person.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Person.swift deleted file mode 100644 index c3406ef..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/Person.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// Person.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/27/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// - -import Foundation - -internal protocol Person { } - -internal class PetOwner: Person { - var pet: Animal? - var favoriteFood: Food? - - init() { - } - - init(pet: Animal) { - self.pet = pet - } - - func injectAnimal(_ animal: Animal) { - self.pet = animal - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ServiceEntrySpec.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ServiceEntrySpec.swift deleted file mode 100644 index 25f718a..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ServiceEntrySpec.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// ServiceEntrySpec.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/29/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Quick -import Nimble -@testable import Swinject - -class ServiceEntrySpec: QuickSpec { - override func spec() { - it("has ObjectScope.graph as a default value of scope property.") { - let entry = ServiceEntry(serviceType: Int.self, factory: { return 0 }) - expect(entry.objectScope) === ObjectScope.graph - } - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ServiceKeySpec.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ServiceKeySpec.swift deleted file mode 100644 index be203f0..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/ServiceKeySpec.swift +++ /dev/null @@ -1,134 +0,0 @@ -// -// ServiceKeySpec.swift -// Swinject -// -// Created by Yoichi Tagaya on 7/23/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Quick -import Nimble -@testable import Swinject - -// MARK: Option -private struct Option: ServiceKeyOption { - let option: Int - - func isEqualTo(_ another: ServiceKeyOption) -> Bool { - guard let another = another as? Option else { - return false - } - - return self.option == another.option - } - - var hashValue: Int { - return option.hashValue - } - - var description: String { - return "" - } -} - -// MARK: ServiceKeySpec -class ServiceKeySpec: QuickSpec { - override func spec() { - describe("Without name") { - it("equals with the same factory type.") { - typealias FactoryType0Args = (Resolver) -> Animal - let key1 = ServiceKey(factoryType: FactoryType0Args.self) - let key2 = ServiceKey(factoryType: FactoryType0Args.self) - expect(key1) == key2 - expect(key1.hashValue) == key2.hashValue - - typealias FactoryType2Args = (Resolver, String, Bool) -> Animal - let key3 = ServiceKey(factoryType: FactoryType2Args.self) - let key4 = ServiceKey(factoryType: FactoryType2Args.self) - expect(key3) == key4 - expect(key3.hashValue) == key4.hashValue - } - it("does not equal with different service types in factory types.") { - typealias PersonFactoryType = (Resolver) -> Person - typealias AnimalFactoryType = (Resolver) -> Animal - let key1 = ServiceKey(factoryType: PersonFactoryType.self) - let key2 = ServiceKey(factoryType: AnimalFactoryType.self) - expect(key1) != key2 - expect(key1.hashValue) != key2.hashValue - } - it("does not equal with different arg types in factory types.") { - typealias FactoryType1Arg = (Resolver, String) -> Animal - typealias FactoryType2Args = (Resolver, String, Bool) -> Animal - let key1 = ServiceKey(factoryType: FactoryType1Arg.self) - let key2 = ServiceKey(factoryType: FactoryType2Args.self) - expect(key1) != key2 - expect(key1.hashValue) != key2.hashValue - - typealias FactoryTypeStringBoolArgs = (Resolver, String, Bool) -> Animal - typealias FactoryTypeStringIntArgs = (Resolver, String, Int) -> Animal - let key3 = ServiceKey(factoryType: FactoryTypeStringBoolArgs.self) - let key4 = ServiceKey(factoryType: FactoryTypeStringIntArgs.self) - expect(key3) != key4 - expect(key3.hashValue) != key4.hashValue - } - } - describe("With name") { - it("equals with the same name.") { - typealias FactoryType0Args = (Resolver) -> Animal - let key1 = ServiceKey(factoryType: FactoryType0Args.self, name: "my factory") - let key2 = ServiceKey(factoryType: FactoryType0Args.self, name: "my factory") - expect(key1) == key2 - expect(key1.hashValue) == key2.hashValue - - typealias FactoryType2Args = (Resolver, String, Bool) -> Animal - let key3 = ServiceKey(factoryType: FactoryType2Args.self, name: "my factory") - let key4 = ServiceKey(factoryType: FactoryType2Args.self, name: "my factory") - expect(key3) == key4 - expect(key3.hashValue) == key4.hashValue - } - it("does not equal with different names.") { - typealias FactoryType0Args = (Resolver) -> Animal - let key1 = ServiceKey(factoryType: FactoryType0Args.self, name: "my factory") - let key2 = ServiceKey(factoryType: FactoryType0Args.self, name: "your factory") - expect(key1) != key2 - expect(key1.hashValue) != key2.hashValue - - typealias FactoryType2Args = (Resolver, String, Bool) -> Animal - let key3 = ServiceKey(factoryType: FactoryType2Args.self, name: "my factory") - let key4 = ServiceKey(factoryType: FactoryType2Args.self, name: "your factory") - expect(key3) != key4 - expect(key3.hashValue) != key4.hashValue - } - } - describe("With option") { - it("equals with the same option.") { - typealias FactoryType0Args = (Resolver) -> Animal - let key1 = ServiceKey(factoryType: FactoryType0Args.self, option: Option(option: 1)) - let key2 = ServiceKey(factoryType: FactoryType0Args.self, option: Option(option: 1)) - expect(key1) == key2 - expect(key1.hashValue) == key2.hashValue - - typealias FactoryType2Args = (Resolver, String, Bool) -> Animal - let key3 = ServiceKey(factoryType: FactoryType2Args.self, option: Option(option: 1)) - let key4 = ServiceKey(factoryType: FactoryType2Args.self, option: Option(option: 1)) - expect(key3) == key4 - expect(key3.hashValue) == key4.hashValue - } - it("does not equal with different options.") { - typealias FactoryType0Args = (Resolver) -> Animal - let key1 = ServiceKey(factoryType: FactoryType0Args.self, option: Option(option: 1)) - let key2 = ServiceKey(factoryType: FactoryType0Args.self, option: Option(option: 2)) - expect(key1) != key2 - expect(key1.hashValue) != key2.hashValue - - typealias FactoryType2Args = (Resolver, String, Bool) -> Animal - let key3 = ServiceKey(factoryType: FactoryType2Args.self, option: Option(option: 1)) - let key4 = ServiceKey(factoryType: FactoryType2Args.self, option: Option(option: 2)) - expect(key3) != key4 - expect(key3.hashValue) != key4.hashValue - } - } - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/SynchronizedResolverSpec.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/SynchronizedResolverSpec.swift deleted file mode 100644 index 97cd4f9..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/SynchronizedResolverSpec.swift +++ /dev/null @@ -1,122 +0,0 @@ -// -// SynchronizedResolverSpec.swift -// Swinject -// -// Created by Yoichi Tagaya on 11/23/15. -// Copyright © 2015 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Dispatch -import Quick -import Nimble -@testable import Swinject - -class SynchronizedResolverSpec: QuickSpec { - override func spec() { - describe("Multiple threads") { - it("can resolve circular dependencies.") { - let container = Container { container in - container.register(ParentProtocol.self) { _ in Parent() } - .initCompleted { r, s in - let parent = s as! Parent - parent.child = r.resolve(ChildProtocol.self) - } - .inObjectScope(.graph) - container.register(ChildProtocol.self) { _ in Child() } - .initCompleted { r, s in - let child = s as! Child - child.parent = r.resolve(ParentProtocol.self)! - } - .inObjectScope(.graph) - }.synchronize() - - waitUntil(timeout: 2.0) { done in - let queue = DispatchQueue( - label: "SwinjectTests.SynchronizedContainerSpec.Queue", - attributes: .concurrent - ) - let totalThreads = 500 // 500 threads are enough to get fail unless the container is thread safe. - let counter = Counter(max: 2 * totalThreads) - for _ in 0..= totalThreads { - done() - } - } - } - } - } - it("can access parent and child containers without dead lock.") { - let runInObjectScope = { (scope: ObjectScope) in - let parentContainer = Container { container in - container.register(Animal.self) { _ in Cat() } - .inObjectScope(scope) - } - let parentResolver = parentContainer.synchronize() - let childResolver = Container(parent: parentContainer).synchronize() - - waitUntil(timeout: 2.0) { done in - let queue = DispatchQueue( - label: "SwinjectTests.SynchronizedContainerSpec.Queue", - attributes: .concurrent - ) - let totalThreads = 500 - let counter = Counter(max: 2 * totalThreads) - - for _ in 0.. Status { - var status = Status.underMax - lock.sync { - self.count += 1 - if self.count >= self.max { - status = .reachedMax - } - } - return status - } -} diff --git a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/WeakStorageSpec.swift b/Carthage/Checkouts/Swinject/Tests/SwinjectTests/WeakStorageSpec.swift deleted file mode 100644 index f89f914..0000000 --- a/Carthage/Checkouts/Swinject/Tests/SwinjectTests/WeakStorageSpec.swift +++ /dev/null @@ -1,62 +0,0 @@ -// -// WeakStorageSpec.swift -// Swinject -// -// Created by Jakub Vaňo on 11/30/16. -// Copyright © 2016 Swinject Contributors. All rights reserved. -// -// swiftlint:disable type_body_length -// swiftlint:disable function_body_length - -import Quick -import Nimble -import Foundation -@testable import Swinject - -class WeakStorageSpec: QuickSpec { - override func spec() { - var storage: WeakStorage! - beforeEach { - storage = WeakStorage() - } - - describe("Storing reference type") { - context("there is strong reference to instance") { - it("should provide stored instance") { - let object = DummyObject() - storage.instance = object - expect(storage.instance as? DummyObject) === object - } - } - context("there is no strong reference to instace") { - it("should not persist instance") { - storage.instance = DummyObject() - expect(storage.instance).to(beNil()) - } - } - context("there is weak reference to instace") { - it("should not persist instance") { - var object: DummyObject? = DummyObject() - weak var weakObject = object - storage.instance = object - - object = nil - - expect(storage.instance).to(beNil()) - expect(weakObject).to(beNil()) - } - } - } - - describe("Storing value type") { - it("should not persist instance") { - let value = DummyStruct() - storage.instance = value - expect(storage.instance).to(beNil()) - } - } - } -} - -private struct DummyStruct {} -private class DummyObject {} diff --git a/Carthage/Checkouts/Swinject/script/gencode b/Carthage/Checkouts/Swinject/script/gencode deleted file mode 100755 index b7224f0..0000000 --- a/Carthage/Checkouts/Swinject/script/gencode +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -files="Sources/Container.Arguments Sources/SynchronizedResolver.Arguments Sources/Resolver" - -for file in $files; do - echo "Generating code to $file.swift" - erb -v -T 1 $file.erb > $file.swift -done diff --git a/Carthage/Checkouts/xcconfigs/.gitignore b/Carthage/Checkouts/xcconfigs/.gitignore deleted file mode 100644 index b29206a..0000000 --- a/Carthage/Checkouts/xcconfigs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Carthage/Build diff --git a/Carthage/Checkouts/xcconfigs/Base/Configurations/Profile.xcconfig b/Carthage/Checkouts/xcconfigs/Base/Configurations/Profile.xcconfig deleted file mode 100644 index 0d01553..0000000 --- a/Carthage/Checkouts/xcconfigs/Base/Configurations/Profile.xcconfig +++ /dev/null @@ -1,27 +0,0 @@ -// -// This file defines the base configuration for an optional profiling-specific -// build of any project. To use these settings, create a Profile configuration -// in your project, and use this file at the project level for the new -// configuration. -// - -// based on the Release configuration, with some stuff related to debugging -// symbols re-enabled -#include "Release.xcconfig" - -// Whether to strip debugging symbols when copying resources (like included -// binaries) -COPY_PHASE_STRIP = NO - -// Whether to only build the active architecture -ONLY_ACTIVE_ARCH = YES - -// Whether to strip debugging symbols when copying the built product to its -// final installation location -STRIP_INSTALLED_PRODUCT = NO - -// Whether to perform App Store validation checks -VALIDATE_PRODUCT = NO - -// Disable Developer ID timestamping -OTHER_CODE_SIGN_FLAGS = --timestamp=none diff --git a/Carthage/Checkouts/xcconfigs/Base/Configurations/Release.xcconfig b/Carthage/Checkouts/xcconfigs/Base/Configurations/Release.xcconfig deleted file mode 100644 index c83729b..0000000 --- a/Carthage/Checkouts/xcconfigs/Base/Configurations/Release.xcconfig +++ /dev/null @@ -1,34 +0,0 @@ -// -// This file defines the base configuration for a Release build of any project. -// This should be set at the project level for the Release configuration. -// - -#include "../Common.xcconfig" - -// Whether to strip debugging symbols when copying resources (like included -// binaries) -COPY_PHASE_STRIP = YES - -// The optimization level (0, 1, 2, 3, s) for the produced binary -GCC_OPTIMIZATION_LEVEL = s - -// Preproccessor definitions to apply to each file compiled -GCC_PREPROCESSOR_DEFINITIONS = NDEBUG=1 - -// Whether to enable link-time optimizations (such as inlining across translation -// units) -LLVM_LTO = NO - -// Whether to only build the active architecture -ONLY_ACTIVE_ARCH = NO - -// Whether to strip debugging symbols when copying the built product to its -// final installation location -STRIP_INSTALLED_PRODUCT = YES - -// The optimization level (-Onone, -O, -Owholemodule) for the produced Swift binary -SWIFT_OPTIMIZATION_LEVEL = -Owholemodule - -// Whether to perform App Store validation checks -VALIDATE_PRODUCT = YES - diff --git a/Carthage/Checkouts/xcconfigs/Base/Targets/Application.xcconfig b/Carthage/Checkouts/xcconfigs/Base/Targets/Application.xcconfig deleted file mode 100644 index a91feca..0000000 --- a/Carthage/Checkouts/xcconfigs/Base/Targets/Application.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application. Typically, you want to use a platform-specific variant -// instead. -// - -// Whether to strip out code that isn't called from anywhere -DEAD_CODE_STRIPPING = NO - -// Sets the @rpath for the application such that it can include frameworks in -// the application bundle (inside the "Frameworks" folder) -LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks @loader_path/../Frameworks @executable_path/Frameworks diff --git a/Carthage/Checkouts/xcconfigs/Base/Targets/Framework.xcconfig b/Carthage/Checkouts/xcconfigs/Base/Targets/Framework.xcconfig deleted file mode 100644 index c92f57f..0000000 --- a/Carthage/Checkouts/xcconfigs/Base/Targets/Framework.xcconfig +++ /dev/null @@ -1,37 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework. Typically, you want to use a platform-specific variant -// instead. -// - -// Disable code signing for successful device builds with Xcode 8. Frameworks do -// need to be signed, but they don't need to be signed at compile time because -// they'll be re-signed when you include them in your app. -CODE_SIGNING_REQUIRED = NO -CODE_SIGN_IDENTITY = - -// Whether to strip out code that isn't called from anywhere -DEAD_CODE_STRIPPING = NO - -// Whether this framework should define an LLVM module -DEFINES_MODULE = YES - -// Whether function calls should be position-dependent (should always be -// disabled for library code) -GCC_DYNAMIC_NO_PIC = NO - -// Default frameworks to the name of the project, instead of any -// platform-specific target -PRODUCT_NAME = $(PROJECT_NAME) - -// Enables the framework to be included from any location as long as the -// loader’s runpath search paths includes it. For example from an application -// bundle (inside the "Frameworks" folder) or shared folder -INSTALL_PATH = @rpath -LD_DYLIB_INSTALL_NAME = @rpath/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/$(PRODUCT_NAME) -SKIP_INSTALL = YES - -// Disallows use of APIs that are not available -// to app extensions and linking to frameworks -// that have not been built with this setting enabled. -APPLICATION_EXTENSION_API_ONLY = YES diff --git a/Carthage/Checkouts/xcconfigs/Base/Targets/StaticLibrary.xcconfig b/Carthage/Checkouts/xcconfigs/Base/Targets/StaticLibrary.xcconfig deleted file mode 100644 index b3b2b87..0000000 --- a/Carthage/Checkouts/xcconfigs/Base/Targets/StaticLibrary.xcconfig +++ /dev/null @@ -1,32 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library. Typically, you want to use a platform-specific variant -// instead. -// - -// Whether to strip out code that isn't called from anywhere -DEAD_CODE_STRIPPING = NO - -// Whether to strip debugging symbols when copying resources (like included -// binaries). -// -// Overrides Release.xcconfig when used at the target level. -COPY_PHASE_STRIP = NO - -// Whether function calls should be position-dependent (should always be -// disabled for library code) -GCC_DYNAMIC_NO_PIC = NO - -// Copy headers to "include/LibraryName" in the build folder by default. This -// lets consumers use #import syntax even for static -// libraries -PUBLIC_HEADERS_FOLDER_PATH = include/$PRODUCT_NAME - -// Don't include in an xcarchive -SKIP_INSTALL = YES - -// Disallows use of APIs that are not available -// to app extensions and linking to frameworks -// that have not been built with this setting enabled. -APPLICATION_EXTENSION_API_ONLY = YES - diff --git a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Application.xcconfig b/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Application.xcconfig deleted file mode 100644 index 2e552c7..0000000 --- a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Application.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application on Mac OS X. This should be set at the target level for -// each project configuration. -// - -// Import base application settings -#include "../Base/Targets/Application.xcconfig" - -// Apply common settings specific to Mac OS X -#include "Mac-Base.xcconfig" - -// Whether function calls should be position-dependent (should always be -// disabled for library code) -GCC_DYNAMIC_NO_PIC = YES diff --git a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Base.xcconfig b/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Base.xcconfig deleted file mode 100644 index 8fdeccc..0000000 --- a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Base.xcconfig +++ /dev/null @@ -1,19 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for Mac OS X. This file is not standalone -- it is meant to be included into -// a configuration file for a specific type of target. -// - -// Whether to combine multiple image resolutions into a multirepresentational -// TIFF -COMBINE_HIDPI_IMAGES = YES - -// Where to find embedded frameworks -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks - -// The base SDK to use (if no version is specified, the latest version is -// assumed) -SDKROOT = macosx - -// Supported build architectures -VALID_ARCHS = x86_64 diff --git a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-DynamicLibrary.xcconfig b/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-DynamicLibrary.xcconfig deleted file mode 100644 index 1e2a37c..0000000 --- a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-DynamicLibrary.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a dynamic library on Mac OS X. This should be set at the target level -// for each project configuration. -// - -// Import common settings specific to Mac OS X -#include "Mac-Base.xcconfig" - -// Whether to strip out code that isn't called from anywhere -DEAD_CODE_STRIPPING = NO - -// Whether function calls should be position-dependent (should always be -// disabled for library code) -GCC_DYNAMIC_NO_PIC = NO - -// Don't include in an xcarchive -SKIP_INSTALL = YES diff --git a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Framework.xcconfig b/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Framework.xcconfig deleted file mode 100644 index dd98764..0000000 --- a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Framework.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework on OS X. This should be set at the target level for each -// project configuration. -// - -// Import base framework settings -#include "../Base/Targets/Framework.xcconfig" - -// Import common settings specific to Mac OS X -#include "Mac-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-StaticLibrary.xcconfig b/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-StaticLibrary.xcconfig deleted file mode 100644 index 97d0318..0000000 --- a/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-StaticLibrary.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library on Mac OS X. This should be set at the target level for -// each project configuration. -// - -// Import base static library settings -#include "../Base/Targets/StaticLibrary.xcconfig" - -// Apply common settings specific to Mac OS X -#include "Mac-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/README.md b/Carthage/Checkouts/xcconfigs/README.md deleted file mode 100644 index 8b69024..0000000 --- a/Carthage/Checkouts/xcconfigs/README.md +++ /dev/null @@ -1,13 +0,0 @@ -This project intends to aggregate common or universal Xcode configuration settings, keeping them in hierarchial Xcode configuration files for easy modification and reuse. - -## License - -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. - -In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to [unlicense.org](http://unlicense.org). diff --git a/Carthage/Checkouts/xcconfigs/iOS/iOS-Application.xcconfig b/Carthage/Checkouts/xcconfigs/iOS/iOS-Application.xcconfig deleted file mode 100644 index a700868..0000000 --- a/Carthage/Checkouts/xcconfigs/iOS/iOS-Application.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application on iOS. This should be set at the target level for each -// project configuration. -// - -// Import base application settings -#include "../Base/Targets/Application.xcconfig" - -// Apply common settings specific to iOS -#include "iOS-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/iOS/iOS-Base.xcconfig b/Carthage/Checkouts/xcconfigs/iOS/iOS-Base.xcconfig deleted file mode 100644 index f45f905..0000000 --- a/Carthage/Checkouts/xcconfigs/iOS/iOS-Base.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for iOS. This file is not standalone -- it is meant to be included into -// a configuration file for a specific type of target. -// - -// Xcode needs this to find archived headers if SKIP_INSTALL is set -HEADER_SEARCH_PATHS = $(OBJROOT)/UninstalledProducts/include - -// Where to find embedded frameworks -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks - -// The base SDK to use (if no version is specified, the latest version is -// assumed) -SDKROOT = iphoneos - -// Supported device families (1 is iPhone, 2 is iPad) -TARGETED_DEVICE_FAMILY = 1,2 diff --git a/Carthage/Checkouts/xcconfigs/iOS/iOS-Framework.xcconfig b/Carthage/Checkouts/xcconfigs/iOS/iOS-Framework.xcconfig deleted file mode 100644 index e538a7d..0000000 --- a/Carthage/Checkouts/xcconfigs/iOS/iOS-Framework.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework on iOS. This should be set at the target level for each -// project configuration. -// - -// Import base framework settings -#include "../Base/Targets/Framework.xcconfig" - -// Import common settings specific to iOS -#include "iOS-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/iOS/iOS-StaticLibrary.xcconfig b/Carthage/Checkouts/xcconfigs/iOS/iOS-StaticLibrary.xcconfig deleted file mode 100644 index 7e3b507..0000000 --- a/Carthage/Checkouts/xcconfigs/iOS/iOS-StaticLibrary.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library on iOS. This should be set at the target level for each -// project configuration. -// - -// Import base static library settings -#include "../Base/Targets/StaticLibrary.xcconfig" - -// Apply common settings specific to iOS -#include "iOS-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Application.xcconfig b/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Application.xcconfig deleted file mode 100644 index 74f892c..0000000 --- a/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Application.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application on tvOS. This should be set at the target level for -// each project configuration. -// - -// Import base application settings -#include "../Base/Targets/Application.xcconfig" - -// Apply common settings specific to tvOS -#include "tvOS-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Base.xcconfig b/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Base.xcconfig deleted file mode 100644 index e5cb616..0000000 --- a/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Base.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for tvOS. This file is not standalone -- it is meant to be included into -// a configuration file for a specific type of target. -// - -// Where to find embedded frameworks -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks - -// The base SDK to use (if no version is specified, the latest version is -// assumed) -SDKROOT = appletvos - -// Supported device families -TARGETED_DEVICE_FAMILY = 3 diff --git a/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Framework.xcconfig b/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Framework.xcconfig deleted file mode 100644 index cb08820..0000000 --- a/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Framework.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework on tvOS. This should be set at the target level for each -// project configuration. -// - -// Import base framework settings -#include "../Base/Targets/Framework.xcconfig" - -// Import common settings specific to iOS -#include "tvOS-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/tvOS/tvOS-StaticLibrary.xcconfig b/Carthage/Checkouts/xcconfigs/tvOS/tvOS-StaticLibrary.xcconfig deleted file mode 100644 index 34d0200..0000000 --- a/Carthage/Checkouts/xcconfigs/tvOS/tvOS-StaticLibrary.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library on tvOS. This should be set at the target level for -// each project configuration. -// - -// Import base static library settings -#include "../Base/Targets/StaticLibrary.xcconfig" - -// Apply common settings specific to tvOS -#include "tvOS-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Application.xcconfig b/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Application.xcconfig deleted file mode 100644 index 5d88df9..0000000 --- a/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Application.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for an application on watchOS. This should be set at the target level for -// each project configuration. -// - -// Import base application settings -#include "../Base/Targets/Application.xcconfig" - -// Apply common settings specific to watchOS -#include "watchOS-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Base.xcconfig b/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Base.xcconfig deleted file mode 100644 index 21e4a82..0000000 --- a/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Base.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for watchOS. This file is not standalone -- it is meant to be included into -// a configuration file for a specific type of target. -// - -// Where to find embedded frameworks -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks - -// The base SDK to use (if no version is specified, the latest version is -// assumed) -SDKROOT = watchos - -// Supported device families -TARGETED_DEVICE_FAMILY = 4 diff --git a/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Framework.xcconfig b/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Framework.xcconfig deleted file mode 100644 index 3893494..0000000 --- a/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Framework.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a framework on watchOS. This should be set at the target level for each -// project configuration. -// - -// Import base framework settings -#include "../Base/Targets/Framework.xcconfig" - -// Import common settings specific to iOS -#include "watchOS-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/watchOS/watchOS-StaticLibrary.xcconfig b/Carthage/Checkouts/xcconfigs/watchOS/watchOS-StaticLibrary.xcconfig deleted file mode 100644 index b9f92d8..0000000 --- a/Carthage/Checkouts/xcconfigs/watchOS/watchOS-StaticLibrary.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// -// This file defines additional configuration options that are appropriate only -// for a static library on watchOS. This should be set at the target level for -// each project configuration. -// - -// Import base static library settings -#include "../Base/Targets/StaticLibrary.xcconfig" - -// Apply common settings specific to watchOS -#include "watchOS-Base.xcconfig" diff --git a/Carthage/Checkouts/xcconfigs/Base/Common.xcconfig b/Configurations/Base/Common.xcconfig similarity index 94% rename from Carthage/Checkouts/xcconfigs/Base/Common.xcconfig rename to Configurations/Base/Common.xcconfig index 26cea4b..f55333e 100644 --- a/Carthage/Checkouts/xcconfigs/Base/Common.xcconfig +++ b/Configurations/Base/Common.xcconfig @@ -68,6 +68,15 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR // Whether to warn on suspicious implicit conversions CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES +// Warn about incorrect uses of nullable values +CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES + +// Warn for missing nullability attributes +CLANG_ANALYZER_NONNULL = YES + +// Warn when a non-localized string is passed to a user-interface method expecting a localized string +CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES + // Warn about potentially unreachable code CLANG_WARN_UNREACHABLE_CODE = YES @@ -109,6 +118,7 @@ GCC_VERSION = com.apple.compilers.llvm.clang.1_0 // Whether warnings are treated as errors GCC_TREAT_WARNINGS_AS_ERRORS = YES +SWIFT_TREAT_WARNINGS_AS_ERRORS = YES // Whether to warn about 64-bit values being implicitly shortened to 32 bits GCC_WARN_64_TO_32_BIT_CONVERSION = YES @@ -174,7 +184,7 @@ GCC_WARN_UNUSED_VARIABLE = YES RUN_CLANG_STATIC_ANALYZER = YES // Don't treat unknown warnings as errors, and disable GCC compatibility warnings and unused static const variable warnings -WARNING_CFLAGS = -Wno-error=unknown-warning-option -Wno-gcc-compat -Wno-unused-const-variable -Wno-nullability-completeness +WARNING_CFLAGS = -Wno-error=unknown-warning-option -Wno-gcc-compat -Wno-unused-const-variable // This setting is on for new projects as of Xcode ~6.3, though it is still not // the default. It warns if the same variable is declared in two binaries that diff --git a/Carthage/Checkouts/xcconfigs/Base/Configurations/Debug.xcconfig b/Configurations/Base/Configurations/Debug.xcconfig similarity index 100% rename from Carthage/Checkouts/xcconfigs/Base/Configurations/Debug.xcconfig rename to Configurations/Base/Configurations/Debug.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Profile.xcconfig b/Configurations/Base/Configurations/Profile.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Profile.xcconfig rename to Configurations/Base/Configurations/Profile.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Release.xcconfig b/Configurations/Base/Configurations/Release.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Configurations/Release.xcconfig rename to Configurations/Base/Configurations/Release.xcconfig diff --git a/Carthage/Checkouts/xcconfigs/Base/Configurations/Test.xcconfig b/Configurations/Base/Configurations/Test.xcconfig similarity index 100% rename from Carthage/Checkouts/xcconfigs/Base/Configurations/Test.xcconfig rename to Configurations/Base/Configurations/Test.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Targets/Application.xcconfig b/Configurations/Base/Targets/Application.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Targets/Application.xcconfig rename to Configurations/Base/Targets/Application.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Targets/Framework.xcconfig b/Configurations/Base/Targets/Framework.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Targets/Framework.xcconfig rename to Configurations/Base/Targets/Framework.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Targets/StaticLibrary.xcconfig b/Configurations/Base/Targets/StaticLibrary.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Base/Targets/StaticLibrary.xcconfig rename to Configurations/Base/Targets/StaticLibrary.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Application.xcconfig b/Configurations/Mac OS X/Mac-Application.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Application.xcconfig rename to Configurations/Mac OS X/Mac-Application.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Base.xcconfig b/Configurations/Mac OS X/Mac-Base.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Base.xcconfig rename to Configurations/Mac OS X/Mac-Base.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-DynamicLibrary.xcconfig b/Configurations/Mac OS X/Mac-DynamicLibrary.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-DynamicLibrary.xcconfig rename to Configurations/Mac OS X/Mac-DynamicLibrary.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Framework.xcconfig b/Configurations/Mac OS X/Mac-Framework.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-Framework.xcconfig rename to Configurations/Mac OS X/Mac-Framework.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-StaticLibrary.xcconfig b/Configurations/Mac OS X/Mac-StaticLibrary.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/Mac OS X/Mac-StaticLibrary.xcconfig rename to Configurations/Mac OS X/Mac-StaticLibrary.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/iOS/iOS-Application.xcconfig b/Configurations/iOS/iOS-Application.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/iOS/iOS-Application.xcconfig rename to Configurations/iOS/iOS-Application.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/iOS/iOS-Base.xcconfig b/Configurations/iOS/iOS-Base.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/iOS/iOS-Base.xcconfig rename to Configurations/iOS/iOS-Base.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/iOS/iOS-Framework.xcconfig b/Configurations/iOS/iOS-Framework.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/iOS/iOS-Framework.xcconfig rename to Configurations/iOS/iOS-Framework.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/iOS/iOS-StaticLibrary.xcconfig b/Configurations/iOS/iOS-StaticLibrary.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/iOS/iOS-StaticLibrary.xcconfig rename to Configurations/iOS/iOS-StaticLibrary.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Application.xcconfig b/Configurations/tvOS/tvOS-Application.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Application.xcconfig rename to Configurations/tvOS/tvOS-Application.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Base.xcconfig b/Configurations/tvOS/tvOS-Base.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Base.xcconfig rename to Configurations/tvOS/tvOS-Base.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Framework.xcconfig b/Configurations/tvOS/tvOS-Framework.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/tvOS/tvOS-Framework.xcconfig rename to Configurations/tvOS/tvOS-Framework.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/tvOS/tvOS-StaticLibrary.xcconfig b/Configurations/tvOS/tvOS-StaticLibrary.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/tvOS/tvOS-StaticLibrary.xcconfig rename to Configurations/tvOS/tvOS-StaticLibrary.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Application.xcconfig b/Configurations/watchOS/watchOS-Application.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Application.xcconfig rename to Configurations/watchOS/watchOS-Application.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Base.xcconfig b/Configurations/watchOS/watchOS-Base.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Base.xcconfig rename to Configurations/watchOS/watchOS-Base.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Framework.xcconfig b/Configurations/watchOS/watchOS-Framework.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/watchOS/watchOS-Framework.xcconfig rename to Configurations/watchOS/watchOS-Framework.xcconfig diff --git a/Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/watchOS/watchOS-StaticLibrary.xcconfig b/Configurations/watchOS/watchOS-StaticLibrary.xcconfig similarity index 100% rename from Carthage/Checkouts/Swinject/Carthage/Checkouts/xcconfigs/watchOS/watchOS-StaticLibrary.xcconfig rename to Configurations/watchOS/watchOS-StaticLibrary.xcconfig diff --git a/SwinjectAutoregistration.xcodeproj/project.pbxproj b/SwinjectAutoregistration.xcodeproj/project.pbxproj index 98659f8..cc1de35 100644 --- a/SwinjectAutoregistration.xcodeproj/project.pbxproj +++ b/SwinjectAutoregistration.xcodeproj/project.pbxproj @@ -495,7 +495,7 @@ CD5B9E321D832A4F007ED05F /* Mac OS X */, CD5B9E381D832A4F007ED05F /* tvOS */, ); - name = Configurations; + path = Configurations; sourceTree = ""; }; CD5B9E221D832A4F007ED05F /* Base */ = { @@ -505,8 +505,7 @@ CD5B9E241D832A4F007ED05F /* Configurations */, CD5B9E291D832A4F007ED05F /* Targets */, ); - name = Base; - path = Carthage/Checkouts/xcconfigs/Base; + path = Base; sourceTree = ""; }; CD5B9E241D832A4F007ED05F /* Configurations */ = { @@ -538,8 +537,7 @@ CD5B9E301D832A4F007ED05F /* iOS-Framework.xcconfig */, CD5B9E311D832A4F007ED05F /* iOS-StaticLibrary.xcconfig */, ); - name = iOS; - path = Carthage/Checkouts/xcconfigs/iOS; + path = iOS; sourceTree = ""; }; CD5B9E321D832A4F007ED05F /* Mac OS X */ = { @@ -551,8 +549,7 @@ CD5B9E361D832A4F007ED05F /* Mac-Framework.xcconfig */, CD5B9E371D832A4F007ED05F /* Mac-StaticLibrary.xcconfig */, ); - name = "Mac OS X"; - path = "Carthage/Checkouts/xcconfigs/Mac OS X"; + path = "Mac OS X"; sourceTree = ""; }; CD5B9E381D832A4F007ED05F /* tvOS */ = { @@ -563,8 +560,7 @@ CD5B9E3B1D832A4F007ED05F /* tvOS-Framework.xcconfig */, CD5B9E3C1D832A4F007ED05F /* tvOS-StaticLibrary.xcconfig */, ); - name = tvOS; - path = Carthage/Checkouts/xcconfigs/tvOS; + path = tvOS; sourceTree = ""; }; CD5B9E3E1D832A6E007ED05F /* Products */ = { @@ -645,8 +641,7 @@ CD5B9EB41D832C81007ED05F /* watchOS-Framework.xcconfig */, CD5B9EB51D832C81007ED05F /* watchOS-StaticLibrary.xcconfig */, ); - name = watchOS; - path = Carthage/Checkouts/xcconfigs/watchOS; + path = watchOS; sourceTree = ""; }; CD5B9EC11D832D5A007ED05F /* Products */ = {