Skip to content

Commit 7f6610a

Browse files
HashSet: retarget net10.0, fix IsOdd for negatives, seed Random, correct assertions (#2185)
- Retarget HashSetInCSharp and HashSetInCSharpTests from net6.0 to net10.0. - Bump test packages: Microsoft.NET.Test.Sdk 17.1.0 -> 18.9.0, coverlet.collector 3.1.2 -> 10.0.1, and replace MSTest.TestAdapter/MSTest.TestFramework 2.2.8 with the MSTest 4.3.3 meta-package. - IsOdd() returned false for negative odd numbers, because -3 % 2 is -1 in C#. Use num % 2 != 0. - RandomInts() used an unseeded Random, so GivenAHashSet_WhenNotEmpty_VerifyNoOddElements could call First() on an empty set. Seed it (default 42) so the run is repeatable. - Assert.AreEqual takes (expected, actual); the tests passed the actual value first, so every failure message reported the two the wrong way round. Swapped throughout. - Count() is the LINQ extension on IEnumerable<T>; HashSet<T> exposes Count as a property. Use the property. - Rename the HashSetsInCSharpMethods field from hashSet to _methods (private readonly); it is not a HashSet. - Add CreateFromList() (ToHashSet()) and CreateCaseInsensitive() (the IEnumerable<T> plus IEqualityComparer<T> constructor overload), with tests, plus a test covering IsOdd() on negative input.
1 parent 2c46cf6 commit 7f6610a

4 files changed

Lines changed: 76 additions & 34 deletions

File tree

‎collections-csharp/HashSetInCSharp/HashSetInCSharp/HashSetInCSharp.csproj‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net6.0</TargetFramework>
5+
<TargetFramework>net10.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>

‎collections-csharp/HashSetInCSharp/HashSetInCSharp/HashSetsInCSharpMethods.cs‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,23 @@ public List<int> CreateList(HashSet<int> hashSet)
4545
return list;
4646
}
4747

48-
public HashSet<int> RandomInts(int size)
48+
public HashSet<string> CreateFromList(List<string> languageList)
4949
{
50-
var rand = new Random();
50+
var fromList = languageList.ToHashSet();
51+
52+
return fromList;
53+
}
54+
55+
public HashSet<string> CreateCaseInsensitive(List<string> languageList)
56+
{
57+
var caseInsensitive = new HashSet<string>(languageList, StringComparer.OrdinalIgnoreCase);
58+
59+
return caseInsensitive;
60+
}
61+
62+
public HashSet<int> RandomInts(int size, int seed = 42)
63+
{
64+
var rand = new Random(seed);
5165
var numbers = new HashSet<int>();
5266

5367
for (int i = 0; i < size; i++)
@@ -60,7 +74,7 @@ public HashSet<int> RandomInts(int size)
6074

6175
public bool IsOdd(int num)
6276
{
63-
return num % 2 == 1;
77+
return num % 2 != 0;
6478
}
6579
}
6680
}

‎collections-csharp/HashSetInCSharp/HashSetInCSharpTests/HashSetInCSharpTests.csproj‎

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net6.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77

88
<IsPackable>false</IsPackable>
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
13-
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
14-
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
15-
<PackageReference Include="coverlet.collector" Version="3.1.2" />
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.9.0" />
13+
<PackageReference Include="MSTest" Version="4.3.3" />
14+
<PackageReference Include="coverlet.collector" Version="10.0.1" />
1615
</ItemGroup>
1716

1817
<ItemGroup>

‎collections-csharp/HashSetInCSharp/HashSetInCSharpTests/HashSetInCSharpUnitTests.cs‎

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ namespace HashSetInCSharpTests
55
[TestClass]
66
public class HashSetInCSharpUnitTests
77
{
8-
HashSetsInCSharpMethods hashSet = new HashSetsInCSharpMethods();
9-
private readonly HashSet<string> _languages;
8+
private readonly HashSetsInCSharpMethods _methods = new HashSetsInCSharpMethods();
9+
private readonly HashSet<string> _languages;
1010

1111
public HashSetInCSharpUnitTests()
1212
{
13-
_languages = hashSet.ProgrammingLanguages();
13+
_languages = _methods.ProgrammingLanguages();
1414
}
1515

1616
[TestMethod]
1717
public void GivenAHashSet_WhenNotEmpty_VerifyCountAndContains()
1818
{
1919
Assert.IsInstanceOfType(_languages, typeof(HashSet<string>));
20-
Assert.AreEqual(_languages.Count(), 9);
20+
Assert.AreEqual(9, _languages.Count);
2121
Assert.IsTrue(_languages.Contains("C#"));
2222
}
2323

@@ -27,63 +27,92 @@ public void GivenAHashSet_WhenNotEmpty_VerifyHasNoDuplicates()
2727
_languages.Add("C");
2828
_languages.Add("C++");
2929
_languages.Add("C#");
30-
30+
3131
Assert.IsInstanceOfType(_languages, typeof(HashSet<string>));
32-
Assert.AreEqual(_languages.Count(), 9);
32+
Assert.AreEqual(9, _languages.Count);
3333
}
3434

3535
[TestMethod]
3636
public void GivenAHashSet_WhenNotEmpty_VerifyAnElementRemoved()
3737
{
3838
var elementToRemove = "Java";
3939

40-
var updatedLanguages = hashSet.RemoveElement(_languages, elementToRemove);
40+
var updatedLanguages = _methods.RemoveElement(_languages, elementToRemove);
4141

4242
Assert.IsFalse(updatedLanguages.Contains(elementToRemove));
43-
Assert.AreEqual(_languages.Count(), 8);
43+
Assert.AreEqual(8, _languages.Count);
4444
}
4545

