def test_float(self):
        self.assertEqual(self.get_prop(self.obj, 'some-float'), 0)
        self.set_prop(self.obj, 'some-float', GLib.MAXFLOAT)
        self.assertEqual(self.get_prop(self.obj, 'some-float'), GLib.MAXFLOAT)

        obj = GIMarshallingTests.PropertiesObject(some_float=42.42)
        self.assertAlmostEqual(self.get_prop(obj, 'some-float'), 42.42, places=4)

        obj = GIMarshallingTests.PropertiesObject(some_float=42)
        self.assertAlmostEqual(self.get_prop(obj, 'some-float'), 42.0, places=4)

        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-float', 'foo')
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-float', None)

        self.assertAlmostEqual(self.get_prop(obj, 'some-float'), 42.0, places=4)
    def test_double(self):
        self.assertEqual(self.get_prop(self.obj, 'some-double'), 0)
        self.set_prop(self.obj, 'some-double', GLib.MAXDOUBLE)
        self.assertEqual(self.get_prop(self.obj, 'some-double'), GLib.MAXDOUBLE)

        obj = GIMarshallingTests.PropertiesObject(some_double=42.42)
        self.assertAlmostEqual(self.get_prop(obj, 'some-double'), 42.42)

        obj = GIMarshallingTests.PropertiesObject(some_double=42)
        self.assertAlmostEqual(self.get_prop(obj, 'some-double'), 42.0)

        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-double', 'foo')
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-double', None)

        self.assertAlmostEqual(self.get_prop(obj, 'some-double'), 42.0)
    def test_boolean(self):
        self.assertEqual(self.get_prop(self.obj, 'some-boolean'), False)
        self.set_prop(self.obj, 'some-boolean', True)
        self.assertEqual(self.get_prop(self.obj, 'some-boolean'), True)

        obj = GIMarshallingTests.PropertiesObject(some_boolean=True)
        self.assertEqual(self.get_prop(obj, 'some-boolean'), True)
    def test_uchar(self):
        self.assertEqual(self.get_prop(self.obj, 'some-uchar'), 0)
        self.set_prop(self.obj, 'some-uchar', GLib.MAXUINT8)
        self.assertEqual(self.get_prop(self.obj, 'some-uchar'), GLib.MAXUINT8)

        obj = GIMarshallingTests.PropertiesObject(some_uchar=42)
        self.assertEqual(self.get_prop(obj, 'some-uchar'), 42)
    def test_uint64(self):
        self.assertEqual(self.get_prop(self.obj, 'some-uint64'), 0)
        self.set_prop(self.obj, 'some-uint64', GLib.MAXUINT64)
        self.assertEqual(self.get_prop(self.obj, 'some-uint64'), GLib.MAXUINT64)

        obj = GIMarshallingTests.PropertiesObject(some_uint64=4200000000000000)
        self.assertEqual(self.get_prop(obj, 'some-uint64'), 4200000000000000)
    def test_coerce_from_instance(self):
        obj = GIMarshallingTests.PropertiesObject()
        prop = GObject.ObjectClass.find_property(obj, 'some-int')

        self.assertIsInstance(prop, GObject.GParamSpec)
        self.assertEqual(prop.name, 'some-int')
        self.assertEqual(prop.value_type, GObject.TYPE_INT)
        self.assertEqual(prop.owner_type, obj.__gtype__)
    def test_strv(self):
        self.assertEqual(self.get_prop(self.obj, 'some-strv'), [])
        self.set_prop(self.obj, 'some-strv', ['hello', 'world'])
        self.assertEqual(self.get_prop(self.obj, 'some-strv'), ['hello', 'world'])

        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-strv', 1)
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-strv', 'foo')
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-strv', [1, 2])
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-strv', ['foo', 1])

        self.assertEqual(self.get_prop(self.obj, 'some-strv'), ['hello', 'world'])

        obj = GIMarshallingTests.PropertiesObject(some_strv=['hello', 'world'])
        self.assertEqual(self.get_prop(obj, 'some-strv'), ['hello', 'world'])

        # unicode on py2
        obj = GIMarshallingTests.PropertiesObject(some_strv=[_unicode('foo')])
        self.assertEqual(self.get_prop(obj, 'some-strv'), [_unicode('foo')])
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-strv',
                          [_unicode('foo'), 1])
    def test_ulong(self):
        self.assertEqual(self.get_prop(self.obj, 'some_ulong'), 0)
        self.set_prop(self.obj, 'some-ulong', GLib.MAXULONG)
        self.assertEqual(self.get_prop(self.obj, 'some_ulong'), GLib.MAXULONG)

        obj = GIMarshallingTests.PropertiesObject(some_ulong=42)
        self.assertEqual(self.get_prop(obj, 'some-ulong'), 42)

        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-ulong', 'foo')
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-ulong', None)

        self.assertEqual(self.get_prop(obj, 'some-ulong'), 42)
    def test_int(self):
        self.assertEqual(self.get_prop(self.obj, 'some_int'), 0)
        self.set_prop(self.obj, 'some-int', GLib.MAXINT)
        self.assertEqual(self.get_prop(self.obj, 'some_int'), GLib.MAXINT)

        obj = GIMarshallingTests.PropertiesObject(some_int=-42)
        self.assertEqual(self.get_prop(obj, 'some-int'), -42)

        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-int', 'foo')
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-int', None)

        self.assertEqual(self.get_prop(obj, 'some-int'), -42)
    def test_props_accessor_dir(self):
        # Test class
        props = dir(GIMarshallingTests.PropertiesObject.props)
        self.assertTrue('some_float' in props)
        self.assertTrue('some_double' in props)
        self.assertTrue('some_variant' in props)

        # Test instance
        obj = GIMarshallingTests.PropertiesObject()
        props = dir(obj.props)
        self.assertTrue('some_float' in props)
        self.assertTrue('some_double' in props)
        self.assertTrue('some_variant' in props)
    def test_props_getter_holding_object_ref_count(self):
        holder = GIMarshallingTests.PropertiesObject()
        held = GObject.Object()

        self.assertEqual(holder.__grefcount__, 1)
        self.assertEqual(held.__grefcount__, 1)

        holder.set_property('some-object', held)
        self.assertEqual(holder.__grefcount__, 1)

        initial_ref_count = held.__grefcount__
        holder.props.some_object
        gc.collect()
        self.assertEqual(held.__grefcount__, initial_ref_count)
    def test_held_object_ref_count_getter(self):
        holder = GIMarshallingTests.PropertiesObject()
        held = GObject.Object()

        self.assertEqual(holder.__grefcount__, 1)
        self.assertEqual(held.__grefcount__, 1)

        self.set_prop(holder, 'some-object', held)
        self.assertEqual(holder.__grefcount__, 1)

        initial_ref_count = held.__grefcount__
        self.get_prop(holder, 'some-object')
        gc.collect()
        self.assertEqual(held.__grefcount__, initial_ref_count)
    def test_props_setter_holding_object_ref_count(self):
        holder = GIMarshallingTests.PropertiesObject()
        held = GObject.Object()

        self.assertEqual(holder.__grefcount__, 1)
        self.assertEqual(held.__grefcount__, 1)

        # Setting property should only increase ref count by 1
        holder.props.some_object = held
        self.assertEqual(holder.__grefcount__, 1)
        self.assertEqual(held.__grefcount__, 2)

        # Clearing should pull it back down
        holder.props.some_object = None
        self.assertEqual(held.__grefcount__, 1)
    def test_held_object_ref_count_setter(self):
        holder = GIMarshallingTests.PropertiesObject()
        held = GObject.Object()

        self.assertEqual(holder.__grefcount__, 1)
        self.assertEqual(held.__grefcount__, 1)

        # Setting property should only increase ref count by 1
        self.set_prop(holder, 'some-object', held)
        self.assertEqual(holder.__grefcount__, 1)
        self.assertEqual(held.__grefcount__, 2)

        # Clearing should pull it back down
        self.set_prop(holder, 'some-object', None)
        self.assertEqual(held.__grefcount__, 1)
    def test_boxed_struct(self):
        self.assertEqual(self.get_prop(self.obj, 'some-boxed-struct'), None)

        class GStrv(list):
            __gtype__ = GObject.TYPE_STRV

        struct1 = GIMarshallingTests.BoxedStruct()
        struct1.long_ = 1

        self.set_prop(self.obj, 'some-boxed-struct', struct1)
        self.assertEqual(self.get_prop(self.obj, 'some-boxed-struct').long_, 1)
        self.assertEqual(self.obj.some_boxed_struct.long_, 1)

        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-boxed-struct', 1)
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-boxed-struct', 'foo')

        obj = GIMarshallingTests.PropertiesObject(some_boxed_struct=struct1)
        self.assertEqual(self.get_prop(obj, 'some-boxed-struct').long_, 1)
    def test_variant(self):
        self.assertEqual(self.get_prop(self.obj, 'some-variant'), None)

        self.set_prop(self.obj, 'some-variant', GLib.Variant('o', '/myobj'))
        self.assertEqual(self.get_prop(self.obj, 'some-variant').get_type_string(), 'o')
        self.assertEqual(self.get_prop(self.obj, 'some-variant').print_(False), "'/myobj'")

        self.set_prop(self.obj, 'some-variant', None)
        self.assertEqual(self.get_prop(self.obj, 'some-variant'), None)

        obj = GIMarshallingTests.PropertiesObject(some_variant=GLib.Variant('b', True))
        self.assertEqual(self.get_prop(obj, 'some-variant').get_type_string(), 'b')
        self.assertEqual(self.get_prop(obj, 'some-variant').get_boolean(), True)

        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-variant', 'foo')
        self.assertRaises(TypeError, self.set_prop, self.obj, 'some-variant', 23)

        self.assertEqual(self.get_prop(obj, 'some-variant').get_type_string(), 'b')
        self.assertEqual(self.get_prop(obj, 'some-variant').get_boolean(), True)
 def test_boxed_glist_ctor(self):
     list_ = [GLib.MININT, 42, GLib.MAXINT]
     obj = GIMarshallingTests.PropertiesObject(some_boxed_glist=list_)
     self.assertEqual(self.get_prop(obj, 'some-boxed-glist'), list_)
 def setUp(self):
     self.obj = GIMarshallingTests.PropertiesObject()
 def test_set_object_property_to_invalid_type(self):
     obj = GIMarshallingTests.PropertiesObject()
     self.assertRaises(TypeError, self.set_prop, obj, 'some-object', 'not_an_object')
 def test_setting_several_properties(self):
     obj = GIMarshallingTests.PropertiesObject()
     obj.set_properties(some_uchar=54, some_int=42)
     self.assertEqual(42, self.get_prop(obj, 'some-int'))
     self.assertEqual(54, self.get_prop(obj, 'some-uchar'))