import unittest
from test.support import requires, import_module
+import inspect
requires('curses')
# If either of these don't exist, skip the tests.
else:
raise AssertionError("TypeError not raised")
+def test_issue21088(stdscr):
+ #
+ # http://bugs.python.org/issue21088
+ #
+ # the bug:
+ # when converting curses.window.addch to Argument Clinic
+ # the first two parameters were switched.
+
+ # if someday we can represent the signature of addch
+ # we will need to rewrite this test.
+ try:
+ signature = inspect.signature(stdscr.addch)
+ self.assertFalse(signature)
+ except ValueError:
+ # not generating a signature is fine.
+ pass
+
+ # So. No signature for addch.
+ # But Argument Clinic gave us a human-readable equivalent
+ # as the first line of the docstring. So we parse that,
+ # and ensure that the parameters appear in the correct order.
+ # Since this is parsing output from Argument Clinic, we can
+ # be reasonably certain the generated parsing code will be
+ # correct too.
+ human_readable_signature = stdscr.addch.__doc__.split("\n")[0]
+ offset = human_readable_signature.find("[y, x,]")
+ assert offset >= 0, ""
+
def main(stdscr):
curses.savetty()
try:
test_unget_wch(stdscr)
test_issue10570()
test_encoding(stdscr)
+ test_issue21088(stdscr)
finally:
curses.resetty()
curses.window.addch
[
- x: int
- X-coordinate.
y: int
Y-coordinate.
+ x: int
+ X-coordinate.
]
ch: object
[clinic start generated code]*/
PyDoc_STRVAR(curses_window_addch__doc__,
-"addch([x, y,] ch, [attr])\n"
+"addch([y, x,] ch, [attr])\n"
"Paint character ch at (y, x) with attributes attr.\n"
"\n"
-" x\n"
-" X-coordinate.\n"
" y\n"
" Y-coordinate.\n"
+" x\n"
+" X-coordinate.\n"
" ch\n"
" Character to add.\n"
" attr\n"
{"addch", (PyCFunction)curses_window_addch, METH_VARARGS, curses_window_addch__doc__},
static PyObject *
-curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr);
+curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y, int x, PyObject *ch, int group_right_1, long attr);
static PyObject *
curses_window_addch(PyCursesWindowObject *self, PyObject *args)
{
PyObject *return_value = NULL;
int group_left_1 = 0;
- int x = 0;
int y = 0;
+ int x = 0;
PyObject *ch;
int group_right_1 = 0;
long attr = 0;
group_right_1 = 1;
break;
case 3:
- if (!PyArg_ParseTuple(args, "iiO:addch", &x, &y, &ch))
+ if (!PyArg_ParseTuple(args, "iiO:addch", &y, &x, &ch))
goto exit;
group_left_1 = 1;
break;
case 4:
- if (!PyArg_ParseTuple(args, "iiOl:addch", &x, &y, &ch, &attr))
+ if (!PyArg_ParseTuple(args, "iiOl:addch", &y, &x, &ch, &attr))
goto exit;
group_right_1 = 1;
group_left_1 = 1;
PyErr_SetString(PyExc_TypeError, "curses.window.addch requires 1 to 4 arguments");
goto exit;
}
- return_value = curses_window_addch_impl(self, group_left_1, x, y, ch, group_right_1, attr);
+ return_value = curses_window_addch_impl(self, group_left_1, y, x, ch, group_right_1, attr);
exit:
return return_value;
}
static PyObject *
-curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr)
-/*[clinic end generated code: output=43acb91a5c98f615 input=fe7e3711d5bbf1f6]*/
+curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y, int x, PyObject *ch, int group_right_1, long attr)
+/*[clinic end generated code: output=d4b97cc287010c54 input=5a41efb34a2de338]*/
{
PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
int coordinates_group = group_left_1;