"""
Tests for using special type codes in struct definitions
TODO:
* _C_UNICHAR, _C_CHAR_AS_INT, _C_CHAR_AS_TEXT
"""
import weakref
from PyObjCTools.TestSupport import *
from PyObjCTest.fnd import NSObject
from PyObjCTest.specialtypecodes import *
EmbeddedBoolStruct = objc.createStructType(
"EmbeddedBoolStruct",
b"{_EmbeddedBool=" + objc._C_INT + objc._C_NSBOOL + b"}",
[
"count",
"isValid"
])
EmbeddedBoolArrayStruct = objc.createStructType(
"EmbeddedBoolArrayStruct",
b"{_EmbeddedBoolArray=" + objc._C_INT + b"[4" + objc._C_NSBOOL + b"]}",
[
"count",
"valid"
])
class TestRecode (TestCase):
# Use recode to test to/from Objective-C.
#
# This has limited because in 'real life' we'd encode/decode based on a
# typestring from the Objective-C runtime and those don't include our
# special type codes.
#
# This does make sure that the basic encoding machinery works.
def testBoolStruct(self):
v = (55, True)
w = objc.repythonify(v, EmbeddedBoolStruct.__typestr__)
self.assertIsInstance(w, EmbeddedBoolStruct)
self.assertEquals(w.count, 55)
self.assertIs(w.isValid, True)
def testBoolArrayStruct(self):
v = (42, [0, 1, 1, 0])
w = objc.repythonify(v, EmbeddedBoolArrayStruct.__typestr__)
self.assertIsInstance(w, EmbeddedBoolArrayStruct)
self.assertEquals(w.count, 42)
self.assertIs(w.valid[0], False)
self.assertIs(w.valid[1], True)
self.assertIs(w.valid[2], True)
self.assertIs(w.valid[3], False)
class TestObjectiveC (TestCase):
# Use an Objective-C class to test to/from Objective-C.
#
def testBoolStruct(self):
o = OC_TestSpecialTypeCode.alloc().init()
v = (55, True)
w = o.identicalEmbeddedBoolStruct_(v)
self.assertIsInstance(w, EmbeddedBoolStruct)
self.assertEquals(w.count, 55)
self.assertIs(w.isValid, True)
def testBoolArrayStruct(self):
o = OC_TestSpecialTypeCode.alloc().init()
v = (42, [0, 1, 1, 0])
w = o.identicalEmbeddedBoolArrayStruct_(v)
self.assertIsInstance(w, EmbeddedBoolArrayStruct)
self.assertEquals(w.count, 42)
self.assertIs(w.valid[0], False)
self.assertIs(w.valid[1], True)
self.assertIs(w.valid[2], True)
self.assertIs(w.valid[3], False)
if __name__ == "__main__":
main()
|