ContainElementSatisfying.swift 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import Foundation
  2. public func containElementSatisfying<S: Sequence, T>(_ predicate: @escaping ((T) -> Bool), _ predicateDescription: String = "") -> Predicate<S> where S.Iterator.Element == T {
  3. return Predicate.define { actualExpression in
  4. let message: ExpectationMessage
  5. if predicateDescription == "" {
  6. message = .expectedTo("find object in collection that satisfies predicate")
  7. } else {
  8. message = .expectedTo("find object in collection \(predicateDescription)")
  9. }
  10. if let sequence = try actualExpression.evaluate() {
  11. for object in sequence {
  12. if predicate(object) {
  13. return PredicateResult(bool: true, message: message)
  14. }
  15. }
  16. return PredicateResult(bool: false, message: message)
  17. }
  18. return PredicateResult(status: .fail, message: message)
  19. }
  20. }
  21. #if canImport(Darwin)
  22. extension NMBObjCMatcher {
  23. @objc public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBMatcher {
  24. return NMBPredicate { actualExpression in
  25. let value = try actualExpression.evaluate()
  26. guard let enumeration = value as? NSFastEnumeration else {
  27. let message = ExpectationMessage.fail(
  28. "containElementSatisfying must be provided an NSFastEnumeration object"
  29. )
  30. return NMBPredicateResult(status: .fail, message: message.toObjectiveC())
  31. }
  32. let message = ExpectationMessage
  33. .expectedTo("find object in collection that satisfies predicate")
  34. .toObjectiveC()
  35. var iterator = NSFastEnumerationIterator(enumeration)
  36. while let item = iterator.next() {
  37. guard let object = item as? NSObject else {
  38. continue
  39. }
  40. if predicate(object) {
  41. return NMBPredicateResult(status: .matches, message: message)
  42. }
  43. }
  44. return NMBPredicateResult(status: .doesNotMatch, message: message)
  45. }
  46. }
  47. }
  48. #endif