Skip to content

Commit 02f1aa9

Browse files
Equal predicate for array of tuples (#1065)
* Equal predicate for array of tuples Added ability to check an array of tuples for equivalence (useful for MOCs generated by Sourcery) * Equal predicate for array of tuples Fixed swiftlint issues --------- Co-authored-by: Roman Falchuk <roman.falchuk@tiger.trade>
1 parent 941c1fd commit 02f1aa9

3 files changed

Lines changed: 373 additions & 0 deletions

File tree

Nimble.xcodeproj/project.pbxproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,10 @@
455455
B20058C520E92CE400C1264D /* ElementsEqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C420E92CE400C1264D /* ElementsEqualTest.swift */; };
456456
B20058C620E92CE400C1264D /* ElementsEqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C420E92CE400C1264D /* ElementsEqualTest.swift */; };
457457
B20058C720E92CE400C1264D /* ElementsEqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C420E92CE400C1264D /* ElementsEqualTest.swift */; };
458+
C576224D2A61D3AE00BD6A8C /* Equal+TupleArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = C576224C2A61D3AE00BD6A8C /* Equal+TupleArray.swift */; };
459+
C576224E2A61D3AE00BD6A8C /* Equal+TupleArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = C576224C2A61D3AE00BD6A8C /* Equal+TupleArray.swift */; };
460+
C576224F2A61D3AE00BD6A8C /* Equal+TupleArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = C576224C2A61D3AE00BD6A8C /* Equal+TupleArray.swift */; };
461+
C57622502A61D3AE00BD6A8C /* Equal+TupleArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = C576224C2A61D3AE00BD6A8C /* Equal+TupleArray.swift */; };
458462
CD3D9A79232647BC00802581 /* CwlCatchBadInstructionPosix.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3D9A78232647BC00802581 /* CwlCatchBadInstructionPosix.swift */; };
459463
CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; };
460464
CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; };
@@ -811,6 +815,7 @@
811815
AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchErrorTest.swift; sourceTree = "<group>"; };
812816
B20058C020E92C7500C1264D /* ElementsEqual.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementsEqual.swift; sourceTree = "<group>"; };
813817
B20058C420E92CE400C1264D /* ElementsEqualTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementsEqualTest.swift; sourceTree = "<group>"; };
818+
C576224C2A61D3AE00BD6A8C /* Equal+TupleArray.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Equal+TupleArray.swift"; sourceTree = "<group>"; };
814819
CD3D9A78232647BC00802581 /* CwlCatchBadInstructionPosix.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchBadInstructionPosix.swift; sourceTree = "<group>"; };
815820
CDBC39B82462EA7D00069677 /* PredicateTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PredicateTest.swift; sourceTree = "<group>"; };
816821
CDC157902511957100EAA480 /* DSLTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DSLTest.swift; sourceTree = "<group>"; };
@@ -1101,6 +1106,7 @@
11011106
1FD8CD1B1968AB07008ED995 /* EndWith.swift */,
11021107
1FD8CD1C1968AB07008ED995 /* Equal.swift */,
11031108
CDF5C57A2647B89B0036532C /* Equal+Tuple.swift */,
1109+
C576224C2A61D3AE00BD6A8C /* Equal+TupleArray.swift */,
11041110
472FD1341B9E085700C7B8DA /* HaveCount.swift */,
11051111
DDB4D5EC19FE43C200E9D9FE /* Match.swift */,
11061112
1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */,
@@ -1670,6 +1676,7 @@
16701676
F8A1BE2F1CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */,
16711677
1F1871C61CA89EDB00A34BF2 /* DSL.m in Sources */,
16721678
89F5E092290B9D5C001F9377 /* AssertionRecorder+Async.swift in Sources */,
1679+
C576224E2A61D3AE00BD6A8C /* Equal+TupleArray.swift in Sources */,
16731680
1FD8CD301968AB07008ED995 /* AdapterProtocols.swift in Sources */,
16741681
AE7ADE451C80BF8000B94CD3 /* MatchError.swift in Sources */,
16751682
1FC494AA1C29CBA40010975C /* NimbleEnvironment.swift in Sources */,
@@ -1815,6 +1822,7 @@
18151822
1F5DF1761BDCA0F500C3A531 /* AllPass.swift in Sources */,
18161823
AE4BA9AF1C88DDB500B73906 /* Errors.swift in Sources */,
18171824
1F5DF1861BDCA0F500C3A531 /* HaveCount.swift in Sources */,
1825+
C576224F2A61D3AE00BD6A8C /* Equal+TupleArray.swift in Sources */,
18181826
1F5DF1811BDCA0F500C3A531 /* BeLogical.swift in Sources */,
18191827
1F1871DB1CA89EF100A34BF2 /* NMBExpectation.swift in Sources */,
18201828
CDFB6A4F1F7E084600AD8CC7 /* CwlMachBadInstructionHandler.m in Sources */,
@@ -1991,6 +1999,7 @@
19911999
F8A1BE301CB3710900031679 /* XCTestObservationCenter+Register.m in Sources */,
19922000
1FD8CD311968AB07008ED995 /* AdapterProtocols.swift in Sources */,
19932001
89F5E091290B9D5C001F9377 /* AssertionRecorder+Async.swift in Sources */,
2002+
C576224D2A61D3AE00BD6A8C /* Equal+TupleArray.swift in Sources */,
19942003
1F1871D21CA89EEE00A34BF2 /* DSL.m in Sources */,
19952004
AE7ADE461C80BF8000B94CD3 /* MatchError.swift in Sources */,
19962005
1FC494AB1C29CBA40010975C /* NimbleEnvironment.swift in Sources */,
@@ -2136,6 +2145,7 @@
21362145
D95F897E267EA20A004B1B4D /* BeWithin.swift in Sources */,
21372146
D95F8928267EA1CA004B1B4D /* NMBExceptionCapture.m in Sources */,
21382147
D95F8981267EA20A004B1B4D /* BeginWith.swift in Sources */,
2148+
C57622502A61D3AE00BD6A8C /* Equal+TupleArray.swift in Sources */,
21392149
D95F8965267EA20A004B1B4D /* BeLogical.swift in Sources */,
21402150
D95F895D267EA205004B1B4D /* Expectation.swift in Sources */,
21412151
D95F8959267EA205004B1B4D /* NMBExpectation.swift in Sources */,
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
// swiftlint:disable large_tuple vertical_whitespace
2+
3+
// MARK: Tuple2 Array
4+
5+
/// A Nimble matcher that succeeds when the actual array of tuples is equal to the expected array of tuples.
6+
/// Values can support equal by supporting the Equatable protocol.
7+
public func equal<T1: Equatable, T2: Equatable>(
8+
_ expectedValue: [(T1, T2)]?
9+
) -> Predicate<[(T1, T2)]> {
10+
equalTupleArray(expectedValue, by: ==)
11+
}
12+
13+
public func ==<T1: Equatable, T2: Equatable>(
14+
lhs: SyncExpectation<[(T1, T2)]>,
15+
rhs: [(T1, T2)]?
16+
) {
17+
lhs.to(equal(rhs))
18+
}
19+
20+
public func ==<T1: Equatable, T2: Equatable>(
21+
lhs: AsyncExpectation<[(T1, T2)]>,
22+
rhs: [(T1, T2)]?
23+
) async {
24+
await lhs.to(equal(rhs))
25+
}
26+
27+
public func !=<T1: Equatable, T2: Equatable>(
28+
lhs: SyncExpectation<[(T1, T2)]>,
29+
rhs: [(T1, T2)]?
30+
) {
31+
lhs.toNot(equal(rhs))
32+
}
33+
34+
public func !=<T1: Equatable, T2: Equatable>(
35+
lhs: AsyncExpectation<[(T1, T2)]>,
36+
rhs: [(T1, T2)]?
37+
) async {
38+
await lhs.toNot(equal(rhs))
39+
}
40+
41+
// MARK: Tuple3 Array
42+
43+
/// A Nimble matcher that succeeds when the actual array of tuples is equal to the expected array of tuples.
44+
/// Values can support equal by supporting the Equatable protocol.
45+
public func equal<T1: Equatable, T2: Equatable, T3: Equatable>(
46+
_ expectedValue: [(T1, T2, T3)]?
47+
) -> Predicate<[(T1, T2, T3)]> {
48+
equalTupleArray(expectedValue, by: ==)
49+
}
50+
51+
public func ==<T1: Equatable, T2: Equatable, T3: Equatable>(
52+
lhs: SyncExpectation<[(T1, T2, T3)]>,
53+
rhs: [(T1, T2, T3)]?
54+
) {
55+
lhs.to(equal(rhs))
56+
}
57+
58+
public func ==<T1: Equatable, T2: Equatable, T3: Equatable>(
59+
lhs: AsyncExpectation<[(T1, T2, T3)]>,
60+
rhs: [(T1, T2, T3)]?
61+
) async {
62+
await lhs.to(equal(rhs))
63+
}
64+
65+
public func !=<T1: Equatable, T2: Equatable, T3: Equatable>(
66+
lhs: SyncExpectation<[(T1, T2, T3)]>,
67+
rhs: [(T1, T2, T3)]?
68+
) {
69+
lhs.toNot(equal(rhs))
70+
}
71+
72+
public func !=<T1: Equatable, T2: Equatable, T3: Equatable>(
73+
lhs: AsyncExpectation<[(T1, T2, T3)]>,
74+
rhs: [(T1, T2, T3)]?
75+
) async {
76+
await lhs.toNot(equal(rhs))
77+
}
78+
79+
// MARK: Tuple4 Array
80+
81+
/// A Nimble matcher that succeeds when the actual array of tuples is equal to the expected array of tuples.
82+
/// Values can support equal by supporting the Equatable protocol.
83+
public func equal<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
84+
_ expectedValue: [(T1, T2, T3, T4)]?
85+
) -> Predicate<[(T1, T2, T3, T4)]> {
86+
equalTupleArray(expectedValue, by: ==)
87+
}
88+
89+
public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
90+
lhs: SyncExpectation<[(T1, T2, T3, T4)]>,
91+
rhs: [(T1, T2, T3, T4)]?
92+
) {
93+
lhs.to(equal(rhs))
94+
}
95+
96+
public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
97+
lhs: AsyncExpectation<[(T1, T2, T3, T4)]>,
98+
rhs: [(T1, T2, T3, T4)]?
99+
) async {
100+
await lhs.to(equal(rhs))
101+
}
102+
103+
public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
104+
lhs: SyncExpectation<[(T1, T2, T3, T4)]>,
105+
rhs: [(T1, T2, T3, T4)]?
106+
) {
107+
lhs.toNot(equal(rhs))
108+
}
109+
110+
public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable>(
111+
lhs: AsyncExpectation<[(T1, T2, T3, T4)]>,
112+
rhs: [(T1, T2, T3, T4)]?
113+
) async {
114+
await lhs.toNot(equal(rhs))
115+
}
116+
117+
// MARK: Tuple5 Array
118+
119+
/// A Nimble matcher that succeeds when the actual array of tuples is equal to the expected array of tuples.
120+
/// Values can support equal by supporting the Equatable protocol.
121+
public func equal<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
122+
_ expectedValue: [(T1, T2, T3, T4, T5)]?
123+
) -> Predicate<[(T1, T2, T3, T4, T5)]> {
124+
equalTupleArray(expectedValue, by: ==)
125+
}
126+
127+
public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
128+
lhs: SyncExpectation<[(T1, T2, T3, T4, T5)]>,
129+
rhs: [(T1, T2, T3, T4, T5)]?
130+
) {
131+
lhs.to(equal(rhs))
132+
}
133+
134+
public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
135+
lhs: AsyncExpectation<[(T1, T2, T3, T4, T5)]>,
136+
rhs: [(T1, T2, T3, T4, T5)]?
137+
) async {
138+
await lhs.to(equal(rhs))
139+
}
140+
141+
public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
142+
lhs: SyncExpectation<[(T1, T2, T3, T4, T5)]>,
143+
rhs: [(T1, T2, T3, T4, T5)]?
144+
) {
145+
lhs.toNot(equal(rhs))
146+
}
147+
148+
public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable>(
149+
lhs: AsyncExpectation<[(T1, T2, T3, T4, T5)]>,
150+
rhs: [(T1, T2, T3, T4, T5)]?
151+
) async {
152+
await lhs.toNot(equal(rhs))
153+
}
154+
155+
// MARK: Tuple6 Array
156+
157+
/// A Nimble matcher that succeeds when the actual array of tuples is equal to the expected array of tuples.
158+
/// Values can support equal by supporting the Equatable protocol.
159+
public func equal<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
160+
_ expectedValue: [(T1, T2, T3, T4, T5, T6)]?
161+
) -> Predicate<[(T1, T2, T3, T4, T5, T6)]> {
162+
equalTupleArray(expectedValue, by: ==)
163+
}
164+
165+
public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
166+
lhs: SyncExpectation<[(T1, T2, T3, T4, T5, T6)]>,
167+
rhs: [(T1, T2, T3, T4, T5, T6)]?
168+
) {
169+
lhs.to(equal(rhs))
170+
}
171+
172+
public func ==<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
173+
lhs: AsyncExpectation<[(T1, T2, T3, T4, T5, T6)]>,
174+
rhs: [(T1, T2, T3, T4, T5, T6)]?
175+
) async {
176+
await lhs.to(equal(rhs))
177+
}
178+
179+
public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
180+
lhs: SyncExpectation<[(T1, T2, T3, T4, T5, T6)]>,
181+
rhs: [(T1, T2, T3, T4, T5, T6)]?
182+
) {
183+
lhs.toNot(equal(rhs))
184+
}
185+
186+
public func !=<T1: Equatable, T2: Equatable, T3: Equatable, T4: Equatable, T5: Equatable, T6: Equatable>(
187+
lhs: AsyncExpectation<[(T1, T2, T3, T4, T5, T6)]>,
188+
rhs: [(T1, T2, T3, T4, T5, T6)]?
189+
) async {
190+
await lhs.toNot(equal(rhs))
191+
}
192+
193+
// swiftlint:enable large_tuple vertical_whitespace
194+
195+
// MARK: Implementation Helpers
196+
197+
private func equalTupleArray<Tuple>(
198+
_ expectedValue: [(Tuple)]?,
199+
by areTuplesEquivalent: @escaping (Tuple, Tuple) -> Bool
200+
) -> Predicate<[Tuple]> {
201+
equal(expectedValue) {
202+
$0.elementsEqual($1, by: areTuplesEquivalent)
203+
}
204+
}

0 commit comments

Comments
 (0)