aboutsummaryrefslogtreecommitdiff
path: root/Tests/misc/configTools_test.py
blob: 94afb233d2ff8db0a0e23c21478d9d56946b7df3 (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
import dataclasses
import pytest

from fontTools.misc.configTools import (
    AbstractConfig,
    Option,
    Options,
    ConfigUnknownOptionError,
)


def test_can_create_custom_config_system():
    class MyConfig(AbstractConfig):
        options = Options()

    MyConfig.register_option(
        "test:option_name",
        "This is an option",
        0,
        int,
        lambda v: isinstance(v, int),
    )

    cfg = MyConfig({"test:option_name": "10"}, parse_values=True)

    assert 10 == cfg["test:option_name"]

    # This config is independent from "the" fontTools config
    with pytest.raises(ConfigUnknownOptionError):
        MyConfig({"fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL": 4})

    # Test the repr()
    assert repr(cfg) == "MyConfig({'test:option_name': 10})"

    # Test the skip_unknown param: just check that the following does not raise
    MyConfig({"test:unknown": "whatever"}, skip_unknown=True)

    # Test that it raises on unknown option
    with pytest.raises(ConfigUnknownOptionError):
        cfg.get("test:unknown")


def test_options_are_unique():
    class MyConfig(AbstractConfig):
        options = Options()

    opt1 = MyConfig.register_option("test:OPT_1", "", "foo", str, any)
    cfg = MyConfig({opt1: "bar"})
    assert cfg[opt1] == "bar"

    opt2 = Option("test:OPT_1", "", "foo", str, any)

    assert dataclasses.asdict(opt1) == dataclasses.asdict(opt2)
    assert opt1 != opt2

    with pytest.raises(ConfigUnknownOptionError):
        cfg.get(opt2)
    with pytest.raises(ConfigUnknownOptionError):
        cfg.set(opt2, "bar")


def test_optional_bool():
    for v in ("yes", "YES", "Yes", "1", "True", "true", "TRUE"):
        assert Option.parse_optional_bool(v) is True

    for v in ("no", "NO", "No", "0", "False", "false", "FALSE"):
        assert Option.parse_optional_bool(v) is False

    for v in ("auto", "AUTO", "Auto", "None", "none", "NONE"):
        assert Option.parse_optional_bool(v) is None

    with pytest.raises(ValueError, match="invalid optional bool"):
        Option.parse_optional_bool("foobar")

    assert Option.validate_optional_bool(True)
    assert Option.validate_optional_bool(False)
    assert Option.validate_optional_bool(None)
    assert not Option.validate_optional_bool(1)
    assert not Option.validate_optional_bool(0)
    assert not Option.validate_optional_bool("1")