diff --git a/.github/workflows/build-test-publish.yml b/.github/workflows/build-test-publish.yml
index 12dcd08..712e622 100644
--- a/.github/workflows/build-test-publish.yml
+++ b/.github/workflows/build-test-publish.yml
@@ -45,11 +45,13 @@ jobs:
- name: Build Debug
run: dotnet build -c Debug R4Utils
- name: Create Name
- run: echo "SUFFIX=dev.$(tr /- .. <<<$GITHUB_REF).${GITHUB_RUN_ID}" >> $GITHUB_ENV
+ run: |
+ export RAW_SUFFIX="dev.$(tr /- .. <<<$GITHUB_REF)"
+ echo "SUFFIX=${RAW_SUFFIX:0:44}.${GITHUB_RUN_ID}" >> $GITHUB_ENV
- name: Pack
run: dotnet pack --no-build --no-dependencies -c Debug -p:PackageId=R4UtilsDev --version-suffix $SUFFIX
- name: Push
- run: dotnet nuget push R4Utils/bin/Debug/R4UtilsDev.1.2.0-$SUFFIX.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate
+ run: dotnet nuget push R4Utils/bin/Debug/R4UtilsDev.1.2.1-$SUFFIX.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate
publish-pre:
runs-on: ubuntu-latest
@@ -73,7 +75,7 @@ jobs:
- name: Pack
run: dotnet pack -c Release --no-build --no-dependencies --version-suffix $SUFFIX
- name: Push
- run: dotnet nuget push R4Utils/bin/Release/R4Utils.1.2.0-$SUFFIX.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate
+ run: dotnet nuget push R4Utils/bin/Release/R4Utils.1.2.1-$SUFFIX.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate
publish-production:
runs-on: ubuntu-latest
@@ -95,4 +97,4 @@ jobs:
- name: Pack
run: dotnet pack -c Release --no-build --no-dependencies
- name: Push
- run: dotnet nuget push R4Utils/bin/Release/R4Utils.1.2.0.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate
+ run: dotnet nuget push R4Utils/bin/Release/R4Utils.1.2.1.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate
diff --git a/R4Utils/R4Utils.csproj b/R4Utils/R4Utils.csproj
index ffd9c75..7051670 100644
--- a/R4Utils/R4Utils.csproj
+++ b/R4Utils/R4Utils.csproj
@@ -5,7 +5,7 @@
enable
enable
R4Utils
- 1.2.0
+ 1.2.1
Ronto4
13
https://github.com/Ronto4/R4Utils
diff --git a/R4Utils/ValueEqualityCollections/Extensions.cs b/R4Utils/ValueEqualityCollections/Extensions.cs
index dfb6161..bfc63cf 100644
--- a/R4Utils/ValueEqualityCollections/Extensions.cs
+++ b/R4Utils/ValueEqualityCollections/Extensions.cs
@@ -18,4 +18,25 @@ public static ValueEqualityCollection AsOrderedValueEqualityCollection(thi
///
public static ValueEqualityCollection AsValueEqualityCollection(this ICollection collection)
where T : IEquatable => new(collection, ValueEqualityCollection.OrderMode.Ignore);
+
+ ///
+ /// Transform this collection into a collection that performs value equality on its items for deducing collection equality.
+ ///
+ /// The resulting will consider ordering whenever compared to another instance also considering ordering.
+ ///
+ public static ValueEqualityCollection
+ AsGenericOrderedValueEqualityCollection(this TCollection collection)
+ where T : IEquatable where TCollection : IList =>
+ new(collection, ValueEqualityCollection.OrderMode.Consider);
+
+ ///
+ /// Transform this collection into a collection that performs value equality on its items for deducing collection equality.
+ ///
+ /// As the underlying does not support ordering (does not inherit ),
+ /// the resulting will ignore ordering whenever it is compared.
+ ///
+ public static ValueEqualityCollection
+ AsGenericValueEqualityCollection(this TCollection collection)
+ where T : IEquatable where TCollection : ICollection =>
+ new(collection, ValueEqualityCollection.OrderMode.Ignore);
}
diff --git a/R4Utils/ValueEqualityCollections/ValueEqualityCollection.cs b/R4Utils/ValueEqualityCollections/ValueEqualityCollection.cs
index c7e2a64..3b0a89f 100644
--- a/R4Utils/ValueEqualityCollections/ValueEqualityCollection.cs
+++ b/R4Utils/ValueEqualityCollections/ValueEqualityCollection.cs
@@ -3,6 +3,37 @@
namespace R4Utils.ValueEqualityCollections;
+file static class Helpers
+{
+ // Source: https://stackoverflow.com/a/3670089/13849454
+ public static bool ScrambledEquals(ICollection collection1, ICollection collection2) where T : notnull
+ {
+ var cnt = new Dictionary();
+ // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator
+ foreach (var s in collection1)
+ {
+ if (!cnt.TryAdd(s, 1))
+ {
+ cnt[s]++;
+ }
+ }
+
+ foreach (var s in collection2)
+ {
+ if (cnt.TryGetValue(s, out var value))
+ {
+ cnt[s] = --value;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ return cnt.Values.All(c => c == 0);
+ }
+}
+
///
/// A wrapper around an that uses value equality of its elements for equality of the collections.
///
@@ -73,40 +104,11 @@ private bool EqualityDispatch(ValueEqualityCollection other)
return OrderedEquality(list1, list2);
}
- return ScrambledEquals(Collection, other.Collection);
+ return Helpers.ScrambledEquals(Collection, other.Collection);
}
private static bool OrderedEquality(IList list1, IList list2) => list1.SequenceEqual(list2);
- // Source: https://stackoverflow.com/a/3670089/13849454
- private static bool ScrambledEquals(ICollection collection1, ICollection collection2)
- {
- var cnt = new Dictionary();
- // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator
- foreach (var s in collection1)
- {
- if (!cnt.TryAdd(s, 1))
- {
- cnt[s]++;
- }
- }
-
- foreach (var s in collection2)
- {
- if (cnt.TryGetValue(s, out var value))
- {
- cnt[s] = --value;
- }
- else
- {
- return false;
- }
- }
-
- return cnt.Values.All(c => c == 0);
- }
-
-
// ICollection implementation
public IEnumerator GetEnumerator() => Collection.GetEnumerator();
@@ -119,7 +121,7 @@ public override bool Equals(object? obj)
}
// TODO: Look into this, this might in fact be wrong.
- public override int GetHashCode() => Collection.Aggregate(0, HashCode.Combine);
+ public override int GetHashCode() => HashCode.Combine(Collection.Aggregate(0, HashCode.Combine), Ordering);
public void Add(T item) => Collection.Add(item);
@@ -135,3 +137,104 @@ public override bool Equals(object? obj)
public bool IsReadOnly => Collection.IsReadOnly;
}
+
+///
+/// A wrapper around a that uses value equality of its elements for equality of the collections.
+///
+public class ValueEqualityCollection : ICollection,
+ IEquatable>,
+ IEqualityOperators, ValueEqualityCollection, bool>
+ where T : IEquatable where TCollection : ICollection
+{
+ public override bool Equals(object? obj)
+ {
+ if (obj is null) return false;
+ if (ReferenceEquals(this, obj)) return true;
+ if (obj.GetType() != GetType()) return false;
+ return Equals((ValueEqualityCollection)obj);
+ }
+
+ // TODO: Look into this, this might in fact be wrong.
+ public override int GetHashCode() => HashCode.Combine(Underlying.Aggregate(0, HashCode.Combine), Ordering);
+
+ ///
+ /// Defines strategies of dealing with ordering when comparing two instances.
+ ///
+ public enum OrderMode
+ {
+ ///
+ /// Consider ordering when comparing this instance with another one.
+ ///
+ Consider,
+
+ ///
+ /// Ignore ordering when comparing this instance with another one.
+ ///
+ /// If any of the compared instances has this set, the ordering will be ignored.
+ ///
+ Ignore,
+ }
+
+ ///
+ /// The collection used to create this instance.
+ ///
+ public TCollection Underlying { get; }
+
+ ///
+ /// Whether to consider ordering when comparing this instance with another one.
+ ///
+ /// This is always unless inherits .
+ ///
+ public OrderMode Ordering { get; }
+
+ internal ValueEqualityCollection(TCollection underlying, OrderMode ordering)
+ {
+ Underlying = underlying;
+ Ordering = underlying is IList ? ordering : OrderMode.Ignore;
+ }
+
+ // Equality
+ public bool Equals(ValueEqualityCollection? other)
+ {
+ if (other is null) return false;
+ return ReferenceEquals(this, other) || EqualityDispatch(other);
+ }
+
+ private bool EqualityDispatch(ValueEqualityCollection other)
+ {
+ if (Ordering is OrderMode.Consider && other.Ordering is OrderMode.Consider && Underlying is IList list1 &&
+ other.Underlying is IList list2)
+ {
+ return OrderedEquality(list1, list2);
+ }
+
+ return Helpers.ScrambledEquals(Underlying, other.Underlying);
+ }
+
+ private static bool OrderedEquality(IList list1, IList list2) => list1.SequenceEqual(list2);
+
+ public static bool operator ==(ValueEqualityCollection? left,
+ ValueEqualityCollection? right) => right?.Equals(left) ?? left is null;
+
+ public static bool operator !=(ValueEqualityCollection? left,
+ ValueEqualityCollection? right) => !(left == right);
+
+ // Collection
+ public IEnumerator GetEnumerator() => Underlying.GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)Underlying).GetEnumerator();
+
+ public void Add(T item) => Underlying.Add(item);
+
+ public void Clear() => Underlying.Clear();
+
+ public bool Contains(T item) => Underlying.Contains(item);
+
+ public void CopyTo(T[] array, int arrayIndex) => Underlying.CopyTo(array, arrayIndex);
+
+ public bool Remove(T item) => Underlying.Remove(item);
+
+ public int Count => Underlying.Count;
+
+ public bool IsReadOnly => Underlying.IsReadOnly;
+}
diff --git a/R4UtilsTester/ValueEqualityCollections/TestValueEqualityCollection.cs b/R4UtilsTester/ValueEqualityCollections/TestValueEqualityCollection.cs
index c108f99..2ee87e4 100644
--- a/R4UtilsTester/ValueEqualityCollections/TestValueEqualityCollection.cs
+++ b/R4UtilsTester/ValueEqualityCollections/TestValueEqualityCollection.cs
@@ -8,136 +8,278 @@ namespace R4UtilsTester.ValueEqualityCollections;
[TestFixture]
public class TestValueEqualityCollection
{
- private static void AssertEqual(ValueEqualityCollection wrapper1, ValueEqualityCollection wrapper2,
- bool unequal = false) where T : IEquatable
+ public class NonGeneric
{
- if (unequal)
+ private static void AssertEqual(ValueEqualityCollection wrapper1, ValueEqualityCollection wrapper2,
+ bool unequal = false) where T : IEquatable
{
- Assert.AreNotEqual(wrapper1, wrapper2);
- Assert.IsFalse(wrapper1.Equals(wrapper2));
- Assert.IsFalse(wrapper1 == wrapper2);
- Assert.IsTrue(wrapper1 != wrapper2);
+ if (unequal)
+ {
+ Assert.AreNotEqual(wrapper1, wrapper2);
+ Assert.IsFalse(wrapper1.Equals(wrapper2));
+ Assert.IsFalse(wrapper1 == wrapper2);
+ Assert.IsTrue(wrapper1 != wrapper2);
+ }
+ else
+ {
+ Assert.AreEqual(wrapper1, wrapper2);
+ Assert.IsTrue(wrapper1.Equals(wrapper2));
+ Assert.IsTrue(wrapper1 == wrapper2);
+ Assert.IsFalse(wrapper1 != wrapper2);
+ }
}
- else
+
+ [Test]
+ public void TestEqualArraysEqual()
{
- Assert.AreEqual(wrapper1, wrapper2);
- Assert.IsTrue(wrapper1.Equals(wrapper2));
- Assert.IsTrue(wrapper1 == wrapper2);
- Assert.IsFalse(wrapper1 != wrapper2);
+ int[] data1 = [1, 2, 3];
+ int[] data2 = [1, 2, 3];
+ var wrapper1 = data1.AsOrderedValueEqualityCollection();
+ var wrapper2 = data2.AsOrderedValueEqualityCollection();
+ AssertEqual(wrapper1, wrapper2);
}
- }
-
- [Test]
- public void TestEqualArraysEqual()
- {
- int[] data1 = [1, 2, 3];
- int[] data2 = [1, 2, 3];
- var wrapper1 = data1.AsOrderedValueEqualityCollection();
- var wrapper2 = data2.AsOrderedValueEqualityCollection();
- AssertEqual(wrapper1, wrapper2);
- }
- [Test]
- public void TestConsidersOrderingOfElements()
- {
- int[] data1 = [1, 2, 3];
- int[] data2 = [2, 1, 3];
- var wrapper1 = data1.AsOrderedValueEqualityCollection();
- var wrapper2 = data2.AsOrderedValueEqualityCollection();
- AssertEqual(wrapper1, wrapper2, true);
- }
+ [Test]
+ public void TestConsidersOrderingOfElements()
+ {
+ int[] data1 = [1, 2, 3];
+ int[] data2 = [2, 1, 3];
+ var wrapper1 = data1.AsOrderedValueEqualityCollection();
+ var wrapper2 = data2.AsOrderedValueEqualityCollection();
+ AssertEqual(wrapper1, wrapper2, true);
+ }
- [Test]
- public void TestHandlesSetsCorrectly()
- {
- HashSet data1 = [1, 2, 3];
- HashSet data2 = [2, 1, 3];
- var wrapper1 = data1.AsValueEqualityCollection();
- var wrapper2 = data2.AsValueEqualityCollection();
- AssertEqual(wrapper1, wrapper2);
- }
+ [Test]
+ public void TestHandlesSetsCorrectly()
+ {
+ HashSet data1 = [1, 2, 3];
+ HashSet data2 = [2, 1, 3];
+ var wrapper1 = data1.AsValueEqualityCollection();
+ var wrapper2 = data2.AsValueEqualityCollection();
+ AssertEqual(wrapper1, wrapper2);
+ }
- [Test]
- public void TestHandlesSetsMixedWithArraysCorrectly()
- {
- HashSet data1 = [1, 2, 3];
- int[] data2 = [2, 1, 3];
- var wrapper1 = data1.AsValueEqualityCollection();
- var wrapper2 = data2.AsOrderedValueEqualityCollection();
- AssertEqual(wrapper1, wrapper2);
- }
+ [Test]
+ public void TestHandlesSetsMixedWithArraysCorrectly()
+ {
+ HashSet data1 = [1, 2, 3];
+ int[] data2 = [2, 1, 3];
+ var wrapper1 = data1.AsValueEqualityCollection();
+ var wrapper2 = data2.AsOrderedValueEqualityCollection();
+ AssertEqual(wrapper1, wrapper2);
+ }
- [Test]
- public void TestIgnoreOrdering()
- {
- bool[] bools = [true, false];
- foreach (var data1IgnoreOrdering in bools)
+ [Test]
+ public void TestIgnoreOrdering()
{
- foreach (var data2IgnoreOrdering in bools)
+ bool[] bools = [true, false];
+ foreach (var data1IgnoreOrdering in bools)
{
- int[] data1 = [1, 2, 3];
- int[] data2 = [2, 1, 3];
- var wrapper1 = data1IgnoreOrdering
- ? data1.AsValueEqualityCollection()
- : data1.AsOrderedValueEqualityCollection();
- var wrapper2 = data2IgnoreOrdering
- ? data2.AsValueEqualityCollection()
- : data2.AsOrderedValueEqualityCollection();
- Assert.AreEqual(wrapper1.Ordering,
- data1IgnoreOrdering
- ? ValueEqualityCollection.OrderMode.Ignore
- : ValueEqualityCollection.OrderMode.Consider);
- Assert.AreEqual(wrapper2.Ordering,
- data2IgnoreOrdering
- ? ValueEqualityCollection.OrderMode.Ignore
- : ValueEqualityCollection.OrderMode.Consider);
- if (data1IgnoreOrdering || data2IgnoreOrdering)
+ foreach (var data2IgnoreOrdering in bools)
{
- AssertEqual(wrapper1, wrapper2);
+ int[] data1 = [1, 2, 3];
+ int[] data2 = [2, 1, 3];
+ var wrapper1 = data1IgnoreOrdering
+ ? data1.AsValueEqualityCollection()
+ : data1.AsOrderedValueEqualityCollection();
+ var wrapper2 = data2IgnoreOrdering
+ ? data2.AsValueEqualityCollection()
+ : data2.AsOrderedValueEqualityCollection();
+ Assert.AreEqual(wrapper1.Ordering,
+ data1IgnoreOrdering
+ ? ValueEqualityCollection.OrderMode.Ignore
+ : ValueEqualityCollection.OrderMode.Consider);
+ Assert.AreEqual(wrapper2.Ordering,
+ data2IgnoreOrdering
+ ? ValueEqualityCollection.OrderMode.Ignore
+ : ValueEqualityCollection.OrderMode.Consider);
+ if (data1IgnoreOrdering || data2IgnoreOrdering)
+ {
+ AssertEqual(wrapper1, wrapper2);
+ }
+ else
+ {
+ AssertEqual(wrapper1, wrapper2, true);
+ }
}
- else
+ }
+ }
+
+ [Test]
+ public void TestRecursiveWrapper()
+ {
+ HashSet data1 = [1, 2, 3];
+ int[] data2 = [2, 1, 3];
+ var wrapper1 = data1.AsValueEqualityCollection().AsValueEqualityCollection();
+ var wrapper2 = data2.AsOrderedValueEqualityCollection();
+ AssertEqual(wrapper1, wrapper2);
+ }
+
+ [Test]
+ public void TestDuplicateElements()
+ {
+ bool[] bools = [true, false];
+ foreach (var data1IgnoreOrdering in bools)
+ {
+ foreach (var data2IgnoreOrdering in bools)
{
+ int[] data1 = [1, 2, 3];
+ int[] data2 = [1, 2, 3, 3];
+ var wrapper1 = data1IgnoreOrdering
+ ? data1.AsValueEqualityCollection()
+ : data1.AsOrderedValueEqualityCollection();
+ var wrapper2 = data2IgnoreOrdering
+ ? data2.AsValueEqualityCollection()
+ : data2.AsOrderedValueEqualityCollection();
+ Assert.AreEqual(wrapper1.Ordering,
+ data1IgnoreOrdering
+ ? ValueEqualityCollection.OrderMode.Ignore
+ : ValueEqualityCollection.OrderMode.Consider);
+ Assert.AreEqual(wrapper2.Ordering,
+ data2IgnoreOrdering
+ ? ValueEqualityCollection.OrderMode.Ignore
+ : ValueEqualityCollection.OrderMode.Consider);
AssertEqual(wrapper1, wrapper2, true);
}
}
}
}
- [Test]
- public void TestRecursiveWrapper()
+ public class Generic
{
- HashSet data1 = [1, 2, 3];
- int[] data2 = [2, 1, 3];
- var wrapper1 = data1.AsValueEqualityCollection().AsValueEqualityCollection();
- var wrapper2 = data2.AsOrderedValueEqualityCollection();
- AssertEqual(wrapper1, wrapper2);
- }
+ private static void AssertEqual(ValueEqualityCollection wrapper1,
+ ValueEqualityCollection wrapper2,
+ bool unequal = false) where T : IEquatable where TCollection : ICollection
+ {
+ if (unequal)
+ {
+ Assert.AreNotEqual(wrapper1, wrapper2);
+ Assert.IsFalse(wrapper1.Equals(wrapper2));
+ Assert.IsFalse(wrapper1 == wrapper2);
+ Assert.IsTrue(wrapper1 != wrapper2);
+ }
+ else
+ {
+ Assert.AreEqual(wrapper1, wrapper2);
+ Assert.IsTrue(wrapper1.Equals(wrapper2));
+ Assert.IsTrue(wrapper1 == wrapper2);
+ Assert.IsFalse(wrapper1 != wrapper2);
+ }
+ }
- [Test]
- public void TestDuplicateElements()
- {
- bool[] bools = [true, false];
- foreach (var data1IgnoreOrdering in bools)
+ [Test]
+ public void TestEqualArraysEqual()
+ {
+ int[] data1 = [1, 2, 3];
+ int[] data2 = [1, 2, 3];
+ var wrapper1 = data1.AsGenericOrderedValueEqualityCollection();
+ var wrapper2 = data2.AsGenericOrderedValueEqualityCollection();
+ AssertEqual(wrapper1, wrapper2);
+ }
+
+ [Test]
+ public void TestConsidersOrderingOfElements()
+ {
+ int[] data1 = [1, 2, 3];
+ int[] data2 = [2, 1, 3];
+ var wrapper1 = data1.AsGenericOrderedValueEqualityCollection();
+ var wrapper2 = data2.AsGenericOrderedValueEqualityCollection();
+ AssertEqual(wrapper1, wrapper2, true);
+ }
+
+ [Test]
+ public void TestHandlesSetsCorrectly()
{
- foreach (var data2IgnoreOrdering in bools)
+ HashSet data1 = [1, 2, 3];
+ HashSet data2 = [2, 1, 3];
+ var wrapper1 = data1.AsGenericValueEqualityCollection>();
+ var wrapper2 = data2.AsGenericValueEqualityCollection>();
+ AssertEqual(wrapper1, wrapper2);
+ }
+
+ [Test]
+ public void TestHandlesSetsMixedWithArraysCorrectly()
+ {
+ HashSet data1 = [1, 2, 3];
+ int[] data2 = [2, 1, 3];
+ var wrapper1 = data1.AsGenericValueEqualityCollection>();
+ var wrapper2 = data2.AsGenericValueEqualityCollection>();
+ AssertEqual(wrapper1, wrapper2);
+ }
+
+ [Test]
+ public void TestIgnoreOrdering()
+ {
+ bool[] bools = [true, false];
+ foreach (var data1IgnoreOrdering in bools)
{
- int[] data1 = [1, 2, 3];
- int[] data2 = [1, 2, 3, 3];
- var wrapper1 = data1IgnoreOrdering
- ? data1.AsValueEqualityCollection()
- : data1.AsOrderedValueEqualityCollection();
- var wrapper2 = data2IgnoreOrdering
- ? data2.AsValueEqualityCollection()
- : data2.AsOrderedValueEqualityCollection();
- Assert.AreEqual(wrapper1.Ordering,
- data1IgnoreOrdering
- ? ValueEqualityCollection.OrderMode.Ignore
- : ValueEqualityCollection.OrderMode.Consider);
- Assert.AreEqual(wrapper2.Ordering,
- data2IgnoreOrdering
- ? ValueEqualityCollection.OrderMode.Ignore
- : ValueEqualityCollection.OrderMode.Consider);
- AssertEqual(wrapper1, wrapper2, true);
+ foreach (var data2IgnoreOrdering in bools)
+ {
+ int[] data1 = [1, 2, 3];
+ int[] data2 = [2, 1, 3];
+ var wrapper1 = data1IgnoreOrdering
+ ? data1.AsGenericValueEqualityCollection()
+ : data1.AsGenericOrderedValueEqualityCollection();
+ var wrapper2 = data2IgnoreOrdering
+ ? data2.AsGenericValueEqualityCollection()
+ : data2.AsGenericOrderedValueEqualityCollection();
+ Assert.AreEqual(wrapper1.Ordering,
+ data1IgnoreOrdering
+ ? ValueEqualityCollection.OrderMode.Ignore
+ : ValueEqualityCollection.OrderMode.Consider);
+ Assert.AreEqual(wrapper2.Ordering,
+ data2IgnoreOrdering
+ ? ValueEqualityCollection.OrderMode.Ignore
+ : ValueEqualityCollection.OrderMode.Consider);
+ if (data1IgnoreOrdering || data2IgnoreOrdering)
+ {
+ AssertEqual(wrapper1, wrapper2);
+ }
+ else
+ {
+ AssertEqual(wrapper1, wrapper2, true);
+ }
+ }
+ }
+ }
+
+ [Test]
+ public void TestRecursiveWrapper()
+ {
+ HashSet data1 = [1, 2, 3];
+ int[] data2 = [2, 1, 3];
+ var wrapper1 = data1.AsGenericValueEqualityCollection>()
+ .AsGenericValueEqualityCollection>();
+ var wrapper2 = data2.AsGenericValueEqualityCollection>();
+ AssertEqual(wrapper1, wrapper2);
+ }
+
+ [Test]
+ public void TestDuplicateElements()
+ {
+ bool[] bools = [true, false];
+ foreach (var data1IgnoreOrdering in bools)
+ {
+ foreach (var data2IgnoreOrdering in bools)
+ {
+ int[] data1 = [1, 2, 3];
+ int[] data2 = [1, 2, 3, 3];
+ var wrapper1 = data1IgnoreOrdering
+ ? data1.AsGenericValueEqualityCollection()
+ : data1.AsGenericOrderedValueEqualityCollection();
+ var wrapper2 = data2IgnoreOrdering
+ ? data2.AsGenericValueEqualityCollection()
+ : data2.AsGenericOrderedValueEqualityCollection();
+ Assert.AreEqual(wrapper1.Ordering,
+ data1IgnoreOrdering
+ ? ValueEqualityCollection.OrderMode.Ignore
+ : ValueEqualityCollection.OrderMode.Consider);
+ Assert.AreEqual(wrapper2.Ordering,
+ data2IgnoreOrdering
+ ? ValueEqualityCollection.OrderMode.Ignore
+ : ValueEqualityCollection.OrderMode.Consider);
+ AssertEqual(wrapper1, wrapper2, true);
+ }
}
}
}