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

1"""Define the unit tests for the :mod:`colour.plotting.models` module.""" 

2 

3from __future__ import annotations 

4 

5import numpy as np 

6import pytest 

7from matplotlib.axes import Axes 

8from matplotlib.figure import Figure 

9 

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 

35 

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" 

42 

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] 

63 

64 

65class TestCommonColourspaceModelAxisReorder: 

66 """ 

67 Define :func:`colour.plotting.models.colourspace_model_axis_reorder` 

68 definition unit tests methods. 

69 """ 

70 

71 def test_colourspace_model_axis_reorder(self) -> None: 

72 """ 

73 Test :func:`colour.plotting.models.colourspace_model_axis_reorder` 

74 definition. 

75 """ 

76 

77 a = np.array([0, 1, 2]) 

78 

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 ) 

84 

85 np.testing.assert_allclose( 

86 colourspace_model_axis_reorder(a, "IPT"), 

87 np.array([1, 2, 0]), 

88 atol=TOLERANCE_ABSOLUTE_TESTS, 

89 ) 

90 

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 ) 

96 

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 ) 

106 

107 

108class TestLinesPointerGamut: 

109 """ 

110 Define :func:`colour.plotting.models.lines_pointer_gamut` definition unit 

111 tests methods. 

112 """ 

113 

114 def test_lines_pointer_gamut(self) -> None: 

115 """ 

116 Test :func:`colour.plotting.models.lines_pointer_gamut` definition. 

117 """ 

118 

119 assert len(lines_pointer_gamut()) == 2 

120 

121 

122class TestPlotPointerGamut: 

123 """ 

124 Define :func:`colour.plotting.models.plot_pointer_gamut` definition unit 

125 tests methods. 

126 """ 

127 

128 def test_plot_pointer_gamut(self) -> None: 

129 """Test :func:`colour.plotting.models.plot_pointer_gamut` definition.""" 

130 

131 figure, axes = plot_pointer_gamut() 

132 

133 assert isinstance(figure, Figure) 

134 assert isinstance(axes, Axes) 

135 

136 figure, axes = plot_pointer_gamut(method="CIE 1960 UCS") 

137 

138 assert isinstance(figure, Figure) 

139 assert isinstance(axes, Axes) 

140 

141 figure, axes = plot_pointer_gamut(method="CIE 1976 UCS") 

142 

143 assert isinstance(figure, Figure) 

144 assert isinstance(axes, Axes) 

145 

146 pytest.raises(ValueError, lambda: plot_pointer_gamut(method="Undefined")) 

147 

148 

149class TestPlotRGBColourspacesInChromaticityDiagram: 

150 """ 

151 Define :func:`colour.plotting.models.\ 

152plot_RGB_colourspaces_in_chromaticity_diagram` definition unit tests methods. 

153 """ 

154 

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 """ 

160 

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 ) 

167 

168 assert isinstance(figure, Figure) 

169 assert isinstance(axes, Axes) 

170 

171 figure, axes = plot_RGB_colourspaces_in_chromaticity_diagram( 

172 ["ITU-R BT.709", "ACEScg", "S-Gamut"], 

173 plot_kwargs=[{"linestyle": "dashed"}] * 3, 

174 ) 

175 

176 assert isinstance(figure, Figure) 

177 assert isinstance(axes, Axes) 

178 

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 ) 

187 

188 

189class TestPlotRGBColourspacesInChromaticityDiagramCIE1931: 

190 """ 

191 Define :func:`colour.plotting.models.\ 

192plot_RGB_colourspaces_in_chromaticity_diagram_CIE1931` definition unit tests 

193 methods. 

194 """ 

195 

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 """ 

201 

202 figure, axes = plot_RGB_colourspaces_in_chromaticity_diagram_CIE1931( 

203 ["ITU-R BT.709", "ACEScg", "S-Gamut"] 

204 ) 

205 

206 assert isinstance(figure, Figure) 

207 assert isinstance(axes, Axes) 

208 

209 

210class TestPlotRGBColourspacesInChromaticityDiagramCIE1960UCS: 

211 """ 

212 Define :func:`colour.plotting.models.\ 

213plot_RGB_colourspaces_in_chromaticity_diagram_CIE1960UCS` definition unit tests 

214 methods. 

215 """ 

