Skip to content

Commit cd260c9

Browse files
[patch] Fix SonarCloud MSTest issues and unblock the build
Build fixes (ktsu.Sdk 2.26.1 analyzers, were failing the build): - KTSU0007: Polyfill PackageReference now sets PrivateAssets="all" so the build-time-only package stops leaking into consumers dependency graphs. - KTSU0002: add Containers/AssemblyInfo.cs exposing internals to ktsu.Containers.Test. SonarCloud fixes (46 issues): - MSTEST0068 (34): CollectionAssert.AreEqual -> Assert.AreSequenceEqual. AreSequenceEqual takes IEnumerable<T>, so the accompanying .ToArray() calls became redundant (IDE0305) and were dropped. - MSTEST0037 (11): Assert.AreEqual(n, x.Length) -> Assert.HasCount(n, x) for the span assertions, and Assert.IsTrue(a >= b) -> Assert.IsGreaterThanOrEqualTo(b, a) in SpscRingBufferTests. - MSTEST0049 (1): pass TestContext.CancellationToken to the Task.Run calls in ConcurrentProducerConsumer_TransfersAllItemsInOrder. Also refreshed the outdated CollectionAssert guidance in CLAUDE.md. Build clean, 351/351 tests pass.
1 parent 8a61271 commit cd260c9

13 files changed

Lines changed: 58 additions & 49 deletions

CLAUDE.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ dotnet run --project Containers.Benchmarks --configuration Release -- --filter "
6969
## Testing Conventions
7070

7171
- Use MSTest framework (`[TestClass]`, `[TestMethod]`)
72-
- Use `CollectionAssert.AreEqual` for collection equality (use `.ToArray()` if type inference issues arise)
72+
- Use `Assert.AreSequenceEqual` for collection equality; `CollectionAssert.AreEqual` is flagged by MSTEST0068. It accepts any `IEnumerable<T>`, so no `.ToArray()` is needed
73+
- Use `Assert.HasCount` rather than asserting `.Count`/`.Length` via `Assert.AreEqual` (MSTEST0037)
7374
- Test edge cases: empty containers, boundary conditions, constructor validation
7475

7576
## Benchmarking Standards

Containers.Test/ContiguousCollectionTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ public void GetEnumerator_IteratesInOrder()
351351
}
352352

353353
// Assert
354-
CollectionAssert.AreEqual(expected, enumerated);
354+
Assert.AreSequenceEqual(expected, enumerated);
355355
}
356356

357357
[TestMethod]
@@ -364,7 +364,7 @@ public void AsSpan_ReturnsCorrectSpan()
364364
Span<int> span = collection.AsSpan();
365365

366366
// Assert
367-
Assert.AreEqual(4, span.Length);
367+
Assert.HasCount(4, span);
368368
Assert.AreEqual(3, span[0]);
369369
Assert.AreEqual(1, span[1]);
370370
Assert.AreEqual(4, span[2]);
@@ -381,7 +381,7 @@ public void AsReadOnlySpan_ReturnsCorrectSpan()
381381
ReadOnlySpan<int> span = collection.AsReadOnlySpan();
382382

383383
// Assert
384-
Assert.AreEqual(4, span.Length);
384+
Assert.HasCount(4, span);
385385
Assert.AreEqual(3, span[0]);
386386
Assert.AreEqual(1, span[1]);
387387
Assert.AreEqual(4, span[2]);
@@ -486,7 +486,7 @@ public void ContiguousMemoryLayout_OptimalForCachePerformance()
486486

