fuzzysearch/tests/test_memmem.py

83 lines
3.2 KiB
Python

from tests.compat import b, unittest
class TestMemmemBase(object):
def search(self, sequence, subsequence):
raise NotImplementedError
def test_empty_sequence(self):
self.assertEqual(self.search('PATTERN', ''), None)
def test_empty_subsequence(self):
self.assertEqual(self.search('', 'TEXT'), 0)
def test_match_identical_sequence(self):
self.assertEqual(self.search('PATTERN', 'PATTERN'), 0)
def test_shorter_sequence(self):
self.assertEqual(self.search('abcd', 'abc'), None)
def test_substring(self):
substring = 'PATTERN'
text = 'aaaaaaaaaaPATTERNaaaaaaaaa'
self.assertEqual(self.search(substring, text), 10)
def test_double_first_item(self):
self.assertEqual(self.search('def', 'abcddefg'), 4)
def test_missing_second_item(self):
self.assertEqual(self.search('bde', 'abcdefg'), None)
def test_completely_different(self):
self.assertEqual(self.search('abc', 'def'), None)
def test_startswith(self):
self.assertEqual(self.search('abc', 'abcd'), 0)
def test_endswith(self):
self.assertEqual(self.search('bcd', 'abcd'), 1)
def test_first_subseq_char_not_in_seq(self):
self.assertEqual(self.search('xa', 'abcd'), None)
def test_multiple_appearances(self):
self.assertEqual(self.search('abc', 'xxxabcxxxabcxxxabcxxx'), 3)
def test_single_letter_subseq(self):
self.assertEqual(self.search('a', 'abc'), 0)
self.assertEqual(self.search('b', 'abc'), 1)
self.assertEqual(self.search('c', 'abc'), 2)
self.assertEqual(self.search('a', 'xxx'), None)
self.assertEqual(self.search('a', 'x'*100 + 'a' + 'x'*100), 100)
self.assertEqual(self.search('a', ''), None)
def test_subseq_lengths(self):
import string
letters = string.ascii_lowercase + string.ascii_uppercase
for subseq_length in range(2, 100):
subseq = letters[:subseq_length]
self.assertEqual(self.search(subseq, letters), 0)
self.assertEqual(self.search(subseq, 'a!'*50 + letters), 100)
self.assertEqual(self.search(subseq, '!'*100), None)
self.assertEqual(self.search(subseq, '!'), None)
self.assertEqual(self.search(subseq, '!'*50 + 'a' + '!'*50), None)
self.assertEqual(self.search(subseq, '!'*50 + 'a'), None)
self.assertEqual(self.search(subseq, subseq[:-1]), None)
self.assertEqual(self.search(subseq, subseq[:-1] * 2), None)
self.assertEqual(self.search(subseq, subseq[:-1] + 'aa'), None)
self.assertEqual(self.search(subseq, 'aa' + subseq[:-1]), None)
self.assertEqual(self.search(subseq, 'aa' + subseq[:-1] + 'aa'), None)
try:
from fuzzysearch._pymemmem import simple_memmem, wordlen_memmem
except ImportError:
pass
else:
class TestSimpleMemmem(TestMemmemBase, unittest.TestCase):
def search(self, subsequence, sequence):
return simple_memmem(b(subsequence), b(sequence))
class TestWordlenMemmem(TestMemmemBase, unittest.TestCase):
def search(self, subsequence, sequence):
return wordlen_memmem(b(subsequence), b(sequence))