# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenColorIO Project.
import unittest
import os
import sys
import PyOpenColorIO as OCIO
class FormatMetadataTest(unittest.TestCase):
def test_default(self):
"""
Test the default FormatMetadata.
"""
# FormatMetadata can not be constructed, it has to be retrieved.
# MatrixTransform has a FormatMetadata.
mat = OCIO.MatrixTransform()
fmd = mat.getFormatMetadata()
# Default name is ROOT and has no value.
self.assertEqual(fmd.getElementName(), 'ROOT')
self.assertEqual(fmd.getElementValue(), '')
# No attributes.
self.assertEqual(len(list(fmd)), 0)
# No children.
children = fmd.getChildElements()
self.assertEqual(len(list(children)), 0)
def test_children(self):
"""
Test the FormatMetadata children.
"""
# Create a hierarchy:
# ROOT |- C1-V1 |- C4-V4
# | |- C5-V5 |- C6-V6
# |- C2
# |- C3-V3
mat = OCIO.MatrixTransform()
fmd = mat.getFormatMetadata()
fmd.addChildElement('C1','V1')
fmd.addChildElement('C2', '')
fmd.addChildElement('C3','V3')
fmdc1 = fmd.getChildElements()[0]
fmdc1.addChildElement('C4','V4')
fmdc1.addChildElement('C5','V5')
fmdc5 = fmdc1.getChildElements()[1]
fmdc5.addChildElement('C6','V6')
# Access children.
self.assertEqual(len(list(fmd.getChildElements())), 3)
children = fmd.getChildElements()
child1 = next(children)
self.assertEqual(child1.getElementName(), 'C1')
self.assertEqual(child1.getElementValue(), 'V1')
self.assertEqual(len(list(child1.getChildElements())), 2)
childrenC1 = child1.getChildElements()
child4 = next(childrenC1)
self.assertEqual(child4.getElementName(), 'C4')
self.assertEqual(child4.getElementValue(), 'V4')
self.assertEqual(len(list(child4.getChildElements())), 0)
child5 = next(childrenC1)
self.assertEqual(child5.getElementName(), 'C5')
self.assertEqual(child5.getElementValue(), 'V5')
self.assertEqual(len(list(child5.getChildElements())), 1)
try:
next(childrenC1)
except StopIteration:
pass
else:
raise AssertionError("Child1 should not have other children.")
childrenC5 = child5.getChildElements()
child6 = next(childrenC5)
self.assertEqual(child6.getElementName(), 'C6')
self.assertEqual(child6.getElementValue(), 'V6')
self.assertEqual(len(list(child6.getChildElements())), 0)
child2 = next(children)
self.assertEqual(child2.getElementName(), 'C2')
self.assertEqual(child2.getElementValue(), '')
self.assertEqual(len(list(child2.getChildElements())), 0)
child3 = next(children)
self.assertEqual(child3.getElementName(), 'C3')
self.assertEqual(child3.getElementValue(), 'V3')
self.assertEqual(len(list(child3.getChildElements())), 0)
try:
next(children)
except StopIteration:
pass
else:
raise AssertionError("FormatMetadata should not have other children.")
# Test representation.
self.assertEqual(str(fmd), 'V1V4V5V6V3')
# Add a new leaf.
child3.addChildElement('C7','V7')
self.assertEqual(len(list(child3.getChildElements())), 1)
# Clear removes children and value, but it preserves the name.
child3.clear()
self.assertEqual(len(list(child3.getChildElements())), 0)
self.assertEqual(child3.getElementName(), 'C3')
self.assertEqual(child3.getElementValue(), '')
# FormatMetadata must have a name.
with self.assertRaises(OCIO.Exception):
child3.addChildElement('','')
# Children might have the same name.
child3.addChildElement('same','')
child3.addChildElement('same','')
self.assertEqual(len(list(child3.getChildElements())), 2)
# Test invalid cases. Name and value have to be strings.
with self.assertRaises(TypeError):
child3.addChildElement('string', 42)
with self.assertRaises(TypeError):
child3.addChildElement(42, 'string')
with self.assertRaises(TypeError):
child3.addChildElement('name', None)
def test_attributes(self):
"""
Test the FormatMetadata attributes.
"""
mat = OCIO.MatrixTransform()
fmd = mat.getFormatMetadata()
fmd.addChildElement('C1','V1')
fmdc1 = fmd.getChildElements()[0]
fmdc1['att1'] = 'val1'
fmdc1['att2'] = 'val2'
fmdc1['att3'] = 'val3'
# Verify attributes names.
atts = list(fmdc1)
self.assertEqual(len(atts), 3)
self.assertEqual(atts[0], 'att1')
self.assertEqual(atts[1], 'att2')
self.assertEqual(atts[2], 'att3')
# Get attributes.
attsIt = fmdc1.getAttributes()
att1 = next(attsIt)
self.assertEqual(att1[0], 'att1')
self.assertEqual(att1[1], 'val1')
att2 = next(attsIt)
self.assertEqual(att2[0], 'att2')
self.assertEqual(att2[1], 'val2')
att3 = next(attsIt)
self.assertEqual(att3[0], 'att3')
self.assertEqual(att3[1], 'val3')
try:
next(attsIt)
except StopIteration:
pass
else:
raise AssertionError("FormatMetadata should not have other attributes.")
# Test representation.
self.assertEqual(str(fmd), 'V1')
# Attribute names are unique. Setting a value to an existing attribute is replacing the
# existing attribute value.
fmdc1['att1'] = 'new val1'
atts = list(fmdc1)
self.assertEqual(len(atts), 3)
attsIt = fmdc1.getAttributes()
att1 = next(attsIt)
self.assertEqual(att1[0], 'att1')
self.assertEqual(att1[1], 'new val1')
# Clear removes attributes.
fmdc1.clear()
atts = list(fmdc1)
self.assertEqual(len(atts), 0)