487487
// Test span access (only possible with contiguous memory)
488488
ReadOnlySpan<int> span = collection.AsReadOnlySpan();
489-
Assert.AreEqual(1000, span.Length);
489+
Assert.HasCount(1000, span);
490490
for (int i = 0; i < 1000; i++)
491491
{
492492
Assert.AreEqual(i, span[i]);

Containers.Test/ContiguousMapTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ public void GetKeysSpan_ReturnsCorrectSpan()
411411
ReadOnlySpan<int> keysSpan = map.GetKeysSpan();
412412

413413
// Assert
414-
Assert.AreEqual(4, keysSpan.Length);
414+
Assert.HasCount(4, keysSpan);
415415

416416
// Verify all keys are in the span
417417
HashSet<int> spanKeys = [];
@@ -440,7 +440,7 @@ public void GetValuesSpan_ReturnsCorrectSpan()
440440
ReadOnlySpan<string> valuesSpan = map.GetValuesSpan();
441441

442442
// Assert
443-
Assert.AreEqual(4, valuesSpan.Length);
443+
Assert.HasCount(4, valuesSpan);
444444

445445
// Verify all values are in the span
446446
HashSet<string> spanValues = [];
@@ -478,8 +478,8 @@ public void ContiguousMemoryLayout_OptimalForCachePerformance()
478478
// Test span access (only possible with contiguous memory)
479479
ReadOnlySpan<int> keysSpan = map.GetKeysSpan();
480480
ReadOnlySpan<string> valuesSpan = map.GetValuesSpan();
481-
Assert.AreEqual(1000, keysSpan.Length);
482-
Assert.AreEqual(1000, valuesSpan.Length);
481+
Assert.HasCount(1000, keysSpan);
482+
Assert.HasCount(1000, valuesSpan);
483483

484484
// Verify all keys are in the span
485485
HashSet<int> spanKeys = [];

Containers.Test/ContiguousSetTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ public void AsReadOnlySpan_ReturnsCorrectSpan()
227227
ReadOnlySpan<int> span = set.AsReadOnlySpan();
228228

229229
// Assert
230-
Assert.AreEqual(4, span.Length);
230+
Assert.HasCount(4, span);
231231

232232
// Verify all elements are in the span
233233
HashSet<int> spanElements = [];
@@ -429,7 +429,7 @@ public void ContiguousMemoryLayout_OptimalForCachePerformance()
429429

430430
// Test span access (only possible with contiguous memory)
431431
ReadOnlySpan<int> span = set.AsReadOnlySpan();
432-
Assert.AreEqual(1000, span.Length);
432+
Assert.HasCount(1000, span);
433433

434434
// Verify all elements are in the span
435435
HashSet<int> spanElements = [];

Containers.Test/InsertionOrderCollectionTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ public void GetEnumerator_IteratesInInsertionOrder()
342342
}
343343

344344
// Assert
345-
CollectionAssert.AreEqual(expected, enumerated);
345+
Assert.AreSequenceEqual(expected, enumerated);
346346
}
347347

348348
[TestMethod]

Containers.Test/InsertionOrderMapTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void Constructor_WithKeyValuePairs_AddsInInsertionOrder()
5252

5353
// Verify insertion order
5454
int[] expectedOrder = [3, 1, 4, 2];
55-
CollectionAssert.AreEqual(expectedOrder, map.Keys.ToArray());
55+
Assert.AreSequenceEqual(expectedOrder, map.Keys);
5656
}
5757

5858
[TestMethod]
@@ -242,7 +242,7 @@ public void Remove_ExistingKey_RemovesAndReturnsTrue()
242242

243243
// Verify order maintained
244244
int[] expectedOrder = [1, 3];
245-
CollectionAssert.AreEqual(expectedOrder, map.Keys.ToArray());
245+
Assert.AreSequenceEqual(expectedOrder, map.Keys);
246246
}
247247

248248
[TestMethod]
@@ -294,7 +294,7 @@ public void Keys_ReturnsKeysInInsertionOrder()
294294

295295
// Assert
296296
int[] expectedOrder = [3, 1, 4, 2];
297-
CollectionAssert.AreEqual(expectedOrder, keys);
297+
Assert.AreSequenceEqual(expectedOrder, keys);
298298
}
299299

300300
[TestMethod]
@@ -312,7 +312,7 @@ public void Values_ReturnsValuesInInsertionOrder()
312312

313313
// Assert
314314
string[] expectedOrder = ["three", "one", "four", "two"];
315-
CollectionAssert.AreEqual(expectedOrder, values);
315+
Assert.AreSequenceEqual(expectedOrder, values);
316316
}
317317

318318
[TestMethod]
@@ -406,7 +406,7 @@ public void MaintainsInsertionOrder_AfterMultipleOperations()
406406

407407
// Assert
408408
int[] expectedOrder = [5, 2, 4]; // Insertion order minus removed items
409-
CollectionAssert.AreEqual(expectedOrder, map.Keys.ToArray());
409+
Assert.AreSequenceEqual(expectedOrder, map.Keys);
410410
}
411411

412412
[TestMethod]
@@ -422,6 +422,6 @@ public void WorksWithCustomTypes()
422422

423423
// Assert
424424
string[] expectedKeyOrder = ["charlie", "alpha", "bravo"];
425-
CollectionAssert.AreEqual(expectedKeyOrder, map.Keys.ToArray());
425+
Assert.AreSequenceEqual(expectedKeyOrder, map.Keys);
426426
}
427427
}

Containers.Test/InsertionOrderSetTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ public void GetEnumerator_IteratesInInsertionOrder()
200200
}
201201

202202
// Assert
203-
CollectionAssert.AreEqual(expected, enumerated); // No duplicates, insertion order
203+
Assert.AreSequenceEqual(expected, enumerated); // No duplicates, insertion order
204204
}
205205

206206
[TestMethod]

Containers.Test/OrderedCollectionTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ public void GetEnumerator_IteratesInSortedOrder()
429429
List<int> actual = [.. collection];
430430

