Merge branch 'blender-v4.2-release'

This commit is contained in:
Bastien Montagne 2024-06-10 14:46:44 +02:00
commit 11462dd5c3
2 changed files with 104 additions and 53 deletions

@ -1157,6 +1157,10 @@ PropertySubType RNA_property_subtype(PropertyRNA *prop)
if (prop->magic != RNA_MAGIC) {
IDProperty *idprop = (IDProperty *)prop;
if (idprop->type == IDP_STRING && idprop->subtype == IDP_STRING_SUB_BYTE) {
return PROP_BYTESTRING;
}
if (idprop->ui_data) {
IDPropertyUIData *ui_data = idprop->ui_data;
return (PropertySubType)ui_data->rna_subtype;

@ -37,100 +37,144 @@ class TestHelper:
class TestIdPropertyCreation(TestHelper, unittest.TestCase):
# Default testing idprop key identifier.
key_id = "a"
def test_name_empty(self):
self.id[""] = 4
self.assertEqual(self.id[""], 4)
key_id = ""
value = 4
self.id[key_id] = value
self.assertEqual(self.id[key_id], value)
def test_name_too_long(self):
with self.assertRaises(KeyError):
self.id["name" * 30] = 4
def test_int(self):
self.id["a"] = 2
self.assertEqual(self.id["a"], 2)
self.assertTrue(isinstance(self.id["a"], int))
value = 2
self.id[self.key_id] = value
self.assertEqual(self.id[self.key_id], value)
self.assertTrue(isinstance(self.id[self.key_id], int))
self.assertEqual(self.id[self.key_id],
self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
with self.assertRaises(OverflowError):
self.id["a"] = 2 ** 31 # integer <= 2 ** 31-1
self.id[self.key_id] = 2 ** 31 # integer <= 2 ** 31-1
def test_double(self):
self.id["a"] = 2.5
self.assertEqual(self.id["a"], 2.5)
self.assertTrue(isinstance(self.id["a"], float))
value = 2.5
self.id[self.key_id] = value
self.assertEqual(self.id[self.key_id], value)
self.assertTrue(isinstance(self.id[self.key_id], float))
self.assertEqual(self.id[self.key_id],
self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_unicode(self):
self.id["a"] = "Hello World"
self.assertEqual(self.id["a"], "Hello World")
self.assertTrue(isinstance(self.id["a"], str))
value = "Hello World"
self.id[self.key_id] = value
self.assertEqual(self.id[self.key_id], value)
self.assertTrue(isinstance(self.id[self.key_id], str))
self.assertEqual(self.id[self.key_id],
self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_bytes(self):
self.id["a"] = b"Hello World"
self.assertEqual(self.id["a"], b"Hello World")
self.assertTrue(isinstance(self.id["a"], bytes))
value = b"Hello World"
self.id[self.key_id] = value
self.assertEqual(self.id[self.key_id], value)
self.assertTrue(isinstance(self.id[self.key_id], bytes))
self.assertEqual(self.id[self.key_id],
self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_enum(self):
self.id["a"] = 5
self.assertEqual(self.id["a"], 5)
self.assertTrue(isinstance(self.id["a"], int))
# Note: Fake enum, this merely creates a PROP_INT idprop.
value = 5
self.id[self.key_id] = value
self.assertEqual(self.id[self.key_id], value)
self.assertEqual(self.id[self.key_id],
self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_sequence_double_list(self):
mylist = [1.2, 3.4, 5.6]
self.id["a"] = mylist
self.assertEqual(self.id["a"].to_list(), mylist)
self.assertEqual(self.id["a"].typecode, "d")
self.id[self.key_id] = mylist
self.assertEqual(self.id[self.key_id].to_list(), mylist)
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_sequence_int_list(self):
mylist = [1, 2, 3]
self.id["a"] = mylist
self.assertEqual(self.id["a"].to_list(), mylist)
self.assertEqual(self.id["a"].typecode, "i")
self.id[self.key_id] = mylist
self.assertEqual(self.id[self.key_id].to_list(), mylist)
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_sequence_float_array(self):
mylist = [1.2, 3.4, 5.6]
self.id["a"] = array("f", mylist)
self.assertAlmostEqualSeq(self.id["a"].to_list(), mylist)
self.assertEqual(self.id["a"].typecode, "f")
self.id[self.key_id] = array("f", mylist)
self.assertAlmostEqualSeq(self.id[self.key_id].to_list(), mylist)
self.assertEqual(self.id[self.key_id].typecode, "f")
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_sequence_double_array(self):
mylist = [1.2, 3.4, 5.6]
self.id["a"] = array("d", mylist)
self.assertAlmostEqualSeq(self.id["a"].to_list(), mylist)
self.assertEqual(self.id["a"].typecode, "d")
self.id[self.key_id] = array("d", mylist)
self.assertAlmostEqualSeq(self.id[self.key_id].to_list(), mylist)
self.assertEqual(self.id[self.key_id].typecode, "d")
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_sequence_int_array(self):
mylist = [1, 2, 3]
self.id["a"] = array("i", mylist)
self.assertAlmostEqualSeq(self.id["a"].to_list(), mylist)
self.assertEqual(self.id["a"].typecode, "i")
self.id[self.key_id] = array("i", mylist)
self.assertAlmostEqualSeq(self.id[self.key_id].to_list(), mylist)
self.assertEqual(self.id[self.key_id].typecode, "i")
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_sequence_other_array(self):
mylist = [1, 2, 3]
self.id["a"] = array("Q", mylist)
self.assertEqual(self.id["a"].to_list(), mylist)
self.id[self.key_id] = array("Q", mylist)
self.assertEqual(self.id[self.key_id].to_list(), mylist)
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_sequence_mixed_numerical_type(self):
self.id["a"] = [1, 2, 3.4, 5]
self.assertAlmostEqualSeq(self.id["a"].to_list(), [1.0, 2.0, 3.4, 5.0])
self.assertEqual(self.id["a"].typecode, "d")
self.id[self.key_id] = [1, 2, 3.4, 5]
self.assertAlmostEqualSeq(self.id[self.key_id].to_list(), [1.0, 2.0, 3.4, 5.0])
self.assertEqual(self.id[self.key_id].typecode, "d")
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_sequence_str_list(self):
# I'm a bit surprised that this works
mylist = ["abc", "qwe"]
self.id["a"] = mylist
self.assertEqual(self.id["a"], mylist)
self.id[self.key_id] = mylist
self.assertEqual(self.id[self.key_id], mylist)
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_sequence_mixed_type(self):
with self.assertRaises(TypeError):
mylist = ["abc", 3, "qwe", 3.4]
self.id["a"] = mylist
self.id[self.key_id] = mylist
def test_mapping_simple(self):
mydict = {"1": 10, "2": "20", "3": 30.5}
self.id["a"] = mydict
self.assertEqual(self.id["a"]["1"], mydict["1"])
self.assertEqual(self.id["a"]["2"], mydict["2"])
self.assertEqual(self.id["a"]["3"], mydict["3"])
self.id[self.key_id] = mydict
self.assertEqual(self.id[self.key_id]["1"], mydict["1"])
self.assertEqual(self.id[self.key_id]["2"], mydict["2"])
self.assertEqual(self.id[self.key_id]["3"], mydict["3"])
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
def test_mapping_complex(self):
mydict = {
@ -138,19 +182,22 @@ class TestIdPropertyCreation(TestHelper, unittest.TestCase):
"2": {"1": "abc", "2": array("i", [4, 5, 6])},
"3": {"1": {"1": 10}, "2": b"qwe"},
}
self.id["a"] = mydict
self.assertEqual(self.id["a"]["1"].to_list(), [1, 2, 3])
self.assertEqual(self.id["a"]["2"]["1"], "abc")
self.assertEqual(self.id["a"]["2"]["2"].to_list(), [4, 5, 6])
self.assertEqual(self.id["a"]["3"]["1"]["1"], 10)
self.assertEqual(self.id["a"]["3"]["2"], b"qwe")
self.id[self.key_id] = mydict
self.assertEqual(self.id[self.key_id]["1"].to_list(), [1, 2, 3])
self.assertEqual(self.id[self.key_id]["2"]["1"], "abc")
self.assertEqual(self.id[self.key_id]["2"]["2"].to_list(), [4, 5, 6])
self.assertEqual(self.id[self.key_id]["3"]["1"]["1"], 10)
self.assertEqual(self.id[self.key_id]["3"]["2"], b"qwe")
# Complex types currently return different object types.
# self.assertEqual(self.id[self.key_id],
# self.id.path_resolve('["%s"]' % bpy.utils.escape_identifier(self.key_id)))
with self.assertRaises(KeyError):
a = self.id["a"]["2"]["a"]
a = self.id[self.key_id]["2"]["a"]
def test_invalid_type(self):
with self.assertRaises(TypeError):
self.id["a"] = self
self.id[self.key_id] = self
class TestIdPropertyGroupView(TestHelper, unittest.TestCase):