summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Pölsterl <sebp@k-d-w.org>2012-02-05 11:59:51 +0100
committerSebastian Pölsterl <sebp@k-d-w.org>2012-02-06 18:52:49 +0100
commitee62df4d2fc0cc63c2f29d3ad9b47b875dbd5f89 (patch)
treee13a8a7b4760bec1738773cca29f4b9cbb3e8310
parentc329bf2aee8d75ce452638db75e09197ff2b9b65 (diff)
downloadpygobject-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.c48
-rw-r--r--tests/test_gi.py62
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)