4646
[TestMethod]
4747
public void GivenAHashSet_WhenNotEmpty_VerifyNoOddElements()
4848
{
49-
var numbers = hashSet.RandomInts(100);
49+
var numbers = _methods.RandomInts(100);
5050
var oddNumbers = new HashSet<int>();
5151

52-
foreach (var item in numbers)
52+
foreach (var item in numbers)
5353
{
54-
if (hashSet.IsOdd(item) == true)
54+
if (_methods.IsOdd(item) == true)
5555
{
5656
oddNumbers.Add(item);
5757
}
5858
}
5959

60-
hashSet.RemoveWhereElement(numbers);
60+
_methods.RemoveWhereElement(numbers);
6161
var testValue = oddNumbers.First();
62-
var checkValue = hashSet.IsOdd(testValue);
63-
62+
var checkValue = _methods.IsOdd(testValue);
63+
6464
Assert.IsTrue(checkValue);
6565
Assert.IsFalse(oddNumbers.IsSubsetOf(numbers));
66-
Assert.AreEqual(numbers.Union(oddNumbers).Count(), 100);
66+
Assert.AreEqual(100, numbers.Union(oddNumbers).Count());
6767
}
6868

6969
[TestMethod]
7070
public void GivenAHashSet_WhenNotEmpty_VerifyAllElementsCleared()
7171
{
7272
_languages.Clear();
7373

74-
Assert.AreEqual(0, _languages.Count());
74+
Assert.AreEqual(0, _languages.Count);
7575
Assert.IsNull(_languages.FirstOrDefault());
7676
}
7777

7878
[TestMethod]
7979
public void GivenAHashSet_WhenNotEmpty_VerifyListPopulated()
8080
{
81-
var numbers = hashSet.RandomInts(100);
81+
var numbers = _methods.RandomInts(100);
8282

83-
var numbersList = hashSet.CreateList(numbers);
83+
var numbersList = _methods.CreateList(numbers);
8484

8585
CollectionAssert.AllItemsAreInstancesOfType(numbersList, typeof(int));
86-
Assert.AreEqual(numbersList.Count(), numbers.Count());
86+
Assert.AreEqual(numbers.Count, numbersList.Count);
87+
}
88+
89+
[TestMethod]
90+
public void GivenAList_WhenConvertedWithToHashSet_ThenDuplicatesAreDropped()
91+
{
92+
var languageList = new List<string> { "C#", "F#", "C#", "VB" };
93+
94+
var fromList = _methods.CreateFromList(languageList);
95+
96+
Assert.AreEqual(3, fromList.Count);
97+
Assert.IsTrue(fromList.Contains("C#"));
98+
}
99+
100+
[TestMethod]
101+
public void GivenAList_WhenBuiltWithAnOrdinalIgnoreCaseComparer_ThenCasingDoesNotCreateDuplicates()
102+
{
103+
var languageList = new List<string> { "C#", "c#", "F#" };
104+
105+
var caseInsensitive = _methods.CreateCaseInsensitive(languageList);
106+
107+
Assert.AreEqual(2, caseInsensitive.Count);
108+
Assert.IsTrue(caseInsensitive.Contains("c#"));
109+
}
110+
111+
[TestMethod]
112+
public void GivenANegativeNumber_WhenOdd_VerifyIsOddIsTrue()
113+
{
114+
Assert.IsTrue(_methods.IsOdd(-3));
115+
Assert.IsFalse(_methods.IsOdd(-4));
87116
}
88117

89118
[TestMethod]
@@ -103,7 +132,7 @@ public void GivenAHashSet_WhenNotEmpty_VerifyUnionWithSuccessful()
103132
var moreLanguages = new HashSet<string> { "Assembly", "Pascal", "HTML", "CSS", "PHP" };
104133

105134
_languages.UnionWith(moreLanguages);
106-
Assert.AreEqual(_languages.Count(), 14);
135+
Assert.AreEqual(14, _languages.Count);
107136
}
108137

109138
[TestMethod]
@@ -113,7 +142,7 @@ public void GivenAHashSet_WhenNotEmpty_VerifyIntersectWithSuccessful()
113142

114143
_languages.IntersectWith(moreLanguages);
115144

116-
Assert.AreEqual(_languages.Count(), 5);
145+
Assert.AreEqual(5, _languages.Count);
117146
Assert.IsTrue(_languages.Contains("C"));
118147
Assert.IsTrue(_languages.Contains("C++"));
119148
Assert.IsTrue(_languages.Contains("C#"));
@@ -129,7 +158,7 @@ public void GivenAHashSet_WhenNotEmpty_ExceptWithSuccessful()
129158

130159
_languages.ExceptWith(moreLanguages);
131160

132-
Assert.AreEqual(_languages.Count(), 4);
161+
Assert.AreEqual(4, _languages.Count);
133162
Assert.IsTrue(_languages.Contains("TypeScript"));
134163
Assert.IsTrue(_languages.Contains("Python"));
135164
Assert.IsTrue(_languages.Contains("JavaScript"));
@@ -143,8 +172,8 @@ public void GivenAHashSet_WhenNotEmpty_VerifySymmetricExceptWithSuccessful()
143172
var moreLanguages = new HashSet<string> { "Assembly", "Pascal", "HTML", "CSS", "PHP" };
144173

145174
_languages.SymmetricExceptWith(moreLanguages);
146-
147-
Assert.AreEqual(_languages.Count(), 14);
175+
176+
Assert.AreEqual(14, _languages.Count);
148177
}
149178

150179
[TestMethod]
@@ -156,4 +185,4 @@ public void GivenAHashSet_WhenNotEmpty_TryToGetValue()
156185
Assert.IsFalse(_languages.Contains("Assembly"));
157186
}
158187
}
159-
}
188+
}

0 commit comments

Comments
 (0)