Coverage for models/tests/test_jzazbz.py: 100%
122 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-16 22:49 +1300
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-16 22:49 +1300
1"""Define the unit tests for the :mod:`colour.models.jzazbz` module."""
3from __future__ import annotations
5from itertools import product
7import numpy as np
9from colour.constants import TOLERANCE_ABSOLUTE_TESTS
10from colour.models import Izazbz_to_XYZ, Jzazbz_to_XYZ, XYZ_to_Izazbz, XYZ_to_Jzazbz
11from colour.utilities import domain_range_scale, ignore_numpy_errors
13__author__ = "Colour Developers"
14__copyright__ = "Copyright 2013 Colour Developers"
15__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
16__maintainer__ = "Colour Developers"
17__email__ = "colour-developers@colour-science.org"
18__status__ = "Production"
20__all__ = [
21 "TestXYZ_to_Izazbz",
22 "TestIzazbz_to_XYZ",
23 "TestXYZ_to_Jzazbz",
24 "TestJzazbz_to_XYZ",
25]
28class TestXYZ_to_Izazbz:
29 """
30 Define :func:`colour.models.jzazbz.TestXYZ_to_Izazbz` definition unit
31 tests methods.
32 """
34 def test_XYZ_to_Izazbz(self) -> None:
35 """Test :func:`colour.models.jzazbz.XYZ_to_Izazbz` definition."""
37 np.testing.assert_allclose(
38 XYZ_to_Izazbz(np.array([0.20654008, 0.12197225, 0.05136952])),
39 np.array([0.01207793, 0.00924302, 0.00526007]),
40 atol=TOLERANCE_ABSOLUTE_TESTS,
41 )
43 np.testing.assert_allclose(
44 XYZ_to_Izazbz(np.array([0.14222010, 0.23042768, 0.10495772])),
45 np.array([0.01397346, -0.00608426, 0.00534077]),
46 atol=TOLERANCE_ABSOLUTE_TESTS,
47 )
49 np.testing.assert_allclose(
50 XYZ_to_Izazbz(np.array([0.96907232, 1.00000000, 1.12179215])),
51 np.array([0.03927203, 0.00064174, -0.00052906]),
52 atol=TOLERANCE_ABSOLUTE_TESTS,
53 )
55 np.testing.assert_allclose(
56 XYZ_to_Izazbz(
57 np.array([0.20654008, 0.12197225, 0.05136952]),
58 method="Safdar 2021",
59 ),
60 np.array([0.01049146, 0.00924302, 0.00526007]),
61 atol=TOLERANCE_ABSOLUTE_TESTS,
62 )
64 np.testing.assert_array_equal(
65 XYZ_to_Izazbz(
66 np.array([0.20654008, 0.12197225, 0.05136952]),
67 method="Safdar 2021",
68 ),
69 XYZ_to_Izazbz(
70 np.array([0.20654008, 0.12197225, 0.05136952]), method="ZCAM"
71 ),
72 )
74 def test_n_dimensional_XYZ_to_Izazbz(self) -> None:
75 """
76 Test :func:`colour.models.jzazbz.XYZ_to_Izazbz` definition
77 n-dimensional support.
78 """
80 XYZ = np.array([0.20654008, 0.12197225, 0.05136952])
81 Izazbz = XYZ_to_Izazbz(XYZ)
83 XYZ = np.tile(XYZ, (6, 1))
84 Izazbz = np.tile(Izazbz, (6, 1))
85 np.testing.assert_allclose(
86 XYZ_to_Izazbz(XYZ), Izazbz, atol=TOLERANCE_ABSOLUTE_TESTS
87 )
89 XYZ = np.reshape(XYZ, (2, 3, 3))
90 Izazbz = np.reshape(Izazbz, (2, 3, 3))
91 np.testing.assert_allclose(
92 XYZ_to_Izazbz(XYZ), Izazbz, atol=TOLERANCE_ABSOLUTE_TESTS
93 )
95 def test_domain_range_scale_XYZ_to_Izazbz(self) -> None:
96 """
97 Test :func:`colour.models.jzazbz.XYZ_to_Izazbz` definition domain and
98 range scale support.
99 """
101 XYZ = np.array([0.20654008, 0.12197225, 0.05136952])
102 Izazbz = XYZ_to_Izazbz(XYZ)
104 d_r = (("reference", 1), ("1", 1), ("100", 1))
105 for scale, factor in d_r:
106 with domain_range_scale(scale):
107 np.testing.assert_allclose(
108 XYZ_to_Izazbz(XYZ * factor),
109 Izazbz * factor,
110 atol=TOLERANCE_ABSOLUTE_TESTS,
111 )
113 @ignore_numpy_errors
114 def test_nan_XYZ_to_Izazbz(self) -> None:
115 """
116 Test :func:`colour.models.jzazbz.XYZ_to_Izazbz` definition nan
117 support.
118 """
120 cases = [-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]
121 cases = np.array(list(set(product(cases, repeat=3))))
122 XYZ_to_Izazbz(cases)
125class TestIzazbz_to_XYZ:
126 """
127 Define :func:`colour.models.jzazbz.Izazbz_to_XYZ` definition unit tests
128 methods.
129 """
131 def test_Izazbz_to_XYZ(self) -> None:
132 """Test :func:`colour.models.jzazbz.Izazbz_to_XYZ` definition."""
134 np.testing.assert_allclose(
135 Izazbz_to_XYZ(np.array([0.01207793, 0.00924302, 0.00526007])),
136 np.array([0.20654008, 0.12197225, 0.05136952]),
137 atol=TOLERANCE_ABSOLUTE_TESTS,
138 )
140 np.testing.assert_allclose(
141 Izazbz_to_XYZ(np.array([0.01397346, -0.00608426, 0.00534077])),
142 np.array([0.14222010, 0.23042768, 0.10495772]),
143 atol=TOLERANCE_ABSOLUTE_TESTS,
144 )
146 np.testing.assert_allclose(
147 Izazbz_to_XYZ(np.array([0.03927203, 0.00064174, -0.00052906])),
148 np.array([0.96907232, 1.00000000, 1.12179215]),
149 atol=TOLERANCE_ABSOLUTE_TESTS,
150 )
152 np.testing.assert_allclose(
153 Izazbz_to_XYZ(np.array([0.03927203, 0.00064174, -0.00052906])),
154 np.array([0.96907232, 1.00000000, 1.12179215]),
155 atol=TOLERANCE_ABSOLUTE_TESTS,
156 )
158 np.testing.assert_allclose(
159 Izazbz_to_XYZ(
160 np.array([0.01049146, 0.00924302, 0.00526007]),
161 method="Safdar 2021",
162 ),
163 np.array([0.20654008, 0.12197225, 0.05136952]),
164 atol=TOLERANCE_ABSOLUTE_TESTS,
165 )
167 np.testing.assert_array_equal(
168 Izazbz_to_XYZ(
169 np.array([0.01049146, 0.00924302, 0.00526007]),
170 method="Safdar 2021",
171 ),
172 Izazbz_to_XYZ(
173 np.array([0.01049146, 0.00924302, 0.00526007]), method="ZCAM"
174 ),
175 )
177 def test_n_dimensional_Izazbz_to_XYZ(self) -> None:
178 """
179 Test :func:`colour.models.jzazbz.Izazbz_to_XYZ` definition
180 n-dimensional support.
181 """
183 Izazbz = np.array([0.01207793, 0.00924302, 0.00526007])
184 XYZ = Izazbz_to_XYZ(Izazbz)
186 Izazbz = np.tile(Izazbz, (6, 1))
187 XYZ = np.tile(XYZ, (6, 1))
188 np.testing.assert_allclose(
189 Izazbz_to_XYZ(Izazbz), XYZ, atol=TOLERANCE_ABSOLUTE_TESTS
190 )
192 Izazbz = np.reshape(Izazbz, (2, 3, 3))
193 XYZ = np.reshape(XYZ, (2, 3, 3))
194 np.testing.assert_allclose(
195 Izazbz_to_XYZ(Izazbz), XYZ, atol=TOLERANCE_ABSOLUTE_TESTS
196 )
198 def test_domain_range_scale_Izazbz_to_XYZ(self) -> None:
199 """
200 Test :func:`colour.models.jzazbz.Izazbz_to_XYZ` definition domain and
201 range scale support.
202 """
204 Izazbz = np.array([0.01207793, 0.00924302, 0.00526007])
205 XYZ = Izazbz_to_XYZ(Izazbz)
207 d_r = (("reference", 1), ("1", 1), ("100", 1))
208 for scale, factor in d_r:
209 with domain_range_scale(scale):
210 np.testing.assert_allclose(
211 Izazbz_to_XYZ(Izazbz * factor),
212 XYZ * factor,
213 atol=TOLERANCE_ABSOLUTE_TESTS,
214 )
216 @ignore_numpy_errors
217 def test_nan_Izazbz_to_XYZ(self) -> None:
218 """
219 Test :func:`colour.models.jzazbz.Izazbz_to_XYZ` definition nan
220 support.
221 """
223 cases = [-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]
224 cases = np.array(list(set(product(cases, repeat=3))))
225 Izazbz_to_XYZ(cases)
228class TestXYZ_to_Jzazbz:
229 """
230 Define :func:`colour.models.jzazbz.TestXYZ_to_Jzazbz` definition unit
231 tests methods.
232 """
234 def test_XYZ_to_Jzazbz(self) -> None:
235 """Test :func:`colour.models.jzazbz.XYZ_to_Jzazbz` definition."""
237 np.testing.assert_allclose(
238 XYZ_to_Jzazbz(np.array([0.20654008, 0.12197225, 0.05136952])),
239 np.array([0.00535048, 0.00924302, 0.00526007]),
240 atol=TOLERANCE_ABSOLUTE_TESTS,
241 )
243 np.testing.assert_allclose(
244 XYZ_to_Jzazbz(np.array([0.14222010, 0.23042768, 0.10495772])),
245 np.array([0.00619681, -0.00608426, 0.00534077]),
246 atol=TOLERANCE_ABSOLUTE_TESTS,
247 )
249 np.testing.assert_allclose(
250 XYZ_to_Jzazbz(np.array([0.96907232, 1.00000000, 1.12179215])),
251 np.array([0.01766826, 0.00064174, -0.00052906]),
252 atol=TOLERANCE_ABSOLUTE_TESTS,
253 )
255 def test_n_dimensional_XYZ_to_Jzazbz(self) -> None:
256 """
257 Test :func:`colour.models.jzazbz.XYZ_to_Jzazbz` definition
258 n-dimensional support.
259 """
261 XYZ = np.array([0.20654008, 0.12197225, 0.05136952])
262 Jzazbz = XYZ_to_Jzazbz(XYZ)
264 XYZ = np.tile(XYZ, (6, 1))
265 Jzazbz = np.tile(Jzazbz, (6, 1))
266 np.testing.assert_allclose(
267 XYZ_to_Jzazbz(XYZ), Jzazbz, atol=TOLERANCE_ABSOLUTE_TESTS
268 )
270 XYZ = np.reshape(XYZ, (2, 3, 3))
271 Jzazbz = np.reshape(Jzazbz, (2, 3, 3))
272 np.testing.assert_allclose(
273 XYZ_to_Jzazbz(XYZ), Jzazbz, atol=TOLERANCE_ABSOLUTE_TESTS
274 )
276 def test_domain_range_scale_XYZ_to_Jzazbz(self) -> None:
277 """
278 Test :func:`colour.models.jzazbz.XYZ_to_Jzazbz` definition domain and
279 range scale support.
280 """
282 XYZ = np.array([0.20654008, 0.12197225, 0.05136952])
283 Jzazbz = XYZ_to_Jzazbz(XYZ)
285 d_r = (("reference", 1), ("1", 1), ("100", 1))
286 for scale, factor in d_r:
287 with domain_range_scale(scale):
288 np.testing.assert_array_equal(
289 XYZ_to_Jzazbz(XYZ * factor), Jzazbz * factor
290 )
292 @ignore_numpy_errors
293 def test_nan_XYZ_to_Jzazbz(self) -> None:
294 """
295 Test :func:`colour.models.jzazbz.XYZ_to_Jzazbz` definition nan
296 support.
297 """
299 cases = [-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]
300 cases = np.array(list(set(product(cases, repeat=3))))
301 XYZ_to_Jzazbz(cases)
304class TestJzazbz_to_XYZ:
305 """
306 Define :func:`colour.models.jzazbz.Jzazbz_to_XYZ` definition unit tests
307 methods.
308 """
310 def test_Jzazbz_to_XYZ(self) -> None:
311 """Test :func:`colour.models.jzazbz.Jzazbz_to_XYZ` definition."""
313 np.testing.assert_allclose(
314 Jzazbz_to_XYZ(np.array([0.00535048, 0.00924302, 0.00526007])),
315 np.array([0.20654008, 0.12197225, 0.05136952]),
316 atol=1e-6,
317 )
319 np.testing.assert_allclose(
320 Jzazbz_to_XYZ(np.array([0.00619681, -0.00608426, 0.00534077])),
321 np.array([0.14222010, 0.23042768, 0.10495772]),
322 atol=1e-6,
323 )
325 np.testing.assert_allclose(
326 Jzazbz_to_XYZ(np.array([0.01766826, 0.00064174, -0.00052906])),
327 np.array([0.96907232, 1.00000000, 1.12179215]),
328 atol=1e-6,
329 )
331 def test_n_dimensional_Jzazbz_to_XYZ(self) -> None:
332 """
333 Test :func:`colour.models.jzazbz.Jzazbz_to_XYZ` definition
334 n-dimensional support.
335 """
337 Jzazbz = np.array([0.00535048, 0.00924302, 0.00526007])
338 XYZ = Jzazbz_to_XYZ(Jzazbz)
340 Jzazbz = np.tile(Jzazbz, (6, 1))
341 XYZ = np.tile(XYZ, (6, 1))
342 np.testing.assert_allclose(
343 Jzazbz_to_XYZ(Jzazbz), XYZ, atol=TOLERANCE_ABSOLUTE_TESTS
344 )
346 Jzazbz = np.reshape(Jzazbz, (2, 3, 3))
347 XYZ = np.reshape(XYZ, (2, 3, 3))
348 np.testing.assert_allclose(
349 Jzazbz_to_XYZ(Jzazbz), XYZ, atol=TOLERANCE_ABSOLUTE_TESTS
350 )
352 def test_domain_range_scale_Jzazbz_to_XYZ(self) -> None:
353 """
354 Test :func:`colour.models.jzazbz.Jzazbz_to_XYZ` definition domain and
355 range scale support.
356 """
358 Jzazbz = np.array([0.00535048, 0.00924302, 0.00526007])
359 XYZ = Jzazbz_to_XYZ(Jzazbz)
361 d_r = (("reference", 1), ("1", 1), ("100", 1))
362 for scale, factor in d_r:
363 with domain_range_scale(scale):
364 np.testing.assert_allclose(
365 Jzazbz_to_XYZ(Jzazbz * factor),
366 XYZ * factor,
367 atol=TOLERANCE_ABSOLUTE_TESTS,
368 )
370 @ignore_numpy_errors
371 def test_nan_Jzazbz_to_XYZ(self) -> None:
372 """
373 Test :func:`colour.models.jzazbz.Jzazbz_to_XYZ` definition nan
374 support.
375 """
377 cases = [-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]
378 cases = np.array(list(set(product(cases, repeat=3))))
379 Jzazbz_to_XYZ(cases)