-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmodifiers_test.py
90 lines (62 loc) · 2.6 KB
/
modifiers_test.py
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
81
82
83
84
85
86
87
88
89
90
from __future__ import annotations
from dataclasses import MISSING, Field, field
from itertools import combinations
import pytest
from xml_dataclasses.modifiers import ignored, rename, text
def dict_comb(items, r=2):
return [{**a, **b} for a, b in combinations(items, r)]
DEFAULTS = [MISSING, None, "bar"]
def test_rename_no_field_no_default():
f = rename()
assert isinstance(f, Field)
assert f.default is MISSING
assert f.metadata == {}
@pytest.mark.parametrize("default", DEFAULTS)
def test_rename_no_field_default(default):
f = rename(default=default)
assert isinstance(f, Field)
assert f.default is default
assert f.metadata == {}
@pytest.mark.parametrize("default", DEFAULTS)
def test_rename_has_field_default_ignored(default):
expected_field = field(metadata={"foo": "bar"})
expected_md = dict(expected_field.metadata)
actual_field = rename(expected_field, default=default)
assert actual_field is expected_field
assert actual_field.default is MISSING
assert actual_field.metadata == expected_md
@pytest.mark.parametrize("kwargs", dict_comb(({}, {"name": "bar"}, {"ns": "bar"})))
def test_rename_no_metadata(kwargs):
actual_field = rename(field(), **kwargs)
expected_md = {f"xml:{k}": v for k, v in kwargs.items()}
assert actual_field.metadata == expected_md
@pytest.mark.parametrize("kwargs", dict_comb(({}, {"name": "bar"}, {"ns": "bar"})))
def test_rename_has_metadata(kwargs):
expected_field = field(metadata={"foo": "bar"})
expected_md = dict(expected_field.metadata)
expected_md.update({f"xml:{k}": v for k, v in kwargs.items()})
actual_field = rename(expected_field, **kwargs)
assert actual_field.metadata == expected_md
def test_text_no_field_no_default():
f = text()
assert isinstance(f, Field)
assert f.default is MISSING
assert f.metadata == {"xml:text": True}
@pytest.mark.parametrize("default", DEFAULTS)
def test_text_no_field_default(default):
f = text(default=default)
assert isinstance(f, Field)
assert f.default is default
assert f.metadata == {"xml:text": True}
@pytest.mark.parametrize("default", DEFAULTS)
def test_text_has_field_default_ignored(default):
expected_field = field(metadata={"foo": "bar"})
expected_md = {**expected_field.metadata, "xml:text": True}
actual_field = text(expected_field, default=default)
assert actual_field is expected_field
assert actual_field.default is MISSING
assert actual_field.metadata == expected_md
def test_ignored_field():
actual_field = ignored()
assert not actual_field.init
assert not actual_field.compare