diff --git a/docs/operators.md b/docs/operators.md index 27ee0652..fbb78df1 100644 --- a/docs/operators.md +++ b/docs/operators.md @@ -14,7 +14,7 @@ Operators comparison across frameworks | `should` | ✔ | ✔ | ✔ | | `equal` | ✔ | ✔ | ✔ | | `equalSeq` | ✔ | ✔ | ✔ | -| `equivalent` | ✔ | ❌ | ✔ | +| `equivalent` | ✔ | ✔ | ✔ | | `equalWithin` | ✔ | ✔ | ✔ | | `contain` | ✔ | ✔ | ✔ | | `haveLength` | ✔ | ✔ | ✔ | diff --git a/src/FsUnit.Xunit/FsUnit.fs b/src/FsUnit.Xunit/FsUnit.fs index 4165fa87..3afb2030 100644 --- a/src/FsUnit.Xunit/FsUnit.fs +++ b/src/FsUnit.Xunit/FsUnit.fs @@ -57,6 +57,9 @@ let equalSeq expected = let equal expected = CustomMatchers.equal expected +let equivalent expected = + CustomMatchers.equivalent (fun e a -> Assert.Equivalent(e, a, true)) expected + let equalWithin (tolerance: obj) (expected: obj) = CustomMatchers.equalWithin tolerance expected diff --git a/src/FsUnit.Xunit/FsUnitTyped.fs b/src/FsUnit.Xunit/FsUnitTyped.fs index bd16638a..cb973bde 100644 --- a/src/FsUnit.Xunit/FsUnitTyped.fs +++ b/src/FsUnit.Xunit/FsUnitTyped.fs @@ -11,6 +11,10 @@ module TopLevelOperators = let shouldEqual<'a> (expected: 'a) (actual: 'a) = actual |> should equal expected + [] + let shouldEquivalent<'a when 'a: equality> (expected: 'a seq) (actual: 'a seq) = + actual |> should equivalent expected + [] let shouldNotEqual<'a> (expected: 'a) (actual: 'a) = actual |> should not' (equal expected) diff --git a/tests/FsUnit.Xunit.Test/FsUnit.Xunit.Test.fsproj b/tests/FsUnit.Xunit.Test/FsUnit.Xunit.Test.fsproj index 98dd7621..9e431281 100644 --- a/tests/FsUnit.Xunit.Test/FsUnit.Xunit.Test.fsproj +++ b/tests/FsUnit.Xunit.Test/FsUnit.Xunit.Test.fsproj @@ -45,6 +45,7 @@ + diff --git a/tests/FsUnit.Xunit.Test/equivalentTests.fs b/tests/FsUnit.Xunit.Test/equivalentTests.fs new file mode 100644 index 00000000..4be91da8 --- /dev/null +++ b/tests/FsUnit.Xunit.Test/equivalentTests.fs @@ -0,0 +1,40 @@ +namespace FsUnit.Test + +open System +open Xunit +open FsUnit.Xunit + +module EquivalentTests = + + [] + let ``two lists with same elements in different order are equivalent``() = + [ 1; 2; 3 ] |> should equivalent [ 3; 2; 1 ] + + [] + let ``two lists with different elements are not equivalent``() = + [ 1; 2; 3 ] |> should not' (equivalent [ 4; 5; 6 ]) + + [] + let ``two lists with different lengths are not equivalent``() = + [ 1; 2; 3 ] |> should not' (equivalent [ 1; 2 ]) + + [] + let ``two arrays with same elements in different order are equivalent``() = + [| 1; 2; 3 |] |> should equivalent [| 3; 2; 1 |] + + [] + let ``two arrays with different elements are not equivalent``() = + [| 1; 2; 3 |] |> should not' (equivalent [| 4; 5; 6 |]) + + [] + let ``empty collections are equivalent``() = + [] |> should equivalent [] + [||] |> should equivalent [||] + + [] + let ``collections with same elements and duplicates are not equivalent if counts differ``() = + [ 1; 1; 2 ] |> should not' (equivalent [ 1; 2; 2 ]) + + [] + let ``collections with same elements and same counts are equivalent``() = + [ 1; 1; 2 ] |> should equivalent [ 2; 1; 1 ]