From c5fc2b7629737beba149b29d1171f4104611334e Mon Sep 17 00:00:00 2001 From: Jesse Squires Date: Tue, 26 Apr 2022 22:46:36 -0700 Subject: [PATCH] [10.0.0] bump version, gen docs --- Nimble.podspec | 2 +- Package.swift | 6 +- docs/Classes.html | 1241 ++++ docs/Classes/AssertionDispatcher.html | 854 +++ docs/Classes/AssertionRecorder.html | 880 +++ docs/Classes/BadInstructionException.html | 852 +++ docs/Classes/FailureMessage.html | 1070 ++++ docs/Classes/NMBExpectation.html | 1440 +++++ docs/Classes/NMBExpectationMessage.html | 1066 ++++ docs/Classes/NMBObjCBeCloseToPredicate.html | 824 +++ .../NMBObjCRaiseExceptionPredicate.html | 908 +++ docs/Classes/NMBPredicate.html | 1536 +++++ docs/Classes/NMBPredicateResult.html | 931 +++ docs/Classes/NMBPredicateStatus.html | 1012 +++ docs/Classes/NMBStringer.html | 825 +++ docs/Classes/NimbleShortXCTestHandler.html | 824 +++ docs/Classes/NimbleXCTestHandler.html | 824 +++ docs/Classes/SourceLocation.html | 877 +++ docs/Enums.html | 903 +++ docs/Enums/ExpectationMessage.html | 1206 ++++ docs/Enums/ExpectationStyle.html | 850 +++ docs/Enums/PredicateStatus.html | 942 +++ docs/Enums/ToSucceedResult.html | 852 +++ docs/Extensions.html | 1524 +++++ docs/Extensions/AnySequence.html | 822 +++ docs/Extensions/Array.html | 822 +++ docs/Extensions/Data.html | 822 +++ docs/Extensions/Date.html | 850 +++ docs/Extensions/Double.html | 849 +++ docs/Extensions/Float.html | 849 +++ docs/Extensions/Int.html | 821 +++ docs/Extensions/Int16.html | 821 +++ docs/Extensions/Int32.html | 821 +++ docs/Extensions/Int64.html | 821 +++ docs/Extensions/Int8.html | 821 +++ docs/Extensions/NSArray.html | 824 +++ docs/Extensions/NSDate.html | 850 +++ docs/Extensions/NSException.html | 822 +++ docs/Extensions/NSIndexSet.html | 823 +++ docs/Extensions/NSNumber.html | 851 +++ docs/Extensions/NSString.html | 822 +++ docs/Extensions/String.html | 822 +++ docs/Extensions/UInt.html | 821 +++ docs/Extensions/UInt16.html | 821 +++ docs/Extensions/UInt32.html | 821 +++ docs/Extensions/UInt64.html | 821 +++ docs/Extensions/UInt8.html | 821 +++ docs/Functions.html | 5439 +++++++++++++++++ docs/Global Variables.html | 1038 ++++ docs/Protocols.html | 998 +++ docs/Protocols/AssertionHandler.html | 823 +++ docs/Protocols/NMBCollection.html | 823 +++ docs/Protocols/NMBComparable.html | 827 +++ docs/Protocols/NMBContainer.html | 823 +++ docs/Protocols/NMBDoubleConvertible.html | 823 +++ docs/Protocols/NMBOrderedCollection.html | 823 +++ .../TestOutputStringConvertible.html | 832 +++ docs/Structs.html | 1015 +++ docs/Structs/AssertionRecord.html | 907 +++ docs/Structs/AsyncDefaults.html | 851 +++ docs/Structs/Expectation.html | 1637 +++++ docs/Structs/Expectation/Nil.html | 822 +++ docs/Structs/Expression.html | 1025 ++++ docs/Structs/Predicate.html | 1038 ++++ docs/Structs/PredicateResult.html | 959 +++ docs/Structs/execTypesCountTuple.html | 850 +++ docs/Typealiases.html | 861 +++ docs/badge.svg | 28 + docs/css/highlight.css | 202 + docs/css/jazzy.css | 439 ++ .../docsets/Nimble.docset/Contents/Info.plist | 20 + .../Contents/Resources/Documents/Classes.html | 1241 ++++ .../Classes/AssertionDispatcher.html | 854 +++ .../Documents/Classes/AssertionRecorder.html | 880 +++ .../Classes/BadInstructionException.html | 852 +++ .../Documents/Classes/FailureMessage.html | 1070 ++++ .../Documents/Classes/NMBExpectation.html | 1440 +++++ .../Classes/NMBExpectationMessage.html | 1066 ++++ .../Classes/NMBObjCBeCloseToPredicate.html | 824 +++ .../NMBObjCRaiseExceptionPredicate.html | 908 +++ .../Documents/Classes/NMBPredicate.html | 1536 +++++ .../Documents/Classes/NMBPredicateResult.html | 931 +++ .../Documents/Classes/NMBPredicateStatus.html | 1012 +++ .../Documents/Classes/NMBStringer.html | 825 +++ .../Classes/NimbleShortXCTestHandler.html | 824 +++ .../Classes/NimbleXCTestHandler.html | 824 +++ .../Documents/Classes/SourceLocation.html | 877 +++ .../Contents/Resources/Documents/Enums.html | 903 +++ .../Documents/Enums/ExpectationMessage.html | 1206 ++++ .../Documents/Enums/ExpectationStyle.html | 850 +++ .../Documents/Enums/PredicateStatus.html | 942 +++ .../Documents/Enums/ToSucceedResult.html | 852 +++ .../Resources/Documents/Extensions.html | 1524 +++++ .../Documents/Extensions/AnySequence.html | 822 +++ .../Resources/Documents/Extensions/Array.html | 822 +++ .../Resources/Documents/Extensions/Data.html | 822 +++ .../Resources/Documents/Extensions/Date.html | 850 +++ .../Documents/Extensions/Double.html | 849 +++ .../Resources/Documents/Extensions/Float.html | 849 +++ .../Resources/Documents/Extensions/Int.html | 821 +++ .../Resources/Documents/Extensions/Int16.html | 821 +++ .../Resources/Documents/Extensions/Int32.html | 821 +++ .../Resources/Documents/Extensions/Int64.html | 821 +++ .../Resources/Documents/Extensions/Int8.html | 821 +++ .../Documents/Extensions/NSArray.html | 824 +++ .../Documents/Extensions/NSDate.html | 850 +++ .../Documents/Extensions/NSException.html | 822 +++ .../Documents/Extensions/NSIndexSet.html | 823 +++ .../Documents/Extensions/NSNumber.html | 851 +++ .../Documents/Extensions/NSString.html | 822 +++ .../Documents/Extensions/String.html | 822 +++ .../Resources/Documents/Extensions/UInt.html | 821 +++ .../Documents/Extensions/UInt16.html | 821 +++ .../Documents/Extensions/UInt32.html | 821 +++ .../Documents/Extensions/UInt64.html | 821 +++ .../Resources/Documents/Extensions/UInt8.html | 821 +++ .../Resources/Documents/Functions.html | 5439 +++++++++++++++++ .../Resources/Documents/Global Variables.html | 1038 ++++ .../Resources/Documents/Protocols.html | 998 +++ .../Documents/Protocols/AssertionHandler.html | 823 +++ .../Documents/Protocols/NMBCollection.html | 823 +++ .../Documents/Protocols/NMBComparable.html | 827 +++ .../Documents/Protocols/NMBContainer.html | 823 +++ .../Protocols/NMBDoubleConvertible.html | 823 +++ .../Protocols/NMBOrderedCollection.html | 823 +++ .../TestOutputStringConvertible.html | 832 +++ .../Contents/Resources/Documents/Structs.html | 1015 +++ .../Documents/Structs/AssertionRecord.html | 907 +++ .../Documents/Structs/AsyncDefaults.html | 851 +++ .../Documents/Structs/Expectation.html | 1637 +++++ .../Documents/Structs/Expectation/Nil.html | 822 +++ .../Documents/Structs/Expression.html | 1025 ++++ .../Documents/Structs/Predicate.html | 1038 ++++ .../Documents/Structs/PredicateResult.html | 959 +++ .../Structs/execTypesCountTuple.html | 850 +++ .../Resources/Documents/Typealiases.html | 861 +++ .../Resources/Documents/css/highlight.css | 202 + .../Resources/Documents/css/jazzy.css | 439 ++ .../Resources/Documents/img/carat.png | Bin 0 -> 274 bytes .../Contents/Resources/Documents/img/dash.png | Bin 0 -> 1338 bytes .../Contents/Resources/Documents/img/gh.png | Bin 0 -> 1571 bytes .../Resources/Documents/img/spinner.gif | Bin 0 -> 1849 bytes .../Contents/Resources/Documents/index.html | 2361 +++++++ .../Contents/Resources/Documents/js/jazzy.js | 74 + .../Resources/Documents/js/jazzy.search.js | 74 + .../Resources/Documents/js/jquery.min.js | 2 + .../Resources/Documents/js/lunr.min.js | 6 + .../Documents/js/typeahead.jquery.js | 1694 +++++ .../Contents/Resources/Documents/search.json | 1 + .../Contents/Resources/docSet.dsidx | Bin 0 -> 118784 bytes docs/docsets/Nimble.tgz | Bin 0 -> 435641 bytes docs/img/carat.png | Bin 0 -> 274 bytes docs/img/dash.png | Bin 0 -> 1338 bytes docs/img/gh.png | Bin 0 -> 1571 bytes docs/img/spinner.gif | Bin 0 -> 1849 bytes docs/index.html | 2361 +++++++ docs/js/jazzy.js | 74 + docs/js/jazzy.search.js | 74 + docs/js/jquery.min.js | 2 + docs/js/lunr.min.js | 6 + docs/js/typeahead.jquery.js | 1694 +++++ docs/search.json | 1 + docs/undocumented.json | 1783 ++++++ script/build_docs.zsh | 48 + 164 files changed, 140575 insertions(+), 4 deletions(-) create mode 100644 docs/Classes.html create mode 100644 docs/Classes/AssertionDispatcher.html create mode 100644 docs/Classes/AssertionRecorder.html create mode 100644 docs/Classes/BadInstructionException.html create mode 100644 docs/Classes/FailureMessage.html create mode 100644 docs/Classes/NMBExpectation.html create mode 100644 docs/Classes/NMBExpectationMessage.html create mode 100644 docs/Classes/NMBObjCBeCloseToPredicate.html create mode 100644 docs/Classes/NMBObjCRaiseExceptionPredicate.html create mode 100644 docs/Classes/NMBPredicate.html create mode 100644 docs/Classes/NMBPredicateResult.html create mode 100644 docs/Classes/NMBPredicateStatus.html create mode 100644 docs/Classes/NMBStringer.html create mode 100644 docs/Classes/NimbleShortXCTestHandler.html create mode 100644 docs/Classes/NimbleXCTestHandler.html create mode 100644 docs/Classes/SourceLocation.html create mode 100644 docs/Enums.html create mode 100644 docs/Enums/ExpectationMessage.html create mode 100644 docs/Enums/ExpectationStyle.html create mode 100644 docs/Enums/PredicateStatus.html create mode 100644 docs/Enums/ToSucceedResult.html create mode 100644 docs/Extensions.html create mode 100644 docs/Extensions/AnySequence.html create mode 100644 docs/Extensions/Array.html create mode 100644 docs/Extensions/Data.html create mode 100644 docs/Extensions/Date.html create mode 100644 docs/Extensions/Double.html create mode 100644 docs/Extensions/Float.html create mode 100644 docs/Extensions/Int.html create mode 100644 docs/Extensions/Int16.html create mode 100644 docs/Extensions/Int32.html create mode 100644 docs/Extensions/Int64.html create mode 100644 docs/Extensions/Int8.html create mode 100644 docs/Extensions/NSArray.html create mode 100644 docs/Extensions/NSDate.html create mode 100644 docs/Extensions/NSException.html create mode 100644 docs/Extensions/NSIndexSet.html create mode 100644 docs/Extensions/NSNumber.html create mode 100644 docs/Extensions/NSString.html create mode 100644 docs/Extensions/String.html create mode 100644 docs/Extensions/UInt.html create mode 100644 docs/Extensions/UInt16.html create mode 100644 docs/Extensions/UInt32.html create mode 100644 docs/Extensions/UInt64.html create mode 100644 docs/Extensions/UInt8.html create mode 100644 docs/Functions.html create mode 100644 docs/Global Variables.html create mode 100644 docs/Protocols.html create mode 100644 docs/Protocols/AssertionHandler.html create mode 100644 docs/Protocols/NMBCollection.html create mode 100644 docs/Protocols/NMBComparable.html create mode 100644 docs/Protocols/NMBContainer.html create mode 100644 docs/Protocols/NMBDoubleConvertible.html create mode 100644 docs/Protocols/NMBOrderedCollection.html create mode 100644 docs/Protocols/TestOutputStringConvertible.html create mode 100644 docs/Structs.html create mode 100644 docs/Structs/AssertionRecord.html create mode 100644 docs/Structs/AsyncDefaults.html create mode 100644 docs/Structs/Expectation.html create mode 100644 docs/Structs/Expectation/Nil.html create mode 100644 docs/Structs/Expression.html create mode 100644 docs/Structs/Predicate.html create mode 100644 docs/Structs/PredicateResult.html create mode 100644 docs/Structs/execTypesCountTuple.html create mode 100644 docs/Typealiases.html create mode 100644 docs/badge.svg create mode 100644 docs/css/highlight.css create mode 100644 docs/css/jazzy.css create mode 100644 docs/docsets/Nimble.docset/Contents/Info.plist create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/AssertionDispatcher.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/AssertionRecorder.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/BadInstructionException.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/FailureMessage.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBExpectation.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBExpectationMessage.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBObjCBeCloseToPredicate.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBObjCRaiseExceptionPredicate.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicate.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicateResult.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicateStatus.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBStringer.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NimbleShortXCTestHandler.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NimbleXCTestHandler.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/SourceLocation.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ExpectationMessage.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ExpectationStyle.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/PredicateStatus.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ToSucceedResult.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/AnySequence.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Array.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Data.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Date.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Double.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Float.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int16.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int32.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int64.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int8.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSArray.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSDate.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSException.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSIndexSet.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSNumber.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSString.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/String.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt16.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt32.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt64.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt8.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Functions.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Global Variables.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/AssertionHandler.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBCollection.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBComparable.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBContainer.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBDoubleConvertible.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBOrderedCollection.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/TestOutputStringConvertible.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/AssertionRecord.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/AsyncDefaults.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expectation.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expectation/Nil.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expression.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Predicate.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/PredicateResult.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/execTypesCountTuple.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/Typealiases.html create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 docs/docsets/Nimble.docset/Contents/Resources/Documents/img/carat.png create mode 100755 docs/docsets/Nimble.docset/Contents/Resources/Documents/img/dash.png create mode 100755 docs/docsets/Nimble.docset/Contents/Resources/Documents/img/gh.png create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/img/spinner.gif create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/index.html create mode 100755 docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jazzy.js create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jazzy.search.js create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/js/lunr.min.js create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/js/typeahead.jquery.js create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/Documents/search.json create mode 100644 docs/docsets/Nimble.docset/Contents/Resources/docSet.dsidx create mode 100644 docs/docsets/Nimble.tgz create mode 100755 docs/img/carat.png create mode 100755 docs/img/dash.png create mode 100755 docs/img/gh.png create mode 100644 docs/img/spinner.gif create mode 100644 docs/index.html create mode 100755 docs/js/jazzy.js create mode 100644 docs/js/jazzy.search.js create mode 100644 docs/js/jquery.min.js create mode 100644 docs/js/lunr.min.js create mode 100644 docs/js/typeahead.jquery.js create mode 100644 docs/search.json create mode 100644 docs/undocumented.json create mode 100755 script/build_docs.zsh diff --git a/Nimble.podspec b/Nimble.podspec index c798f452a..eade52267 100644 --- a/Nimble.podspec +++ b/Nimble.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Nimble" - s.version = "9.2.0" + s.version = "10.0.0" 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. diff --git a/Package.swift b/Package.swift index 187f5c95f..87dfc5f46 100644 --- a/Package.swift +++ b/Package.swift @@ -14,7 +14,7 @@ let package = Package( ], targets: [ .target( - name: "Nimble", + name: "Nimble", dependencies: [ .product(name: "CwlPreconditionTesting", package: "CwlPreconditionTesting", condition: .when(platforms: [.macOS, .iOS])), @@ -24,8 +24,8 @@ let package = Package( exclude: ["Info.plist"] ), .testTarget( - name: "NimbleTests", - dependencies: ["Nimble"], + name: "NimbleTests", + dependencies: ["Nimble"], exclude: ["objc", "Info.plist"] ), ], diff --git a/docs/Classes.html b/docs/Classes.html new file mode 100644 index 000000000..c03d9ade0 --- /dev/null +++ b/docs/Classes.html @@ -0,0 +1,1241 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(BadInstructionException)
    +public class BadInstructionException : NSException
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AssertionDispatcher + +
    +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class AssertionDispatcher : AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AssertionRecorder + +
    +
    +
    +
    +
    +
    +

    An AssertionHandler that silently records assertions that Nimble makes. +This is useful for testing failure messages for matchers.

    + +

    @see AssertionHandler

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class AssertionRecorder : AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBExpectation + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBExpectation : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NimbleXCTestHandler + +
    +
    +
    +
    +
    +
    +

    Default handler for Nimble. This assertion handler passes failures along to +XCTest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NimbleXCTestHandler : AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Alternative handler for Nimble. This assertion handler passes failures along +to XCTest by attempting to reduce the failure message size.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NimbleShortXCTestHandler : AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBExpectationMessage + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBExpectationMessage : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + FailureMessage + +
    +
    +
    +
    +
    +
    +

    Encapsulates the failure message that matchers can report to the end user.

    + +

    This is shared state between Nimble and matchers that mutate this value.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class FailureMessage : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBPredicate + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBPredicate : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBObjCBeCloseToPredicate : NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBPredicateResult + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    final public class NMBPredicateResult : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBPredicateStatus + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    final public class NMBPredicateStatus : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBObjCRaiseExceptionPredicate : NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +
    +
  • +
  • +
    + + + + SourceLocation + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class SourceLocation : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBStringer + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class NMBStringer : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/AssertionDispatcher.html b/docs/Classes/AssertionDispatcher.html new file mode 100644 index 000000000..caf01ff22 --- /dev/null +++ b/docs/Classes/AssertionDispatcher.html @@ -0,0 +1,854 @@ + + + + AssertionDispatcher Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AssertionDispatcher

+
+
+ +
public class AssertionDispatcher : AssertionHandler
+ +
+
+

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.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/Classes/AssertionRecorder.html b/docs/Classes/AssertionRecorder.html new file mode 100644 index 000000000..94e6f3fb8 --- /dev/null +++ b/docs/Classes/AssertionRecorder.html @@ -0,0 +1,880 @@ + + + + AssertionRecorder Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AssertionRecorder

+
+
+ +
public class AssertionRecorder : AssertionHandler
+ +
+
+

An AssertionHandler that silently records assertions that Nimble makes. +This is useful for testing failure messages for matchers.

+ +

@see AssertionHandler

+ +
+
+
+
    +
  • +
    + + + + assertions + +
    +
    +
    +
    +
    +
    +

    All the assertions that were captured by this recorder

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var assertions: [AssertionRecord]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/BadInstructionException.html b/docs/Classes/BadInstructionException.html new file mode 100644 index 000000000..ee64592aa --- /dev/null +++ b/docs/Classes/BadInstructionException.html @@ -0,0 +1,852 @@ + + + + BadInstructionException Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

BadInstructionException

+
+
+ +
@objc(BadInstructionException)
+public class BadInstructionException : NSException
+ +
+
+

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.

