summaryrefslogtreecommitdiffhomepage
path: root/editor/tests.cpp
blob: ee108d0100b30e0bf945814f6fe857b458cc36be (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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "tests-private.hpp"
#include "app.hpp"
#include "floormat/events.hpp"
#include "imgui-raii.hpp"
#define HAVE_LIBC 1
#include <SDL_keycode.h>

namespace floormat {

using namespace floormat::tests;

tests_data_::~tests_data_() noexcept = default;
tests_data_::tests_data_() = default;

tests_data::~tests_data() noexcept = default;
tests_data::tests_data() = default;

base_test::~base_test() noexcept = default;
base_test::base_test() = default;

using namespace floormat::imgui;

void tests_data::switch_to(size_t i)
{
    constexpr auto size = std::variant_size_v<tests::variant>;
    fm_assert(i < size);
    switch (i)
    {
    case 0: *this = std::monostate{}; break;
    case 1: *this = path_test{}; break;
    }
}

Pointer<tests_data_> tests_data_::make()
{
    return Pointer<tests_data>{InPlaceInit};
}

void app::tests_pre_update()
{
    std::visit(overloaded {
        [](std::monostate) {},
        [&](base_test& x) { return x.update_pre(*this); }
    }, tests());
}

void app::tests_post_update()
{
    std::visit(overloaded {
        [](std::monostate) {},
        [&](base_test& x) { return x.update_post(*this); }
    }, tests());
}

bool app::tests_handle_mouse_click(const mouse_button_event& e, bool is_down)
{
    update_cursor_tile(cursor.pixel);

    return std::visit(overloaded {
        [](std::monostate) { return false; },
        [&](base_test& x) { return x.handle_mouse_click(*this, e, is_down); }
    }, tests());
}

bool app::tests_handle_key(const key_event& e, bool is_down)
{
    switch (e.key)
    {
    case SDLK_ESCAPE:
        tests().switch_to(0);
        return true;
    default:
        return std::visit(overloaded {
            [](std::monostate) { return false; },
            [&](base_test& x) { return x.handle_key(*this, e, is_down); }
        }, tests());
    }
}

bool app::tests_handle_mouse_move(const mouse_move_event& e)
{
    return std::visit(overloaded {
        [](std::monostate) { return false; },
        [&](base_test& x) { return x.handle_mouse_move(*this, e); }
    }, tests());
}

tests_data& app::tests()
{
    return static_cast<tests_data&>(*_tests);
}

void app::tests_reset_mode()
{
    if (!std::holds_alternative<std::monostate>(tests()))
        tests() = std::monostate{};
}

void app::draw_tests_pane()
{
    ImGui::SeparatorText("Functional tests");

    constexpr int selectable_flags = ImGuiSelectableFlags_SpanAvailWidth;
    for (auto [str, i] : tests_data::fields)
        if (ImGui::Selectable(str.data(), i == tests().index(), selectable_flags))
            tests().switch_to(i);
}

void app::draw_tests_overlay()
{
    std::visit(overloaded {
        [](std::monostate) {},
        [&](base_test& x) { return x.draw_overlay(*this); }
    }, tests());
}

} // namespace floormat