using Microsoft.Extensions.DependencyInjection; using NeonSprawl.Server.Game.Mastery; using NeonSprawl.Server.Tests; using Xunit; namespace NeonSprawl.Server.Tests.Game.Mastery; public class MasteryCatalogRegistryTests { private static MasteryCatalogRegistry CreateRegistryFromCatalog(MasteryCatalog catalog) => new(catalog); [Fact] public void TryGetTrack_ShouldReturnTrue_WhenSkillIdExists() { // Arrange var track = new MasteryTrackRow( "salvage", [new MasteryTierRow(1, 2, [new MasteryBranchRow("scrap_efficiency", null, [])])]); var catalog = new MasteryCatalog( "/tmp/mastery", new Dictionary(StringComparer.Ordinal) { ["salvage"] = track }, new Dictionary(StringComparer.Ordinal), catalogJsonFileCount: 1); var registry = CreateRegistryFromCatalog(catalog); // Act var found = registry.TryGetTrack("salvage", out var result); // Assert Assert.True(found); Assert.NotNull(result); Assert.Equal("salvage", result.SkillId); } [Fact] public void TryGetTrack_ShouldReturnFalse_WhenSkillIdUnknown() { // Arrange var catalog = new MasteryCatalog( "/tmp/mastery", new Dictionary(StringComparer.Ordinal), new Dictionary(StringComparer.Ordinal), catalogJsonFileCount: 0); var registry = CreateRegistryFromCatalog(catalog); // Act var found = registry.TryGetTrack("not_a_track", out var result); // Assert Assert.False(found); Assert.Null(result); } [Fact] public void TryGetPerk_ShouldReturnTrue_WhenPerkIdExists() { // Arrange var perk = new PerkDefRow("salvage_scrap_efficiency_1", "Scrap Sifter", "gather_yield_modifier"); var catalog = new MasteryCatalog( "/tmp/mastery", new Dictionary(StringComparer.Ordinal), new Dictionary(StringComparer.Ordinal) { [perk.Id] = perk }, catalogJsonFileCount: 1); var registry = CreateRegistryFromCatalog(catalog); // Act var found = registry.TryGetPerk("salvage_scrap_efficiency_1", out var result); // Assert Assert.True(found); Assert.NotNull(result); Assert.Equal("gather_yield_modifier", result.EffectKind); } [Fact] public async Task Host_ShouldResolveRegistryFromDi_WhenStartupSucceeds() { // Arrange await using var factory = new InMemoryWebApplicationFactory(); using var client = factory.CreateClient(); _ = await client.GetAsync("/health"); // Act var registry = factory.Services.GetRequiredService(); var foundTrack = registry.TryGetTrack("salvage", out var track); var foundPerk = registry.TryGetPerk("salvage_scrap_efficiency_1", out var perk); // Assert Assert.True(foundTrack); Assert.NotNull(track); Assert.Equal(2, track.Tiers.Count); Assert.True(foundPerk); Assert.NotNull(perk); Assert.Equal("Scrap Sifter", perk.DisplayName); } }