1# To fully test this module, we would need a copy of the stringprep tables.
2# Since we don't have them, this test checks only a few code points.
3
4import unittest
5
6from stringprep import *
7
8class StringprepTests(unittest.TestCase):
9    def test(self):
10        self.assertTrue(in_table_a1("\u0221"))
11        self.assertFalse(in_table_a1("\u0222"))
12
13        self.assertTrue(in_table_b1("\u00ad"))
14        self.assertFalse(in_table_b1("\u00ae"))
15
16        self.assertTrue(map_table_b2("\u0041"), "\u0061")
17        self.assertTrue(map_table_b2("\u0061"), "\u0061")
18
19        self.assertTrue(map_table_b3("\u0041"), "\u0061")
20        self.assertTrue(map_table_b3("\u0061"), "\u0061")
21
22        self.assertTrue(in_table_c11("\u0020"))
23        self.assertFalse(in_table_c11("\u0021"))
24
25        self.assertTrue(in_table_c12("\u00a0"))
26        self.assertFalse(in_table_c12("\u00a1"))
27
28        self.assertTrue(in_table_c12("\u00a0"))
29        self.assertFalse(in_table_c12("\u00a1"))
30
31        self.assertTrue(in_table_c11_c12("\u00a0"))
32        self.assertFalse(in_table_c11_c12("\u00a1"))
33
34        self.assertTrue(in_table_c21("\u001f"))
35        self.assertFalse(in_table_c21("\u0020"))
36
37        self.assertTrue(in_table_c22("\u009f"))
38        self.assertFalse(in_table_c22("\u00a0"))
39
40        self.assertTrue(in_table_c21_c22("\u009f"))
41        self.assertFalse(in_table_c21_c22("\u00a0"))
42
43        self.assertTrue(in_table_c3("\ue000"))
44        self.assertFalse(in_table_c3("\uf900"))
45
46        self.assertTrue(in_table_c4("\uffff"))
47        self.assertFalse(in_table_c4("\u0000"))
48
49        self.assertTrue(in_table_c5("\ud800"))
50        self.assertFalse(in_table_c5("\ud7ff"))
51
52        self.assertTrue(in_table_c6("\ufff9"))
53        self.assertFalse(in_table_c6("\ufffe"))
54
55        self.assertTrue(in_table_c7("\u2ff0"))
56        self.assertFalse(in_table_c7("\u2ffc"))
57
58        self.assertTrue(in_table_c8("\u0340"))
59        self.assertFalse(in_table_c8("\u0342"))
60
61        # C.9 is not in the bmp
62        # self.assertTrue(in_table_c9(u"\U000E0001"))
63        # self.assertFalse(in_table_c8(u"\U000E0002"))
64
65        self.assertTrue(in_table_d1("\u05be"))
66        self.assertFalse(in_table_d1("\u05bf"))
67
68        self.assertTrue(in_table_d2("\u0041"))
69        self.assertFalse(in_table_d2("\u0040"))
70
71        # This would generate a hash of all predicates. However, running
72        # it is quite expensive, and only serves to detect changes in the
73        # unicode database. Instead, stringprep.py asserts the version of
74        # the database.
75
76        # import hashlib
77        # predicates = [k for k in dir(stringprep) if k.startswith("in_table")]
78        # predicates.sort()
79        # for p in predicates:
80        #     f = getattr(stringprep, p)
81        #     # Collect all BMP code points
82        #     data = ["0"] * 0x10000
83        #     for i in range(0x10000):
84        #         if f(unichr(i)):
85        #             data[i] = "1"
86        #     data = "".join(data)
87        #     h = hashlib.sha1()
88        #     h.update(data)
89        #     print p, h.hexdigest()
90
91if __name__ == '__main__':
92    unittest.main()
93