def testTypeMappings(self, mapper, _): for (k, v) in BUILTIN_TYPES.items(): typePtr = getattr(mapper, k) self.assertEquals(CPyMarshal.ReadCStringField(typePtr, PyTypeObject, 'tp_name'), v.__name__) if typePtr == mapper.PyFile_Type: self.assertNotEquals(mapper.Retrieve(typePtr), v, "failed to map PyFile_Type to something-that-isn't file") else: self.assertEquals(mapper.Retrieve(typePtr), v, "failed to map " + k) if typePtr in (mapper.PyType_Type, mapper.PyBaseObject_Type): # surprising refcount because of the unmanaged PyFile malarkey self.assertEquals(mapper.RefCount(typePtr), 2, "failed to add reference to " + k) else: self.assertEquals(mapper.RefCount(typePtr), 1, "failed to add reference to " + k) mapper.PyType_Ready(typePtr) self.assertNotEquals(CPyMarshal.ReadIntField(typePtr, PyTypeObject, "tp_basicsize"), 0) basePtr = CPyMarshal.ReadPtrField(typePtr, PyTypeObject, "tp_base") if k == "PyBaseObject_Type": self.assertEquals(basePtr, IntPtr.Zero) elif k == "PyBool_Type": self.assertEquals(basePtr, mapper.PyInt_Type) else: self.assertEquals(basePtr, mapper.PyBaseObject_Type)
def testReadCStringFieldEmpty(self): data = Marshal.AllocHGlobal(Marshal.SizeOf(PyTypeObject())) CPyMarshal.Zero(data, Marshal.SizeOf(PyTypeObject())) CPyMarshal.WritePtrField(data, PyTypeObject, "tp_doc", IntPtr.Zero) self.assertEquals( CPyMarshal.ReadCStringField(data, PyTypeObject, "tp_doc"), "", "failed to read correctly") Marshal.FreeHGlobal(data)
def testWriteCStringField(self): data = Marshal.AllocHGlobal(Marshal.SizeOf(PyTypeObject())) CPyMarshal.Zero(data, Marshal.SizeOf(PyTypeObject())) string = "Hey, I am a string. I have tricksy \\escapes\\." CPyMarshal.WriteCStringField(data, PyTypeObject, "tp_doc", string) self.assertEquals( CPyMarshal.ReadCStringField(data, PyTypeObject, "tp_doc"), string, "failed to read correctly") Marshal.FreeHGlobal( CPyMarshal.ReadPtrField(data, PyTypeObject, "tp_doc")) Marshal.FreeHGlobal(data)