diff options
author | Johan Dahlin <johan@src.gnome.org> | 2004-07-21 09:01:23 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2004-07-21 09:01:23 +0000 |
commit | 3929301962e68613360ae231b1bda968b7e764de (patch) | |
tree | c8ee8c322de946016d8e6eceac0a2df6e4ee98af | |
parent | d2c71ff53b42afec6bf4ebca3bcf801dce5cfbb2 (diff) | |
download | pygobject-3929301962e68613360ae231b1bda968b7e764de.tar.gz pygobject-3929301962e68613360ae231b1bda968b7e764de.tar.xz pygobject-3929301962e68613360ae231b1bda968b7e764de.zip |
Add, so Lorenzo can introspect flags properly tooPYGTK_2_3_94
* gobject/pygflags.c (pyg_flags_get_first_value_name)
(pyg_flags_get_first_value_nick): Add, so Lorenzo can introspect
flags properly too
(pyg_flags_get_value_names, pyg_flags_get_value_nicks): Make this
a little bit more useful. All values can still be fetch
through __flags_values__
* tests/enum.py: Improve and extend to test most enum/flags operations
-rw-r--r-- | gobject/pygflags.c | 46 | ||||
-rw-r--r-- | tests/enum.py | 68 |
2 files changed, 98 insertions, 16 deletions
diff --git a/gobject/pygflags.c b/gobject/pygflags.c index d210850..baf5f7d 100644 --- a/gobject/pygflags.c +++ b/gobject/pygflags.c @@ -286,6 +286,40 @@ pyg_flags_warn (PyObject *self, PyObject *args) } static PyObject * +pyg_flags_get_first_value_name(PyGFlags *self, void *closure) +{ + GFlagsClass *flags_class; + GFlagsValue *flags_value; + PyObject *retval; + + flags_class = g_type_class_ref(self->gtype); + g_assert(G_IS_FLAGS_CLASS(flags_class)); + flags_value = g_flags_get_first_value(flags_class, self->parent.ob_ival); + retval = PyString_FromString(flags_value->value_name); + + g_type_class_unref(flags_class); + + return retval; +} + +static PyObject * +pyg_flags_get_first_value_nick(PyGFlags *self, void *closure) +{ + GFlagsClass *flags_class; + GFlagsValue *flags_value; + PyObject *retval; + + flags_class = g_type_class_ref(self->gtype); + g_assert(G_IS_FLAGS_CLASS(flags_class)); + + flags_value = g_flags_get_first_value(flags_class, self->parent.ob_ival); + retval = PyString_FromString(flags_value->value_nick); + g_type_class_unref(flags_class); + + return retval; +} + +static PyObject * pyg_flags_get_value_names(PyGFlags *self, void *closure) { GFlagsClass *flags_class; @@ -295,9 +329,10 @@ pyg_flags_get_value_names(PyGFlags *self, void *closure) flags_class = g_type_class_ref(self->gtype); g_assert(G_IS_FLAGS_CLASS(flags_class)); - retval = PyTuple_New(flags_class->n_values); + retval = PyList_New(0); for (i = 0; i < flags_class->n_values; i++) - PyTuple_SetItem(retval, i, PyString_FromString(flags_class->values[i].value_name)); + if ((self->parent.ob_ival & flags_class->values[i].value) == flags_class->values[i].value) + PyList_Append(retval, PyString_FromString(flags_class->values[i].value_name)); g_type_class_unref(flags_class); @@ -314,9 +349,10 @@ pyg_flags_get_value_nicks(PyGFlags *self, void *closure) flags_class = g_type_class_ref(self->gtype); g_assert(G_IS_FLAGS_CLASS(flags_class)); - retval = PyTuple_New(flags_class->n_values); + retval = PyList_New(0); for (i = 0; i < flags_class->n_values; i++) - PyTuple_SetItem(retval, i, PyString_FromString(flags_class->values[i].value_nick)); + if ((self->parent.ob_ival & flags_class->values[i].value) == flags_class->values[i].value) + PyList_Append(retval, PyString_FromString(flags_class->values[i].value_nick)); g_type_class_unref(flags_class); @@ -324,6 +360,8 @@ pyg_flags_get_value_nicks(PyGFlags *self, void *closure) } static PyGetSetDef pyg_flags_getsets[] = { + { "first_value_name", (getter)pyg_flags_get_first_value_name, (setter)0 }, + { "first_value_nick", (getter)pyg_flags_get_first_value_nick, (setter)0 }, { "value_names", (getter)pyg_flags_get_value_names, (setter)0 }, { "value_nicks", (getter)pyg_flags_get_value_nicks, (setter)0 }, { NULL, 0, 0 } diff --git a/tests/enum.py b/tests/enum.py index 6b4f435..b27f09b 100644 --- a/tests/enum.py +++ b/tests/enum.py @@ -10,6 +10,12 @@ class EnumTest(unittest.TestCase): assert isinstance(atk.LAYER_OVERLAY, int) assert 'LAYER_OVERLAY' in repr(atk.LAYER_OVERLAY) assert int(atk.LAYER_OVERLAY) + assert atk.LAYER_INVALID == 0 + assert atk.LAYER_INVALID != 1 + assert atk.LAYER_INVALID != -1 + assert atk.LAYER_INVALID != atk.LAYER_BACKGROUND + + def testComparisionWarning(self): warnings.filterwarnings("error", "", Warning, "", 0) try: assert atk.LAYER_INVALID != atk.RELATION_NULL @@ -18,10 +24,6 @@ class EnumTest(unittest.TestCase): else: raise AssertionError warnings.resetwarnings() - assert atk.LAYER_INVALID == 0 - assert atk.LAYER_INVALID != 1 - assert atk.LAYER_INVALID != -1 - assert atk.LAYER_INVALID != atk.LAYER_BACKGROUND def testWindowGetState(self): win = gtk.Window() @@ -56,12 +58,34 @@ class EnumTest(unittest.TestCase): def testWeirdEnumValues(self): assert int(gdk.NOTHING) == -1 assert int(gdk.BUTTON_PRESS) == 4 - + + def testParamSpec(self): + props = filter(lambda prop: gobject.type_is_a(prop.value_type, gobject.GEnum), + gobject.list_properties(gtk.Window)) + assert len(props)>= 6 + props = filter(lambda prop: prop.name == 'type', props) + assert props + prop = props[0] + klass = prop.enum_class + assert klass == gtk.WindowType + assert hasattr(klass, '__enum_values__') + assert isinstance(klass.__enum_values__, dict) + assert len(klass.__enum_values__) >= 2 + class FlagsTest(unittest.TestCase): def testFlags(self): assert issubclass(gobject.GFlags, int) assert isinstance(gdk.BUTTON_PRESS_MASK, gdk.EventMask) assert isinstance(gdk.BUTTON_PRESS_MASK, int) + assert gdk.BUTTON_PRESS_MASK == 256 + assert gdk.BUTTON_PRESS_MASK != 0 + assert gdk.BUTTON_PRESS_MASK != -256 + assert gdk.BUTTON_PRESS_MASK != gdk.BUTTON_RELEASE_MASK + + assert gdk.EventMask.__bases__[0] == gobject.GFlags + assert len(gdk.EventMask.__flags_values__) == 22 + + def testComparisionWarning(self): warnings.filterwarnings("error", "", Warning, "", 0) try: assert gtk.ACCEL_VISIBLE != gtk.EXPAND @@ -70,16 +94,25 @@ class FlagsTest(unittest.TestCase): else: raise AssertionError warnings.resetwarnings() - assert gdk.BUTTON_PRESS_MASK == 256 - assert gdk.BUTTON_PRESS_MASK != 0 - assert gdk.BUTTON_PRESS_MASK != -256 - assert gdk.BUTTON_PRESS_MASK != gdk.BUTTON_RELEASE_MASK - - assert gdk.EventMask.__bases__[0] == gobject.GFlags - assert len(gdk.EventMask.__flags_values__) == 22 + + def testFlagOperations(self): a = gdk.BUTTON_PRESS_MASK + assert a.first_value_name == 'GDK_BUTTON_PRESS_MASK' + assert a.first_value_nick == 'button-press-mask' + assert a.value_names == ['GDK_BUTTON_PRESS_MASK'], a.value_names + assert a.value_nicks == ['button-press-mask'], a.value_names b = gdk.BUTTON_PRESS_MASK | gdk.BUTTON_RELEASE_MASK + assert b.first_value_name == 'GDK_BUTTON_PRESS_MASK' + assert b.first_value_nick == 'button-press-mask' + assert b.value_names == ['GDK_BUTTON_PRESS_MASK', 'GDK_BUTTON_RELEASE_MASK'] + assert b.value_nicks == ['button-press-mask', 'button-release-mask'] c = gdk.BUTTON_PRESS_MASK | gdk.BUTTON_RELEASE_MASK | gdk.ENTER_NOTIFY_MASK + assert c.first_value_name == 'GDK_BUTTON_PRESS_MASK' + assert c.first_value_nick == 'button-press-mask' + assert c.value_names == ['GDK_BUTTON_PRESS_MASK', 'GDK_BUTTON_RELEASE_MASK', + 'GDK_ENTER_NOTIFY_MASK'] + assert c.value_nicks == ['button-press-mask', 'button-release-mask', + 'enter-notify-mask'] assert int(a) assert int(a) == int(gdk.BUTTON_PRESS_MASK) assert int(b) @@ -90,6 +123,7 @@ class FlagsTest(unittest.TestCase): int(gdk.BUTTON_RELEASE_MASK) | int(gdk.ENTER_NOTIFY_MASK)) + def testUnsupportedOpertionWarning(self): warnings.filterwarnings("error", "", Warning, "", 0) try: value = gdk.BUTTON_PRESS_MASK + gdk.BUTTON_RELEASE_MASK @@ -99,5 +133,15 @@ class FlagsTest(unittest.TestCase): raise AssertionError warnings.resetwarnings() + def testParamSpec(self): + props = filter(lambda x: gobject.type_is_a(x.value_type, gobject.GFlags), + gtk.container_class_list_child_properties(gtk.Table)) + assert len(props) >= 2 + klass = props[0].flags_class + assert klass == gtk.AttachOptions + assert hasattr(klass, '__flags_values__') + assert isinstance(klass.__flags_values__, dict) + assert len(klass.__flags_values__) >= 3 + if __name__ == '__main__': unittest.main() |