# To fully test this module, we would need a copy of the stringprep tables.
# Since we don't have them, this test checks only a few codepoints.

import unittest
from test import test_support

from stringprep import *

class StringprepTests(unittest.TestCase):
    def test(self):
        self.assertTrue(in_table_a1(u"\u0221"))
        self.assertFalse(in_table_a1(u"\u0222"))

        self.assertTrue(in_table_b1(u"\u00ad"))
        self.assertFalse(in_table_b1(u"\u00ae"))

        self.assertTrue(map_table_b2(u"\u0041"), u"\u0061")
        self.assertTrue(map_table_b2(u"\u0061"), u"\u0061")

        self.assertTrue(map_table_b3(u"\u0041"), u"\u0061")
        self.assertTrue(map_table_b3(u"\u0061"), u"\u0061")

        self.assertTrue(in_table_c11(u"\u0020"))
        self.assertFalse(in_table_c11(u"\u0021"))

        self.assertTrue(in_table_c12(u"\u00a0"))
        self.assertFalse(in_table_c12(u"\u00a1"))

        self.assertTrue(in_table_c12(u"\u00a0"))
        self.assertFalse(in_table_c12(u"\u00a1"))

        self.assertTrue(in_table_c11_c12(u"\u00a0"))
        self.assertFalse(in_table_c11_c12(u"\u00a1"))

        self.assertTrue(in_table_c21(u"\u001f"))
        self.assertFalse(in_table_c21(u"\u0020"))

        self.assertTrue(in_table_c22(u"\u009f"))
        self.assertFalse(in_table_c22(u"\u00a0"))

        self.assertTrue(in_table_c21_c22(u"\u009f"))
        self.assertFalse(in_table_c21_c22(u"\u00a0"))

        self.assertTrue(in_table_c3(u"\ue000"))
        self.assertFalse(in_table_c3(u"\uf900"))

        self.assertTrue(in_table_c4(u"\uffff"))
        self.assertFalse(in_table_c4(u"\u0000"))

        self.assertTrue(in_table_c5(u"\ud800"))
        self.assertFalse(in_table_c5(u"\ud7ff"))

        self.assertTrue(in_table_c6(u"\ufff9"))
        self.assertFalse(in_table_c6(u"\ufffe"))

        self.assertTrue(in_table_c7(u"\u2ff0"))
        self.assertFalse(in_table_c7(u"\u2ffc"))

        self.assertTrue(in_table_c8(u"\u0340"))
        self.assertFalse(in_table_c8(u"\u0342"))

        # C.9 is not in the bmp
        # self.assertTrue(in_table_c9(u"\U000E0001"))
        # self.assertFalse(in_table_c8(u"\U000E0002"))

        self.assertTrue(in_table_d1(u"\u05be"))
        self.assertFalse(in_table_d1(u"\u05bf"))

        self.assertTrue(in_table_d2(u"\u0041"))
        self.assertFalse(in_table_d2(u"\u0040"))

        # This would generate a hash of all predicates. However, running
        # it is quite expensive, and only serves to detect changes in the
        # unicode database. Instead, stringprep.py asserts the version of
        # the database.

        # import hashlib
        # predicates = [k for k in dir(stringprep) if k.startswith("in_table")]
        # predicates.sort()
        # for p in predicates:
        #     f = getattr(stringprep, p)
        #     # Collect all BMP code points
        #     data = ["0"] * 0x10000
        #     for i in range(0x10000):
        #         if f(unichr(i)):
        #             data[i] = "1"
        #     data = "".join(data)
        #     h = hashlib.sha1()
        #     h.update(data)
        #     print p, h.hexdigest()

def test_main():
    test_support.run_unittest(StringprepTests)

if __name__ == '__main__':
    test_main()
