namespace LivingVillage.Desktop.Tests open System open System.Security.Cryptography open System.Text open Microsoft.VisualStudio.TestTools.UnitTesting open LivingVillage.Desktop /// P48:512×384 地图生成的独立可验收小步(既有参数化生成器已完整,故只补 digest 验证条目)。 /// /// 以 `SHA-256(MapGen.serialize map)` 作为生成结果 digest,锁定: /// * 同 seed 两次生成 digest 一致(跨调用稳定、纯函数); /// * 不同 seed digest 发散; /// * 同 seed 不同尺寸 digest 不同(尺寸确被参数化纳入生成); /// * 512×384 / seed 4242 的具体 digest 钉住,作为回归护栏。 [] type P48MapDigestTests () = let digestOf (map: MapGen.Result) : string = use sha = SHA256.Create() MapGen.serialize map |> Encoding.UTF8.GetBytes |> sha.ComputeHash |> Convert.ToHexString [] member _.SameSeed512DigestIsStableAcrossRuns () = let a = MapGen.generateWithSize 512 384 (uint64 4242) let b = MapGen.generateWithSize 512 384 (uint64 4242) let da = digestOf a let db = digestOf b Assert.AreEqual(64, da.Length) Assert.IsTrue((da = db), "same seed must yield an identical digest") Assert.IsTrue((da = digestOf a), "digest must be a pure function of the map") [] member _.DifferentSeeds512DigestDiverge () = let seeds = [ 1UL; 2UL; 7UL; 4242UL; 99991UL ] let digests = seeds |> List.map (fun s -> digestOf (MapGen.generateWithSize 512 384 s)) for (s, d) in List.zip seeds digests do printfn "P48 digest 512x384 seed=%d = %s" s d Assert.IsTrue((digests |> List.distinct |> List.length = seeds.Length), "every seed must yield a distinct digest") [] member _.SameSeedDigestDiffersAcrossMapSizes () = let d64 = digestOf (MapGen.generateWithSize 64 48 (uint64 4242)) let d256 = digestOf (MapGen.generateWithSize 256 192 (uint64 4242)) let d512 = digestOf (MapGen.generateWithSize 512 384 (uint64 4242)) printfn "P48 digest 64x48 seed=4242 = %s" d64 printfn "P48 digest 256x192 seed=4242 = %s" d256 printfn "P48 digest 512x384 seed=4242 = %s" d512 Assert.IsTrue((d64 <> d256), "64x48 and 256x192 digests must differ") Assert.IsTrue((d256 <> d512), "256x192 and 512x384 digests must differ") Assert.IsTrue((d64 <> d512), "64x48 and 512x384 digests must differ") [] member _.Pinned512DigestLocksGeneratorOutput () = let digest = digestOf (MapGen.generateWithSize 512 384 (uint64 4242)) printfn "P48 digest 512x384 seed=4242 = %s" digest Assert.IsTrue((digest = "904A20148C0BA385E95A1EF53B0E7ECCB08653A557D4FD49F0EED6B57857DAD0"), sprintf "512x384 seed=4242 digest pinned, was %s" digest)