summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop.Tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/LivingVillage.Desktop.Tests')
-rw-r--r--src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj1
-rw-r--r--src/LivingVillage.Desktop.Tests/MapGenTests.fs81
2 files changed, 82 insertions, 0 deletions
diff --git a/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj b/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj
index 60d9995..87e9e9d 100644
--- a/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj
+++ b/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj
@@ -11,6 +11,7 @@
<Compile Include="M6bTests.fs" />
<Compile Include="P16UiTests.fs" />
<Compile Include="PrototypeTests.fs" />
+ <Compile Include="MapGenTests.fs" />
<Compile Include="M3BatchOutputTests.fs" />
<Compile Include="SampleTests.fs" />
</ItemGroup>
diff --git a/src/LivingVillage.Desktop.Tests/MapGenTests.fs b/src/LivingVillage.Desktop.Tests/MapGenTests.fs
new file mode 100644
index 0000000..4454b33
--- /dev/null
+++ b/src/LivingVillage.Desktop.Tests/MapGenTests.fs
@@ -0,0 +1,81 @@
+namespace LivingVillage.Desktop.Tests
+
+open Microsoft.VisualStudio.TestTools.UnitTesting
+open LivingVillage.Kernel
+open LivingVillage.Desktop
+
+/// P20 第一步回归:确定性生成器 + 尺寸参数化 + 30 spawn 核心可达 + 视口裁剪。
+[<TestClass>]
+type MapGenTests () =
+
+ let tilesEqual (a: MapGen.Result) (b: MapGen.Result) (message: string) =
+ if a.Tiles.Length <> b.Tiles.Length then
+ Assert.Fail(sprintf "%s: tile count %d <> %d" message a.Tiles.Length b.Tiles.Length)
+ for i in 0 .. a.Tiles.Length - 1 do
+ if a.Tiles.[i] <> b.Tiles.[i] then
+ Assert.Fail(sprintf "%s: tile %d = %d, expected %d" message i a.Tiles.[i] b.Tiles.[i])
+
+ let checksum (map: MapGen.Result) : int64 =
+ map.Tiles |> Array.mapi (fun i v -> int64 i * int64 (v + 1)) |> Array.sum
+
+ [<TestMethod>]
+ member _.SameSeedGeneratesByteIdenticalTerrain () =
+ let a = MapGen.generateWithSize 64 48 (uint64 4242)
+ let b = MapGen.generateWithSize 64 48 (uint64 4242)
+ tilesEqual a b "64x48 same seed"
+ Assert.AreEqual<uint64>(a.Seed, b.Seed)
+ Assert.AreEqual<int64>(checksum a, checksum b)
+
+ let large1 = MapGen.generateWithSize 256 192 (uint64 7)
+ let large2 = MapGen.generateWithSize 256 192 (uint64 7)
+ tilesEqual large1 large2 "256x192 same seed"
+ Assert.AreEqual<int64>(checksum large1, checksum large2)
+
+ [<TestMethod>]
+ member _.DifferentSeedsProduceDifferentTerrain () =
+ let a = MapGen.generateWithSize 256 192 (uint64 1)
+ let b = MapGen.generateWithSize 256 192 (uint64 2)
+ Assert.AreNotEqual<int64>(checksum a, checksum b, "different seeds must differ")
+
+ [<TestMethod>]
+ member _.LargeMapThirtySpawnsAllReachCore () =
+ let map = MapGen.generateWithSize 256 192 (uint64 4242)
+ Assert.AreEqual<int>(256, map.Width)
+ Assert.AreEqual<int>(192, map.Height)
+ Assert.AreEqual<int>(30, map.Spawns.Length)
+ Assert.IsTrue(map.ReachabilityOk, "all 30 spawns must reach the core")
+ Assert.IsTrue(map.ReachableTiles > 30, "core region must be walkable")
+ for (x, y) in map.Spawns do
+ Assert.AreNotEqual<int>(int MapGen.GroundTile.Water, map.Tiles.[y * map.Width + x], sprintf "spawn (%d,%d) must be walkable" x y)
+
+ [<TestMethod>]
+ member _.DefaultSizeMatchesLegacyBounds () =
+ let map = MapGen.generate (MapGen.defaultParams (uint64 4242))
+ Assert.AreEqual<int>(64, map.Width)
+ Assert.AreEqual<int>(48, map.Height)
+ Assert.AreEqual<int>(64 * 48, map.Tiles.Length)
+ Assert.IsTrue(map.ReachabilityOk)
+ Assert.AreEqual<int>(30, map.Spawns.Length)
+
+ [<TestMethod>]
+ member _.VisibleRangeCullsLargeMapToViewport () =
+ let total = 256 * 192
+ let x0, y0, x1, y1 = MapGen.visibleTileRange 256 192 1000 1000 1280 720
+ let count = MapGen.visibleTileCount 256 192 1000 1000 1280 720
+ Assert.AreEqual<int>((x1 - x0 + 1) * (y1 - y0 + 1), count)
+ Assert.IsTrue(count < total, "viewport culling must draw strictly fewer tiles than the whole map")
+
+ let ox0, oy0, ox1, oy1 = MapGen.visibleTileRange 256 192 0 0 1280 720
+ Assert.AreEqual<int>(0, ox0)
+ Assert.AreEqual<int>(0, oy0)
+ Assert.AreEqual<int>(1280 / Sim.tilePixels + 1, ox1)
+ Assert.AreEqual<int>(720 / Sim.tilePixels + 1, oy1)
+
+ [<TestMethod>]
+ member _.VisibleRangeClampsAtLegacyMapEdges () =
+ let x0, y0, x1, y1 = MapGen.visibleTileRange 64 48 0 0 2048 1536
+ Assert.AreEqual<int>(0, x0)
+ Assert.AreEqual<int>(0, y0)
+ Assert.AreEqual<int>(63, x1)
+ Assert.AreEqual<int>(47, y1)
+ Assert.AreEqual<int>(64 * 48, MapGen.visibleTileCount 64 48 0 0 2048 1536)