Coverage for io/luts/tests/test_sony_spi3d.py: 100%
53 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.io.luts.sony_spi3d` module."""
3from __future__ import annotations
5import os
6import shutil
7import tempfile
9import numpy as np
11from colour.constants import TOLERANCE_ABSOLUTE_TESTS
12from colour.io import LUT3D, LUTSequence, read_LUT_SonySPI3D, write_LUT_SonySPI3D
13from colour.utilities import as_int_array
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 "ROOT_LUTS",
24 "TestReadLUTSonySPI3D",
25 "TestWriteLUTSonySPI3D",
26]
28ROOT_LUTS: str = os.path.join(os.path.dirname(__file__), "resources", "sony_spi3d")
31class TestReadLUTSonySPI3D:
32 """
33 Define :func:`colour.io.luts.sony_spi3d.read_LUT_SonySPI3D` definition
34 unit tests methods.
35 """
37 def test_read_LUT_SonySPI3D(self) -> None:
38 """Test :func:`colour.io.luts.sony_spi3d.read_LUT_SonySPI3D` definition."""
40 LUT_1 = read_LUT_SonySPI3D(os.path.join(ROOT_LUTS, "Colour_Correct.spi3d"))
42 np.testing.assert_allclose(
43 LUT_1.table,
44 np.array(
45 [
46 [
47 [
48 [0.00000000e00, 0.00000000e00, 0.00000000e00],
49 [0.00000000e00, 0.00000000e00, 4.16653000e-01],
50 [0.00000000e00, 0.00000000e00, 8.33306000e-01],
51 [1.00000000e-06, 1.00000000e-06, 1.24995900e00],
52 ],
53 [
54 [-2.62310000e-02, 3.77102000e-01, -2.62310000e-02],
55 [1.96860000e-02, 2.44702000e-01, 2.44702000e-01],
56 [1.43270000e-02, 3.30993000e-01, 6.47660000e-01],
57 [9.02200000e-03, 3.72791000e-01, 1.10033100e00],
58 ],
59 [
60 [-5.24630000e-02, 7.54204000e-01, -5.24630000e-02],
61 [0.00000000e00, 6.16667000e-01, 3.08333000e-01],
62 [3.93720000e-02, 4.89403000e-01, 4.89403000e-01],
63 [3.57730000e-02, 5.78763000e-01, 8.50258000e-01],
64 ],
65 [
66 [-7.86940000e-02, 1.13130600e00, -7.86940000e-02],
67 [-3.59270000e-02, 1.02190800e00, 3.16685000e-01],
68 [3.09040000e-02, 8.31171000e-01, 5.64415000e-01],
69 [5.90590000e-02, 7.34105000e-01, 7.34105000e-01],
70 ],
71 ],
72 [
73 [
74 [3.98947000e-01, -1.77060000e-02, -1.77060000e-02],
75 [3.33333000e-01, 0.00000000e00, 3.33333000e-01],
76 [3.90623000e-01, 0.00000000e00, 7.81246000e-01],
77 [4.04320000e-01, 0.00000000e00, 1.21296000e00],
78 ],
79 [
80 [2.94597000e-01, 2.94597000e-01, 6.95820000e-02],
81 [4.16655000e-01, 4.16655000e-01, 4.16655000e-01],
82 [4.16655000e-01, 4.16655000e-01, 8.33308000e-01],
83 [4.16656000e-01, 4.16656000e-01, 1.24996100e00],
84 ],
85 [
86 [3.49416000e-01, 6.57749000e-01, 4.10830000e-02],
87 [3.40435000e-01, 7.43769000e-01, 3.40435000e-01],
88 [2.69700000e-01, 4.94715000e-01, 4.94715000e-01],
89 [3.47660000e-01, 6.64327000e-01, 9.80993000e-01],
90 ],
91 [
92 [3.44991000e-01, 1.05021300e00, -7.62100000e-03],
93 [3.14204000e-01, 1.12087100e00, 3.14204000e-01],
94 [3.08333000e-01, 9.25000000e-01, 6.16667000e-01],
95 [2.89386000e-01, 7.39417000e-01, 7.39417000e-01],
96 ],
97 ],
98 [
99 [
100 [7.97894000e-01, -3.54120000e-02, -3.54120000e-02],
101 [7.52767000e-01, -2.84790000e-02, 3.62144000e-01],
102 [6.66667000e-01, 0.00000000e00, 6.66667000e-01],
103 [7.46911000e-01, 0.00000000e00, 1.12036600e00],
104 ],
105 [
106 [6.33333000e-01, 3.16667000e-01, 0.00000000e00],
107 [7.32278000e-01, 3.15626000e-01, 3.15626000e-01],
108 [6.66667000e-01, 3.33333000e-01, 6.66667000e-01],
109 [7.81246000e-01, 3.90623000e-01, 1.17186900e00],
110 ],
111 [
112 [5.89195000e-01, 5.89195000e-01, 1.39164000e-01],
113 [5.94601000e-01, 5.94601000e-01, 3.69586000e-01],
114 [8.33311000e-01, 8.33311000e-01, 8.33311000e-01],
115 [8.33311000e-01, 8.33311000e-01, 1.24996300e00],
116 ],
117 [
118 [6.63432000e-01, 9.30188000e-01, 1.29920000e-01],
119 [6.82749000e-01, 9.91082000e-01, 3.74416000e-01],
120 [7.07102000e-01, 1.11043500e00, 7.07102000e-01],
121 [5.19714000e-01, 7.44729000e-01, 7.44729000e-01],
122 ],
123 ],
124 [
125 [
126 [1.19684100e00, -5.31170000e-02, -5.31170000e-02],
127 [1.16258800e00, -5.03720000e-02, 3.53948000e-01],
128 [1.08900300e00, -3.13630000e-02, 7.15547000e-01],
129 [1.00000000e00, 0.00000000e00, 1.00000000e00],
130 ],
131 [
132 [1.03843900e00, 3.10899000e-01, -5.28700000e-02],
133 [1.13122500e00, 2.97920000e-01, 2.97920000e-01],
134 [1.08610100e00, 3.04855000e-01, 6.95478000e-01],
135 [1.00000000e00, 3.33333000e-01, 1.00000000e00],
136 ],
137 [
138 [8.91318000e-01, 6.19823000e-01, 7.68330000e-02],
139 [9.50000000e-01, 6.33333000e-01, 3.16667000e-01],
140 [1.06561000e00, 6.48957000e-01, 6.48957000e-01],
141 [1.00000000e00, 6.66667000e-01, 1.00000000e00],
142 ],
143 [
144 [8.83792000e-01, 8.83792000e-01, 2.08746000e-01],
145 [8.89199000e-01, 8.89199000e-01, 4.39168000e-01],
146 [8.94606000e-01, 8.94606000e-01, 6.69590000e-01],
147 [1.24996600e00, 1.24996600e00, 1.24996600e00],
148 ],
149 ],
150 ]
151 ),
152 atol=TOLERANCE_ABSOLUTE_TESTS,
153 )
154 assert LUT_1.name == "Colour Correct"
155 assert LUT_1.dimensions == 3
156 np.testing.assert_array_equal(LUT_1.domain, np.array([[0, 0, 0], [1, 1, 1]]))
157 assert LUT_1.size == 4
158 assert LUT_1.comments == ["Adapted from a LUT generated by Foundry::LUT."]
160 LUT_2 = read_LUT_SonySPI3D(
161 os.path.join(ROOT_LUTS, "Colour_Correct_Unordered.spi3d")
162 )
164 assert LUT_2 == LUT_1
165 assert LUT_2.name == "Colour Correct Unordered"
166 assert LUT_2.dimensions == 3
167 assert LUT_2.size == 4
168 assert LUT_2.comments == ["Adapted from a LUT generated by Foundry::LUT."]
171class TestWriteLUTSonySPI3D:
172 """
173 Define :func:`colour.io.luts.sony_spi3d.write_LUT_SonySPI3D` definition
174 unit tests methods.
175 """
177 def setup_method(self) -> None:
178 """Initialise the common tests attributes."""
180 self._temporary_directory = tempfile.mkdtemp()
182 def teardown_method(self) -> None:
183 """After tests actions."""
185 shutil.rmtree(self._temporary_directory)
187 def test_write_LUT_SonySPI3D(self) -> None:
188 """Test :func:`colour.io.luts.sony_spi3d.write_LUT_SonySPI3D` definition."""
190 LUT_r = read_LUT_SonySPI3D(os.path.join(ROOT_LUTS, "Colour_Correct.spi3d"))
192 write_LUT_SonySPI3D(
193 LUT_r,
194 os.path.join(self._temporary_directory, "Colour_Correct.spi3d"),
195 )
196 LUT_t = read_LUT_SonySPI3D(
197 os.path.join(self._temporary_directory, "Colour_Correct.spi3d")
198 )
199 assert LUT_r == LUT_t
201 write_LUT_SonySPI3D(
202 LUTSequence(LUT_r),
203 os.path.join(self._temporary_directory, "Colour_Correct.spi3d"),
204 )
205 assert LUT_r == LUT_t
207 # Test for proper indexes sequentiality.
208 path = os.path.join(self._temporary_directory, "Size_10_Indexes.spi3d")
209 write_LUT_SonySPI3D(LUT3D(size=10), path)
210 indexes = []
212 with open(path) as spi3d_file:
213 lines = filter(None, (line.strip() for line in spi3d_file))
214 for line in lines:
215 tokens = line.split()
216 if len(tokens) == 6:
217 indexes.append(as_int_array(tokens[:3]))
219 np.testing.assert_array_equal(
220 as_int_array(indexes)[:200, ...],
221 np.array(
222 [
223 [0, 0, 0],
224 [0, 0, 1],
225 [0, 0, 2],
226 [0, 0, 3],
227 [0, 0, 4],
228 [0, 0, 5],
229 [0, 0, 6],
230 [0, 0, 7],
231 [0, 0, 8],
232 [0, 0, 9],
233 [0, 1, 0],
234 [0, 1, 1],
235 [0, 1, 2],
236 [0, 1, 3],
237 [0, 1, 4],
238 [0, 1, 5],
239 [0, 1, 6],
240 [0, 1, 7],
241 [0, 1, 8],
242 [0, 1, 9],
243 [0, 2, 0],
244 [0, 2, 1],
245 [0, 2, 2],
246 [0, 2, 3],
247 [0, 2, 4],
248 [0, 2, 5],
249 [0, 2, 6],
250 [0, 2, 7],
251 [0, 2, 8],
252 [0, 2, 9],
253 [0, 3, 0],
254 [0, 3, 1],
255 [0, 3, 2],
256 [0, 3, 3],
257 [0, 3, 4],
258 [0, 3, 5],
259 [0, 3, 6],
260 [0, 3, 7],
261 [0, 3, 8],
262 [0, 3, 9],
263 [0, 4, 0],
264 [0, 4, 1],
265 [0, 4, 2],
266 [0, 4, 3],
267 [0, 4, 4],
268 [0, 4, 5],
269 [0, 4, 6],
270 [0, 4, 7],
271 [0, 4, 8],
272 [0, 4, 9],
273 [0, 5, 0],
274 [0, 5, 1],
275 [0, 5, 2],
276 [0, 5, 3],
277 [0, 5, 4],
278 [0, 5, 5],
279 [0, 5, 6],
280 [0, 5, 7],
281 [0, 5, 8],
282 [0, 5, 9],
283 [0, 6, 0],
284 [0, 6, 1],
285 [0, 6, 2],
286 [0, 6, 3],
287 [0, 6, 4],
288 [0, 6, 5],
289 [0, 6, 6],
290 [0, 6, 7],
291 [0, 6, 8],
292 [0, 6, 9],
293 [0, 7, 0],
294 [0, 7, 1],
295 [0, 7, 2],
296 [0, 7, 3],
297 [0, 7, 4],
298 [0, 7, 5],
299 [0, 7, 6],
300 [0, 7, 7],
301 [0, 7, 8],
302 [0, 7, 9],
303 [0, 8, 0],
304 [0, 8, 1],
305 [0, 8, 2],
306 [0, 8, 3],
307 [0, 8, 4],
308 [0, 8, 5],
309 [0, 8, 6],
310 [0, 8, 7],
311 [0, 8, 8],
312 [0, 8, 9],
313 [0, 9, 0],
314 [0, 9, 1],
315 [0, 9, 2],
316 [0, 9, 3],
317 [0, 9, 4],
318 [0, 9, 5],
319 [0, 9, 6],
320 [0, 9, 7],
321 [0, 9, 8],
322 [0, 9, 9],
323 [1, 0, 0],
324 [1, 0, 1],
325 [1, 0, 2],
326 [1, 0, 3],
327 [1, 0, 4],
328 [1, 0, 5],
329 [1, 0, 6],
330 [1, 0, 7],
331 [1, 0, 8],
332 [1, 0, 9],
333 [1, 1, 0],
334 [1, 1, 1],
335 [1, 1, 2],
336 [1, 1, 3],
337 [1, 1, 4],
338 [1, 1, 5],
339 [1, 1, 6],
340 [1, 1, 7],
341 [1, 1, 8],
342 [1, 1, 9],
343 [1, 2, 0],
344 [1, 2, 1],
345 [1, 2, 2],
346 [1, 2, 3],
347 [1, 2, 4],
348 [1, 2, 5],
349 [1, 2, 6],
350 [1, 2, 7],
351 [1, 2, 8],
352 [1, 2, 9],
353 [1, 3, 0],
354 [1, 3, 1],
355 [1, 3, 2],
356 [1, 3, 3],
357 [1, 3, 4],
358 [1, 3, 5],
359 [1, 3, 6],
360 [1, 3, 7],
361 [1, 3, 8],
362 [1, 3, 9],
363 [1, 4, 0],
364 [1, 4, 1],
365 [1, 4, 2],
366 [1, 4, 3],
367 [1, 4, 4],
368 [1, 4, 5],
369 [1, 4, 6],
370 [1, 4, 7],
371 [1, 4, 8],
372 [1, 4, 9],
373 [1, 5, 0],
374 [1, 5, 1],
375 [1, 5, 2],
376 [1, 5, 3],
377 [1, 5, 4],
378 [1, 5, 5],
379 [1, 5, 6],
380 [1, 5, 7],
381 [1, 5, 8],
382 [1, 5, 9],
383 [1, 6, 0],
384 [1, 6, 1],
385 [1, 6, 2],
386 [1, 6, 3],
387 [1, 6, 4],
388 [1, 6, 5],
389 [1, 6, 6],
390 [1, 6, 7],
391 [1, 6, 8],
392 [1, 6, 9],
393 [1, 7, 0],
394 [1, 7, 1],
395 [1, 7, 2],
396 [1, 7, 3],
397 [1, 7, 4],
398 [1, 7, 5],
399 [1, 7, 6],
400 [1, 7, 7],
401 [1, 7, 8],
402 [1, 7, 9],
403 [1, 8, 0],
404 [1, 8, 1],
405 [1, 8, 2],
406 [1, 8, 3],
407 [1, 8, 4],
408 [1, 8, 5],
409 [1, 8, 6],
410 [1, 8, 7],
411 [1, 8, 8],
412 [1, 8, 9],
413 [1, 9, 0],
414 [1, 9, 1],
415 [1, 9, 2],
416 [1, 9, 3],
417 [1, 9, 4],
418 [1, 9, 5],
419 [1, 9, 6],
420 [1, 9, 7],
421 [1, 9, 8],
422 [1, 9, 9],
423 ]
424 ),
425 )