def tests(): assert subparts('^it$') == {'^', 'i', 't', '$', '^i', 'it', 't$', '^it', 'it$', '^it$'} assert subparts('this') == {'t', 'h', 'i', 's', 'th', 'hi', 'is', 'thi', 'his', 'this'} subparts('banana') == {'a', 'an', 'ana', 'anan', 'b', 'ba', 'ban', 'bana', 'n', 'na', 'nan', 'nana'} assert dotify('it') == {'it', 'i.', '.t', '..'} assert dotify('^it$') == {'^it$', '^i.$', '^.t$', '^..$'} assert dotify('this') == {'this', 'thi.', 'th.s', 'th..', 't.is', 't.i.', 't..s', 't...', '.his', '.hi.', '.h.s', '.h..', '..is', '..i.', '...s', '....'} assert regex_parts({'win'}, {'losers', 'bin', 'won'}) == { '^win$', '^win', '^wi.', 'wi.', 'wi', '^wi', 'win$', 'win', 'wi.$'} assert regex_parts({'win'}, {'bin', 'won', 'wine', 'wit'}) == {'^win$', 'win$'} regex_parts({'boy', 'coy'}, {'ahoy', 'toy', 'book', 'cook', 'boycott', 'cowboy', 'cod', 'buy', 'oy', 'foil', 'coyote'}) == {'^boy$', '^coy$', 'c.y$', 'coy$'} assert matches('a|b|c', {'a', 'b', 'c', 'd', 'e'}) == {'a', 'b', 'c'} assert matches('a|b|c', {'any', 'bee', 'succeed', 'dee', 'eee!'}) == { 'any', 'bee', 'succeed'} assert OR(['a', 'b', 'c']) == 'a|b|c' assert OR(['a']) == 'a' assert words('this is a test this is') == {'this', 'is', 'a', 'test'} assert findregex({"ahahah", "ciao"}, {"ahaha", "bye"}) == 'a.$' assert findregex({"this", "that", "the other"}, {"one", "two", "here", "there"}) == 'h..$' assert findregex({'boy', 'coy', 'toy', 'joy'}, {'ahoy', 'buy', 'oy', 'foil'}) == '^.oy' assert not mistakes('a|b|c', {'ahoy', 'boy', 'coy'}, {'joy', 'toy'}) assert not mistakes('^a|^b|^c', {'ahoy', 'boy', 'coy'}, {'joy', 'toy', 'kickback'}) assert mistakes('^.oy', {'ahoy', 'boy', 'coy'}, {'joy', 'ploy'}) == { "Should have matched: ahoy", "Should not have matched: joy"} return 'tests pass' tests()