Files
sbox-public/engine/Sandbox.Test/System/HashSetExTest.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

110 lines
2.2 KiB
C#

using Sandbox.Utility;
namespace TestSystem.Collections;
[TestClass]
public class HashSetExTest
{
/// <summary>
/// Additions to a <see cref="HashSetEx{T}"/> while enumerating it must be
/// deferred until after the enumeration.
/// </summary>
[TestMethod]
[DataRow( 1_000 )]
[DataRow( 10_000 )]
[DataRow( 100_000 )]
[DataRow( 1_000_000 )]
public void DeferredAdd( int itemCount )
{
var hashSet = new HashSetEx<int>();
for ( var i = 0; i < itemCount; ++i )
{
hashSet.Add( i );
}
Assert.AreEqual( itemCount, hashSet.Count );
var enumeratedCount = 0;
foreach ( var item in hashSet.EnumerateLocked() )
{
// Test item < itemCount here to avoid endless loop if EnumerateLocked doesn't work
if ( item < itemCount )
{
hashSet.Add( item + itemCount );
}
enumeratedCount++;
}
Assert.AreEqual( itemCount, enumeratedCount );
Assert.AreEqual( itemCount * 2, hashSet.Count );
}
/// <summary>
/// Removals from a <see cref="HashSetEx{T}"/> while enumerating it must be
/// deferred until after the enumeration.
/// </summary>
[TestMethod]
[DataRow( 1_000 )]
[DataRow( 10_000 )]
[DataRow( 100_000 )]
[DataRow( 1_000_000 )]
public void DeferredRemove( int itemCount )
{
var hashSet = new HashSetEx<int>();
for ( var i = 0; i < itemCount; ++i )
{
hashSet.Add( i );
}
Assert.AreEqual( itemCount, hashSet.Count );
foreach ( var item in hashSet.EnumerateLocked() )
{
hashSet.Remove( item );
}
Assert.AreEqual( 0, hashSet.Count );
}
/// <summary>
/// Stress test iterating variously sized <see cref="HashSetEx{T}"/> 1,000 times, with
/// the set being modified between each iteration.
/// </summary>
[TestMethod]
[DataRow( 1_000, 1_000 )]
[DataRow( 10_000, 1_000 )]
[DataRow( 100_000, 1_000 )]
[DataRow( 1_000_000, 1_000 )]
public void WorstCaseIteration( int itemCount, int iterations )
{
var hashSet = new HashSetEx<int>();
for ( var i = 0; i < itemCount; ++i )
{
hashSet.Add( i );
}
for ( var i = 0; i < iterations; ++i )
{
Assert.AreEqual( itemCount, hashSet.Count );
var sum = 0;
foreach ( var item in hashSet.EnumerateLocked() )
{
sum += item;
}
// Force list to dirty
hashSet.Add( -1 );
hashSet.Remove( -1 );
}
}
}