431431
// Assert
432-
CollectionAssert.AreEqual(expected, actual);
432+
Assert.AreSequenceEqual(expected, actual);
433433
}
434434

435435
[TestMethod]

Containers.Test/OrderedMapTests.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public void Constructor_WithComparer_UsesCustomComparer()
3737
};
3838

3939
string[] expectedOrder = ["three", "two", "one"];
40-
CollectionAssert.AreEqual(expectedOrder, map.Values.ToArray());
40+
Assert.AreSequenceEqual(expectedOrder, map.Values);
4141
}
4242

4343
/// <summary>
@@ -68,8 +68,8 @@ public void Constructor_FromDictionary_CopiesAndSortsElements()
6868
Assert.AreEqual(3, map.Count);
6969
int[] expectedKeys = [1, 2, 3];
7070
string[] expectedValues = ["one", "two", "three"];
71-
CollectionAssert.AreEqual(expectedKeys, map.Keys.ToArray());
72-
CollectionAssert.AreEqual(expectedValues, map.Values.ToArray());
71+
Assert.AreSequenceEqual(expectedKeys, map.Keys);
72+
Assert.AreSequenceEqual(expectedValues, map.Values);
7373
}
7474

7575
/// <summary>
@@ -87,8 +87,8 @@ public void Add_MultipleElements_MaintainsSortedOrder()
8787

8888
int[] expectedKeys = [1, 2, 3];
8989
string[] expectedValues = ["one", "two", "three"];
90-
CollectionAssert.AreEqual(expectedKeys, map.Keys.ToArray());
91-
CollectionAssert.AreEqual(expectedValues, map.Values.ToArray());
90+
Assert.AreSequenceEqual(expectedKeys, map.Keys);
91+
Assert.AreSequenceEqual(expectedValues, map.Values);
9292
}
9393

9494
/// <summary>
@@ -165,7 +165,7 @@ public void Indexer_SetNewKey_AddsKeyValuePair()
165165

166166
Assert.AreEqual(3, map.Count);
167167
int[] expectedKeys = [1, 2, 3];
168-
CollectionAssert.AreEqual(expectedKeys, map.Keys.ToArray());
168+
Assert.AreSequenceEqual(expectedKeys, map.Keys);
169169
}
170170

171171
/// <summary>
@@ -237,7 +237,7 @@ public void Remove_ExistingKey_RemovesKeyAndReturnsTrue()
237237
Assert.AreEqual(2, map.Count);
238238
Assert.IsFalse(map.ContainsKey(2), "Removed key should no longer exist");
239239
int[] expectedKeys = [1, 3];
240-
CollectionAssert.AreEqual(expectedKeys, map.Keys.ToArray());
240+
Assert.AreSequenceEqual(expectedKeys, map.Keys);
241241
}
242242

243243
/// <summary>
@@ -304,7 +304,7 @@ public void Keys_ReturnsSortedKeys()
304304
};
305305

306306
int[] expectedKeys = [1, 2, 3];
307-
CollectionAssert.AreEqual(expectedKeys, map.Keys.ToArray());
307+
Assert.AreSequenceEqual(expectedKeys, map.Keys);
308308
}
309309

310310
/// <summary>
@@ -321,7 +321,7 @@ public void Values_ReturnsValuesInKeyOrder()
321321
};
322322

323323
string[] expectedValues = ["one", "two", "three"];
324-
CollectionAssert.AreEqual(expectedValues, map.Values.ToArray());
324+
Assert.AreSequenceEqual(expectedValues, map.Values);
325325
}
326326

327327
/// <summary>
@@ -381,8 +381,8 @@ public void Clone_CreatesShallowCopy()
381381
OrderedMap<int, string> clone = map.Clone();
382382

383383
Assert.AreEqual(map.Count, clone.Count);
384-
CollectionAssert.AreEqual(map.Keys.ToArray(), clone.Keys.ToArray());
385-
CollectionAssert.AreEqual(map.Values.ToArray(), clone.Values.ToArray());
384+
Assert.AreSequenceEqual(map.Keys, clone.Keys);
385+
Assert.AreSequenceEqual(map.Values, clone.Values);
386386

387387
// Verify they are independent
388388
clone.Add(3, "three");

Containers.Test/OrderedSetTests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void Constructor_WithCollection_CreatesSetFromCollection()
4848

4949
Assert.AreEqual(7, set.Count); // Duplicates removed
5050
int[] expected = [1, 2, 3, 4, 5, 6, 9];
51-
CollectionAssert.AreEqual(expected, set.ToArray());
51+
Assert.AreSequenceEqual(expected, set);
5252
}
5353

5454
[TestMethod]
@@ -59,7 +59,7 @@ public void Constructor_WithCollectionAndComparer_CreatesSetFromCollectionWithCo
5959

