Coverage for colour/io/luts/tests/test_sony_spi3d.py: 100%

53 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-11-15 19:01 +1300

1"""Define the unit tests for the :mod:`colour.io.luts.sony_spi3d` module.""" 

2 

3from __future__ import annotations 

4 

5import os 

6import shutil 

7import tempfile 

8 

9import numpy as np 

10 

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 

14 

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" 

21 

22__all__ = [ 

23 "ROOT_LUTS", 

24 "TestReadLUTSonySPI3D", 

25 "TestWriteLUTSonySPI3D", 

26] 

27 

28ROOT_LUTS: str = os.path.join(os.path.dirname(__file__), "resources", "sony_spi3d") 

29 

30 

31class TestReadLUTSonySPI3D: 

32 """ 

33 Define :func:`colour.io.luts.sony_spi3d.read_LUT_SonySPI3D` definition 

34 unit tests methods. 

35 """ 

36 

37 def test_read_LUT_SonySPI3D(self) -> None: 

38 """Test :func:`colour.io.luts.sony_spi3d.read_LUT_SonySPI3D` definition.""" 

39 

40 LUT_1 = read_LUT_SonySPI3D(os.path.join(ROOT_LUTS, "Colour_Correct.spi3d")) 

41 

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

159 

160 LUT_2 = read_LUT_SonySPI3D( 

161 os.path.join(ROOT_LUTS, "Colour_Correct_Unordered.spi3d") 

162 ) 

163 

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

169 

170 

171class TestWriteLUTSonySPI3D: 

172 """ 

173 Define :func:`colour.io.luts.sony_spi3d.write_LUT_SonySPI3D` definition 

174 unit tests methods. 

175 """ 

176 

177 def setup_method(self) -> None: 

178 """Initialise the common tests attributes.""" 

179 

180 self._temporary_directory = tempfile.mkdtemp() 

181 

182 def teardown_method(self) -> None: 

183 """After tests actions.""" 

184 

185 shutil.rmtree(self._temporary_directory) 

186 

187 def test_write_LUT_SonySPI3D(self) -> None: 

188 """Test :func:`colour.io.luts.sony_spi3d.write_LUT_SonySPI3D` definition.""" 

189 

190 LUT_r = read_LUT_SonySPI3D(os.path.join(ROOT_LUTS, "Colour_Correct.spi3d")) 

191 

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 

200 

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 

206 

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 = [] 

211 

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])) 

218 

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 )