-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Expand file tree
/
Copy pathtest_color.py
More file actions
132 lines (119 loc) · 4.78 KB
/
test_color.py
File metadata and controls
132 lines (119 loc) · 4.78 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# pyright: reportPrivateUsage=false
"""Unit-test suite for the `docx.dml.color` module."""
from __future__ import annotations
from typing import cast
import pytest
from docx.dml.color import ColorFormat
from docx.enum.dml import MSO_COLOR_TYPE, MSO_THEME_COLOR
from docx.oxml.text.run import CT_R
from docx.shared import RGBColor
from ..unitutil.cxml import element, xml
class DescribeColorFormat:
"""Unit-test suite for `docx.dml.color.ColorFormat` objects."""
@pytest.mark.parametrize(
("r_cxml", "expected_value"),
[
("w:r", None),
("w:r/w:rPr", None),
("w:r/w:rPr/w:color{w:val=auto}", MSO_COLOR_TYPE.AUTO),
("w:r/w:rPr/w:color{w:val=4224FF}", MSO_COLOR_TYPE.RGB),
("w:r/w:rPr/w:color{w:themeColor=dark1}", MSO_COLOR_TYPE.THEME),
(
"w:r/w:rPr/w:color{w:val=F00BA9,w:themeColor=accent1}",
MSO_COLOR_TYPE.THEME,
),
],
)
def it_knows_its_color_type(self, r_cxml: str, expected_value: MSO_COLOR_TYPE | None):
assert ColorFormat(cast(CT_R, element(r_cxml))).type == expected_value
@pytest.mark.parametrize(
("r_cxml", "rgb"),
[
("w:r", None),
("w:r/w:rPr", None),
("w:r/w:rPr/w:color{w:val=auto}", None),
("w:r/w:rPr/w:color{w:val=4224FF}", "4224ff"),
("w:r/w:rPr/w:color{w:val=auto,w:themeColor=accent1}", None),
("w:r/w:rPr/w:color{w:val=F00BA9,w:themeColor=accent1}", "f00ba9"),
],
)
def it_knows_its_RGB_value(self, r_cxml: str, rgb: str | None):
expected_value = RGBColor.from_string(rgb) if rgb else None
assert ColorFormat(cast(CT_R, element(r_cxml))).rgb == expected_value
@pytest.mark.parametrize(
("r_cxml", "new_value", "expected_cxml"),
[
("w:r", RGBColor(10, 20, 30), "w:r/w:rPr/w:color{w:val=0A141E}"),
("w:r/w:rPr", RGBColor(1, 2, 3), "w:r/w:rPr/w:color{w:val=010203}"),
(
"w:r/w:rPr/w:color{w:val=123abc}",
RGBColor(42, 24, 99),
"w:r/w:rPr/w:color{w:val=2A1863}",
),
(
"w:r/w:rPr/w:color{w:val=auto}",
RGBColor(16, 17, 18),
"w:r/w:rPr/w:color{w:val=101112}",
),
(
"w:r/w:rPr/w:color{w:val=234bcd,w:themeColor=dark1}",
RGBColor(24, 42, 99),
"w:r/w:rPr/w:color{w:val=182A63}",
),
("w:r/w:rPr/w:color{w:val=234bcd,w:themeColor=dark1}", None, "w:r/w:rPr"),
("w:r", None, "w:r"),
],
)
def it_can_change_its_RGB_value(
self, r_cxml: str, new_value: RGBColor | None, expected_cxml: str
):
color_format = ColorFormat(cast(CT_R, element(r_cxml)))
color_format.rgb = new_value
assert color_format._element.xml == xml(expected_cxml)
@pytest.mark.parametrize(
("r_cxml", "expected_value"),
[
("w:r", None),
("w:r/w:rPr", None),
("w:r/w:rPr/w:color{w:val=auto}", None),
("w:r/w:rPr/w:color{w:val=4224FF}", None),
("w:r/w:rPr/w:color{w:themeColor=accent1}", MSO_THEME_COLOR.ACCENT_1),
("w:r/w:rPr/w:color{w:val=F00BA9,w:themeColor=dark1}", MSO_THEME_COLOR.DARK_1),
],
)
def it_knows_its_theme_color(self, r_cxml: str, expected_value: MSO_THEME_COLOR | None):
color_format = ColorFormat(cast(CT_R, element(r_cxml)))
assert color_format.theme_color == expected_value
@pytest.mark.parametrize(
("r_cxml", "new_value", "expected_cxml"),
[
(
"w:r",
MSO_THEME_COLOR.ACCENT_1,
"w:r/w:rPr/w:color{w:val=000000,w:themeColor=accent1}",
),
(
"w:r/w:rPr",
MSO_THEME_COLOR.ACCENT_2,
"w:r/w:rPr/w:color{w:val=000000,w:themeColor=accent2}",
),
(
"w:r/w:rPr/w:color{w:val=101112}",
MSO_THEME_COLOR.ACCENT_3,
"w:r/w:rPr/w:color{w:val=101112,w:themeColor=accent3}",
),
(
"w:r/w:rPr/w:color{w:val=234bcd,w:themeColor=dark1}",
MSO_THEME_COLOR.LIGHT_2,
"w:r/w:rPr/w:color{w:val=234bcd,w:themeColor=light2}",
),
("w:r/w:rPr/w:color{w:val=234bcd,w:themeColor=dark1}", None, "w:r/w:rPr"),
("w:r", None, "w:r"),
],
)
def it_can_change_its_theme_color(
self, r_cxml: str, new_value: MSO_THEME_COLOR | None, expected_cxml: str
):
color_format = ColorFormat(cast(CT_R, element(r_cxml)))
color_format.theme_color = new_value
assert color_format._element.xml == xml(expected_cxml)