104 lines
3.9 KiB
C#
104 lines
3.9 KiB
C#
using NeonSprawl.Server.Game.Contracts;
|
|
|
|
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);
|
|
}
|
|
}
|