From 24b37ac7113213a9ad0a20e5ae6902c8bd88d604 Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 8 Nov 2026 18:33:39 +0100 Subject: [PATCH] SortedSet in C#: move sample to .NET 10 and MSTest 4.5.2, add comparer, Min/Max and range tests --- .../SortedSetInCSharp.csproj | 2 +- .../SortedSetInCSharp/SortedSetMethods.cs | 45 ++- .../SortedSetInCSharpTests.csproj | 10 +- .../SortedSetInCSharpUnitTests.cs | 369 +++++++++++------- 4 files changed, 255 insertions(+), 171 deletions(-) diff --git a/collections-csharp/SortedSetInCSharp/SortedSetInCSharp/SortedSetInCSharp.csproj b/collections-csharp/SortedSetInCSharp/SortedSetInCSharp/SortedSetInCSharp.csproj index 74abf5c976..dfb40caafc 100644 --- a/collections-csharp/SortedSetInCSharp/SortedSetInCSharp/SortedSetInCSharp.csproj +++ b/collections-csharp/SortedSetInCSharp/SortedSetInCSharp/SortedSetInCSharp.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net10.0 enable enable diff --git a/collections-csharp/SortedSetInCSharp/SortedSetInCSharp/SortedSetMethods.cs b/collections-csharp/SortedSetInCSharp/SortedSetInCSharp/SortedSetMethods.cs index 027bfde0d9..ddd69edadb 100644 --- a/collections-csharp/SortedSetInCSharp/SortedSetInCSharp/SortedSetMethods.cs +++ b/collections-csharp/SortedSetInCSharp/SortedSetInCSharp/SortedSetMethods.cs @@ -1,29 +1,28 @@ -namespace SortedSetInCSharp +namespace SortedSetInCSharp; + +public class SortedSetMethods { - public class SortedSetMethods - { - public SortedSet ProgrammingLanguages() - { - var languages = new SortedSet(); + public SortedSet ProgrammingLanguages() + { + var languages = new SortedSet(); - languages.Add("C"); - languages.Add("C++"); - languages.Add("C#"); - languages.Add("Java"); - languages.Add("Scala"); - languages.Add("TypeScript"); - languages.Add("Python"); - languages.Add("JavaScript"); - languages.Add("Rust"); - - return languages; - } + languages.Add("C"); + languages.Add("C++"); + languages.Add("C#"); + languages.Add("Java"); + languages.Add("Scala"); + languages.Add("TypeScript"); + languages.Add("Python"); + languages.Add("JavaScript"); + languages.Add("Rust"); + + return languages; + } - public SortedSet RemoveElement(SortedSet sortedSet, string valueToRemove) - { - sortedSet.Remove(valueToRemove); + public SortedSet RemoveElement(SortedSet sortedSet, string valueToRemove) + { + sortedSet.Remove(valueToRemove); - return sortedSet; - } + return sortedSet; } } diff --git a/collections-csharp/SortedSetInCSharp/SortedSetInCSharpTests/SortedSetInCSharpTests.csproj b/collections-csharp/SortedSetInCSharp/SortedSetInCSharpTests/SortedSetInCSharpTests.csproj index 414d4ed5b8..515a55bdae 100644 --- a/collections-csharp/SortedSetInCSharp/SortedSetInCSharpTests/SortedSetInCSharpTests.csproj +++ b/collections-csharp/SortedSetInCSharp/SortedSetInCSharpTests/SortedSetInCSharpTests.csproj @@ -1,7 +1,7 @@ - net6.0 + net10.0 enable enable @@ -9,10 +9,10 @@ - - - - + + + + diff --git a/collections-csharp/SortedSetInCSharp/SortedSetInCSharpTests/SortedSetInCSharpUnitTests.cs b/collections-csharp/SortedSetInCSharp/SortedSetInCSharpTests/SortedSetInCSharpUnitTests.cs index 913f180dd2..c29f62c727 100644 --- a/collections-csharp/SortedSetInCSharp/SortedSetInCSharpTests/SortedSetInCSharpUnitTests.cs +++ b/collections-csharp/SortedSetInCSharp/SortedSetInCSharpTests/SortedSetInCSharpUnitTests.cs @@ -1,184 +1,269 @@ using SortedSetInCSharp; -namespace SortedSetInCSharpTests +namespace SortedSetInCSharpTests; + +[TestClass] +public class SortedSetInCSharpUnitTests { - [TestClass] - public class SortedSetInCSharpUnitTests + private readonly SortedSetMethods _sortedSet; + private readonly SortedSet _languages; + + public SortedSetInCSharpUnitTests() { - private readonly SortedSetMethods _sortedSet; - private readonly SortedSet _languages; + _sortedSet = new SortedSetMethods(); + _languages = _sortedSet.ProgrammingLanguages(); + } - public SortedSetInCSharpUnitTests() - { - _sortedSet = new SortedSetMethods(); - _languages = _sortedSet.ProgrammingLanguages(); - } + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyCountAndContains() + { + Assert.IsInstanceOfType(_languages, typeof(SortedSet)); + Assert.AreEqual(9, _languages.Count); + Assert.IsTrue(_languages.Contains("Java")); + Assert.AreEqual("C", _languages.First()); + } - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyCountAndContains() - { - Assert.IsInstanceOfType(_languages, typeof(SortedSet)); - Assert.AreEqual(_languages.Count(), 9); - Assert.IsTrue(_languages.Contains("Java")); - Assert.AreEqual(_languages.First(), "C"); - } - - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyHasNoDuplicates() - { - _languages.Add("C"); - _languages.Add("C++"); - _languages.Add("C#"); + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyHasNoDuplicates() + { + _languages.Add("C"); + _languages.Add("C++"); + _languages.Add("C#"); - Assert.IsInstanceOfType(_languages, typeof(SortedSet)); - Assert.AreEqual(_languages.Count(), 9); - } + Assert.IsInstanceOfType(_languages, typeof(SortedSet)); + Assert.AreEqual(9, _languages.Count); + } - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyOverlapsSuccessful() - { - var commonLanguages = new SortedSet { "C", "C++", "C#", "Java", "Scala", "TypeScript", "Python", "JavaScript", "Rust", "Assembly", "Pascal" }; - var differentLanguages = new SortedSet { "Assembly", "Pascal", "HTML", "CSS", "PHP" }; + [TestMethod] + public void GivenASortedSet_WhenAddingADuplicate_ThenAddReturnsFalse() + { + Assert.IsFalse(_languages.Add("Java")); + Assert.IsTrue(_languages.Add("Go")); + } - Assert.IsTrue(commonLanguages.Overlaps(_languages)); - Assert.IsTrue(differentLanguages.Overlaps(commonLanguages)); - Assert.IsFalse(differentLanguages.Overlaps(_languages)); - } + [TestMethod] + public void GivenASortedSetOfStrings_WhenAddingNull_ThenNullIsTheFirstElement() + { + SortedSet languages = new(_languages); - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyAnElementRemoved() + Assert.IsTrue(languages.Add(null)); + Assert.IsFalse(languages.Add(null)); + Assert.AreEqual(10, languages.Count); + Assert.IsNull(languages.Min); + } + + [TestMethod] + public void GivenAComparerByYear_WhenTwoLanguagesShareAYear_ThenTheSecondIsDropped() + { + var byYear = Comparer<(string Name, int Year)>.Create( + (x, y) => x.Year.CompareTo(y.Year)); + + var languages = new SortedSet<(string Name, int Year)>(byYear) { - var elementToRemove = "Java"; + ("Python", 1991), ("Java", 1995), ("C", 1972), ("JavaScript", 1995) + }; - var updatedLanguages = _sortedSet.RemoveElement(_languages, elementToRemove); + Assert.AreEqual(3, languages.Count); + Assert.AreEqual(("C", 1972), languages.Min); + Assert.IsFalse(languages.Any(l => l.Name == "JavaScript")); + } - Assert.IsFalse(updatedLanguages.Contains(elementToRemove)); - Assert.AreEqual(_languages.Count(), 8); - } + [TestMethod] + public void GivenAComparerByYearThenName_WhenTwoLanguagesShareAYear_ThenBothAreKept() + { + var byYearThenName = Comparer<(string Name, int Year)>.Create( + (x, y) => x.Year != y.Year + ? x.Year.CompareTo(y.Year) + : string.CompareOrdinal(x.Name, y.Name)); - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyRemoveWhereWorks() + var languages = new SortedSet<(string Name, int Year)>(byYearThenName) { - _languages.RemoveWhere(element => element.StartsWith("C")); + ("Python", 1991), ("Java", 1995), ("C", 1972), ("JavaScript", 1995) + }; - Assert.IsFalse(_languages.Contains("C")); - Assert.IsFalse(_languages.Contains("C++")); - Assert.IsFalse(_languages.Contains("C#")); - } + Assert.AreEqual(4, languages.Count); + Assert.AreEqual(("JavaScript", 1995), languages.Max); + } - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyElementsReversed() - { - var reversedSet = _languages.Reverse(); - var firstElement = reversedSet.First(); - var lastElement = reversedSet.Last(); + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyMinAndMax() + { + Assert.AreEqual("C", _languages.Min); + Assert.AreEqual("TypeScript", _languages.Max); + } - Assert.IsInstanceOfType(reversedSet, typeof(IEnumerable)); - Assert.AreEqual(firstElement, "TypeScript"); - Assert.AreEqual(lastElement, "C"); - } + [TestMethod] + public void GivenASortedSet_WhenGettingAViewBetweenTwoValues_ThenTheViewTracksTheSet() + { + var view = _languages.GetViewBetween("C", "Java"); - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyAllElementsCleared() - { - _languages.Clear(); + CollectionAssert.AreEqual(new[] { "C", "C#", "C++", "Java" }, view.ToArray()); - Assert.AreEqual(0, _languages.Count()); - Assert.IsNull(_languages.FirstOrDefault()); - } + _languages.Add("Go"); + view.Add("F#"); - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyAllElementsCopied() - { - var languagesArray = new string[9]; + CollectionAssert.AreEqual(new[] { "C", "C#", "C++", "F#", "Go", "Java" }, view.ToArray()); + Assert.IsTrue(_languages.Contains("F#")); + Assert.ThrowsExactly(() => view.Add("Rust")); + } - _languages.CopyTo(languagesArray); + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyOverlapsSuccessful() + { + var commonLanguages = new SortedSet { "C", "C++", "C#", "Java", "Scala", "TypeScript", "Python", "JavaScript", "Rust", "Assembly", "Pascal" }; + var differentLanguages = new SortedSet { "Assembly", "Pascal", "HTML", "CSS", "PHP" }; - Assert.AreEqual(languagesArray.Count(), 9); - Assert.AreEqual(languagesArray[0], "C"); - Assert.AreEqual(languagesArray[8], "TypeScript"); - Assert.IsNotNull(languagesArray); - } + Assert.IsTrue(commonLanguages.Overlaps(_languages)); + Assert.IsTrue(differentLanguages.Overlaps(commonLanguages)); + Assert.IsFalse(differentLanguages.Overlaps(_languages)); + } - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyProperSubset() - { - var moreLanguages = new SortedSet { "C", "C++", "C#", "Java", "Scala", "TypeScript", "Python", "JavaScript", "Rust", "Assembly", "Pascal" }; + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyAnElementRemoved() + { + var elementToRemove = "Java"; - Assert.IsTrue(_languages.IsSubsetOf(moreLanguages)); - Assert.IsTrue(_languages.IsProperSubsetOf(moreLanguages)); - Assert.IsTrue(moreLanguages.IsSupersetOf(_languages)); - Assert.IsTrue(moreLanguages.IsProperSupersetOf(_languages)); - } + var updatedLanguages = _sortedSet.RemoveElement(_languages, elementToRemove); - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyUnionWithSuccessful() - { - var moreLanguages = new SortedSet { "Assembly", "Pascal", "HTML", "CSS", "PHP" }; + Assert.IsFalse(updatedLanguages.Contains(elementToRemove)); + Assert.AreEqual(8, _languages.Count); + } - _languages.UnionWith(moreLanguages); + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyRemoveWhereWorks() + { + _languages.RemoveWhere(element => element.StartsWith("C")); - Assert.AreEqual(_languages.Count(), 14); - } + Assert.IsFalse(_languages.Contains("C")); + Assert.IsFalse(_languages.Contains("C++")); + Assert.IsFalse(_languages.Contains("C#")); + } - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifyIntersectWithSuccessful() - { - var moreLanguages = new SortedSet { "C", "C++", "C#", "Java", "Scala", "Assembly", "Pascal", "HTML", "CSS", "PHP" }; + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyElementsReversed() + { + var reversedSet = _languages.Reverse(); + var firstElement = reversedSet.First(); + var lastElement = reversedSet.Last(); - _languages.IntersectWith(moreLanguages); + Assert.IsInstanceOfType(reversedSet, typeof(IEnumerable)); + Assert.AreEqual("TypeScript", firstElement); + Assert.AreEqual("C", lastElement); + } - Assert.AreEqual(_languages.Count(), 5); - Assert.IsTrue(_languages.Contains("C")); - Assert.IsTrue(_languages.Contains("C++")); - Assert.IsTrue(_languages.Contains("C#")); - Assert.IsTrue(_languages.Contains("Java")); - Assert.IsTrue(_languages.Contains("Scala")); - Assert.IsFalse(_languages.Contains("Assembly")); - } + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyAllElementsCleared() + { + _languages.Clear(); - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_ExceptWithSuccessful() - { - var moreLanguages = new SortedSet { "C", "C++", "C#", "Java", "Scala", "Assembly", "Pascal", "HTML", "CSS", "PHP" }; + Assert.AreEqual(0, _languages.Count); + Assert.IsNull(_languages.FirstOrDefault()); + } - _languages.ExceptWith(moreLanguages); + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyAllElementsCopied() + { + var languagesArray = new string[9]; - Assert.AreEqual(_languages.Count(), 4); - Assert.IsTrue(_languages.Contains("TypeScript")); - Assert.IsTrue(_languages.Contains("Python")); - Assert.IsTrue(_languages.Contains("JavaScript")); - Assert.IsTrue(_languages.Contains("Rust")); - Assert.IsFalse(_languages.Contains("Assembly")); - } + _languages.CopyTo(languagesArray); - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifySetEqualsSuccessful() - { - var moreLanguages = new SortedSet { "Assembly", "Pascal", "HTML", "CSS", "PHP" }; - var languagesCopy = _languages; + Assert.AreEqual(9, languagesArray.Length); + Assert.AreEqual("C", languagesArray[0]); + Assert.AreEqual("TypeScript", languagesArray[8]); + Assert.IsNotNull(languagesArray); + } - Assert.IsFalse(_languages.SetEquals(moreLanguages)); - Assert.IsTrue(_languages.SetEquals(languagesCopy)); - } + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyProperSubset() + { + var moreLanguages = new SortedSet { "C", "C++", "C#", "Java", "Scala", "TypeScript", "Python", "JavaScript", "Rust", "Assembly", "Pascal" }; - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_VerifySymmetricExceptWithSuccessful() - { - var moreLanguages = new SortedSet { "Assembly", "Pascal", "HTML", "CSS", "PHP" }; + Assert.IsTrue(_languages.IsSubsetOf(moreLanguages)); + Assert.IsTrue(_languages.IsProperSubsetOf(moreLanguages)); + Assert.IsTrue(moreLanguages.IsSupersetOf(_languages)); + Assert.IsTrue(moreLanguages.IsProperSupersetOf(_languages)); + } - _languages.SymmetricExceptWith(moreLanguages); + [TestMethod] + public void GivenTwoEqualSets_WhenCheckingSubsets_ThenOnlyTheNonProperChecksPass() + { + var sameLanguages = new SortedSet(_languages); + + Assert.IsTrue(_languages.IsSubsetOf(sameLanguages)); + Assert.IsFalse(_languages.IsProperSubsetOf(sameLanguages)); + } + + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyUnionWithSuccessful() + { + var moreLanguages = new SortedSet { "Assembly", "Pascal", "HTML", "CSS", "PHP" }; - Assert.AreEqual(_languages.Count(), 14); - } + _languages.UnionWith(moreLanguages); + + Assert.AreEqual(14, _languages.Count); + } + + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifyIntersectWithSuccessful() + { + var moreLanguages = new SortedSet { "C", "C++", "C#", "Java", "Scala", "Assembly", "Pascal", "HTML", "CSS", "PHP" }; - [TestMethod] - public void GivenASortedSet_WhenNotEmpty_TryToGetValue() + _languages.IntersectWith(moreLanguages); + + Assert.AreEqual(5, _languages.Count); + Assert.IsTrue(_languages.Contains("C")); + Assert.IsTrue(_languages.Contains("C++")); + Assert.IsTrue(_languages.Contains("C#")); + Assert.IsTrue(_languages.Contains("Java")); + Assert.IsTrue(_languages.Contains("Scala")); + Assert.IsFalse(_languages.Contains("Assembly")); + } + + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_ExceptWithSuccessful() + { + var moreLanguages = new SortedSet { "C", "C++", "C#", "Java", "Scala", "Assembly", "Pascal", "HTML", "CSS", "PHP" }; + + _languages.ExceptWith(moreLanguages); + + Assert.AreEqual(4, _languages.Count); + Assert.IsTrue(_languages.Contains("TypeScript")); + Assert.IsTrue(_languages.Contains("Python")); + Assert.IsTrue(_languages.Contains("JavaScript")); + Assert.IsTrue(_languages.Contains("Rust")); + Assert.IsFalse(_languages.Contains("Assembly")); + } + + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifySetEqualsSuccessful() + { + var moreLanguages = new SortedSet { "Assembly", "Pascal", "HTML", "CSS", "PHP" }; + var sameLanguagesInAList = new List { - Assert.IsTrue(_languages.TryGetValue("C#", out _)); - Assert.IsTrue(_languages.Contains("C#")); - Assert.IsFalse(_languages.TryGetValue("Assembly", out _)); - Assert.IsFalse(_languages.Contains("Assembly")); - } + "Rust", "Java", "C", "C#", "C++", "Scala", "TypeScript", "Python", "JavaScript", "Java" + }; + + Assert.IsFalse(_languages.SetEquals(moreLanguages)); + Assert.IsTrue(_languages.SetEquals(sameLanguagesInAList)); + } + + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_VerifySymmetricExceptWithSuccessful() + { + var moreLanguages = new SortedSet { "Assembly", "Pascal", "HTML", "CSS", "PHP" }; + + _languages.SymmetricExceptWith(moreLanguages); + + Assert.AreEqual(14, _languages.Count); + } + + [TestMethod] + public void GivenASortedSet_WhenNotEmpty_TryToGetValue() + { + Assert.IsTrue(_languages.TryGetValue("C#", out var found)); + Assert.AreEqual("C#", found); + Assert.IsTrue(_languages.Contains("C#")); + Assert.IsFalse(_languages.TryGetValue("Assembly", out _)); + Assert.IsFalse(_languages.Contains("Assembly")); } -} \ No newline at end of file +}