+ +
+
+
+
    +
  • +
    + + + + init(coder:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    required public init?(coder aDecoder: NSCoder)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + receiveReply(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(receiveReply:)
    +public class func receiveReply(_ reply: bad_instruction_exception_reply_t) -> CInt
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/FailureMessage.html b/docs/Classes/FailureMessage.html new file mode 100644 index 000000000..58d888fac --- /dev/null +++ b/docs/Classes/FailureMessage.html @@ -0,0 +1,1070 @@ + + + + FailureMessage Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

FailureMessage

+
+
+ +
public class FailureMessage : NSObject
+ +
+
+

Encapsulates the failure message that matchers can report to the end user.

+ +

This is shared state between Nimble and matchers that mutate this value.

+ +
+
+
+
    +
  • +
    + + + + expected + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var expected: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + actualValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var actualValue: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + to + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var to: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + postfixMessage + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var postfixMessage: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + postfixActual + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var postfixActual: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + extendedMessage + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var extendedMessage: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + userDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var userDescription: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + stringValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var stringValue: String { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(stringValue:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(stringValue: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/NMBExpectation.html b/docs/Classes/NMBExpectation.html new file mode 100644 index 000000000..ac5fee61c --- /dev/null +++ b/docs/Classes/NMBExpectation.html @@ -0,0 +1,1440 @@ + + + + NMBExpectation Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBExpectation

+
+
+ +
public class NMBExpectation : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(actualBlock: @escaping () -> NSObject?, negative: Bool, file: FileString, line: UInt)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withTimeout + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var withTimeout: (TimeInterval) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + to + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var to: (NMBPredicate) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toWithDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toWithDescription: (NMBPredicate, String) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNot + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNot: (NMBPredicate) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNotWithDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNotWithDescription: (NMBPredicate, String) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + notTo + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var notTo: (NMBPredicate) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + notToWithDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var notToWithDescription: (NMBPredicate, String) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toEventually + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toEventually: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toEventuallyWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toEventuallyNot + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toEventuallyNot: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toEventuallyNotWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNotEventually + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNotEventually: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNotEventuallyWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNever + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNever: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNeverWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + neverTo + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var neverTo: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var neverToWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toAlways + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toAlways: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toAlwaysWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + alwaysTo + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var alwaysTo: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var alwaysToWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func failWithMessage(_ message: String, file: FileString, line: UInt)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/NMBExpectationMessage.html b/docs/Classes/NMBExpectationMessage.html new file mode 100644 index 000000000..f82eab3f4 --- /dev/null +++ b/docs/Classes/NMBExpectationMessage.html @@ -0,0 +1,1066 @@ + + + + NMBExpectationMessage Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBExpectationMessage

+
+
+ +
public class NMBExpectationMessage : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + init(expectedTo:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expectedTo message: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expectedActualValueTo message: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expectedActualValueTo message: String, customActualValue actual: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(fail:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(fail message: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(prepend:child:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(prepend message: String, child: NMBExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(appendedMessage message: String, child: NMBExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(prependedMessage message: String, child: NMBExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(details:child:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(details message: String, child: NMBExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appendedBeNilHint() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func appendedBeNilHint() -> NMBExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toSwift() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toSwift() -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/NMBObjCBeCloseToPredicate.html b/docs/Classes/NMBObjCBeCloseToPredicate.html new file mode 100644 index 000000000..f0fe62b47 --- /dev/null +++ b/docs/Classes/NMBObjCBeCloseToPredicate.html @@ -0,0 +1,824 @@ + + + + NMBObjCBeCloseToPredicate Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBObjCBeCloseToPredicate

+
+
+ +
public class NMBObjCBeCloseToPredicate : NMBPredicate
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + within + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var within: (CDouble) -> NMBObjCBeCloseToPredicate { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/NMBObjCRaiseExceptionPredicate.html b/docs/Classes/NMBObjCRaiseExceptionPredicate.html new file mode 100644 index 000000000..324708b51 --- /dev/null +++ b/docs/Classes/NMBObjCRaiseExceptionPredicate.html @@ -0,0 +1,908 @@ + + + + NMBObjCRaiseExceptionPredicate Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBObjCRaiseExceptionPredicate

+
+
+ +
public class NMBObjCRaiseExceptionPredicate : NMBPredicate
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + named + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var named: (_ name: String) -> NMBObjCRaiseExceptionPredicate { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionPredicate { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + userInfo + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionPredicate { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyingBlock + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionPredicate { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/NMBPredicate.html b/docs/Classes/NMBPredicate.html new file mode 100644 index 000000000..54ef19157 --- /dev/null +++ b/docs/Classes/NMBPredicate.html @@ -0,0 +1,1536 @@ + + + + NMBPredicate Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBPredicate

+
+
+ +
public class NMBPredicate : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + init(predicate:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(predicate: @escaping PredicateBlock)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allPassMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func allPassMatcher(_ predicate: NMBPredicate) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAKindOfMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmptyMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beEmptyMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beLessThanMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

beTruthy() / beFalsy() +

+
+
+
    +
  • +
    + + + + beTruthyMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beTruthyMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFalsyMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beFalsyMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beTrueMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beTrueMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFalseMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beFalseMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beNilMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beNilMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWithMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beginWithMatcher(_ expected: Any) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + containMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func containMatcher(_ expected: [NSObject]) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endWithMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func endWithMatcher(_ expected: Any) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equalMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func equalMatcher(_ expected: NSObject) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + haveCountMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func haveCountMatcher(_ expected: NSNumber) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + matchMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func matchMatcher(_ expected: NSString) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func satisfyAllOfMatcher(_ predicates: [NMBPredicate]) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func satisfyAnyOfMatcher(_ predicates: [NMBPredicate]) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/NMBPredicateResult.html b/docs/Classes/NMBPredicateResult.html new file mode 100644 index 000000000..a29df4289 --- /dev/null +++ b/docs/Classes/NMBPredicateResult.html @@ -0,0 +1,931 @@ + + + + NMBPredicateResult Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBPredicateResult

+
+
+ +
final public class NMBPredicateResult : NSObject
+ +
+
+

Undocumented

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/Classes/NMBPredicateStatus.html b/docs/Classes/NMBPredicateStatus.html new file mode 100644 index 000000000..131179e15 --- /dev/null +++ b/docs/Classes/NMBPredicateStatus.html @@ -0,0 +1,1012 @@ + + + + NMBPredicateStatus Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBPredicateStatus

+
+
+ +
final public class NMBPredicateStatus : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + matches + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let matches: NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doesNotMatch + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let doesNotMatch: NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let fail: NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + hash + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override var hash: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isEqual(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override func isEqual(_ object: Any?) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + from(status:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func from(status: PredicateStatus) -> NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + from(bool:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func from(bool success: Bool) -> NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toSwift() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toSwift() -> PredicateStatus
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/NMBStringer.html b/docs/Classes/NMBStringer.html new file mode 100644 index 000000000..e8f8b54c9 --- /dev/null +++ b/docs/Classes/NMBStringer.html @@ -0,0 +1,825 @@ + + + + NMBStringer Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBStringer

+
+
+ +
@objc
+public class NMBStringer : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + stringify(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func stringify(_ obj: Any?) -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/NimbleShortXCTestHandler.html b/docs/Classes/NimbleShortXCTestHandler.html new file mode 100644 index 000000000..434d51f30 --- /dev/null +++ b/docs/Classes/NimbleShortXCTestHandler.html @@ -0,0 +1,824 @@ + + + + NimbleShortXCTestHandler Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NimbleShortXCTestHandler

+
+
+ +
public class NimbleShortXCTestHandler : AssertionHandler
+ +
+
+

Alternative handler for Nimble. This assertion handler passes failures along +to XCTest by attempting to reduce the failure message size.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/Classes/NimbleXCTestHandler.html b/docs/Classes/NimbleXCTestHandler.html new file mode 100644 index 000000000..3b1fc8581 --- /dev/null +++ b/docs/Classes/NimbleXCTestHandler.html @@ -0,0 +1,824 @@ + + + + NimbleXCTestHandler Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NimbleXCTestHandler

+
+
+ +
public class NimbleXCTestHandler : AssertionHandler
+ +
+
+

Default handler for Nimble. This assertion handler passes failures along to +XCTest.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/Classes/SourceLocation.html b/docs/Classes/SourceLocation.html new file mode 100644 index 000000000..2ba6bc901 --- /dev/null +++ b/docs/Classes/SourceLocation.html @@ -0,0 +1,877 @@ + + + + SourceLocation Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

SourceLocation

+
+
+ +
public final class SourceLocation : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + file + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let file: FileString
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + line + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let line: UInt
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    override public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums.html b/docs/Enums.html new file mode 100644 index 000000000..3cba5283a --- /dev/null +++ b/docs/Enums.html @@ -0,0 +1,903 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + ExpectationMessage + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public indirect enum ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ExpectationStyle + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ExpectationStyle
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PredicateStatus + +
    +
    +
    +
    +
    +
    +

    PredicateStatus is a trinary that indicates if a Predicate matches a given value or not

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum PredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ToSucceedResult + +
    +
    +
    +
    +
    +
    +

    Used by the succeed matcher.

    + +

    This is the return type for the closure.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ToSucceedResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums/ExpectationMessage.html b/docs/Enums/ExpectationMessage.html new file mode 100644 index 000000000..9a981b38d --- /dev/null +++ b/docs/Enums/ExpectationMessage.html @@ -0,0 +1,1206 @@ + + + + ExpectationMessage Enumeration Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ExpectationMessage

+
+
+ +
public indirect enum ExpectationMessage
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    includes actual value in output (“expected to , got ”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case expectedActualValueTo(String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    uses a custom actual value string in output (“expected to , got ”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case expectedCustomValueTo(String, actual: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expectedTo(_:) + +
    +
    +
    +
    +
    +
    +

    excludes actual value in output (“expected to ”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case expectedTo(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail(_:) + +
    +
    +
    +
    +
    +
    +

    allows any free-form message (“”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case fail(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + prepends(_:_:) + +
    +
    +
    +
    +
    +
    +

    Not Fully Implemented Yet.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case prepends(String, ExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appends(_:_:) + +
    +
    +
    +
    +
    +
    +

    appends after an existing message (“ (use beNil() to match nils)”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case appends(ExpectationMessage, String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + details(_:_:) + +
    +
    +
    +
    +
    +
    +

    provides long-form multi-line explainations (“\n\n”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case details(ExpectationMessage, String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expectedMessage + +
    +
    +
    +
    +
    +
    +

    Returns the smallest message after the “expected to” string that summarizes the error.

    + +

    Returns the message part from ExpectationMessage, ignoring all .appends and .details.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var expectedMessage: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appended(message:) + +
    +
    +
    +
    +
    +
    +

    Appends a message after the primary expectation message

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func appended(message: String) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appendedBeNilHint() + +
    +
    +
    +
    +
    +
    +

    Appends a message hinting to use beNil() for when the actual value given was nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func appendedBeNilHint() -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appended(details:) + +
    +
    +
    +
    +
    +
    +

    Appends a detailed (aka - multiline) message after the primary expectation message +Detailed messages will be placed after .appended(message:) calls.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func appended(details: String) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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:).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func replacedExpectation(_ f: @escaping (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Wraps a primary expectation with text before and after it. +Alias to prepended(message: before).appended(message: after)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func wrappedExpectation(before: String, after: String) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Prepends a message by modifying the primary expectation

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func prepended(expectation message: String) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Converts the tree of ExpectationMessages into a final built string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toString(actual: String, expected: String = "expected", to: String = "to") -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums/ExpectationStyle.html b/docs/Enums/ExpectationStyle.html new file mode 100644 index 000000000..120ebda6e --- /dev/null +++ b/docs/Enums/ExpectationStyle.html @@ -0,0 +1,850 @@ + + + + ExpectationStyle Enumeration Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ExpectationStyle

+
+
+ +
public enum ExpectationStyle
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + toMatch + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case toMatch
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNotMatch + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case toNotMatch
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums/PredicateStatus.html b/docs/Enums/PredicateStatus.html new file mode 100644 index 000000000..79e866508 --- /dev/null +++ b/docs/Enums/PredicateStatus.html @@ -0,0 +1,942 @@ + + + + PredicateStatus Enumeration Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

PredicateStatus

+
+
+ +
public enum PredicateStatus
+ +
+
+

PredicateStatus is a trinary that indicates if a Predicate matches a given value or not

+ +
+
+
+
    +
  • +
    + + + + matches + +
    +
    +
    +
    +
    +
    +

    Matches indicates if the predicate / matcher passes with the given value

    + +

    For example, equals(1) returns .matches for expect(1).to(equal(1)).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case matches
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doesNotMatch + +
    +
    +
    +
    +
    +
    +

    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)).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doesNotMatch
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case fail
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(bool:) + +
    +
    +
    +
    +
    +
    +

    Converts a boolean to either .matches (if true) or .doesNotMatch (if false).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(bool matches: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toObjectiveC() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toObjectiveC() -> NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums/ToSucceedResult.html b/docs/Enums/ToSucceedResult.html new file mode 100644 index 000000000..170f888c8 --- /dev/null +++ b/docs/Enums/ToSucceedResult.html @@ -0,0 +1,852 @@ + + + + ToSucceedResult Enumeration Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ToSucceedResult

+
+
+ +
public enum ToSucceedResult
+ +
+
+

Used by the succeed matcher.

+ +

This is the return type for the closure.

+ +
+
+
+
    +
  • +
    + + + + succeeded + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case succeeded
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failed(reason:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case failed(reason: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions.html b/docs/Extensions.html new file mode 100644 index 000000000..3b18f4c2d --- /dev/null +++ b/docs/Extensions.html @@ -0,0 +1,1524 @@ + + + + Extensions Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/Extensions/AnySequence.html b/docs/Extensions/AnySequence.html new file mode 100644 index 000000000..06bfca5d0 --- /dev/null +++ b/docs/Extensions/AnySequence.html @@ -0,0 +1,822 @@ + + + + AnySequence Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/Extensions/Array.html b/docs/Extensions/Array.html new file mode 100644 index 000000000..0d7da297a --- /dev/null +++ b/docs/Extensions/Array.html @@ -0,0 +1,822 @@ + + + + Array Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/Extensions/Data.html b/docs/Extensions/Data.html new file mode 100644 index 000000000..e0536e365 --- /dev/null +++ b/docs/Extensions/Data.html @@ -0,0 +1,822 @@ + + + + Data Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/Extensions/Date.html b/docs/Extensions/Date.html new file mode 100644 index 000000000..5b5f32a75 --- /dev/null +++ b/docs/Extensions/Date.html @@ -0,0 +1,850 @@ + + + + Date Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Date

+
+
+ +
extension Date: NMBDoubleConvertible
+
extension Date: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + doubleValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var doubleValue: CDouble { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/Double.html b/docs/Extensions/Double.html new file mode 100644 index 000000000..f35ad9ab1 --- /dev/null +++ b/docs/Extensions/Double.html @@ -0,0 +1,849 @@ + + + + Double Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Double

+
+
+ +
extension Double: ExpressibleByBooleanLiteral
+
extension Double: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/Float.html b/docs/Extensions/Float.html new file mode 100644 index 000000000..bb1f43a8b --- /dev/null +++ b/docs/Extensions/Float.html @@ -0,0 +1,849 @@ + + + + Float Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Float

+
+
+ +
extension Float: ExpressibleByBooleanLiteral
+
extension Float: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/Int.html b/docs/Extensions/Int.html new file mode 100644 index 000000000..59fab0b39 --- /dev/null +++ b/docs/Extensions/Int.html @@ -0,0 +1,821 @@ + + + + Int Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int

+
+
+ +
extension Int: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/Int16.html b/docs/Extensions/Int16.html new file mode 100644 index 000000000..f74c131f9 --- /dev/null +++ b/docs/Extensions/Int16.html @@ -0,0 +1,821 @@ + + + + Int16 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int16

+
+
+ +
extension Int16: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/Int32.html b/docs/Extensions/Int32.html new file mode 100644 index 000000000..4e21a0b49 --- /dev/null +++ b/docs/Extensions/Int32.html @@ -0,0 +1,821 @@ + + + + Int32 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int32

+
+
+ +
extension Int32: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/Int64.html b/docs/Extensions/Int64.html new file mode 100644 index 000000000..0c81d7a79 --- /dev/null +++ b/docs/Extensions/Int64.html @@ -0,0 +1,821 @@ + + + + Int64 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int64

+
+
+ +
extension Int64: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/Int8.html b/docs/Extensions/Int8.html new file mode 100644 index 000000000..f21032c1f --- /dev/null +++ b/docs/Extensions/Int8.html @@ -0,0 +1,821 @@ + + + + Int8 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int8

+
+
+ +
extension Int8: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/NSArray.html b/docs/Extensions/NSArray.html new file mode 100644 index 000000000..18e83ac55 --- /dev/null +++ b/docs/Extensions/NSArray.html @@ -0,0 +1,824 @@ + + + + NSArray Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/Extensions/NSDate.html b/docs/Extensions/NSDate.html new file mode 100644 index 000000000..f065b2bde --- /dev/null +++ b/docs/Extensions/NSDate.html @@ -0,0 +1,850 @@ + + + + NSDate Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NSDate

+
+
+ +
extension NSDate: NMBDoubleConvertible
+
extension NSDate: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + doubleValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var doubleValue: CDouble { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/NSException.html b/docs/Extensions/NSException.html new file mode 100644 index 000000000..4150a3d75 --- /dev/null +++ b/docs/Extensions/NSException.html @@ -0,0 +1,822 @@ + + + + NSException Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NSException

+
+
+ +
extension NSException
+ +
+
+ +
+
+
+
    +
  • +
    + + + + catchException(in:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func catchException(in block: @escaping () -> Void) -> `Self`?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/NSIndexSet.html b/docs/Extensions/NSIndexSet.html new file mode 100644 index 000000000..56aa85a90 --- /dev/null +++ b/docs/Extensions/NSIndexSet.html @@ -0,0 +1,823 @@ + + + + NSIndexSet Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/Extensions/NSNumber.html b/docs/Extensions/NSNumber.html new file mode 100644 index 000000000..7476faee2 --- /dev/null +++ b/docs/Extensions/NSNumber.html @@ -0,0 +1,851 @@ + + + + NSNumber Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NSNumber

+
+
+ +
extension NSNumber: NMBDoubleConvertible
+
extension NSNumber: NMBComparable
+
extension NSNumber: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + NMB_compare(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/NSString.html b/docs/Extensions/NSString.html new file mode 100644 index 000000000..3454bbd61 --- /dev/null +++ b/docs/Extensions/NSString.html @@ -0,0 +1,822 @@ + + + + NSString Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/Extensions/String.html b/docs/Extensions/String.html new file mode 100644 index 000000000..5cd71bbbe --- /dev/null +++ b/docs/Extensions/String.html @@ -0,0 +1,822 @@ + + + + String Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/Extensions/UInt.html b/docs/Extensions/UInt.html new file mode 100644 index 000000000..03d41ad5c --- /dev/null +++ b/docs/Extensions/UInt.html @@ -0,0 +1,821 @@ + + + + UInt Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt

+
+
+ +
extension UInt: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/UInt16.html b/docs/Extensions/UInt16.html new file mode 100644 index 000000000..0eac6a8a7 --- /dev/null +++ b/docs/Extensions/UInt16.html @@ -0,0 +1,821 @@ + + + + UInt16 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt16

+
+
+ +
extension UInt16: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/UInt32.html b/docs/Extensions/UInt32.html new file mode 100644 index 000000000..6c326b73c --- /dev/null +++ b/docs/Extensions/UInt32.html @@ -0,0 +1,821 @@ + + + + UInt32 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt32

+
+
+ +
extension UInt32: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/UInt64.html b/docs/Extensions/UInt64.html new file mode 100644 index 000000000..b937628af --- /dev/null +++ b/docs/Extensions/UInt64.html @@ -0,0 +1,821 @@ + + + + UInt64 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt64

+
+
+ +
extension UInt64: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions/UInt8.html b/docs/Extensions/UInt8.html new file mode 100644 index 000000000..ada330ae9 --- /dev/null +++ b/docs/Extensions/UInt8.html @@ -0,0 +1,821 @@ + + + + UInt8 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt8

+
+
+ +
extension UInt8: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Functions.html b/docs/Functions.html new file mode 100644 index 000000000..4ca169d97 --- /dev/null +++ b/docs/Functions.html @@ -0,0 +1,5439 @@ + + + + Functions Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Functions

+

The following functions are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func catchBadInstruction(in block: @escaping () -> Void) -> BadInstructionException?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + block + + +
    +

    a function without parameters that will be run

    +
    +
    +
    +
    +

    Return Value

    +

    if an EXC_BAD_INSTRUCTION is raised during the execution of block then a BadInstructionException will be returned, otherwise nil.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func MACH_MSGH_BITS_REMOTE(_ bits: UInt32) -> UInt32
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MACH_MSGH_BITS(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func MACH_MSGH_BITS(_ remote: UInt32, _ local: UInt32) -> UInt32
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler,
    +                                 file: FileString = #file,
    +                                 line: UInt = #line,
    +                                 closure: () throws -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func gatherExpectations(silently: Bool = false, closure: () -> Void) -> [AssertionRecord]
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func gatherFailingExpectations(silently: Bool = false, closure: () -> Void) -> [AssertionRecord]
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func recordFailure(_ message: String, location: SourceLocation)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func waitUntil(timeout: DispatchTimeInterval = AsyncDefaults.timeout, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expect(file:line:_:) + +
    +
    +
    +
    +
    +
    +

    Make an expectation on a given actual value. The value given is lazily evaluated.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func expect<T>(file: FileString = #file, line: UInt = #line, _ expression: @autoclosure @escaping () throws -> T?) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expect(file:line:_:) + +
    +
    +
    +
    +
    +
    +

    Make an expectation on a given actual value. The closure is lazily invoked.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func expect<T>(file: FileString = #file, line: UInt = #line, _ expression: @autoclosure () -> (() throws -> T)) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expect(file:line:_:) + +
    +
    +
    +
    +
    +
    +

    Make an expectation on a given actual value. The closure is lazily invoked.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func expect<T>(file: FileString = #file, line: UInt = #line, _ expression: @autoclosure () -> (() throws -> T?)) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expect(file:line:_:) + +
    +
    +
    +
    +
    +
    +

    Make an expectation on a given actual value. The closure is lazily invoked.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func expect(file: FileString = #file, line: UInt = #line, _ expression: @autoclosure () -> (() throws -> Void)) -> Expectation<Void>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail(_:location:) + +
    +
    +
    +
    +
    +
    +

    Always fails the test with a message and a specified location.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func fail(_ message: String, location: SourceLocation)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail(_:file:line:) + +
    +
    +
    +
    +
    +
    +

    Always fails the test with a message.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func fail(_ message: String, file: FileString = #file, line: UInt = #line)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail(_:line:) + +
    +
    +
    +
    +
    +
    +

    Always fails the test.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func fail(_ file: FileString = #file, line: UInt = #line)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allPass(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func allPass<S: Sequence>(
    +    _ passFunc: @escaping (S.Element) throws -> Bool
    +) -> Predicate<S>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allPass(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func allPass<S: Sequence>(
    +    _ passName: String,
    +    _ passFunc: @escaping (S.Element) throws -> Bool
    +) -> Predicate<S>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allPass(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func allPass<S>(_ elementPredicate: Predicate<S.Element>) -> Predicate<S> where S : Sequence
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAKindOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is an instance of the given class.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beAKindOf<T>(_ expectedType: T.Type) -> Predicate<Any>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAKindOf(_:) + +
    +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beAKindOf(_ expectedClass: AnyClass) -> Predicate<NSObject>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAnInstanceOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is an exact instance of the given class.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beAnInstanceOf<T>(_ expectedType: T.Type) -> Predicate<Any>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAnInstanceOf(_:) + +
    +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beAnInstanceOf(_ expectedClass: AnyClass) -> Predicate<NSObject>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultDelta() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func defaultDelta<F>() -> F where F : FloatingPoint
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beCloseTo(_:within:) + +
    +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beCloseTo<Value: FloatingPoint>(
    +    _ expectedValue: Value,
    +    within delta: Value = defaultDelta()
    +) -> Predicate<Value>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beCloseTo(_:within:) + +
    +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beCloseTo<Value: NMBDoubleConvertible>(
    +    _ expectedValue: Value,
    +    within delta: Double = DefaultDelta
    +) -> Predicate<Value>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beCloseTo(_:within:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beCloseTo<Value: FloatingPoint, Values: Collection>(
    +    _ expectedValues: Values,
    +    within delta: Value = defaultDelta()
    +) -> Predicate<Values> where Values.Element == Value
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Operators +

+
+
+
    +
  • +
    + + + + ±(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ± <Value>(lhs: Value, rhs: Value) -> (expected: Value, delta: Value) where Value : FloatingPoint
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ±(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ± <Value>(lhs: Value, rhs: Double) -> (expected: Value, delta: Double) where Value : NMBDoubleConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty<S>() -> Predicate<S> where S : Sequence
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty<S>() -> Predicate<S> where S : SetAlgebra
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty<S>() -> Predicate<S> where S : Sequence, S : SetAlgebra
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<NSString>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<NSDictionary>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<NSArray>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<NMBCollection>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beGreaterThan(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is greater than the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beGreaterThan<T>(_ expectedValue: T?) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + >(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func > <T>(lhs: Expectation<T>, rhs: T) where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beGreaterThan(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is greater than the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beGreaterThan(_ expectedValue: NMBComparable?) -> Predicate<NMBComparable>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + >(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func > (lhs: Expectation<NMBComparable>, rhs: NMBComparable?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is greater than +or equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beGreaterThanOrEqualTo<T>(_ expectedValue: T?) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + >=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func >= <T>(lhs: Expectation<T>, rhs: T) where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is greater than +or equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beGreaterThanOrEqualTo<T>(_ expectedValue: T?) -> Predicate<T> where T : NMBComparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + >=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func >= <T>(lhs: Expectation<T>, rhs: T) where T : NMBComparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beIdenticalTo(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is the same instance +as the expected instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beIdenticalTo(_ expected: AnyObject?) -> Predicate<AnyObject>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + be(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is the same instance +as the expected instance.

    + +

    Alias for “beIdenticalTo”.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func be(_ expected: AnyObject?) -> Predicate<AnyObject>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beLessThan(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is less than the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beLessThan<T>(_ expectedValue: T?) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func < <T>(lhs: Expectation<T>, rhs: T) where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beLessThan(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is less than the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beLessThan(_ expectedValue: NMBComparable?) -> Predicate<NMBComparable>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func < (lhs: Expectation<NMBComparable>, rhs: NMBComparable?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is less than +or equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beLessThanOrEqualTo<T>(_ expectedValue: T?) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func <= <T>(lhs: Expectation<T>, rhs: T) where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is less than +or equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beLessThanOrEqualTo<T>(_ expectedValue: T?) -> Predicate<T> where T : NMBComparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func <= <T>(lhs: Expectation<T>, rhs: T) where T : NMBComparable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

beTrue() / beFalse() +

+
+
+
    +
  • +
    + + + + beTrue() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is exactly true. +This matcher will not match against nils.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beTrue() -> Predicate<Bool>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFalse() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is exactly false. +This matcher will not match against nils.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beFalse() -> Predicate<Bool>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

beTruthy() / beFalsy() +

+
+
+
    +
  • +
    + + + + beTruthy() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is not logically false.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beTruthy<T>() -> Predicate<T> where T : Equatable, T : ExpressibleByBooleanLiteral
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFalsy() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is logically false. +This matcher will match against nils.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beFalsy<T>() -> Predicate<T> where T : Equatable, T : ExpressibleByBooleanLiteral
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beNil() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beNil<T>() -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beSuccess(test:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher for Result that succeeds when the actual value is success.

    + +

    You can pass a closure to do any arbitrary custom matching to the value inside result. +The closure only gets called when the result is success.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beSuccess<Success, Failure>(
    +    test: ((Success) -> Void)? = nil
    +) -> Predicate<Result<Success, Failure>>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFailure(test:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher for Result that succeeds when the actual value is failure.

    + +

    You can pass a closure to do any arbitrary custom matching to the error inside result. +The closure only gets called when the result is failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beFailure<Success, Failure>(
    +    test: ((Failure) -> Void)? = nil
    +) -> Predicate<Result<Success, Failure>>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beVoid() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is Void.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beVoid() -> Predicate<()>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beWithin(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is within given range.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beWithin<T>(_ range: Range<T>) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beWithin(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is within given range.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beWithin<T>(_ range: ClosedRange<T>) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence’s first element +is equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith<S>(_ startingElement: S.Element) -> Predicate<S> where S : Sequence, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual collection’s first element +is equal to the expected object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith(_ startingElement: Any) -> Predicate<NMBOrderedCollection>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual string contains expected substring +where the expected substring’s location is zero.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith(_ startingSubstring: String) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(prefix:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the exepected sequence is a prefix of the actual sequence.

    + +

    This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2854218-starts

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith<Seq1: Sequence, Seq2: Sequence>(prefix expectedPrefix: Seq2?)
    +    -> Predicate<Seq1> where Seq1.Element: Equatable, Seq1.Element == Seq2.Element
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(prefix:by:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the expected sequence is the prefix of the actual sequence, using the given predicate as the equivalence test.

    + +

    This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2996828-starts

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith<Seq1: Sequence, Seq2: Sequence>(
    +    prefix expectedPrefix: Seq2?,
    +    by areEquivalent: @escaping (Seq1.Element, Seq2.Element) -> Bool
    +) -> Predicate<Seq1>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: S.Element...) -> Predicate<S> where S : Sequence, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: [S.Element]) -> Predicate<S> where S : Sequence, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: S.Element...) -> Predicate<S> where S : SetAlgebra, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: [S.Element]) -> Predicate<S> where S : SetAlgebra, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: S.Element...) -> Predicate<S> where S : Sequence, S : SetAlgebra, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: [S.Element]) -> Predicate<S> where S : Sequence, S : SetAlgebra, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual string contains the expected substring.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ substrings: String...) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ substrings: [String]) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual string contains the expected substring.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ substrings: NSString...) -> Predicate<NSString>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ substrings: [NSString]) -> Predicate<NSString>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual collection contains the expected object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ items: Any?...) -> Predicate<NMBContainer>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ items: [Any?]) -> Predicate<NMBContainer>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func containElementSatisfying<S: Sequence>(
    +    _ predicate: @escaping ((S.Element) -> Bool), _ predicateDescription: String = ""
    +) -> Predicate<S>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + elementsEqual(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain the same elements in +the same order.

    + +

    This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2854213-elementsequal

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func elementsEqual<Seq1: Sequence, Seq2: Sequence>(
    +    _ expectedValue: Seq2?
    +) -> Predicate<Seq1> where Seq1.Element: Equatable, Seq1.Element == Seq2.Element
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + elementsEqual(_:by:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain equivalent elements in +the same order, using the given predicate as the equivalence test.

    + +

    This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2949668-elementsequal

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func elementsEqual<Seq1: Sequence, Seq2: Sequence>(
    +    _ expectedValue: Seq2?,
    +    by areEquivalent: @escaping (Seq1.Element, Seq2.Element) -> Bool
    +) -> Predicate<Seq1>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence’s last element +is equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func endWith<S>(_ endingElement: S.Element) -> Predicate<S> where S : Sequence, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual collection’s last element +is equal to the expected object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func endWith(_ endingElement: Any) -> Predicate<NMBOrderedCollection>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endWith(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func endWith(_ endingSubstring: String) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple2 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable>(
    +    _ expectedValue: (T1, T2)?
    +) -> Predicate<(T1, T2)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable>(
    +    lhs: Expectation<(T1, T2)>,
    +    rhs: (T1, T2)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable>(
    +    lhs: Expectation<(T1, T2)>,
    +    rhs: (T1, T2)?
    +)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple3 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable, T3: Equatable>(
    +    _ expectedValue: (T1, T2, T3)?
    +) -> Predicate<(T1, T2, T3)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable, T3: Equatable>(
    +    lhs: Expectation<(T1, T2, T3)>,
    +    rhs: (T1, T2, T3)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable, T3: Equatable>(
    +    lhs: Expectation<(T1, T2, T3)>,
    +    rhs: (T1, T2, T3)?
    +)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple4 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
    +    _ expectedValue: (T1, T2, T3, T4)?
    +) -> Predicate<(T1, T2, T3, T4)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4)>,
    +    rhs: (T1, T2, T3, T4)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4)>,
    +    rhs: (T1, T2, T3, T4)?
    +)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple5 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
    +    _ expectedValue: (T1, T2, T3, T4, T5)?
    +) -> Predicate<(T1, T2, T3, T4, T5)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4, T5)>,
    +    rhs: (T1, T2, T3, T4, T5)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4, T5)>,
    +    rhs: (T1, T2, T3, T4, T5)?
    +)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple6 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
    +    _ expectedValue: (T1, T2, T3, T4, T5, T6)?
    +) -> Predicate<(T1, T2, T3, T4, T5, T6)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4, T5, T6)>,
    +    rhs: (T1, T2, T3, T4, T5, T6)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4, T5, T6)>,
    +    rhs: (T1, T2, T3, T4, T5, T6)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    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).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: T) -> Predicate<T> where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher allowing comparison of collection with optional type

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: [T?]) -> Predicate<[T?]> where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    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).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: T?) -> Predicate<T> where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set is equal to the expected set.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: Set<T>) -> Predicate<Set<T>> where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set is equal to the expected set.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: Set<T>?) -> Predicate<Set<T>> where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set is equal to the expected set.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: Set<T>) -> Predicate<Set<T>> where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set is equal to the expected set.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: Set<T>?) -> Predicate<Set<T>> where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual dictionary is equal to the expected dictionary

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<K, V>(_ expectedValue: [K : V?]) -> Predicate<[K : V]> where K : Hashable, V : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<T>, rhs: T) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<T>, rhs: T?) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<T>, rhs: T) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<T>, rhs: T?) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<[T]>, rhs: [T]?) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<[T]>, rhs: [T]?) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<Set<T>>, rhs: Set<T>) where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<Set<T>>, rhs: Set<T>?) where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<Set<T>>, rhs: Set<T>) where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<Set<T>>, rhs: Set<T>?) where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<Set<T>>, rhs: Set<T>) where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<Set<T>>, rhs: Set<T>?) where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<Set<T>>, rhs: Set<T>) where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<Set<T>>, rhs: Set<T>?) where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T, C>(lhs: Expectation<[T : C]>, rhs: [T : C]?) where T : Hashable, C : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T, C>(lhs: Expectation<[T : C]>, rhs: [T : C]?) where T : Hashable, C : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + haveCount(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual Collection’s count equals +the expected value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func haveCount<T>(_ expectedValue: Int) -> Predicate<T> where T : Collection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + haveCount(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual collection’s count equals +the expected value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func haveCount(_ expectedValue: Int) -> Predicate<NMBCollection>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + match(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual string satisfies the regular expression +described by the expected string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func match(_ expectedValue: String?) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + matchError(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func matchError<T>(_ error: T) -> Predicate<Error> where T : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + matchError(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func matchError<T>(_ error: T) -> Predicate<Error> where T : Equatable, T : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + matchError(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual expression evaluates to an +error of the specified type

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func matchError<T>(_ errorType: T.Type) -> Predicate<Error> where T : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func postNotifications<Out>(
    +    _ predicate: Predicate<[Notification]>,
    +    from center: NotificationCenter = .default
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func postDistributedNotifications<Out>(
    +    _ predicate: Predicate<[Notification]>,
    +    from center: DistributedNotificationCenter = .default(),
    +    names: Set<Notification.Name>
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func raiseException<Out>(
    +    named: NSExceptionName? = nil,
    +    reason: String? = nil,
    +    userInfo: NSDictionary? = nil,
    +    closure: ((NSException) -> Void)? = nil
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func raiseException<Out>(
    +    named: String?,
    +    reason: String? = nil,
    +    userInfo: NSDictionary? = nil,
    +    closure: ((NSException) -> Void)? = nil
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyAllOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value matches with all of the matchers +provided in the variable list of matchers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfyAllOf<T>(_ predicates: Predicate<T>...) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyAllOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value matches with all of the matchers +provided in the array of matchers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfyAllOf<T>(_ predicates: [Predicate<T>]) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + &&(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func && <T>(left: Predicate<T>, right: Predicate<T>) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyAnyOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value matches with any of the matchers +provided in the variable list of matchers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfyAnyOf<T>(_ predicates: Predicate<T>...) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyAnyOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value matches with any of the matchers +provided in the array of matchers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfyAnyOf<T>(_ predicates: [Predicate<T>]) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ||(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func || <T>(left: Predicate<T>, right: Predicate<T>) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +
    +
  • +
  • +
    + + + + throwAssertion() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwAssertion<Out>() -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + throwError() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<Out>() -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<T, Out>(_ error: T, closure: ((Error) -> Void)? = nil) -> Predicate<Out> where T : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<T, Out>(_ error: T, closure: ((T) -> Void)? = nil) -> Predicate<Out> where T : Equatable, T : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<T: Error, Out>(
    +    errorType: T.Type,
    +    closure: ((T) -> Void)? = nil
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + throwError(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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<Out>(closure: @escaping ((Error) -> Void)) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + throwError(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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<T, Out>(closure: @escaping ((T) -> Void)) -> Predicate<Out> where T : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + succeed() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func succeed() -> Predicate<ToSucceedResult>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + stringify(_:) + +
    +
    +
    +
    +
    +
    +

    Returns a string appropriate for displaying in test output +from the provided value.

    +
    +

    See also

    +

    TestOutputStringConvertible

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func stringify<T>(_ value: T?) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    A value that will show up in a test’s output.

    +
    +
    +
    +
    +

    Return Value

    +

    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.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func prettyCollectionType<T>(_ value: T) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    A value that will be used to determine a type name.

    +
    +
    +
    +
    +

    Return Value

    +

    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.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the type name for a given collection type. This overload is used by Swift +collection types.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func prettyCollectionType<T>(_ collection: T) -> String where T : Collection
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + collection + + +
    +

    A Swift CollectionType value.

    +
    +
    +
    +
    +

    Return Value

    +

    A string representing the dynamicType of the value.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Global Variables.html b/docs/Global Variables.html new file mode 100644 index 000000000..25f3c4dfa --- /dev/null +++ b/docs/Global Variables.html @@ -0,0 +1,1038 @@ + + + + Global Variables Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Global Variables

+

The following global variables are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let MACH_MSG_TYPE_MAKE_SEND: UInt32
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + nativeThreadState + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • +
    + + + + nativeThreadState + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let nativeThreadState: Int32
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let nativeThreadStateCount: UInt32
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let nativeMachExceptionMask: exception_mask_t
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EXC_TYPES_COUNT + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let EXC_TYPES_COUNT: Int
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var NimbleAssertionHandler: AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DefaultDelta + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let DefaultDelta: Double
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Protocols.html b/docs/Protocols.html new file mode 100644 index 000000000..22f03469a --- /dev/null +++ b/docs/Protocols.html @@ -0,0 +1,998 @@ + + + + Protocols Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + AssertionHandler + +
    +
    +
    +
    +
    +
    +

    Protocol for the assertion handler that Nimble uses for all expectations.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBContainer + +
    +
    +
    +
    +
    +
    +

    Protocol for types that support contain() matcher.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol NMBContainer
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBCollection + +
    +
    +
    +
    +
    +
    +

    Protocol for types that support only beEmpty(), haveCount() matchers

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol NMBCollection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBOrderedCollection + +
    +
    +
    +
    +
    +
    +

    Protocol for types that support beginWith(), endWith(), beEmpty() matchers

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol NMBOrderedCollection : NMBCollection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBDoubleConvertible + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol NMBDoubleConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBComparable + +
    +
    +
    +
    +
    +
    +

    Protocol for types to support beLessThan(), beLessThanOrEqualTo(), + beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers.

    + +

    Types that conform to Swift’s Comparable protocol will work implicitly too

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol NMBComparable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    +
    +

    See also

    + CustomDebugStringConvertible + +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol TestOutputStringConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Protocols/AssertionHandler.html b/docs/Protocols/AssertionHandler.html new file mode 100644 index 000000000..0ce52585b --- /dev/null +++ b/docs/Protocols/AssertionHandler.html @@ -0,0 +1,823 @@ + + + + AssertionHandler Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AssertionHandler

+
+
+ +
public protocol AssertionHandler
+ +
+
+

Protocol for the assertion handler that Nimble uses for all expectations.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/Protocols/NMBCollection.html b/docs/Protocols/NMBCollection.html new file mode 100644 index 000000000..8aaaaaa1f --- /dev/null +++ b/docs/Protocols/NMBCollection.html @@ -0,0 +1,823 @@ + + + + NMBCollection Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBCollection

+
+
+ +
public protocol NMBCollection
+ +
+
+

Protocol for types that support only beEmpty(), haveCount() matchers

+ +
+
+
+
    +
  • +
    + + + + count + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var count: Int { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Protocols/NMBComparable.html b/docs/Protocols/NMBComparable.html new file mode 100644 index 000000000..76b048f45 --- /dev/null +++ b/docs/Protocols/NMBComparable.html @@ -0,0 +1,827 @@ + + + + NMBComparable Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBComparable

+
+
+ +
@objc
+public protocol NMBComparable
+ +
+
+

Protocol for types to support beLessThan(), beLessThanOrEqualTo(), + beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers.

+ +

Types that conform to Swift’s Comparable protocol will work implicitly too

+ +
+
+
+
    +
  • +
    + + + + NMB_compare(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Protocols/NMBContainer.html b/docs/Protocols/NMBContainer.html new file mode 100644 index 000000000..828511b98 --- /dev/null +++ b/docs/Protocols/NMBContainer.html @@ -0,0 +1,823 @@ + + + + NMBContainer Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBContainer

+
+
+ +
public protocol NMBContainer
+ +
+
+

Protocol for types that support contain() matcher.

+ +
+
+
+
    +
  • +
    + + + + contains(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func contains(_ anObject: Any) -> Bool
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Protocols/NMBDoubleConvertible.html b/docs/Protocols/NMBDoubleConvertible.html new file mode 100644 index 000000000..594973212 --- /dev/null +++ b/docs/Protocols/NMBDoubleConvertible.html @@ -0,0 +1,823 @@ + + + + NMBDoubleConvertible Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBDoubleConvertible

+
+
+ +
public protocol NMBDoubleConvertible
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + doubleValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var doubleValue: CDouble { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Protocols/NMBOrderedCollection.html b/docs/Protocols/NMBOrderedCollection.html new file mode 100644 index 000000000..139c32b1b --- /dev/null +++ b/docs/Protocols/NMBOrderedCollection.html @@ -0,0 +1,823 @@ + + + + NMBOrderedCollection Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBOrderedCollection

+
+
+ +
public protocol NMBOrderedCollection : NMBCollection
+ +
+
+

Protocol for types that support beginWith(), endWith(), beEmpty() matchers

+ +
+
+
+
    +
  • +
    + + + + object(at:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func object(at index: Int) -> Any
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Protocols/TestOutputStringConvertible.html b/docs/Protocols/TestOutputStringConvertible.html new file mode 100644 index 000000000..df9e2d145 --- /dev/null +++ b/docs/Protocols/TestOutputStringConvertible.html @@ -0,0 +1,832 @@ + + + + TestOutputStringConvertible Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

TestOutputStringConvertible

+
+
+ +
public protocol TestOutputStringConvertible
+ +
+
+

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.

+
+

See also

+ CustomDebugStringConvertible + +
+ +
+
+
+
    +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Structs.html b/docs/Structs.html new file mode 100644 index 000000000..036c90b82 --- /dev/null +++ b/docs/Structs.html @@ -0,0 +1,1015 @@ + + + + Structures Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + execTypesCountTuple + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct execTypesCountTuple<T> where T : ExpressibleByIntegerLiteral
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AssertionRecord + +
    +
    +
    +
    +
    +
    +

    A data structure that stores information about an assertion when +AssertionRecorder is set as the Nimble assertion handler.

    + +

    @see AssertionRecorder +@see AssertionHandler

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct AssertionRecord : CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Expectation + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Expression + +
    +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Expression<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AsyncDefaults + +
    +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct AsyncDefaults
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Predicate + +
    +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PredicateResult + +
    +
    +
    +
    +
    +
    +

    The value that a Predicates return to describe if the given (actual) value matches the +predicate.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct PredicateResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Structs/AssertionRecord.html b/docs/Structs/AssertionRecord.html new file mode 100644 index 000000000..b8027a9e0 --- /dev/null +++ b/docs/Structs/AssertionRecord.html @@ -0,0 +1,907 @@ + + + + AssertionRecord Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AssertionRecord

+
+
+ +
public struct AssertionRecord : CustomStringConvertible
+ +
+
+

A data structure that stores information about an assertion when +AssertionRecorder is set as the Nimble assertion handler.

+ +

@see AssertionRecorder +@see AssertionHandler

+ +
+
+
+
    +
  • +
    + + + + success + +
    +
    +
    +
    +
    +
    +

    Whether the assertion succeeded or failed

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let success: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + message + +
    +
    +
    +
    +
    +
    +

    The failure message the assertion would display on failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let message: FailureMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + location + +
    +
    +
    +
    +
    +
    +

    The source location the expectation occurred on.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let location: SourceLocation
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Structs/AsyncDefaults.html b/docs/Structs/AsyncDefaults.html new file mode 100644 index 000000000..157fd19a8 --- /dev/null +++ b/docs/Structs/AsyncDefaults.html @@ -0,0 +1,851 @@ + + + + AsyncDefaults Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AsyncDefaults

+
+
+ +
public struct AsyncDefaults
+ +
+
+

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.

+ +
+
+
+
    +
  • +
    + + + + timeout + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var timeout: DispatchTimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + pollInterval + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var pollInterval: DispatchTimeInterval
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Structs/Expectation.html b/docs/Structs/Expectation.html new file mode 100644 index 000000000..5f6b8fde3 --- /dev/null +++ b/docs/Structs/Expectation.html @@ -0,0 +1,1637 @@ + + + + Expectation Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Expectation

+
+
+ +
public struct Expectation<T>
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + expression + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let expression: Expression<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(expression:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expression: Expression<T>)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + verify(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func verify(_ pass: Bool, _ message: FailureMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + to(_:description:) + +
    +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to match.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func to(_ predicate: Predicate<T>, description: String? = nil) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNot(_:description:) + +
    +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to not match.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func toNot(_ predicate: Predicate<T>, description: String? = nil) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + notTo(_:description:) + +
    +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to not match.

    + +

    Alias to toNot().

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func notTo(_ predicate: Predicate<T>, description: String? = nil) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toEventually(_ predicate: Predicate<T>, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toEventuallyNot(_ predicate: Predicate<T>, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toNotEventually(_ predicate: Predicate<T>, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to never 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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toNever(_ predicate: Predicate<T>, until: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to never match by checking +continuously at each pollInterval until the timeout is reached.

    + +

    Alias of toNever()

    + +

    @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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func neverTo(_ predicate: Predicate<T>, until: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to always match by checking +continusouly 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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toAlways(_ predicate: Predicate<T>, until: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to always match by checking +continusouly at each pollInterval until the timeout is reached

    + +

    Alias of toAlways()

    + +

    @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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func alwaysTo(_ predicate: Predicate<T>, until: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Nil + +
    +
    +
    +
    +
    +
    +

    Represents nil value to be used with the operator overloads for beNil.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Nil : ExpressibleByNilLiteral
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Expectation, rhs: Expectation.Nil)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func != (lhs: Expectation, rhs: Expectation.Nil)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T: Collection, T.Element: FloatingPoint +

+
+
+
    +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: T)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T: FloatingPoint +

+
+
+
    +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: T)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: (expected: T, delta: T))
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Expectation, rhs: (expected: T, delta: T))
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T: NMBDoubleConvertible +

+
+
+
    +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: T)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: (expected: T, delta: Double))
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Expectation, rhs: (expected: T, delta: Double))
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T == AnyObject +

+
+
+
    +
  • +
    + + + + ===(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func === (lhs: Expectation, rhs: AnyObject?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func !== (lhs: Expectation, rhs: AnyObject?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T == () +

+
+
+
    +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Expectation<()>, rhs: ())
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func != (lhs: Expectation<()>, rhs: ())
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Structs/Expectation/Nil.html b/docs/Structs/Expectation/Nil.html new file mode 100644 index 000000000..b2736c653 --- /dev/null +++ b/docs/Structs/Expectation/Nil.html @@ -0,0 +1,822 @@ + + + + Nil Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Nil

+
+
+ +
public struct Nil : ExpressibleByNilLiteral
+ +
+
+

Represents nil value to be used with the operator overloads for beNil.

+ +
+
+
+
    +
  • +
    + + + + init(nilLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(nilLiteral: ())
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Structs/Expression.html b/docs/Structs/Expression.html new file mode 100644 index 000000000..37ec6af2b --- /dev/null +++ b/docs/Structs/Expression.html @@ -0,0 +1,1025 @@ + + + + Expression Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Expression

+
+
+ +
public struct Expression<T>
+ +
+
+

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.

+ +
+
+
+
    +
  • +
    + + + + location + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let location: SourceLocation
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isClosure + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expression: @escaping () throws -> T?, location: SourceLocation, isClosure: Bool = true)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(memoizedExpression: @escaping (Bool) throws -> T?, location: SourceLocation, withoutCaching: Bool, isClosure: Bool = true)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cast(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cast<U>(_ block: @escaping (T?) throws -> U?) -> Expression<U>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate() throws -> T?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withoutCaching() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withoutCaching() -> Expression<T>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Structs/Predicate.html b/docs/Structs/Predicate.html new file mode 100644 index 000000000..8f07a1d68 --- /dev/null +++ b/docs/Structs/Predicate.html @@ -0,0 +1,1038 @@ + + + + Predicate Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Predicate

+
+
+ +
public struct Predicate<T>
+ +
+
+

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.

+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Constructs a predicate that knows how take a given value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ matcher: @escaping (Expression<T>) throws -> PredicateResult)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfies(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfies(_ expression: Expression<T>) throws -> PredicateResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + define(matcher:) + +
    +
    +
    +
    +
    +
    +

    Like Predicate() constructor, but automatically guard against nil (actual) values

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func define(matcher: @escaping (Expression<T>) throws -> PredicateResult) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + define(_:matcher:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func define(_ message: String = "match", matcher: @escaping (Expression<T>, ExpectationMessage) throws -> PredicateResult) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func defineNilable(_ message: String = "match", matcher: @escaping (Expression<T>, ExpectationMessage) throws -> PredicateResult) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + simple(_:matcher:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func simple(_ message: String = "match", matcher: @escaping (Expression<T>) throws -> PredicateStatus) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func simpleNilable(_ message: String = "match", matcher: @escaping (Expression<T>) throws -> PredicateStatus) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requireNonNil + +
    +
    +
    +
    +
    +
    +

    Returns a new Predicate based on the current one that always fails if nil is given as +the actual value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var requireNonNil: Predicate<T> { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Structs/PredicateResult.html b/docs/Structs/PredicateResult.html new file mode 100644 index 000000000..02f4b71c9 --- /dev/null +++ b/docs/Structs/PredicateResult.html @@ -0,0 +1,959 @@ + + + + PredicateResult Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

PredicateResult

+
+
+ +
public struct PredicateResult
+ +
+
+

The value that a Predicates return to describe if the given (actual) value matches the +predicate.

+ +
+
+
+
    +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    Status indicates if the predicate matches, does not match, or fails.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var status: PredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + message + +
    +
    +
    +
    +
    +
    +

    The error message that can be displayed if it does not match

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var message: ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(status:message:) + +
    +
    +
    +
    +
    +
    +

    Constructs a new PredicateResult with a given status and error message

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(status: PredicateStatus, message: ExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(bool:message:) + +
    +
    +
    +
    +
    +
    +

    Shorthand to PredicateResult(status: PredicateStatus(bool: bool), message: message)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(bool: Bool, message: ExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Converts the result to a boolean based on what the expectation intended

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toBoolean(expectation style: ExpectationStyle) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toObjectiveC() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toObjectiveC() -> NMBPredicateResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Structs/execTypesCountTuple.html b/docs/Structs/execTypesCountTuple.html new file mode 100644 index 000000000..5863321a9 --- /dev/null +++ b/docs/Structs/execTypesCountTuple.html @@ -0,0 +1,850 @@ + + + + execTypesCountTuple Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

execTypesCountTuple

+
+
+ +
public struct execTypesCountTuple<T> where T : ExpressibleByIntegerLiteral
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: (T, T, T, T, T, T, T, T, T, T, T, T, T, T)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Typealiases.html b/docs/Typealiases.html new file mode 100644 index 000000000..d6105e909 --- /dev/null +++ b/docs/Typealiases.html @@ -0,0 +1,861 @@ + + + + Type Aliases Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Type Aliases

+

The following type aliases are available globally.

+ +
+
+
+
    +
  • +
    + + + + PredicateBlock + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias PredicateBlock = (_ actualExpression: Expression<NSObject>) throws -> NMBPredicateResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + FileString + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • +
    + + + + FileString + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias FileString = String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/badge.svg b/docs/badge.svg new file mode 100644 index 000000000..7eb257cb4 --- /dev/null +++ b/docs/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 46% + + + 46% + + + diff --git a/docs/css/highlight.css b/docs/css/highlight.css new file mode 100644 index 000000000..c170357ce --- /dev/null +++ b/docs/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/docs/css/jazzy.css b/docs/css/jazzy.css new file mode 100644 index 000000000..2e3871391 --- /dev/null +++ b/docs/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/docsets/Nimble.docset/Contents/Info.plist b/docs/docsets/Nimble.docset/Contents/Info.plist new file mode 100644 index 000000000..780a0a655 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + com.jazzy.nimble + CFBundleName + Nimble + DocSetPlatformFamily + nimble + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 000000000..c03d9ade0 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,1241 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(BadInstructionException)
    +public class BadInstructionException : NSException
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AssertionDispatcher + +
    +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class AssertionDispatcher : AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AssertionRecorder + +
    +
    +
    +
    +
    +
    +

    An AssertionHandler that silently records assertions that Nimble makes. +This is useful for testing failure messages for matchers.

    + +

    @see AssertionHandler

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class AssertionRecorder : AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBExpectation + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBExpectation : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NimbleXCTestHandler + +
    +
    +
    +
    +
    +
    +

    Default handler for Nimble. This assertion handler passes failures along to +XCTest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NimbleXCTestHandler : AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Alternative handler for Nimble. This assertion handler passes failures along +to XCTest by attempting to reduce the failure message size.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NimbleShortXCTestHandler : AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBExpectationMessage + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBExpectationMessage : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + FailureMessage + +
    +
    +
    +
    +
    +
    +

    Encapsulates the failure message that matchers can report to the end user.

    + +

    This is shared state between Nimble and matchers that mutate this value.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class FailureMessage : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBPredicate + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBPredicate : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBObjCBeCloseToPredicate : NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBPredicateResult + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    final public class NMBPredicateResult : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBPredicateStatus + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    final public class NMBPredicateStatus : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class NMBObjCRaiseExceptionPredicate : NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +
    +
  • +
  • +
    + + + + SourceLocation + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class SourceLocation : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBStringer + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class NMBStringer : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/AssertionDispatcher.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/AssertionDispatcher.html new file mode 100644 index 000000000..caf01ff22 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/AssertionDispatcher.html @@ -0,0 +1,854 @@ + + + + AssertionDispatcher Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AssertionDispatcher

+
+
+ +
public class AssertionDispatcher : AssertionHandler
+ +
+
+

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.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/AssertionRecorder.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/AssertionRecorder.html new file mode 100644 index 000000000..94e6f3fb8 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/AssertionRecorder.html @@ -0,0 +1,880 @@ + + + + AssertionRecorder Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AssertionRecorder

+
+
+ +
public class AssertionRecorder : AssertionHandler
+ +
+
+

An AssertionHandler that silently records assertions that Nimble makes. +This is useful for testing failure messages for matchers.

+ +

@see AssertionHandler

+ +
+
+
+
    +
  • +
    + + + + assertions + +
    +
    +
    +
    +
    +
    +

    All the assertions that were captured by this recorder

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var assertions: [AssertionRecord]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/BadInstructionException.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/BadInstructionException.html new file mode 100644 index 000000000..ee64592aa --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/BadInstructionException.html @@ -0,0 +1,852 @@ + + + + BadInstructionException Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

BadInstructionException

+
+
+ +
@objc(BadInstructionException)
+public class BadInstructionException : NSException
+ +
+
+

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.

+ +
+
+
+
    +
  • +
    + + + + init(coder:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    required public init?(coder aDecoder: NSCoder)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + receiveReply(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(receiveReply:)
    +public class func receiveReply(_ reply: bad_instruction_exception_reply_t) -> CInt
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/FailureMessage.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/FailureMessage.html new file mode 100644 index 000000000..58d888fac --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/FailureMessage.html @@ -0,0 +1,1070 @@ + + + + FailureMessage Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

FailureMessage

+
+
+ +
public class FailureMessage : NSObject
+ +
+
+

Encapsulates the failure message that matchers can report to the end user.

+ +

This is shared state between Nimble and matchers that mutate this value.

+ +
+
+
+
    +
  • +
    + + + + expected + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var expected: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + actualValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var actualValue: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + to + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var to: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + postfixMessage + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var postfixMessage: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + postfixActual + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var postfixActual: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + extendedMessage + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var extendedMessage: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + userDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var userDescription: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + stringValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var stringValue: String { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(stringValue:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(stringValue: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBExpectation.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBExpectation.html new file mode 100644 index 000000000..ac5fee61c --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBExpectation.html @@ -0,0 +1,1440 @@ + + + + NMBExpectation Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBExpectation

+
+
+ +
public class NMBExpectation : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(actualBlock: @escaping () -> NSObject?, negative: Bool, file: FileString, line: UInt)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withTimeout + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var withTimeout: (TimeInterval) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + to + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var to: (NMBPredicate) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toWithDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toWithDescription: (NMBPredicate, String) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNot + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNot: (NMBPredicate) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNotWithDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNotWithDescription: (NMBPredicate, String) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + notTo + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var notTo: (NMBPredicate) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + notToWithDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var notToWithDescription: (NMBPredicate, String) -> NMBExpectation { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toEventually + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toEventually: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toEventuallyWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toEventuallyNot + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toEventuallyNot: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toEventuallyNotWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNotEventually + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNotEventually: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNotEventuallyWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNever + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNever: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toNeverWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + neverTo + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var neverTo: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var neverToWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toAlways + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toAlways: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var toAlwaysWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + alwaysTo + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var alwaysTo: (NMBPredicate) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var alwaysToWithDescription: (NMBPredicate, String) -> Void { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func failWithMessage(_ message: String, file: FileString, line: UInt)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBExpectationMessage.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBExpectationMessage.html new file mode 100644 index 000000000..f82eab3f4 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBExpectationMessage.html @@ -0,0 +1,1066 @@ + + + + NMBExpectationMessage Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBExpectationMessage

+
+
+ +
public class NMBExpectationMessage : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + init(expectedTo:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expectedTo message: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expectedActualValueTo message: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expectedActualValueTo message: String, customActualValue actual: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(fail:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(fail message: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(prepend:child:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(prepend message: String, child: NMBExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(appendedMessage message: String, child: NMBExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(prependedMessage message: String, child: NMBExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(details:child:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(details message: String, child: NMBExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appendedBeNilHint() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func appendedBeNilHint() -> NMBExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toSwift() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toSwift() -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBObjCBeCloseToPredicate.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBObjCBeCloseToPredicate.html new file mode 100644 index 000000000..f0fe62b47 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBObjCBeCloseToPredicate.html @@ -0,0 +1,824 @@ + + + + NMBObjCBeCloseToPredicate Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBObjCBeCloseToPredicate

+
+
+ +
public class NMBObjCBeCloseToPredicate : NMBPredicate
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + within + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var within: (CDouble) -> NMBObjCBeCloseToPredicate { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBObjCRaiseExceptionPredicate.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBObjCRaiseExceptionPredicate.html new file mode 100644 index 000000000..324708b51 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBObjCRaiseExceptionPredicate.html @@ -0,0 +1,908 @@ + + + + NMBObjCRaiseExceptionPredicate Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBObjCRaiseExceptionPredicate

+
+
+ +
public class NMBObjCRaiseExceptionPredicate : NMBPredicate
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + named + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var named: (_ name: String) -> NMBObjCRaiseExceptionPredicate { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionPredicate { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + userInfo + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionPredicate { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyingBlock + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionPredicate { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicate.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicate.html new file mode 100644 index 000000000..54ef19157 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicate.html @@ -0,0 +1,1536 @@ + + + + NMBPredicate Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBPredicate

+
+
+ +
public class NMBPredicate : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + init(predicate:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(predicate: @escaping PredicateBlock)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allPassMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func allPassMatcher(_ predicate: NMBPredicate) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAKindOfMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmptyMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beEmptyMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beLessThanMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

beTruthy() / beFalsy() +

+
+
+
    +
  • +
    + + + + beTruthyMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beTruthyMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFalsyMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beFalsyMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beTrueMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beTrueMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFalseMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beFalseMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beNilMatcher() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beNilMatcher() -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWithMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func beginWithMatcher(_ expected: Any) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + containMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func containMatcher(_ expected: [NSObject]) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endWithMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func endWithMatcher(_ expected: Any) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equalMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func equalMatcher(_ expected: NSObject) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + haveCountMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func haveCountMatcher(_ expected: NSNumber) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + matchMatcher(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func matchMatcher(_ expected: NSString) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func satisfyAllOfMatcher(_ predicates: [NMBPredicate]) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func satisfyAnyOfMatcher(_ predicates: [NMBPredicate]) -> NMBPredicate
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicateResult.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicateResult.html new file mode 100644 index 000000000..a29df4289 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicateResult.html @@ -0,0 +1,931 @@ + + + + NMBPredicateResult Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBPredicateResult

+
+
+ +
final public class NMBPredicateResult : NSObject
+ +
+
+

Undocumented

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicateStatus.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicateStatus.html new file mode 100644 index 000000000..131179e15 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBPredicateStatus.html @@ -0,0 +1,1012 @@ + + + + NMBPredicateStatus Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBPredicateStatus

+
+
+ +
final public class NMBPredicateStatus : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + matches + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let matches: NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doesNotMatch + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let doesNotMatch: NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let fail: NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + hash + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override var hash: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isEqual(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override func isEqual(_ object: Any?) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + from(status:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func from(status: PredicateStatus) -> NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + from(bool:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func from(bool success: Bool) -> NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toSwift() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toSwift() -> PredicateStatus
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBStringer.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBStringer.html new file mode 100644 index 000000000..e8f8b54c9 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NMBStringer.html @@ -0,0 +1,825 @@ + + + + NMBStringer Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBStringer

+
+
+ +
@objc
+public class NMBStringer : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + stringify(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class func stringify(_ obj: Any?) -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NimbleShortXCTestHandler.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NimbleShortXCTestHandler.html new file mode 100644 index 000000000..434d51f30 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NimbleShortXCTestHandler.html @@ -0,0 +1,824 @@ + + + + NimbleShortXCTestHandler Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NimbleShortXCTestHandler

+
+
+ +
public class NimbleShortXCTestHandler : AssertionHandler
+ +
+
+

Alternative handler for Nimble. This assertion handler passes failures along +to XCTest by attempting to reduce the failure message size.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NimbleXCTestHandler.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NimbleXCTestHandler.html new file mode 100644 index 000000000..3b1fc8581 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/NimbleXCTestHandler.html @@ -0,0 +1,824 @@ + + + + NimbleXCTestHandler Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NimbleXCTestHandler

+
+
+ +
public class NimbleXCTestHandler : AssertionHandler
+ +
+
+

Default handler for Nimble. This assertion handler passes failures along to +XCTest.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/SourceLocation.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/SourceLocation.html new file mode 100644 index 000000000..2ba6bc901 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Classes/SourceLocation.html @@ -0,0 +1,877 @@ + + + + SourceLocation Class Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

SourceLocation

+
+
+ +
public final class SourceLocation : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + file + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let file: FileString
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + line + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let line: UInt
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    override public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 000000000..3cba5283a --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,903 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + ExpectationMessage + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public indirect enum ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ExpectationStyle + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ExpectationStyle
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PredicateStatus + +
    +
    +
    +
    +
    +
    +

    PredicateStatus is a trinary that indicates if a Predicate matches a given value or not

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum PredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ToSucceedResult + +
    +
    +
    +
    +
    +
    +

    Used by the succeed matcher.

    + +

    This is the return type for the closure.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ToSucceedResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ExpectationMessage.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ExpectationMessage.html new file mode 100644 index 000000000..9a981b38d --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ExpectationMessage.html @@ -0,0 +1,1206 @@ + + + + ExpectationMessage Enumeration Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ExpectationMessage

+
+
+ +
public indirect enum ExpectationMessage
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    includes actual value in output (“expected to , got ”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case expectedActualValueTo(String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    uses a custom actual value string in output (“expected to , got ”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case expectedCustomValueTo(String, actual: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expectedTo(_:) + +
    +
    +
    +
    +
    +
    +

    excludes actual value in output (“expected to ”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case expectedTo(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail(_:) + +
    +
    +
    +
    +
    +
    +

    allows any free-form message (“”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case fail(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + prepends(_:_:) + +
    +
    +
    +
    +
    +
    +

    Not Fully Implemented Yet.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case prepends(String, ExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appends(_:_:) + +
    +
    +
    +
    +
    +
    +

    appends after an existing message (“ (use beNil() to match nils)”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case appends(ExpectationMessage, String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + details(_:_:) + +
    +
    +
    +
    +
    +
    +

    provides long-form multi-line explainations (“\n\n”)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case details(ExpectationMessage, String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expectedMessage + +
    +
    +
    +
    +
    +
    +

    Returns the smallest message after the “expected to” string that summarizes the error.

    + +

    Returns the message part from ExpectationMessage, ignoring all .appends and .details.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var expectedMessage: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appended(message:) + +
    +
    +
    +
    +
    +
    +

    Appends a message after the primary expectation message

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func appended(message: String) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appendedBeNilHint() + +
    +
    +
    +
    +
    +
    +

    Appends a message hinting to use beNil() for when the actual value given was nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func appendedBeNilHint() -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + appended(details:) + +
    +
    +
    +
    +
    +
    +

    Appends a detailed (aka - multiline) message after the primary expectation message +Detailed messages will be placed after .appended(message:) calls.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func appended(details: String) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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:).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func replacedExpectation(_ f: @escaping (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Wraps a primary expectation with text before and after it. +Alias to prepended(message: before).appended(message: after)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func wrappedExpectation(before: String, after: String) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Prepends a message by modifying the primary expectation

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func prepended(expectation message: String) -> ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Converts the tree of ExpectationMessages into a final built string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toString(actual: String, expected: String = "expected", to: String = "to") -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ExpectationStyle.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ExpectationStyle.html new file mode 100644 index 000000000..120ebda6e --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ExpectationStyle.html @@ -0,0 +1,850 @@ + + + + ExpectationStyle Enumeration Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ExpectationStyle

+
+
+ +
public enum ExpectationStyle
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + toMatch + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case toMatch
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNotMatch + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case toNotMatch
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/PredicateStatus.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/PredicateStatus.html new file mode 100644 index 000000000..79e866508 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/PredicateStatus.html @@ -0,0 +1,942 @@ + + + + PredicateStatus Enumeration Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

PredicateStatus

+
+
+ +
public enum PredicateStatus
+ +
+
+

PredicateStatus is a trinary that indicates if a Predicate matches a given value or not

+ +
+
+
+
    +
  • +
    + + + + matches + +
    +
    +
    +
    +
    +
    +

    Matches indicates if the predicate / matcher passes with the given value

    + +

    For example, equals(1) returns .matches for expect(1).to(equal(1)).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case matches
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doesNotMatch + +
    +
    +
    +
    +
    +
    +

    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)).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doesNotMatch
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case fail
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(bool:) + +
    +
    +
    +
    +
    +
    +

    Converts a boolean to either .matches (if true) or .doesNotMatch (if false).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(bool matches: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toObjectiveC() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toObjectiveC() -> NMBPredicateStatus
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ToSucceedResult.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ToSucceedResult.html new file mode 100644 index 000000000..170f888c8 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Enums/ToSucceedResult.html @@ -0,0 +1,852 @@ + + + + ToSucceedResult Enumeration Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ToSucceedResult

+
+
+ +
public enum ToSucceedResult
+ +
+
+

Used by the succeed matcher.

+ +

This is the return type for the closure.

+ +
+
+
+
    +
  • +
    + + + + succeeded + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case succeeded
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failed(reason:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case failed(reason: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions.html new file mode 100644 index 000000000..3b18f4c2d --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions.html @@ -0,0 +1,1524 @@ + + + + Extensions Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/AnySequence.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/AnySequence.html new file mode 100644 index 000000000..06bfca5d0 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/AnySequence.html @@ -0,0 +1,822 @@ + + + + AnySequence Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Array.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Array.html new file mode 100644 index 000000000..0d7da297a --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Array.html @@ -0,0 +1,822 @@ + + + + Array Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Data.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Data.html new file mode 100644 index 000000000..e0536e365 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Data.html @@ -0,0 +1,822 @@ + + + + Data Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Date.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Date.html new file mode 100644 index 000000000..5b5f32a75 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Date.html @@ -0,0 +1,850 @@ + + + + Date Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Date

+
+
+ +
extension Date: NMBDoubleConvertible
+
extension Date: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + doubleValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var doubleValue: CDouble { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Double.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Double.html new file mode 100644 index 000000000..f35ad9ab1 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Double.html @@ -0,0 +1,849 @@ + + + + Double Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Double

+
+
+ +
extension Double: ExpressibleByBooleanLiteral
+
extension Double: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Float.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Float.html new file mode 100644 index 000000000..bb1f43a8b --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Float.html @@ -0,0 +1,849 @@ + + + + Float Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Float

+
+
+ +
extension Float: ExpressibleByBooleanLiteral
+
extension Float: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int.html new file mode 100644 index 000000000..59fab0b39 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int.html @@ -0,0 +1,821 @@ + + + + Int Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int

+
+
+ +
extension Int: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int16.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int16.html new file mode 100644 index 000000000..f74c131f9 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int16.html @@ -0,0 +1,821 @@ + + + + Int16 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int16

+
+
+ +
extension Int16: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int32.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int32.html new file mode 100644 index 000000000..4e21a0b49 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int32.html @@ -0,0 +1,821 @@ + + + + Int32 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int32

+
+
+ +
extension Int32: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int64.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int64.html new file mode 100644 index 000000000..0c81d7a79 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int64.html @@ -0,0 +1,821 @@ + + + + Int64 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int64

+
+
+ +
extension Int64: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int8.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int8.html new file mode 100644 index 000000000..f21032c1f --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/Int8.html @@ -0,0 +1,821 @@ + + + + Int8 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Int8

+
+
+ +
extension Int8: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSArray.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSArray.html new file mode 100644 index 000000000..18e83ac55 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSArray.html @@ -0,0 +1,824 @@ + + + + NSArray Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSDate.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSDate.html new file mode 100644 index 000000000..f065b2bde --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSDate.html @@ -0,0 +1,850 @@ + + + + NSDate Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NSDate

+
+
+ +
extension NSDate: NMBDoubleConvertible
+
extension NSDate: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + doubleValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var doubleValue: CDouble { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSException.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSException.html new file mode 100644 index 000000000..4150a3d75 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSException.html @@ -0,0 +1,822 @@ + + + + NSException Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NSException

+
+
+ +
extension NSException
+ +
+
+ +
+
+
+
    +
  • +
    + + + + catchException(in:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func catchException(in block: @escaping () -> Void) -> `Self`?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSIndexSet.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSIndexSet.html new file mode 100644 index 000000000..56aa85a90 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSIndexSet.html @@ -0,0 +1,823 @@ + + + + NSIndexSet Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSNumber.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSNumber.html new file mode 100644 index 000000000..7476faee2 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSNumber.html @@ -0,0 +1,851 @@ + + + + NSNumber Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NSNumber

+
+
+ +
extension NSNumber: NMBDoubleConvertible
+
extension NSNumber: NMBComparable
+
extension NSNumber: TestOutputStringConvertible
+ +
+
+ +
+
+
+
    +
  • +
    + + + + NMB_compare(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSString.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSString.html new file mode 100644 index 000000000..3454bbd61 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/NSString.html @@ -0,0 +1,822 @@ + + + + NSString Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/String.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/String.html new file mode 100644 index 000000000..5cd71bbbe --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/String.html @@ -0,0 +1,822 @@ + + + + String Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt.html new file mode 100644 index 000000000..03d41ad5c --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt.html @@ -0,0 +1,821 @@ + + + + UInt Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt

+
+
+ +
extension UInt: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt16.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt16.html new file mode 100644 index 000000000..0eac6a8a7 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt16.html @@ -0,0 +1,821 @@ + + + + UInt16 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt16

+
+
+ +
extension UInt16: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt32.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt32.html new file mode 100644 index 000000000..6c326b73c --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt32.html @@ -0,0 +1,821 @@ + + + + UInt32 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt32

+
+
+ +
extension UInt32: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt64.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt64.html new file mode 100644 index 000000000..b937628af --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt64.html @@ -0,0 +1,821 @@ + + + + UInt64 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt64

+
+
+ +
extension UInt64: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt8.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt8.html new file mode 100644 index 000000000..ada330ae9 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Extensions/UInt8.html @@ -0,0 +1,821 @@ + + + + UInt8 Extension Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

UInt8

+
+
+ +
extension UInt8: ExpressibleByBooleanLiteral
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral value: Bool)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Functions.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Functions.html new file mode 100644 index 000000000..4ca169d97 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Functions.html @@ -0,0 +1,5439 @@ + + + + Functions Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Functions

+

The following functions are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func catchBadInstruction(in block: @escaping () -> Void) -> BadInstructionException?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + block + + +
    +

    a function without parameters that will be run

    +
    +
    +
    +
    +

    Return Value

    +

    if an EXC_BAD_INSTRUCTION is raised during the execution of block then a BadInstructionException will be returned, otherwise nil.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func MACH_MSGH_BITS_REMOTE(_ bits: UInt32) -> UInt32
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MACH_MSGH_BITS(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func MACH_MSGH_BITS(_ remote: UInt32, _ local: UInt32) -> UInt32
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler,
    +                                 file: FileString = #file,
    +                                 line: UInt = #line,
    +                                 closure: () throws -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func gatherExpectations(silently: Bool = false, closure: () -> Void) -> [AssertionRecord]
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func gatherFailingExpectations(silently: Bool = false, closure: () -> Void) -> [AssertionRecord]
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func recordFailure(_ message: String, location: SourceLocation)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func waitUntil(timeout: DispatchTimeInterval = AsyncDefaults.timeout, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expect(file:line:_:) + +
    +
    +
    +
    +
    +
    +

    Make an expectation on a given actual value. The value given is lazily evaluated.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func expect<T>(file: FileString = #file, line: UInt = #line, _ expression: @autoclosure @escaping () throws -> T?) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expect(file:line:_:) + +
    +
    +
    +
    +
    +
    +

    Make an expectation on a given actual value. The closure is lazily invoked.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func expect<T>(file: FileString = #file, line: UInt = #line, _ expression: @autoclosure () -> (() throws -> T)) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expect(file:line:_:) + +
    +
    +
    +
    +
    +
    +

    Make an expectation on a given actual value. The closure is lazily invoked.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func expect<T>(file: FileString = #file, line: UInt = #line, _ expression: @autoclosure () -> (() throws -> T?)) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + expect(file:line:_:) + +
    +
    +
    +
    +
    +
    +

    Make an expectation on a given actual value. The closure is lazily invoked.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func expect(file: FileString = #file, line: UInt = #line, _ expression: @autoclosure () -> (() throws -> Void)) -> Expectation<Void>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail(_:location:) + +
    +
    +
    +
    +
    +
    +

    Always fails the test with a message and a specified location.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func fail(_ message: String, location: SourceLocation)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail(_:file:line:) + +
    +
    +
    +
    +
    +
    +

    Always fails the test with a message.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func fail(_ message: String, file: FileString = #file, line: UInt = #line)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fail(_:line:) + +
    +
    +
    +
    +
    +
    +

    Always fails the test.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func fail(_ file: FileString = #file, line: UInt = #line)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allPass(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func allPass<S: Sequence>(
    +    _ passFunc: @escaping (S.Element) throws -> Bool
    +) -> Predicate<S>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allPass(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func allPass<S: Sequence>(
    +    _ passName: String,
    +    _ passFunc: @escaping (S.Element) throws -> Bool
    +) -> Predicate<S>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allPass(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func allPass<S>(_ elementPredicate: Predicate<S.Element>) -> Predicate<S> where S : Sequence
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAKindOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is an instance of the given class.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beAKindOf<T>(_ expectedType: T.Type) -> Predicate<Any>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAKindOf(_:) + +
    +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beAKindOf(_ expectedClass: AnyClass) -> Predicate<NSObject>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAnInstanceOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is an exact instance of the given class.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beAnInstanceOf<T>(_ expectedType: T.Type) -> Predicate<Any>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beAnInstanceOf(_:) + +
    +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beAnInstanceOf(_ expectedClass: AnyClass) -> Predicate<NSObject>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultDelta() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func defaultDelta<F>() -> F where F : FloatingPoint
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beCloseTo(_:within:) + +
    +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beCloseTo<Value: FloatingPoint>(
    +    _ expectedValue: Value,
    +    within delta: Value = defaultDelta()
    +) -> Predicate<Value>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beCloseTo(_:within:) + +
    +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beCloseTo<Value: NMBDoubleConvertible>(
    +    _ expectedValue: Value,
    +    within delta: Double = DefaultDelta
    +) -> Predicate<Value>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beCloseTo(_:within:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beCloseTo<Value: FloatingPoint, Values: Collection>(
    +    _ expectedValues: Values,
    +    within delta: Value = defaultDelta()
    +) -> Predicate<Values> where Values.Element == Value
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Operators +

+
+
+
    +
  • +
    + + + + ±(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ± <Value>(lhs: Value, rhs: Value) -> (expected: Value, delta: Value) where Value : FloatingPoint
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ±(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ± <Value>(lhs: Value, rhs: Double) -> (expected: Value, delta: Double) where Value : NMBDoubleConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty<S>() -> Predicate<S> where S : Sequence
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty<S>() -> Predicate<S> where S : SetAlgebra
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty<S>() -> Predicate<S> where S : Sequence, S : SetAlgebra
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<NSString>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<NSDictionary>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<NSArray>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beEmpty() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beEmpty() -> Predicate<NMBCollection>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beGreaterThan(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is greater than the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beGreaterThan<T>(_ expectedValue: T?) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + >(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func > <T>(lhs: Expectation<T>, rhs: T) where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beGreaterThan(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is greater than the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beGreaterThan(_ expectedValue: NMBComparable?) -> Predicate<NMBComparable>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + >(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func > (lhs: Expectation<NMBComparable>, rhs: NMBComparable?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is greater than +or equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beGreaterThanOrEqualTo<T>(_ expectedValue: T?) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + >=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func >= <T>(lhs: Expectation<T>, rhs: T) where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is greater than +or equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beGreaterThanOrEqualTo<T>(_ expectedValue: T?) -> Predicate<T> where T : NMBComparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + >=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func >= <T>(lhs: Expectation<T>, rhs: T) where T : NMBComparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beIdenticalTo(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is the same instance +as the expected instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beIdenticalTo(_ expected: AnyObject?) -> Predicate<AnyObject>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + be(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is the same instance +as the expected instance.

    + +

    Alias for “beIdenticalTo”.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func be(_ expected: AnyObject?) -> Predicate<AnyObject>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beLessThan(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is less than the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beLessThan<T>(_ expectedValue: T?) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func < <T>(lhs: Expectation<T>, rhs: T) where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beLessThan(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is less than the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beLessThan(_ expectedValue: NMBComparable?) -> Predicate<NMBComparable>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func < (lhs: Expectation<NMBComparable>, rhs: NMBComparable?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is less than +or equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beLessThanOrEqualTo<T>(_ expectedValue: T?) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func <= <T>(lhs: Expectation<T>, rhs: T) where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is less than +or equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beLessThanOrEqualTo<T>(_ expectedValue: T?) -> Predicate<T> where T : NMBComparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func <= <T>(lhs: Expectation<T>, rhs: T) where T : NMBComparable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

beTrue() / beFalse() +

+
+
+
    +
  • +
    + + + + beTrue() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is exactly true. +This matcher will not match against nils.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beTrue() -> Predicate<Bool>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFalse() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is exactly false. +This matcher will not match against nils.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beFalse() -> Predicate<Bool>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

beTruthy() / beFalsy() +

+
+
+
    +
  • +
    + + + + beTruthy() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is not logically false.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beTruthy<T>() -> Predicate<T> where T : Equatable, T : ExpressibleByBooleanLiteral
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFalsy() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is logically false. +This matcher will match against nils.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beFalsy<T>() -> Predicate<T> where T : Equatable, T : ExpressibleByBooleanLiteral
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beNil() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beNil<T>() -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beSuccess(test:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher for Result that succeeds when the actual value is success.

    + +

    You can pass a closure to do any arbitrary custom matching to the value inside result. +The closure only gets called when the result is success.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beSuccess<Success, Failure>(
    +    test: ((Success) -> Void)? = nil
    +) -> Predicate<Result<Success, Failure>>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beFailure(test:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher for Result that succeeds when the actual value is failure.

    + +

    You can pass a closure to do any arbitrary custom matching to the error inside result. +The closure only gets called when the result is failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beFailure<Success, Failure>(
    +    test: ((Failure) -> Void)? = nil
    +) -> Predicate<Result<Success, Failure>>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beVoid() + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is Void.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beVoid() -> Predicate<()>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beWithin(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is within given range.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beWithin<T>(_ range: Range<T>) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beWithin(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value is within given range.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beWithin<T>(_ range: ClosedRange<T>) -> Predicate<T> where T : Comparable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence’s first element +is equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith<S>(_ startingElement: S.Element) -> Predicate<S> where S : Sequence, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual collection’s first element +is equal to the expected object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith(_ startingElement: Any) -> Predicate<NMBOrderedCollection>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual string contains expected substring +where the expected substring’s location is zero.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith(_ startingSubstring: String) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(prefix:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the exepected sequence is a prefix of the actual sequence.

    + +

    This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2854218-starts

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith<Seq1: Sequence, Seq2: Sequence>(prefix expectedPrefix: Seq2?)
    +    -> Predicate<Seq1> where Seq1.Element: Equatable, Seq1.Element == Seq2.Element
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + beginWith(prefix:by:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the expected sequence is the prefix of the actual sequence, using the given predicate as the equivalence test.

    + +

    This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2996828-starts

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func beginWith<Seq1: Sequence, Seq2: Sequence>(
    +    prefix expectedPrefix: Seq2?,
    +    by areEquivalent: @escaping (Seq1.Element, Seq2.Element) -> Bool
    +) -> Predicate<Seq1>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: S.Element...) -> Predicate<S> where S : Sequence, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: [S.Element]) -> Predicate<S> where S : Sequence, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: S.Element...) -> Predicate<S> where S : SetAlgebra, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: [S.Element]) -> Predicate<S> where S : SetAlgebra, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: S.Element...) -> Predicate<S> where S : Sequence, S : SetAlgebra, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set contains the expected values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain<S>(_ items: [S.Element]) -> Predicate<S> where S : Sequence, S : SetAlgebra, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual string contains the expected substring.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ substrings: String...) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ substrings: [String]) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual string contains the expected substring.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ substrings: NSString...) -> Predicate<NSString>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ substrings: [NSString]) -> Predicate<NSString>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual collection contains the expected object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ items: Any?...) -> Predicate<NMBContainer>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contain(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contain(_ items: [Any?]) -> Predicate<NMBContainer>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func containElementSatisfying<S: Sequence>(
    +    _ predicate: @escaping ((S.Element) -> Bool), _ predicateDescription: String = ""
    +) -> Predicate<S>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + elementsEqual(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain the same elements in +the same order.

    + +

    This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2854213-elementsequal

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func elementsEqual<Seq1: Sequence, Seq2: Sequence>(
    +    _ expectedValue: Seq2?
    +) -> Predicate<Seq1> where Seq1.Element: Equatable, Seq1.Element == Seq2.Element
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + elementsEqual(_:by:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain equivalent elements in +the same order, using the given predicate as the equivalence test.

    + +

    This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2949668-elementsequal

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func elementsEqual<Seq1: Sequence, Seq2: Sequence>(
    +    _ expectedValue: Seq2?,
    +    by areEquivalent: @escaping (Seq1.Element, Seq2.Element) -> Bool
    +) -> Predicate<Seq1>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual sequence’s last element +is equal to the expected value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func endWith<S>(_ endingElement: S.Element) -> Predicate<S> where S : Sequence, S.Element : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endWith(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual collection’s last element +is equal to the expected object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func endWith(_ endingElement: Any) -> Predicate<NMBOrderedCollection>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endWith(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func endWith(_ endingSubstring: String) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple2 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable>(
    +    _ expectedValue: (T1, T2)?
    +) -> Predicate<(T1, T2)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable>(
    +    lhs: Expectation<(T1, T2)>,
    +    rhs: (T1, T2)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable>(
    +    lhs: Expectation<(T1, T2)>,
    +    rhs: (T1, T2)?
    +)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple3 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable, T3: Equatable>(
    +    _ expectedValue: (T1, T2, T3)?
    +) -> Predicate<(T1, T2, T3)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable, T3: Equatable>(
    +    lhs: Expectation<(T1, T2, T3)>,
    +    rhs: (T1, T2, T3)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable, T3: Equatable>(
    +    lhs: Expectation<(T1, T2, T3)>,
    +    rhs: (T1, T2, T3)?
    +)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple4 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
    +    _ expectedValue: (T1, T2, T3, T4)?
    +) -> Predicate<(T1, T2, T3, T4)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4)>,
    +    rhs: (T1, T2, T3, T4)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4)>,
    +    rhs: (T1, T2, T3, T4)?
    +)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple5 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
    +    _ expectedValue: (T1, T2, T3, T4, T5)?
    +) -> Predicate<(T1, T2, T3, T4, T5)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4, T5)>,
    +    rhs: (T1, T2, T3, T4, T5)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4, T5)>,
    +    rhs: (T1, T2, T3, T4, T5)?
    +)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tuple6 +

+
+
+
    +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple. +Values can support equal by supporting the Equatable protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
    +    _ expectedValue: (T1, T2, T3, T4, T5, T6)?
    +) -> Predicate<(T1, T2, T3, T4, T5, T6)>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4, T5, T6)>,
    +    rhs: (T1, T2, T3, T4, T5, T6)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
    +    lhs: Expectation<(T1, T2, T3, T4, T5, T6)>,
    +    rhs: (T1, T2, T3, T4, T5, T6)?
    +)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    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).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: T) -> Predicate<T> where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher allowing comparison of collection with optional type

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: [T?]) -> Predicate<[T?]> where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    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).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: T?) -> Predicate<T> where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set is equal to the expected set.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: Set<T>) -> Predicate<Set<T>> where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set is equal to the expected set.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: Set<T>?) -> Predicate<Set<T>> where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set is equal to the expected set.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: Set<T>) -> Predicate<Set<T>> where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual set is equal to the expected set.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<T>(_ expectedValue: Set<T>?) -> Predicate<Set<T>> where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + equal(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual dictionary is equal to the expected dictionary

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func equal<K, V>(_ expectedValue: [K : V?]) -> Predicate<[K : V]> where K : Hashable, V : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<T>, rhs: T) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<T>, rhs: T?) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<T>, rhs: T) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<T>, rhs: T?) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<[T]>, rhs: [T]?) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<[T]>, rhs: [T]?) where T : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<Set<T>>, rhs: Set<T>) where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<Set<T>>, rhs: Set<T>?) where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<Set<T>>, rhs: Set<T>) where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<Set<T>>, rhs: Set<T>?) where T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<Set<T>>, rhs: Set<T>) where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T>(lhs: Expectation<Set<T>>, rhs: Set<T>?) where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<Set<T>>, rhs: Set<T>) where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T>(lhs: Expectation<Set<T>>, rhs: Set<T>?) where T : Comparable, T : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func == <T, C>(lhs: Expectation<[T : C]>, rhs: [T : C]?) where T : Hashable, C : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func != <T, C>(lhs: Expectation<[T : C]>, rhs: [T : C]?) where T : Hashable, C : Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + haveCount(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual Collection’s count equals +the expected value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func haveCount<T>(_ expectedValue: Int) -> Predicate<T> where T : Collection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + haveCount(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual collection’s count equals +the expected value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func haveCount(_ expectedValue: Int) -> Predicate<NMBCollection>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + match(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual string satisfies the regular expression +described by the expected string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func match(_ expectedValue: String?) -> Predicate<String>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + matchError(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func matchError<T>(_ error: T) -> Predicate<Error> where T : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + matchError(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func matchError<T>(_ error: T) -> Predicate<Error> where T : Equatable, T : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + matchError(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual expression evaluates to an +error of the specified type

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func matchError<T>(_ errorType: T.Type) -> Predicate<Error> where T : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func postNotifications<Out>(
    +    _ predicate: Predicate<[Notification]>,
    +    from center: NotificationCenter = .default
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func postDistributedNotifications<Out>(
    +    _ predicate: Predicate<[Notification]>,
    +    from center: DistributedNotificationCenter = .default(),
    +    names: Set<Notification.Name>
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func raiseException<Out>(
    +    named: NSExceptionName? = nil,
    +    reason: String? = nil,
    +    userInfo: NSDictionary? = nil,
    +    closure: ((NSException) -> Void)? = nil
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func raiseException<Out>(
    +    named: String?,
    +    reason: String? = nil,
    +    userInfo: NSDictionary? = nil,
    +    closure: ((NSException) -> Void)? = nil
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyAllOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value matches with all of the matchers +provided in the variable list of matchers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfyAllOf<T>(_ predicates: Predicate<T>...) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyAllOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value matches with all of the matchers +provided in the array of matchers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfyAllOf<T>(_ predicates: [Predicate<T>]) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + &&(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func && <T>(left: Predicate<T>, right: Predicate<T>) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyAnyOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value matches with any of the matchers +provided in the variable list of matchers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfyAnyOf<T>(_ predicates: Predicate<T>...) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfyAnyOf(_:) + +
    +
    +
    +
    +
    +
    +

    A Nimble matcher that succeeds when the actual value matches with any of the matchers +provided in the array of matchers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfyAnyOf<T>(_ predicates: [Predicate<T>]) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ||(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func || <T>(left: Predicate<T>, right: Predicate<T>) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +
    +
  • +
  • +
    + + + + throwAssertion() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwAssertion<Out>() -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + throwError() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<Out>() -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<T, Out>(_ error: T, closure: ((Error) -> Void)? = nil) -> Predicate<Out> where T : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<T, Out>(_ error: T, closure: ((T) -> Void)? = nil) -> Predicate<Out> where T : Equatable, T : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<T: Error, Out>(
    +    errorType: T.Type,
    +    closure: ((T) -> Void)? = nil
    +) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + throwError(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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<Out>(closure: @escaping ((Error) -> Void)) -> Predicate<Out>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + throwError(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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func throwError<T, Out>(closure: @escaping ((T) -> Void)) -> Predicate<Out> where T : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + succeed() + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func succeed() -> Predicate<ToSucceedResult>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + stringify(_:) + +
    +
    +
    +
    +
    +
    +

    Returns a string appropriate for displaying in test output +from the provided value.

    +
    +

    See also

    +

    TestOutputStringConvertible

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func stringify<T>(_ value: T?) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    A value that will show up in a test’s output.

    +
    +
    +
    +
    +

    Return Value

    +

    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.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func prettyCollectionType<T>(_ value: T) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    A value that will be used to determine a type name.

    +
    +
    +
    +
    +

    Return Value

    +

    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.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the type name for a given collection type. This overload is used by Swift +collection types.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func prettyCollectionType<T>(_ collection: T) -> String where T : Collection
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + collection + + +
    +

    A Swift CollectionType value.

    +
    +
    +
    +
    +

    Return Value

    +

    A string representing the dynamicType of the value.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Global Variables.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Global Variables.html new file mode 100644 index 000000000..25f3c4dfa --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Global Variables.html @@ -0,0 +1,1038 @@ + + + + Global Variables Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Global Variables

+

The following global variables are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let MACH_MSG_TYPE_MAKE_SEND: UInt32
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + nativeThreadState + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • +
    + + + + nativeThreadState + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let nativeThreadState: Int32
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let nativeThreadStateCount: UInt32
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let nativeMachExceptionMask: exception_mask_t
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EXC_TYPES_COUNT + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let EXC_TYPES_COUNT: Int
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var NimbleAssertionHandler: AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DefaultDelta + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let DefaultDelta: Double
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 000000000..22f03469a --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,998 @@ + + + + Protocols Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + AssertionHandler + +
    +
    +
    +
    +
    +
    +

    Protocol for the assertion handler that Nimble uses for all expectations.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol AssertionHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBContainer + +
    +
    +
    +
    +
    +
    +

    Protocol for types that support contain() matcher.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol NMBContainer
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBCollection + +
    +
    +
    +
    +
    +
    +

    Protocol for types that support only beEmpty(), haveCount() matchers

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol NMBCollection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBOrderedCollection + +
    +
    +
    +
    +
    +
    +

    Protocol for types that support beginWith(), endWith(), beEmpty() matchers

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol NMBOrderedCollection : NMBCollection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBDoubleConvertible + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol NMBDoubleConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NMBComparable + +
    +
    +
    +
    +
    +
    +

    Protocol for types to support beLessThan(), beLessThanOrEqualTo(), + beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers.

    + +

    Types that conform to Swift’s Comparable protocol will work implicitly too

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol NMBComparable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    +
    +

    See also

    + CustomDebugStringConvertible + +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol TestOutputStringConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/AssertionHandler.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/AssertionHandler.html new file mode 100644 index 000000000..0ce52585b --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/AssertionHandler.html @@ -0,0 +1,823 @@ + + + + AssertionHandler Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AssertionHandler

+
+
+ +
public protocol AssertionHandler
+ +
+
+

Protocol for the assertion handler that Nimble uses for all expectations.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBCollection.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBCollection.html new file mode 100644 index 000000000..8aaaaaa1f --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBCollection.html @@ -0,0 +1,823 @@ + + + + NMBCollection Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBCollection

+
+
+ +
public protocol NMBCollection
+ +
+
+

Protocol for types that support only beEmpty(), haveCount() matchers

+ +
+
+
+
    +
  • +
    + + + + count + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var count: Int { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBComparable.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBComparable.html new file mode 100644 index 000000000..76b048f45 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBComparable.html @@ -0,0 +1,827 @@ + + + + NMBComparable Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBComparable

+
+
+ +
@objc
+public protocol NMBComparable
+ +
+
+

Protocol for types to support beLessThan(), beLessThanOrEqualTo(), + beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers.

+ +

Types that conform to Swift’s Comparable protocol will work implicitly too

+ +
+
+
+
    +
  • +
    + + + + NMB_compare(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBContainer.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBContainer.html new file mode 100644 index 000000000..828511b98 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBContainer.html @@ -0,0 +1,823 @@ + + + + NMBContainer Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBContainer

+
+
+ +
public protocol NMBContainer
+ +
+
+

Protocol for types that support contain() matcher.

+ +
+
+
+
    +
  • +
    + + + + contains(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func contains(_ anObject: Any) -> Bool
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBDoubleConvertible.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBDoubleConvertible.html new file mode 100644 index 000000000..594973212 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBDoubleConvertible.html @@ -0,0 +1,823 @@ + + + + NMBDoubleConvertible Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBDoubleConvertible

+
+
+ +
public protocol NMBDoubleConvertible
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + doubleValue + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var doubleValue: CDouble { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBOrderedCollection.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBOrderedCollection.html new file mode 100644 index 000000000..139c32b1b --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/NMBOrderedCollection.html @@ -0,0 +1,823 @@ + + + + NMBOrderedCollection Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

NMBOrderedCollection

+
+
+ +
public protocol NMBOrderedCollection : NMBCollection
+ +
+
+

Protocol for types that support beginWith(), endWith(), beEmpty() matchers

+ +
+
+
+
    +
  • +
    + + + + object(at:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func object(at index: Int) -> Any
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/TestOutputStringConvertible.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/TestOutputStringConvertible.html new file mode 100644 index 000000000..df9e2d145 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Protocols/TestOutputStringConvertible.html @@ -0,0 +1,832 @@ + + + + TestOutputStringConvertible Protocol Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

TestOutputStringConvertible

+
+
+ +
public protocol TestOutputStringConvertible
+ +
+
+

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.

+
+

See also

+ CustomDebugStringConvertible + +
+ +
+
+
+
    +
  • +
    + + + + testDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var testDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs.html new file mode 100644 index 000000000..036c90b82 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs.html @@ -0,0 +1,1015 @@ + + + + Structures Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + execTypesCountTuple + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct execTypesCountTuple<T> where T : ExpressibleByIntegerLiteral
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AssertionRecord + +
    +
    +
    +
    +
    +
    +

    A data structure that stores information about an assertion when +AssertionRecorder is set as the Nimble assertion handler.

    + +

    @see AssertionRecorder +@see AssertionHandler

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct AssertionRecord : CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Expectation + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Expression + +
    +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Expression<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AsyncDefaults + +
    +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct AsyncDefaults
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Predicate + +
    +
    +
    +
    +
    +
    +

    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.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PredicateResult + +
    +
    +
    +
    +
    +
    +

    The value that a Predicates return to describe if the given (actual) value matches the +predicate.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct PredicateResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/AssertionRecord.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/AssertionRecord.html new file mode 100644 index 000000000..b8027a9e0 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/AssertionRecord.html @@ -0,0 +1,907 @@ + + + + AssertionRecord Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AssertionRecord

+
+
+ +
public struct AssertionRecord : CustomStringConvertible
+ +
+
+

A data structure that stores information about an assertion when +AssertionRecorder is set as the Nimble assertion handler.

+ +

@see AssertionRecorder +@see AssertionHandler

+ +
+
+
+
    +
  • +
    + + + + success + +
    +
    +
    +
    +
    +
    +

    Whether the assertion succeeded or failed

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let success: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + message + +
    +
    +
    +
    +
    +
    +

    The failure message the assertion would display on failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let message: FailureMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + location + +
    +
    +
    +
    +
    +
    +

    The source location the expectation occurred on.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let location: SourceLocation
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/AsyncDefaults.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/AsyncDefaults.html new file mode 100644 index 000000000..157fd19a8 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/AsyncDefaults.html @@ -0,0 +1,851 @@ + + + + AsyncDefaults Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AsyncDefaults

+
+
+ +
public struct AsyncDefaults
+ +
+
+

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.

+ +
+
+
+
    +
  • +
    + + + + timeout + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var timeout: DispatchTimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + pollInterval + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var pollInterval: DispatchTimeInterval
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expectation.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expectation.html new file mode 100644 index 000000000..5f6b8fde3 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expectation.html @@ -0,0 +1,1637 @@ + + + + Expectation Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Expectation

+
+
+ +
public struct Expectation<T>
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + expression + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let expression: Expression<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(expression:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expression: Expression<T>)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + verify(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func verify(_ pass: Bool, _ message: FailureMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + to(_:description:) + +
    +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to match.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func to(_ predicate: Predicate<T>, description: String? = nil) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toNot(_:description:) + +
    +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to not match.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func toNot(_ predicate: Predicate<T>, description: String? = nil) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + notTo(_:description:) + +
    +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to not match.

    + +

    Alias to toNot().

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func notTo(_ predicate: Predicate<T>, description: String? = nil) -> Expectation<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toEventually(_ predicate: Predicate<T>, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toEventuallyNot(_ predicate: Predicate<T>, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toNotEventually(_ predicate: Predicate<T>, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to never 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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toNever(_ predicate: Predicate<T>, until: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to never match by checking +continuously at each pollInterval until the timeout is reached.

    + +

    Alias of toNever()

    + +

    @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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func neverTo(_ predicate: Predicate<T>, until: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to always match by checking +continusouly 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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toAlways(_ predicate: Predicate<T>, until: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Tests the actual value using a matcher to always match by checking +continusouly at each pollInterval until the timeout is reached

    + +

    Alias of toAlways()

    + +

    @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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func alwaysTo(_ predicate: Predicate<T>, until: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Nil + +
    +
    +
    +
    +
    +
    +

    Represents nil value to be used with the operator overloads for beNil.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Nil : ExpressibleByNilLiteral
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Expectation, rhs: Expectation.Nil)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func != (lhs: Expectation, rhs: Expectation.Nil)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T: Collection, T.Element: FloatingPoint +

+
+
+
    +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: T)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T: FloatingPoint +

+
+
+
    +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: T)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: (expected: T, delta: T))
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Expectation, rhs: (expected: T, delta: T))
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T: NMBDoubleConvertible +

+
+
+
    +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: T)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ≈(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func  (lhs: Expectation, rhs: (expected: T, delta: Double))
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Expectation, rhs: (expected: T, delta: Double))
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T == AnyObject +

+
+
+
    +
  • +
    + + + + ===(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func === (lhs: Expectation, rhs: AnyObject?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func !== (lhs: Expectation, rhs: AnyObject?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where T == () +

+
+
+
    +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Expectation<()>, rhs: ())
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + !=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func != (lhs: Expectation<()>, rhs: ())
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expectation/Nil.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expectation/Nil.html new file mode 100644 index 000000000..b2736c653 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expectation/Nil.html @@ -0,0 +1,822 @@ + + + + Nil Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Nil

+
+
+ +
public struct Nil : ExpressibleByNilLiteral
+ +
+
+

Represents nil value to be used with the operator overloads for beNil.

+ +
+
+
+
    +
  • +
    + + + + init(nilLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(nilLiteral: ())
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expression.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expression.html new file mode 100644 index 000000000..37ec6af2b --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Expression.html @@ -0,0 +1,1025 @@ + + + + Expression Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Expression

+
+
+ +
public struct Expression<T>
+ +
+
+

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.

+ +
+
+
+
    +
  • +
    + + + + location + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let location: SourceLocation
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isClosure + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(expression: @escaping () throws -> T?, location: SourceLocation, isClosure: Bool = true)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(memoizedExpression: @escaping (Bool) throws -> T?, location: SourceLocation, withoutCaching: Bool, isClosure: Bool = true)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cast(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cast<U>(_ block: @escaping (T?) throws -> U?) -> Expression<U>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate() throws -> T?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withoutCaching() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withoutCaching() -> Expression<T>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Predicate.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Predicate.html new file mode 100644 index 000000000..8f07a1d68 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/Predicate.html @@ -0,0 +1,1038 @@ + + + + Predicate Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Predicate

+
+
+ +
public struct Predicate<T>
+ +
+
+

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.

+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Constructs a predicate that knows how take a given value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ matcher: @escaping (Expression<T>) throws -> PredicateResult)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + satisfies(_:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func satisfies(_ expression: Expression<T>) throws -> PredicateResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + define(matcher:) + +
    +
    +
    +
    +
    +
    +

    Like Predicate() constructor, but automatically guard against nil (actual) values

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func define(matcher: @escaping (Expression<T>) throws -> PredicateResult) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + define(_:matcher:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func define(_ message: String = "match", matcher: @escaping (Expression<T>, ExpectationMessage) throws -> PredicateResult) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func defineNilable(_ message: String = "match", matcher: @escaping (Expression<T>, ExpectationMessage) throws -> PredicateResult) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + simple(_:matcher:) + +
    +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func simple(_ message: String = "match", matcher: @escaping (Expression<T>) throws -> PredicateStatus) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    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.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func simpleNilable(_ message: String = "match", matcher: @escaping (Expression<T>) throws -> PredicateStatus) -> Predicate<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requireNonNil + +
    +
    +
    +
    +
    +
    +

    Returns a new Predicate based on the current one that always fails if nil is given as +the actual value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var requireNonNil: Predicate<T> { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/PredicateResult.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/PredicateResult.html new file mode 100644 index 000000000..02f4b71c9 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/PredicateResult.html @@ -0,0 +1,959 @@ + + + + PredicateResult Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

PredicateResult

+
+
+ +
public struct PredicateResult
+ +
+
+

The value that a Predicates return to describe if the given (actual) value matches the +predicate.

+ +
+
+
+
    +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    Status indicates if the predicate matches, does not match, or fails.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var status: PredicateStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + message + +
    +
    +
    +
    +
    +
    +

    The error message that can be displayed if it does not match

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var message: ExpectationMessage
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(status:message:) + +
    +
    +
    +
    +
    +
    +

    Constructs a new PredicateResult with a given status and error message

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(status: PredicateStatus, message: ExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(bool:message:) + +
    +
    +
    +
    +
    +
    +

    Shorthand to PredicateResult(status: PredicateStatus(bool: bool), message: message)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(bool: Bool, message: ExpectationMessage)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Converts the result to a boolean based on what the expectation intended

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toBoolean(expectation style: ExpectationStyle) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toObjectiveC() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toObjectiveC() -> NMBPredicateResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/execTypesCountTuple.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/execTypesCountTuple.html new file mode 100644 index 000000000..5863321a9 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Structs/execTypesCountTuple.html @@ -0,0 +1,850 @@ + + + + execTypesCountTuple Structure Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

execTypesCountTuple

+
+
+ +
public struct execTypesCountTuple<T> where T : ExpressibleByIntegerLiteral
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: (T, T, T, T, T, T, T, T, T, T, T, T, T, T)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/Typealiases.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Typealiases.html new file mode 100644 index 000000000..d6105e909 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/Typealiases.html @@ -0,0 +1,861 @@ + + + + Type Aliases Reference + + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Type Aliases

+

The following type aliases are available globally.

+ +
+
+
+
    +
  • +
    + + + + PredicateBlock + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias PredicateBlock = (_ actualExpression: Expression<NSObject>) throws -> NMBPredicateResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + FileString + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • +
    + + + + FileString + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias FileString = String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/css/highlight.css b/docs/docsets/Nimble.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 000000000..c170357ce --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/css/jazzy.css b/docs/docsets/Nimble.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 000000000..2e3871391 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/img/carat.png b/docs/docsets/Nimble.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/img/dash.png b/docs/docsets/Nimble.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/index.html b/docs/docsets/Nimble.docset/Contents/Resources/Documents/index.html new file mode 100644 index 000000000..26755f76f --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,2361 @@ + + + + Nimble Reference + + + + + + + + + + + + +
+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

Nimble

+ +

Build Status +CocoaPods +Carthage Compatible +Platforms

+ +

Use Nimble to express the expected outcomes of Swift +or Objective-C expressions. Inspired by +Cedar.

+
// 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

+ + + + +

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
+
+XCTAssertEqual(1 + 1, 2, "expected one plus one to equal two")
+
+ +

Or, in Objective-C:

+
// 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. +
  3. It’s hard to write asynchronous tests. XCTest forces you to write +a lot of boilerplate code.
  4. +
+ +

Nimble addresses these concerns.

+

Nimble: Expectations Using expect(...).to

+ +

Nimble allows you to express expectations using a natural, +easily understood language:

+
// Swift
+
+import Nimble
+
+expect(seagull.squawk).to(equal("Squee!"))
+
+
// 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
+
+import Nimble
+
+expect(seagull.squawk).toNot(equal("Oh, hello there!"))
+expect(seagull.squawk).notTo(equal("Oh, hello there!"))
+
+
// 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
+
+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:

+
// 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
+
+// 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
+
+// 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
+
+// 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:

+
// 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
+
+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
+
+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:

+
+
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
+DispatchQueue.main.async {
+    ocean.add("dolphins")
+    ocean.add("whales")
+}
+expect(ocean).toEventually(contain("dolphins", "whales"))
+
+
// 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.

+ +

You can also test that a value always or never matches throughout the length of the timeout. Use toNever and toAlways for this:

+
// Swift
+ocean.add("dolphins")
+expect(ocean).toAlways(contain("dolphins"))
+expect(ocean).toNever(contain("hares"))
+
+
// Objective-C
+[ocean add:@"dolphins"]
+expect(ocean).toAlways(contain(@"dolphins"))
+expect(ocean).toNever(contain(@"hares"))
+
+ +

Sometimes it takes more than a second for a value to update. In those +cases, use the timeout parameter:

+
// Swift
+
+// Waits three seconds for ocean to contain "starfish":
+expect(ocean).toEventually(contain("starfish"), timeout: .seconds(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: .milliseconds(5500), pollInterval: .milliseconds(200))
+
+
// 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
+
+waitUntil { done in
+    ocean.goFish { success in
+        expect(success).to(beTrue())
+        done()
+    }
+}
+
+
// Objective-C
+
+waitUntil(^(void (^done)(void)){
+    [ocean goFishWithHandler:^(BOOL success){
+        expect(success).to(beTrue());
+        done();
+    }];
+});
+
+ +

waitUntil also optionally takes a timeout parameter:

+
// Swift
+
+waitUntil(timeout: .seconds(10)) { done in
+    ocean.goFish { success in
+        expect(success).to(beTrue())
+        done()
+    }
+}
+
+
// 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
+
+// Increase the global timeout to 5 seconds:
+Nimble.AsyncDefaults.timeout = .seconds(5)
+
+// Slow the polling interval to 0.1 seconds:
+Nimble.AsyncDefaults.pollInterval = .milliseconds(100)
+
+

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:
  2. +
+
   // 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)));
+
+ +
    +
  1. To make an expectation on an expression that does not return a value, +such as -[NSException raise], use expectAction instead of +expect:
  2. +
+
   // 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.

+

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:

+
#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
+
+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))
+
+
// 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
+
+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
+
+// 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
+
+
// 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
+
+// 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.

+
// 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
+
+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
+
+
// 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
+
+expect(actual).to(beCloseTo(expected, within: delta))
+
+
// Objective-C
+
+expect(actual).to(beCloseTo(expected).within(delta));
+
+ +

For example, to assert that 10.01 is close to 10, you can write:

+
// Swift
+
+expect(10.01).to(beCloseTo(10, within: 0.1))
+
+
// Objective-C
+
+expect(@(10.01)).to(beCloseTo(@10).within(0.1));
+
+ +

There is also an operator shortcut available in 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
+
+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
+
+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 conform to FloatingPoint.

+
+

Types/Classes

+
// 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))
+
+
// 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
+
+expect(dolphin).to(beAKindOf(Mammal))
+
+
// Objective-C
+
+expect(dolphin).to(beAKindOf([Mammal class]));
+
+ +
+

beAnInstanceOf uses the -[NSObject isMemberOfClass:] method to + test membership. beAKindOf uses -[NSObject isKindOfClass:].

+
+

Truthiness

+
// 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())
+
+
// 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’s CwlPreconditionTesting library.

+
// 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.
  • +
  • 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

+ +

You can use the throwError matcher to check if an error is thrown.

+
// 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
+
+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
+
+// 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"))
+})
+
+
// 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). +Only Objective-C code can raise exceptions that Nimble will catch.

+

Collection Membership

+
// 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())
+
+
// 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.

+
+ +

For example, to assert that a list of sea creature names contains +“dolphin” and “starfish”:

+
// Swift
+
+expect(["whale", "dolphin", "starfish"]).to(contain("dolphin", "starfish"))
+
+
// 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
+
+// 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...))
+
+
// 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.

+ +

For code that returns collections of complex objects without a strict +ordering, there is the containElementSatisfying matcher:

+
// 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
+
+
// Objective-C
+
+@interface Turtle : NSObject
+@property (nonatomic, readonly, nonnull) NSString *color;
+@end
+
+@implementation Turtle 
+@end
+
+NSArray<Turtle *> * __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"];
+}));
+
+ +

For asserting on if the given Comparable value is inside of a Range, use the beWithin matcher.

+
// Swift
+
+// Passes if 5 is within the range 1 through 10, inclusive
+expect(5).to(beWithin(1...10))
+
+// Passes if 5 is not within the range 2 through 4.
+expect(5).toNot(beWithin(2..<5))
+
+

Strings

+
// 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))
+
+
// 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
+
+// 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.

+
// Objective-C
+
+expect(@[@1, @2, @3, @4]).to(allPass(beLessThan(@5)));
+
+

Collection Count

+
// 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))
+
+
// 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
+let testNotification = Notification(name: Notification.Name("Foo"), object: nil)
+
+// Passes if the closure in expect { ... } posts a notification to the default
+// notification center.
+expect {
+    NotificationCenter.default.post(testNotification)
+}.to(postNotifications(equal([testNotification])))
+
+// Passes if the closure in expect { ... } posts a notification to a given
+// notification center
+let notificationCenter = NotificationCenter()
+expect {
+    notificationCenter.post(testNotification)
+}.to(postNotifications(equal([testNotification]), from: notificationCenter))
+
+// Passes if the closure in expect { ... } posts a notification with the provided names to a given
+// notification center. Make sure to use this when running tests on Catalina, 
+// using DistributedNotificationCenter as there is currently no way 
+// of observing notifications without providing specific names.
+let distributedNotificationCenter = DistributedNotificationCenter()
+expect {
+    distributedNotificationCenter.post(testNotification)
+}.toEventually(postDistributedNotifications(equal([testNotification]),
+                                  from: distributedNotificationCenter,
+                                  names: [testNotification.name]))
+
+ +
+

This matcher is only available in Swift.

+
+

Result

+
// Swift
+let aResult: Result<String, Error> = .success("Hooray") 
+
+// passes if result is .success
+expect(aResult).to(beSuccess()) 
+
+// passes if result value is .success and validates Success value
+expect(aResult).to(beSuccess { value in
+    expect(value).to(equal("Hooray"))
+})
+
+
+enum AnError: Error {
+    case somethingHappened
+}
+let otherResult: Result<String, AnError> = .failure(.somethingHappened) 
+
+// passes if result is .failure
+expect(otherResult).to(beFailure()) 
+
+// passes if result value is .failure and validates error
+expect(otherResult).to(beFailure { error in
+    expect(error).to(matchError(AnError.somethingHappened))
+}) 
+
+ +
+

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))
+
+
// 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
+
+// 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
+
+public func equal<T: Equatable>(expectedValue: T?) -> Predicate<T> {
+    // Can be shortened to:
+    //   Predicate { actual in  ... }
+    //
+    // But shown with types here for clarity.
+    return Predicate { (actualExpression: Expression<T>) 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 +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
+
+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
+
+public indirect enum ExpectationMessage {
+// Emits standard error message:
+// eg - "expected to <string>, got <actual>"
+case expectedActualValueTo(/* message: */ String)
+
+// Allows any free-form message
+// eg - "<string>"
+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
+
+public func beNil<T>() -> Predicate<T> {
+    // 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
+
+public func haveDescription(description: String) -> Predicate<Printable?> {
+    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:

+
// 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
+
+public func equal<T: Equatable>(_ expectedValue: T?) -> Predicate<T> {
+    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
+
+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:

+
public indirect enum ExpectationMessage {
+// Emits standard error message:
+// eg - "expected to <message>, got <actual>"
+case expectedActualValueTo(/* message: */ String)
+
+// Allows any free-form message
+// eg - "<message>"
+case fail(/* message: */ String)
+
+// Emits standard error message with a custom actual value instead of the default.
+// eg - "expected to <message>, got <actual>"
+case expectedCustomValueTo(/* message: */ String, /* actual: */ String)
+
+// Emits standard error message without mentioning the actual value
+// eg - "expected to <message>"
+case expectedTo(/* message: */ String)
+
+// ...
+}
+
+ +

For matchers that compose other matchers, there are a handful of helper +functions to annotate messages.

+ +

appended(message: String) is used to append to the original failure message:

+
// produces "expected to be true, got <actual> (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:

+
// produces "expected to be true, got <actual>\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 NMBPredicate class, adding a new class method for your +custom matcher. The example below defines the class method ++[NMBPredicate beNilMatcher]:

+
// Swift
+
+extension NMBPredicate {
+    @objc public class func beNilMatcher() -> NMBPredicate {
+        return NMBPredicate { actualExpression in
+            return try beNil().satisfies(actualExpression).toObjectiveC()
+        }
+    }
+}
+
+ +

The above allows you to use the matcher from Objective-C:

+
// Objective-C
+
+expect(actual).to([NMBPredicate beNilMatcher]());
+
+ +

To make the syntax easier to use, define a C function that calls the +class method:

+
// Objective-C
+
+FOUNDATION_EXPORT NMBPredicate *beNil() {
+    return [NMBPredicate beNilMatcher];
+}
+
+

Properly Handling nil in Objective-C Matchers

+ +

When supporting Objective-C, make sure you handle nil appropriately. +Like Cedar, +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:

+
// 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 Predicate.define or Predicate.simple. +Using those factory methods will automatically generate expected value failure messages when they’re nil.

+
public func beginWith<S: Sequence>(_ startingElement: S.Element) -> Predicate<S> where S.Element: Equatable {
+    return Predicate.simple("begin with <\(startingElement)>") { actualExpression in
+        guard let actualValue = try actualExpression.evaluate() else { return .fail }
+
+        var actualGenerator = actualValue.makeIterator()
+        return PredicateStatus(bool: actualGenerator.next() == startingElement)
+    }
+}
+
+extension NMBPredicate {
+    @objc public class func beginWithMatcher(_ expected: Any) -> NMBPredicate {
+        return NMBPredicate { actualExpression in
+            let actual = try actualExpression.evaluate()
+            let expr = actualExpression.cast { $0 as? NMBOrderedCollection }
+            return try beginWith(expected).satisfies(expr).toObjectiveC()
+        }
+    }
+}
+
+

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. The old API has been +removed completely in Nimble v10.

+

Installing Nimble

+ +
+

Nimble can be used on its own, or in conjunction with its sister + project, Quick. To install both + Quick and Nimble, follow the installation instructions in the Quick + Documentation.

+
+ +

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. +
  3. Add Nimble.xcodeproj to the Xcode workspace for your project
  4. +
  5. Link Nimble.framework to your test target
  6. +
  7. Start writing expectations!
  8. +
+ +

For more detailed instructions on each of these steps, +read 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.

+
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'
+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:
  2. +
+
class MyAssertionHandler : AssertionHandler {
+    func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) {
+        if (!assertion) {
+            print("Expectation failed: \(message.stringValue)")
+        }
+    }
+}
+
+
// Somewhere before you use any assertions
+NimbleAssertionHandler = MyAssertionHandler()
+
+ +
    +
  1. 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" +
    • +
  2. +
+ +

You can now use Nimble assertions in your code and handle failures as you see +fit.

+ +
+
+ +
+
+ + diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jazzy.js b/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 000000000..198441660 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jazzy.search.js b/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 000000000..359cdbb8b --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 000000000..3a2d2ab03 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docs/docsets/Nimble.docset/Contents/Resources/Documents/search.json b/docs/docsets/Nimble.docset/Contents/Resources/Documents/search.json new file mode 100644 index 000000000..de8112a41 --- /dev/null +++ b/docs/docsets/Nimble.docset/Contents/Resources/Documents/search.json @@ -0,0 +1 @@ +{"Typealiases.html#/s:6Nimble14PredicateBlocka":{"name":"PredicateBlock","abstract":"

Undocumented

"},"Typealiases.html#/FileString":{"name":"FileString"},"Typealiases.html#/s:6Nimble10FileStringa":{"name":"FileString","abstract":"

Undocumented

"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV6statusAA0B6StatusOvp":{"name":"status","abstract":"

Status indicates if the predicate matches, does not match, or fails.

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV7messageAA18ExpectationMessageOvp":{"name":"message","abstract":"

The error message that can be displayed if it does not match

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV6status7messageAcA0B6StatusO_AA18ExpectationMessageOtcfc":{"name":"init(status:message:)","abstract":"

Constructs a new PredicateResult with a given status and error message

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV4bool7messageACSb_AA18ExpectationMessageOtcfc":{"name":"init(bool:message:)","abstract":"

Shorthand to PredicateResult(status: PredicateStatus(bool: bool), message: message)

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV9toBoolean11expectationSbAA16ExpectationStyleO_tF":{"name":"toBoolean(expectation:)","abstract":"

Converts the result to a boolean based on what the expectation intended

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV12toObjectiveCAA012NMBPredicateC0CyF":{"name":"toObjectiveC()","abstract":"

Undocumented

","parent_name":"PredicateResult"},"Structs/Predicate.html#/s:6Nimble9PredicateVyACyxGAA0B6ResultVAA10ExpressionVyxGKccfc":{"name":"init(_:)","abstract":"

Constructs a predicate that knows how take a given value

","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV9satisfiesyAA0B6ResultVAA10ExpressionVyxGKF":{"name":"satisfies(_:)","abstract":"

Uses a predicate on a given value to see if it passes the predicate.

","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV6define7matcherACyxGAA0B6ResultVAA10ExpressionVyxGKc_tFZ":{"name":"define(matcher:)","abstract":"

Like Predicate() constructor, but automatically guard against nil (actual) values

","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV6define_7matcherACyxGSS_AA0B6ResultVAA10ExpressionVyxG_AA18ExpectationMessageOtKctFZ":{"name":"define(_:matcher:)","abstract":"

Defines a predicate with a default message that can be returned in the closure","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV13defineNilable_7matcherACyxGSS_AA0B6ResultVAA10ExpressionVyxG_AA18ExpectationMessageOtKctFZ":{"name":"defineNilable(_:matcher:)","abstract":"

Defines a predicate with a default message that can be returned in the closure","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV6simple_7matcherACyxGSS_AA0B6StatusOAA10ExpressionVyxGKctFZ":{"name":"simple(_:matcher:)","abstract":"

Provides a simple predicate definition that provides no control over the predefined","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV13simpleNilable_7matcherACyxGSS_AA0B6StatusOAA10ExpressionVyxGKctFZ":{"name":"simpleNilable(_:matcher:)","abstract":"

Provides a simple predicate definition that provides no control over the predefined","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV13requireNonNilACyxGvp":{"name":"requireNonNil","abstract":"

Returns a new Predicate based on the current one that always fails if nil is given as","parent_name":"Predicate"},"Structs/AsyncDefaults.html#/s:6Nimble13AsyncDefaultsV7timeout8Dispatch0E12TimeIntervalOvpZ":{"name":"timeout","abstract":"

Undocumented

","parent_name":"AsyncDefaults"},"Structs/AsyncDefaults.html#/s:6Nimble13AsyncDefaultsV12pollInterval8Dispatch0f4TimeE0OvpZ":{"name":"pollInterval","abstract":"

Undocumented

","parent_name":"AsyncDefaults"},"Structs/Expression.html#/s:6Nimble10ExpressionV8locationAA14SourceLocationCvp":{"name":"location","abstract":"

Undocumented

","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV9isClosureSbvp":{"name":"isClosure","abstract":"

Undocumented

","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV10expression8location9isClosureACyxGxSgyKc_AA14SourceLocationCSbtcfc":{"name":"init(expression:location:isClosure:)","abstract":"

Creates a new expression struct. Normally, expect(…) will manage this","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV08memoizedB08location14withoutCaching9isClosureACyxGxSgSbKc_AA14SourceLocationCS2btcfc":{"name":"init(memoizedExpression:location:withoutCaching:isClosure:)","abstract":"

Creates a new expression struct. Normally, expect(…) will manage this","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV4castyACyqd__Gqd__SgxSgKclF":{"name":"cast(_:)","abstract":"

Returns a new Expression from the given expression. Identical to a map()","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV8evaluatexSgyKF":{"name":"evaluate()","abstract":"

Undocumented

","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV14withoutCachingACyxGyF":{"name":"withoutCaching()","abstract":"

Undocumented

","parent_name":"Expression"},"Structs/Expectation/Nil.html#/s:s23ExpressibleByNilLiteralP03nilD0xyt_tcfc":{"name":"init(nilLiteral:)","parent_name":"Nil"},"Structs/Expectation.html#/s:6Nimble11ExpectationV10expressionAA10ExpressionVyxGvp":{"name":"expression","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV10expressionACyxGAA10ExpressionVyxG_tcfc":{"name":"init(expression:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV6verifyyySb_AA14FailureMessageCtF":{"name":"verify(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV2to_11descriptionACyxGAA9PredicateVyxG_SSSgtF":{"name":"to(_:description:)","abstract":"

Tests the actual value using a matcher to match.

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV5toNot_11descriptionACyxGAA9PredicateVyxG_SSSgtF":{"name":"toNot(_:description:)","abstract":"

Tests the actual value using a matcher to not match.

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV5notTo_11descriptionACyxGAA9PredicateVyxG_SSSgtF":{"name":"notTo(_:description:)","abstract":"

Tests the actual value using a matcher to not match.

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV12toEventually_7timeout12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"toEventually(_:timeout:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to match by checking continuously","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV15toEventuallyNot_7timeout12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0k4TimeH0OAMSSSgtF":{"name":"toEventuallyNot(_:timeout:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to not match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV15toNotEventually_7timeout12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0k4TimeH0OAMSSSgtF":{"name":"toNotEventually(_:timeout:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to not match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV7toNever_5until12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"toNever(_:until:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to never match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV7neverTo_5until12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"neverTo(_:until:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to never match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV8toAlways_5until12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"toAlways(_:until:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to always match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV8alwaysTo_5until12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"alwaysTo(_:until:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to always match by checking","parent_name":"Expectation"},"Structs/Expectation/Nil.html":{"name":"Nil","abstract":"

Represents nil value to be used with the operator overloads for beNil.

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV2eeoiyyACyxG_AC3NilVyx_GtFZ":{"name":"==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV2neoiyyACyxG_AC3NilVyx_GtFZ":{"name":"!=(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAASlRzSF7ElementRpzlE003dchoiyyACyxG_xtFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAASFRzlE003dchoiyyACyxG_xtFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAASFRzlE003dchoiyyACyxG_x8expected_x5deltattFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAASFRzlE2eeoiyyACyxG_x8expected_x5deltattFZ":{"name":"==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVA2A20NMBDoubleConvertibleRzlE003dchoiyyACyxG_xtFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVA2A20NMBDoubleConvertibleRzlE003dchoiyyACyxG_x8expected_Sd5deltattFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVA2A20NMBDoubleConvertibleRzlE2eeoiyyACyxG_x8expected_Sd5deltattFZ":{"name":"==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAAyXlRszlE3eeeoiyyACyyXlG_yXlSgtFZ":{"name":"===(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAAyXlRszlE3neeoiyyACyyXlG_yXlSgtFZ":{"name":"!==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAAytRszlE2eeoiyyACyytG_yttFZ":{"name":"==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAAytRszlE2neoiyyACyytG_yttFZ":{"name":"!=(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/AssertionRecord.html#/s:6Nimble15AssertionRecordV7successSbvp":{"name":"success","abstract":"

Whether the assertion succeeded or failed

","parent_name":"AssertionRecord"},"Structs/AssertionRecord.html#/s:6Nimble15AssertionRecordV7messageAA14FailureMessageCvp":{"name":"message","abstract":"

The failure message the assertion would display on failure.

","parent_name":"AssertionRecord"},"Structs/AssertionRecord.html#/s:6Nimble15AssertionRecordV8locationAA14SourceLocationCvp":{"name":"location","abstract":"

The source location the expectation occurred on.

","parent_name":"AssertionRecord"},"Structs/AssertionRecord.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"AssertionRecord"},"Structs/execTypesCountTuple.html#/s:6Nimble19execTypesCountTupleV5valuex_xxxxxxxxxxxxxtvp":{"name":"value","abstract":"

Undocumented

","parent_name":"execTypesCountTuple"},"Structs/execTypesCountTuple.html#/s:6Nimble19execTypesCountTupleVACyxGycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"execTypesCountTuple"},"Structs/execTypesCountTuple.html":{"name":"execTypesCountTuple","abstract":"

Undocumented

"},"Structs/AssertionRecord.html":{"name":"AssertionRecord","abstract":"

A data structure that stores information about an assertion when"},"Structs/Expectation.html":{"name":"Expectation","abstract":"

Undocumented

"},"Structs/Expression.html":{"name":"Expression","abstract":"

Expression represents the closure of the value inside expect(…)."},"Structs/AsyncDefaults.html":{"name":"AsyncDefaults","abstract":"

If you are running on a slower machine, it could be useful to increase the default timeout value"},"Structs/Predicate.html":{"name":"Predicate","abstract":"

A Predicate is part of the new matcher API that provides assertions to expectations.

"},"Structs/PredicateResult.html":{"name":"PredicateResult","abstract":"

The value that a Predicates return to describe if the given (actual) value matches the"},"Protocols/TestOutputStringConvertible.html#/s:6Nimble27TestOutputStringConvertibleP15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"TestOutputStringConvertible"},"Protocols/NMBComparable.html#/c:@M@Nimble@objc(pl)NMBComparable(im)NMB_compare:":{"name":"NMB_compare(_:)","abstract":"

Undocumented

","parent_name":"NMBComparable"},"Protocols/NMBDoubleConvertible.html#/s:6Nimble20NMBDoubleConvertibleP11doubleValueSdvp":{"name":"doubleValue","abstract":"

Undocumented

","parent_name":"NMBDoubleConvertible"},"Protocols/NMBOrderedCollection.html#/s:6Nimble20NMBOrderedCollectionP6object2atypSi_tF":{"name":"object(at:)","abstract":"

Undocumented

","parent_name":"NMBOrderedCollection"},"Protocols/NMBCollection.html#/s:6Nimble13NMBCollectionP5countSivp":{"name":"count","abstract":"

Undocumented

","parent_name":"NMBCollection"},"Protocols/NMBContainer.html#/s:6Nimble12NMBContainerP8containsySbypF":{"name":"contains(_:)","abstract":"

Undocumented

","parent_name":"NMBContainer"},"Protocols/AssertionHandler.html#/s:6Nimble16AssertionHandlerP6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"AssertionHandler"},"Protocols/AssertionHandler.html":{"name":"AssertionHandler","abstract":"

Protocol for the assertion handler that Nimble uses for all expectations.

"},"Protocols/NMBContainer.html":{"name":"NMBContainer","abstract":"

Protocol for types that support contain() matcher.

"},"Protocols/NMBCollection.html":{"name":"NMBCollection","abstract":"

Protocol for types that support only beEmpty(), haveCount() matchers

"},"Protocols/NMBOrderedCollection.html":{"name":"NMBOrderedCollection","abstract":"

Protocol for types that support beginWith(), endWith(), beEmpty() matchers

"},"Protocols/NMBDoubleConvertible.html":{"name":"NMBDoubleConvertible","abstract":"

Undocumented

"},"Protocols/NMBComparable.html":{"name":"NMBComparable","abstract":"

Protocol for types to support beLessThan(), beLessThanOrEqualTo(),"},"Protocols/TestOutputStringConvertible.html":{"name":"TestOutputStringConvertible","abstract":"

A type with a customized test output text representation.

"},"Functions.html#/s:6Nimble19catchBadInstruction2inAA0cD9ExceptionCSgyyc_tF":{"name":"catchBadInstruction(in:)","abstract":"

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."},"Functions.html#/s:6Nimble21MACH_MSGH_BITS_REMOTEys6UInt32VADF":{"name":"MACH_MSGH_BITS_REMOTE(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble14MACH_MSGH_BITSys6UInt32VAD_ADtF":{"name":"MACH_MSGH_BITS(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble20withAssertionHandler_4file4line7closureyAA0cD0_p_SSSuyyKXEtF":{"name":"withAssertionHandler(_:file:line:closure:)","abstract":"

Allows you to temporarily replace the current Nimble assertion handler with"},"Functions.html#/s:6Nimble18gatherExpectations8silently7closureSayAA15AssertionRecordVGSb_yyXEtF":{"name":"gatherExpectations(silently:closure:)","abstract":"

Captures expectations that occur in the given closure. Note that all"},"Functions.html#/s:6Nimble25gatherFailingExpectations8silently7closureSayAA15AssertionRecordVGSb_yyXEtF":{"name":"gatherFailingExpectations(silently:closure:)","abstract":"

Captures failed expectations that occur in the given closure. Note that all"},"Functions.html#/s:6Nimble13recordFailure_8locationySS_AA14SourceLocationCtF":{"name":"recordFailure(_:location:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble9waitUntil7timeout4file4line6actiony8Dispatch0H12TimeIntervalO_SSSuyyycctF":{"name":"waitUntil(timeout:file:line:action:)","abstract":"

Wait asynchronously until the done closure is called or the timeout has been reached.

"},"Functions.html#/s:6Nimble6expect4file4line_AA11ExpectationVyxGSS_SuxSgyKXAtlF":{"name":"expect(file:line:_:)","abstract":"

Make an expectation on a given actual value. The value given is lazily evaluated.

"},"Functions.html#/s:6Nimble6expect4file4line_AA11ExpectationVyxGSS_SuxyKcyXKtlF":{"name":"expect(file:line:_:)","abstract":"

Make an expectation on a given actual value. The closure is lazily invoked.

"},"Functions.html#/s:6Nimble6expect4file4line_AA11ExpectationVyxGSS_SuxSgyKcyXKtlF":{"name":"expect(file:line:_:)","abstract":"

Make an expectation on a given actual value. The closure is lazily invoked.

"},"Functions.html#/s:6Nimble6expect4file4line_AA11ExpectationVyytGSS_SuyyKcyXKtF":{"name":"expect(file:line:_:)","abstract":"

Make an expectation on a given actual value. The closure is lazily invoked.

"},"Functions.html#/s:6Nimble4fail_8locationySS_AA14SourceLocationCtF":{"name":"fail(_:location:)","abstract":"

Always fails the test with a message and a specified location.

"},"Functions.html#/s:6Nimble4fail_4file4lineySS_SSSutF":{"name":"fail(_:file:line:)","abstract":"

Always fails the test with a message.

"},"Functions.html#/s:6Nimble4fail_4lineySS_SutF":{"name":"fail(_:line:)","abstract":"

Always fails the test.

"},"Functions.html#/s:6Nimble7allPassyAA9PredicateVyxGSb7ElementQzKcSTRzlF":{"name":"allPass(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7allPassyAA9PredicateVyxGSS_Sb7ElementQzKctSTRzlF":{"name":"allPass(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7allPassyAA9PredicateVyxGADy7ElementQzGSTRzlF":{"name":"allPass(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble9beAKindOfyAA9PredicateVyypGxmlF":{"name":"beAKindOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is an instance of the given class.

"},"Functions.html#/s:6Nimble9beAKindOfyAA9PredicateVySo8NSObjectCGyXlXpF":{"name":"beAKindOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is an instance of the given class."},"Functions.html#/s:6Nimble14beAnInstanceOfyAA9PredicateVyypGxmlF":{"name":"beAnInstanceOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is an exact instance of the given class.

"},"Functions.html#/s:6Nimble14beAnInstanceOfyAA9PredicateVySo8NSObjectCGyXlXpF":{"name":"beAnInstanceOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is an instance of the given class."},"Functions.html#/s:6Nimble12defaultDeltaxySFRzlF":{"name":"defaultDelta()","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble9beCloseTo_6withinAA9PredicateVyxGx_xtSFRzlF":{"name":"beCloseTo(_:within:)","abstract":"

A Nimble matcher that succeeds when a value is close to another. This is used for floating"},"Functions.html#/s:6Nimble9beCloseTo_6withinAA9PredicateVyxGx_SdtAA20NMBDoubleConvertibleRzlF":{"name":"beCloseTo(_:within:)","abstract":"

A Nimble matcher that succeeds when a value is close to another. This is used for floating"},"Functions.html#/s:6Nimble9beCloseTo_6withinAA9PredicateVyq_Gq__xtSFRz7ElementQy_RszSlR_r0_lF":{"name":"beCloseTo(_:within:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble003obaoiyx8expected_x5deltatx_xtSFRzlF":{"name":"±(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble003obaoiyx8expected_Sd5deltatx_SdtAA20NMBDoubleConvertibleRzlF":{"name":"±(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVyxGySTRzlF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVyxGys10SetAlgebraRzlF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVyxGySTRzs10SetAlgebraRzlF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVySSGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVySo8NSStringCGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVySo12NSDictionaryCGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVySo7NSArrayCGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVyAA13NMBCollection_pGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble13beGreaterThanyAA9PredicateVyxGxSgSLRzlF":{"name":"beGreaterThan(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is greater than the expected value.

"},"Functions.html#/s:6Nimble1goiyyAA11ExpectationVyxG_xtSLRzlF":{"name":">(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble13beGreaterThanyAA9PredicateVyAA13NMBComparable_pGAaE_pSgF":{"name":"beGreaterThan(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is greater than the expected value.

"},"Functions.html#/s:6Nimble1goiyyAA11ExpectationVyAA13NMBComparable_pG_AaE_pSgtF":{"name":">(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble22beGreaterThanOrEqualToyAA9PredicateVyxGxSgSLRzlF":{"name":"beGreaterThanOrEqualTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is greater than"},"Functions.html#/s:6Nimble2geoiyyAA11ExpectationVyxG_xtSLRzlF":{"name":">=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble22beGreaterThanOrEqualToyAA9PredicateVyxGxSgAA13NMBComparableRzlF":{"name":"beGreaterThanOrEqualTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is greater than"},"Functions.html#/s:6Nimble2geoiyyAA11ExpectationVyxG_xtAA13NMBComparableRzlF":{"name":">=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble13beIdenticalToyAA9PredicateVyyXlGyXlSgF":{"name":"beIdenticalTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is the same instance"},"Functions.html#/s:6Nimble2beyAA9PredicateVyyXlGyXlSgF":{"name":"be(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is the same instance"},"Functions.html#/s:6Nimble10beLessThanyAA9PredicateVyxGxSgSLRzlF":{"name":"beLessThan(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is less than the expected value.

"},"Functions.html#/s:6Nimble1loiyyAA11ExpectationVyxG_xtSLRzlF":{"name":"<(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble10beLessThanyAA9PredicateVyAA13NMBComparable_pGAaE_pSgF":{"name":"beLessThan(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is less than the expected value.

"},"Functions.html#/s:6Nimble1loiyyAA11ExpectationVyAA13NMBComparable_pG_AaE_pSgtF":{"name":"<(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble19beLessThanOrEqualToyAA9PredicateVyxGxSgSLRzlF":{"name":"beLessThanOrEqualTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is less than"},"Functions.html#/s:6Nimble2leoiyyAA11ExpectationVyxG_xtSLRzlF":{"name":"<=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble19beLessThanOrEqualToyAA9PredicateVyxGxSgAA13NMBComparableRzlF":{"name":"beLessThanOrEqualTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is less than"},"Functions.html#/s:6Nimble2leoiyyAA11ExpectationVyxG_xtAA13NMBComparableRzlF":{"name":"<=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble6beTrueAA9PredicateVySbGyF":{"name":"beTrue()","abstract":"

A Nimble matcher that succeeds when the actual value is exactly true."},"Functions.html#/s:6Nimble7beFalseAA9PredicateVySbGyF":{"name":"beFalse()","abstract":"

A Nimble matcher that succeeds when the actual value is exactly false."},"Functions.html#/s:6Nimble8beTruthyAA9PredicateVyxGySQRzs27ExpressibleByBooleanLiteralRzlF":{"name":"beTruthy()","abstract":"

A Nimble matcher that succeeds when the actual value is not logically false.

"},"Functions.html#/s:6Nimble7beFalsyAA9PredicateVyxGySQRzs27ExpressibleByBooleanLiteralRzlF":{"name":"beFalsy()","abstract":"

A Nimble matcher that succeeds when the actual value is logically false."},"Functions.html#/s:6Nimble5beNilAA9PredicateVyxGylF":{"name":"beNil()","abstract":"

A Nimble matcher that succeeds when the actual value is nil.

"},"Functions.html#/s:6Nimble9beSuccess4testAA9PredicateVys6ResultOyxq_GGyxcSg_ts5ErrorR_r0_lF":{"name":"beSuccess(test:)","abstract":"

A Nimble matcher for Result that succeeds when the actual value is success.

"},"Functions.html#/s:6Nimble9beFailure4testAA9PredicateVys6ResultOyxq_GGyq_cSg_ts5ErrorR_r0_lF":{"name":"beFailure(test:)","abstract":"

A Nimble matcher for Result that succeeds when the actual value is failure.

"},"Functions.html#/s:6Nimble6beVoidAA9PredicateVyytGyF":{"name":"beVoid()","abstract":"

A Nimble matcher that succeeds when the actual value is Void.

"},"Functions.html#/s:6Nimble8beWithinyAA9PredicateVyxGSnyxGSLRzlF":{"name":"beWithin(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is within given range.

"},"Functions.html#/s:6Nimble8beWithinyAA9PredicateVyxGSNyxGSLRzlF":{"name":"beWithin(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is within given range.

"},"Functions.html#/s:6Nimble9beginWithyAA9PredicateVyxG7ElementQzSTRzSQAGRQlF":{"name":"beginWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence’s first element"},"Functions.html#/s:6Nimble9beginWithyAA9PredicateVyAA20NMBOrderedCollection_pGypF":{"name":"beginWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual collection’s first element"},"Functions.html#/s:6Nimble9beginWithyAA9PredicateVySSGSSF":{"name":"beginWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual string contains expected substring"},"Functions.html#/s:6Nimble9beginWith6prefixAA9PredicateVyxGq_Sg_tSTRzSTR_SQ7ElementRpzAHQy_AIRSr0_lF":{"name":"beginWith(prefix:)","abstract":"

A Nimble matcher that succeeds when the exepected sequence is a prefix of the actual sequence.

"},"Functions.html#/s:6Nimble9beginWith6prefix2byAA9PredicateVyxGq_Sg_Sb7ElementQz_AIQy_tctSTRzSTR_r0_lF":{"name":"beginWith(prefix:by:)","abstract":"

A Nimble matcher that succeeds when the expected sequence is the prefix of the actual sequence, using the given predicate as the equivalence test.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxG7ElementQzd_tSTRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxGSay7ElementQzGSTRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxG7ElementQzd_ts10SetAlgebraRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual set contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxGSay7ElementQzGs10SetAlgebraRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual set contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxG7ElementSTQzd_tSTRzs10SetAlgebraRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual set contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxGSay7ElementSTQzGSTRzs10SetAlgebraRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual set contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVySSGSSd_tF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual string contains the expected substring.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVySSGSaySSGF":{"name":"contain(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7containyAA9PredicateVySo8NSStringCGAFd_tF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual string contains the expected substring.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVySo8NSStringCGSayAFGF":{"name":"contain(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyAA12NMBContainer_pGypSgd_tF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual collection contains the expected object.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyAA12NMBContainer_pGSayypSgGF":{"name":"contain(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble24containElementSatisfyingyAA9PredicateVyxGSb0C0Qzc_SStSTRzlF":{"name":"containElementSatisfying(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble13elementsEqualyAA9PredicateVyxGq_SgSTRzSTR_SQ7ElementRpzAGQy_AHRSr0_lF":{"name":"elementsEqual(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain the same elements in"},"Functions.html#/s:6Nimble13elementsEqual_2byAA9PredicateVyxGq_Sg_Sb7ElementQz_AHQy_tctSTRzSTR_r0_lF":{"name":"elementsEqual(_:by:)","abstract":"

A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain equivalent elements in"},"Functions.html#/s:6Nimble7endWithyAA9PredicateVyxG7ElementQzSTRzSQAGRQlF":{"name":"endWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence’s last element"},"Functions.html#/s:6Nimble7endWithyAA9PredicateVyAA20NMBOrderedCollection_pGypF":{"name":"endWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual collection’s last element"},"Functions.html#/s:6Nimble7endWithyAA9PredicateVySSGSSF":{"name":"endWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual string contains the expected substring"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_tGx_q_tSgSQRzSQR_r0_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_tG_x_q_tSgtSQRzSQR_r0_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_tG_x_q_tSgtSQRzSQR_r0_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_q0_tGx_q_q0_tSgSQRzSQR_SQR0_r1_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_q0_tG_x_q_q0_tSgtSQRzSQR_SQR0_r1_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_q0_tG_x_q_q0_tSgtSQRzSQR_SQR0_r1_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_q0_q1_tGx_q_q0_q1_tSgSQRzSQR_SQR0_SQR1_r2_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_q0_q1_tG_x_q_q0_q1_tSgtSQRzSQR_SQR0_SQR1_r2_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_q0_q1_tG_x_q_q0_q1_tSgtSQRzSQR_SQR0_SQR1_r2_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_q0_q1_q2_tGx_q_q0_q1_q2_tSgSQRzSQR_SQR0_SQR1_SQR2_r3_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_q0_q1_q2_tG_x_q_q0_q1_q2_tSgtSQRzSQR_SQR0_SQR1_SQR2_r3_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_q0_q1_q2_tG_x_q_q0_q1_q2_tSgtSQRzSQR_SQR0_SQR1_SQR2_r3_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_q0_q1_q2_q3_tGx_q_q0_q1_q2_q3_tSgSQRzSQR_SQR0_SQR1_SQR2_SQR3_r4_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_q0_q1_q2_q3_tG_x_q_q0_q1_q2_q3_tSgtSQRzSQR_SQR0_SQR1_SQR2_SQR3_r4_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_q0_q1_q2_q3_tG_x_q_q0_q1_q2_q3_tSgtSQRzSQR_SQR0_SQR1_SQR2_SQR3_r4_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyxGxSQRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is equal to the expected value."},"Functions.html#/s:6Nimble5equalyAA9PredicateVySayxSgGGAFSQRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher allowing comparison of collection with optional type

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyxGxSgSQRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is equal to the expected value."},"Functions.html#/s:6Nimble5equalyAA9PredicateVyShyxGGAESHRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual set is equal to the expected set.

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyShyxGGAESgSHRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual set is equal to the expected set.

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyShyxGGAESLRzSHRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual set is equal to the expected set.

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyShyxGGAESgSLRzSHRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual set is equal to the expected set.

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVySDyxq_GGSDyxq_SgGSHRzSQR_r0_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual dictionary is equal to the expected dictionary

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyxG_xtSQRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyxG_xSgtSQRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyxG_xtSQRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyxG_xSgtSQRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVySayxGG_AESgtSQRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVySayxGG_AESgtSQRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyShyxGG_AEtSHRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyShyxGG_AESgtSHRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyShyxGG_AEtSHRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyShyxGG_AESgtSHRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyShyxGG_AEtSLRzSHRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyShyxGG_AESgtSLRzSHRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyShyxGG_AEtSLRzSHRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyShyxGG_AESgtSLRzSHRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVySDyxq_GG_AESgtSHRzSQR_r0_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVySDyxq_GG_AESgtSHRzSQR_r0_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble9haveCountyAA9PredicateVyxGSiSlRzlF":{"name":"haveCount(_:)","abstract":"

A Nimble matcher that succeeds when the actual Collection’s count equals"},"Functions.html#/s:6Nimble9haveCountyAA9PredicateVyAA13NMBCollection_pGSiF":{"name":"haveCount(_:)","abstract":"

A Nimble matcher that succeeds when the actual collection’s count equals"},"Functions.html#/s:6Nimble5matchyAA9PredicateVySSGSSSgF":{"name":"match(_:)","abstract":"

A Nimble matcher that succeeds when the actual string satisfies the regular expression"},"Functions.html#/s:6Nimble10matchErroryAA9PredicateVys0C0_pGxsAERzlF":{"name":"matchError(_:)","abstract":"

A Nimble matcher that succeeds when the actual expression evaluates to an"},"Functions.html#/s:6Nimble10matchErroryAA9PredicateVys0C0_pGxSQRzsAERzlF":{"name":"matchError(_:)","abstract":"

A Nimble matcher that succeeds when the actual expression evaluates to an"},"Functions.html#/s:6Nimble10matchErroryAA9PredicateVys0C0_pGxmsAERzlF":{"name":"matchError(_:)","abstract":"

A Nimble matcher that succeeds when the actual expression evaluates to an"},"Functions.html#/s:6Nimble17postNotifications_4fromAA9PredicateVyxGAEySay10Foundation12NotificationVGG_So20NSNotificationCenterCtlF":{"name":"postNotifications(_:from:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble28postDistributedNotifications_4from5namesAA9PredicateVyxGAFySay10Foundation12NotificationVGG_So013NSDistributedI6CenterCShySo18NSNotificationNameaGtlF":{"name":"postDistributedNotifications(_:from:names:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble14raiseException5named6reason8userInfo7closureAA9PredicateVyxGSo15NSExceptionNameaSg_SSSgSo12NSDictionaryCSgySo0J0CcSgtlF":{"name":"raiseException(named:reason:userInfo:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression raises an"},"Functions.html#/s:6Nimble14raiseException5named6reason8userInfo7closureAA9PredicateVyxGSSSg_AJSo12NSDictionaryCSgySo11NSExceptionCcSgtlF":{"name":"raiseException(named:reason:userInfo:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression raises an"},"Functions.html#/s:6Nimble12satisfyAllOfyAA9PredicateVyxGAEd_tlF":{"name":"satisfyAllOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value matches with all of the matchers"},"Functions.html#/s:6Nimble12satisfyAllOfyAA9PredicateVyxGSayAEGlF":{"name":"satisfyAllOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value matches with all of the matchers"},"Functions.html#/s:6Nimble2aaoiyAA9PredicateVyxGAE_AEtlF":{"name":"&&(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble12satisfyAnyOfyAA9PredicateVyxGAEd_tlF":{"name":"satisfyAnyOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value matches with any of the matchers"},"Functions.html#/s:6Nimble12satisfyAnyOfyAA9PredicateVyxGSayAEGlF":{"name":"satisfyAnyOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value matches with any of the matchers"},"Functions.html#/s:6Nimble2oooiyAA9PredicateVyxGAE_AEtlF":{"name":"||(_:_:)","abstract":"

Undocumented

"},"Functions.html#/catchBadInstruction(block:)":{"name":"catchBadInstruction(block:)","abstract":"

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."},"Functions.html#/s:6Nimble14throwAssertionAA9PredicateVyxGylF":{"name":"throwAssertion()","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble10throwErrorAA9PredicateVyxGylF":{"name":"throwError()","abstract":"

A Nimble matcher that succeeds when the actual expression throws an"},"Functions.html#/s:6Nimble10throwError_7closureAA9PredicateVyq_Gx_ys0C0_pcSgtsAGRzr0_lF":{"name":"throwError(_:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws an"},"Functions.html#/s:6Nimble10throwError_7closureAA9PredicateVyq_Gx_yxcSgtSQRzs0C0Rzr0_lF":{"name":"throwError(_:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws an"},"Functions.html#/s:6Nimble10throwError9errorType7closureAA9PredicateVyq_Gxm_yxcSgts0C0Rzr0_lF":{"name":"throwError(errorType:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws an"},"Functions.html#/s:6Nimble10throwError7closureAA9PredicateVyxGys0C0_pc_tlF":{"name":"throwError(closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws any"},"Functions.html#/s:6Nimble10throwError7closureAA9PredicateVyq_Gyxc_ts0C0Rzr0_lF":{"name":"throwError(closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws any"},"Functions.html#/s:6Nimble7succeedAA9PredicateVyAA15ToSucceedResultOGyF":{"name":"succeed()","abstract":"

A Nimble matcher that takes in a closure for validation.

"},"Functions.html#/s:6Nimble9stringifyySSxSglF":{"name":"stringify(_:)","abstract":"

Returns a string appropriate for displaying in test output"},"Functions.html#/s:6Nimble20prettyCollectionTypeySSxlF":{"name":"prettyCollectionType(_:)","abstract":"

Attempts to generate a pretty type string for a given value. If the value is of a Objective-C"},"Functions.html#/s:6Nimble20prettyCollectionTypeySSxSlRzlF":{"name":"prettyCollectionType(_:)","abstract":"

Returns the type name for a given collection type. This overload is used by Swift"},"Extensions/Data.html#/s:10Foundation4DataV6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Data"},"Extensions/String.html#/s:SS6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"String"},"Extensions/AnySequence.html#/s:s11AnySequenceV6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"AnySequence"},"Extensions/Array.html#/s:Sa6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Array"},"Extensions/NSString.html#/c:@CM@Nimble@@objc(cs)NSString(im)NMB_compare:":{"name":"NMB_compare(_:)","abstract":"

Undocumented

","parent_name":"NSString"},"Extensions/NSDate.html#/s:So6NSDateC6NimbleE11doubleValueSdvp":{"name":"doubleValue","abstract":"

Undocumented

","parent_name":"NSDate"},"Extensions/NSDate.html#/s:So6NSDateC6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"NSDate"},"Extensions/Date.html#/s:10Foundation4DateV6NimbleE11doubleValueSdvp":{"name":"doubleValue","abstract":"

Undocumented

","parent_name":"Date"},"Extensions/Date.html#/s:10Foundation4DateV6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Date"},"Extensions/NSNumber.html#/c:@CM@Nimble@@objc(cs)NSNumber(im)NMB_compare:":{"name":"NMB_compare(_:)","abstract":"

Undocumented

","parent_name":"NSNumber"},"Extensions/NSNumber.html#/s:So8NSNumberC6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"NSNumber"},"Extensions/NSIndexSet.html#/s:So10NSIndexSetC6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"NSIndexSet"},"Extensions/NSArray.html#/s:So7NSArrayC6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"NSArray"},"Extensions/UInt.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt"},"Extensions/Int.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int"},"Extensions/Double.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Double"},"Extensions/Double.html#/s:Sd6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Double"},"Extensions/Float.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Float"},"Extensions/Float.html#/s:Sf6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Float"},"Extensions/UInt64.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt64"},"Extensions/Int64.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int64"},"Extensions/UInt32.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt32"},"Extensions/Int32.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int32"},"Extensions/UInt16.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt16"},"Extensions/Int16.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int16"},"Extensions/UInt8.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt8"},"Extensions/Int8.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int8"},"Extensions/NSException.html#/s:So11NSExceptionC6NimbleE14catchException2inABXDSgyyc_tFZ":{"name":"catchException(in:)","abstract":"

Undocumented

","parent_name":"NSException"},"Extensions/NSException.html":{"name":"NSException"},"Extensions/Int8.html":{"name":"Int8"},"Extensions/UInt8.html":{"name":"UInt8"},"Extensions/Int16.html":{"name":"Int16"},"Extensions/UInt16.html":{"name":"UInt16"},"Extensions/Int32.html":{"name":"Int32"},"Extensions/UInt32.html":{"name":"UInt32"},"Extensions/Int64.html":{"name":"Int64"},"Extensions/UInt64.html":{"name":"UInt64"},"Extensions/Float.html":{"name":"Float"},"Extensions/Double.html":{"name":"Double"},"Extensions/Int.html":{"name":"Int"},"Extensions/UInt.html":{"name":"UInt"},"Extensions/NSArray.html":{"name":"NSArray"},"Extensions.html#/c:objc(cs)NSSet":{"name":"NSSet"},"Extensions.html#/c:objc(cs)NSHashTable":{"name":"NSHashTable"},"Extensions.html#/c:objc(cs)NSMapTable":{"name":"NSMapTable"},"Extensions/NSIndexSet.html":{"name":"NSIndexSet"},"Extensions.html#/c:objc(cs)NSDictionary":{"name":"NSDictionary"},"Extensions/NSNumber.html":{"name":"NSNumber"},"Extensions/Date.html":{"name":"Date"},"Extensions/NSDate.html":{"name":"NSDate"},"Extensions/NSString.html":{"name":"NSString"},"Extensions/Array.html":{"name":"Array"},"Extensions/AnySequence.html":{"name":"AnySequence"},"Extensions/String.html":{"name":"String"},"Extensions/Data.html":{"name":"Data"},"Enums/ToSucceedResult.html#/s:6Nimble15ToSucceedResultO9succeededyA2CmF":{"name":"succeeded","abstract":"

Undocumented

","parent_name":"ToSucceedResult"},"Enums/ToSucceedResult.html#/s:6Nimble15ToSucceedResultO6failedyACSS_tcACmF":{"name":"failed(reason:)","abstract":"

Undocumented

","parent_name":"ToSucceedResult"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO7matchesyA2CmF":{"name":"matches","abstract":"

Matches indicates if the predicate / matcher passes with the given value

","parent_name":"PredicateStatus"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO12doesNotMatchyA2CmF":{"name":"doesNotMatch","abstract":"

DoesNotMatch indicates if the predicate / matcher fails with the given value, but would","parent_name":"PredicateStatus"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO4failyA2CmF":{"name":"fail","abstract":"

Fail indicates the predicate will never satisfy with the given value in any case.","parent_name":"PredicateStatus"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO4boolACSb_tcfc":{"name":"init(bool:)","abstract":"

Converts a boolean to either .matches (if true) or .doesNotMatch (if false).

","parent_name":"PredicateStatus"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO12toObjectiveCAA012NMBPredicateC0CyF":{"name":"toObjectiveC()","abstract":"

Undocumented

","parent_name":"PredicateStatus"},"Enums/ExpectationStyle.html#/s:6Nimble16ExpectationStyleO7toMatchyA2CmF":{"name":"toMatch","abstract":"

Undocumented

","parent_name":"ExpectationStyle"},"Enums/ExpectationStyle.html#/s:6Nimble16ExpectationStyleO10toNotMatchyA2CmF":{"name":"toNotMatch","abstract":"

Undocumented

","parent_name":"ExpectationStyle"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO21expectedActualValueToyACSScACmF":{"name":"expectedActualValueTo(_:)","abstract":"

includes actual value in output (“expected to , got ”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO21expectedCustomValueToyACSS_SStcACmF":{"name":"expectedCustomValueTo(_:actual:)","abstract":"

uses a custom actual value string in output (“expected to , got ”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO10expectedToyACSScACmF":{"name":"expectedTo(_:)","abstract":"

excludes actual value in output (“expected to ”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO4failyACSScACmF":{"name":"fail(_:)","abstract":"

allows any free-form message (“”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO8prependsyACSS_ACtcACmF":{"name":"prepends(_:_:)","abstract":"

Not Fully Implemented Yet.

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO7appendsyA2C_SStcACmF":{"name":"appends(_:_:)","abstract":"

appends after an existing message (“ (use beNil() to match nils)”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO7detailsyA2C_SStcACmF":{"name":"details(_:_:)","abstract":"

provides long-form multi-line explainations (“\\n\\n”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO08expectedC0SSvp":{"name":"expectedMessage","abstract":"

Returns the smallest message after the “expected to” string that summarizes the error.

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO8appended7messageACSS_tF":{"name":"appended(message:)","abstract":"

Appends a message after the primary expectation message

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO17appendedBeNilHintACyF":{"name":"appendedBeNilHint()","abstract":"

Appends a message hinting to use beNil() for when the actual value given was nil.

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO8appended7detailsACSS_tF":{"name":"appended(details:)","abstract":"

Appends a detailed (aka - multiline) message after the primary expectation message","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO08replacedB0yA3CcF":{"name":"replacedExpectation(_:)","abstract":"

Replaces a primary expectation with one returned by f. Preserves all composite expectations","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO07wrappedB06before5afterACSS_SStF":{"name":"wrappedExpectation(before:after:)","abstract":"

Wraps a primary expectation with text before and after it.","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO9prepended11expectationACSS_tF":{"name":"prepended(expectation:)","abstract":"

Prepends a message by modifying the primary expectation

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO8toString6actual8expected0D0S2S_S2StF":{"name":"toString(actual:expected:to:)","abstract":"

Converts the tree of ExpectationMessages into a final built string.

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html":{"name":"ExpectationMessage","abstract":"

Undocumented

"},"Enums/ExpectationStyle.html":{"name":"ExpectationStyle","abstract":"

Undocumented

"},"Enums/PredicateStatus.html":{"name":"PredicateStatus","abstract":"

PredicateStatus is a trinary that indicates if a Predicate matches a given value or not

"},"Enums/ToSucceedResult.html":{"name":"ToSucceedResult","abstract":"

Used by the succeed matcher.

"},"Global%20Variables.html#/s:6Nimble23MACH_MSG_TYPE_MAKE_SENDs6UInt32Vvp":{"name":"MACH_MSG_TYPE_MAKE_SEND","abstract":"

Undocumented

"},"Global%20Variables.html#/nativeThreadState":{"name":"nativeThreadState"},"Global%20Variables.html#/nativeThreadStateCount":{"name":"nativeThreadStateCount"},"Global%20Variables.html#/nativeMachExceptionMask":{"name":"nativeMachExceptionMask"},"Global%20Variables.html#/s:6Nimble17nativeThreadStates5Int32Vvp":{"name":"nativeThreadState","abstract":"

Undocumented

"},"Global%20Variables.html#/s:6Nimble22nativeThreadStateCounts6UInt32Vvp":{"name":"nativeThreadStateCount","abstract":"

Undocumented

"},"Global%20Variables.html#/s:6Nimble23nativeMachExceptionMasks6UInt32Vvp":{"name":"nativeMachExceptionMask","abstract":"

Undocumented

"},"Global%20Variables.html#/s:6Nimble15EXC_TYPES_COUNTSivp":{"name":"EXC_TYPES_COUNT","abstract":"

Undocumented

"},"Global%20Variables.html#/s:6Nimble0A16AssertionHandlerAA0bC0_pvp":{"name":"NimbleAssertionHandler","abstract":"

Global backing interface for assertions that Nimble creates."},"Global%20Variables.html#/s:6Nimble12DefaultDeltaSdvp":{"name":"DefaultDelta","abstract":"

Undocumented

"},"Classes/NMBStringer.html#/c:@M@Nimble@objc(cs)NMBStringer(cm)stringify:":{"name":"stringify(_:)","abstract":"

Undocumented

","parent_name":"NMBStringer"},"Classes/SourceLocation.html#/s:6Nimble14SourceLocationC4fileSSvp":{"name":"file","abstract":"

Undocumented

","parent_name":"SourceLocation"},"Classes/SourceLocation.html#/s:6Nimble14SourceLocationC4lineSuvp":{"name":"line","abstract":"

Undocumented

","parent_name":"SourceLocation"},"Classes/SourceLocation.html#/c:@M@Nimble@objc(cs)SourceLocation(py)description":{"name":"description","abstract":"

Undocumented

","parent_name":"SourceLocation"},"Classes/NMBObjCRaiseExceptionPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCRaiseExceptionPredicate(py)named":{"name":"named","abstract":"

Undocumented

","parent_name":"NMBObjCRaiseExceptionPredicate"},"Classes/NMBObjCRaiseExceptionPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCRaiseExceptionPredicate(py)reason":{"name":"reason","abstract":"

Undocumented

","parent_name":"NMBObjCRaiseExceptionPredicate"},"Classes/NMBObjCRaiseExceptionPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCRaiseExceptionPredicate(py)userInfo":{"name":"userInfo","abstract":"

Undocumented

","parent_name":"NMBObjCRaiseExceptionPredicate"},"Classes/NMBObjCRaiseExceptionPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCRaiseExceptionPredicate(py)satisfyingBlock":{"name":"satisfyingBlock","abstract":"

Undocumented

","parent_name":"NMBObjCRaiseExceptionPredicate"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC7matchesACvpZ":{"name":"matches","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC12doesNotMatchACvpZ":{"name":"doesNotMatch","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC4failACvpZ":{"name":"fail","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/c:@M@Nimble@objc(cs)NMBPredicateStatus(py)hash":{"name":"hash","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/c:@M@Nimble@objc(cs)NMBPredicateStatus(im)isEqual:":{"name":"isEqual(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC4from6statusAcA09PredicateC0O_tFZ":{"name":"from(status:)","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC4from4boolACSb_tFZ":{"name":"from(bool:)","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC7toSwiftAA09PredicateC0OyF":{"name":"toSwift()","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC6statusAA0B6StatusCvp":{"name":"status","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC7messageAA21NMBExpectationMessageCvp":{"name":"message","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC6status7messageAcA0B6StatusC_AA21NMBExpectationMessageCtcfc":{"name":"init(status:message:)","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC4bool7messageACSb_AA21NMBExpectationMessageCtcfc":{"name":"init(bool:message:)","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC7toSwiftAA09PredicateC0VyF":{"name":"toSwift()","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBObjCBeCloseToPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCBeCloseToPredicate(py)within":{"name":"within","abstract":"

Undocumented

","parent_name":"NMBObjCBeCloseToPredicate"},"Classes/NMBPredicate.html#/s:6Nimble12NMBPredicateC9predicateAcA0B6ResultCAA10ExpressionVySo8NSObjectCGKc_tcfc":{"name":"init(predicate:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)allPassMatcher:":{"name":"allPassMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beAKindOfMatcher:":{"name":"beAKindOfMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beAnInstanceOfMatcher:":{"name":"beAnInstanceOfMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beCloseToMatcher:within:":{"name":"beCloseToMatcher(_:within:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beEmptyMatcher":{"name":"beEmptyMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beGreaterThanMatcher:":{"name":"beGreaterThanMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beGreaterThanOrEqualToMatcher:":{"name":"beGreaterThanOrEqualToMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beIdenticalToMatcher:":{"name":"beIdenticalToMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beLessThanMatcher:":{"name":"beLessThanMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beLessThanOrEqualToMatcher:":{"name":"beLessThanOrEqualToMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beTruthyMatcher":{"name":"beTruthyMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beFalsyMatcher":{"name":"beFalsyMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beTrueMatcher":{"name":"beTrueMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beFalseMatcher":{"name":"beFalseMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beNilMatcher":{"name":"beNilMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beginWithMatcher:":{"name":"beginWithMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)containMatcher:":{"name":"containMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)containElementSatisfyingMatcher:":{"name":"containElementSatisfyingMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)endWithMatcher:":{"name":"endWithMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)equalMatcher:":{"name":"equalMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)haveCountMatcher:":{"name":"haveCountMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)matchMatcher:":{"name":"matchMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)raiseExceptionMatcher":{"name":"raiseExceptionMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)satisfyAllOfMatcher:":{"name":"satisfyAllOfMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)satisfyAnyOfMatcher:":{"name":"satisfyAnyOfMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC8expectedSSvp":{"name":"expected","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC11actualValueSSSgvp":{"name":"actualValue","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC2toSSvp":{"name":"to","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC07postfixC0SSvp":{"name":"postfixMessage","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC13postfixActualSSvp":{"name":"postfixActual","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC08extendedC0SSSgvp":{"name":"extendedMessage","abstract":"

An optional message that will be appended as a new line and provides additional details","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC15userDescriptionSSSgvp":{"name":"userDescription","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC11stringValueSSvp":{"name":"stringValue","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/c:@M@Nimble@objc(cs)FailureMessage(im)init":{"name":"init()","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC11stringValueACSS_tcfc":{"name":"init(stringValue:)","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC10expectedToACSS_tcfc":{"name":"init(expectedTo:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC21expectedActualValueToACSS_tcfc":{"name":"init(expectedActualValueTo:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC21expectedActualValueTo06customeF0ACSS_SStcfc":{"name":"init(expectedActualValueTo:customActualValue:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC4failACSS_tcfc":{"name":"init(fail:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC7prepend5childACSS_ACtcfc":{"name":"init(prepend:child:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC08appendedC05childACSS_ACtcfc":{"name":"init(appendedMessage:child:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC09prependedC05childACSS_ACtcfc":{"name":"init(prependedMessage:child:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC7details5childACSS_ACtcfc":{"name":"init(details:child:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC17appendedBeNilHintACyF":{"name":"appendedBeNilHint()","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC7toSwiftAA011ExpectationC0OyF":{"name":"toSwift()","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NimbleShortXCTestHandler.html#/s:6Nimble0A18ShortXCTestHandlerC6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"NimbleShortXCTestHandler"},"Classes/NimbleXCTestHandler.html#/s:6Nimble0A13XCTestHandlerC6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"NimbleXCTestHandler"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(im)initWithActualBlock:negative:file:line:":{"name":"init(actualBlock:negative:file:line:)","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)withTimeout":{"name":"withTimeout","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)to":{"name":"to","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toWithDescription":{"name":"toWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNot":{"name":"toNot","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNotWithDescription":{"name":"toNotWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)notTo":{"name":"notTo","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)notToWithDescription":{"name":"notToWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toEventually":{"name":"toEventually","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toEventuallyWithDescription":{"name":"toEventuallyWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toEventuallyNot":{"name":"toEventuallyNot","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toEventuallyNotWithDescription":{"name":"toEventuallyNotWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNotEventually":{"name":"toNotEventually","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNotEventuallyWithDescription":{"name":"toNotEventuallyWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNever":{"name":"toNever","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNeverWithDescription":{"name":"toNeverWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)neverTo":{"name":"neverTo","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)neverToWithDescription":{"name":"neverToWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toAlways":{"name":"toAlways","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toAlwaysWithDescription":{"name":"toAlwaysWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)alwaysTo":{"name":"alwaysTo","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)alwaysToWithDescription":{"name":"alwaysToWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(cm)failWithMessage:file:line:":{"name":"failWithMessage(_:file:line:)","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/AssertionRecorder.html#/s:6Nimble17AssertionRecorderC10assertionsSayAA0B6RecordVGvp":{"name":"assertions","abstract":"

All the assertions that were captured by this recorder

","parent_name":"AssertionRecorder"},"Classes/AssertionRecorder.html#/s:6Nimble17AssertionRecorderCACycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"AssertionRecorder"},"Classes/AssertionRecorder.html#/s:6Nimble17AssertionRecorderC6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"AssertionRecorder"},"Classes/AssertionDispatcher.html#/s:6Nimble19AssertionDispatcherC8handlersACSayAA0B7Handler_pG_tcfc":{"name":"init(handlers:)","abstract":"

Undocumented

","parent_name":"AssertionDispatcher"},"Classes/AssertionDispatcher.html#/s:6Nimble19AssertionDispatcherC6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"AssertionDispatcher"},"Classes/BadInstructionException.html#/c:@M@Nimble@objc(cs)BadInstructionException(im)initWithCoder:":{"name":"init(coder:)","abstract":"

Undocumented

","parent_name":"BadInstructionException"},"Classes/BadInstructionException.html#/c:@M@Nimble@objc(cs)BadInstructionException(cm)receiveReply:":{"name":"receiveReply(_:)","abstract":"

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.

","parent_name":"BadInstructionException"},"Classes/BadInstructionException.html":{"name":"BadInstructionException","abstract":"

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.

"},"Classes/AssertionDispatcher.html":{"name":"AssertionDispatcher","abstract":"

AssertionDispatcher allows multiple AssertionHandlers to receive"},"Classes/AssertionRecorder.html":{"name":"AssertionRecorder","abstract":"

An AssertionHandler that silently records assertions that Nimble makes."},"Classes/NMBExpectation.html":{"name":"NMBExpectation","abstract":"

Undocumented

"},"Classes/NimbleXCTestHandler.html":{"name":"NimbleXCTestHandler","abstract":"

Default handler for Nimble. This assertion handler passes failures along to"},"Classes/NimbleShortXCTestHandler.html":{"name":"NimbleShortXCTestHandler","abstract":"

Alternative handler for Nimble. This assertion handler passes failures along"},"Classes/NMBExpectationMessage.html":{"name":"NMBExpectationMessage","abstract":"

Undocumented

"},"Classes/FailureMessage.html":{"name":"FailureMessage","abstract":"

Encapsulates the failure message that matchers can report to the end user.

"},"Classes/NMBPredicate.html":{"name":"NMBPredicate","abstract":"

Undocumented

"},"Classes/NMBObjCBeCloseToPredicate.html":{"name":"NMBObjCBeCloseToPredicate","abstract":"

Undocumented

"},"Classes/NMBPredicateResult.html":{"name":"NMBPredicateResult","abstract":"

Undocumented

"},"Classes/NMBPredicateStatus.html":{"name":"NMBPredicateStatus","abstract":"

Undocumented

"},"Classes/NMBObjCRaiseExceptionPredicate.html":{"name":"NMBObjCRaiseExceptionPredicate","abstract":"

Undocumented

"},"Classes.html#/BadInstructionException":{"name":"BadInstructionException","abstract":"

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.

"},"Classes/SourceLocation.html":{"name":"SourceLocation","abstract":"

Undocumented

"},"Classes/NMBStringer.html":{"name":"NMBStringer","abstract":"

Undocumented

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Global%20Variables.html":{"name":"Global Variables","abstract":"

The following global variables are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Functions.html":{"name":"Functions","abstract":"

The following functions are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"},"Typealiases.html":{"name":"Type Aliases","abstract":"

The following type aliases are available globally.

"}} \ No newline at end of file diff --git a/docs/docsets/Nimble.docset/Contents/Resources/docSet.dsidx b/docs/docsets/Nimble.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000000000000000000000000000000000000..608096cf06fcdcf3192bffcbd24207dcc281b438 GIT binary patch literal 118784 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%0Aq7<`qkIGfLiS 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 utm?n$8q_p=~FfTouejkB$loG4xI-nh8qjq1^ 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�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

|Y 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

+
+

Nimble 10.0.0 Docs (46% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

Nimble

+ +

Build Status +CocoaPods +Carthage Compatible +Platforms

+ +

Use Nimble to express the expected outcomes of Swift +or Objective-C expressions. Inspired by +Cedar.

+
// 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

+ + + + +

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
+
+XCTAssertEqual(1 + 1, 2, "expected one plus one to equal two")
+
+ +

Or, in Objective-C:

+
// 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. +
  3. It’s hard to write asynchronous tests. XCTest forces you to write +a lot of boilerplate code.
  4. +
+ +

Nimble addresses these concerns.

+

Nimble: Expectations Using expect(...).to

+ +

Nimble allows you to express expectations using a natural, +easily understood language:

+
// Swift
+
+import Nimble
+
+expect(seagull.squawk).to(equal("Squee!"))
+
+
// 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
+
+import Nimble
+
+expect(seagull.squawk).toNot(equal("Oh, hello there!"))
+expect(seagull.squawk).notTo(equal("Oh, hello there!"))
+
+
// 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
+
+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:

+
// 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
+
+// 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
+
+// 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
+
+// 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:

+
// 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
+
+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
+
+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:

+
+
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
+DispatchQueue.main.async {
+    ocean.add("dolphins")
+    ocean.add("whales")
+}
+expect(ocean).toEventually(contain("dolphins", "whales"))
+
+
// 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.

+ +

You can also test that a value always or never matches throughout the length of the timeout. Use toNever and toAlways for this:

+
// Swift
+ocean.add("dolphins")
+expect(ocean).toAlways(contain("dolphins"))
+expect(ocean).toNever(contain("hares"))
+
+
// Objective-C
+[ocean add:@"dolphins"]
+expect(ocean).toAlways(contain(@"dolphins"))
+expect(ocean).toNever(contain(@"hares"))
+
+ +

Sometimes it takes more than a second for a value to update. In those +cases, use the timeout parameter:

+
// Swift
+
+// Waits three seconds for ocean to contain "starfish":
+expect(ocean).toEventually(contain("starfish"), timeout: .seconds(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: .milliseconds(5500), pollInterval: .milliseconds(200))
+
+
// 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
+
+waitUntil { done in
+    ocean.goFish { success in
+        expect(success).to(beTrue())
+        done()
+    }
+}
+
+
// Objective-C
+
+waitUntil(^(void (^done)(void)){
+    [ocean goFishWithHandler:^(BOOL success){
+        expect(success).to(beTrue());
+        done();
+    }];
+});
+
+ +

waitUntil also optionally takes a timeout parameter:

+
// Swift
+
+waitUntil(timeout: .seconds(10)) { done in
+    ocean.goFish { success in
+        expect(success).to(beTrue())
+        done()
+    }
+}
+
+
// 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
+
+// Increase the global timeout to 5 seconds:
+Nimble.AsyncDefaults.timeout = .seconds(5)
+
+// Slow the polling interval to 0.1 seconds:
+Nimble.AsyncDefaults.pollInterval = .milliseconds(100)
+
+

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:
  2. +
+
   // 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)));
+
+ +
    +
  1. To make an expectation on an expression that does not return a value, +such as -[NSException raise], use expectAction instead of +expect:
  2. +
+
   // 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.

+

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:

+
#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
+
+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))
+
+
// 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
+
+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
+
+// 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
+
+
// 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
+
+// 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.

+
// 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
+
+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
+
+
// 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
+
+expect(actual).to(beCloseTo(expected, within: delta))
+
+
// Objective-C
+
+expect(actual).to(beCloseTo(expected).within(delta));
+
+ +

For example, to assert that 10.01 is close to 10, you can write:

+
// Swift
+
+expect(10.01).to(beCloseTo(10, within: 0.1))
+
+
// Objective-C
+
+expect(@(10.01)).to(beCloseTo(@10).within(0.1));
+
+ +

There is also an operator shortcut available in 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
+
+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
+
+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 conform to FloatingPoint.

+
+

Types/Classes

+
// 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))
+
+
// 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
+
+expect(dolphin).to(beAKindOf(Mammal))
+
+
// Objective-C
+
+expect(dolphin).to(beAKindOf([Mammal class]));
+
+ +
+

beAnInstanceOf uses the -[NSObject isMemberOfClass:] method to + test membership. beAKindOf uses -[NSObject isKindOfClass:].

+
+

Truthiness

+
// 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())
+
+
// 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’s CwlPreconditionTesting library.

+
// 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.
  • +
  • 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

+ +

You can use the throwError matcher to check if an error is thrown.

+
// 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
+
+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
+
+// 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"))
+})
+
+
// 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). +Only Objective-C code can raise exceptions that Nimble will catch.

+

Collection Membership

+
// 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())
+
+
// 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.

+
+ +

For example, to assert that a list of sea creature names contains +“dolphin” and “starfish”:

+
// Swift
+
+expect(["whale", "dolphin", "starfish"]).to(contain("dolphin", "starfish"))
+
+
// 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
+
+// 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...))
+
+
// 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.

+ +

For code that returns collections of complex objects without a strict +ordering, there is the containElementSatisfying matcher:

+
// 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
+
+
// Objective-C
+
+@interface Turtle : NSObject
+@property (nonatomic, readonly, nonnull) NSString *color;
+@end
+
+@implementation Turtle 
+@end
+
+NSArray<Turtle *> * __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"];
+}));
+
+ +

For asserting on if the given Comparable value is inside of a Range, use the beWithin matcher.

+
// Swift
+
+// Passes if 5 is within the range 1 through 10, inclusive
+expect(5).to(beWithin(1...10))
+
+// Passes if 5 is not within the range 2 through 4.
+expect(5).toNot(beWithin(2..<5))
+
+

Strings

+
// 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))
+
+
// 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
+
+// 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.

+
// Objective-C
+
+expect(@[@1, @2, @3, @4]).to(allPass(beLessThan(@5)));
+
+

Collection Count

+
// 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))
+
+
// 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
+let testNotification = Notification(name: Notification.Name("Foo"), object: nil)
+
+// Passes if the closure in expect { ... } posts a notification to the default
+// notification center.
+expect {
+    NotificationCenter.default.post(testNotification)
+}.to(postNotifications(equal([testNotification])))
+
+// Passes if the closure in expect { ... } posts a notification to a given
+// notification center
+let notificationCenter = NotificationCenter()
+expect {
+    notificationCenter.post(testNotification)
+}.to(postNotifications(equal([testNotification]), from: notificationCenter))
+
+// Passes if the closure in expect { ... } posts a notification with the provided names to a given
+// notification center. Make sure to use this when running tests on Catalina, 
+// using DistributedNotificationCenter as there is currently no way 
+// of observing notifications without providing specific names.
+let distributedNotificationCenter = DistributedNotificationCenter()
+expect {
+    distributedNotificationCenter.post(testNotification)
+}.toEventually(postDistributedNotifications(equal([testNotification]),
+                                  from: distributedNotificationCenter,
+                                  names: [testNotification.name]))
+
+ +
+

This matcher is only available in Swift.

+
+

Result

+
// Swift
+let aResult: Result<String, Error> = .success("Hooray") 
+
+// passes if result is .success
+expect(aResult).to(beSuccess()) 
+
+// passes if result value is .success and validates Success value
+expect(aResult).to(beSuccess { value in
+    expect(value).to(equal("Hooray"))
+})
+
+
+enum AnError: Error {
+    case somethingHappened
+}
+let otherResult: Result<String, AnError> = .failure(.somethingHappened) 
+
+// passes if result is .failure
+expect(otherResult).to(beFailure()) 
+
+// passes if result value is .failure and validates error
+expect(otherResult).to(beFailure { error in
+    expect(error).to(matchError(AnError.somethingHappened))
+}) 
+
+ +
+

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))
+
+
// 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
+
+// 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
+
+public func equal<T: Equatable>(expectedValue: T?) -> Predicate<T> {
+    // Can be shortened to:
+    //   Predicate { actual in  ... }
+    //
+    // But shown with types here for clarity.
+    return Predicate { (actualExpression: Expression<T>) 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 +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
+
+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
+
+public indirect enum ExpectationMessage {
+// Emits standard error message:
+// eg - "expected to <string>, got <actual>"
+case expectedActualValueTo(/* message: */ String)
+
+// Allows any free-form message
+// eg - "<string>"
+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
+
+public func beNil<T>() -> Predicate<T> {
+    // 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
+
+public func haveDescription(description: String) -> Predicate<Printable?> {
+    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:

+
// 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
+
+public func equal<T: Equatable>(_ expectedValue: T?) -> Predicate<T> {
+    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
+
+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:

+
public indirect enum ExpectationMessage {
+// Emits standard error message:
+// eg - "expected to <message>, got <actual>"
+case expectedActualValueTo(/* message: */ String)
+
+// Allows any free-form message
+// eg - "<message>"
+case fail(/* message: */ String)
+
+// Emits standard error message with a custom actual value instead of the default.
+// eg - "expected to <message>, got <actual>"
+case expectedCustomValueTo(/* message: */ String, /* actual: */ String)
+
+// Emits standard error message without mentioning the actual value
+// eg - "expected to <message>"
+case expectedTo(/* message: */ String)
+
+// ...
+}
+
+ +

For matchers that compose other matchers, there are a handful of helper +functions to annotate messages.

+ +

appended(message: String) is used to append to the original failure message:

+
// produces "expected to be true, got <actual> (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:

+
// produces "expected to be true, got <actual>\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 NMBPredicate class, adding a new class method for your +custom matcher. The example below defines the class method ++[NMBPredicate beNilMatcher]:

+
// Swift
+
+extension NMBPredicate {
+    @objc public class func beNilMatcher() -> NMBPredicate {
+        return NMBPredicate { actualExpression in
+            return try beNil().satisfies(actualExpression).toObjectiveC()
+        }
+    }
+}
+
+ +

The above allows you to use the matcher from Objective-C:

+
// Objective-C
+
+expect(actual).to([NMBPredicate beNilMatcher]());
+
+ +

To make the syntax easier to use, define a C function that calls the +class method:

+
// Objective-C
+
+FOUNDATION_EXPORT NMBPredicate *beNil() {
+    return [NMBPredicate beNilMatcher];
+}
+
+

Properly Handling nil in Objective-C Matchers

+ +

When supporting Objective-C, make sure you handle nil appropriately. +Like Cedar, +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:

+
// 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 Predicate.define or Predicate.simple. +Using those factory methods will automatically generate expected value failure messages when they’re nil.

+
public func beginWith<S: Sequence>(_ startingElement: S.Element) -> Predicate<S> where S.Element: Equatable {
+    return Predicate.simple("begin with <\(startingElement)>") { actualExpression in
+        guard let actualValue = try actualExpression.evaluate() else { return .fail }
+
+        var actualGenerator = actualValue.makeIterator()
+        return PredicateStatus(bool: actualGenerator.next() == startingElement)
+    }
+}
+
+extension NMBPredicate {
+    @objc public class func beginWithMatcher(_ expected: Any) -> NMBPredicate {
+        return NMBPredicate { actualExpression in
+            let actual = try actualExpression.evaluate()
+            let expr = actualExpression.cast { $0 as? NMBOrderedCollection }
+            return try beginWith(expected).satisfies(expr).toObjectiveC()
+        }
+    }
+}
+
+

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. The old API has been +removed completely in Nimble v10.

+

Installing Nimble

+ +
+

Nimble can be used on its own, or in conjunction with its sister + project, Quick. To install both + Quick and Nimble, follow the installation instructions in the Quick + Documentation.

+
+ +

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. +
  3. Add Nimble.xcodeproj to the Xcode workspace for your project
  4. +
  5. Link Nimble.framework to your test target
  6. +
  7. Start writing expectations!
  8. +
+ +

For more detailed instructions on each of these steps, +read 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.

+
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'
+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:
  2. +
+
class MyAssertionHandler : AssertionHandler {
+    func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) {
+        if (!assertion) {
+            print("Expectation failed: \(message.stringValue)")
+        }
+    }
+}
+
+
// Somewhere before you use any assertions
+NimbleAssertionHandler = MyAssertionHandler()
+
+ +
    +
  1. 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" +
    • +
  2. +
+ +

You can now use Nimble assertions in your code and handle failures as you see +fit.

+ +
+
+ +
+
+ + diff --git a/docs/js/jazzy.js b/docs/js/jazzy.js new file mode 100755 index 000000000..198441660 --- /dev/null +++ b/docs/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docs/js/jazzy.search.js b/docs/js/jazzy.search.js new file mode 100644 index 000000000..359cdbb8b --- /dev/null +++ b/docs/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docs/js/jquery.min.js b/docs/js/jquery.min.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/docs/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/js/typeahead.jquery.js b/docs/js/typeahead.jquery.js new file mode 100644 index 000000000..3a2d2ab03 --- /dev/null +++ b/docs/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docs/search.json b/docs/search.json new file mode 100644 index 000000000..de8112a41 --- /dev/null +++ b/docs/search.json @@ -0,0 +1 @@ +{"Typealiases.html#/s:6Nimble14PredicateBlocka":{"name":"PredicateBlock","abstract":"

Undocumented

"},"Typealiases.html#/FileString":{"name":"FileString"},"Typealiases.html#/s:6Nimble10FileStringa":{"name":"FileString","abstract":"

Undocumented

"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV6statusAA0B6StatusOvp":{"name":"status","abstract":"

Status indicates if the predicate matches, does not match, or fails.

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV7messageAA18ExpectationMessageOvp":{"name":"message","abstract":"

The error message that can be displayed if it does not match

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV6status7messageAcA0B6StatusO_AA18ExpectationMessageOtcfc":{"name":"init(status:message:)","abstract":"

Constructs a new PredicateResult with a given status and error message

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV4bool7messageACSb_AA18ExpectationMessageOtcfc":{"name":"init(bool:message:)","abstract":"

Shorthand to PredicateResult(status: PredicateStatus(bool: bool), message: message)

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV9toBoolean11expectationSbAA16ExpectationStyleO_tF":{"name":"toBoolean(expectation:)","abstract":"

Converts the result to a boolean based on what the expectation intended

","parent_name":"PredicateResult"},"Structs/PredicateResult.html#/s:6Nimble15PredicateResultV12toObjectiveCAA012NMBPredicateC0CyF":{"name":"toObjectiveC()","abstract":"

Undocumented

","parent_name":"PredicateResult"},"Structs/Predicate.html#/s:6Nimble9PredicateVyACyxGAA0B6ResultVAA10ExpressionVyxGKccfc":{"name":"init(_:)","abstract":"

Constructs a predicate that knows how take a given value

","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV9satisfiesyAA0B6ResultVAA10ExpressionVyxGKF":{"name":"satisfies(_:)","abstract":"

Uses a predicate on a given value to see if it passes the predicate.

","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV6define7matcherACyxGAA0B6ResultVAA10ExpressionVyxGKc_tFZ":{"name":"define(matcher:)","abstract":"

Like Predicate() constructor, but automatically guard against nil (actual) values

","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV6define_7matcherACyxGSS_AA0B6ResultVAA10ExpressionVyxG_AA18ExpectationMessageOtKctFZ":{"name":"define(_:matcher:)","abstract":"

Defines a predicate with a default message that can be returned in the closure","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV13defineNilable_7matcherACyxGSS_AA0B6ResultVAA10ExpressionVyxG_AA18ExpectationMessageOtKctFZ":{"name":"defineNilable(_:matcher:)","abstract":"

Defines a predicate with a default message that can be returned in the closure","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV6simple_7matcherACyxGSS_AA0B6StatusOAA10ExpressionVyxGKctFZ":{"name":"simple(_:matcher:)","abstract":"

Provides a simple predicate definition that provides no control over the predefined","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV13simpleNilable_7matcherACyxGSS_AA0B6StatusOAA10ExpressionVyxGKctFZ":{"name":"simpleNilable(_:matcher:)","abstract":"

Provides a simple predicate definition that provides no control over the predefined","parent_name":"Predicate"},"Structs/Predicate.html#/s:6Nimble9PredicateV13requireNonNilACyxGvp":{"name":"requireNonNil","abstract":"

Returns a new Predicate based on the current one that always fails if nil is given as","parent_name":"Predicate"},"Structs/AsyncDefaults.html#/s:6Nimble13AsyncDefaultsV7timeout8Dispatch0E12TimeIntervalOvpZ":{"name":"timeout","abstract":"

Undocumented

","parent_name":"AsyncDefaults"},"Structs/AsyncDefaults.html#/s:6Nimble13AsyncDefaultsV12pollInterval8Dispatch0f4TimeE0OvpZ":{"name":"pollInterval","abstract":"

Undocumented

","parent_name":"AsyncDefaults"},"Structs/Expression.html#/s:6Nimble10ExpressionV8locationAA14SourceLocationCvp":{"name":"location","abstract":"

Undocumented

","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV9isClosureSbvp":{"name":"isClosure","abstract":"

Undocumented

","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV10expression8location9isClosureACyxGxSgyKc_AA14SourceLocationCSbtcfc":{"name":"init(expression:location:isClosure:)","abstract":"

Creates a new expression struct. Normally, expect(…) will manage this","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV08memoizedB08location14withoutCaching9isClosureACyxGxSgSbKc_AA14SourceLocationCS2btcfc":{"name":"init(memoizedExpression:location:withoutCaching:isClosure:)","abstract":"

Creates a new expression struct. Normally, expect(…) will manage this","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV4castyACyqd__Gqd__SgxSgKclF":{"name":"cast(_:)","abstract":"

Returns a new Expression from the given expression. Identical to a map()","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV8evaluatexSgyKF":{"name":"evaluate()","abstract":"

Undocumented

","parent_name":"Expression"},"Structs/Expression.html#/s:6Nimble10ExpressionV14withoutCachingACyxGyF":{"name":"withoutCaching()","abstract":"

Undocumented

","parent_name":"Expression"},"Structs/Expectation/Nil.html#/s:s23ExpressibleByNilLiteralP03nilD0xyt_tcfc":{"name":"init(nilLiteral:)","parent_name":"Nil"},"Structs/Expectation.html#/s:6Nimble11ExpectationV10expressionAA10ExpressionVyxGvp":{"name":"expression","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV10expressionACyxGAA10ExpressionVyxG_tcfc":{"name":"init(expression:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV6verifyyySb_AA14FailureMessageCtF":{"name":"verify(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV2to_11descriptionACyxGAA9PredicateVyxG_SSSgtF":{"name":"to(_:description:)","abstract":"

Tests the actual value using a matcher to match.

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV5toNot_11descriptionACyxGAA9PredicateVyxG_SSSgtF":{"name":"toNot(_:description:)","abstract":"

Tests the actual value using a matcher to not match.

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV5notTo_11descriptionACyxGAA9PredicateVyxG_SSSgtF":{"name":"notTo(_:description:)","abstract":"

Tests the actual value using a matcher to not match.

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV12toEventually_7timeout12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"toEventually(_:timeout:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to match by checking continuously","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV15toEventuallyNot_7timeout12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0k4TimeH0OAMSSSgtF":{"name":"toEventuallyNot(_:timeout:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to not match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV15toNotEventually_7timeout12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0k4TimeH0OAMSSSgtF":{"name":"toNotEventually(_:timeout:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to not match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV7toNever_5until12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"toNever(_:until:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to never match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV7neverTo_5until12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"neverTo(_:until:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to never match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV8toAlways_5until12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"toAlways(_:until:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to always match by checking","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV8alwaysTo_5until12pollInterval11descriptionyAA9PredicateVyxG_8Dispatch0j4TimeG0OAMSSSgtF":{"name":"alwaysTo(_:until:pollInterval:description:)","abstract":"

Tests the actual value using a matcher to always match by checking","parent_name":"Expectation"},"Structs/Expectation/Nil.html":{"name":"Nil","abstract":"

Represents nil value to be used with the operator overloads for beNil.

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV2eeoiyyACyxG_AC3NilVyx_GtFZ":{"name":"==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationV2neoiyyACyxG_AC3NilVyx_GtFZ":{"name":"!=(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAASlRzSF7ElementRpzlE003dchoiyyACyxG_xtFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAASFRzlE003dchoiyyACyxG_xtFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAASFRzlE003dchoiyyACyxG_x8expected_x5deltattFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAASFRzlE2eeoiyyACyxG_x8expected_x5deltattFZ":{"name":"==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVA2A20NMBDoubleConvertibleRzlE003dchoiyyACyxG_xtFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVA2A20NMBDoubleConvertibleRzlE003dchoiyyACyxG_x8expected_Sd5deltattFZ":{"name":"≈(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVA2A20NMBDoubleConvertibleRzlE2eeoiyyACyxG_x8expected_Sd5deltattFZ":{"name":"==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAAyXlRszlE3eeeoiyyACyyXlG_yXlSgtFZ":{"name":"===(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAAyXlRszlE3neeoiyyACyyXlG_yXlSgtFZ":{"name":"!==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAAytRszlE2eeoiyyACyytG_yttFZ":{"name":"==(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/Expectation.html#/s:6Nimble11ExpectationVAAytRszlE2neoiyyACyytG_yttFZ":{"name":"!=(_:_:)","abstract":"

Undocumented

","parent_name":"Expectation"},"Structs/AssertionRecord.html#/s:6Nimble15AssertionRecordV7successSbvp":{"name":"success","abstract":"

Whether the assertion succeeded or failed

","parent_name":"AssertionRecord"},"Structs/AssertionRecord.html#/s:6Nimble15AssertionRecordV7messageAA14FailureMessageCvp":{"name":"message","abstract":"

The failure message the assertion would display on failure.

","parent_name":"AssertionRecord"},"Structs/AssertionRecord.html#/s:6Nimble15AssertionRecordV8locationAA14SourceLocationCvp":{"name":"location","abstract":"

The source location the expectation occurred on.

","parent_name":"AssertionRecord"},"Structs/AssertionRecord.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"AssertionRecord"},"Structs/execTypesCountTuple.html#/s:6Nimble19execTypesCountTupleV5valuex_xxxxxxxxxxxxxtvp":{"name":"value","abstract":"

Undocumented

","parent_name":"execTypesCountTuple"},"Structs/execTypesCountTuple.html#/s:6Nimble19execTypesCountTupleVACyxGycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"execTypesCountTuple"},"Structs/execTypesCountTuple.html":{"name":"execTypesCountTuple","abstract":"

Undocumented

"},"Structs/AssertionRecord.html":{"name":"AssertionRecord","abstract":"

A data structure that stores information about an assertion when"},"Structs/Expectation.html":{"name":"Expectation","abstract":"

Undocumented

"},"Structs/Expression.html":{"name":"Expression","abstract":"

Expression represents the closure of the value inside expect(…)."},"Structs/AsyncDefaults.html":{"name":"AsyncDefaults","abstract":"

If you are running on a slower machine, it could be useful to increase the default timeout value"},"Structs/Predicate.html":{"name":"Predicate","abstract":"

A Predicate is part of the new matcher API that provides assertions to expectations.

"},"Structs/PredicateResult.html":{"name":"PredicateResult","abstract":"

The value that a Predicates return to describe if the given (actual) value matches the"},"Protocols/TestOutputStringConvertible.html#/s:6Nimble27TestOutputStringConvertibleP15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"TestOutputStringConvertible"},"Protocols/NMBComparable.html#/c:@M@Nimble@objc(pl)NMBComparable(im)NMB_compare:":{"name":"NMB_compare(_:)","abstract":"

Undocumented

","parent_name":"NMBComparable"},"Protocols/NMBDoubleConvertible.html#/s:6Nimble20NMBDoubleConvertibleP11doubleValueSdvp":{"name":"doubleValue","abstract":"

Undocumented

","parent_name":"NMBDoubleConvertible"},"Protocols/NMBOrderedCollection.html#/s:6Nimble20NMBOrderedCollectionP6object2atypSi_tF":{"name":"object(at:)","abstract":"

Undocumented

","parent_name":"NMBOrderedCollection"},"Protocols/NMBCollection.html#/s:6Nimble13NMBCollectionP5countSivp":{"name":"count","abstract":"

Undocumented

","parent_name":"NMBCollection"},"Protocols/NMBContainer.html#/s:6Nimble12NMBContainerP8containsySbypF":{"name":"contains(_:)","abstract":"

Undocumented

","parent_name":"NMBContainer"},"Protocols/AssertionHandler.html#/s:6Nimble16AssertionHandlerP6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"AssertionHandler"},"Protocols/AssertionHandler.html":{"name":"AssertionHandler","abstract":"

Protocol for the assertion handler that Nimble uses for all expectations.

"},"Protocols/NMBContainer.html":{"name":"NMBContainer","abstract":"

Protocol for types that support contain() matcher.

"},"Protocols/NMBCollection.html":{"name":"NMBCollection","abstract":"

Protocol for types that support only beEmpty(), haveCount() matchers

"},"Protocols/NMBOrderedCollection.html":{"name":"NMBOrderedCollection","abstract":"

Protocol for types that support beginWith(), endWith(), beEmpty() matchers

"},"Protocols/NMBDoubleConvertible.html":{"name":"NMBDoubleConvertible","abstract":"

Undocumented

"},"Protocols/NMBComparable.html":{"name":"NMBComparable","abstract":"

Protocol for types to support beLessThan(), beLessThanOrEqualTo(),"},"Protocols/TestOutputStringConvertible.html":{"name":"TestOutputStringConvertible","abstract":"

A type with a customized test output text representation.

"},"Functions.html#/s:6Nimble19catchBadInstruction2inAA0cD9ExceptionCSgyyc_tF":{"name":"catchBadInstruction(in:)","abstract":"

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."},"Functions.html#/s:6Nimble21MACH_MSGH_BITS_REMOTEys6UInt32VADF":{"name":"MACH_MSGH_BITS_REMOTE(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble14MACH_MSGH_BITSys6UInt32VAD_ADtF":{"name":"MACH_MSGH_BITS(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble20withAssertionHandler_4file4line7closureyAA0cD0_p_SSSuyyKXEtF":{"name":"withAssertionHandler(_:file:line:closure:)","abstract":"

Allows you to temporarily replace the current Nimble assertion handler with"},"Functions.html#/s:6Nimble18gatherExpectations8silently7closureSayAA15AssertionRecordVGSb_yyXEtF":{"name":"gatherExpectations(silently:closure:)","abstract":"

Captures expectations that occur in the given closure. Note that all"},"Functions.html#/s:6Nimble25gatherFailingExpectations8silently7closureSayAA15AssertionRecordVGSb_yyXEtF":{"name":"gatherFailingExpectations(silently:closure:)","abstract":"

Captures failed expectations that occur in the given closure. Note that all"},"Functions.html#/s:6Nimble13recordFailure_8locationySS_AA14SourceLocationCtF":{"name":"recordFailure(_:location:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble9waitUntil7timeout4file4line6actiony8Dispatch0H12TimeIntervalO_SSSuyyycctF":{"name":"waitUntil(timeout:file:line:action:)","abstract":"

Wait asynchronously until the done closure is called or the timeout has been reached.

"},"Functions.html#/s:6Nimble6expect4file4line_AA11ExpectationVyxGSS_SuxSgyKXAtlF":{"name":"expect(file:line:_:)","abstract":"

Make an expectation on a given actual value. The value given is lazily evaluated.

"},"Functions.html#/s:6Nimble6expect4file4line_AA11ExpectationVyxGSS_SuxyKcyXKtlF":{"name":"expect(file:line:_:)","abstract":"

Make an expectation on a given actual value. The closure is lazily invoked.

"},"Functions.html#/s:6Nimble6expect4file4line_AA11ExpectationVyxGSS_SuxSgyKcyXKtlF":{"name":"expect(file:line:_:)","abstract":"

Make an expectation on a given actual value. The closure is lazily invoked.

"},"Functions.html#/s:6Nimble6expect4file4line_AA11ExpectationVyytGSS_SuyyKcyXKtF":{"name":"expect(file:line:_:)","abstract":"

Make an expectation on a given actual value. The closure is lazily invoked.

"},"Functions.html#/s:6Nimble4fail_8locationySS_AA14SourceLocationCtF":{"name":"fail(_:location:)","abstract":"

Always fails the test with a message and a specified location.

"},"Functions.html#/s:6Nimble4fail_4file4lineySS_SSSutF":{"name":"fail(_:file:line:)","abstract":"

Always fails the test with a message.

"},"Functions.html#/s:6Nimble4fail_4lineySS_SutF":{"name":"fail(_:line:)","abstract":"

Always fails the test.

"},"Functions.html#/s:6Nimble7allPassyAA9PredicateVyxGSb7ElementQzKcSTRzlF":{"name":"allPass(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7allPassyAA9PredicateVyxGSS_Sb7ElementQzKctSTRzlF":{"name":"allPass(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7allPassyAA9PredicateVyxGADy7ElementQzGSTRzlF":{"name":"allPass(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble9beAKindOfyAA9PredicateVyypGxmlF":{"name":"beAKindOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is an instance of the given class.

"},"Functions.html#/s:6Nimble9beAKindOfyAA9PredicateVySo8NSObjectCGyXlXpF":{"name":"beAKindOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is an instance of the given class."},"Functions.html#/s:6Nimble14beAnInstanceOfyAA9PredicateVyypGxmlF":{"name":"beAnInstanceOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is an exact instance of the given class.

"},"Functions.html#/s:6Nimble14beAnInstanceOfyAA9PredicateVySo8NSObjectCGyXlXpF":{"name":"beAnInstanceOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is an instance of the given class."},"Functions.html#/s:6Nimble12defaultDeltaxySFRzlF":{"name":"defaultDelta()","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble9beCloseTo_6withinAA9PredicateVyxGx_xtSFRzlF":{"name":"beCloseTo(_:within:)","abstract":"

A Nimble matcher that succeeds when a value is close to another. This is used for floating"},"Functions.html#/s:6Nimble9beCloseTo_6withinAA9PredicateVyxGx_SdtAA20NMBDoubleConvertibleRzlF":{"name":"beCloseTo(_:within:)","abstract":"

A Nimble matcher that succeeds when a value is close to another. This is used for floating"},"Functions.html#/s:6Nimble9beCloseTo_6withinAA9PredicateVyq_Gq__xtSFRz7ElementQy_RszSlR_r0_lF":{"name":"beCloseTo(_:within:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble003obaoiyx8expected_x5deltatx_xtSFRzlF":{"name":"±(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble003obaoiyx8expected_Sd5deltatx_SdtAA20NMBDoubleConvertibleRzlF":{"name":"±(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVyxGySTRzlF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVyxGys10SetAlgebraRzlF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVyxGySTRzs10SetAlgebraRzlF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVySSGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVySo8NSStringCGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVySo12NSDictionaryCGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVySo7NSArrayCGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble7beEmptyAA9PredicateVyAA13NMBCollection_pGyF":{"name":"beEmpty()","abstract":"

A Nimble matcher that succeeds when a value is “empty”. For collections, this"},"Functions.html#/s:6Nimble13beGreaterThanyAA9PredicateVyxGxSgSLRzlF":{"name":"beGreaterThan(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is greater than the expected value.

"},"Functions.html#/s:6Nimble1goiyyAA11ExpectationVyxG_xtSLRzlF":{"name":">(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble13beGreaterThanyAA9PredicateVyAA13NMBComparable_pGAaE_pSgF":{"name":"beGreaterThan(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is greater than the expected value.

"},"Functions.html#/s:6Nimble1goiyyAA11ExpectationVyAA13NMBComparable_pG_AaE_pSgtF":{"name":">(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble22beGreaterThanOrEqualToyAA9PredicateVyxGxSgSLRzlF":{"name":"beGreaterThanOrEqualTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is greater than"},"Functions.html#/s:6Nimble2geoiyyAA11ExpectationVyxG_xtSLRzlF":{"name":">=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble22beGreaterThanOrEqualToyAA9PredicateVyxGxSgAA13NMBComparableRzlF":{"name":"beGreaterThanOrEqualTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is greater than"},"Functions.html#/s:6Nimble2geoiyyAA11ExpectationVyxG_xtAA13NMBComparableRzlF":{"name":">=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble13beIdenticalToyAA9PredicateVyyXlGyXlSgF":{"name":"beIdenticalTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is the same instance"},"Functions.html#/s:6Nimble2beyAA9PredicateVyyXlGyXlSgF":{"name":"be(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is the same instance"},"Functions.html#/s:6Nimble10beLessThanyAA9PredicateVyxGxSgSLRzlF":{"name":"beLessThan(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is less than the expected value.

"},"Functions.html#/s:6Nimble1loiyyAA11ExpectationVyxG_xtSLRzlF":{"name":"<(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble10beLessThanyAA9PredicateVyAA13NMBComparable_pGAaE_pSgF":{"name":"beLessThan(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is less than the expected value.

"},"Functions.html#/s:6Nimble1loiyyAA11ExpectationVyAA13NMBComparable_pG_AaE_pSgtF":{"name":"<(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble19beLessThanOrEqualToyAA9PredicateVyxGxSgSLRzlF":{"name":"beLessThanOrEqualTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is less than"},"Functions.html#/s:6Nimble2leoiyyAA11ExpectationVyxG_xtSLRzlF":{"name":"<=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble19beLessThanOrEqualToyAA9PredicateVyxGxSgAA13NMBComparableRzlF":{"name":"beLessThanOrEqualTo(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is less than"},"Functions.html#/s:6Nimble2leoiyyAA11ExpectationVyxG_xtAA13NMBComparableRzlF":{"name":"<=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble6beTrueAA9PredicateVySbGyF":{"name":"beTrue()","abstract":"

A Nimble matcher that succeeds when the actual value is exactly true."},"Functions.html#/s:6Nimble7beFalseAA9PredicateVySbGyF":{"name":"beFalse()","abstract":"

A Nimble matcher that succeeds when the actual value is exactly false."},"Functions.html#/s:6Nimble8beTruthyAA9PredicateVyxGySQRzs27ExpressibleByBooleanLiteralRzlF":{"name":"beTruthy()","abstract":"

A Nimble matcher that succeeds when the actual value is not logically false.

"},"Functions.html#/s:6Nimble7beFalsyAA9PredicateVyxGySQRzs27ExpressibleByBooleanLiteralRzlF":{"name":"beFalsy()","abstract":"

A Nimble matcher that succeeds when the actual value is logically false."},"Functions.html#/s:6Nimble5beNilAA9PredicateVyxGylF":{"name":"beNil()","abstract":"

A Nimble matcher that succeeds when the actual value is nil.

"},"Functions.html#/s:6Nimble9beSuccess4testAA9PredicateVys6ResultOyxq_GGyxcSg_ts5ErrorR_r0_lF":{"name":"beSuccess(test:)","abstract":"

A Nimble matcher for Result that succeeds when the actual value is success.

"},"Functions.html#/s:6Nimble9beFailure4testAA9PredicateVys6ResultOyxq_GGyq_cSg_ts5ErrorR_r0_lF":{"name":"beFailure(test:)","abstract":"

A Nimble matcher for Result that succeeds when the actual value is failure.

"},"Functions.html#/s:6Nimble6beVoidAA9PredicateVyytGyF":{"name":"beVoid()","abstract":"

A Nimble matcher that succeeds when the actual value is Void.

"},"Functions.html#/s:6Nimble8beWithinyAA9PredicateVyxGSnyxGSLRzlF":{"name":"beWithin(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is within given range.

"},"Functions.html#/s:6Nimble8beWithinyAA9PredicateVyxGSNyxGSLRzlF":{"name":"beWithin(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is within given range.

"},"Functions.html#/s:6Nimble9beginWithyAA9PredicateVyxG7ElementQzSTRzSQAGRQlF":{"name":"beginWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence’s first element"},"Functions.html#/s:6Nimble9beginWithyAA9PredicateVyAA20NMBOrderedCollection_pGypF":{"name":"beginWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual collection’s first element"},"Functions.html#/s:6Nimble9beginWithyAA9PredicateVySSGSSF":{"name":"beginWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual string contains expected substring"},"Functions.html#/s:6Nimble9beginWith6prefixAA9PredicateVyxGq_Sg_tSTRzSTR_SQ7ElementRpzAHQy_AIRSr0_lF":{"name":"beginWith(prefix:)","abstract":"

A Nimble matcher that succeeds when the exepected sequence is a prefix of the actual sequence.

"},"Functions.html#/s:6Nimble9beginWith6prefix2byAA9PredicateVyxGq_Sg_Sb7ElementQz_AIQy_tctSTRzSTR_r0_lF":{"name":"beginWith(prefix:by:)","abstract":"

A Nimble matcher that succeeds when the expected sequence is the prefix of the actual sequence, using the given predicate as the equivalence test.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxG7ElementQzd_tSTRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxGSay7ElementQzGSTRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxG7ElementQzd_ts10SetAlgebraRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual set contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxGSay7ElementQzGs10SetAlgebraRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual set contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxG7ElementSTQzd_tSTRzs10SetAlgebraRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual set contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyxGSay7ElementSTQzGSTRzs10SetAlgebraRzSQAGRQlF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual set contains the expected values.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVySSGSSd_tF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual string contains the expected substring.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVySSGSaySSGF":{"name":"contain(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7containyAA9PredicateVySo8NSStringCGAFd_tF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual string contains the expected substring.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVySo8NSStringCGSayAFGF":{"name":"contain(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyAA12NMBContainer_pGypSgd_tF":{"name":"contain(_:)","abstract":"

A Nimble matcher that succeeds when the actual collection contains the expected object.

"},"Functions.html#/s:6Nimble7containyAA9PredicateVyAA12NMBContainer_pGSayypSgGF":{"name":"contain(_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble24containElementSatisfyingyAA9PredicateVyxGSb0C0Qzc_SStSTRzlF":{"name":"containElementSatisfying(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble13elementsEqualyAA9PredicateVyxGq_SgSTRzSTR_SQ7ElementRpzAGQy_AHRSr0_lF":{"name":"elementsEqual(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain the same elements in"},"Functions.html#/s:6Nimble13elementsEqual_2byAA9PredicateVyxGq_Sg_Sb7ElementQz_AHQy_tctSTRzSTR_r0_lF":{"name":"elementsEqual(_:by:)","abstract":"

A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain equivalent elements in"},"Functions.html#/s:6Nimble7endWithyAA9PredicateVyxG7ElementQzSTRzSQAGRQlF":{"name":"endWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual sequence’s last element"},"Functions.html#/s:6Nimble7endWithyAA9PredicateVyAA20NMBOrderedCollection_pGypF":{"name":"endWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual collection’s last element"},"Functions.html#/s:6Nimble7endWithyAA9PredicateVySSGSSF":{"name":"endWith(_:)","abstract":"

A Nimble matcher that succeeds when the actual string contains the expected substring"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_tGx_q_tSgSQRzSQR_r0_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_tG_x_q_tSgtSQRzSQR_r0_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_tG_x_q_tSgtSQRzSQR_r0_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_q0_tGx_q_q0_tSgSQRzSQR_SQR0_r1_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_q0_tG_x_q_q0_tSgtSQRzSQR_SQR0_r1_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_q0_tG_x_q_q0_tSgtSQRzSQR_SQR0_r1_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_q0_q1_tGx_q_q0_q1_tSgSQRzSQR_SQR0_SQR1_r2_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_q0_q1_tG_x_q_q0_q1_tSgtSQRzSQR_SQR0_SQR1_r2_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_q0_q1_tG_x_q_q0_q1_tSgtSQRzSQR_SQR0_SQR1_r2_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_q0_q1_q2_tGx_q_q0_q1_q2_tSgSQRzSQR_SQR0_SQR1_SQR2_r3_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_q0_q1_q2_tG_x_q_q0_q1_q2_tSgtSQRzSQR_SQR0_SQR1_SQR2_r3_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_q0_q1_q2_tG_x_q_q0_q1_q2_tSgtSQRzSQR_SQR0_SQR1_SQR2_r3_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyx_q_q0_q1_q2_q3_tGx_q_q0_q1_q2_q3_tSgSQRzSQR_SQR0_SQR1_SQR2_SQR3_r4_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual tuple is equal to the expected tuple."},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyx_q_q0_q1_q2_q3_tG_x_q_q0_q1_q2_q3_tSgtSQRzSQR_SQR0_SQR1_SQR2_SQR3_r4_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyx_q_q0_q1_q2_q3_tG_x_q_q0_q1_q2_q3_tSgtSQRzSQR_SQR0_SQR1_SQR2_SQR3_r4_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyxGxSQRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is equal to the expected value."},"Functions.html#/s:6Nimble5equalyAA9PredicateVySayxSgGGAFSQRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher allowing comparison of collection with optional type

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyxGxSgSQRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual value is equal to the expected value."},"Functions.html#/s:6Nimble5equalyAA9PredicateVyShyxGGAESHRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual set is equal to the expected set.

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyShyxGGAESgSHRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual set is equal to the expected set.

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyShyxGGAESLRzSHRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual set is equal to the expected set.

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVyShyxGGAESgSLRzSHRzlF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual set is equal to the expected set.

"},"Functions.html#/s:6Nimble5equalyAA9PredicateVySDyxq_GGSDyxq_SgGSHRzSQR_r0_lF":{"name":"equal(_:)","abstract":"

A Nimble matcher that succeeds when the actual dictionary is equal to the expected dictionary

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyxG_xtSQRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyxG_xSgtSQRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyxG_xtSQRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyxG_xSgtSQRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVySayxGG_AESgtSQRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVySayxGG_AESgtSQRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyShyxGG_AEtSHRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyShyxGG_AESgtSHRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyShyxGG_AEtSHRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyShyxGG_AESgtSHRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyShyxGG_AEtSLRzSHRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVyShyxGG_AESgtSLRzSHRzlF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyShyxGG_AEtSLRzSHRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVyShyxGG_AESgtSLRzSHRzlF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2eeoiyyAA11ExpectationVySDyxq_GG_AESgtSHRzSQR_r0_lF":{"name":"==(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble2neoiyyAA11ExpectationVySDyxq_GG_AESgtSHRzSQR_r0_lF":{"name":"!=(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble9haveCountyAA9PredicateVyxGSiSlRzlF":{"name":"haveCount(_:)","abstract":"

A Nimble matcher that succeeds when the actual Collection’s count equals"},"Functions.html#/s:6Nimble9haveCountyAA9PredicateVyAA13NMBCollection_pGSiF":{"name":"haveCount(_:)","abstract":"

A Nimble matcher that succeeds when the actual collection’s count equals"},"Functions.html#/s:6Nimble5matchyAA9PredicateVySSGSSSgF":{"name":"match(_:)","abstract":"

A Nimble matcher that succeeds when the actual string satisfies the regular expression"},"Functions.html#/s:6Nimble10matchErroryAA9PredicateVys0C0_pGxsAERzlF":{"name":"matchError(_:)","abstract":"

A Nimble matcher that succeeds when the actual expression evaluates to an"},"Functions.html#/s:6Nimble10matchErroryAA9PredicateVys0C0_pGxSQRzsAERzlF":{"name":"matchError(_:)","abstract":"

A Nimble matcher that succeeds when the actual expression evaluates to an"},"Functions.html#/s:6Nimble10matchErroryAA9PredicateVys0C0_pGxmsAERzlF":{"name":"matchError(_:)","abstract":"

A Nimble matcher that succeeds when the actual expression evaluates to an"},"Functions.html#/s:6Nimble17postNotifications_4fromAA9PredicateVyxGAEySay10Foundation12NotificationVGG_So20NSNotificationCenterCtlF":{"name":"postNotifications(_:from:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble28postDistributedNotifications_4from5namesAA9PredicateVyxGAFySay10Foundation12NotificationVGG_So013NSDistributedI6CenterCShySo18NSNotificationNameaGtlF":{"name":"postDistributedNotifications(_:from:names:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble14raiseException5named6reason8userInfo7closureAA9PredicateVyxGSo15NSExceptionNameaSg_SSSgSo12NSDictionaryCSgySo0J0CcSgtlF":{"name":"raiseException(named:reason:userInfo:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression raises an"},"Functions.html#/s:6Nimble14raiseException5named6reason8userInfo7closureAA9PredicateVyxGSSSg_AJSo12NSDictionaryCSgySo11NSExceptionCcSgtlF":{"name":"raiseException(named:reason:userInfo:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression raises an"},"Functions.html#/s:6Nimble12satisfyAllOfyAA9PredicateVyxGAEd_tlF":{"name":"satisfyAllOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value matches with all of the matchers"},"Functions.html#/s:6Nimble12satisfyAllOfyAA9PredicateVyxGSayAEGlF":{"name":"satisfyAllOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value matches with all of the matchers"},"Functions.html#/s:6Nimble2aaoiyAA9PredicateVyxGAE_AEtlF":{"name":"&&(_:_:)","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble12satisfyAnyOfyAA9PredicateVyxGAEd_tlF":{"name":"satisfyAnyOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value matches with any of the matchers"},"Functions.html#/s:6Nimble12satisfyAnyOfyAA9PredicateVyxGSayAEGlF":{"name":"satisfyAnyOf(_:)","abstract":"

A Nimble matcher that succeeds when the actual value matches with any of the matchers"},"Functions.html#/s:6Nimble2oooiyAA9PredicateVyxGAE_AEtlF":{"name":"||(_:_:)","abstract":"

Undocumented

"},"Functions.html#/catchBadInstruction(block:)":{"name":"catchBadInstruction(block:)","abstract":"

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."},"Functions.html#/s:6Nimble14throwAssertionAA9PredicateVyxGylF":{"name":"throwAssertion()","abstract":"

Undocumented

"},"Functions.html#/s:6Nimble10throwErrorAA9PredicateVyxGylF":{"name":"throwError()","abstract":"

A Nimble matcher that succeeds when the actual expression throws an"},"Functions.html#/s:6Nimble10throwError_7closureAA9PredicateVyq_Gx_ys0C0_pcSgtsAGRzr0_lF":{"name":"throwError(_:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws an"},"Functions.html#/s:6Nimble10throwError_7closureAA9PredicateVyq_Gx_yxcSgtSQRzs0C0Rzr0_lF":{"name":"throwError(_:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws an"},"Functions.html#/s:6Nimble10throwError9errorType7closureAA9PredicateVyq_Gxm_yxcSgts0C0Rzr0_lF":{"name":"throwError(errorType:closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws an"},"Functions.html#/s:6Nimble10throwError7closureAA9PredicateVyxGys0C0_pc_tlF":{"name":"throwError(closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws any"},"Functions.html#/s:6Nimble10throwError7closureAA9PredicateVyq_Gyxc_ts0C0Rzr0_lF":{"name":"throwError(closure:)","abstract":"

A Nimble matcher that succeeds when the actual expression throws any"},"Functions.html#/s:6Nimble7succeedAA9PredicateVyAA15ToSucceedResultOGyF":{"name":"succeed()","abstract":"

A Nimble matcher that takes in a closure for validation.

"},"Functions.html#/s:6Nimble9stringifyySSxSglF":{"name":"stringify(_:)","abstract":"

Returns a string appropriate for displaying in test output"},"Functions.html#/s:6Nimble20prettyCollectionTypeySSxlF":{"name":"prettyCollectionType(_:)","abstract":"

Attempts to generate a pretty type string for a given value. If the value is of a Objective-C"},"Functions.html#/s:6Nimble20prettyCollectionTypeySSxSlRzlF":{"name":"prettyCollectionType(_:)","abstract":"

Returns the type name for a given collection type. This overload is used by Swift"},"Extensions/Data.html#/s:10Foundation4DataV6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Data"},"Extensions/String.html#/s:SS6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"String"},"Extensions/AnySequence.html#/s:s11AnySequenceV6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"AnySequence"},"Extensions/Array.html#/s:Sa6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Array"},"Extensions/NSString.html#/c:@CM@Nimble@@objc(cs)NSString(im)NMB_compare:":{"name":"NMB_compare(_:)","abstract":"

Undocumented

","parent_name":"NSString"},"Extensions/NSDate.html#/s:So6NSDateC6NimbleE11doubleValueSdvp":{"name":"doubleValue","abstract":"

Undocumented

","parent_name":"NSDate"},"Extensions/NSDate.html#/s:So6NSDateC6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"NSDate"},"Extensions/Date.html#/s:10Foundation4DateV6NimbleE11doubleValueSdvp":{"name":"doubleValue","abstract":"

Undocumented

","parent_name":"Date"},"Extensions/Date.html#/s:10Foundation4DateV6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Date"},"Extensions/NSNumber.html#/c:@CM@Nimble@@objc(cs)NSNumber(im)NMB_compare:":{"name":"NMB_compare(_:)","abstract":"

Undocumented

","parent_name":"NSNumber"},"Extensions/NSNumber.html#/s:So8NSNumberC6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"NSNumber"},"Extensions/NSIndexSet.html#/s:So10NSIndexSetC6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"NSIndexSet"},"Extensions/NSArray.html#/s:So7NSArrayC6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"NSArray"},"Extensions/UInt.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt"},"Extensions/Int.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int"},"Extensions/Double.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Double"},"Extensions/Double.html#/s:Sd6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Double"},"Extensions/Float.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Float"},"Extensions/Float.html#/s:Sf6NimbleE15testDescriptionSSvp":{"name":"testDescription","abstract":"

Undocumented

","parent_name":"Float"},"Extensions/UInt64.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt64"},"Extensions/Int64.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int64"},"Extensions/UInt32.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt32"},"Extensions/Int32.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int32"},"Extensions/UInt16.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt16"},"Extensions/Int16.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int16"},"Extensions/UInt8.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"UInt8"},"Extensions/Int8.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"Int8"},"Extensions/NSException.html#/s:So11NSExceptionC6NimbleE14catchException2inABXDSgyyc_tFZ":{"name":"catchException(in:)","abstract":"

Undocumented

","parent_name":"NSException"},"Extensions/NSException.html":{"name":"NSException"},"Extensions/Int8.html":{"name":"Int8"},"Extensions/UInt8.html":{"name":"UInt8"},"Extensions/Int16.html":{"name":"Int16"},"Extensions/UInt16.html":{"name":"UInt16"},"Extensions/Int32.html":{"name":"Int32"},"Extensions/UInt32.html":{"name":"UInt32"},"Extensions/Int64.html":{"name":"Int64"},"Extensions/UInt64.html":{"name":"UInt64"},"Extensions/Float.html":{"name":"Float"},"Extensions/Double.html":{"name":"Double"},"Extensions/Int.html":{"name":"Int"},"Extensions/UInt.html":{"name":"UInt"},"Extensions/NSArray.html":{"name":"NSArray"},"Extensions.html#/c:objc(cs)NSSet":{"name":"NSSet"},"Extensions.html#/c:objc(cs)NSHashTable":{"name":"NSHashTable"},"Extensions.html#/c:objc(cs)NSMapTable":{"name":"NSMapTable"},"Extensions/NSIndexSet.html":{"name":"NSIndexSet"},"Extensions.html#/c:objc(cs)NSDictionary":{"name":"NSDictionary"},"Extensions/NSNumber.html":{"name":"NSNumber"},"Extensions/Date.html":{"name":"Date"},"Extensions/NSDate.html":{"name":"NSDate"},"Extensions/NSString.html":{"name":"NSString"},"Extensions/Array.html":{"name":"Array"},"Extensions/AnySequence.html":{"name":"AnySequence"},"Extensions/String.html":{"name":"String"},"Extensions/Data.html":{"name":"Data"},"Enums/ToSucceedResult.html#/s:6Nimble15ToSucceedResultO9succeededyA2CmF":{"name":"succeeded","abstract":"

Undocumented

","parent_name":"ToSucceedResult"},"Enums/ToSucceedResult.html#/s:6Nimble15ToSucceedResultO6failedyACSS_tcACmF":{"name":"failed(reason:)","abstract":"

Undocumented

","parent_name":"ToSucceedResult"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO7matchesyA2CmF":{"name":"matches","abstract":"

Matches indicates if the predicate / matcher passes with the given value

","parent_name":"PredicateStatus"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO12doesNotMatchyA2CmF":{"name":"doesNotMatch","abstract":"

DoesNotMatch indicates if the predicate / matcher fails with the given value, but would","parent_name":"PredicateStatus"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO4failyA2CmF":{"name":"fail","abstract":"

Fail indicates the predicate will never satisfy with the given value in any case.","parent_name":"PredicateStatus"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO4boolACSb_tcfc":{"name":"init(bool:)","abstract":"

Converts a boolean to either .matches (if true) or .doesNotMatch (if false).

","parent_name":"PredicateStatus"},"Enums/PredicateStatus.html#/s:6Nimble15PredicateStatusO12toObjectiveCAA012NMBPredicateC0CyF":{"name":"toObjectiveC()","abstract":"

Undocumented

","parent_name":"PredicateStatus"},"Enums/ExpectationStyle.html#/s:6Nimble16ExpectationStyleO7toMatchyA2CmF":{"name":"toMatch","abstract":"

Undocumented

","parent_name":"ExpectationStyle"},"Enums/ExpectationStyle.html#/s:6Nimble16ExpectationStyleO10toNotMatchyA2CmF":{"name":"toNotMatch","abstract":"

Undocumented

","parent_name":"ExpectationStyle"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO21expectedActualValueToyACSScACmF":{"name":"expectedActualValueTo(_:)","abstract":"

includes actual value in output (“expected to , got ”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO21expectedCustomValueToyACSS_SStcACmF":{"name":"expectedCustomValueTo(_:actual:)","abstract":"

uses a custom actual value string in output (“expected to , got ”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO10expectedToyACSScACmF":{"name":"expectedTo(_:)","abstract":"

excludes actual value in output (“expected to ”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO4failyACSScACmF":{"name":"fail(_:)","abstract":"

allows any free-form message (“”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO8prependsyACSS_ACtcACmF":{"name":"prepends(_:_:)","abstract":"

Not Fully Implemented Yet.

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO7appendsyA2C_SStcACmF":{"name":"appends(_:_:)","abstract":"

appends after an existing message (“ (use beNil() to match nils)”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO7detailsyA2C_SStcACmF":{"name":"details(_:_:)","abstract":"

provides long-form multi-line explainations (“\\n\\n”)

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO08expectedC0SSvp":{"name":"expectedMessage","abstract":"

Returns the smallest message after the “expected to” string that summarizes the error.

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO8appended7messageACSS_tF":{"name":"appended(message:)","abstract":"

Appends a message after the primary expectation message

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO17appendedBeNilHintACyF":{"name":"appendedBeNilHint()","abstract":"

Appends a message hinting to use beNil() for when the actual value given was nil.

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO8appended7detailsACSS_tF":{"name":"appended(details:)","abstract":"

Appends a detailed (aka - multiline) message after the primary expectation message","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO08replacedB0yA3CcF":{"name":"replacedExpectation(_:)","abstract":"

Replaces a primary expectation with one returned by f. Preserves all composite expectations","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO07wrappedB06before5afterACSS_SStF":{"name":"wrappedExpectation(before:after:)","abstract":"

Wraps a primary expectation with text before and after it.","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO9prepended11expectationACSS_tF":{"name":"prepended(expectation:)","abstract":"

Prepends a message by modifying the primary expectation

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html#/s:6Nimble18ExpectationMessageO8toString6actual8expected0D0S2S_S2StF":{"name":"toString(actual:expected:to:)","abstract":"

Converts the tree of ExpectationMessages into a final built string.

","parent_name":"ExpectationMessage"},"Enums/ExpectationMessage.html":{"name":"ExpectationMessage","abstract":"

Undocumented

"},"Enums/ExpectationStyle.html":{"name":"ExpectationStyle","abstract":"

Undocumented

"},"Enums/PredicateStatus.html":{"name":"PredicateStatus","abstract":"

PredicateStatus is a trinary that indicates if a Predicate matches a given value or not

"},"Enums/ToSucceedResult.html":{"name":"ToSucceedResult","abstract":"

Used by the succeed matcher.

"},"Global%20Variables.html#/s:6Nimble23MACH_MSG_TYPE_MAKE_SENDs6UInt32Vvp":{"name":"MACH_MSG_TYPE_MAKE_SEND","abstract":"

Undocumented

"},"Global%20Variables.html#/nativeThreadState":{"name":"nativeThreadState"},"Global%20Variables.html#/nativeThreadStateCount":{"name":"nativeThreadStateCount"},"Global%20Variables.html#/nativeMachExceptionMask":{"name":"nativeMachExceptionMask"},"Global%20Variables.html#/s:6Nimble17nativeThreadStates5Int32Vvp":{"name":"nativeThreadState","abstract":"

Undocumented

"},"Global%20Variables.html#/s:6Nimble22nativeThreadStateCounts6UInt32Vvp":{"name":"nativeThreadStateCount","abstract":"

Undocumented

"},"Global%20Variables.html#/s:6Nimble23nativeMachExceptionMasks6UInt32Vvp":{"name":"nativeMachExceptionMask","abstract":"

Undocumented

"},"Global%20Variables.html#/s:6Nimble15EXC_TYPES_COUNTSivp":{"name":"EXC_TYPES_COUNT","abstract":"

Undocumented

"},"Global%20Variables.html#/s:6Nimble0A16AssertionHandlerAA0bC0_pvp":{"name":"NimbleAssertionHandler","abstract":"

Global backing interface for assertions that Nimble creates."},"Global%20Variables.html#/s:6Nimble12DefaultDeltaSdvp":{"name":"DefaultDelta","abstract":"

Undocumented

"},"Classes/NMBStringer.html#/c:@M@Nimble@objc(cs)NMBStringer(cm)stringify:":{"name":"stringify(_:)","abstract":"

Undocumented

","parent_name":"NMBStringer"},"Classes/SourceLocation.html#/s:6Nimble14SourceLocationC4fileSSvp":{"name":"file","abstract":"

Undocumented

","parent_name":"SourceLocation"},"Classes/SourceLocation.html#/s:6Nimble14SourceLocationC4lineSuvp":{"name":"line","abstract":"

Undocumented

","parent_name":"SourceLocation"},"Classes/SourceLocation.html#/c:@M@Nimble@objc(cs)SourceLocation(py)description":{"name":"description","abstract":"

Undocumented

","parent_name":"SourceLocation"},"Classes/NMBObjCRaiseExceptionPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCRaiseExceptionPredicate(py)named":{"name":"named","abstract":"

Undocumented

","parent_name":"NMBObjCRaiseExceptionPredicate"},"Classes/NMBObjCRaiseExceptionPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCRaiseExceptionPredicate(py)reason":{"name":"reason","abstract":"

Undocumented

","parent_name":"NMBObjCRaiseExceptionPredicate"},"Classes/NMBObjCRaiseExceptionPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCRaiseExceptionPredicate(py)userInfo":{"name":"userInfo","abstract":"

Undocumented

","parent_name":"NMBObjCRaiseExceptionPredicate"},"Classes/NMBObjCRaiseExceptionPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCRaiseExceptionPredicate(py)satisfyingBlock":{"name":"satisfyingBlock","abstract":"

Undocumented

","parent_name":"NMBObjCRaiseExceptionPredicate"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC7matchesACvpZ":{"name":"matches","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC12doesNotMatchACvpZ":{"name":"doesNotMatch","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC4failACvpZ":{"name":"fail","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/c:@M@Nimble@objc(cs)NMBPredicateStatus(py)hash":{"name":"hash","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/c:@M@Nimble@objc(cs)NMBPredicateStatus(im)isEqual:":{"name":"isEqual(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC4from6statusAcA09PredicateC0O_tFZ":{"name":"from(status:)","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC4from4boolACSb_tFZ":{"name":"from(bool:)","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateStatus.html#/s:6Nimble18NMBPredicateStatusC7toSwiftAA09PredicateC0OyF":{"name":"toSwift()","abstract":"

Undocumented

","parent_name":"NMBPredicateStatus"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC6statusAA0B6StatusCvp":{"name":"status","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC7messageAA21NMBExpectationMessageCvp":{"name":"message","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC6status7messageAcA0B6StatusC_AA21NMBExpectationMessageCtcfc":{"name":"init(status:message:)","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC4bool7messageACSb_AA21NMBExpectationMessageCtcfc":{"name":"init(bool:message:)","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBPredicateResult.html#/s:6Nimble18NMBPredicateResultC7toSwiftAA09PredicateC0VyF":{"name":"toSwift()","abstract":"

Undocumented

","parent_name":"NMBPredicateResult"},"Classes/NMBObjCBeCloseToPredicate.html#/c:@M@Nimble@objc(cs)NMBObjCBeCloseToPredicate(py)within":{"name":"within","abstract":"

Undocumented

","parent_name":"NMBObjCBeCloseToPredicate"},"Classes/NMBPredicate.html#/s:6Nimble12NMBPredicateC9predicateAcA0B6ResultCAA10ExpressionVySo8NSObjectCGKc_tcfc":{"name":"init(predicate:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)allPassMatcher:":{"name":"allPassMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beAKindOfMatcher:":{"name":"beAKindOfMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beAnInstanceOfMatcher:":{"name":"beAnInstanceOfMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beCloseToMatcher:within:":{"name":"beCloseToMatcher(_:within:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beEmptyMatcher":{"name":"beEmptyMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beGreaterThanMatcher:":{"name":"beGreaterThanMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beGreaterThanOrEqualToMatcher:":{"name":"beGreaterThanOrEqualToMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beIdenticalToMatcher:":{"name":"beIdenticalToMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beLessThanMatcher:":{"name":"beLessThanMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beLessThanOrEqualToMatcher:":{"name":"beLessThanOrEqualToMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beTruthyMatcher":{"name":"beTruthyMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beFalsyMatcher":{"name":"beFalsyMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beTrueMatcher":{"name":"beTrueMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beFalseMatcher":{"name":"beFalseMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beNilMatcher":{"name":"beNilMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)beginWithMatcher:":{"name":"beginWithMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)containMatcher:":{"name":"containMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)containElementSatisfyingMatcher:":{"name":"containElementSatisfyingMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)endWithMatcher:":{"name":"endWithMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)equalMatcher:":{"name":"equalMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)haveCountMatcher:":{"name":"haveCountMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)matchMatcher:":{"name":"matchMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)raiseExceptionMatcher":{"name":"raiseExceptionMatcher()","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)satisfyAllOfMatcher:":{"name":"satisfyAllOfMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/NMBPredicate.html#/c:@CM@Nimble@objc(cs)NMBPredicate(cm)satisfyAnyOfMatcher:":{"name":"satisfyAnyOfMatcher(_:)","abstract":"

Undocumented

","parent_name":"NMBPredicate"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC8expectedSSvp":{"name":"expected","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC11actualValueSSSgvp":{"name":"actualValue","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC2toSSvp":{"name":"to","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC07postfixC0SSvp":{"name":"postfixMessage","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC13postfixActualSSvp":{"name":"postfixActual","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC08extendedC0SSSgvp":{"name":"extendedMessage","abstract":"

An optional message that will be appended as a new line and provides additional details","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC15userDescriptionSSSgvp":{"name":"userDescription","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC11stringValueSSvp":{"name":"stringValue","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/c:@M@Nimble@objc(cs)FailureMessage(im)init":{"name":"init()","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/FailureMessage.html#/s:6Nimble14FailureMessageC11stringValueACSS_tcfc":{"name":"init(stringValue:)","abstract":"

Undocumented

","parent_name":"FailureMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC10expectedToACSS_tcfc":{"name":"init(expectedTo:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC21expectedActualValueToACSS_tcfc":{"name":"init(expectedActualValueTo:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC21expectedActualValueTo06customeF0ACSS_SStcfc":{"name":"init(expectedActualValueTo:customActualValue:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC4failACSS_tcfc":{"name":"init(fail:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC7prepend5childACSS_ACtcfc":{"name":"init(prepend:child:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC08appendedC05childACSS_ACtcfc":{"name":"init(appendedMessage:child:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC09prependedC05childACSS_ACtcfc":{"name":"init(prependedMessage:child:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC7details5childACSS_ACtcfc":{"name":"init(details:child:)","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC17appendedBeNilHintACyF":{"name":"appendedBeNilHint()","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NMBExpectationMessage.html#/s:6Nimble21NMBExpectationMessageC7toSwiftAA011ExpectationC0OyF":{"name":"toSwift()","abstract":"

Undocumented

","parent_name":"NMBExpectationMessage"},"Classes/NimbleShortXCTestHandler.html#/s:6Nimble0A18ShortXCTestHandlerC6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"NimbleShortXCTestHandler"},"Classes/NimbleXCTestHandler.html#/s:6Nimble0A13XCTestHandlerC6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"NimbleXCTestHandler"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(im)initWithActualBlock:negative:file:line:":{"name":"init(actualBlock:negative:file:line:)","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)withTimeout":{"name":"withTimeout","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)to":{"name":"to","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toWithDescription":{"name":"toWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNot":{"name":"toNot","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNotWithDescription":{"name":"toNotWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)notTo":{"name":"notTo","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)notToWithDescription":{"name":"notToWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toEventually":{"name":"toEventually","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toEventuallyWithDescription":{"name":"toEventuallyWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toEventuallyNot":{"name":"toEventuallyNot","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toEventuallyNotWithDescription":{"name":"toEventuallyNotWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNotEventually":{"name":"toNotEventually","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNotEventuallyWithDescription":{"name":"toNotEventuallyWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNever":{"name":"toNever","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toNeverWithDescription":{"name":"toNeverWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)neverTo":{"name":"neverTo","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)neverToWithDescription":{"name":"neverToWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toAlways":{"name":"toAlways","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)toAlwaysWithDescription":{"name":"toAlwaysWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)alwaysTo":{"name":"alwaysTo","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(py)alwaysToWithDescription":{"name":"alwaysToWithDescription","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/NMBExpectation.html#/c:@M@Nimble@objc(cs)NMBExpectation(cm)failWithMessage:file:line:":{"name":"failWithMessage(_:file:line:)","abstract":"

Undocumented

","parent_name":"NMBExpectation"},"Classes/AssertionRecorder.html#/s:6Nimble17AssertionRecorderC10assertionsSayAA0B6RecordVGvp":{"name":"assertions","abstract":"

All the assertions that were captured by this recorder

","parent_name":"AssertionRecorder"},"Classes/AssertionRecorder.html#/s:6Nimble17AssertionRecorderCACycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"AssertionRecorder"},"Classes/AssertionRecorder.html#/s:6Nimble17AssertionRecorderC6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"AssertionRecorder"},"Classes/AssertionDispatcher.html#/s:6Nimble19AssertionDispatcherC8handlersACSayAA0B7Handler_pG_tcfc":{"name":"init(handlers:)","abstract":"

Undocumented

","parent_name":"AssertionDispatcher"},"Classes/AssertionDispatcher.html#/s:6Nimble19AssertionDispatcherC6assert_7message8locationySb_AA14FailureMessageCAA14SourceLocationCtF":{"name":"assert(_:message:location:)","abstract":"

Undocumented

","parent_name":"AssertionDispatcher"},"Classes/BadInstructionException.html#/c:@M@Nimble@objc(cs)BadInstructionException(im)initWithCoder:":{"name":"init(coder:)","abstract":"

Undocumented

","parent_name":"BadInstructionException"},"Classes/BadInstructionException.html#/c:@M@Nimble@objc(cs)BadInstructionException(cm)receiveReply:":{"name":"receiveReply(_:)","abstract":"

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.

","parent_name":"BadInstructionException"},"Classes/BadInstructionException.html":{"name":"BadInstructionException","abstract":"

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.

"},"Classes/AssertionDispatcher.html":{"name":"AssertionDispatcher","abstract":"

AssertionDispatcher allows multiple AssertionHandlers to receive"},"Classes/AssertionRecorder.html":{"name":"AssertionRecorder","abstract":"

An AssertionHandler that silently records assertions that Nimble makes."},"Classes/NMBExpectation.html":{"name":"NMBExpectation","abstract":"

Undocumented

"},"Classes/NimbleXCTestHandler.html":{"name":"NimbleXCTestHandler","abstract":"

Default handler for Nimble. This assertion handler passes failures along to"},"Classes/NimbleShortXCTestHandler.html":{"name":"NimbleShortXCTestHandler","abstract":"

Alternative handler for Nimble. This assertion handler passes failures along"},"Classes/NMBExpectationMessage.html":{"name":"NMBExpectationMessage","abstract":"

Undocumented

"},"Classes/FailureMessage.html":{"name":"FailureMessage","abstract":"

Encapsulates the failure message that matchers can report to the end user.

"},"Classes/NMBPredicate.html":{"name":"NMBPredicate","abstract":"

Undocumented

"},"Classes/NMBObjCBeCloseToPredicate.html":{"name":"NMBObjCBeCloseToPredicate","abstract":"

Undocumented

"},"Classes/NMBPredicateResult.html":{"name":"NMBPredicateResult","abstract":"

Undocumented

"},"Classes/NMBPredicateStatus.html":{"name":"NMBPredicateStatus","abstract":"

Undocumented

"},"Classes/NMBObjCRaiseExceptionPredicate.html":{"name":"NMBObjCRaiseExceptionPredicate","abstract":"

Undocumented

"},"Classes.html#/BadInstructionException":{"name":"BadInstructionException","abstract":"

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.

"},"Classes/SourceLocation.html":{"name":"SourceLocation","abstract":"

Undocumented

"},"Classes/NMBStringer.html":{"name":"NMBStringer","abstract":"

Undocumented

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Global%20Variables.html":{"name":"Global Variables","abstract":"

The following global variables are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Functions.html":{"name":"Functions","abstract":"

The following functions are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"},"Typealiases.html":{"name":"Type Aliases","abstract":"

The following type aliases are available globally.

"}} \ No newline at end of file diff --git a/docs/undocumented.json b/docs/undocumented.json new file mode 100644 index 000000000..41c6a004e --- /dev/null +++ b/docs/undocumented.json @@ -0,0 +1,1783 @@ +{ + "warnings": [ + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift", + "line": 32, + "symbol": "NSException.catchException(in:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift", + "line": 42, + "symbol": "BadInstructionException.init(coder:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 31, + "symbol": "MACH_MSG_TYPE_MAKE_SEND", + "symbol_kind": "source.lang.swift.decl.var.global", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 32, + "symbol": "MACH_MSGH_BITS_REMOTE(_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 33, + "symbol": "MACH_MSGH_BITS(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 49, + "symbol": "nativeThreadState", + "symbol_kind": "source.lang.swift.decl.var.global", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 50, + "symbol": "nativeThreadStateCount", + "symbol_kind": "source.lang.swift.decl.var.global", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 52, + "symbol": "nativeMachExceptionMask", + "symbol_kind": "source.lang.swift.decl.var.global", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 55, + "symbol": "EXC_TYPES_COUNT", + "symbol_kind": "source.lang.swift.decl.var.global", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 56, + "symbol": "execTypesCountTuple", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 59, + "symbol": "execTypesCountTuple.value", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", + "line": 60, + "symbol": "execTypesCountTuple.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift", + "line": 3, + "symbol": "AssertionHandler.assert(_:message:location:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift", + "line": 10, + "symbol": "AssertionDispatcher.init(handlers:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/AssertionDispatcher.swift", + "line": 14, + "symbol": "AssertionDispatcher.assert(_:message:location:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift", + "line": 27, + "symbol": "AssertionRecorder.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift", + "line": 29, + "symbol": "AssertionRecorder.assert(_:message:location:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 17, + "symbol": "NMBExpectation", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 24, + "symbol": "NMBExpectation.init(actualBlock:negative:file:line:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 35, + "symbol": "NMBExpectation.withTimeout", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 41, + "symbol": "NMBExpectation.to", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 48, + "symbol": "NMBExpectation.toWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 55, + "symbol": "NMBExpectation.toNot", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 62, + "symbol": "NMBExpectation.toNotWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 69, + "symbol": "NMBExpectation.notTo", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 71, + "symbol": "NMBExpectation.notToWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 73, + "symbol": "NMBExpectation.toEventually", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 83, + "symbol": "NMBExpectation.toEventuallyWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 93, + "symbol": "NMBExpectation.toEventuallyNot", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 103, + "symbol": "NMBExpectation.toEventuallyNotWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 113, + "symbol": "NMBExpectation.toNotEventually", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 117, + "symbol": "NMBExpectation.toNotEventuallyWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 121, + "symbol": "NMBExpectation.toNever", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 131, + "symbol": "NMBExpectation.toNeverWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 141, + "symbol": "NMBExpectation.neverTo", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 145, + "symbol": "NMBExpectation.neverToWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 149, + "symbol": "NMBExpectation.toAlways", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 159, + "symbol": "NMBExpectation.toAlwaysWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 169, + "symbol": "NMBExpectation.alwaysTo", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 173, + "symbol": "NMBExpectation.alwaysToWithDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift", + "line": 177, + "symbol": "NMBExpectation.failWithMessage(_:file:line:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift", + "line": 7, + "symbol": "NimbleXCTestHandler.assert(_:message:location:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift", + "line": 17, + "symbol": "NimbleShortXCTestHandler.assert(_:message:location:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift", + "line": 75, + "symbol": "recordFailure(_:location:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 9, + "symbol": "Expectation", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 18, + "symbol": "Expectation", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 21, + "symbol": "Expectation", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 36, + "symbol": "Expectation", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 38, + "symbol": "Expectation.expression", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 40, + "symbol": "Expectation.init(expression:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 44, + "symbol": "Expectation.verify(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 86, + "symbol": "Expectation", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 126, + "symbol": "Expectation", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 133, + "symbol": "Expectation", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expectation.swift", + "line": 149, + "symbol": "Expectation", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 1, + "symbol": "ExpectationMessage", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 207, + "symbol": "NMBExpectationMessage", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 214, + "symbol": "NMBExpectationMessage.init(expectedTo:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 217, + "symbol": "NMBExpectationMessage.init(expectedActualValueTo:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 221, + "symbol": "NMBExpectationMessage.init(expectedActualValueTo:customActualValue:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 225, + "symbol": "NMBExpectationMessage.init(fail:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 229, + "symbol": "NMBExpectationMessage.init(prepend:child:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 233, + "symbol": "NMBExpectationMessage.init(appendedMessage:child:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 237, + "symbol": "NMBExpectationMessage.init(prependedMessage:child:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 241, + "symbol": "NMBExpectationMessage.init(details:child:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 245, + "symbol": "NMBExpectationMessage.appendedBeNilHint()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/ExpectationMessage.swift", + "line": 249, + "symbol": "NMBExpectationMessage.toSwift()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expression.swift", + "line": 27, + "symbol": "Expression.location", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expression.swift", + "line": 28, + "symbol": "Expression.isClosure", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expression.swift", + "line": 85, + "symbol": "Expression.evaluate()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Expression.swift", + "line": 89, + "symbol": "Expression.withoutCaching()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/FailureMessage.swift", + "line": 7, + "symbol": "FailureMessage.expected", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/FailureMessage.swift", + "line": 8, + "symbol": "FailureMessage.actualValue", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/FailureMessage.swift", + "line": 9, + "symbol": "FailureMessage.to", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/FailureMessage.swift", + "line": 10, + "symbol": "FailureMessage.postfixMessage", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/FailureMessage.swift", + "line": 11, + "symbol": "FailureMessage.postfixActual", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/FailureMessage.swift", + "line": 16, + "symbol": "FailureMessage.userDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/FailureMessage.swift", + "line": 18, + "symbol": "FailureMessage.stringValue", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/FailureMessage.swift", + "line": 36, + "symbol": "FailureMessage.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/FailureMessage.swift", + "line": 39, + "symbol": "FailureMessage.init(stringValue:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/AllPass.swift", + "line": 1, + "symbol": "allPass(_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/AllPass.swift", + "line": 13, + "symbol": "allPass(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/AllPass.swift", + "line": 26, + "symbol": "allPass(_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/AllPass.swift", + "line": 72, + "symbol": "NMBPredicate.allPassMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Async.swift", + "line": 9, + "symbol": "AsyncDefaults.timeout", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Async.swift", + "line": 10, + "symbol": "AsyncDefaults.pollInterval", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift", + "line": 60, + "symbol": "NMBPredicate.beAKindOfMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift", + "line": 50, + "symbol": "NMBPredicate.beAnInstanceOfMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 4, + "symbol": "DefaultDelta", + "symbol_kind": "source.lang.swift.decl.var.global", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 6, + "symbol": "defaultDelta()", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 70, + "symbol": "NMBObjCBeCloseToPredicate", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 84, + "symbol": "NMBObjCBeCloseToPredicate.within", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 93, + "symbol": "NMBPredicate.beCloseToMatcher(_:within:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 99, + "symbol": "beCloseTo(_:within:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 128, + "symbol": "Expectation.≈(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 135, + "symbol": "Expectation.≈(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 140, + "symbol": "Expectation.≈(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 144, + "symbol": "Expectation.==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 151, + "symbol": "Expectation.≈(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 156, + "symbol": "Expectation.≈(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 160, + "symbol": "Expectation.==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 173, + "symbol": "±(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift", + "line": 177, + "symbol": "±(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeEmpty.swift", + "line": 82, + "symbol": "NMBPredicate.beEmptyMatcher()", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift", + "line": 11, + "symbol": ">(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift", + "line": 29, + "symbol": ">(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift", + "line": 34, + "symbol": "NMBPredicate.beGreaterThanMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift", + "line": 12, + "symbol": ">=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift", + "line": 30, + "symbol": ">=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift", + "line": 35, + "symbol": "NMBPredicate.beGreaterThanOrEqualToMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift", + "line": 19, + "symbol": "Expectation.===(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift", + "line": 23, + "symbol": "Expectation.!==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift", + "line": 40, + "symbol": "NMBPredicate.beIdenticalToMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLessThan.swift", + "line": 11, + "symbol": "<(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLessThan.swift", + "line": 28, + "symbol": "<(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLessThan.swift", + "line": 33, + "symbol": "NMBPredicate.beLessThanMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift", + "line": 11, + "symbol": "<=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift", + "line": 28, + "symbol": "<=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift", + "line": 33, + "symbol": "NMBPredicate.beLessThanOrEqualToMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLogical.swift", + "line": 117, + "symbol": "NMBPredicate.beTruthyMatcher()", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLogical.swift", + "line": 124, + "symbol": "NMBPredicate.beFalsyMatcher()", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLogical.swift", + "line": 131, + "symbol": "NMBPredicate.beTrueMatcher()", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeLogical.swift", + "line": 138, + "symbol": "NMBPredicate.beFalseMatcher()", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeNil.swift", + "line": 27, + "symbol": "Expectation.==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeNil.swift", + "line": 31, + "symbol": "Expectation.!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeNil.swift", + "line": 40, + "symbol": "NMBPredicate.beNilMatcher()", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeVoid.swift", + "line": 10, + "symbol": "Expectation.==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeVoid.swift", + "line": 14, + "symbol": "Expectation.!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/BeginWith.swift", + "line": 43, + "symbol": "NMBPredicate.beginWithMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Contain.swift", + "line": 61, + "symbol": "contain(_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Contain.swift", + "line": 79, + "symbol": "contain(_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Contain.swift", + "line": 94, + "symbol": "contain(_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Contain.swift", + "line": 107, + "symbol": "NMBPredicate.containMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift", + "line": 1, + "symbol": "containElementSatisfying(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift", + "line": 32, + "symbol": "NMBPredicate.containElementSatisfyingMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/EndWith.swift", + "line": 53, + "symbol": "NMBPredicate.endWithMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 13, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 20, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 38, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 45, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 63, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 70, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 88, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 95, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 113, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal+Tuple.swift", + "line": 120, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 134, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 138, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 142, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 146, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 150, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 154, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 158, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 162, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 166, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 170, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 174, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 178, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 182, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 186, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 190, + "symbol": "==(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 194, + "symbol": "!=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Equal.swift", + "line": 202, + "symbol": "NMBPredicate.equalMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/HaveCount.swift", + "line": 50, + "symbol": "NMBPredicate.haveCountMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Match.swift", + "line": 16, + "symbol": "NMBPredicate.matchMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 9, + "symbol": "NMBContainer.contains(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 23, + "symbol": "NMBCollection.count", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 37, + "symbol": "NMBOrderedCollection.object(at:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 42, + "symbol": "NMBDoubleConvertible", + "symbol_kind": "source.lang.swift.decl.protocol", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 43, + "symbol": "NMBDoubleConvertible.doubleValue", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 60, + "symbol": "Date.doubleValue", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 66, + "symbol": "NSDate.doubleValue", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 73, + "symbol": "Date.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 79, + "symbol": "NSDate.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 91, + "symbol": "NMBComparable.NMB_compare(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 95, + "symbol": "NSNumber.NMB_compare(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift", + "line": 101, + "symbol": "NSString.NMB_compare(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/PostNotification.swift", + "line": 85, + "symbol": "postNotifications(_:from:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/PostNotification.swift", + "line": 93, + "symbol": "postDistributedNotifications(_:from:names:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 15, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 31, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 32, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 32, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 33, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 34, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 39, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 39, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 42, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 46, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 46, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 49, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 49, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 52, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 59, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 71, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 81, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 85, + "symbol": "ExpectationStyle", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 86, + "symbol": "ExpectationStyle.toMatch", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 86, + "symbol": "ExpectationStyle.toNotMatch", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 92, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 106, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 116, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 196, + "symbol": "PredicateBlock", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 198, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 201, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 201, + "symbol": "NMBPredicate.init(predicate:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 215, + "symbol": "NMBPredicateResult", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 216, + "symbol": "NMBPredicateResult.status", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 217, + "symbol": "NMBPredicate", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 217, + "symbol": "NMBPredicateResult.message", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 219, + "symbol": "NMBPredicateResult.init(status:message:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 224, + "symbol": "NMBPredicateResult.init(bool:message:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 229, + "symbol": "NMBPredicateResult.toSwift()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 236, + "symbol": "PredicateResult.toObjectiveC()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 241, + "symbol": "NMBPredicateStatus", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 247, + "symbol": "NMBPredicateStatus.matches", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 248, + "symbol": "NMBPredicateStatus.doesNotMatch", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 249, + "symbol": "NMBPredicateStatus.fail", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 251, + "symbol": "NMBPredicateStatus.hash", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 253, + "symbol": "NMBPredicateStatus.isEqual(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 260, + "symbol": "NMBPredicateStatus.from(status:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 268, + "symbol": "NMBPredicateStatus.from(bool:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 272, + "symbol": "NMBPredicateStatus.toSwift()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/Predicate.swift", + "line": 284, + "symbol": "PredicateStatus.toObjectiveC()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/RaisesException.swift", + "line": 144, + "symbol": "NMBObjCRaiseExceptionPredicate", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/RaisesException.swift", + "line": 168, + "symbol": "NMBObjCRaiseExceptionPredicate.named", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/RaisesException.swift", + "line": 180, + "symbol": "NMBObjCRaiseExceptionPredicate.reason", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/RaisesException.swift", + "line": 192, + "symbol": "NMBObjCRaiseExceptionPredicate.userInfo", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/RaisesException.swift", + "line": 204, + "symbol": "NMBObjCRaiseExceptionPredicate.satisfyingBlock", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/RaisesException.swift", + "line": 218, + "symbol": "NMBPredicate.raiseExceptionMatcher()", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift", + "line": 39, + "symbol": "&&(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift", + "line": 47, + "symbol": "NMBPredicate.satisfyAllOfMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift", + "line": 39, + "symbol": "||(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift", + "line": 47, + "symbol": "NMBPredicate.satisfyAnyOfMatcher(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift", + "line": 85, + "symbol": "throwAssertion()", + "symbol_kind": "source.lang.swift.decl.function.free", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/ToSucceed.swift", + "line": 7, + "symbol": "ToSucceedResult.succeeded", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Matchers/ToSucceed.swift", + "line": 8, + "symbol": "ToSucceedResult.failed(reason:)", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/SourceLocation.swift", + "line": 11, + "symbol": "FileString", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/SourceLocation.swift", + "line": 14, + "symbol": "SourceLocation", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/SourceLocation.swift", + "line": 15, + "symbol": "SourceLocation.file", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/SourceLocation.swift", + "line": 16, + "symbol": "SourceLocation.line", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/SourceLocation.swift", + "line": 28, + "symbol": "SourceLocation.description", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 27, + "symbol": "TestOutputStringConvertible.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 31, + "symbol": "Double.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 37, + "symbol": "Float.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 43, + "symbol": "NSNumber.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 65, + "symbol": "Array.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 72, + "symbol": "AnySequence.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 90, + "symbol": "NSArray.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 97, + "symbol": "NSIndexSet.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 104, + "symbol": "String.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 110, + "symbol": "Data.testDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 144, + "symbol": "NMBStringer", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/jsq/Developer/GitHub/Nimble/Sources/Nimble/Utils/Stringers.swift", + "line": 145, + "symbol": "NMBStringer.stringify(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.class", + "warning": "undocumented" + } + ], + "source_directory": "/Users/jsq/Developer/GitHub/Nimble" +} \ No newline at end of file diff --git a/script/build_docs.zsh b/script/build_docs.zsh new file mode 100755 index 000000000..c35b3898a --- /dev/null +++ b/script/build_docs.zsh @@ -0,0 +1,48 @@ +#!/bin/zsh + +# Created by Jesse Squires +# https://www.jessesquires.com +# +# Copyright © 2020-present Jesse Squires +# +# Jazzy: https://github.com/realm/jazzy/releases/latest +# Generates documentation using jazzy and checks for installation. + +VERSION="0.14.2" + +FOUND=$(jazzy --version) +LINK="https://github.com/realm/jazzy" +INSTALL="gem install jazzy" + +if which jazzy >/dev/null; then + jazzy \ + --clean \ + --author "Nimble Contributors" \ + --author_url "https://github.com/Quick/Nimble" \ + --github_url "https://github.com/Quick/Nimble" \ + --module "Nimble" \ + --source-directory . \ + --readme "README.md" \ + --output docs/ +else + echo " + Error: Jazzy not installed! + + Download: $LINK + Install: $INSTALL + " + exit 1 +fi + +if [ "$FOUND" != "jazzy version: $VERSION" ]; then + echo " + Warning: incorrect Jazzy installed! Please upgrade. + Expected: $VERSION + Found: $FOUND + + Download: $LINK + Install: $INSTALL + " +fi + +exit

uOBfV0;rZg+{_g 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 S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/docs/img/dash.png b/docs/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..26755f76f --- /dev/null +++ b/docs/index.html @@ -0,0 +1,2361 @@ + + + + Nimble Reference + + + + + + + + + + + + +