6060
Assert.AreEqual(3, set.Count); // "apple" and "Apple" are treated as same
6161
string[] expected = ["apple", "BANANA", "cherry"];
62-
CollectionAssert.AreEqual(expected, set.ToArray());
62+
Assert.AreSequenceEqual(expected, set);
6363
}
6464

6565
[TestMethod]
@@ -111,7 +111,7 @@ public void Add_MultipleElements_MaintainsSortedOrder()
111111
Assert.AreEqual(4, set.Count);
112112

113113
int[] expected = [1, 2, 5, 8];
114-
CollectionAssert.AreEqual(expected, set.ToArray());
114+
Assert.AreSequenceEqual(expected, set);
115115
}
116116

117117
[TestMethod]
@@ -176,7 +176,7 @@ public void CopyTo_ValidParameters_CopiesElements()
176176
set.CopyTo(array, 0);
177177

178178
int[] expected = [1, 3, 4, 5]; // Note: only 4 unique elements
179-
CollectionAssert.AreEqual(expected, array[0..4]);
179+
Assert.AreSequenceEqual(expected, array[0..4]);
180180
}
181181

182182
[TestMethod]
@@ -213,7 +213,7 @@ public void Remove_ExistingElement_RemovesAndReturnsTrue()
213213
Assert.DoesNotContain(3, set);
214214

215215
int[] expected = [1, 2, 4, 5];
216-
CollectionAssert.AreEqual(expected, set.ToArray());
216+
Assert.AreSequenceEqual(expected, set);
217217
}
218218

219219
[TestMethod]
@@ -277,7 +277,7 @@ public void GetEnumerator_Generic_IteratesInSortedOrder()
277277
}
278278

279279
int[] expected = [1, 2, 5, 8, 9];
280-
CollectionAssert.AreEqual(expected, result);
280+
Assert.AreSequenceEqual(expected, result);
281281
}
282282

283283
[TestMethod]
@@ -293,7 +293,7 @@ public void GetEnumerator_NonGeneric_IteratesInSortedOrder()
293293
}
294294

295295
object[] expected = [1, 2, 5, 8, 9];
296-
CollectionAssert.AreEqual(expected, result);
296+
Assert.AreSequenceEqual(expected, result);
297297
}
298298

299299
[TestMethod]
@@ -306,7 +306,7 @@ public void UnionWith_DisjointSets_AddsAllElements()
306306

307307
Assert.AreEqual(6, set1.Count);
308308
int[] expected = [1, 2, 3, 4, 5, 6];
309-
CollectionAssert.AreEqual(expected, set1.ToArray());
309+
Assert.AreSequenceEqual(expected, set1);
310310
}
311311

312312
[TestMethod]
@@ -319,7 +319,7 @@ public void UnionWith_OverlappingSets_AddsUniqueElements()
319319

320320
Assert.AreEqual(5, set1.Count);
321321
int[] expected = [1, 3, 4, 5, 6];
322-
CollectionAssert.AreEqual(expected, set1.ToArray());
322+
Assert.AreSequenceEqual(expected, set1);
323323
}
324324

325325
[TestMethod]
@@ -339,7 +339,7 @@ public void IntersectWith_OverlappingSets_KeepsCommonElements()
339339

340340
Assert.AreEqual(3, set1.Count);
341341
int[] expected = [3, 4, 5];
342-
CollectionAssert.AreEqual(expected, set1.ToArray());
342+
Assert.AreSequenceEqual(expected, set1);
343343
}
344344

345345
[TestMethod]
@@ -370,7 +370,7 @@ public void ExceptWith_RemovesSpecifiedElements()
370370

371371
Assert.AreEqual(3, set1.Count);
372372
int[] expected = [1, 3, 5];
373-
CollectionAssert.AreEqual(expected, set1.ToArray());
373+
Assert.AreSequenceEqual(expected, set1);
374374
}
375375

376376
[TestMethod]
@@ -390,7 +390,7 @@ public void SymmetricExceptWith_KeepsElementsInEitherButNotBoth()
390390

391391
Assert.AreEqual(4, set1.Count);
392392
int[] expected = [1, 2, 5, 6];
393-
CollectionAssert.AreEqual(expected, set1.ToArray());
393+
Assert.AreSequenceEqual(expected, set1);
394394
}
395395

396396
[TestMethod]
@@ -575,7 +575,7 @@ public void Clone_CreatesIndependentCopy()
575575
OrderedSet<int> clone = original.Clone();
576576

577577
// Verify they have the same content
578-
CollectionAssert.AreEqual(original.ToArray(), clone.ToArray());
578+
Assert.AreSequenceEqual(original, clone);
579579

580580
// Verify they are independent
581581
clone.Add(4);

0 commit comments

Comments
 (0)