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:
Jesse Plamondon-Willard 2022-11-11 02:33:28 -05:00
parent 28ba3408bc
commit 42bcd3068f
No known key found for this signature in database
GPG Key ID: CF8B1456B3E29F49
1 changed files with 62 additions and 0 deletions

View File

@ -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.");
}
}
}
}