summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Dahlin <johan@src.gnome.org>2004-07-21 09:01:23 +0000
committerJohan Dahlin <johan@src.gnome.org>2004-07-21 09:01:23 +0000
commit3929301962e68613360ae231b1bda968b7e764de (patch)
treec8ee8c322de946016d8e6eceac0a2df6e4ee98af
parentd2c71ff53b42afec6bf4ebca3bcf801dce5cfbb2 (diff)
downloadpygobject-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.c46
-rw-r--r--tests/enum.py68
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()