Skip to content

Commit

Permalink
Merge pull request #557 from LucianoPAlmeida/master
Browse files Browse the repository at this point in the history
Sequence elementsEqual matcher
  • Loading branch information
ikesyo committed Jul 4, 2018
2 parents b6f0a7b + 94f5164 commit b731d81
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 0 deletions.
16 changes: 16 additions & 0 deletions Nimble.xcodeproj/project.pbxproj
Expand Up @@ -347,6 +347,12 @@
AE7ADE491C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; };
AE7ADE4A1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; };
AE7ADE4B1C80C00D00B94CD3 /* MatchErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */; };
B20058C120E92C7500C1264D /* ElementsEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C020E92C7500C1264D /* ElementsEqual.swift */; };
B20058C220E92CA900C1264D /* ElementsEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C020E92C7500C1264D /* ElementsEqual.swift */; };
B20058C320E92CA900C1264D /* ElementsEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C020E92C7500C1264D /* ElementsEqual.swift */; };
B20058C520E92CE400C1264D /* ElementsEqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C420E92CE400C1264D /* ElementsEqualTest.swift */; };
B20058C620E92CE400C1264D /* ElementsEqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C420E92CE400C1264D /* ElementsEqualTest.swift */; };
B20058C720E92CE400C1264D /* ElementsEqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C420E92CE400C1264D /* ElementsEqualTest.swift */; };
CD037213207DCC580047AF28 /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD037212207DCC580047AF28 /* XCTestManifests.swift */; };
CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; };
CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; };
Expand Down Expand Up @@ -613,6 +619,8 @@
AE4BA9AC1C88DDB500B73906 /* Errors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = "<group>"; };
AE7ADE441C80BF8000B94CD3 /* MatchError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchError.swift; sourceTree = "<group>"; };
AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchErrorTest.swift; sourceTree = "<group>"; };
B20058C020E92C7500C1264D /* ElementsEqual.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementsEqual.swift; sourceTree = "<group>"; };
B20058C420E92CE400C1264D /* ElementsEqualTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementsEqualTest.swift; sourceTree = "<group>"; };
CD037212207DCC580047AF28 /* XCTestManifests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestManifests.swift; sourceTree = "<group>"; };
CDFB6A1E1F7E07C600AD8CC7 /* CwlCatchException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchException.swift; sourceTree = "<group>"; };
CDFB6A201F7E07C600AD8CC7 /* CwlCatchException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CwlCatchException.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -813,6 +821,7 @@
1F925F01195C189500ED456B /* ContainTest.swift */,
1F925EFE195C187600ED456B /* EndWithTest.swift */,
1F925F04195C18B700ED456B /* EqualTest.swift */,
B20058C420E92CE400C1264D /* ElementsEqualTest.swift */,
472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */,
DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */,
1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */,
Expand Down Expand Up @@ -864,6 +873,7 @@
7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */,
1FD8CD1B1968AB07008ED995 /* EndWith.swift */,
1FD8CD1C1968AB07008ED995 /* Equal.swift */,
B20058C020E92C7500C1264D /* ElementsEqual.swift */,
472FD1341B9E085700C7B8DA /* HaveCount.swift */,
DDB4D5EC19FE43C200E9D9FE /* Match.swift */,
1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */,
Expand Down Expand Up @@ -1346,6 +1356,7 @@
DDB4D5ED19FE43C200E9D9FE /* Match.swift in Sources */,
1F91DD311C74BF61002C309F /* BeVoid.swift in Sources */,
7B13BA0B1DD361D200C9098C /* ContainElementSatisfying.swift in Sources */,
B20058C220E92CA900C1264D /* ElementsEqual.swift in Sources */,
1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */,
1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */,
29EA59661B551EE6002D767E /* ThrowError.swift in Sources */,
Expand Down Expand Up @@ -1430,6 +1441,7 @@
1F4A56911A3B344A009E1637 /* ObjCBeNilTest.m in Sources */,
1F8A37B01B7C5042001C8357 /* ObjCSyncTest.m in Sources */,
1F4A56941A3B346F009E1637 /* ObjCContainTest.m in Sources */,
B20058C620E92CE400C1264D /* ElementsEqualTest.swift in Sources */,
1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */,
7B13BA111DD361EB00C9098C /* ObjCContainElementSatisfyingTest.m in Sources */,
1F925EF6195C147800ED456B /* BeCloseToTest.swift in Sources */,
Expand Down Expand Up @@ -1513,6 +1525,7 @@
1F5DF16F1BDCA0F500C3A531 /* AssertionDispatcher.swift in Sources */,
964CFEFF1C4FF48900513336 /* ThrowAssertion.swift in Sources */,
1F5DF1841BDCA0F500C3A531 /* EndWith.swift in Sources */,
B20058C320E92CA900C1264D /* ElementsEqual.swift in Sources */,
1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */,
1F5DF1701BDCA0F500C3A531 /* DSL.swift in Sources */,
CDD80B851F20307B0002CD65 /* MatcherProtocols.swift in Sources */,
Expand Down Expand Up @@ -1565,6 +1578,7 @@
1F5DF19C1BDCA10200C3A531 /* BeginWithTest.swift in Sources */,
1F5DF1A01BDCA10200C3A531 /* BeIdenticalToTest.swift in Sources */,
1F5DF19A1BDCA10200C3A531 /* BeCloseToTest.swift in Sources */,
B20058C720E92CE400C1264D /* ElementsEqualTest.swift in Sources */,
1F5DF1A61BDCA10200C3A531 /* EndWithTest.swift in Sources */,
CD79C9A31D2CC841004B6F9A /* ObjCBeFalseTest.m in Sources */,
1F5DF1A71BDCA10200C3A531 /* EqualTest.swift in Sources */,
Expand Down Expand Up @@ -1621,6 +1635,7 @@
1FD8CD2F1968AB07008ED995 /* AssertionRecorder.swift in Sources */,
7B13BA061DD360AA00C9098C /* ContainElementSatisfying.swift in Sources */,
1F91DD321C74BF61002C309F /* BeVoid.swift in Sources */,
B20058C120E92C7500C1264D /* ElementsEqual.swift in Sources */,
1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */,
DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */,
29EA59671B551EE6002D767E /* ThrowError.swift in Sources */,
Expand Down Expand Up @@ -1684,6 +1699,7 @@
1F925F03195C189500ED456B /* ContainTest.swift in Sources */,
A8A3B6FD2073644700E25A08 /* ObjcStringersTest.m in Sources */,
1F4A56891A3B33CB009E1637 /* ObjCBeFalsyTest.m in Sources */,
B20058C520E92CE400C1264D /* ElementsEqualTest.swift in Sources */,
1F4A568F1A3B342B009E1637 /* ObjCBeFalseTest.m in Sources */,
1F925F12195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift in Sources */,
1F925EF0195C136500ED456B /* BeLogicalTest.swift in Sources */,
Expand Down
16 changes: 16 additions & 0 deletions Sources/Nimble/Matchers/ElementsEqual.swift
@@ -0,0 +1,16 @@
/// A Nimble matcher that succeeds when the actual sequence contain the same elements in the same order to the exepected sequence.
public func elementsEqual<S: Sequence>(_ expectedValue: S?) -> Predicate<S> where S.Element: Equatable {
// A matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2949668-elementsequal
return Predicate.define("elementsEqual <\(stringify(expectedValue))>") { (actualExpression, msg) in
let actualValue = try actualExpression.evaluate()
switch (expectedValue, actualValue) {
case (nil, _?):
return PredicateResult(status: .fail, message: msg.appendedBeNilHint())
case (nil, nil), (_, nil):
return PredicateResult(status: .fail, message: msg)
case (let expected?, let actual?):
let matches = expected.elementsEqual(actual)
return PredicateResult(bool: matches, message: msg)
}
}
}
27 changes: 27 additions & 0 deletions Tests/NimbleTests/Matchers/ElementsEqualTest.swift
@@ -0,0 +1,27 @@
import Foundation
import XCTest
import Nimble

