summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop.Tests/AssetPackTests.fs
blob: fc235d0e8bef84453125f460a8ce7e9600ef80b9 (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
63
64
65
66
67
68
69
70
71
72
73
namespace LivingVillage.Desktop.Tests

open System
open System.IO
open Microsoft.VisualStudio.TestTools.UnitTesting
open LivingVillage.Kernel
open LivingVillage.Kernel.Sim
open LivingVillage.Desktop.VillageArt

/// P33 vertical slice: the provenanced CC0 asset pack (Kenney Tiny Farm ground +
/// Puny Characters) must load at the documented 32x32 / 32x48 shapes, be an exact
/// integer 2x of the 16px / 16x24 source sprites, and stay behind the
/// `LV_ASSET_PACK=cc0` switch so the procedural Jiangnan atlas is the fallback.
[<TestClass>]
type AssetPackTests () =

    let assetPath (relative: string) =
        Path.Combine(AppContext.BaseDirectory, relative)

    let pngDimensions (path: string) : int * int =
        let bytes = File.ReadAllBytes path
        let signature = [| 0x89uy; 0x50uy; 0x4Euy; 0x47uy |]
        for i in 0 .. 3 do
            Assert.IsTrue(signature.[i] = bytes.[i], sprintf "%s is not a PNG" path)
        let be32 (offset: int) =
            (int bytes.[offset] <<< 24)
            ||| (int bytes.[offset + 1] <<< 16)
            ||| (int bytes.[offset + 2] <<< 8)
            ||| int bytes.[offset + 3]
        be32 16, be32 20

    [<TestMethod>]
    member _.Cc0GroundAtlasIsIntegerMultipleOfTheTileGrid () =
        let width, height = pngDimensions (assetPath cc0TileAtlasRelativePath)
        Assert.AreEqual<int>(cc0TileAtlasWidth, width)
        Assert.AreEqual<int>(cc0TileAtlasHeight, height)
        Assert.AreEqual<int>(0, width % Sim.tilePixels)
        Assert.AreEqual<int>(0, height % Sim.tilePixels)
        Assert.AreEqual<int>(4, width / Sim.tilePixels)
        Assert.AreEqual<int>(2, Sim.tilePixels / cc0TileSourcePixels)
        Assert.AreEqual<int>(0, Sim.tilePixels % cc0TileSourcePixels)

    [<TestMethod>]
    member _.Cc0CharacterAtlasIsIntegerMultipleOfTheCellGrid () =
        let width, height = pngDimensions (assetPath cc0CharacterAtlasRelativePath)
        Assert.AreEqual<int>(cc0CharacterAtlasWidth, width)
        Assert.AreEqual<int>(cc0CharacterCellHeight, height)
        Assert.AreEqual<int>(0, width % cc0CharacterCellWidth)
        Assert.AreEqual<int>(0, height % cc0CharacterCellHeight)
        Assert.AreEqual<int>(
            cc0CharacterVariantCount * cc0CharacterDirectionCount * cc0CharacterFrameCount,
            width / cc0CharacterCellWidth)
        Assert.AreEqual<int>(2, cc0CharacterCellWidth / cc0CharacterSourceWidth)
        Assert.AreEqual<int>(2, cc0CharacterCellHeight / cc0CharacterSourceHeight)

    [<TestMethod>]
    member _.AssetPackSwitchSelectsRealPackAndFallsBackToProcedural () =
        let previous = Environment.GetEnvironmentVariable "LV_ASSET_PACK"
        try
            Environment.SetEnvironmentVariable("LV_ASSET_PACK", null)
            Assert.IsFalse(useCc0Pack (), "unset switch must keep the procedural fallback")
            Assert.IsTrue((selectedGroundAtlasRelativePath ()).IsNone, "fallback ground is procedural")
            Assert.AreEqual<string>(characterAtlasRelativePath, selectedCharacterAtlasRelativePath ())

            Environment.SetEnvironmentVariable("LV_ASSET_PACK", "cc0")
            Assert.IsTrue(useCc0Pack (), "cc0 switch enables the real pack")
            Assert.IsTrue(selectedGroundAtlasRelativePath () = Some cc0TileAtlasRelativePath)
            Assert.AreEqual<string>(cc0CharacterAtlasRelativePath, selectedCharacterAtlasRelativePath ())

            Environment.SetEnvironmentVariable("LV_ASSET_PACK", "kenney")
            Assert.IsFalse(useCc0Pack (), "unknown pack value falls back to procedural")
        finally
            Environment.SetEnvironmentVariable("LV_ASSET_PACK", previous)