aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_themes.py
blob: 9843d8906b941a4a6af5d6de35ebb06936cd3746 (plain) (blame)
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
#!/usr/bin/env python3
"""The themes in contrib/.

Mostly a guard: a theme file that has fallen behind the config silently keeps
the compiled-in default for whatever it forgot, which looks like a bug in the
theme rather than a missing line in it.
"""

import glob
import os
import re
import sys

from harness import Session, check, report

SH = ["/bin/sh", "-c", 'printf "\\033]2;p\\007"; stty raw -echo; cat']
HERE = os.path.dirname(os.path.abspath(__file__))
THEMES = sorted(glob.glob(os.path.join(HERE, "..", "contrib", "themes", "*.kdl")))


def declared_in_config():
    src = open(os.path.join(HERE, "..", "src", "config.c")).read()
    return set(re.findall(r'\{"([a-z_]+)", &c->', src))


def set_by(path):
    return set(re.findall(r'^    ([a-z_]+) "', open(path).read(), re.M))


def test_there_are_themes():
    check("contrib ships some", len(THEMES) >= 3, str(THEMES))


def test_each_sets_every_colour_the_config_knows():
    want = declared_in_config()
    for t in THEMES:
        missing = want - set_by(t)
        check(
            f"{os.path.basename(t)} sets all {len(want)} of them",
            not missing,
            "missing: " + ", ".join(sorted(missing)),
        )


def test_each_one_parses_and_reaches_the_screen():
    for t in THEMES:
        declared = dict(
            re.findall(r'^    ([a-z_]+) "(#[0-9a-fA-F]{6})"', open(t).read(), re.M)
        )
        with Session(SH, cols=50, rows=10, config=os.path.abspath(t)) as s:
            s.settle(30)
            snap, p = s.snapshot(), s.pane()
            drawn = (snap.style_at(p["x"], p["y"] + 1) or {}).get("fg")
            check(
                f"{os.path.basename(t)} draws its own frame colour",
                drawn == declared["frame_focus"],
                f"{drawn} != {declared['frame_focus']}",
            )
            check(f"{os.path.basename(t)} leaves the session alive", s.alive(), "")


if __name__ == "__main__":
    test_there_are_themes()
    test_each_sets_every_colour_the_config_knows()
    test_each_one_parses_and_reaches_the_screen()
    sys.exit(report())