diff options
author | Sebastian Pölsterl <sebp@k-d-w.org> | 2012-02-05 11:59:51 +0100 |
---|---|---|
committer | Sebastian Pölsterl <sebp@k-d-w.org> | 2012-02-06 18:52:49 +0100 |
commit | ee62df4d2fc0cc63c2f29d3ad9b47b875dbd5f89 (patch) | |
tree | e13a8a7b4760bec1738773cca29f4b9cbb3e8310 | |
parent | c329bf2aee8d75ce452638db75e09197ff2b9b65 (diff) | |
download | pygobject-ee62df4d2fc0cc63c2f29d3ad9b47b875dbd5f89.tar.gz |
Properly distinguish between different integer types for properties
https://bugzilla.gnome.org/show_bug.cgi?id=664150
-rw-r--r-- | gi/pygi-property.c | 48 | ||||
-rw-r--r-- | tests/test_gi.py | 62 |
2 files changed, 106 insertions, 4 deletions
diff --git a/gi/pygi-property.c b/gi/pygi-property.c index 2f8970da..f400820b 100644 --- a/gi/pygi-property.c +++ b/gi/pygi-property.c @@ -121,16 +121,36 @@ pygi_get_property_value_real (PyGObject *instance, arg.v_boolean = g_value_get_boolean (&value); break; case GI_TYPE_TAG_INT8: + arg.v_int8 = g_value_get_schar (&value); + break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_INT32: + if (G_VALUE_HOLDS_LONG (&value)) + arg.v_long = g_value_get_long (&value); + else + arg.v_int = g_value_get_int (&value); + break; case GI_TYPE_TAG_INT64: - arg.v_int = g_value_get_int (&value); + if (G_VALUE_HOLDS_LONG (&value)) + arg.v_long = g_value_get_long (&value); + else + arg.v_int64 = g_value_get_int64 (&value); break; case GI_TYPE_TAG_UINT8: + arg.v_uint8 = g_value_get_uchar (&value); + break; case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_UINT32: + if (G_VALUE_HOLDS_ULONG (&value)) + arg.v_ulong = g_value_get_ulong (&value); + else + arg.v_uint = g_value_get_uint (&value); + break; case GI_TYPE_TAG_UINT64: - arg.v_uint = g_value_get_uint (&value); + if (G_VALUE_HOLDS_ULONG (&value)) + arg.v_ulong = g_value_get_ulong (&value); + else + arg.v_uint64 = g_value_get_uint64 (&value); break; case GI_TYPE_TAG_FLOAT: arg.v_float = g_value_get_float (&value); @@ -296,16 +316,36 @@ pygi_set_property_value_real (PyGObject *instance, g_value_set_boolean (&value, arg.v_boolean); break; case GI_TYPE_TAG_INT8: + g_value_set_schar (&value, arg.v_int8); + break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_INT32: + if (G_VALUE_HOLDS_LONG (&value)) + g_value_set_long (&value, arg.v_long); + else + g_value_set_int (&value, arg.v_int); + break; case GI_TYPE_TAG_INT64: - g_value_set_int (&value, arg.v_int); + if (G_VALUE_HOLDS_LONG (&value)) + g_value_set_long (&value, arg.v_long); + else + g_value_set_int64 (&value, arg.v_int64); break; case GI_TYPE_TAG_UINT8: + g_value_set_uchar (&value, arg.v_uint8); + break; case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_UINT32: + if (G_VALUE_HOLDS_ULONG (&value)) + g_value_set_ulong (&value, arg.v_ulong); + else + g_value_set_uint (&value, arg.v_uint); + break; case GI_TYPE_TAG_UINT64: - g_value_set_uint (&value, arg.v_uint); + if (G_VALUE_HOLDS_ULONG (&value)) + g_value_set_ulong (&value, arg.v_ulong); + else + g_value_set_uint64 (&value, arg.v_uint64); break; case GI_TYPE_TAG_FLOAT: g_value_set_float (&value, arg.v_float); diff --git a/tests/test_gi.py b/tests/test_gi.py index 68decf6f..a86e226b 100644 --- a/tests/test_gi.py +++ b/tests/test_gi.py @@ -1918,3 +1918,65 @@ class TestKeywordArgs(unittest.TestCase): d2 = d.copy() GIMarshallingTests.int_three_in_three_out(1, c=4, **d) self.assertEqual(d, d2) + +class TestPropertiesObject(unittest.TestCase): + + def setUp(self): + self.obj = GIMarshallingTests.PropertiesObject() + + def test_boolean(self): + self.assertEqual(self.obj.props.some_boolean, False) + self.obj.props.some_boolean = True + self.assertEqual(self.obj.props.some_boolean, True) + + @unittest.expectedFailure + def test_char(self): + # gobject-introspection thinks it has a guint8 type tag, which is wrong + self.assertEqual(self.obj.props.some_char, 0) + self.obj.props.some_char = GObject.G_MAXINT8 + self.assertEqual(self.obj.props.some_char, GObject.G_MAXINT8) + + def test_uchar(self): + self.assertEqual(self.obj.props.some_uchar, 0) + self.obj.props.some_uchar = GObject.G_MAXUINT8 + self.assertEqual(self.obj.props.some_uchar, GObject.G_MAXUINT8) + + def test_int(self): + self.assertEqual(self.obj.props.some_int, 0) + self.obj.props.some_int = GObject.G_MAXINT + self.assertEqual(self.obj.props.some_int, GObject.G_MAXINT) + + def test_uint(self): + self.assertEqual(self.obj.props.some_uint, 0) + self.obj.props.some_uint = GObject.G_MAXUINT + self.assertEqual(self.obj.props.some_uint, GObject.G_MAXUINT) + + def test_long(self): + self.assertEqual(self.obj.props.some_long, 0) + self.obj.props.some_long = GObject.G_MAXLONG + self.assertEqual(self.obj.props.some_long, GObject.G_MAXLONG) + + def test_ulong(self): + self.assertEqual(self.obj.props.some_ulong, 0) + self.obj.props.some_ulong = GObject.G_MAXULONG + self.assertEqual(self.obj.props.some_ulong, GObject.G_MAXULONG) + + def test_int64(self): + self.assertEqual(self.obj.props.some_int64, 0) + self.obj.props.some_int64 = GObject.G_MAXINT64 + self.assertEqual(self.obj.props.some_int64, GObject.G_MAXINT64) + + def test_uint64(self): + self.assertEqual(self.obj.props.some_uint64, 0) + self.obj.props.some_uint64 = GObject.G_MAXUINT64 + self.assertEqual(self.obj.props.some_uint64, GObject.G_MAXUINT64) + + def test_float(self): + self.assertEqual(self.obj.props.some_float, 0) + self.obj.props.some_float = GObject.G_MAXFLOAT + self.assertEqual(self.obj.props.some_float, GObject.G_MAXFLOAT) + + def test_double(self): + self.assertEqual(self.obj.props.some_double, 0) + self.obj.props.some_double = GObject.G_MAXDOUBLE + self.assertEqual(self.obj.props.some_double, GObject.G_MAXDOUBLE) |