1babddfca758abe34ff12023f63b18d745fae7ca9Thomas Hellerimport unittest 2babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller 3babddfca758abe34ff12023f63b18d745fae7ca9Thomas Hellerfrom ctypes import * 4babddfca758abe34ff12023f63b18d745fae7ca9Thomas Hellerimport _ctypes_test 5babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller 6477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouterslib = CDLL(_ctypes_test.__file__) 7babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller 8a56c467ac39ab1a6a2e9dc2fa41a9f573f989839Mark Dickinsondef three_way_cmp(x, y): 9a56c467ac39ab1a6a2e9dc2fa41a9f573f989839Mark Dickinson """Return -1 if x < y, 0 if x == y and 1 if x > y""" 10a56c467ac39ab1a6a2e9dc2fa41a9f573f989839Mark Dickinson return (x > y) - (x < y) 11a56c467ac39ab1a6a2e9dc2fa41a9f573f989839Mark Dickinson 12babddfca758abe34ff12023f63b18d745fae7ca9Thomas Hellerclass LibTest(unittest.TestCase): 13babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller def test_sqrt(self): 14babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller lib.my_sqrt.argtypes = c_double, 15babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller lib.my_sqrt.restype = c_double 16c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson self.assertEqual(lib.my_sqrt(4.0), 2.0) 17babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller import math 18c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson self.assertEqual(lib.my_sqrt(2.0), math.sqrt(2.0)) 19babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller 20babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller def test_qsort(self): 21babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller comparefunc = CFUNCTYPE(c_int, POINTER(c_char), POINTER(c_char)) 22babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller lib.my_qsort.argtypes = c_void_p, c_size_t, c_size_t, comparefunc 23babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller lib.my_qsort.restype = None 24babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller 25babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller def sort(a, b): 26a56c467ac39ab1a6a2e9dc2fa41a9f573f989839Mark Dickinson return three_way_cmp(a[0], b[0]) 27babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller 2842746df17bd1f147f1bea90216ed9848efc730c8Victor Stinner chars = create_string_buffer(b"spam, spam, and spam") 29babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller lib.my_qsort(chars, len(chars)-1, sizeof(c_char), comparefunc(sort)) 30c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson self.assertEqual(chars.raw, b" ,,aaaadmmmnpppsss\x00") 31babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller 32babddfca758abe34ff12023f63b18d745fae7ca9Thomas Hellerif __name__ == "__main__": 33babddfca758abe34ff12023f63b18d745fae7ca9Thomas Heller unittest.main() 34