1# -*- coding: utf-8 -*-
2"""
3Automatic tests for module ldap0.schema.parse
4"""
5
6import unittest
7
8from ldap0.schema.parse import split_tokens
9
10# basic test cases
11TESTCASES_BASIC = (
12    (" BLUBBER DI BLUBB ", ["BLUBBER", "DI", "BLUBB"]),
13    ("BLUBBER DI BLUBB", ["BLUBBER", "DI", "BLUBB"]),
14    ("BL-UB-BER DI BL-UBB", ["BL-UB-BER", "DI", "BL-UBB"]),
15    ("BLUBBER  DI   BLUBB  ", ["BLUBBER", "DI", "BLUBB"]),
16    ("BLUBBER  DI  'BLUBB'   ", ["BLUBBER", "DI", "BLUBB"]),
17    ("BLUBBER ( DI ) 'BLUBB'   ", ["BLUBBER", "(", "DI", ")", "BLUBB"]),
18    ("BLUBBER(DI)", ["BLUBBER", "(", "DI", ")"]),
19    ("BLUBBER ( DI)", ["BLUBBER", "(", "DI", ")"]),
20    ("BLUBBER ''", ["BLUBBER", ""]),
21    ("( BLUBBER (DI 'BLUBB'))", ["(", "BLUBBER", "(", "DI", "BLUBB", ")", ")"]),
22    ("BLUBB (DA$BLAH)", ['BLUBB', "(", "DA", "BLAH", ")"]),
23    ("BLUBB ( DA $  BLAH )", ['BLUBB', "(", "DA", "BLAH", ")"]),
24    ("BLUBB (DA$ BLAH)", ['BLUBB', "(", "DA", "BLAH", ")"]),
25    ("BLUBB (DA $BLAH)", ['BLUBB', "(", "DA", "BLAH", ")"]),
26    ("BLUBB 'DA$BLAH'", ['BLUBB', "DA$BLAH"]),
27    ("BLUBB DI 'BLU B B ER' DA 'BLAH' ", ['BLUBB', 'DI', 'BLU B B ER', 'DA', 'BLAH']),
28    ("BLUBB DI 'BLU B B ER' DA 'BLAH' LABER", ['BLUBB', 'DI', 'BLU B B ER', 'DA', 'BLAH', 'LABER']),
29    ("BLUBB\t'DA\tBLUB'", ['BLUBB', "DA\tBLUB"]),
30)
31
32# UTF-8 raw strings
33TESTCASES_UTF8 = (
34    (" BL\xc3\x9cBBER D\xc3\x84 BL\xc3\x9cBB ", ["BL\xc3\x9cBBER", "D\xc3\x84", "BL\xc3\x9cBB"]),
35    ("BL\xc3\x9cBBER D\xc3\x84 BL\xc3\x9cBB", ["BL\xc3\x9cBBER", "D\xc3\x84", "BL\xc3\x9cBB"]),
36    ("BL\xc3\x9cBBER  D\xc3\x84   BL\xc3\x9cBB  ", ["BL\xc3\x9cBBER", "D\xc3\x84", "BL\xc3\x9cBB"]),
37)
38
39# broken schema of Oracle Internet Directory
40TESTCASES_BROKEN_OID = (
41    ("BLUBB DI 'BLU B B ER'MUST 'BLAH' ", ['BLUBB', 'DI', 'BLU B B ER', 'MUST', 'BLAH']),
42    ("BLUBBER DI 'BLU'BB ER' DA 'BLAH' ", ["BLUBBER", "DI", "BLU'BB ER", "DA", "BLAH"]),
43)
44
45# for quoted single quotes inside string values
46TESTCASES_ESCAPED_QUOTES = (
47    ("BLUBBER '\\''", ["BLUBBER", "'"]),
48    ("BLUBBER DI 'BLU\\'BB ER' DA 'BLAH' ", ["BLUBBER", "DI", "BLU'BB ER", "DA", "BLAH"]),
49    ("BLUBBER DI 'BLU\\' BB ER' DA 'BLAH' ", ["BLUBBER", "DI", "BLU' BB ER", "DA", "BLAH"]),
50)
51
52# test cases which should result in ValueError raised
53TESTCASES_BROKEN = (
54    "( BLUB",
55    "BLUB )",
56    "BLUB 'DA",
57    "BLUB $ DA",
58#    "BLUB 'DA\\'",
59#    "( BLUB )) DA (",
60)
61
62class TestSplitTokens(unittest.TestCase):
63    """
64    test function ldap0.schema.parse.split_tokens()
65    """
66
67    def _run_split_tokens_tests(self, test_cases):
68        for test_value, test_result in test_cases:
69            token_list = split_tokens(test_value)
70            self.assertEqual(token_list, test_result)
71
72    def _run_failure_tests(self, test_cases):
73        should_have_failed = []
74        for test_value in test_cases:
75            try:
76                _ = split_tokens(test_value)
77            except ValueError:
78                pass
79            else:
80                should_have_failed.append(test_value)
81        if should_have_failed:
82            self.fail(
83                '%d value(s) should have raised ValueError: %r' % (
84                    len(should_have_failed),
85                    should_have_failed,
86                )
87            )
88
89    def test_basic(self):
90        """
91        run test cases specified in constant TESTCASES_BASIC
92        """
93        self._run_split_tokens_tests(TESTCASES_BASIC)
94
95    def test_utf8(self):
96        """
97        run test cases specified in constant TESTCASES_BASIC
98        """
99        self._run_split_tokens_tests(TESTCASES_UTF8)
100
101    @unittest.expectedFailure
102    def test_let_broken_oid_pass(self):
103        """
104        run test cases specified in constant TESTCASES_BROKEN_OID
105        """
106        self._run_split_tokens_tests(TESTCASES_BROKEN_OID)
107
108    @unittest.expectedFailure
109    def test_escaped_quotes(self):
110        """
111        run test cases specified in constant TESTCASES_ESCAPED_QUOTES
112        """
113        self._run_split_tokens_tests(TESTCASES_ESCAPED_QUOTES)
114
115    def test_broken(self):
116        self._run_failure_tests(TESTCASES_BROKEN)
117
118
119if __name__ == '__main__':
120    unittest.main()
121