216 

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 """ 

222 

223 ( 

224 figure, 

225 axes, 

226 ) = plot_RGB_colourspaces_in_chromaticity_diagram_CIE1960UCS( 

227 ["ITU-R BT.709", "ACEScg", "S-Gamut"] 

228 ) 

229 

230 assert isinstance(figure, Figure) 

231 assert isinstance(axes, Axes) 

232 

233 

234class TestPlotRGBColourspacesInChromaticityDiagramCIE1976UCS: 

235 """ 

236 Define :func:`colour.plotting.models.\ 

237plot_RGB_colourspaces_in_chromaticity_diagram_CIE1976UCS` definition unit tests 

238 methods. 

239 """ 

240 

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 """ 

246 

247 ( 

248 figure, 

249 axes, 

250 ) = plot_RGB_colourspaces_in_chromaticity_diagram_CIE1976UCS( 

251 ["ITU-R BT.709", "ACEScg", "S-Gamut"] 

252 ) 

253 

254 assert isinstance(figure, Figure) 

255 assert isinstance(axes, Axes) 

256 

257 

258class TestPlotRGBChromaticitiesInChromaticityDiagram: 

259 """ 

260 Define :func:`colour.plotting.models.\ 

261plot_RGB_chromaticities_in_chromaticity_diagram` definition unit tests methods. 

262 """ 

263 

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 """ 

269 

270 figure, axes = plot_RGB_chromaticities_in_chromaticity_diagram( 

271 np.random.random((128, 128, 3)), scatter_kwargs={"marker": "v"} 

272 ) 

273 

274 assert isinstance(figure, Figure) 

275 assert isinstance(axes, Axes) 

276 

277 

278class TestPlotRGBChromaticitiesInChromaticityDiagramCIE1931: 

279 """ 

280 Define :func:`colour.plotting.models.\ 

281plot_RGB_chromaticities_in_chromaticity_diagram_CIE1931` definition unit tests 

282 methods. 

283 """ 

284 

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 """ 

290 

291 figure, axes = plot_RGB_chromaticities_in_chromaticity_diagram_CIE1931( 

292 np.random.random((128, 128, 3)) 

293 ) 

294 

295 assert isinstance(figure, Figure) 

296 assert isinstance(axes, Axes) 

297 

298 

299class TestPlotRGBChromaticitiesInChromaticityDiagramCIE1960UCS: 

300 """ 

301 Define :func:`colour.plotting.models.\ 

302plot_RGB_chromaticities_in_chromaticity_diagram_CIE1960UCS` definition unit 

303 tests methods. 

304 """ 

305 

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 """ 

311 

312 ( 

313 figure, 

314 axes, 

315 ) = plot_RGB_chromaticities_in_chromaticity_diagram_CIE1960UCS( 

316 np.random.random((128, 128, 3)) 

317 ) 

318 

319 assert isinstance(figure, Figure) 

320 assert isinstance(axes, Axes) 

321 

322 

323class TestPlotRGBChromaticitiesInChromaticityDiagramCIE1976UCS: 

324 """ 

325 Define :func:`colour.plotting.models.\ 

326plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS` definition unit 

327 tests methods. 

328 """ 

329 

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 """ 

335 

336 ( 

337 figure, 

338 axes, 

339 ) = plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS( 

340 np.random.random((128, 128, 3)) 

341 ) 

342 

343 assert isinstance(figure, Figure) 

344 assert isinstance(axes, Axes) 

345 

346 

347class TestEllipsesMacAdam1942: 

348 """ 

349 Define :func:`colour.plotting.models.ellipses_MacAdam1942` definition unit 

350 tests methods. 

351 """ 

352 

353 def test_ellipses_MacAdam1942(self) -> None: 

354 """Test :func:`colour.plotting.models.ellipses_MacAdam1942` definition.""" 

355 

356 assert len(ellipses_MacAdam1942()) == 25 

357 

358 pytest.raises(ValueError, lambda: ellipses_MacAdam1942(method="Undefined")) 

359 

360 

361class TestPlotEllipsesMacAdam1942InChromaticityDiagram: 

362 """ 

363 Define :func:`colour.plotting.models.\ 

364plot_ellipses_MacAdam1942_in_chromaticity_diagram` definition unit tests 

365 methods. 

366 """ 

