if explicitly enabled, it will raise ImportError if uharfbuzz is not found, and will propagate the uharfbuzz error instead of silently falling back to the pure-python serializer
81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
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")
|