Aetheria/tests/Aetheria.Shared.Tests/EconomyNullGuardTests.cs

68 lines
2.6 KiB
C#

using System;
using System.Linq;
using Xunit;
// A recipe read from disk can hold null lists. The checks refuse it as an L-recipe fault naming the record; they never throw
// (finding null-fills-throws).
public sealed class EconomyNullGuardTests
{
private static void Null(EconomyFixture f, string list) =>
f.EditRecipe("commodity:plate", r =>
{
if (list == "Fills") r.Fills = null;
if (list == "Inputs") r.Inputs = null;
if (list == "Upkeep") r.Upkeep = null;
if (list == "RoleInputs") r.RoleInputs = null;
});
[Theory]
[InlineData("Fills")]
[InlineData("Inputs")]
[InlineData("Upkeep")]
[InlineData("RoleInputs")]
public void ANullListIsAnLRecipeFaultNotAThrow(string list)
{
using var f = EconomyFixture.Healthy();
Null(f, list);
var report = EconomyChecks.Check(f.Cache);
Assert.Contains(report.Faults, x => x.Invariant == EconomyChecks.LRecipe && x.Record == "recipe:commodity:plate" && x.Message.Contains(list));
}
[Theory]
[InlineData("Fills")]
[InlineData("Inputs")]
[InlineData("Upkeep")]
[InlineData("RoleInputs")]
public void EveryRuleSurvivesANullList(string list)
{
using var f = EconomyFixture.Healthy();
Null(f, list);
EconomyChecks.Recipe(f.Cache);
EconomyChecks.Lore(f.Cache);
EconomyChecks.SourceSink(f.Cache);
EconomyChecks.Productive(f.Cache);
EconomyChecks.ConsumerDemand(f.Cache);
Assert.NotEmpty(EconomyChecks.Deep(f.Cache));
}
[Fact]
public void ANullRoleInputsReadsAsTheListWithoutItAndKeepsTheRestOfTheRecipe()
{
using var f = EconomyFixture.Healthy();
f.EditRecipe("commodity:plate", r => r.RoleInputs = null);
Assert.Empty(EconomyChecks.Check(f.Cache).Faults.Where(x => x.Invariant != EconomyChecks.LRecipe));
}
[Fact]
public void ANullEntryInAListIsAnLRecipeFault()
{
using var f = EconomyFixture.Healthy();
f.EditRecipe("commodity:plate", r => r.Inputs.Add(null));
var report = EconomyChecks.Check(f.Cache);
Assert.Contains(report.Faults, x => x.Invariant == EconomyChecks.LRecipe && x.Record == "recipe:commodity:plate" && x.Message.Contains("Inputs"));
f.EditRecipe("commodity:plate", r => { r.Inputs.Remove(null); r.RoleInputs.Add(null); });
report = EconomyChecks.Check(f.Cache);
Assert.Contains(report.Faults, x => x.Invariant == EconomyChecks.LRecipe && x.Record == "recipe:commodity:plate" && x.Message.Contains("RoleInputs"));
}
}