@@ -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:
0 commit comments