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