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")