Coverage for plotting/tests/test_models.py: 100%
128 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.plotting.models` module."""
3from __future__ import annotations
5import numpy as np
6import pytest
7from matplotlib.axes import Axes
8from matplotlib.figure import Figure
10from colour.constants import TOLERANCE_ABSOLUTE_TESTS
11from colour.plotting import (
12 colourspace_model_axis_reorder,
13 lines_pointer_gamut,
14 plot_constant_hue_loci,
15 plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1931,
16 plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1960UCS,
17 plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1976UCS,
18 plot_multi_cctfs,
19 plot_pointer_gamut,
20 plot_RGB_chromaticities_in_chromaticity_diagram_CIE1931,
21 plot_RGB_chromaticities_in_chromaticity_diagram_CIE1960UCS,
22 plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS,
23 plot_RGB_colourspaces_in_chromaticity_diagram_CIE1931,
24 plot_RGB_colourspaces_in_chromaticity_diagram_CIE1960UCS,
25 plot_RGB_colourspaces_in_chromaticity_diagram_CIE1976UCS,
26 plot_single_cctf,
27)
28from colour.plotting.models import (
29 ellipses_MacAdam1942,
30 plot_ellipses_MacAdam1942_in_chromaticity_diagram,
31 plot_RGB_chromaticities_in_chromaticity_diagram,
32 plot_RGB_colourspaces_in_chromaticity_diagram,
33)
34from colour.utilities import is_scipy_installed
36__author__ = "Colour Developers"
37__copyright__ = "Copyright 2013 Colour Developers"
38__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
39__maintainer__ = "Colour Developers"
40__email__ = "colour-developers@colour-science.org"
41__status__ = "Production"
43__all__ = [
44 "TestCommonColourspaceModelAxisReorder",
45 "TestLinesPointerGamut",
46 "TestPlotPointerGamut",
47 "TestPlotRGBColourspacesInChromaticityDiagram",
48 "TestPlotRGBColourspacesInChromaticityDiagramCIE1931",
49 "TestPlotRGBColourspacesInChromaticityDiagramCIE1960UCS",
50 "TestPlotRGBColourspacesInChromaticityDiagramCIE1976UCS",
51 "TestPlotRGBChromaticitiesInChromaticityDiagram",
52 "TestPlotRGBChromaticitiesInChromaticityDiagramCIE1931",
53 "TestPlotRGBChromaticitiesInChromaticityDiagramCIE1960UCS",
54 "TestPlotRGBChromaticitiesInChromaticityDiagramCIE1976UCS",
55 "TestPlotEllipsesMacAdam1942InChromaticityDiagram",
56 "TestPlotEllipsesMacAdam1942InChromaticityDiagramCIE1931",
57 "TestPlotEllipsesMacAdam1942InChromaticityDiagramCIE1960UCS",
58 "TestPlotEllipsesMacAdam1942InChromaticityDiagramCIE1976UCS",
59 "TestPlotSingleCctf",
60 "TestPlotMultiCctfs",
61 "TestPlotConstantHueLoci",
62]
65class TestCommonColourspaceModelAxisReorder:
66 """
67 Define :func:`colour.plotting.models.colourspace_model_axis_reorder`
68 definition unit tests methods.
69 """
71 def test_colourspace_model_axis_reorder(self) -> None:
72 """
73 Test :func:`colour.plotting.models.colourspace_model_axis_reorder`
74 definition.
75 """
77 a = np.array([0, 1, 2])
79 np.testing.assert_allclose(
80 colourspace_model_axis_reorder(a, "CIE Lab"),
81 np.array([1, 2, 0]),
82 atol=TOLERANCE_ABSOLUTE_TESTS,
83 )
85 np.testing.assert_allclose(
86 colourspace_model_axis_reorder(a, "IPT"),
87 np.array([1, 2, 0]),
88 atol=TOLERANCE_ABSOLUTE_TESTS,
89 )
91 np.testing.assert_allclose(
92 colourspace_model_axis_reorder(a, "OSA UCS"),
93 np.array([1, 2, 0]),
94 atol=TOLERANCE_ABSOLUTE_TESTS,
95 )
97 np.testing.assert_allclose(
98 colourspace_model_axis_reorder(
99 colourspace_model_axis_reorder(a, "OSA UCS"),
100 "OSA UCS",
101 "Inverse",
102 ),
103 np.array([0, 1, 2]),
104 atol=TOLERANCE_ABSOLUTE_TESTS,
105 )
108class TestLinesPointerGamut:
109 """
110 Define :func:`colour.plotting.models.lines_pointer_gamut` definition unit
111 tests methods.
112 """
114 def test_lines_pointer_gamut(self) -> None:
115 """
116 Test :func:`colour.plotting.models.lines_pointer_gamut` definition.
117 """
119 assert len(lines_pointer_gamut()) == 2
122class TestPlotPointerGamut:
123 """
124 Define :func:`colour.plotting.models.plot_pointer_gamut` definition unit
125 tests methods.
126 """
128 def test_plot_pointer_gamut(self) -> None:
129 """Test :func:`colour.plotting.models.plot_pointer_gamut` definition."""
131 figure, axes = plot_pointer_gamut()
133 assert isinstance(figure, Figure)
134 assert isinstance(axes, Axes)
136 figure, axes = plot_pointer_gamut(method="CIE 1960 UCS")
138 assert isinstance(figure, Figure)
139 assert isinstance(axes, Axes)
141 figure, axes = plot_pointer_gamut(method="CIE 1976 UCS")
143 assert isinstance(figure, Figure)
144 assert isinstance(axes, Axes)
146 pytest.raises(ValueError, lambda: plot_pointer_gamut(method="Undefined"))
149class TestPlotRGBColourspacesInChromaticityDiagram:
150 """
151 Define :func:`colour.plotting.models.\
152plot_RGB_colourspaces_in_chromaticity_diagram` definition unit tests methods.
153 """
155 def test_plot_RGB_colourspaces_in_chromaticity_diagram(self) -> None:
156 """
157 Test :func:`colour.plotting.models.\
158plot_RGB_colourspaces_in_chromaticity_diagram` definition.
159 """
161 figure, axes = plot_RGB_colourspaces_in_chromaticity_diagram(
162 ["ITU-R BT.709", "ACEScg", "S-Gamut"],
163 show_pointer_gamut=True,
164 chromatically_adapt=True,
165 plot_kwargs={"linestyle": "dashed"},
166 )
168 assert isinstance(figure, Figure)
169 assert isinstance(axes, Axes)
171 figure, axes = plot_RGB_colourspaces_in_chromaticity_diagram(
172 ["ITU-R BT.709", "ACEScg", "S-Gamut"],
173 plot_kwargs=[{"linestyle": "dashed"}] * 3,
174 )
176 assert isinstance(figure, Figure)
177 assert isinstance(axes, Axes)
179 pytest.raises(
180 ValueError,
181 lambda: plot_RGB_colourspaces_in_chromaticity_diagram(
182 ["ITU-R BT.709", "ACEScg", "S-Gamut"],
183 chromaticity_diagram_callable=lambda **x: x,
184 method="Undefined",
185 ),
186 )
189class TestPlotRGBColourspacesInChromaticityDiagramCIE1931:
190 """
191 Define :func:`colour.plotting.models.\
192plot_RGB_colourspaces_in_chromaticity_diagram_CIE1931` definition unit tests
193 methods.
194 """
196 def test_plot_RGB_colourspaces_in_chromaticity_diagram_CIE1931(self) -> None:
197 """
198 Test :func:`colour.plotting.models.\
199plot_RGB_colourspaces_in_chromaticity_diagram_CIE1931` definition.
200 """
202 figure, axes = plot_RGB_colourspaces_in_chromaticity_diagram_CIE1931(
203 ["ITU-R BT.709", "ACEScg", "S-Gamut"]
204 )
206 assert isinstance(figure, Figure)
207 assert isinstance(axes, Axes)
210class TestPlotRGBColourspacesInChromaticityDiagramCIE1960UCS:
211 """
212 Define :func:`colour.plotting.models.\
213plot_RGB_colourspaces_in_chromaticity_diagram_CIE1960UCS` definition unit tests
214 methods.
215 """
217 def test_plot_RGB_colourspaces_in_chromaticity_diagram_CIE1960UCS(self) -> None:
218 """
219 Test :func:`colour.plotting.models.\
220plot_RGB_colourspaces_in_chromaticity_diagram_CIE1960UCS` definition.
221 """
223 (
224 figure,
225 axes,
226 ) = plot_RGB_colourspaces_in_chromaticity_diagram_CIE1960UCS(
227 ["ITU-R BT.709", "ACEScg", "S-Gamut"]
228 )
230 assert isinstance(figure, Figure)
231 assert isinstance(axes, Axes)
234class TestPlotRGBColourspacesInChromaticityDiagramCIE1976UCS:
235 """
236 Define :func:`colour.plotting.models.\
237plot_RGB_colourspaces_in_chromaticity_diagram_CIE1976UCS` definition unit tests
238 methods.
239 """
241 def test_plot_RGB_colourspaces_in_chromaticity_diagram_CIE1976UCS(self) -> None:
242 """
243 Test :func:`colour.plotting.models.\
244plot_RGB_colourspaces_in_chromaticity_diagram_CIE1976UCS` definition.
245 """
247 (
248 figure,
249 axes,
250 ) = plot_RGB_colourspaces_in_chromaticity_diagram_CIE1976UCS(
251 ["ITU-R BT.709", "ACEScg", "S-Gamut"]
252 )
254 assert isinstance(figure, Figure)
255 assert isinstance(axes, Axes)
258class TestPlotRGBChromaticitiesInChromaticityDiagram:
259 """
260 Define :func:`colour.plotting.models.\
261plot_RGB_chromaticities_in_chromaticity_diagram` definition unit tests methods.
262 """
264 def test_plot_RGB_chromaticities_in_chromaticity_diagram(self) -> None:
265 """
266 Test :func:`colour.plotting.models.\
267plot_RGB_chromaticities_in_chromaticity_diagram` definition.
268 """
270 figure, axes = plot_RGB_chromaticities_in_chromaticity_diagram(
271 np.random.random((128, 128, 3)), scatter_kwargs={"marker": "v"}
272 )
274 assert isinstance(figure, Figure)
275 assert isinstance(axes, Axes)
278class TestPlotRGBChromaticitiesInChromaticityDiagramCIE1931:
279 """
280 Define :func:`colour.plotting.models.\
281plot_RGB_chromaticities_in_chromaticity_diagram_CIE1931` definition unit tests
282 methods.
283 """
285 def test_plot_RGB_chromaticities_in_chromaticity_diagram_CIE1931(self) -> None:
286 """
287 Test :func:`colour.plotting.models.\
288plot_RGB_chromaticities_in_chromaticity_diagram_CIE1931` definition.
289 """
291 figure, axes = plot_RGB_chromaticities_in_chromaticity_diagram_CIE1931(
292 np.random.random((128, 128, 3))
293 )
295 assert isinstance(figure, Figure)
296 assert isinstance(axes, Axes)
299class TestPlotRGBChromaticitiesInChromaticityDiagramCIE1960UCS:
300 """
301 Define :func:`colour.plotting.models.\
302plot_RGB_chromaticities_in_chromaticity_diagram_CIE1960UCS` definition unit
303 tests methods.
304 """
306 def test_plot_RGB_chromaticities_in_chromaticity_diagram_CIE1960UCS(self) -> None:
307 """
308 Test :func:`colour.plotting.models.\
309plot_RGB_chromaticities_in_chromaticity_diagram_CIE1960UCS` definition.
310 """
312 (
313 figure,
314 axes,
315 ) = plot_RGB_chromaticities_in_chromaticity_diagram_CIE1960UCS(
316 np.random.random((128, 128, 3))
317 )
319 assert isinstance(figure, Figure)
320 assert isinstance(axes, Axes)
323class TestPlotRGBChromaticitiesInChromaticityDiagramCIE1976UCS:
324 """
325 Define :func:`colour.plotting.models.\
326plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS` definition unit
327 tests methods.
328 """
330 def test_plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS(self) -> None:
331 """
332 Test :func:`colour.plotting.models.\
333plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS` definition.
334 """
336 (
337 figure,
338 axes,
339 ) = plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS(
340 np.random.random((128, 128, 3))
341 )
343 assert isinstance(figure, Figure)
344 assert isinstance(axes, Axes)
347class TestEllipsesMacAdam1942:
348 """
349 Define :func:`colour.plotting.models.ellipses_MacAdam1942` definition unit
350 tests methods.
351 """
353 def test_ellipses_MacAdam1942(self) -> None:
354 """Test :func:`colour.plotting.models.ellipses_MacAdam1942` definition."""
356 assert len(ellipses_MacAdam1942()) == 25
358 pytest.raises(ValueError, lambda: ellipses_MacAdam1942(method="Undefined"))
361class TestPlotEllipsesMacAdam1942InChromaticityDiagram:
362 """
363 Define :func:`colour.plotting.models.\
364plot_ellipses_MacAdam1942_in_chromaticity_diagram` definition unit tests
365 methods.
366 """
368 def test_plot_ellipses_MacAdam1942_in_chromaticity_diagram(self) -> None:
369 """
370 Test :func:`colour.plotting.models.\
371plot_ellipses_MacAdam1942_in_chromaticity_diagram` definition.
372 """
374 figure, axes = plot_ellipses_MacAdam1942_in_chromaticity_diagram(
375 chromaticity_diagram_clipping=True, ellipse_kwargs={"color": "k"}
376 )
378 assert isinstance(figure, Figure)
379 assert isinstance(axes, Axes)
381 figure, axes = plot_ellipses_MacAdam1942_in_chromaticity_diagram(
382 chromaticity_diagram_clipping=True,
383 ellipse_kwargs=[{"color": "k"}] * 25,
384 )
386 assert isinstance(figure, Figure)
387 assert isinstance(axes, Axes)
390class TestPlotEllipsesMacAdam1942InChromaticityDiagramCIE1931:
391 """
392 Define :func:`colour.plotting.models.\
393plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1931` definition unit
394 tests methods.
395 """
397 def test_plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1931(self) -> None:
398 """
399 Test :func:`colour.plotting.models.\
400plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1931` definition.
401 """
403 (
404 figure,
405 axes,
406 ) = plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1931()
408 assert isinstance(figure, Figure)
409 assert isinstance(axes, Axes)
412class TestPlotEllipsesMacAdam1942InChromaticityDiagramCIE1960UCS:
413 """
414 Define :func:`colour.plotting.models.\
415plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1960UCS` definition unit
416 tests methods.
417 """
419 def test_plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1960UCS(
420 self,
421 ) -> None:
422 """
423 Test :func:`colour.plotting.models.\
424plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1960UCS` definition.
425 """
427 (
428 figure,
429 axes,
430 ) = plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1960UCS()
432 assert isinstance(figure, Figure)
433 assert isinstance(axes, Axes)
436class TestPlotEllipsesMacAdam1942InChromaticityDiagramCIE1976UCS:
437 """
438 Define :func:`colour.plotting.models.\
439plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1976UCS` definition unit
440 tests methods.
441 """
443 def test_plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1976UCS(
444 self,
445 ) -> None:
446 """
447 Test :func:`colour.plotting.models.\
448plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1976UCS` definition.
449 """
451 (
452 figure,
453 axes,
454 ) = plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1976UCS()
456 assert isinstance(figure, Figure)
457 assert isinstance(axes, Axes)
460class TestPlotSingleCctf:
461 """
462 Define :func:`colour.plotting.models.plot_single_cctf` definition unit
463 tests methods.
464 """
466 def test_plot_single_cctf(self) -> None:
467 """Test :func:`colour.plotting.models.plot_single_cctf` definition."""
469 figure, axes = plot_single_cctf("ITU-R BT.709")
471 assert isinstance(figure, Figure)
472 assert isinstance(axes, Axes)
475class TestPlotMultiCctfs:
476 """
477 Define :func:`colour.plotting.models.plot_multi_cctfs` definition unit
478 tests methods.
479 """
481 def test_plot_multi_cctfs(self) -> None:
482 """Test :func:`colour.plotting.models.plot_multi_cctfs` definition."""
484 figure, axes = plot_multi_cctfs(["ITU-R BT.709", "sRGB"])
486 assert isinstance(figure, Figure)
487 assert isinstance(axes, Axes)
490class TestPlotConstantHueLoci:
491 """
492 Define :func:`colour.plotting.models.plot_constant_hue_loci` definition
493 unit tests methods.
494 """
496 def test_plot_constant_hue_loci(self) -> None:
497 """Test :func:`colour.plotting.models.plot_constant_hue_loci` definition."""
499 if not is_scipy_installed(): # pragma: no cover
500 return
502 data = [
503 [
504 None,
505 np.array([0.95010000, 1.00000000, 1.08810000]),
506 np.array([0.40920000, 0.28120000, 0.30600000]),
507 np.array(
508 [
509 [0.02495100, 0.01908600, 0.02032900],
510 [0.10944300, 0.06235900, 0.06788100],
511 [0.27186500, 0.18418700, 0.19565300],
512 [0.48898900, 0.40749400, 0.44854600],
513 ]
514 ),
515 None,
516 ],
517 [
518 None,
519 np.array([0.95010000, 1.00000000, 1.08810000]),
520 np.array([0.30760000, 0.48280000, 0.42770000]),
521 np.array(
522 [
523 [0.02108000, 0.02989100, 0.02790400],
524 [0.06194700, 0.11251000, 0.09334400],
525 [0.15255800, 0.28123300, 0.23234900],
526 [0.34157700, 0.56681300, 0.47035300],
527 ]
528 ),
529 None,
530 ],
531 [
532 None,
533 np.array([0.95010000, 1.00000000, 1.08810000]),
534 np.array([0.39530000, 0.28120000, 0.18450000]),
535 np.array(
536 [
537 [0.02436400, 0.01908600, 0.01468800],
538 [0.10331200, 0.06235900, 0.02854600],
539 [0.26311900, 0.18418700, 0.12109700],
540 [0.43158700, 0.40749400, 0.39008600],
541 ]
542 ),
543 None,
544 ],
545 [
546 None,
547 np.array([0.95010000, 1.00000000, 1.08810000]),
548 np.array([0.20510000, 0.18420000, 0.57130000]),
549 np.array(
550 [
551 [0.03039800, 0.02989100, 0.06123300],
552 [0.08870000, 0.08498400, 0.21843500],
553 [0.18405800, 0.18418700, 0.40111400],
554 [0.32550100, 0.34047200, 0.50296900],
555 [0.53826100, 0.56681300, 0.80010400],
556 ]
557 ),
558 None,
559 ],
560 [
561 None,
562 np.array([0.95010000, 1.00000000, 1.08810000]),
563 np.array([0.35770000, 0.28120000, 0.11250000]),
564 np.array(
565 [
566 [0.03678100, 0.02989100, 0.01481100],
567 [0.17127700, 0.11251000, 0.01229900],
568 [0.30080900, 0.28123300, 0.21229800],
569 [0.52976000, 0.40749400, 0.11720000],
570 ]
571 ),
572 None,
573 ],
574 ]
576 figure, axes = plot_constant_hue_loci(
577 data, "IPT", scatter_kwargs={"marker": "v"}
578 )
580 assert isinstance(figure, Figure)
581 assert isinstance(axes, Axes)
583 figure, axes = plot_constant_hue_loci(data, "IPT", scatter_kwargs={"c": "k"})
585 assert isinstance(figure, Figure)
586 assert isinstance(axes, Axes)