final class ElementsEqualTest: XCTestCase, XCTestCaseProvider {

func testSequenceElementsEquality() {
failsWithErrorMessageForNil("expected to elementsEqual <nil>, got <nil>") {
expect(nil as [Int]?).to(elementsEqual(nil as [Int]?))
}
let sequence = [1, 2]
failsWithErrorMessageForNil("expected to elementsEqual <[1, 2]>, got <nil>") {
expect(nil as [Int]?).to(elementsEqual(sequence))
}

failsWithErrorMessageForNil("expected to elementsEqual <nil>, got <[1, 2]>") {
expect(sequence).to(elementsEqual(nil as [Int]?))
}

let sequence1 = [1, 2, 3]
let sequence2 = [1, 2, 3, 4, 5]
expect(sequence1).toNot(elementsEqual(sequence2))
expect(sequence1).toNot(elementsEqual([3, 2, 1]))
expect(sequence1).to(elementsEqual([1, 2, 3]))

}
}
7 changes: 7 additions & 0 deletions Tests/NimbleTests/XCTestManifests.swift
Expand Up @@ -206,6 +206,12 @@ extension ContainTest {
]
}

extension ElementsEqualTest {
static let __allTests = [
("testSequenceElementsEquality", testSequenceElementsEquality),
]
}

extension EndWithTest {
static let __allTests = [
("testEndWithNegatives", testEndWithNegatives),
Expand Down Expand Up @@ -359,6 +365,7 @@ public func __allTests() -> [XCTestCaseEntry] {
testCase(BeginWithTest.__allTests),
testCase(ContainElementSatisfyingTest.__allTests),
testCase(ContainTest.__allTests),
testCase(ElementsEqualTest.__allTests),
testCase(EndWithTest.__allTests),
testCase(EqualTest.__allTests),
testCase(HaveCountTest.__allTests),
Expand Down

0 comments on commit b731d81

Please sign in to comment.