add unit test for assumption about HashSet<T> order
This will let us detect if the behavior ever changes in a future version of .NET, so we need to change the new ModsToLoadEarly/Late config fields.
This commit is contained in:
parent
28ba3408bc
commit
42bcd3068f
|
@ -0,0 +1,62 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using FluentAssertions;
|
||||||
|
using FluentAssertions.Execution;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using StardewModdingAPI.Framework.Models;
|
||||||
|
|
||||||
|
namespace SMAPI.Tests.Core
|
||||||
|
{
|
||||||
|
/// <summary>Unit tests which validate assumptions about .NET used in the SMAPI implementation.</summary>
|
||||||
|
[TestFixture]
|
||||||
|
internal class AssumptionTests
|
||||||
|
{
|
||||||
|
/*********
|
||||||
|
** Unit tests
|
||||||
|
*********/
|
||||||
|
/****
|
||||||
|
** Constructor
|
||||||
|
****/
|
||||||
|
[Test(Description = $"Assert that {nameof(HashSet<string>)} maintains insertion order when no elements are removed. If this fails, we'll need to change the implementation for the {nameof(SConfig.ModsToLoadEarly)} and {nameof(SConfig.ModsToLoadLate)} options.")]
|
||||||
|
[TestCase("construct from array")]
|
||||||
|
[TestCase("add incrementally")]
|
||||||
|
public void HashSet_MaintainsInsertionOrderWhenNoElementsAreRemoved(string populateMethod)
|
||||||
|
{
|
||||||
|
// arrange
|
||||||
|
string[] inserted = Enumerable.Range(0, 1000)
|
||||||
|
.Select(_ => Guid.NewGuid().ToString("N"))
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
// act
|
||||||
|
HashSet<string> set;
|
||||||
|
switch (populateMethod)
|
||||||
|
{
|
||||||
|
case "construct from array":
|
||||||
|
set = new(inserted, StringComparer.OrdinalIgnoreCase);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "add incrementally":
|
||||||
|
set = new(StringComparer.OrdinalIgnoreCase);
|
||||||
|
foreach (string value in inserted)
|
||||||
|
set.Add(value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new AssertionFailedException($"Unknown populate method '{populateMethod}'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// assert
|
||||||
|
string[] actualOrder = set.ToArray();
|
||||||
|
actualOrder.Should().HaveCount(inserted.Length);
|
||||||
|
for (int i = 0; i < inserted.Length; i++)
|
||||||
|
{
|
||||||
|
string expected = inserted[i];
|
||||||
|
string actual = actualOrder[i];
|
||||||
|
|
||||||
|
if (actual != expected)
|
||||||
|
throw new AssertionFailedException($"The hash set differed at index {i}: expected {expected}, but found {actual} instead.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue