import random
import unittest
import unicodedata
from example import find_all, prefix_table


class StringTests(unittest.TestCase):
    def test_overlap_unicode_empty(self):
        self.assertEqual(find_all('ababa', 'aba'), [0, 2])
        self.assertEqual(find_all('中文中文', '中文'), [0, 2])
        self.assertEqual(find_all('', ''), [0])
        self.assertEqual(find_all('abc', ''), [0, 1, 2, 3])
        self.assertEqual(find_all('e\u0301', 'é'), [])
        self.assertEqual(find_all(unicodedata.normalize('NFC', 'e\u0301'), 'é'), [0])

    def test_against_naive(self):
        rng = random.Random(16)
        for _ in range(300):
            text = ''.join(rng.choice('ab中') for _ in range(rng.randrange(30)))
            pattern = ''.join(rng.choice('ab中') for _ in range(rng.randrange(10)))
            expected = [i for i in range(len(text) - len(pattern) + 1)
                        if text[i:i + len(pattern)] == pattern]
            self.assertEqual(find_all(text, pattern), expected)


if __name__ == '__main__':
    unittest.main()
