#include "parts.h"


PyDoc_STRVAR(docstring_empty,
""
);

PyDoc_STRVAR(docstring_no_signature,
"This docstring has no signature."
);

PyDoc_STRVAR(docstring_with_invalid_signature,
"docstring_with_invalid_signature($module, /, boo)\n"
"\n"
"This docstring has an invalid signature."
);

PyDoc_STRVAR(docstring_with_invalid_signature2,
"docstring_with_invalid_signature2($module, /, boo)\n"
"\n"
"--\n"
"\n"
"This docstring also has an invalid signature."
);

PyDoc_STRVAR(docstring_with_signature,
"docstring_with_signature($module, /, sig)\n"
"--\n"
"\n"
"This docstring has a valid signature."
);

PyDoc_STRVAR(docstring_with_signature_but_no_doc,
"docstring_with_signature_but_no_doc($module, /, sig)\n"
"--\n"
"\n"
);

PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
"--\n"
"\n"
"\n"
"This docstring has a valid signature and some extra newlines."
);

PyDoc_STRVAR(docstring_with_signature_with_defaults,
"docstring_with_signature_with_defaults(module, s='avocado',\n"
"        b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
"        local=the_number_three, sys=sys.maxsize,\n"
"        exp=sys.maxsize - 1)\n"
"--\n"
"\n"
"\n"
"\n"
"This docstring has a valid signature with parameters,\n"
"and the parameters take defaults of varying types."
);

/* This is here to provide a docstring for test_descr. */
static PyObject *
test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
{
    Py_RETURN_NONE;
}

static PyMethodDef test_methods[] = {
    {"docstring_empty",
        test_with_docstring, METH_VARARGS,
        docstring_empty},
    {"docstring_no_signature",
        test_with_docstring, METH_VARARGS,
        docstring_no_signature},
    {"docstring_no_signature_noargs",
        test_with_docstring, METH_NOARGS,
        docstring_no_signature},
    {"docstring_no_signature_o",
        test_with_docstring, METH_O,
        docstring_no_signature},
    {"docstring_with_invalid_signature",
        test_with_docstring, METH_VARARGS,
        docstring_with_invalid_signature},
    {"docstring_with_invalid_signature2",
        test_with_docstring, METH_VARARGS,
        docstring_with_invalid_signature2},
    {"docstring_with_signature",
        test_with_docstring, METH_VARARGS,
        docstring_with_signature},
    {"docstring_with_signature_and_extra_newlines",
        test_with_docstring, METH_VARARGS,
        docstring_with_signature_and_extra_newlines},
    {"docstring_with_signature_but_no_doc",
        test_with_docstring, METH_VARARGS,
        docstring_with_signature_but_no_doc},
    {"docstring_with_signature_with_defaults",
        test_with_docstring, METH_VARARGS,
        docstring_with_signature_with_defaults},
    {"no_docstring",
        test_with_docstring, METH_VARARGS},
    {"test_with_docstring",
        test_with_docstring,              METH_VARARGS,
        PyDoc_STR("This is a pretty normal docstring.")},
    {"func_with_unrepresentable_signature",
        test_with_docstring, METH_VARARGS,
        PyDoc_STR(
            "func_with_unrepresentable_signature($module, /, a, b=<x>)\n"
            "--\n\n"
            "This docstring has a signature with unrepresentable default."
        )},
    {NULL},
};

static PyMethodDef DocStringNoSignatureTest_methods[] = {
    {"meth_noargs",
        test_with_docstring, METH_NOARGS,
        docstring_no_signature},
    {"meth_o",
        test_with_docstring, METH_O,
        docstring_no_signature},
    {"meth_noargs_class",
        test_with_docstring, METH_NOARGS|METH_CLASS,
        docstring_no_signature},
    {"meth_o_class",
        test_with_docstring, METH_O|METH_CLASS,
        docstring_no_signature},
    {"meth_noargs_static",
        test_with_docstring, METH_NOARGS|METH_STATIC,
        docstring_no_signature},
    {"meth_o_static",
        test_with_docstring, METH_O|METH_STATIC,
        docstring_no_signature},
    {"meth_noargs_coexist",
        test_with_docstring, METH_NOARGS|METH_COEXIST,
        docstring_no_signature},
    {"meth_o_coexist",
        test_with_docstring, METH_O|METH_COEXIST,
        docstring_no_signature},
    {NULL},
};

static PyTypeObject DocStringNoSignatureTest = {
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "_testcapi.DocStringNoSignatureTest",
    .tp_basicsize = sizeof(PyObject),
    .tp_flags = Py_TPFLAGS_DEFAULT,
    .tp_methods = DocStringNoSignatureTest_methods,
    .tp_new = PyType_GenericNew,
};

static PyMethodDef DocStringUnrepresentableSignatureTest_methods[] = {
    {"meth",
        test_with_docstring, METH_VARARGS,
        PyDoc_STR(
            "meth($self, /, a, b=<x>)\n"
            "--\n\n"
            "This docstring has a signature with unrepresentable default."
        )},
    {"classmeth",
        test_with_docstring, METH_VARARGS|METH_CLASS,
        PyDoc_STR(
            "classmeth($type, /, a, b=<x>)\n"
            "--\n\n"
            "This docstring has a signature with unrepresentable default."
        )},
    {"staticmeth",
        test_with_docstring, METH_VARARGS|METH_STATIC,
        PyDoc_STR(
            "staticmeth(a, b=<x>)\n"
            "--\n\n"
            "This docstring has a signature with unrepresentable default."
        )},
    {"with_default",
        test_with_docstring, METH_VARARGS,
        PyDoc_STR(
            "with_default($self, /, x=ONE)\n"
            "--\n\n"
            "This instance method has a default parameter value from the module scope."
        )},
    {NULL},
};

static PyTypeObject DocStringUnrepresentableSignatureTest = {
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "_testcapi.DocStringUnrepresentableSignatureTest",
    .tp_basicsize = sizeof(PyObject),
    .tp_flags = Py_TPFLAGS_DEFAULT,
    .tp_methods = DocStringUnrepresentableSignatureTest_methods,
    .tp_new = PyType_GenericNew,
};

int
_PyTestCapi_Init_Docstring(PyObject *mod)
{
    if (PyModule_AddFunctions(mod, test_methods) < 0) {
        return -1;
    }
    if (PyModule_AddType(mod, &DocStringNoSignatureTest) < 0) {
        return -1;
    }
    if (PyModule_AddType(mod, &DocStringUnrepresentableSignatureTest) < 0) {
        return -1;
    }
    if (PyModule_AddObject(mod, "ONE", PyLong_FromLong(1)) < 0) {
        return -1;
    }
    return 0;
}
