Add a simple test of the METH_CLASS and METH_STATIC flags for type methods.

This commit is contained in:
Fred Drake 2002-03-28 15:49:54 +00:00
parent 4157ffbb96
commit f841aa6fc0
2 changed files with 58 additions and 0 deletions

View File

@ -1214,6 +1214,20 @@ def classmethods():
vereq(ff.__get__(0, int)(42), (int, 42))
vereq(ff.__get__(0)(42), (int, 42))
def classmethods_in_c():
if verbose: print "Testing C-based class methods..."
import xxsubtype as spam
a = (1, 2, 3)
d = {'abc': 123}
x, a1, d1 = spam.spamlist.classmeth(*a, **d)
veris(x, None)
vereq((spam.spamlist,) + a, a1)
vereq(d, d1)
x, a1, d1 = spam.spamlist().classmeth(*a, **d)
veris(x, None)
vereq((spam.spamlist,) + a, a1)
vereq(d, d1)
def staticmethods():
if verbose: print "Testing static methods..."
class C(object):
@ -1231,6 +1245,20 @@ def staticmethods():
vereq(d.foo(1), (d, 1))
vereq(D.foo(d, 1), (d, 1))
def staticmethods_in_c():
if verbose: print "Testing C-based static methods..."
import xxsubtype as spam
a = (1, 2, 3)
d = {"abc": 123}
x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
veris(x, None)
vereq(a, a1)
vereq(d, d1)
x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
veris(x, None)
vereq(a, a1)
vereq(d, d1)
def classic():
if verbose: print "Testing classic classes..."
class C:
@ -2884,7 +2912,9 @@ def test_main():
dynamics()
errors()
classmethods()
classmethods_in_c()
staticmethods()
staticmethods_in_c()
classic()
compattr()
newslot()

View File

@ -43,11 +43,39 @@ spamlist_setstate(spamlistobject *self, PyObject *args)
return Py_None;
}
static PyObject *
spamlist_specialmeth(PyObject *self, PyObject *args, PyObject *kw)
{
PyObject *result = PyTuple_New(3);
if (result != NULL) {
if (self == NULL)
self = Py_None;
if (kw == NULL)
kw = Py_None;
Py_INCREF(self);
PyTuple_SET_ITEM(result, 0, self);
Py_INCREF(args);
PyTuple_SET_ITEM(result, 1, args);
Py_INCREF(kw);
PyTuple_SET_ITEM(result, 2, kw);
}
return result;
}
static PyMethodDef spamlist_methods[] = {
{"getstate", (PyCFunction)spamlist_getstate, METH_VARARGS,
"getstate() -> state"},
{"setstate", (PyCFunction)spamlist_setstate, METH_VARARGS,
"setstate(state)"},
/* These entries differ only in the flags; they are used by the tests
in test.test_descr. */
{"classmeth", (PyCFunction)spamlist_specialmeth,
METH_VARARGS | METH_KEYWORDS | METH_CLASS,
"classmeth(*args, **kw)"},
{"staticmeth", (PyCFunction)spamlist_specialmeth,
METH_VARARGS | METH_KEYWORDS | METH_STATIC,
"staticmeth(*args, **kw)"},
{NULL, NULL},
};