367 

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 """ 

373 

374 figure, axes = plot_ellipses_MacAdam1942_in_chromaticity_diagram( 

375 chromaticity_diagram_clipping=True, ellipse_kwargs={"color": "k"} 

376 ) 

377 

378 assert isinstance(figure, Figure) 

379 assert isinstance(axes, Axes) 

380 

381 figure, axes = plot_ellipses_MacAdam1942_in_chromaticity_diagram( 

382 chromaticity_diagram_clipping=True, 

383 ellipse_kwargs=[{"color": "k"}] * 25, 

384 ) 

385 

386 assert isinstance(figure, Figure) 

387 assert isinstance(axes, Axes) 

388 

389 

390class TestPlotEllipsesMacAdam1942InChromaticityDiagramCIE1931: 

391 """ 

392 Define :func:`colour.plotting.models.\ 

393plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1931` definition unit 

394 tests methods. 

395 """ 

396 

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 """ 

402 

403 ( 

404 figure, 

405 axes, 

406 ) = plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1931() 

407 

408 assert isinstance(figure, Figure) 

409 assert isinstance(axes, Axes) 

410 

411 

412class TestPlotEllipsesMacAdam1942InChromaticityDiagramCIE1960UCS: 

413 """ 

414 Define :func:`colour.plotting.models.\ 

415plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1960UCS` definition unit 

416 tests methods. 

417 """ 

418 

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 """ 

426 

427 ( 

428 figure, 

429 axes, 

430 ) = plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1960UCS() 

431 

432 assert isinstance(figure, Figure) 

433 assert isinstance(axes, Axes) 

434 

435 

436class TestPlotEllipsesMacAdam1942InChromaticityDiagramCIE1976UCS: 

437 """ 

438 Define :func:`colour.plotting.models.\ 

439plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1976UCS` definition unit 

440 tests methods. 

441 """ 

442 

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 """ 

450 

451 ( 

452 figure, 

453 axes, 

454 ) = plot_ellipses_MacAdam1942_in_chromaticity_diagram_CIE1976UCS() 

455 

456 assert isinstance(figure, Figure) 

457 assert isinstance(axes, Axes) 

458 

459 

460class TestPlotSingleCctf: 

461 """ 

462 Define :func:`colour.plotting.models.plot_single_cctf` definition unit 

463 tests methods. 

464 """ 

465 

466 def test_plot_single_cctf(self) -> None: 

467 """Test :func:`colour.plotting.models.plot_single_cctf` definition.""" 

468 

469 figure, axes = plot_single_cctf("ITU-R BT.709") 

470 

471 assert isinstance(figure, Figure) 

472 assert isinstance(axes, Axes) 

473 

474 

475class TestPlotMultiCctfs: 

476 """ 

477 Define :func:`colour.plotting.models.plot_multi_cctfs` definition unit 

478 tests methods. 

479 """ 

480 

481 def test_plot_multi_cctfs(self) -> None: 

482 """Test :func:`colour.plotting.models.plot_multi_cctfs` definition.""" 

483 

484 figure, axes = plot_multi_cctfs(["ITU-R BT.709", "sRGB"]) 

485 

486 assert isinstance(figure, Figure) 

487 assert isinstance(axes, Axes) 

488 

489 

490class TestPlotConstantHueLoci: 

491 """ 

492 Define :func:`colour.plotting.models.plot_constant_hue_loci` definition 

493 unit tests methods. 

494 """ 

495 

496 def test_plot_constant_hue_loci(self) -> None: 

497 """Test :func:`colour.plotting.models.plot_constant_hue_loci` definition.""" 

498 

499 if not is_scipy_installed(): # pragma: no cover 

500 return 

501 

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 ] 

575 

576 figure, axes = plot_constant_hue_loci( 

577 data, "IPT", scatter_kwargs={"marker": "v"} 

578 ) 

579 

580 assert isinstance(figure, Figure) 

581 assert isinstance(axes, Axes) 

582 

583 figure, axes = plot_constant_hue_loci(data, "IPT", scatter_kwargs={"c": "k"}) 

584 

585 assert isinstance(figure, Figure) 

586 assert isinstance(axes, Axes)