diff --git a/src/QuikGraph/Structures/Edges/UndirectedEdge.cs b/src/QuikGraph/Structures/Edges/UndirectedEdge.cs index bfced45ea..b4b8984aa 100644 --- a/src/QuikGraph/Structures/Edges/UndirectedEdge.cs +++ b/src/QuikGraph/Structures/Edges/UndirectedEdge.cs @@ -23,20 +23,28 @@ public class UndirectedEdge : IUndirectedEdge /// The target vertex. /// is . /// is . - /// - /// is not lower than when using . - /// public UndirectedEdge([NotNull] TVertex source, [NotNull] TVertex target) { if (source == null) throw new ArgumentNullException(nameof(source)); if (target == null) throw new ArgumentNullException(nameof(target)); + + TVertex orderedSource; + TVertex orderedTarget; if (Comparer.Default.Compare(source, target) > 0) - throw new ArgumentException($"{nameof(source)} must be lower than {nameof(target)} in {GetType().Name}."); + { + orderedSource = target; + orderedTarget = source; + } + else + { + orderedSource = source; + orderedTarget = target; + } - Source = source; - Target = target; + Source = orderedSource; + Target = orderedTarget; } /// diff --git a/tests/QuikGraph.Tests/Structures/Edges/EquatableUndirectedEdgeTests.cs b/tests/QuikGraph.Tests/Structures/Edges/EquatableUndirectedEdgeTests.cs index 53a01dc56..168638f49 100644 --- a/tests/QuikGraph.Tests/Structures/Edges/EquatableUndirectedEdgeTests.cs +++ b/tests/QuikGraph.Tests/Structures/Edges/EquatableUndirectedEdgeTests.cs @@ -21,6 +21,15 @@ public void Construction() var v2 = new ComparableTestVertex("v2"); CheckEdge(new EquatableUndirectedEdge(v1, v2), v1, v2); CheckEdge(new EquatableUndirectedEdge(v1, v1), v1, v1); + + // Order correctly on creation + CheckEdge(new EquatableUndirectedEdge(2, 1), 1, 2); + + // Comparable + var comparableV1 = new ComparableTestVertex("v1"); + var comparableV2 = new ComparableTestVertex("v2"); + CheckEdge(new EquatableUndirectedEdge(comparableV2, comparableV1), comparableV1, + comparableV2); } [Test] @@ -28,21 +37,17 @@ public void Construction_Throws() { // ReSharper disable ObjectCreationAsStatement // ReSharper disable AssignNullToNotNullAttribute - Assert.Throws(() => new EquatableUndirectedEdge(null, new TestVertex("v1"))); - Assert.Throws(() => new EquatableUndirectedEdge(new TestVertex("v1"), null)); + Assert.Throws(() => + new EquatableUndirectedEdge(null, new TestVertex("v1"))); + Assert.Throws(() => + new EquatableUndirectedEdge(new TestVertex("v1"), null)); Assert.Throws(() => new EquatableUndirectedEdge(null, null)); // ReSharper restore AssignNullToNotNullAttribute - Assert.Throws(() => new EquatableUndirectedEdge(2, 1)); - // Not comparable var v1 = new TestVertex("v1"); var v2 = new TestVertex("v2"); Assert.Throws(() => new EquatableUndirectedEdge(v1, v2)); - - var comparableV1 = new ComparableTestVertex("v1"); - var comparableV2 = new ComparableTestVertex("v2"); - Assert.Throws(() => new EquatableUndirectedEdge(comparableV2, comparableV1)); // ReSharper restore ObjectCreationAsStatement } diff --git a/tests/QuikGraph.Tests/Structures/Edges/TaggedUndirectedEdgeTests.cs b/tests/QuikGraph.Tests/Structures/Edges/TaggedUndirectedEdgeTests.cs index 5ababf8d7..da31c4b21 100644 --- a/tests/QuikGraph.Tests/Structures/Edges/TaggedUndirectedEdgeTests.cs +++ b/tests/QuikGraph.Tests/Structures/Edges/TaggedUndirectedEdgeTests.cs @@ -25,6 +25,16 @@ public void Construction() CheckTaggedEdge(new TaggedUndirectedEdge(v1, v2, null), v1, v2, (TestObject)null); CheckTaggedEdge(new TaggedUndirectedEdge(v1, v1, null), v1, v1, (TestObject)null); CheckTaggedEdge(new TaggedUndirectedEdge(v1, v2, tag), v1, v2, tag); + + // Order correctly on creation + CheckTaggedEdge(new TaggedUndirectedEdge(2, 1, null), 1, 2, (TestObject)null); + + // Comparable + var comparableV1 = new ComparableTestVertex("v1"); + var comparableV2 = new ComparableTestVertex("v2"); + CheckTaggedEdge( + new TaggedUndirectedEdge(comparableV2, comparableV1, null), + comparableV1, comparableV2, (TestObject)null); } [Test] @@ -32,21 +42,19 @@ public void Construction_Throws() { // ReSharper disable ObjectCreationAsStatement // ReSharper disable AssignNullToNotNullAttribute - Assert.Throws(() => new TaggedUndirectedEdge(null, new TestVertex("v1"), null)); - Assert.Throws(() => new TaggedUndirectedEdge(new TestVertex("v1"), null, null)); - Assert.Throws(() => new TaggedUndirectedEdge(null, null, null)); + Assert.Throws(() => + new TaggedUndirectedEdge(null, new TestVertex("v1"), null)); + Assert.Throws(() => + new TaggedUndirectedEdge(new TestVertex("v1"), null, null)); + Assert.Throws(() => + new TaggedUndirectedEdge(null, null, null)); // ReSharper restore AssignNullToNotNullAttribute - Assert.Throws(() => new TaggedUndirectedEdge(2, 1, null)); - // Not comparable var v1 = new TestVertex("v1"); var v2 = new TestVertex("v2"); Assert.Throws(() => new TaggedUndirectedEdge(v1, v2, null)); - var comparableV1 = new ComparableTestVertex("v1"); - var comparableV2 = new ComparableTestVertex("v2"); - Assert.Throws(() => new TaggedUndirectedEdge(comparableV2, comparableV1, null)); // ReSharper restore ObjectCreationAsStatement } diff --git a/tests/QuikGraph.Tests/Structures/Edges/UndirectedEdgeTests.cs b/tests/QuikGraph.Tests/Structures/Edges/UndirectedEdgeTests.cs index cef15d3b1..1df33593a 100644 --- a/tests/QuikGraph.Tests/Structures/Edges/UndirectedEdgeTests.cs +++ b/tests/QuikGraph.Tests/Structures/Edges/UndirectedEdgeTests.cs @@ -21,6 +21,14 @@ public void Construction() var v2 = new ComparableTestVertex("v2"); CheckEdge(new UndirectedEdge(v1, v2), v1, v2); CheckEdge(new UndirectedEdge(v1, v1), v1, v1); + + // Order correctly on creation + CheckEdge(new UndirectedEdge(2, 1), 1, 2); + + // Comparable + var comparableV1 = new ComparableTestVertex("v1"); + var comparableV2 = new ComparableTestVertex("v2"); + CheckEdge(new UndirectedEdge(comparableV2, comparableV1), comparableV1, comparableV2); } [Test] @@ -33,16 +41,11 @@ public void Construction_Throws() Assert.Throws(() => new UndirectedEdge(null, null)); // ReSharper restore AssignNullToNotNullAttribute - Assert.Throws(() => new UndirectedEdge(2, 1)); // Not comparable var v1 = new TestVertex("v1"); var v2 = new TestVertex("v2"); Assert.Throws(() => new UndirectedEdge(v1, v2)); - - var comparableV1 = new ComparableTestVertex("v1"); - var comparableV2 = new ComparableTestVertex("v2"); - Assert.Throws(() => new UndirectedEdge(comparableV2, comparableV1)); // ReSharper restore ObjectCreationAsStatement }