Skip to content

Commit 686d090

Browse files
Merge pull request #22 from arangato/feature/same-count-collection-extras
Extra items for sets and dictionaries of the same size
2 parents b67d448 + 37705a0 commit 686d090

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

Sources/Difference.swift

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,43 @@ private struct Differ {
4949
if let expectedDict = expected as? Dictionary<AnyHashable, Any>,
5050
let receivedDict = received as? Dictionary<AnyHashable, Any> {
5151
var resultLines: [Line] = []
52-
expectedDict.keys.forEach { key in
52+
let missingKeys = Set(expectedDict.keys).subtracting(receivedDict.keys)
53+
let extraKeys = Set(receivedDict.keys).subtracting(expectedDict.keys)
54+
let commonKeys = Set(receivedDict.keys).intersection(expectedDict.keys)
55+
commonKeys.forEach { key in
5356
let results = diffLines(expectedDict[key], receivedDict[key], level: level + 1)
5457
if !results.isEmpty {
5558
resultLines.append(Line(contents: "Key \(key.description):", indentationLevel: level, canBeOrdered: true, children: results))
5659
}
5760
}
61+
if (!missingKeys.isEmpty) {
62+
var missingKeyPairs: [Line] = []
63+
missingKeys.forEach { key in
64+
missingKeyPairs.append(Line(contents: "\(key.description): \(String(describing: expectedDict[key]))", indentationLevel: level + 1, canBeOrdered: true))
65+
}
66+
resultLines.append(Line(contents: "Missing key pairs:", indentationLevel: level, canBeOrdered: false, children: missingKeyPairs))
67+
}
68+
if (!extraKeys.isEmpty) {
69+
var extraKeyPairs: [Line] = []
70+
extraKeys.forEach { key in
71+
extraKeyPairs.append(Line(contents: "\(key.description): \(String(describing: receivedDict[key]))", indentationLevel: level + 1, canBeOrdered: true))
72+
}
73+
resultLines.append(Line(contents: "Extra key pairs:", indentationLevel: level, canBeOrdered: false, children: extraKeyPairs))
74+
}
5875
return resultLines
5976
}
6077
case (.set?, .set?):
6178
if let expectedSet = expected as? Set<AnyHashable>,
6279
let receivedSet = received as? Set<AnyHashable> {
63-
return expectedSet.subtracting(receivedSet)
80+
let missing = expectedSet.subtracting(receivedSet)
6481
.map { unique in
6582
Line(contents: "Missing: \(unique.description)", indentationLevel: level, canBeOrdered: true)
6683
}
84+
let extras = receivedSet.subtracting(expectedSet)
85+
.map { unique in
86+
Line(contents: "Extra: \(unique.description)", indentationLevel: level, canBeOrdered: true)
87+
}
88+
return missing + extras
6789
}
6890
// Handles different enum cases that have children to prevent printing entire object
6991
case (.enum?, .enum?) where expectedMirror.children.first?.label != receivedMirror.children.first?.label:

Tests/DifferenceTests/DifferenceTests.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,14 @@ class DifferenceTests: XCTestCase {
233233
)
234234
}
235235

236+
func test_canFindDictionaryKeyDifference() {
237+
runTest(
238+
expected: Person(petAges: ["Haddie": 4, "Jethro": 6]),
239+
received: Person(petAges: ["Henny": 1, "Jethro": 2]),
240+
expectedResults: ["petAges:\n|\tKey Jethro:\n|\t|\tReceived: 2\n|\t|\tExpected: 6\n|\tMissing key pairs:\n|\t|\tHaddie: Optional(4)\n|\tExtra key pairs:\n|\t|\tHenny: Optional(1)\n"]
241+
)
242+
}
243+
236244
// MARK: Sets
237245

238246
func test_canFindSetCountDifference() {
@@ -255,7 +263,7 @@ class DifferenceTests: XCTestCase {
255263
runTest(
256264
expected: Person(favoriteFoods: ["Sushi", "Pizza"]),
257265
received: Person(favoriteFoods: ["Oysters", "Crab"]),
258-
expectedResults: ["favoriteFoods:\n|\tMissing: Pizza\n|\tMissing: Sushi\n"]
266+
expectedResults: ["favoriteFoods:\n|\tExtra: Crab\n|\tExtra: Oysters\n|\tMissing: Pizza\n|\tMissing: Sushi\n"]
259267
)
260268
}
261269
}
@@ -276,6 +284,7 @@ extension DifferenceTests {
276284
("test_canFindDictionaryCountDifference", test_canFindDictionaryCountDifference),
277285
("test_canFindOptionalDifferenceBetweenSomeAndNone", test_canFindOptionalDifferenceBetweenSomeAndNone),
278286
("test_canFindDictionaryDifference", test_canFindDictionaryDifference),
287+
("test_canFindDictionaryKeyDifference", test_canFindDictionaryKeyDifference),
279288
("test_canFindSetCountDifference", test_canFindSetCountDifference),
280289
("test_canFindOptionalSetDifferenceBetweenSomeAndNone", test_canFindOptionalSetDifferenceBetweenSomeAndNone),
281290
("test_canFindSetDifference", test_canFindSetDifference)

0 commit comments

Comments
 (0)