DEdge.Diffract
0.4.0
dotnet add package DEdge.Diffract --version 0.4.0
NuGet\Install-Package DEdge.Diffract -Version 0.4.0
<PackageReference Include="DEdge.Diffract" Version="0.4.0" />
paket add DEdge.Diffract --version 0.4.0
#r "nuget: DEdge.Diffract, 0.4.0"
// Install DEdge.Diffract as a Cake Addin #addin nuget:?package=DEdge.Diffract&version=0.4.0 // Install DEdge.Diffract as a Cake Tool #tool nuget:?package=DEdge.Diffract&version=0.4.0
Diffract is a .NET library that displays a readable diff between two objects. It is particularly useful for unit testing complex objects. Diffract is maintained by folks at D-EDGE.Here is an example:```csharp using DEdge.Diffract;
record User(string Name, int Age, string[] Pets);
var expected = new User("Emma", 42, new[] { "Oscar", "Fluffy", "Tibbles" }); var actual = new User("Andy", 42, new[] { "Oscar", "Sparky" });
Differ.Assert(expected, actual);
```The above throws an AssertionFailedException
with the following message: Value differs by 2 fields:
Name Expect = "Emma"
Actual = "Andy"
Pets collection differs:
Pets.Count Expect = 3
Actual = 2
Pets[1] Expect = "Fluffy"
Actual = "Sparky"Diffract can drill down many composite types:* POCOs;
- C# records;
- F# records and anonymous records;
- F# unions;
- enumerables (
IEnumerable<T>
); - dictionaries (
IDictionary<K, V>
,IReadOnlyDictionary<K, V>
); - value and reference tuples.Values of any other equatable type (like
string
andint
in the above example) are treated as leaves that can be tested for equality.## Example outputsPOCO or record with multiple field differences:```csharp record User(string Name, int Age, bool IsActive);
var expected = new User("Emma", 42, true);
var actual = new User("Andy", 35, true);Value differs by 2 fields:
Name Expect = "Emma"
Actual = "Andy"
Age Expect = 42
Actual = 35
F# union where the case is different:
fsharp
type Contact =
| Email of address: string
| Phone of number: string
let expected = Email "user@example.com"
let actual = Phone "555-123-456"Value differs by union case:
Expect is Email
Actual is Phone
F# union where the case is the same and the value is different:
fsharp
type Contact =
| Email of address: string
| Phone of number: string
let expected = Email "user@example.com"
let actual = Email "someone@example.com"Value differs by union case Email fields:
address Expect = "user@example.com"
Actual = "someone@example.com"
Enumerables show the counts if they differ, followed by the diffs per item:
csharp
var expected = new string[] { "first", "second" };
var actual = new string[] { "first", "2nd", "third" };Value collection differs:
Count Expect = 2
Actual = 3
[1] Expect = "second"
Actual = "2nd"
Dictionaries show the keys missing on either side, followed by the diffs per item that exists in both:
csharp
var expected = new Dictionary<string, int>
{
{ "first", 1 },
{ "second", 2 },
{ "third", 3 },
};
var actual = new Dictionary<string, int>
{
{ "first", 1 },
{ "third", 2 },
{ "fourth", 4 },
};Value dictionary differs:
["second"] Actual is missing
["fourth"] Expect is missing
["third"] Expect = 3
Actual = 2
## APIDiffract lives in the namespace `DEdge.Diffract`. Its main API is the class `Differ`, which provides the following methods:
csharp
void Assert<T>(T expected, T actual, IDiffer<T> differ = null, PrintParams param = null)
Computes the diff between two objects and, if it is not empty, throws an `AssertionFailedException` with the diff as message.
csharp
string ToString<T>(T expected, T actual, IDiffer<T> differ = null, PrintParams param = null)
Prints the diff between two objects to a string.
csharp
void Write<T>(T expected, T actual, TextWriter writer = null, IDiffer<T> differ = null, PrintParams param = null)
Prints the diff between two objects to the given TextWriter (or to standard output if not provided).
csharp
FSharpOption<Diff> Diff<T>(T expected, T actual, IDiffer<T> differ = null)
```Computes the diff between two objects. Returns None
if the objects are found to be equal.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
- FSharp.Core (>= 5.0.0)
- TypeShape (>= 10.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.