summaryrefslogtreecommitdiffhomepage
path: root/packages/ext-window-field/tests/test_config.cpp
blob: 21b4230be84907126d83e21fb4b423a24b6480fd (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
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include <doctest/doctest.h>

#include "config.hpp"

#include <string_view>

// Pure-core tests for the [window-field] resize-policy loader (src/config.cpp).
// No kernel, no wlroots — just toml text in, ResizePolicy out. Mirrors
// ext-keybindings' config test posture: defaults on absence, per-key validation,
// warnings on bad values, never throws.

namespace cfg = unbox::ext_window_field::config;
using cfg::ResizeMode;

TEST_CASE("empty document yields defaults, no error") {
    const cfg::LoadResult r = cfg::load_from_string("");
    CHECK_FALSE(r.parse_error);
    CHECK(r.warnings.empty());
    CHECK(r.policy.mode == ResizeMode::settle);
    CHECK(r.policy.debounce_ms == 100);
}

TEST_CASE("absent [window-field] table yields defaults") {
    const cfg::LoadResult r = cfg::load_from_string("[other]\nkey = 1\n");
    CHECK_FALSE(r.parse_error);
    CHECK(r.warnings.empty());
    CHECK(r.policy.mode == ResizeMode::settle);
}

TEST_CASE("every resize_mode value parses") {
    CHECK(cfg::load_from_string("[window-field]\nresize_mode = \"off\"\n").policy.mode ==
          ResizeMode::off);
    CHECK(cfg::load_from_string("[window-field]\nresize_mode = \"settle\"\n").policy.mode ==
          ResizeMode::settle);
    CHECK(cfg::load_from_string("[window-field]\nresize_mode = \"continuous\"\n").policy.mode ==
          ResizeMode::continuous);
    CHECK(cfg::load_from_string("[window-field]\nresize_mode = \"debounced\"\n").policy.mode ==
          ResizeMode::debounced);
}

TEST_CASE("unknown resize_mode falls back to settle with a warning") {
    const cfg::LoadResult r =
        cfg::load_from_string("[window-field]\nresize_mode = \"wobble\"\n");
    CHECK_FALSE(r.parse_error);
    CHECK(r.policy.mode == ResizeMode::settle);
    CHECK(r.warnings.size() == 1);
}

TEST_CASE("non-string resize_mode warns and keeps default") {
    const cfg::LoadResult r = cfg::load_from_string("[window-field]\nresize_mode = 3\n");
    CHECK(r.policy.mode == ResizeMode::settle);
    CHECK(r.warnings.size() == 1);
}

TEST_CASE("resize_debounce_ms parses and is independent of mode") {
    const cfg::LoadResult r = cfg::load_from_string(
        "[window-field]\nresize_mode = \"debounced\"\nresize_debounce_ms = 250\n");
    CHECK(r.policy.mode == ResizeMode::debounced);
    CHECK(r.policy.debounce_ms == 250);
    CHECK(r.warnings.empty());
}

TEST_CASE("zero debounce is accepted") {
    const cfg::LoadResult r =
        cfg::load_from_string("[window-field]\nresize_debounce_ms = 0\n");
    CHECK(r.policy.debounce_ms == 0);
    CHECK(r.warnings.empty());
}

TEST_CASE("negative debounce warns and keeps default") {
    const cfg::LoadResult r =
        cfg::load_from_string("[window-field]\nresize_debounce_ms = -5\n");
    CHECK(r.policy.debounce_ms == 100);
    CHECK(r.warnings.size() == 1);
}

TEST_CASE("non-integer debounce warns and keeps default") {
    const cfg::LoadResult r =
        cfg::load_from_string("[window-field]\nresize_debounce_ms = \"soon\"\n");
    CHECK(r.policy.debounce_ms == 100);
    CHECK(r.warnings.size() == 1);
}

TEST_CASE("toml syntax error sets parse_error and keeps defaults") {
    const cfg::LoadResult r = cfg::load_from_string("[window-field\nresize_mode = ");
    CHECK(r.parse_error);
    CHECK(r.policy.mode == ResizeMode::settle);
    CHECK(r.warnings.size() == 1);
}

TEST_CASE("[window-field] not a table warns") {
    const cfg::LoadResult r = cfg::load_from_string("window-field = 5\n");
    CHECK_FALSE(r.parse_error);
    CHECK(r.warnings.size() == 1);
    CHECK(r.policy.mode == ResizeMode::settle);
}