krzysztofzablocki/difference
Better way to identify what's different between 2 instances.
Installation
CocoaPods
Add pod 'Difference' to your Podfile.
Carthage
Add github "krzysztofzablocki/Difference" to your Cartfile.
SwiftPM
Add .package(url: "https://github.com/krzysztofzablocki/Difference.git", branch: "master") dependency in your Package manifest.
Using lldb
Write the following to see the difference between 2 instances:
po dumpDiff(expected, received)
Integrate with XCTest
Add this to your test target:
public func XCTAssertEqual<T: Equatable>(_ expected: @autoclosure () throws -> T, _ received: @autoclosure () throws -> T, file: StaticString = #filePath, line: UInt = #line) {
do {
let expected = try expected()
let received = try received()
XCTAssertTrue(expected == received, "Found difference for \n" + diff(expected, received).joined(separator: ", "), file: file, line: line)
}
catch {
XCTFail("Caught error while testing: \(error)", file: file, line: line)
}
}Replace #filePath with #file if you're using Xcode 11 or earlier.
Integrate with Quick
Add this to your test target:
public func equalDiff<T: Equatable>(_ expectedValue: T?) -> Matcher<T> {
return Matcher.define { actualExpression in
let receivedValue = try actualExpression.evaluate()
if receivedValue == nil {
var message = ExpectationMessage.fail("")
if let expectedValue = expectedValue {
message = ExpectationMessage.expectedCustomValueTo("equal <\(expectedValue)>", actual: "nil")
}
return MatcherResult(status: .fail, message: message)
}
if expectedValue == nil {
return MatcherResult(status: .fail, message: ExpectationMessage.fail("").appendedBeNilHint())
}
return MatcherResult(bool: receivedValue == expectedValue, message: ExpectationMessage.fail("Found difference for " + diff(expectedValue, receivedValue).joined(separator: ", ")))
}
}Write the following to see the difference between 2 instances: expect(received).to(equalDiff(expected))
Integrate with The Composable Architecture
If you are using The Composable Architecture nameLabels configuration to get a diff that's more appropiate for reducer instrumentation
diff(oldState, newState, indentationType: .pipe, nameLabels: .comparing)You can use this function in your own variant of ReducerInstrumentation code based on this
That way your diffs will look more like this:
Received action:
AppAction.home(.howTo(.setSelectedSlide))
State:
home:
| selectedHowTo:
| | selectedSlide:
| | | Current: 8mnkni91h4fe
| | | Previous: exei4wpqsmdkPackage Metadata
Repository: krzysztofzablocki/difference
Default branch: master
README: README.md