From 51f7fd5e83cc6bacf452e3abcb4074abf373ae2a Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Tue, 28 Jan 2025 20:10:48 +0100 Subject: [PATCH] Lifetime: new equality model for Eternal and default values --- rd-net/Lifetimes/Lifetimes/Lifetime.cs | 9 ++- .../Test.Lifetimes/Lifetimes/LifetimeTest.cs | 72 +++++++++++++++---- 2 files changed, 64 insertions(+), 17 deletions(-) diff --git a/rd-net/Lifetimes/Lifetimes/Lifetime.cs b/rd-net/Lifetimes/Lifetimes/Lifetime.cs index f7d2c272..f3920f35 100644 --- a/rd-net/Lifetimes/Lifetimes/Lifetime.cs +++ b/rd-net/Lifetimes/Lifetimes/Lifetime.cs @@ -1165,7 +1165,7 @@ [PublicAPI] public Lifetime CreateTerminatedAfter(TimeSpan timeSpan, TaskSchedul public static bool operator ==(Lifetime left, Lifetime right) { - return ReferenceEquals(left.Definition, right.Definition); + return left.Equals(right); } public static bool operator !=(Lifetime left, Lifetime right) @@ -1175,6 +1175,11 @@ [PublicAPI] public Lifetime CreateTerminatedAfter(TimeSpan timeSpan, TaskSchedul public bool Equals(Lifetime other) { + if (LogErrorIfLifetimeIsNotInitialized) + { + return ReferenceEquals(myDefinition, other.myDefinition); + } + return ReferenceEquals(Definition, other.Definition); } @@ -1186,7 +1191,7 @@ public override bool Equals(object? obj) public override int GetHashCode() { - return Definition.GetHashCode(); + return myDefinition?.GetHashCode() ?? 0; } #endregion diff --git a/rd-net/Test.Lifetimes/Lifetimes/LifetimeTest.cs b/rd-net/Test.Lifetimes/Lifetimes/LifetimeTest.cs index eae8a71d..dfd4d670 100644 --- a/rd-net/Test.Lifetimes/Lifetimes/LifetimeTest.cs +++ b/rd-net/Test.Lifetimes/Lifetimes/LifetimeTest.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Text; using System.Threading; using System.Threading.Tasks; using JetBrains.Core; @@ -152,24 +151,59 @@ public void TestEternal() [Test] public void TestEquals() { - var old = Lifetime.LogErrorIfLifetimeIsNotInitialized; - Lifetime.LogErrorIfLifetimeIsNotInitialized = false; + var oldValue = Lifetime.LogErrorIfLifetimeIsNotInitialized; try { - Lifetime eternal = default; - Assert.AreEqual(Lifetime.Eternal, eternal); - Assert.AreEqual(Lifetime.Eternal, Lifetime.Eternal); - Assert.AreEqual(eternal, eternal); - - Assert.True(Lifetime.Eternal == eternal); + Lifetime.LogErrorIfLifetimeIsNotInitialized = false; + DoChecks(false); - Assert.AreNotEqual(Lifetime.Eternal, Lifetime.Terminated); - Assert.False(Lifetime.Eternal == Lifetime.Terminated); - Assert.False(eternal == Lifetime.Terminated); + Lifetime.LogErrorIfLifetimeIsNotInitialized = true; + DoChecks(true); } finally { - Lifetime.LogErrorIfLifetimeIsNotInitialized = old; + Lifetime.LogErrorIfLifetimeIsNotInitialized = oldValue; + } + + [SuppressMessage("ReSharper", "EqualExpressionComparison")] + void DoChecks(bool newDefaultBehaviorFlag) + { + Assert.AreEqual(Lifetime.LogErrorIfLifetimeIsNotInitialized, newDefaultBehaviorFlag); + + Lifetime defaultLifetime = default; + + // Checks that are always true: + Assert.AreEqual(defaultLifetime, defaultLifetime); + Assert.AreEqual(Lifetime.Eternal, Lifetime.Eternal); + Assert.AreEqual(Lifetime.Terminated, Lifetime.Terminated); + Assert.AreNotEqual(Lifetime.Eternal, Lifetime.Terminated); + Assert.AreNotEqual(defaultLifetime, Lifetime.Terminated); + + Assert.True(defaultLifetime == defaultLifetime); + Assert.True(Lifetime.Eternal == Lifetime.Eternal); + Assert.True(Lifetime.Terminated == Lifetime.Terminated); + Assert.False(Lifetime.Eternal == Lifetime.Terminated); + Assert.False(defaultLifetime == Lifetime.Terminated); + + Assert.False(defaultLifetime != defaultLifetime); + Assert.False(Lifetime.Eternal != Lifetime.Eternal); + Assert.False(Lifetime.Terminated != Lifetime.Terminated); + Assert.True(Lifetime.Eternal != Lifetime.Terminated); + Assert.True(defaultLifetime != Lifetime.Terminated); + + // Checks depending on the state of the flag: + if (newDefaultBehaviorFlag) + { + Assert.AreNotEqual(defaultLifetime, Lifetime.Eternal); + Assert.False(defaultLifetime == Lifetime.Eternal); + Assert.True(defaultLifetime != Lifetime.Eternal); + } + else + { + Assert.AreEqual(defaultLifetime, Lifetime.Eternal); + Assert.True(defaultLifetime == Lifetime.Eternal); + Assert.False(defaultLifetime != Lifetime.Eternal); + } } } @@ -179,6 +213,14 @@ public void TestTerminated() Assert.True(Lifetime.Terminated.Status == LifetimeStatus.Terminated); } + [Test] + public void TestGetHashCode() + { + _ = Lifetime.Eternal.GetHashCode(); + _ = Lifetime.Terminated.GetHashCode(); + _ = ((Lifetime)default).GetHashCode(); + } + [Test] public void TestRecursiveTermination() @@ -1147,7 +1189,7 @@ public void T020_DefineNestedOrder() Assert.IsFalse(flag, "Nested closed twice."); - CollectionAssert.AreEqual(System.Linq.Enumerable.Range(0, entries.Count).Reverse().ToArray(), entries, "Order FAIL."); + CollectionAssert.AreEqual(Enumerable.Range(0, entries.Count).Reverse().ToArray(), entries, "Order FAIL."); }