aboutsummaryrefslogtreecommitdiff
path: root/Tests/misc/configTools_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/misc/configTools_test.py')
-rw-r--r--Tests/misc/configTools_test.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/Tests/misc/configTools_test.py b/Tests/misc/configTools_test.py
new file mode 100644
index 00000000..94afb233
--- /dev/null
+++ b/Tests/misc/configTools_test.py
@@ -0,0 +1,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")