using Theriapolis.Core; using Theriapolis.Core.World; using Theriapolis.Core.World.Generation; using Xunit; namespace Theriapolis.Tests.Worldgen; /// /// Biome coverage sanity checks: /// - No seed produces a map that is >80% one biome. /// - Each required non-ocean biome appears in at least 1% of land tiles. /// public sealed class BiomeCoverageTests : IClassFixture { private readonly WorldCache _cache; public BiomeCoverageTests(WorldCache cache) => _cache = cache; private Dictionary CountBiomes(ulong seed) { var ctx = _cache.Get(seed); var counts = new Dictionary(); int W = C.WORLD_WIDTH_TILES, H = C.WORLD_HEIGHT_TILES; for (int ty = 0; ty < H; ty++) for (int tx = 0; tx < W; tx++) { var b = ctx.World.Tiles[tx, ty].Biome; counts.TryGetValue(b, out int c); counts[b] = c + 1; } return counts; } [Fact] public void NoBiomeDominatesMoreThan80Percent() { var counts = CountBiomes(0xCAFEBABEUL); int total = C.WORLD_WIDTH_TILES * C.WORLD_HEIGHT_TILES; foreach (var (biome, count) in counts) { double pct = (double)count / total; Assert.True(pct < 0.80, $"Biome {biome} covers {pct:P1} of the map (limit 80%)."); } } [Fact] public void RequiredBiomes_AppearInAtLeast1PercentOfLandTiles() { var counts = CountBiomes(0xCAFEBABEUL); int total = C.WORLD_WIDTH_TILES * C.WORLD_HEIGHT_TILES; int oceanCount = counts.GetValueOrDefault(BiomeId.Ocean); int landTotal = total - oceanCount; // These biomes must all be present and non-trivial BiomeId[] required = { BiomeId.Tundra, BiomeId.Boreal, BiomeId.TemperateDeciduous, BiomeId.TemperateGrassland, BiomeId.MountainAlpine, BiomeId.SubtropicalForest, }; foreach (var biome in required) { int count = counts.GetValueOrDefault(biome); double pct = landTotal > 0 ? (double)count / landTotal : 0; Assert.True(pct >= 0.01, $"Required biome {biome} covers only {pct:P2} of land tiles (minimum 1%)."); } } }