#![feature(proc_macro, specialization)] extern crate pyo3; use pyo3::prelude::*; use pyo3::py::class as pyclass; #[macro_use] mod common; #[pyclass] struct EmptyClass { } #[test] fn empty_class() { let gil = Python::acquire_gil(); let py = gil.python(); let typeobj = py.get_type::(); // By default, don't allow creating instances from python. assert!(typeobj.call(NoArgs, NoArgs).is_err()); py_assert!(py, typeobj, "typeobj.__name__ == 'EmptyClass'"); } /// Line1 ///Line2 /// Line3 // this is not doc string #[pyclass] struct ClassWithDocs { } #[test] fn class_with_docstr() { { let gil = Python::acquire_gil(); let py = gil.python(); let typeobj = py.get_type::(); py_run!(py, typeobj, "assert typeobj.__doc__ == 'Line1\\nLine2\\n Line3'"); } } #[pyclass(name=CustomName)] struct EmptyClass2 { } #[test] fn custom_class_name() { let gil = Python::acquire_gil(); let py = gil.python(); let typeobj = py.get_type::(); py_assert!(py, typeobj, "typeobj.__name__ == 'CustomName'"); } #[pyclass] struct EmptyClassInModule { } #[test] fn empty_class_in_module() { let gil = Python::acquire_gil(); let py = gil.python(); let module = PyModule::new(py, "test_module.nested").unwrap(); module.add_class::().unwrap(); let ty = module.getattr("EmptyClassInModule").unwrap(); assert_eq!(ty.getattr("__name__").unwrap().extract::().unwrap(), "EmptyClassInModule"); assert_eq!(ty.getattr("__module__").unwrap().extract::().unwrap(), "test_module.nested"); }