neon-sprawl/server/NeonSprawl.Server.Tests/Game/Contracts/ContractTemplateRegistryTes...

114 lines
4.3 KiB
C#

using System.Collections.Frozen;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Abstractions;
using NeonSprawl.Server.Game.Contracts;
using NeonSprawl.Server.Game.Encounters;
using NeonSprawl.Server.Game.Factions;
using NeonSprawl.Server.Game.Skills;
using NeonSprawl.Server.Tests;
using NeonSprawl.Server.Tests.Game.Skills;
using Xunit;
namespace NeonSprawl.Server.Tests.Game.Contracts;
public class ContractTemplateRegistryTests
{
private static ContractTemplateRegistry CreateRegistryFromRows(IReadOnlyDictionary<string, ContractTemplateRow> byId)
{
var catalog = new ContractTemplateCatalog("/tmp/catalog", byId, catalogJsonFileCount: 1);
return new ContractTemplateRegistry(catalog);
}
[Fact]
public void TryGetDefinition_ShouldReturnTrue_WhenIdExists()
{
// Arrange
var expected = PrototypeE7M4ContractCatalogRules.ExpectedTemplateFreeze["prototype_contract_clear_combat_pocket"];
var rows = new Dictionary<string, ContractTemplateRow>(StringComparer.Ordinal)
{
[expected.Id] = expected,
};
var registry = CreateRegistryFromRows(rows);
// Act
var found = registry.TryGetDefinition("prototype_contract_clear_combat_pocket", out var def);
// Assert
Assert.True(found);
Assert.NotNull(def);
Assert.Equal("Clear Combat Pocket (Repeat)", def!.DisplayName);
Assert.Equal("prototype_combat_pocket", def.EncounterTemplateId);
}
[Fact]
public void TryGetDefinition_ShouldReturnFalse_WhenTemplateIdIsNull()
{
// Arrange
var expected = PrototypeE7M4ContractCatalogRules.ExpectedTemplateFreeze["prototype_contract_clear_combat_pocket"];
var rows = new Dictionary<string, ContractTemplateRow>(StringComparer.Ordinal)
{
[expected.Id] = expected,
};
var registry = CreateRegistryFromRows(rows);
// Act
var found = registry.TryGetDefinition(null, out var def);
// Assert
Assert.False(found);
Assert.Null(def);
}
[Fact]
public void TryGetDefinition_ShouldReturnFalse_WhenIdUnknown()
{
// Arrange
var expected = PrototypeE7M4ContractCatalogRules.ExpectedTemplateFreeze["prototype_contract_clear_combat_pocket"];
var rows = new Dictionary<string, ContractTemplateRow>(StringComparer.Ordinal)
{
[expected.Id] = expected,
};
var registry = CreateRegistryFromRows(rows);
// Act
var found = registry.TryGetDefinition("not_a_real_template", out var def);
// Assert
Assert.False(found);
Assert.Null(def);
}
[Fact]
public void GetDefinitionsInIdOrder_ShouldListAllRowsOrderedById_WhenMultipleTemplates()
{
// Arrange
var prototype = PrototypeE7M4ContractCatalogRules.ExpectedTemplateFreeze["prototype_contract_clear_combat_pocket"];
var other = prototype with { Id = "zzz_other_template" };
var rows = new Dictionary<string, ContractTemplateRow>(StringComparer.Ordinal)
{
[other.Id] = other,
[prototype.Id] = prototype,
};
var registry = CreateRegistryFromRows(rows);
// Act
var list = registry.GetDefinitionsInIdOrder();
// Assert
Assert.Equal(2, list.Count);
Assert.Equal("prototype_contract_clear_combat_pocket", list[0].Id);
Assert.Equal("zzz_other_template", list[1].Id);
}
[Fact]
public async Task Host_ShouldResolveContractCatalogFromDi_WhenStartupSucceeds()
{
// Arrange
await using var factory = new InMemoryWebApplicationFactory();
using var client = factory.CreateClient();
_ = await client.GetAsync("/health");
// Act
var registry = factory.Services.GetRequiredService<IContractTemplateRegistry>();
var found = registry.TryGetDefinition("prototype_contract_clear_combat_pocket", out var template);
// Assert
Assert.True(found);
Assert.NotNull(template);
Assert.Equal("Clear Combat Pocket (Repeat)", template!.DisplayName);
Assert.Equal("encounter_clear", template.ObjectiveKind);
Assert.Equal("prototype_combat_pocket", template.EncounterTemplateId);
}
}