Files
OpenColorIO/tests/python/CDLTransformTest.py
T
Rémi AchardandPatrick Hodoul 72f5c082f8 Add Python wheel generation (#1401)
* Initial Python wheel build workflow

Signed-off-by: Rémi Achard <remiachard@gmail.com>

* Add unit test suite to PyOpenColorIO package

Signed-off-by: Rémi Achard <remiachard@gmail.com>

* Misc improvements

Signed-off-by: Rémi Achard <remiachard@gmail.com>

* Remove test files duplication, ship full set

Signed-off-by: Rémi Achard <remiachard@gmail.com>

* Prepare GH script for release

Signed-off-by: Rémi Achard <remiachard@gmail.com>

* Fix rebase master

Signed-off-by: Rémi Achard <remiachard@gmail.com>

* Add support for Apple Silicon

Signed-off-by: Rémi Achard <remiachard@gmail.com>

* Update release version number from Readme

Signed-off-by: Rémi Achard <remiachard@gmail.com>

* Dynamic version number for python package

Signed-off-by: Rémi Achard <remiachard@gmail.com>

Co-authored-by: Patrick Hodoul <patrick.hodoul@autodesk.com>
2021-08-25 14:35:57 -04:00

367 lines
13 KiB
Python

# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenColorIO Project.
import os
import unittest
import PyOpenColorIO as OCIO
from UnitTestUtils import TEST_DATAFILES_DIR, TEST_NAMES, TEST_DESCS
from TransformsBaseTest import TransformsBaseTest
class CDLTransformTest(unittest.TestCase, TransformsBaseTest):
# Default CDL values on initialization.
DEFAULT_CDL_SLOPE = [1.0, 1.0, 1.0]
DEFAULT_CDL_OFFSET = [0.0, 0.0, 0.0]
DEFAULT_CDL_POWER = [1.0, 1.0, 1.0]
DEFAULT_CDL_SAT = 1.0
# Values to test setter and getter.
TEST_CDL_ID = 'shot 042'
TEST_CDL_DESC = 'Cool look for forest scenes.'
TEST_CDL_SLOPE = [1.5, 2, 2.5]
TEST_CDL_OFFSET = [3, 3.5, 4]
TEST_CDL_POWER = [4.5, 5, 5.5]
TEST_CDL_SAT = 6
def setUp(self):
self.tr = OCIO.CDLTransform()
def test_transform_type(self):
"""
Test the getTransformType() method.
"""
self.assertEqual(self.tr.getTransformType(), OCIO.TRANSFORM_TYPE_CDL)
def test_id(self):
"""
Test the setID() and getID() methods.
"""
# Default initialized id value is ""
self.assertEqual(self.tr.getID(), '')
# Test id name setter and getter.
for id_ in TEST_NAMES:
self.tr.setID(id_)
self.assertEqual(id_, self.tr.getID())
def test_description(self):
"""
Test the setFirstSOPDescription() and getFirstSOPDescription() methods.
"""
# Default initialized description value is ""
self.assertEqual(self.tr.getFirstSOPDescription(), '')
# Test description setter and getter.
for desc in TEST_DESCS:
self.tr.setFirstSOPDescription(desc)
self.assertEqual(desc, self.tr.getFirstSOPDescription())
def test_slope(self):
"""
Test the setSlope() and getSlope() methods.
"""
# Default initialized slope values are [1.0, 1.0, 1.0]
slope = self.tr.getSlope()
self.assertEqual(len(slope), 3)
self.assertListEqual(self.DEFAULT_CDL_SLOPE, slope)
# Test by setting slope values to TEST_CDL_SLOPE.
self.tr.setSlope(self.TEST_CDL_SLOPE)
slope = self.tr.getSlope()
self.assertEqual(len(slope), 3)
self.assertListEqual(self.TEST_CDL_SLOPE, slope)
def test_offset(self):
"""
Test the setOffset() and getOffset() methods.
"""
# Default initialized offset values are [0.0, 0.0, 0.0]
offset = self.tr.getOffset()
self.assertEqual(len(offset), 3)
self.assertListEqual(self.DEFAULT_CDL_OFFSET, offset)
# Test by setting offset values to TEST_CDL_OFFSET.
self.tr.setOffset(self.TEST_CDL_OFFSET)
offset = self.tr.getOffset()
self.assertEqual(len(offset), 3)
self.assertListEqual(self.TEST_CDL_OFFSET, offset)
def test_power(self):
"""
Test the setPower() and getPower() methods.
"""
# Default initialized power values are [0.0, 0.0, 0.0]
power = self.tr.getPower()
self.assertEqual(len(power), 3)
self.assertListEqual(self.DEFAULT_CDL_POWER, power)
# Test by setting power values to TEST_CDL_POWER.
self.tr.setPower(self.TEST_CDL_POWER)
power = self.tr.getPower()
self.assertEqual(len(power), 3)
self.assertListEqual(self.TEST_CDL_POWER, power)
def test_saturation(self):
"""
Test the setSat() and getSat() methods.
"""
# Default initialized saturation value is 1.0
saturation = self.tr.getSat()
self.assertEqual(self.DEFAULT_CDL_SAT, saturation)
# Test by setting saturation value to TEST_CDL_SAT.
self.tr.setSat(self.TEST_CDL_SAT)
self.assertEqual(self.tr.getSat(), self.TEST_CDL_SAT)
def test_style(self):
"""
Test the setStyle() and getStyle() methods.
"""
# Default initialized direction is forward.
self.assertEqual(self.tr.getStyle(), OCIO.CDL_NO_CLAMP)
for style in OCIO.CDLStyle.__members__.values():
self.tr.setStyle(style)
self.assertEqual(self.tr.getStyle(), style)
def test_create_from_file_cc(self):
"""
Test CreateFromFile() method with a cc file and write it back.
"""
# Try env var first to get test file path.
test_file = os.path.join(TEST_DATAFILES_DIR, 'cdl_test1.cc')
# Test cc file.
cdl = OCIO.CDLTransform.CreateFromFile(test_file, 'foo')
self.assertEqual(cdl.getID(), 'foo')
self.assertEqual(cdl.getFirstSOPDescription(), 'this is a description')
self.assertListEqual(cdl.getSlope(), [1.1, 1.2, 1.3])
self.assertListEqual(cdl.getOffset(), [2.1, 2.2, 2.3])
self.assertListEqual(cdl.getPower(), [3.1, 3.2, 3.3])
self.assertEqual(cdl.getSat(), 0.7)
# Write CDL back.
cfg = OCIO.Config.CreateRaw()
grp = OCIO.GroupTransform()
grp.appendTransform(cdl)
self.assertEqual(grp.write(config=cfg, formatName='ColorCorrection'),
"""<ColorCorrection id="foo">
<SOPNode>
<Description>this is a description</Description>
<Slope>1.1 1.2 1.3</Slope>
<Offset>2.1 2.2 2.3</Offset>
<Power>3.1 3.2 3.3</Power>
</SOPNode>
<SatNode>
<Saturation>0.7</Saturation>
</SatNode>
</ColorCorrection>
""")
def test_create_from_file_ccc(self):
"""
Test CreateFromFile() method with a ccc file.
"""
# Try env var first to get test file path.
test_file = os.path.join(TEST_DATAFILES_DIR, 'cdl_test1.ccc')
# Test 4th member of the ccc file.
cdl1 = OCIO.CDLTransform.CreateFromFile(test_file, '3')
self.assertEqual(cdl1.getID(), '')
self.assertListEqual(cdl1.getSlope(), [4.0, 5.0, 6.0])
self.assertListEqual(cdl1.getOffset(), [0.0, 0.0, 0.0])
self.assertListEqual(cdl1.getPower(), [0.9, 1.0, 1.2])
self.assertEqual(cdl1.getSat(), 1.0)
# Test a specified id member of the ccc file.
cdl2 = OCIO.CDLTransform.CreateFromFile(test_file, 'cc0003')
self.assertEqual(cdl2.getID(), 'cc0003')
self.assertEqual(cdl2.getFirstSOPDescription(), 'golden')
self.assertListEqual(cdl2.getSlope(), [1.2, 1.1, 1.0])
self.assertListEqual(cdl2.getOffset(), [0.0, 0.0, 0.0])
self.assertListEqual(cdl2.getPower(), [0.9, 1.0, 1.2])
self.assertEqual(cdl2.getSat(), 1.0)
def test_create_from_file_cdl(self):
"""
Test CreateFromFile() method with a cdl file.
"""
# Try env var first to get test file path.
test_file = os.path.join(TEST_DATAFILES_DIR, 'cdl_test1.cdl')
# Mute warnings being logged.
curLogLevel = OCIO.GetLoggingLevel()
OCIO.SetLoggingLevel(OCIO.LOGGING_LEVEL_NONE)
# Test a specified id member of the cdl file.
cdl = OCIO.CDLTransform.CreateFromFile(test_file, 'cc0003')
OCIO.SetLoggingLevel(curLogLevel)
self.assertEqual(cdl.getID(), 'cc0003')
self.assertEqual(cdl.getFirstSOPDescription(), 'golden')
self.assertListEqual(cdl.getSlope(), [1.2, 1.1, 1.0])
self.assertListEqual(cdl.getOffset(), [0.0, 0.0, 0.0])
self.assertListEqual(cdl.getPower(), [0.9, 1.0, 1.2])
self.assertEqual(cdl.getSat(), 1.0)
def test_create_group_from_file(self):
"""
Test CreateGroupFromFile.
"""
test_file = os.path.join(TEST_DATAFILES_DIR, 'cdl_test1.ccc')
grp_tr = OCIO.CDLTransform.CreateGroupFromFile(test_file)
self.assertEqual(len(grp_tr), 5)
self.assertEqual(grp_tr[0].getID(), 'cc0001')
self.assertEqual(grp_tr[1].getID(), 'cc0002')
self.assertEqual(grp_tr[2].getID(), 'cc0003')
self.assertEqual(grp_tr[3].getID(), '')
self.assertEqual(grp_tr[4].getID(), '')
def test_validate_slope(self):
"""
Test the validate() method for slope values. Values must be above 0.
"""
self.tr.setSlope(self.TEST_CDL_SLOPE)
self.assertIsNone(self.tr.validate())
# Exception validation test.
self.tr.setSlope([-1, -2, -3])
with self.assertRaises(OCIO.Exception):
self.tr.validate()
def test_validate_saturation(self):
"""
Test the validate() method for saturation value. Value must be above 0.
"""
self.tr.setSat(self.TEST_CDL_SAT)
self.assertIsNone(self.tr.validate())
# Exception validation test
self.tr.setSat(-0.1)
with self.assertRaises(OCIO.Exception):
self.tr.validate()
def test_validate_power(self):
"""
Test the validate() method for power values. Values must be above 0.
"""
self.tr.setPower(self.TEST_CDL_POWER)
self.assertIsNone(self.tr.validate())
# Exception validation test
self.tr.setPower([-1, -2, -3])
with self.assertRaises(OCIO.Exception):
self.tr.validate()
def test_validate_direction(self):
"""
Test the validate() method for direction.
Direction must be forward or inverse.
"""
self.tr.setDirection(OCIO.TRANSFORM_DIR_FORWARD)
self.assertIsNone(self.tr.validate())
def test_equality(self):
"""
Test the equals() method.
"""
cdl1 = OCIO.CDLTransform()
self.assertTrue(cdl1.equals(cdl1))
cdl2 = OCIO.CDLTransform()
self.assertTrue(cdl1.equals(cdl2))
self.assertTrue(cdl2.equals(cdl1))
cdl1.setSat(0.12601234)
self.assertFalse(cdl1.equals(cdl2))
self.assertFalse(cdl2.equals(cdl1))
cdl2.setSat(0.12601234)
self.assertTrue(cdl1.equals(cdl2))
self.assertTrue(cdl2.equals(cdl1))
def test_constructor_with_keyword(self):
"""
Test CDLTransform constructor with keywords and validate its values.
"""
# With keywords in their proper order.
cdl_tr = OCIO.CDLTransform(slope=self.TEST_CDL_SLOPE,
offset=self.TEST_CDL_OFFSET,
power=self.TEST_CDL_POWER,
sat=self.TEST_CDL_SAT,
id=self.TEST_CDL_ID,
description=self.TEST_CDL_DESC)
self.assertEqual(self.TEST_CDL_ID, cdl_tr.getID())
self.assertEqual(self.TEST_CDL_DESC, cdl_tr.getFirstSOPDescription())
self.assertEqual(self.TEST_CDL_SLOPE, cdl_tr.getSlope())
self.assertEqual(self.TEST_CDL_OFFSET, cdl_tr.getOffset())
self.assertEqual(self.TEST_CDL_POWER, cdl_tr.getPower())
self.assertEqual(self.TEST_CDL_SAT, cdl_tr.getSat())
# With keyword not in their proper order.
cdl_tr2 = OCIO.CDLTransform(id=self.TEST_CDL_ID,
description=self.TEST_CDL_DESC,
slope=self.TEST_CDL_SLOPE,
offset=self.TEST_CDL_OFFSET,
power=self.TEST_CDL_POWER,
sat=self.TEST_CDL_SAT)
self.assertEqual(self.TEST_CDL_ID, cdl_tr2.getID())
self.assertEqual(self.TEST_CDL_DESC, cdl_tr2.getFirstSOPDescription())
self.assertEqual(self.TEST_CDL_SLOPE, cdl_tr2.getSlope())
self.assertEqual(self.TEST_CDL_OFFSET, cdl_tr2.getOffset())
self.assertEqual(self.TEST_CDL_POWER, cdl_tr2.getPower())
self.assertEqual(self.TEST_CDL_SAT, cdl_tr2.getSat())
def test_constructor_without_keyword(self):
"""
Test CDLTransform constructor without keywords and validate its values.
"""
cdl_tr = OCIO.CDLTransform(self.TEST_CDL_SLOPE,
self.TEST_CDL_OFFSET,
self.TEST_CDL_POWER,
self.TEST_CDL_SAT,
self.TEST_CDL_ID,
self.TEST_CDL_DESC)
self.assertEqual(self.TEST_CDL_ID, cdl_tr.getID())
self.assertEqual(self.TEST_CDL_DESC, cdl_tr.getFirstSOPDescription())
self.assertEqual(self.TEST_CDL_SLOPE, cdl_tr.getSlope())
self.assertEqual(self.TEST_CDL_OFFSET, cdl_tr.getOffset())
self.assertEqual(self.TEST_CDL_POWER, cdl_tr.getPower())
self.assertEqual(self.TEST_CDL_SAT, cdl_tr.getSat())
def test_constructor_without_parameter(self):
"""
Test CDLTransform default constructor and validate its values.
"""
cdl_tr = OCIO.CDLTransform()
self.assertEqual(cdl_tr.getID(), '')
self.assertEqual(cdl_tr.getFirstSOPDescription(), '')
self.assertEqual(cdl_tr.getSlope(), [1.0, 1.0, 1.0])
self.assertEqual(cdl_tr.getOffset(), [0.0, 0.0, 0.0])
self.assertEqual(cdl_tr.getPower(), [1.0, 1.0, 1.0])
self.assertEqual(cdl_tr.getSat(), 1.0)