Coverage for colour/models/rgb/transfer_functions/tests/test_dcdm.py: 100%
67 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-15 19:01 +1300
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-15 19:01 +1300
1"""
2Define the unit tests for the :mod:`colour.models.rgb.transfer_functions.dcdm`
3module.
4"""
6import numpy as np
8from colour.constants import TOLERANCE_ABSOLUTE_TESTS
9from colour.models.rgb.transfer_functions import eotf_DCDM, eotf_inverse_DCDM
10from colour.utilities import domain_range_scale, ignore_numpy_errors
12__author__ = "Colour Developers"
13__copyright__ = "Copyright 2013 Colour Developers"
14__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
15__maintainer__ = "Colour Developers"
16__email__ = "colour-developers@colour-science.org"
17__status__ = "Production"
19__all__ = [
20 "TestEotf_inverse_DCDM",
21 "TestEotf_DCDM",
22]
25class TestEotf_inverse_DCDM:
26 """
27 Define :func:`colour.models.rgb.transfer_functions.dcdm.eotf_inverse_DCDM`
28 definition unit tests methods.
29 """
31 def test_eotf_inverse_DCDM(self) -> None:
32 """
33 Test :func:`colour.models.rgb.transfer_functions.\
34dcdm.eotf_inverse_DCDM` definition.
35 """
37 np.testing.assert_allclose(
38 eotf_inverse_DCDM(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS
39 )
41 np.testing.assert_allclose(
42 eotf_inverse_DCDM(0.18), 0.11281861, atol=TOLERANCE_ABSOLUTE_TESTS
43 )
45 np.testing.assert_allclose(
46 eotf_inverse_DCDM(1.0), 0.21817973, atol=TOLERANCE_ABSOLUTE_TESTS
47 )
49 assert eotf_inverse_DCDM(0.18, out_int=True) == 462
51 def test_n_dimensional_eotf_inverse_DCDM(self) -> None:
52 """
53 Test :func:`colour.models.rgb.transfer_functions.dcdm.\
54eotf_inverse_DCDM` definition n-dimensional arrays support.
55 """
57 XYZ = 0.18
58 XYZ_p = eotf_inverse_DCDM(XYZ)
60 XYZ = np.tile(XYZ, 6)
61 XYZ_p = np.tile(XYZ_p, 6)
62 np.testing.assert_allclose(
63 eotf_inverse_DCDM(XYZ), XYZ_p, atol=TOLERANCE_ABSOLUTE_TESTS
64 )
66 XYZ = np.reshape(XYZ, (2, 3))
67 XYZ_p = np.reshape(XYZ_p, (2, 3))
68 np.testing.assert_allclose(
69 eotf_inverse_DCDM(XYZ), XYZ_p, atol=TOLERANCE_ABSOLUTE_TESTS
70 )
72 XYZ = np.reshape(XYZ, (2, 3, 1))
73 XYZ_p = np.reshape(XYZ_p, (2, 3, 1))
74 np.testing.assert_allclose(
75 eotf_inverse_DCDM(XYZ), XYZ_p, atol=TOLERANCE_ABSOLUTE_TESTS
76 )
78 def test_domain_range_scale_eotf_inverse_DCDM(self) -> None:
79 """
80 Test :func:`colour.models.rgb.transfer_functions.\
81dcdm.eotf_inverse_DCDM` definition domain and range scale support.
82 """
84 XYZ = 0.18
85 XYZ_p = eotf_inverse_DCDM(XYZ)
87 d_r = (("reference", 1), ("1", 1), ("100", 1))
88 for scale, factor in d_r:
89 with domain_range_scale(scale):
90 np.testing.assert_allclose(
91 eotf_inverse_DCDM(XYZ * factor),
92 XYZ_p * factor,
93 atol=TOLERANCE_ABSOLUTE_TESTS,
94 )
96 @ignore_numpy_errors
97 def test_nan_eotf_inverse_DCDM(self) -> None:
98 """
99 Test :func:`colour.models.rgb.transfer_functions.dcdm.\
100eotf_inverse_DCDM` definition nan support.
101 """
103 eotf_inverse_DCDM(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
106class TestEotf_DCDM:
107 """
108 Define :func:`colour.models.rgb.transfer_functions.dcdm.eotf_DCDM`
109 definition unit tests methods.
110 """
112 def test_eotf_DCDM(self) -> None:
113 """
114 Test :func:`colour.models.rgb.transfer_functions.dcdm.eotf_DCDM`
115 definition.
116 """
118 np.testing.assert_allclose(eotf_DCDM(0.0), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS)
120 np.testing.assert_allclose(
121 eotf_DCDM(0.11281861), 0.18, atol=TOLERANCE_ABSOLUTE_TESTS
122 )
124 np.testing.assert_allclose(
125 eotf_DCDM(0.21817973), 1.0, atol=TOLERANCE_ABSOLUTE_TESTS
126 )
128 np.testing.assert_allclose(eotf_DCDM(462, in_int=True), 0.18, atol=1e-5)
130 def test_n_dimensional_eotf_DCDM(self) -> None:
131 """
132 Test :func:`colour.models.rgb.transfer_functions.dcdm.eotf_DCDM`
133 definition n-dimensional arrays support.
134 """
136 XYZ_p = 0.11281861
137 XYZ = eotf_DCDM(XYZ_p)
139 XYZ_p = np.tile(XYZ_p, 6)
140 XYZ = np.tile(XYZ, 6)
141 np.testing.assert_allclose(eotf_DCDM(XYZ_p), XYZ, atol=TOLERANCE_ABSOLUTE_TESTS)
143 XYZ_p = np.reshape(XYZ_p, (2, 3))
144 XYZ = np.reshape(XYZ, (2, 3))
145 np.testing.assert_allclose(eotf_DCDM(XYZ_p), XYZ, atol=TOLERANCE_ABSOLUTE_TESTS)
147 XYZ_p = np.reshape(XYZ_p, (2, 3, 1))
148 XYZ = np.reshape(XYZ, (2, 3, 1))
149 np.testing.assert_allclose(eotf_DCDM(XYZ_p), XYZ, atol=TOLERANCE_ABSOLUTE_TESTS)
151 def test_domain_range_scale_eotf_DCDM(self) -> None:
152 """
153 Test :func:`colour.models.rgb.transfer_functions.dcdm.eotf_DCDM`
154 definition domain and range scale support.
155 """
157 XYZ_p = 0.11281861
158 XYZ = eotf_DCDM(XYZ_p)
160 d_r = (("reference", 1), ("1", 1), ("100", 1))
161 for scale, factor in d_r:
162 with domain_range_scale(scale):
163 np.testing.assert_allclose(
164 eotf_DCDM(XYZ_p * factor),
165 XYZ * factor,
166 atol=TOLERANCE_ABSOLUTE_TESTS,
167 )
169 @ignore_numpy_errors
170 def test_nan_eotf_DCDM(self) -> None:
171 """
172 Test :func:`colour.models.rgb.transfer_functions.dcdm.eotf_DCDM`
173 definition nan support.
174 """
176 eotf_DCDM(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))