summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop.Tests/P48MapDigestTests.fs
blob: b8b084cb3e8f7f7ece9cad18e0d8e7359beb3235 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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 钉住,作为回归护栏。
[<TestClass>]
type P48MapDigestTests () =

    let digestOf (map: MapGen.Result) : string =
        use sha = SHA256.Create()
        MapGen.serialize map
        |> Encoding.UTF8.GetBytes
        |> sha.ComputeHash
        |> Convert.ToHexString

    [<TestMethod>]
    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<int>(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")

    [<TestMethod>]
    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")

    [<TestMethod>]
    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")

    [<TestMethod>]
    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)