HaveCount.swift 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import Foundation
  2. // The `haveCount` matchers do not print the full string representation of the collection value,
  3. // instead they only print the type name and the expected count. This makes it easier to understand
  4. // the reason for failed expectations. See: https://github.com/Quick/Nimble/issues/308.
  5. // The representation of the collection content is provided in a new line as an `extendedMessage`.
  6. /// A Nimble matcher that succeeds when the actual Collection's count equals
  7. /// the expected value
  8. public func haveCount<T: Collection>(_ expectedValue: Int) -> Predicate<T> {
  9. return Predicate.define { actualExpression in
  10. if let actualValue = try actualExpression.evaluate() {
  11. let message = ExpectationMessage
  12. .expectedCustomValueTo(
  13. "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))",
  14. "\(actualValue.count)"
  15. )
  16. .appended(details: "Actual Value: \(stringify(actualValue))")
  17. let result = expectedValue == actualValue.count
  18. return PredicateResult(bool: result, message: message)
  19. } else {
  20. return PredicateResult(status: .fail, message: .fail(""))
  21. }
  22. }
  23. }
  24. /// A Nimble matcher that succeeds when the actual collection's count equals
  25. /// the expected value
  26. public func haveCount(_ expectedValue: Int) -> Predicate<NMBCollection> {
  27. return Predicate { actualExpression in
  28. if let actualValue = try actualExpression.evaluate() {
  29. let message = ExpectationMessage
  30. .expectedCustomValueTo(
  31. "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))",
  32. "\(actualValue.count)"
  33. )
  34. .appended(details: "Actual Value: \(stringify(actualValue))")
  35. let result = expectedValue == actualValue.count
  36. return PredicateResult(bool: result, message: message)
  37. } else {
  38. return PredicateResult(status: .fail, message: .fail(""))
  39. }
  40. }
  41. }
  42. #if canImport(Darwin)
  43. extension NMBObjCMatcher {
  44. @objc public class func haveCountMatcher(_ expected: NSNumber) -> NMBMatcher {
  45. return NMBPredicate { actualExpression in
  46. let location = actualExpression.location
  47. let actualValue = try actualExpression.evaluate()
  48. if let value = actualValue as? NMBCollection {
  49. let expr = Expression(expression: ({ value as NMBCollection}), location: location)
  50. return try haveCount(expected.intValue).satisfies(expr).toObjectiveC()
  51. }
  52. let message: ExpectationMessage
  53. if let actualValue = actualValue {
  54. message = ExpectationMessage.expectedCustomValueTo(
  55. "get type of NSArray, NSSet, NSDictionary, or NSHashTable",
  56. "\(String(describing: type(of: actualValue)))"
  57. )
  58. } else {
  59. message = ExpectationMessage
  60. .expectedActualValueTo("have a collection with count \(stringify(expected.intValue))")
  61. .appendedBeNilHint()
  62. }
  63. return NMBPredicateResult(status: .fail, message: message.toObjectiveC())
  64. }
  65. }
  66. }
  67. #endif