@@ -757,6 +757,28 @@ test_import(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
757757 Py_DECREF (mod2 );
758758 Py_DECREF (mod );
759759
760+ // Test PyImport_ImportModuleAttr()
761+ PyObject * mod_name = PyUnicode_FromString ("sys" );
762+ assert (mod_name != NULL );
763+ PyObject * attr_name = PyUnicode_FromString ("platform" );
764+ assert (attr_name != NULL );
765+ PyObject * attr = PyImport_ImportModuleAttr (mod_name , attr_name );
766+ Py_DECREF (mod_name );
767+ Py_DECREF (attr_name );
768+ if (attr == NULL ) {
769+ return NULL ;
770+ }
771+ assert (PyUnicode_Check (attr ));
772+ Py_DECREF (attr );
773+
774+ // Test PyImport_ImportModuleAttrString()
775+ attr = PyImport_ImportModuleAttrString ("sys" , "platform" );
776+ if (attr == NULL ) {
777+ return NULL ;
778+ }
779+ assert (PyUnicode_Check (attr ));
780+ Py_DECREF (attr );
781+
760782 Py_RETURN_NONE ;
761783}
762784
@@ -2540,6 +2562,53 @@ test_set_immortal(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
25402562#endif
25412563
25422564
2565+ static PyObject *
2566+ test_type (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
2567+ {
2568+ PyObject * attr = PyImport_ImportModuleAttrString ("datetime" , "time" );
2569+ if (attr == NULL ) {
2570+ return NULL ;
2571+ }
2572+ assert (PyType_Check (attr ));
2573+ PyTypeObject * type = (PyTypeObject * )attr ;
2574+
2575+ // Test PyType_GetModuleName()
2576+ PyObject * modname = PyType_GetModuleName (type );
2577+ assert (modname != NULL );
2578+ #if !defined(PYPY_VERSION ) || PY_VERSION_HEX < 0x030C0000
2579+ assert (PyUnicode_EqualToUTF8 (modname , "datetime" ) == 1 );
2580+ #else
2581+ assert (PyUnicode_EqualToUTF8 (modname , "_pydatetime" ) == 1 );
2582+ #endif
2583+ Py_DECREF (modname );
2584+
2585+ // Test PyType_GetName()
2586+ PyObject * name = PyType_GetName (type );
2587+ assert (name != NULL );
2588+ assert (PyUnicode_EqualToUTF8 (name , "time" ) == 1 );
2589+ Py_DECREF (name );
2590+
2591+ // Test PyType_GetQualName()
2592+ PyObject * qualname = PyType_GetQualName (type );
2593+ assert (qualname != NULL );
2594+ assert (PyUnicode_EqualToUTF8 (qualname , "time" ) == 1 );
2595+ Py_DECREF (qualname );
2596+
2597+ // Test PyType_GetFullyQualifiedName()
2598+ PyObject * fqn = PyType_GetFullyQualifiedName (type );
2599+ assert (fqn != NULL );
2600+ #if !defined(PYPY_VERSION ) || PY_VERSION_HEX < 0x030C0000
2601+ assert (PyUnicode_EqualToUTF8 (fqn , "datetime.time" ) == 1 );
2602+ #else
2603+ assert (PyUnicode_EqualToUTF8 (fqn , "_pydatetime.time" ) == 1 );
2604+ #endif
2605+ Py_DECREF (fqn );
2606+
2607+ Py_DECREF (type );
2608+ Py_RETURN_NONE ;
2609+ }
2610+
2611+
25432612static struct PyMethodDef methods [] = {
25442613 {"test_object" , test_object , METH_NOARGS , _Py_NULL },
25452614 {"test_py_is" , test_py_is , METH_NOARGS , _Py_NULL },
@@ -2614,6 +2683,7 @@ static struct PyMethodDef methods[] = {
26142683#if 0x030D0000 <= PY_VERSION_HEX && !defined (PYPY_VERSION ) && !defined (Py_LIMITED_API )
26152684 {"test_set_immortal" , test_set_immortal , METH_NOARGS , _Py_NULL },
26162685#endif
2686+ {"test_type" , test_type , METH_NOARGS , _Py_NULL },
26172687 {_Py_NULL , _Py_NULL , 0 , _Py_NULL }
26182688};
26192689
0 commit comments