summaryrefslogtreecommitdiffhomepage
path: root/test/wall-atlas2.cpp
blob: fc8757675e73c93275b7bd4ad5ac50eed93dd52f (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
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "app.hpp"
#include "compat/assert.hpp"
#include "src/tile-constants.hpp"
#include "src/wall-atlas.hpp"
#include "loader/loader.hpp"
#include "loader/wall-info.hpp"

namespace floormat {

namespace {

void test_empty_wall()
{
    constexpr auto wall_size = Vector2ui(Vector2i{iTILE_SIZE.x(), iTILE_SIZE.z()});
    using enum Wall::Direction_;
    const auto& wall = *loader.wall_atlas("empty"_s);

#define assert_for_group(dir, g, x)                 \
    do {                                            \
        fm_assert(!g.is_defined);                   \
        fm_assert(g == Wall::Group{});              \
        fm_assert(g.count == 0);                    \
        fm_assert(g.index == (uint32_t)-1);         \
        fm_assert(g == Wall::Group{});              \
        fm_assert(!wall.group(dir, x));             \
    } while (false)

    fm_assert(wall_atlas::expected_size(wall.info().depth, Wall::Group_::wall) == wall_size);
    fm_assert(wall.depth() == 8);
    fm_assert(wall.direction_count() == 1);
    fm_assert(wall.raw_frame_array().size() == 1);
    fm_assert(wall.direction(N) != nullptr);
    const auto& n = *wall.direction(N);
    fm_assert(wall.direction(W) == nullptr);
    fm_assert(&wall.calc_direction(N) == wall.direction(N));
    fm_assert(&wall.calc_direction(W) == wall.direction(N));
    assert_for_group(N, n.side, Wall::Group_::side);
    assert_for_group(N, n.top, Wall::Group_::top);
    assert_for_group(N, n.corner, Wall::Group_::corner);
    fm_assert(n.wall.is_defined);
    fm_assert(n.wall != Wall::Group{});
    fm_assert(!n.wall.mirrored);
    fm_assert(n.wall.count > 0);
    fm_assert(n.wall.index != (uint32_t)-1);
    fm_assert(n.wall.pixel_size == wall_size);
    fm_assert(wall.raw_frame_array()[0].offset.isZero());
    fm_assert(wall.raw_frame_array()[0].size == wall_atlas::expected_size(wall.info().depth, Wall::Group_::wall));
    fm_assert(wall.info().name == "empty"_s);
    fm_assert(wall.info().passability == pass_mode::blocked);
}

void test_concrete_wall()
{
    using enum Wall::Direction_;
    constexpr auto name = "concrete1"_s;

    auto& wall = *loader.wall_atlas(name);
    fm_assert(wall.name() == name);
    fm_assert(wall.info().depth == 20);
    fm_assert(wall.raw_frame_array().size() >= 3);
    fm_assert(!wall.direction(W));
    fm_assert(wall.direction(N));
    fm_assert(&wall.calc_direction(W) == wall.direction(N));
    fm_assert(&wall.calc_direction(N) == wall.direction(N));
    fm_assert(wall.frames(N, Wall::Group_::wall).size() >= 3);
    fm_assert(wall.group(N, Wall::Group_::corner)->count > 0);
    fm_assert(wall.group(N, Wall::Group_::side)->count > 0);
    fm_assert(wall.group(N, Wall::Group_::top)->count > 0);
    fm_assert(wall.group(N, Wall::Group_::wall)->count > 1);
    fm_assert(wall.group(N, Wall::Group_::corner)->is_defined);
    fm_assert(wall.frames(N, Wall::Group_::wall)[0].size == Vector2ui(Vector2i{iTILE_SIZE.x(), iTILE_SIZE.z()}));
    fm_assert(&wall.calc_direction(N) == wall.direction(N));
    fm_assert(&wall.calc_direction(W) == wall.direction(N));
}

} // namespace

void test_app::test_wall_atlas2()
{
    test_empty_wall();
    test_concrete_wall();
}

// todo add test for wall-tileset-tool for making sure it generates the correct image pixels out of placeholder input

} // namespace floormat