diff --git a/tests/test_prop_factory.py b/tests/test_prop_factory.py new file mode 100644 index 0000000..7ef2230 --- /dev/null +++ b/tests/test_prop_factory.py @@ -0,0 +1,153 @@ +# test_prop_factory +""" +Test custom Blender property-group factory module. +""" + +import unittest, os, textwrap, io + +# This is the most ridiculous work-around, but it seems to be necessary to +# get Python 3 to import the modules for testing +import sys +print("__file__ = ", __file__) +sys.path.append(os.path.normpath(os.path.join(__file__, '..', '..'))) + +import yaml + +import bpy + +from abx import prop_factory + + +class TestPropertyGroupFactory(unittest.TestCase): + SIMPLE = textwrap.dedent("""\ + --- + my_custom_property_group: + - code: prop1 + name: prop1 + type: str + maxlen: 20 + default: default + desc: My test property. + """) + + SAMPLER = textwrap.dedent("""\ + --- + sampler: + - code: str_prop + name: MyString + type: str + maxlen: 20 + default: str_prop + desc: A string property example. + + - code: int_prop + name: MyInteger + type: int + min: 0 + max: 100 + soft_min: 0 + soft_max: 10 + default: 1 + desc: An integer property example. + + - code: float_prop + name: MyFloat + type: float + min: -10.0 + max: 10.0 + soft_min: 0.0 + soft_max: 1.0 + precision: 3 + unit: 'LENGTH' + default: 1.0 + desc: A float property example. + + - code: bool_prop + name: MyBoolean + type: bool + default: False + desc: A boolean property example. + + - code: enum_prop1 + name: MyEnum1 + type: enum + items_from: enum1_list + default: 'unknown' + desc: An enumerated property using a list reference. + + enum1_list: + - unknown + - option1 + - option2 + """) + + def assertHasAttr(self, ob, attr): + self.assertTrue(hasattr(ob,attr), + msg="Object %s has no attribute %s." % (ob, attr)) + + def test_creating_simple_yaml_example(self): + schema = yaml.safe_load(io.StringIO(self.SIMPLE)) + cpg = prop_factory.PropertyGroupFactory( + 'my_custom_property_group', schema) + + self.assertHasAttr(cpg, 'prop1') + + def test_attach_simple_yaml_to_scene(self): + schema = yaml.safe_load(io.StringIO(self.SIMPLE)) + cpg = prop_factory.PropertyGroupFactory( + 'my_custom_property_group', schema) + + bpy.types.Scene.my_custom_property_group = bpy.props.PointerProperty(type=cpg) + + self.assertEqual( + bpy.context.scene.my_custom_property_group.prop1, + 'default') + + def test_creating_complex_sampler(self): + schema = yaml.safe_load(io.StringIO(self.SAMPLER)) + sampler = prop_factory.PropertyGroupFactory( + 'sampler', schema) + bpy.types.Scene.sampler = bpy.props.PointerProperty(type=sampler) + + self.assertEqual( + bpy.context.scene.sampler.str_prop, 'str_prop') + + self.assertEqual( + bpy.context.scene.sampler.int_prop, 1) + + self.assertEqual( + bpy.context.scene.sampler.float_prop, 1.0) + + self.assertEqual( + bpy.context.scene.sampler.bool_prop, False) + + self.assertEqual( + bpy.context.scene.sampler.enum_prop1, 'unknown') + + bpy.context.scene.sampler.str_prop = 'my string' + bpy.context.scene.sampler.int_prop = 2 + bpy.context.scene.sampler.float_prop = 0.7 + bpy.context.scene.sampler.bool_prop = True + bpy.context.scene.sampler.enum_prop1 = 'option1' + + self.assertEqual( + bpy.context.scene.sampler.str_prop, 'my string') + + self.assertEqual( + bpy.context.scene.sampler.int_prop, 2) + + self.assertAlmostEqual( + bpy.context.scene.sampler.float_prop, 0.7) + + self.assertEqual( + bpy.context.scene.sampler.bool_prop, True) + + self.assertEqual( + bpy.context.scene.sampler.enum_prop1, 'option1') + + + + + + + \ No newline at end of file