| 1 | #!/usr/bin/env python2
 | 
| 2 | # Copyright 2016 Andy Chu. All rights reserved.
 | 
| 3 | # Licensed under the Apache License, Version 2.0 (the "License");
 | 
| 4 | # you may not use this file except in compliance with the License.
 | 
| 5 | # You may obtain a copy of the License at
 | 
| 6 | #
 | 
| 7 | #   http://www.apache.org/licenses/LICENSE-2.0
 | 
| 8 | """util_test.py: Tests for util.py."""
 | 
| 9 | 
 | 
| 10 | import unittest
 | 
| 11 | import sys
 | 
| 12 | 
 | 
| 13 | from core import util  # module under test
 | 
| 14 | 
 | 
| 15 | # guard some tests that fail on Darwin
 | 
| 16 | IS_DARWIN = sys.platform == 'darwin'
 | 
| 17 | 
 | 
| 18 | 
 | 
| 19 | class UtilTest(unittest.TestCase):
 | 
| 20 | 
 | 
| 21 |     def testDebugFile(self):
 | 
| 22 |         n = util.NullDebugFile()
 | 
| 23 |         n.write('foo')
 | 
| 24 | 
 | 
| 25 |     def testRegexSearch(self):
 | 
| 26 |         cases = [
 | 
| 27 |             ('([a-z]+)([0-9]+)', 'foo123', ['foo123', 'foo', '123']),
 | 
| 28 |             (r'.*\.py', 'foo.py', ['foo.py']),
 | 
| 29 |             (r'.*\.py', 'abcd', None),
 | 
| 30 |             # The match is unanchored
 | 
| 31 |             (r'bc', 'abcd', ['bc']),
 | 
| 32 |             # The match is unanchored
 | 
| 33 |             (r'.c', 'abcd', ['bc']),
 | 
| 34 |             # Empty matches empty
 | 
| 35 |             None if IS_DARWIN else (r'', '', ['']),
 | 
| 36 |             (r'^$', '', ['']),
 | 
| 37 |             (r'^.$', '', None),
 | 
| 38 |             (r'(a*)(b*)', '', ['', '', '']),
 | 
| 39 |             (r'(a*)(b*)', 'aa', ['aa', 'aa', '']),
 | 
| 40 |             (r'(a*)(b*)', 'bb', ['bb', '', 'bb']),
 | 
| 41 |             (r'(a*)(b*)', 'aabb', ['aabb', 'aa', 'bb']),
 | 
| 42 |             (r'(a*(z)?)|(b*)', 'aaz', ['aaz', 'aaz', 'z', '']),
 | 
| 43 |             (r'(a*(z)?)|(b*)', 'bb', ['bb', '', '', 'bb']),
 | 
| 44 |         ]
 | 
| 45 | 
 | 
| 46 |         # TODO:
 | 
| 47 |         #
 | 
| 48 |         # return a single list of length 2*(1 + nsub)
 | 
| 49 |         # 2 is for start and end, +1 is for 0
 | 
| 50 |         #
 | 
| 51 |         # indices = regex_search(...)
 | 
| 52 |         # indices[2*group] is start
 | 
| 53 |         # indices[2*group+1] is end
 | 
| 54 |         # group is from 0 ... n
 | 
| 55 | 
 | 
| 56 |         for pat, s, expected in filter(None, cases):
 | 
| 57 |             #print('CASE %s' % pat)
 | 
| 58 |             actual = util.RegexSearch(pat, s)
 | 
| 59 |             #print('actual %r' % actual)
 | 
| 60 |             self.assertEqual(expected, actual)
 | 
| 61 | 
 | 
| 62 | 
 | 
| 63 | if __name__ == '__main__':
 | 
| 64 |     unittest.main()
 |