Coverage for colour/models/rgb/transfer_functions/tests/test_dji_d_log.py: 100%
65 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.\
3dji_d_log` module.
4"""
6import numpy as np
8from colour.constants import TOLERANCE_ABSOLUTE_TESTS
9from colour.models.rgb.transfer_functions import (
10 log_decoding_DJIDLog,
11 log_encoding_DJIDLog,
12)
13from colour.utilities import domain_range_scale, ignore_numpy_errors
15__author__ = "Colour Developers"
16__copyright__ = "Copyright 2013 Colour Developers"
17__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
18__maintainer__ = "Colour Developers"
19__email__ = "colour-developers@colour-science.org"
20__status__ = "Production"
22__all__ = [
23 "TestLogEncoding_DJIDLog",
24 "TestLogDecoding_DJIDLog",
25]
28class TestLogEncoding_DJIDLog:
29 """
30 Define :func:`colour.models.rgb.transfer_functions.dji_d_log.\
31log_encoding_DJIDLog` definition unit tests methods.
32 """
34 def test_log_encoding_DJIDLog(self) -> None:
35 """
36 Test :func:`colour.models.rgb.transfer_functions.dji_d_log.\
37log_encoding_DJIDLog` definition.
38 """
40 np.testing.assert_allclose(
41 log_encoding_DJIDLog(0.0), 0.0929, atol=TOLERANCE_ABSOLUTE_TESTS
42 )
44 np.testing.assert_allclose(
45 log_encoding_DJIDLog(0.18),
46 0.398764556189331,
47 atol=TOLERANCE_ABSOLUTE_TESTS,
48 )
50 np.testing.assert_allclose(
51 log_encoding_DJIDLog(1.0), 0.584555, atol=TOLERANCE_ABSOLUTE_TESTS
52 )
54 def test_n_dimensional_log_encoding_DLog(self) -> None:
55 """
56 Test :func:`colour.models.rgb.transfer_functions.dji_d_log.\
57log_encoding_DJIDLog` definition n-dimensional arrays support.
58 """
60 x = 0.18
61 y = log_encoding_DJIDLog(x)
63 x = np.tile(x, 6)
64 y = np.tile(y, 6)
65 np.testing.assert_allclose(
66 log_encoding_DJIDLog(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
67 )
69 x = np.reshape(x, (2, 3))
70 y = np.reshape(y, (2, 3))
71 np.testing.assert_allclose(
72 log_encoding_DJIDLog(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
73 )
75 x = np.reshape(x, (2, 3, 1))
76 y = np.reshape(y, (2, 3, 1))
77 np.testing.assert_allclose(
78 log_encoding_DJIDLog(x), y, atol=TOLERANCE_ABSOLUTE_TESTS
79 )
81 def test_domain_range_scale_log_encoding_DLog(self) -> None:
82 """
83 Test :func:`colour.models.rgb.transfer_functions.dji_d_log.\
84log_encoding_DJIDLog` definition domain and range scale support.
85 """
87 x = 0.18
88 y = log_encoding_DJIDLog(x)
90 d_r = (("reference", 1), ("1", 1), ("100", 100))
91 for scale, factor in d_r:
92 with domain_range_scale(scale):
93 np.testing.assert_allclose(
94 log_encoding_DJIDLog(x * factor),
95 y * factor,
96 atol=TOLERANCE_ABSOLUTE_TESTS,
97 )
99 @ignore_numpy_errors
100 def test_nan_log_encoding_DLog(self) -> None:
101 """
102 Test :func:`colour.models.rgb.transfer_functions.dji_d_log.\
103log_encoding_DJIDLog` definition nan support.
104 """
106 log_encoding_DJIDLog(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))
109class TestLogDecoding_DJIDLog:
110 """
111 Define :func:`colour.models.rgb.transfer_functions.dji_d_log.\
112log_decoding_DJIDLog` definition unit tests methods.
113 """
115 def test_log_decoding_DJIDLog(self) -> None:
116 """
117 Test :func:`colour.models.rgb.transfer_functions.dji_d_log.\
118log_decoding_DJIDLog` definition.
119 """
121 np.testing.assert_allclose(
122 log_decoding_DJIDLog(0.0929), 0.0, atol=TOLERANCE_ABSOLUTE_TESTS
123 )
125 np.testing.assert_allclose(
126 log_decoding_DJIDLog(0.398764556189331), 0.18, atol=1e-6
127 )
129 np.testing.assert_allclose(log_decoding_DJIDLog(0.584555), 1.0, atol=1e-6)
131 def test_n_dimensional_log_decoding_DLog(self) -> None:
132 """
133 Test :func:`colour.models.rgb.transfer_functions.dji_d_log.\
134log_decoding_DJIDLog` definition n-dimensional arrays support.
135 """
137 y = 0.398764556189331
138 x = log_decoding_DJIDLog(y)
140 y = np.tile(y, 6)
141 x = np.tile(x, 6)
142 np.testing.assert_allclose(
143 log_decoding_DJIDLog(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
144 )
146 y = np.reshape(y, (2, 3))
147 x = np.reshape(x, (2, 3))
148 np.testing.assert_allclose(
149 log_decoding_DJIDLog(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
150 )
152 y = np.reshape(y, (2, 3, 1))
153 x = np.reshape(x, (2, 3, 1))
154 np.testing.assert_allclose(
155 log_decoding_DJIDLog(y), x, atol=TOLERANCE_ABSOLUTE_TESTS
156 )
158 def test_domain_range_scale_log_decoding_DLog(self) -> None:
159 """
160 Test :func:`colour.models.rgb.transfer_functions.dji_d_log.\
161log_decoding_DJIDLog` definition domain and range scale support.
162 """
164 y = 0.398764556189331
165 x = log_decoding_DJIDLog(y)
167 d_r = (("reference", 1), ("1", 1), ("100", 100))
168 for scale, factor in d_r:
169 with domain_range_scale(scale):
170 np.testing.assert_allclose(
171 log_decoding_DJIDLog(y * factor),
172 x * factor,
173 atol=TOLERANCE_ABSOLUTE_TESTS,
174 )
176 @ignore_numpy_errors
177 def test_nan_log_decoding_DLog(self) -> None:
178 """
179 Test :func:`colour.models.rgb.transfer_functions.dji_d_log.\
180log_decoding_DJIDLog` definition nan support.
181 """
183 log_decoding_DJIDLog(np.array([-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]))