tests/test-match.py
changeset 42341 27d6956d386b
parent 41676 0531dff73d0b
child 42346 38d85ec06552
equal deleted inserted replaced
42340:7ada598941d2 42341:27d6956d386b
    11 
    11 
    12 class BaseMatcherTests(unittest.TestCase):
    12 class BaseMatcherTests(unittest.TestCase):
    13 
    13 
    14     def testVisitdir(self):
    14     def testVisitdir(self):
    15         m = matchmod.basematcher()
    15         m = matchmod.basematcher()
    16         self.assertTrue(m.visitdir(b'.'))
    16         self.assertTrue(m.visitdir(b''))
    17         self.assertTrue(m.visitdir(b'dir'))
    17         self.assertTrue(m.visitdir(b'dir'))
    18 
    18 
    19     def testVisitchildrenset(self):
    19     def testVisitchildrenset(self):
    20         m = matchmod.basematcher()
    20         m = matchmod.basematcher()
    21         self.assertEqual(m.visitchildrenset(b'.'), b'this')
    21         self.assertEqual(m.visitchildrenset(b''), b'this')
    22         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
    22         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
    23 
    23 
    24 class AlwaysMatcherTests(unittest.TestCase):
    24 class AlwaysMatcherTests(unittest.TestCase):
    25 
    25 
    26     def testVisitdir(self):
    26     def testVisitdir(self):
    27         m = matchmod.alwaysmatcher()
    27         m = matchmod.alwaysmatcher()
    28         self.assertEqual(m.visitdir(b'.'), b'all')
    28         self.assertEqual(m.visitdir(b''), b'all')
    29         self.assertEqual(m.visitdir(b'dir'), b'all')
    29         self.assertEqual(m.visitdir(b'dir'), b'all')
    30 
    30 
    31     def testVisitchildrenset(self):
    31     def testVisitchildrenset(self):
    32         m = matchmod.alwaysmatcher()
    32         m = matchmod.alwaysmatcher()
    33         self.assertEqual(m.visitchildrenset(b'.'), b'all')
    33         self.assertEqual(m.visitchildrenset(b''), b'all')
    34         self.assertEqual(m.visitchildrenset(b'dir'), b'all')
    34         self.assertEqual(m.visitchildrenset(b'dir'), b'all')
    35 
    35 
    36 class NeverMatcherTests(unittest.TestCase):
    36 class NeverMatcherTests(unittest.TestCase):
    37 
    37 
    38     def testVisitdir(self):
    38     def testVisitdir(self):
    39         m = matchmod.nevermatcher()
    39         m = matchmod.nevermatcher()
    40         self.assertFalse(m.visitdir(b'.'))
    40         self.assertFalse(m.visitdir(b''))
    41         self.assertFalse(m.visitdir(b'dir'))
    41         self.assertFalse(m.visitdir(b'dir'))
    42 
    42 
    43     def testVisitchildrenset(self):
    43     def testVisitchildrenset(self):
    44         m = matchmod.nevermatcher()
    44         m = matchmod.nevermatcher()
    45         self.assertEqual(m.visitchildrenset(b'.'), set())
    45         self.assertEqual(m.visitchildrenset(b''), set())
    46         self.assertEqual(m.visitchildrenset(b'dir'), set())
    46         self.assertEqual(m.visitchildrenset(b'dir'), set())
    47 
    47 
    48 class PredicateMatcherTests(unittest.TestCase):
    48 class PredicateMatcherTests(unittest.TestCase):
    49     # predicatematcher does not currently define either of these methods, so
    49     # predicatematcher does not currently define either of these methods, so
    50     # this is equivalent to BaseMatcherTests.
    50     # this is equivalent to BaseMatcherTests.
    51 
    51 
    52     def testVisitdir(self):
    52     def testVisitdir(self):
    53         m = matchmod.predicatematcher(lambda *a: False)
    53         m = matchmod.predicatematcher(lambda *a: False)
    54         self.assertTrue(m.visitdir(b'.'))
    54         self.assertTrue(m.visitdir(b''))
    55         self.assertTrue(m.visitdir(b'dir'))
    55         self.assertTrue(m.visitdir(b'dir'))
    56 
    56 
    57     def testVisitchildrenset(self):
    57     def testVisitchildrenset(self):
    58         m = matchmod.predicatematcher(lambda *a: False)
    58         m = matchmod.predicatematcher(lambda *a: False)
    59         self.assertEqual(m.visitchildrenset(b'.'), b'this')
    59         self.assertEqual(m.visitchildrenset(b''), b'this')
    60         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
    60         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
    61 
    61 
    62 class PatternMatcherTests(unittest.TestCase):
    62 class PatternMatcherTests(unittest.TestCase):
    63 
    63 
    64     def testVisitdirPrefix(self):
    64     def testVisitdirPrefix(self):
    65         m = matchmod.match(b'x', b'', patterns=[b'path:dir/subdir'])
    65         m = matchmod.match(b'x', b'', patterns=[b'path:dir/subdir'])
    66         assert isinstance(m, matchmod.patternmatcher)
    66         assert isinstance(m, matchmod.patternmatcher)
    67         self.assertTrue(m.visitdir(b'.'))
    67         self.assertTrue(m.visitdir(b''))
    68         self.assertTrue(m.visitdir(b'dir'))
    68         self.assertTrue(m.visitdir(b'dir'))
    69         self.assertEqual(m.visitdir(b'dir/subdir'), b'all')
    69         self.assertEqual(m.visitdir(b'dir/subdir'), b'all')
    70         # OPT: This should probably be 'all' if its parent is?
    70         # OPT: This should probably be 'all' if its parent is?
    71         self.assertTrue(m.visitdir(b'dir/subdir/x'))
    71         self.assertTrue(m.visitdir(b'dir/subdir/x'))
    72         self.assertFalse(m.visitdir(b'folder'))
    72         self.assertFalse(m.visitdir(b'folder'))
    73 
    73 
    74     def testVisitchildrensetPrefix(self):
    74     def testVisitchildrensetPrefix(self):
    75         m = matchmod.match(b'x', b'', patterns=[b'path:dir/subdir'])
    75         m = matchmod.match(b'x', b'', patterns=[b'path:dir/subdir'])
    76         assert isinstance(m, matchmod.patternmatcher)
    76         assert isinstance(m, matchmod.patternmatcher)
    77         self.assertEqual(m.visitchildrenset(b'.'), b'this')
    77         self.assertEqual(m.visitchildrenset(b''), b'this')
    78         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
    78         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
    79         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'all')
    79         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'all')
    80         # OPT: This should probably be 'all' if its parent is?
    80         # OPT: This should probably be 'all' if its parent is?
    81         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), b'this')
    81         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), b'this')
    82         self.assertEqual(m.visitchildrenset(b'folder'), set())
    82         self.assertEqual(m.visitchildrenset(b'folder'), set())
    83 
    83 
    84     def testVisitdirRootfilesin(self):
    84     def testVisitdirRootfilesin(self):
    85         m = matchmod.match(b'x', b'', patterns=[b'rootfilesin:dir/subdir'])
    85         m = matchmod.match(b'x', b'', patterns=[b'rootfilesin:dir/subdir'])
    86         assert isinstance(m, matchmod.patternmatcher)
    86         assert isinstance(m, matchmod.patternmatcher)
    87         self.assertTrue(m.visitdir(b'.'))
    87         self.assertTrue(m.visitdir(b''))
    88         self.assertFalse(m.visitdir(b'dir/subdir/x'))
    88         self.assertFalse(m.visitdir(b'dir/subdir/x'))
    89         self.assertFalse(m.visitdir(b'folder'))
    89         self.assertFalse(m.visitdir(b'folder'))
    90         # FIXME: These should probably be True.
    90         # FIXME: These should probably be True.
    91         self.assertFalse(m.visitdir(b'dir'))
    91         self.assertFalse(m.visitdir(b'dir'))
    92         self.assertFalse(m.visitdir(b'dir/subdir'))
    92         self.assertFalse(m.visitdir(b'dir/subdir'))
    93 
    93 
    94     def testVisitchildrensetRootfilesin(self):
    94     def testVisitchildrensetRootfilesin(self):
    95         m = matchmod.match(b'x', b'', patterns=[b'rootfilesin:dir/subdir'])
    95         m = matchmod.match(b'x', b'', patterns=[b'rootfilesin:dir/subdir'])
    96         assert isinstance(m, matchmod.patternmatcher)
    96         assert isinstance(m, matchmod.patternmatcher)
    97         self.assertEqual(m.visitchildrenset(b'.'), b'this')
    97         self.assertEqual(m.visitchildrenset(b''), b'this')
    98         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), set())
    98         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), set())
    99         self.assertEqual(m.visitchildrenset(b'folder'), set())
    99         self.assertEqual(m.visitchildrenset(b'folder'), set())
   100         # FIXME: These should probably be {'subdir'} and 'this', respectively,
   100         # FIXME: These should probably be {'subdir'} and 'this', respectively,
   101         # or at least 'this' and 'this'.
   101         # or at least 'this' and 'this'.
   102         self.assertEqual(m.visitchildrenset(b'dir'), set())
   102         self.assertEqual(m.visitchildrenset(b'dir'), set())
   103         self.assertEqual(m.visitchildrenset(b'dir/subdir'), set())
   103         self.assertEqual(m.visitchildrenset(b'dir/subdir'), set())
   104 
   104 
   105     def testVisitdirGlob(self):
   105     def testVisitdirGlob(self):
   106         m = matchmod.match(b'x', b'', patterns=[b'glob:dir/z*'])
   106         m = matchmod.match(b'x', b'', patterns=[b'glob:dir/z*'])
   107         assert isinstance(m, matchmod.patternmatcher)
   107         assert isinstance(m, matchmod.patternmatcher)
   108         self.assertTrue(m.visitdir(b'.'))
   108         self.assertTrue(m.visitdir(b''))
   109         self.assertTrue(m.visitdir(b'dir'))
   109         self.assertTrue(m.visitdir(b'dir'))
   110         self.assertFalse(m.visitdir(b'folder'))
   110         self.assertFalse(m.visitdir(b'folder'))
   111         # OPT: these should probably be False.
   111         # OPT: these should probably be False.
   112         self.assertTrue(m.visitdir(b'dir/subdir'))
   112         self.assertTrue(m.visitdir(b'dir/subdir'))
   113         self.assertTrue(m.visitdir(b'dir/subdir/x'))
   113         self.assertTrue(m.visitdir(b'dir/subdir/x'))
   114 
   114 
   115     def testVisitchildrensetGlob(self):
   115     def testVisitchildrensetGlob(self):
   116         m = matchmod.match(b'x', b'', patterns=[b'glob:dir/z*'])
   116         m = matchmod.match(b'x', b'', patterns=[b'glob:dir/z*'])
   117         assert isinstance(m, matchmod.patternmatcher)
   117         assert isinstance(m, matchmod.patternmatcher)
   118         self.assertEqual(m.visitchildrenset(b'.'), b'this')
   118         self.assertEqual(m.visitchildrenset(b''), b'this')
   119         self.assertEqual(m.visitchildrenset(b'folder'), set())
   119         self.assertEqual(m.visitchildrenset(b'folder'), set())
   120         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
   120         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
   121         # OPT: these should probably be set().
   121         # OPT: these should probably be set().
   122         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'this')
   122         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'this')
   123         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), b'this')
   123         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), b'this')
   125 class IncludeMatcherTests(unittest.TestCase):
   125 class IncludeMatcherTests(unittest.TestCase):
   126 
   126 
   127     def testVisitdirPrefix(self):
   127     def testVisitdirPrefix(self):
   128         m = matchmod.match(b'x', b'', include=[b'path:dir/subdir'])
   128         m = matchmod.match(b'x', b'', include=[b'path:dir/subdir'])
   129         assert isinstance(m, matchmod.includematcher)
   129         assert isinstance(m, matchmod.includematcher)
   130         self.assertTrue(m.visitdir(b'.'))
   130         self.assertTrue(m.visitdir(b''))
   131         self.assertTrue(m.visitdir(b'dir'))
   131         self.assertTrue(m.visitdir(b'dir'))
   132         self.assertEqual(m.visitdir(b'dir/subdir'), b'all')
   132         self.assertEqual(m.visitdir(b'dir/subdir'), b'all')
   133         # OPT: This should probably be 'all' if its parent is?
   133         # OPT: This should probably be 'all' if its parent is?
   134         self.assertTrue(m.visitdir(b'dir/subdir/x'))
   134         self.assertTrue(m.visitdir(b'dir/subdir/x'))
   135         self.assertFalse(m.visitdir(b'folder'))
   135         self.assertFalse(m.visitdir(b'folder'))
   136 
   136 
   137     def testVisitchildrensetPrefix(self):
   137     def testVisitchildrensetPrefix(self):
   138         m = matchmod.match(b'x', b'', include=[b'path:dir/subdir'])
   138         m = matchmod.match(b'x', b'', include=[b'path:dir/subdir'])
   139         assert isinstance(m, matchmod.includematcher)
   139         assert isinstance(m, matchmod.includematcher)
   140         self.assertEqual(m.visitchildrenset(b'.'), {b'dir'})
   140         self.assertEqual(m.visitchildrenset(b''), {b'dir'})
   141         self.assertEqual(m.visitchildrenset(b'dir'), {b'subdir'})
   141         self.assertEqual(m.visitchildrenset(b'dir'), {b'subdir'})
   142         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'all')
   142         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'all')
   143         # OPT: This should probably be 'all' if its parent is?
   143         # OPT: This should probably be 'all' if its parent is?
   144         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), b'this')
   144         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), b'this')
   145         self.assertEqual(m.visitchildrenset(b'folder'), set())
   145         self.assertEqual(m.visitchildrenset(b'folder'), set())
   146 
   146 
   147     def testVisitdirRootfilesin(self):
   147     def testVisitdirRootfilesin(self):
   148         m = matchmod.match(b'x', b'', include=[b'rootfilesin:dir/subdir'])
   148         m = matchmod.match(b'x', b'', include=[b'rootfilesin:dir/subdir'])
   149         assert isinstance(m, matchmod.includematcher)
   149         assert isinstance(m, matchmod.includematcher)
   150         self.assertTrue(m.visitdir(b'.'))
   150         self.assertTrue(m.visitdir(b''))
   151         self.assertTrue(m.visitdir(b'dir'))
   151         self.assertTrue(m.visitdir(b'dir'))
   152         self.assertTrue(m.visitdir(b'dir/subdir'))
   152         self.assertTrue(m.visitdir(b'dir/subdir'))
   153         self.assertFalse(m.visitdir(b'dir/subdir/x'))
   153         self.assertFalse(m.visitdir(b'dir/subdir/x'))
   154         self.assertFalse(m.visitdir(b'folder'))
   154         self.assertFalse(m.visitdir(b'folder'))
   155 
   155 
   156     def testVisitchildrensetRootfilesin(self):
   156     def testVisitchildrensetRootfilesin(self):
   157         m = matchmod.match(b'x', b'', include=[b'rootfilesin:dir/subdir'])
   157         m = matchmod.match(b'x', b'', include=[b'rootfilesin:dir/subdir'])
   158         assert isinstance(m, matchmod.includematcher)
   158         assert isinstance(m, matchmod.includematcher)
   159         self.assertEqual(m.visitchildrenset(b'.'), {b'dir'})
   159         self.assertEqual(m.visitchildrenset(b''), {b'dir'})
   160         self.assertEqual(m.visitchildrenset(b'dir'), {b'subdir'})
   160         self.assertEqual(m.visitchildrenset(b'dir'), {b'subdir'})
   161         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'this')
   161         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'this')
   162         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), set())
   162         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), set())
   163         self.assertEqual(m.visitchildrenset(b'folder'), set())
   163         self.assertEqual(m.visitchildrenset(b'folder'), set())
   164 
   164 
   165     def testVisitdirGlob(self):
   165     def testVisitdirGlob(self):
   166         m = matchmod.match(b'x', b'', include=[b'glob:dir/z*'])
   166         m = matchmod.match(b'x', b'', include=[b'glob:dir/z*'])
   167         assert isinstance(m, matchmod.includematcher)
   167         assert isinstance(m, matchmod.includematcher)
   168         self.assertTrue(m.visitdir(b'.'))
   168         self.assertTrue(m.visitdir(b''))
   169         self.assertTrue(m.visitdir(b'dir'))
   169         self.assertTrue(m.visitdir(b'dir'))
   170         self.assertFalse(m.visitdir(b'folder'))
   170         self.assertFalse(m.visitdir(b'folder'))
   171         # OPT: these should probably be False.
   171         # OPT: these should probably be False.
   172         self.assertTrue(m.visitdir(b'dir/subdir'))
   172         self.assertTrue(m.visitdir(b'dir/subdir'))
   173         self.assertTrue(m.visitdir(b'dir/subdir/x'))
   173         self.assertTrue(m.visitdir(b'dir/subdir/x'))
   174 
   174 
   175     def testVisitchildrensetGlob(self):
   175     def testVisitchildrensetGlob(self):
   176         m = matchmod.match(b'x', b'', include=[b'glob:dir/z*'])
   176         m = matchmod.match(b'x', b'', include=[b'glob:dir/z*'])
   177         assert isinstance(m, matchmod.includematcher)
   177         assert isinstance(m, matchmod.includematcher)
   178         self.assertEqual(m.visitchildrenset(b'.'), {b'dir'})
   178         self.assertEqual(m.visitchildrenset(b''), {b'dir'})
   179         self.assertEqual(m.visitchildrenset(b'folder'), set())
   179         self.assertEqual(m.visitchildrenset(b'folder'), set())
   180         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
   180         self.assertEqual(m.visitchildrenset(b'dir'), b'this')
   181         # OPT: these should probably be set().
   181         # OPT: these should probably be set().
   182         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'this')
   182         self.assertEqual(m.visitchildrenset(b'dir/subdir'), b'this')
   183         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), b'this')
   183         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), b'this')
   185 class ExactMatcherTests(unittest.TestCase):
   185 class ExactMatcherTests(unittest.TestCase):
   186 
   186 
   187     def testVisitdir(self):
   187     def testVisitdir(self):
   188         m = matchmod.exact(files=[b'dir/subdir/foo.txt'])
   188         m = matchmod.exact(files=[b'dir/subdir/foo.txt'])
   189         assert isinstance(m, matchmod.exactmatcher)
   189         assert isinstance(m, matchmod.exactmatcher)
   190         self.assertTrue(m.visitdir(b'.'))
   190         self.assertTrue(m.visitdir(b''))
   191         self.assertTrue(m.visitdir(b'dir'))
   191         self.assertTrue(m.visitdir(b'dir'))
   192         self.assertTrue(m.visitdir(b'dir/subdir'))
   192         self.assertTrue(m.visitdir(b'dir/subdir'))
   193         self.assertFalse(m.visitdir(b'dir/subdir/foo.txt'))
   193         self.assertFalse(m.visitdir(b'dir/subdir/foo.txt'))
   194         self.assertFalse(m.visitdir(b'dir/foo'))
   194         self.assertFalse(m.visitdir(b'dir/foo'))
   195         self.assertFalse(m.visitdir(b'dir/subdir/x'))
   195         self.assertFalse(m.visitdir(b'dir/subdir/x'))
   196         self.assertFalse(m.visitdir(b'folder'))
   196         self.assertFalse(m.visitdir(b'folder'))
   197 
   197 
   198     def testVisitchildrenset(self):
   198     def testVisitchildrenset(self):
   199         m = matchmod.exact(files=[b'dir/subdir/foo.txt'])
   199         m = matchmod.exact(files=[b'dir/subdir/foo.txt'])
   200         assert isinstance(m, matchmod.exactmatcher)
   200         assert isinstance(m, matchmod.exactmatcher)
   201         self.assertEqual(m.visitchildrenset(b'.'), {b'dir'})
   201         self.assertEqual(m.visitchildrenset(b''), {b'dir'})
   202         self.assertEqual(m.visitchildrenset(b'dir'), {b'subdir'})
   202         self.assertEqual(m.visitchildrenset(b'dir'), {b'subdir'})
   203         self.assertEqual(m.visitchildrenset(b'dir/subdir'), {b'foo.txt'})
   203         self.assertEqual(m.visitchildrenset(b'dir/subdir'), {b'foo.txt'})
   204         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), set())
   204         self.assertEqual(m.visitchildrenset(b'dir/subdir/x'), set())
   205         self.assertEqual(m.visitchildrenset(b'dir/subdir/foo.txt'), set())
   205         self.assertEqual(m.visitchildrenset(b'dir/subdir/foo.txt'), set())
   206         self.assertEqual(m.visitchildrenset(b'folder'), set())
   206         self.assertEqual(m.visitchildrenset(b'folder'), set())
   210                                   b'a/file1.txt',
   210                                   b'a/file1.txt',
   211                                   b'a/b/file2.txt',
   211                                   b'a/b/file2.txt',
   212                                   # no file in a/b/c
   212                                   # no file in a/b/c
   213                                   b'a/b/c/d/file4.txt'])
   213                                   b'a/b/c/d/file4.txt'])
   214         assert isinstance(m, matchmod.exactmatcher)
   214         assert isinstance(m, matchmod.exactmatcher)
   215         self.assertEqual(m.visitchildrenset(b'.'), {b'a', b'rootfile.txt'})
   215         self.assertEqual(m.visitchildrenset(b''), {b'a', b'rootfile.txt'})
   216         self.assertEqual(m.visitchildrenset(b'a'), {b'b', b'file1.txt'})
   216         self.assertEqual(m.visitchildrenset(b'a'), {b'b', b'file1.txt'})
   217         self.assertEqual(m.visitchildrenset(b'a/b'), {b'c', b'file2.txt'})
   217         self.assertEqual(m.visitchildrenset(b'a/b'), {b'c', b'file2.txt'})
   218         self.assertEqual(m.visitchildrenset(b'a/b/c'), {b'd'})
   218         self.assertEqual(m.visitchildrenset(b'a/b/c'), {b'd'})
   219         self.assertEqual(m.visitchildrenset(b'a/b/c/d'), {b'file4.txt'})
   219         self.assertEqual(m.visitchildrenset(b'a/b/c/d'), {b'file4.txt'})
   220         self.assertEqual(m.visitchildrenset(b'a/b/c/d/e'), set())
   220         self.assertEqual(m.visitchildrenset(b'a/b/c/d/e'), set())
   225     def testVisitdirM2always(self):
   225     def testVisitdirM2always(self):
   226         m1 = matchmod.alwaysmatcher()
   226         m1 = matchmod.alwaysmatcher()
   227         m2 = matchmod.alwaysmatcher()
   227         m2 = matchmod.alwaysmatcher()
   228         dm = matchmod.differencematcher(m1, m2)
   228         dm = matchmod.differencematcher(m1, m2)
   229         # dm should be equivalent to a nevermatcher.
   229         # dm should be equivalent to a nevermatcher.
   230         self.assertFalse(dm.visitdir(b'.'))
   230         self.assertFalse(dm.visitdir(b''))
   231         self.assertFalse(dm.visitdir(b'dir'))
   231         self.assertFalse(dm.visitdir(b'dir'))
   232         self.assertFalse(dm.visitdir(b'dir/subdir'))
   232         self.assertFalse(dm.visitdir(b'dir/subdir'))
   233         self.assertFalse(dm.visitdir(b'dir/subdir/z'))
   233         self.assertFalse(dm.visitdir(b'dir/subdir/z'))
   234         self.assertFalse(dm.visitdir(b'dir/foo'))
   234         self.assertFalse(dm.visitdir(b'dir/foo'))
   235         self.assertFalse(dm.visitdir(b'dir/subdir/x'))
   235         self.assertFalse(dm.visitdir(b'dir/subdir/x'))
   238     def testVisitchildrensetM2always(self):
   238     def testVisitchildrensetM2always(self):
   239         m1 = matchmod.alwaysmatcher()
   239         m1 = matchmod.alwaysmatcher()
   240         m2 = matchmod.alwaysmatcher()
   240         m2 = matchmod.alwaysmatcher()
   241         dm = matchmod.differencematcher(m1, m2)
   241         dm = matchmod.differencematcher(m1, m2)
   242         # dm should be equivalent to a nevermatcher.
   242         # dm should be equivalent to a nevermatcher.
   243         self.assertEqual(dm.visitchildrenset(b'.'), set())
   243         self.assertEqual(dm.visitchildrenset(b''), set())
   244         self.assertEqual(dm.visitchildrenset(b'dir'), set())
   244         self.assertEqual(dm.visitchildrenset(b'dir'), set())
   245         self.assertEqual(dm.visitchildrenset(b'dir/subdir'), set())
   245         self.assertEqual(dm.visitchildrenset(b'dir/subdir'), set())
   246         self.assertEqual(dm.visitchildrenset(b'dir/subdir/z'), set())
   246         self.assertEqual(dm.visitchildrenset(b'dir/subdir/z'), set())
   247         self.assertEqual(dm.visitchildrenset(b'dir/foo'), set())
   247         self.assertEqual(dm.visitchildrenset(b'dir/foo'), set())
   248         self.assertEqual(dm.visitchildrenset(b'dir/subdir/x'), set())
   248         self.assertEqual(dm.visitchildrenset(b'dir/subdir/x'), set())
   256         #
   256         #
   257         # We're testing Equal-to-True instead of just 'assertTrue' since
   257         # We're testing Equal-to-True instead of just 'assertTrue' since
   258         # assertTrue does NOT verify that it's a bool, just that it's truthy.
   258         # assertTrue does NOT verify that it's a bool, just that it's truthy.
   259         # While we may want to eventually make these return 'all', they should
   259         # While we may want to eventually make these return 'all', they should
   260         # not currently do so.
   260         # not currently do so.
   261         self.assertEqual(dm.visitdir(b'.'), b'all')
   261         self.assertEqual(dm.visitdir(b''), b'all')
   262         self.assertEqual(dm.visitdir(b'dir'), b'all')
   262         self.assertEqual(dm.visitdir(b'dir'), b'all')
   263         self.assertEqual(dm.visitdir(b'dir/subdir'), b'all')
   263         self.assertEqual(dm.visitdir(b'dir/subdir'), b'all')
   264         self.assertEqual(dm.visitdir(b'dir/subdir/z'), b'all')
   264         self.assertEqual(dm.visitdir(b'dir/subdir/z'), b'all')
   265         self.assertEqual(dm.visitdir(b'dir/foo'), b'all')
   265         self.assertEqual(dm.visitdir(b'dir/foo'), b'all')
   266         self.assertEqual(dm.visitdir(b'dir/subdir/x'), b'all')
   266         self.assertEqual(dm.visitdir(b'dir/subdir/x'), b'all')
   269     def testVisitchildrensetM2never(self):
   269     def testVisitchildrensetM2never(self):
   270         m1 = matchmod.alwaysmatcher()
   270         m1 = matchmod.alwaysmatcher()
   271         m2 = matchmod.nevermatcher()
   271         m2 = matchmod.nevermatcher()
   272         dm = matchmod.differencematcher(m1, m2)
   272         dm = matchmod.differencematcher(m1, m2)
   273         # dm should be equivalent to a alwaysmatcher.
   273         # dm should be equivalent to a alwaysmatcher.
   274         self.assertEqual(dm.visitchildrenset(b'.'), b'all')
   274         self.assertEqual(dm.visitchildrenset(b''), b'all')
   275         self.assertEqual(dm.visitchildrenset(b'dir'), b'all')
   275         self.assertEqual(dm.visitchildrenset(b'dir'), b'all')
   276         self.assertEqual(dm.visitchildrenset(b'dir/subdir'), b'all')
   276         self.assertEqual(dm.visitchildrenset(b'dir/subdir'), b'all')
   277         self.assertEqual(dm.visitchildrenset(b'dir/subdir/z'), b'all')
   277         self.assertEqual(dm.visitchildrenset(b'dir/subdir/z'), b'all')
   278         self.assertEqual(dm.visitchildrenset(b'dir/foo'), b'all')
   278         self.assertEqual(dm.visitchildrenset(b'dir/foo'), b'all')
   279         self.assertEqual(dm.visitchildrenset(b'dir/subdir/x'), b'all')
   279         self.assertEqual(dm.visitchildrenset(b'dir/subdir/x'), b'all')
   281 
   281 
   282     def testVisitdirM2SubdirPrefix(self):
   282     def testVisitdirM2SubdirPrefix(self):
   283         m1 = matchmod.alwaysmatcher()
   283         m1 = matchmod.alwaysmatcher()
   284         m2 = matchmod.match(b'', b'', patterns=[b'path:dir/subdir'])
   284         m2 = matchmod.match(b'', b'', patterns=[b'path:dir/subdir'])
   285         dm = matchmod.differencematcher(m1, m2)
   285         dm = matchmod.differencematcher(m1, m2)
   286         self.assertEqual(dm.visitdir(b'.'), True)
   286         self.assertEqual(dm.visitdir(b''), True)
   287         self.assertEqual(dm.visitdir(b'dir'), True)
   287         self.assertEqual(dm.visitdir(b'dir'), True)
   288         self.assertFalse(dm.visitdir(b'dir/subdir'))
   288         self.assertFalse(dm.visitdir(b'dir/subdir'))
   289         # OPT: We should probably return False for these; we don't because
   289         # OPT: We should probably return False for these; we don't because
   290         # patternmatcher.visitdir() (our m2) doesn't return 'all' for subdirs of
   290         # patternmatcher.visitdir() (our m2) doesn't return 'all' for subdirs of
   291         # an 'all' pattern, just True.
   291         # an 'all' pattern, just True.
   296 
   296 
   297     def testVisitchildrensetM2SubdirPrefix(self):
   297     def testVisitchildrensetM2SubdirPrefix(self):
   298         m1 = matchmod.alwaysmatcher()
   298         m1 = matchmod.alwaysmatcher()
   299         m2 = matchmod.match(b'', b'', patterns=[b'path:dir/subdir'])
   299         m2 = matchmod.match(b'', b'', patterns=[b'path:dir/subdir'])
   300         dm = matchmod.differencematcher(m1, m2)
   300         dm = matchmod.differencematcher(m1, m2)
   301         self.assertEqual(dm.visitchildrenset(b'.'), b'this')
   301         self.assertEqual(dm.visitchildrenset(b''), b'this')
   302         self.assertEqual(dm.visitchildrenset(b'dir'), b'this')
   302         self.assertEqual(dm.visitchildrenset(b'dir'), b'this')
   303         self.assertEqual(dm.visitchildrenset(b'dir/subdir'), set())
   303         self.assertEqual(dm.visitchildrenset(b'dir/subdir'), set())
   304         self.assertEqual(dm.visitchildrenset(b'dir/foo'), b'all')
   304         self.assertEqual(dm.visitchildrenset(b'dir/foo'), b'all')
   305         self.assertEqual(dm.visitchildrenset(b'folder'), b'all')
   305         self.assertEqual(dm.visitchildrenset(b'folder'), b'all')
   306         # OPT: We should probably return set() for these; we don't because
   306         # OPT: We should probably return set() for these; we don't because
   313     # better (giving narrower results) than patternmatcher.
   313     # better (giving narrower results) than patternmatcher.
   314     def testVisitdirIncludeIncludfe(self):
   314     def testVisitdirIncludeIncludfe(self):
   315         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   315         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   316         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   316         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   317         dm = matchmod.differencematcher(m1, m2)
   317         dm = matchmod.differencematcher(m1, m2)
   318         self.assertEqual(dm.visitdir(b'.'), True)
   318         self.assertEqual(dm.visitdir(b''), True)
   319         self.assertEqual(dm.visitdir(b'dir'), True)
   319         self.assertEqual(dm.visitdir(b'dir'), True)
   320         self.assertEqual(dm.visitdir(b'dir/subdir'), b'all')
   320         self.assertEqual(dm.visitdir(b'dir/subdir'), b'all')
   321         self.assertFalse(dm.visitdir(b'dir/foo'))
   321         self.assertFalse(dm.visitdir(b'dir/foo'))
   322         self.assertFalse(dm.visitdir(b'folder'))
   322         self.assertFalse(dm.visitdir(b'folder'))
   323         # OPT: We should probably return False for these; we don't because
   323         # OPT: We should probably return False for these; we don't because
   328 
   328 
   329     def testVisitchildrensetIncludeInclude(self):
   329     def testVisitchildrensetIncludeInclude(self):
   330         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   330         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   331         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   331         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   332         dm = matchmod.differencematcher(m1, m2)
   332         dm = matchmod.differencematcher(m1, m2)
   333         self.assertEqual(dm.visitchildrenset(b'.'), {b'dir'})
   333         self.assertEqual(dm.visitchildrenset(b''), {b'dir'})
   334         self.assertEqual(dm.visitchildrenset(b'dir'), {b'subdir'})
   334         self.assertEqual(dm.visitchildrenset(b'dir'), {b'subdir'})
   335         self.assertEqual(dm.visitchildrenset(b'dir/subdir'), b'all')
   335         self.assertEqual(dm.visitchildrenset(b'dir/subdir'), b'all')
   336         self.assertEqual(dm.visitchildrenset(b'dir/foo'), set())
   336         self.assertEqual(dm.visitchildrenset(b'dir/foo'), set())
   337         self.assertEqual(dm.visitchildrenset(b'folder'), set())
   337         self.assertEqual(dm.visitchildrenset(b'folder'), set())
   338         # OPT: We should probably return set() for these; we don't because
   338         # OPT: We should probably return set() for these; we don't because
   346     def testVisitdirM2always(self):
   346     def testVisitdirM2always(self):
   347         m1 = matchmod.alwaysmatcher()
   347         m1 = matchmod.alwaysmatcher()
   348         m2 = matchmod.alwaysmatcher()
   348         m2 = matchmod.alwaysmatcher()
   349         im = matchmod.intersectmatchers(m1, m2)
   349         im = matchmod.intersectmatchers(m1, m2)
   350         # im should be equivalent to a alwaysmatcher.
   350         # im should be equivalent to a alwaysmatcher.
   351         self.assertEqual(im.visitdir(b'.'), b'all')
   351         self.assertEqual(im.visitdir(b''), b'all')
   352         self.assertEqual(im.visitdir(b'dir'), b'all')
   352         self.assertEqual(im.visitdir(b'dir'), b'all')
   353         self.assertEqual(im.visitdir(b'dir/subdir'), b'all')
   353         self.assertEqual(im.visitdir(b'dir/subdir'), b'all')
   354         self.assertEqual(im.visitdir(b'dir/subdir/z'), b'all')
   354         self.assertEqual(im.visitdir(b'dir/subdir/z'), b'all')
   355         self.assertEqual(im.visitdir(b'dir/foo'), b'all')
   355         self.assertEqual(im.visitdir(b'dir/foo'), b'all')
   356         self.assertEqual(im.visitdir(b'dir/subdir/x'), b'all')
   356         self.assertEqual(im.visitdir(b'dir/subdir/x'), b'all')
   359     def testVisitchildrensetM2always(self):
   359     def testVisitchildrensetM2always(self):
   360         m1 = matchmod.alwaysmatcher()
   360         m1 = matchmod.alwaysmatcher()
   361         m2 = matchmod.alwaysmatcher()
   361         m2 = matchmod.alwaysmatcher()
   362         im = matchmod.intersectmatchers(m1, m2)
   362         im = matchmod.intersectmatchers(m1, m2)
   363         # im should be equivalent to a alwaysmatcher.
   363         # im should be equivalent to a alwaysmatcher.
   364         self.assertEqual(im.visitchildrenset(b'.'), b'all')
   364         self.assertEqual(im.visitchildrenset(b''), b'all')
   365         self.assertEqual(im.visitchildrenset(b'dir'), b'all')
   365         self.assertEqual(im.visitchildrenset(b'dir'), b'all')
   366         self.assertEqual(im.visitchildrenset(b'dir/subdir'), b'all')
   366         self.assertEqual(im.visitchildrenset(b'dir/subdir'), b'all')
   367         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), b'all')
   367         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), b'all')
   368         self.assertEqual(im.visitchildrenset(b'dir/foo'), b'all')
   368         self.assertEqual(im.visitchildrenset(b'dir/foo'), b'all')
   369         self.assertEqual(im.visitchildrenset(b'dir/subdir/x'), b'all')
   369         self.assertEqual(im.visitchildrenset(b'dir/subdir/x'), b'all')
   372     def testVisitdirM2never(self):
   372     def testVisitdirM2never(self):
   373         m1 = matchmod.alwaysmatcher()
   373         m1 = matchmod.alwaysmatcher()
   374         m2 = matchmod.nevermatcher()
   374         m2 = matchmod.nevermatcher()
   375         im = matchmod.intersectmatchers(m1, m2)
   375         im = matchmod.intersectmatchers(m1, m2)
   376         # im should be equivalent to a nevermatcher.
   376         # im should be equivalent to a nevermatcher.
   377         self.assertFalse(im.visitdir(b'.'))
   377         self.assertFalse(im.visitdir(b''))
   378         self.assertFalse(im.visitdir(b'dir'))
   378         self.assertFalse(im.visitdir(b'dir'))
   379         self.assertFalse(im.visitdir(b'dir/subdir'))
   379         self.assertFalse(im.visitdir(b'dir/subdir'))
   380         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   380         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   381         self.assertFalse(im.visitdir(b'dir/foo'))
   381         self.assertFalse(im.visitdir(b'dir/foo'))
   382         self.assertFalse(im.visitdir(b'dir/subdir/x'))
   382         self.assertFalse(im.visitdir(b'dir/subdir/x'))
   385     def testVisitchildrensetM2never(self):
   385     def testVisitchildrensetM2never(self):
   386         m1 = matchmod.alwaysmatcher()
   386         m1 = matchmod.alwaysmatcher()
   387         m2 = matchmod.nevermatcher()
   387         m2 = matchmod.nevermatcher()
   388         im = matchmod.intersectmatchers(m1, m2)
   388         im = matchmod.intersectmatchers(m1, m2)
   389         # im should be equivalent to a nevermqtcher.
   389         # im should be equivalent to a nevermqtcher.
   390         self.assertEqual(im.visitchildrenset(b'.'), set())
   390         self.assertEqual(im.visitchildrenset(b''), set())
   391         self.assertEqual(im.visitchildrenset(b'dir'), set())
   391         self.assertEqual(im.visitchildrenset(b'dir'), set())
   392         self.assertEqual(im.visitchildrenset(b'dir/subdir'), set())
   392         self.assertEqual(im.visitchildrenset(b'dir/subdir'), set())
   393         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   393         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   394         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   394         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   395         self.assertEqual(im.visitchildrenset(b'dir/subdir/x'), set())
   395         self.assertEqual(im.visitchildrenset(b'dir/subdir/x'), set())
   397 
   397 
   398     def testVisitdirM2SubdirPrefix(self):
   398     def testVisitdirM2SubdirPrefix(self):
   399         m1 = matchmod.alwaysmatcher()
   399         m1 = matchmod.alwaysmatcher()
   400         m2 = matchmod.match(b'', b'', patterns=[b'path:dir/subdir'])
   400         m2 = matchmod.match(b'', b'', patterns=[b'path:dir/subdir'])
   401         im = matchmod.intersectmatchers(m1, m2)
   401         im = matchmod.intersectmatchers(m1, m2)
   402         self.assertEqual(im.visitdir(b'.'), True)
   402         self.assertEqual(im.visitdir(b''), True)
   403         self.assertEqual(im.visitdir(b'dir'), True)
   403         self.assertEqual(im.visitdir(b'dir'), True)
   404         self.assertEqual(im.visitdir(b'dir/subdir'), b'all')
   404         self.assertEqual(im.visitdir(b'dir/subdir'), b'all')
   405         self.assertFalse(im.visitdir(b'dir/foo'))
   405         self.assertFalse(im.visitdir(b'dir/foo'))
   406         self.assertFalse(im.visitdir(b'folder'))
   406         self.assertFalse(im.visitdir(b'folder'))
   407         # OPT: We should probably return 'all' for these; we don't because
   407         # OPT: We should probably return 'all' for these; we don't because
   412 
   412 
   413     def testVisitchildrensetM2SubdirPrefix(self):
   413     def testVisitchildrensetM2SubdirPrefix(self):
   414         m1 = matchmod.alwaysmatcher()
   414         m1 = matchmod.alwaysmatcher()
   415         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   415         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   416         im = matchmod.intersectmatchers(m1, m2)
   416         im = matchmod.intersectmatchers(m1, m2)
   417         self.assertEqual(im.visitchildrenset(b'.'), {b'dir'})
   417         self.assertEqual(im.visitchildrenset(b''), {b'dir'})
   418         self.assertEqual(im.visitchildrenset(b'dir'), {b'subdir'})
   418         self.assertEqual(im.visitchildrenset(b'dir'), {b'subdir'})
   419         self.assertEqual(im.visitchildrenset(b'dir/subdir'), b'all')
   419         self.assertEqual(im.visitchildrenset(b'dir/subdir'), b'all')
   420         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   420         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   421         self.assertEqual(im.visitchildrenset(b'folder'), set())
   421         self.assertEqual(im.visitchildrenset(b'folder'), set())
   422         # OPT: We should probably return 'all' for these
   422         # OPT: We should probably return 'all' for these
   427     # better (giving narrower results) than patternmatcher.
   427     # better (giving narrower results) than patternmatcher.
   428     def testVisitdirIncludeIncludfe(self):
   428     def testVisitdirIncludeIncludfe(self):
   429         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   429         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   430         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   430         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   431         im = matchmod.intersectmatchers(m1, m2)
   431         im = matchmod.intersectmatchers(m1, m2)
   432         self.assertEqual(im.visitdir(b'.'), True)
   432         self.assertEqual(im.visitdir(b''), True)
   433         self.assertEqual(im.visitdir(b'dir'), True)
   433         self.assertEqual(im.visitdir(b'dir'), True)
   434         self.assertFalse(im.visitdir(b'dir/subdir'))
   434         self.assertFalse(im.visitdir(b'dir/subdir'))
   435         self.assertFalse(im.visitdir(b'dir/foo'))
   435         self.assertFalse(im.visitdir(b'dir/foo'))
   436         self.assertFalse(im.visitdir(b'folder'))
   436         self.assertFalse(im.visitdir(b'folder'))
   437         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   437         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   439 
   439 
   440     def testVisitchildrensetIncludeInclude(self):
   440     def testVisitchildrensetIncludeInclude(self):
   441         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   441         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   442         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   442         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   443         im = matchmod.intersectmatchers(m1, m2)
   443         im = matchmod.intersectmatchers(m1, m2)
   444         self.assertEqual(im.visitchildrenset(b'.'), {b'dir'})
   444         self.assertEqual(im.visitchildrenset(b''), {b'dir'})
   445         self.assertEqual(im.visitchildrenset(b'dir'), b'this')
   445         self.assertEqual(im.visitchildrenset(b'dir'), b'this')
   446         self.assertEqual(im.visitchildrenset(b'dir/subdir'), set())
   446         self.assertEqual(im.visitchildrenset(b'dir/subdir'), set())
   447         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   447         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   448         self.assertEqual(im.visitchildrenset(b'folder'), set())
   448         self.assertEqual(im.visitchildrenset(b'folder'), set())
   449         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   449         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   454     def testVisitdirIncludeInclude2(self):
   454     def testVisitdirIncludeInclude2(self):
   455         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   455         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   456         m2 = matchmod.match(b'', b'', include=[b'path:folder'])
   456         m2 = matchmod.match(b'', b'', include=[b'path:folder'])
   457         im = matchmod.intersectmatchers(m1, m2)
   457         im = matchmod.intersectmatchers(m1, m2)
   458         # FIXME: is True correct here?
   458         # FIXME: is True correct here?
   459         self.assertEqual(im.visitdir(b'.'), True)
   459         self.assertEqual(im.visitdir(b''), True)
   460         self.assertFalse(im.visitdir(b'dir'))
   460         self.assertFalse(im.visitdir(b'dir'))
   461         self.assertFalse(im.visitdir(b'dir/subdir'))
   461         self.assertFalse(im.visitdir(b'dir/subdir'))
   462         self.assertFalse(im.visitdir(b'dir/foo'))
   462         self.assertFalse(im.visitdir(b'dir/foo'))
   463         self.assertFalse(im.visitdir(b'folder'))
   463         self.assertFalse(im.visitdir(b'folder'))
   464         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   464         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   467     def testVisitchildrensetIncludeInclude2(self):
   467     def testVisitchildrensetIncludeInclude2(self):
   468         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   468         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   469         m2 = matchmod.match(b'', b'', include=[b'path:folder'])
   469         m2 = matchmod.match(b'', b'', include=[b'path:folder'])
   470         im = matchmod.intersectmatchers(m1, m2)
   470         im = matchmod.intersectmatchers(m1, m2)
   471         # FIXME: is set() correct here?
   471         # FIXME: is set() correct here?
   472         self.assertEqual(im.visitchildrenset(b'.'), set())
   472         self.assertEqual(im.visitchildrenset(b''), set())
   473         self.assertEqual(im.visitchildrenset(b'dir'), set())
   473         self.assertEqual(im.visitchildrenset(b'dir'), set())
   474         self.assertEqual(im.visitchildrenset(b'dir/subdir'), set())
   474         self.assertEqual(im.visitchildrenset(b'dir/subdir'), set())
   475         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   475         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   476         self.assertEqual(im.visitchildrenset(b'folder'), set())
   476         self.assertEqual(im.visitchildrenset(b'folder'), set())
   477         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   477         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   481     # better (giving narrower results) than patternmatcher.
   481     # better (giving narrower results) than patternmatcher.
   482     def testVisitdirIncludeInclude3(self):
   482     def testVisitdirIncludeInclude3(self):
   483         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   483         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   484         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   484         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   485         im = matchmod.intersectmatchers(m1, m2)
   485         im = matchmod.intersectmatchers(m1, m2)
   486         self.assertEqual(im.visitdir(b'.'), True)
   486         self.assertEqual(im.visitdir(b''), True)
   487         self.assertEqual(im.visitdir(b'dir'), True)
   487         self.assertEqual(im.visitdir(b'dir'), True)
   488         self.assertEqual(im.visitdir(b'dir/subdir'), True)
   488         self.assertEqual(im.visitdir(b'dir/subdir'), True)
   489         self.assertFalse(im.visitdir(b'dir/foo'))
   489         self.assertFalse(im.visitdir(b'dir/foo'))
   490         self.assertFalse(im.visitdir(b'folder'))
   490         self.assertFalse(im.visitdir(b'folder'))
   491         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   491         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   494 
   494 
   495     def testVisitchildrensetIncludeInclude3(self):
   495     def testVisitchildrensetIncludeInclude3(self):
   496         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   496         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   497         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   497         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   498         im = matchmod.intersectmatchers(m1, m2)
   498         im = matchmod.intersectmatchers(m1, m2)
   499         self.assertEqual(im.visitchildrenset(b'.'), {b'dir'})
   499         self.assertEqual(im.visitchildrenset(b''), {b'dir'})
   500         self.assertEqual(im.visitchildrenset(b'dir'), {b'subdir'})
   500         self.assertEqual(im.visitchildrenset(b'dir'), {b'subdir'})
   501         self.assertEqual(im.visitchildrenset(b'dir/subdir'), {b'x'})
   501         self.assertEqual(im.visitchildrenset(b'dir/subdir'), {b'x'})
   502         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   502         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   503         self.assertEqual(im.visitchildrenset(b'folder'), set())
   503         self.assertEqual(im.visitchildrenset(b'folder'), set())
   504         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   504         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   510     def testVisitdirIncludeInclude4(self):
   510     def testVisitdirIncludeInclude4(self):
   511         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   511         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   512         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir/z'])
   512         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir/z'])
   513         im = matchmod.intersectmatchers(m1, m2)
   513         im = matchmod.intersectmatchers(m1, m2)
   514         # OPT: these next three could probably be False as well.
   514         # OPT: these next three could probably be False as well.
   515         self.assertEqual(im.visitdir(b'.'), True)
   515         self.assertEqual(im.visitdir(b''), True)
   516         self.assertEqual(im.visitdir(b'dir'), True)
   516         self.assertEqual(im.visitdir(b'dir'), True)
   517         self.assertEqual(im.visitdir(b'dir/subdir'), True)
   517         self.assertEqual(im.visitdir(b'dir/subdir'), True)
   518         self.assertFalse(im.visitdir(b'dir/foo'))
   518         self.assertFalse(im.visitdir(b'dir/foo'))
   519         self.assertFalse(im.visitdir(b'folder'))
   519         self.assertFalse(im.visitdir(b'folder'))
   520         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   520         self.assertFalse(im.visitdir(b'dir/subdir/z'))
   523     def testVisitchildrensetIncludeInclude4(self):
   523     def testVisitchildrensetIncludeInclude4(self):
   524         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   524         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   525         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir/z'])
   525         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir/z'])
   526         im = matchmod.intersectmatchers(m1, m2)
   526         im = matchmod.intersectmatchers(m1, m2)
   527         # OPT: these next two could probably be set() as well.
   527         # OPT: these next two could probably be set() as well.
   528         self.assertEqual(im.visitchildrenset(b'.'), {b'dir'})
   528         self.assertEqual(im.visitchildrenset(b''), {b'dir'})
   529         self.assertEqual(im.visitchildrenset(b'dir'), {b'subdir'})
   529         self.assertEqual(im.visitchildrenset(b'dir'), {b'subdir'})
   530         self.assertEqual(im.visitchildrenset(b'dir/subdir'), set())
   530         self.assertEqual(im.visitchildrenset(b'dir/subdir'), set())
   531         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   531         self.assertEqual(im.visitchildrenset(b'dir/foo'), set())
   532         self.assertEqual(im.visitchildrenset(b'folder'), set())
   532         self.assertEqual(im.visitchildrenset(b'folder'), set())
   533         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   533         self.assertEqual(im.visitchildrenset(b'dir/subdir/z'), set())
   538     def testVisitdirM2always(self):
   538     def testVisitdirM2always(self):
   539         m1 = matchmod.alwaysmatcher()
   539         m1 = matchmod.alwaysmatcher()
   540         m2 = matchmod.alwaysmatcher()
   540         m2 = matchmod.alwaysmatcher()
   541         um = matchmod.unionmatcher([m1, m2])
   541         um = matchmod.unionmatcher([m1, m2])
   542         # um should be equivalent to a alwaysmatcher.
   542         # um should be equivalent to a alwaysmatcher.
   543         self.assertEqual(um.visitdir(b'.'), b'all')
   543         self.assertEqual(um.visitdir(b''), b'all')
   544         self.assertEqual(um.visitdir(b'dir'), b'all')
   544         self.assertEqual(um.visitdir(b'dir'), b'all')
   545         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   545         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   546         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   546         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   547         self.assertEqual(um.visitdir(b'dir/foo'), b'all')
   547         self.assertEqual(um.visitdir(b'dir/foo'), b'all')
   548         self.assertEqual(um.visitdir(b'dir/subdir/x'), b'all')
   548         self.assertEqual(um.visitdir(b'dir/subdir/x'), b'all')
   551     def testVisitchildrensetM2always(self):
   551     def testVisitchildrensetM2always(self):
   552         m1 = matchmod.alwaysmatcher()
   552         m1 = matchmod.alwaysmatcher()
   553         m2 = matchmod.alwaysmatcher()
   553         m2 = matchmod.alwaysmatcher()
   554         um = matchmod.unionmatcher([m1, m2])
   554         um = matchmod.unionmatcher([m1, m2])
   555         # um should be equivalent to a alwaysmatcher.
   555         # um should be equivalent to a alwaysmatcher.
   556         self.assertEqual(um.visitchildrenset(b'.'), b'all')
   556         self.assertEqual(um.visitchildrenset(b''), b'all')
   557         self.assertEqual(um.visitchildrenset(b'dir'), b'all')
   557         self.assertEqual(um.visitchildrenset(b'dir'), b'all')
   558         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   558         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   559         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   559         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   560         self.assertEqual(um.visitchildrenset(b'dir/foo'), b'all')
   560         self.assertEqual(um.visitchildrenset(b'dir/foo'), b'all')
   561         self.assertEqual(um.visitchildrenset(b'dir/subdir/x'), b'all')
   561         self.assertEqual(um.visitchildrenset(b'dir/subdir/x'), b'all')
   564     def testVisitdirM1never(self):
   564     def testVisitdirM1never(self):
   565         m1 = matchmod.nevermatcher()
   565         m1 = matchmod.nevermatcher()
   566         m2 = matchmod.alwaysmatcher()
   566         m2 = matchmod.alwaysmatcher()
   567         um = matchmod.unionmatcher([m1, m2])
   567         um = matchmod.unionmatcher([m1, m2])
   568         # um should be equivalent to a alwaysmatcher.
   568         # um should be equivalent to a alwaysmatcher.
   569         self.assertEqual(um.visitdir(b'.'), b'all')
   569         self.assertEqual(um.visitdir(b''), b'all')
   570         self.assertEqual(um.visitdir(b'dir'), b'all')
   570         self.assertEqual(um.visitdir(b'dir'), b'all')
   571         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   571         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   572         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   572         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   573         self.assertEqual(um.visitdir(b'dir/foo'), b'all')
   573         self.assertEqual(um.visitdir(b'dir/foo'), b'all')
   574         self.assertEqual(um.visitdir(b'dir/subdir/x'), b'all')
   574         self.assertEqual(um.visitdir(b'dir/subdir/x'), b'all')
   577     def testVisitchildrensetM1never(self):
   577     def testVisitchildrensetM1never(self):
   578         m1 = matchmod.nevermatcher()
   578         m1 = matchmod.nevermatcher()
   579         m2 = matchmod.alwaysmatcher()
   579         m2 = matchmod.alwaysmatcher()
   580         um = matchmod.unionmatcher([m1, m2])
   580         um = matchmod.unionmatcher([m1, m2])
   581         # um should be equivalent to a alwaysmatcher.
   581         # um should be equivalent to a alwaysmatcher.
   582         self.assertEqual(um.visitchildrenset(b'.'), b'all')
   582         self.assertEqual(um.visitchildrenset(b''), b'all')
   583         self.assertEqual(um.visitchildrenset(b'dir'), b'all')
   583         self.assertEqual(um.visitchildrenset(b'dir'), b'all')
   584         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   584         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   585         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   585         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   586         self.assertEqual(um.visitchildrenset(b'dir/foo'), b'all')
   586         self.assertEqual(um.visitchildrenset(b'dir/foo'), b'all')
   587         self.assertEqual(um.visitchildrenset(b'dir/subdir/x'), b'all')
   587         self.assertEqual(um.visitchildrenset(b'dir/subdir/x'), b'all')
   590     def testVisitdirM2never(self):
   590     def testVisitdirM2never(self):
   591         m1 = matchmod.alwaysmatcher()
   591         m1 = matchmod.alwaysmatcher()
   592         m2 = matchmod.nevermatcher()
   592         m2 = matchmod.nevermatcher()
   593         um = matchmod.unionmatcher([m1, m2])
   593         um = matchmod.unionmatcher([m1, m2])
   594         # um should be equivalent to a alwaysmatcher.
   594         # um should be equivalent to a alwaysmatcher.
   595         self.assertEqual(um.visitdir(b'.'), b'all')
   595         self.assertEqual(um.visitdir(b''), b'all')
   596         self.assertEqual(um.visitdir(b'dir'), b'all')
   596         self.assertEqual(um.visitdir(b'dir'), b'all')
   597         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   597         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   598         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   598         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   599         self.assertEqual(um.visitdir(b'dir/foo'), b'all')
   599         self.assertEqual(um.visitdir(b'dir/foo'), b'all')
   600         self.assertEqual(um.visitdir(b'dir/subdir/x'), b'all')
   600         self.assertEqual(um.visitdir(b'dir/subdir/x'), b'all')
   603     def testVisitchildrensetM2never(self):
   603     def testVisitchildrensetM2never(self):
   604         m1 = matchmod.alwaysmatcher()
   604         m1 = matchmod.alwaysmatcher()
   605         m2 = matchmod.nevermatcher()
   605         m2 = matchmod.nevermatcher()
   606         um = matchmod.unionmatcher([m1, m2])
   606         um = matchmod.unionmatcher([m1, m2])
   607         # um should be equivalent to a alwaysmatcher.
   607         # um should be equivalent to a alwaysmatcher.
   608         self.assertEqual(um.visitchildrenset(b'.'), b'all')
   608         self.assertEqual(um.visitchildrenset(b''), b'all')
   609         self.assertEqual(um.visitchildrenset(b'dir'), b'all')
   609         self.assertEqual(um.visitchildrenset(b'dir'), b'all')
   610         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   610         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   611         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   611         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   612         self.assertEqual(um.visitchildrenset(b'dir/foo'), b'all')
   612         self.assertEqual(um.visitchildrenset(b'dir/foo'), b'all')
   613         self.assertEqual(um.visitchildrenset(b'dir/subdir/x'), b'all')
   613         self.assertEqual(um.visitchildrenset(b'dir/subdir/x'), b'all')
   615 
   615 
   616     def testVisitdirM2SubdirPrefix(self):
   616     def testVisitdirM2SubdirPrefix(self):
   617         m1 = matchmod.alwaysmatcher()
   617         m1 = matchmod.alwaysmatcher()
   618         m2 = matchmod.match(b'', b'', patterns=[b'path:dir/subdir'])
   618         m2 = matchmod.match(b'', b'', patterns=[b'path:dir/subdir'])
   619         um = matchmod.unionmatcher([m1, m2])
   619         um = matchmod.unionmatcher([m1, m2])
   620         self.assertEqual(um.visitdir(b'.'), b'all')
   620         self.assertEqual(um.visitdir(b''), b'all')
   621         self.assertEqual(um.visitdir(b'dir'), b'all')
   621         self.assertEqual(um.visitdir(b'dir'), b'all')
   622         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   622         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   623         self.assertEqual(um.visitdir(b'dir/foo'), b'all')
   623         self.assertEqual(um.visitdir(b'dir/foo'), b'all')
   624         self.assertEqual(um.visitdir(b'folder'), b'all')
   624         self.assertEqual(um.visitdir(b'folder'), b'all')
   625         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   625         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   627 
   627 
   628     def testVisitchildrensetM2SubdirPrefix(self):
   628     def testVisitchildrensetM2SubdirPrefix(self):
   629         m1 = matchmod.alwaysmatcher()
   629         m1 = matchmod.alwaysmatcher()
   630         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   630         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   631         um = matchmod.unionmatcher([m1, m2])
   631         um = matchmod.unionmatcher([m1, m2])
   632         self.assertEqual(um.visitchildrenset(b'.'), b'all')
   632         self.assertEqual(um.visitchildrenset(b''), b'all')
   633         self.assertEqual(um.visitchildrenset(b'dir'), b'all')
   633         self.assertEqual(um.visitchildrenset(b'dir'), b'all')
   634         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   634         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   635         self.assertEqual(um.visitchildrenset(b'dir/foo'), b'all')
   635         self.assertEqual(um.visitchildrenset(b'dir/foo'), b'all')
   636         self.assertEqual(um.visitchildrenset(b'folder'), b'all')
   636         self.assertEqual(um.visitchildrenset(b'folder'), b'all')
   637         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   637         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   641     # better (giving narrower results) than patternmatcher.
   641     # better (giving narrower results) than patternmatcher.
   642     def testVisitdirIncludeIncludfe(self):
   642     def testVisitdirIncludeIncludfe(self):
   643         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   643         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   644         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   644         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   645         um = matchmod.unionmatcher([m1, m2])
   645         um = matchmod.unionmatcher([m1, m2])
   646         self.assertEqual(um.visitdir(b'.'), True)
   646         self.assertEqual(um.visitdir(b''), True)
   647         self.assertEqual(um.visitdir(b'dir'), True)
   647         self.assertEqual(um.visitdir(b'dir'), True)
   648         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   648         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   649         self.assertFalse(um.visitdir(b'dir/foo'))
   649         self.assertFalse(um.visitdir(b'dir/foo'))
   650         self.assertFalse(um.visitdir(b'folder'))
   650         self.assertFalse(um.visitdir(b'folder'))
   651         # OPT: These two should probably be 'all' not True.
   651         # OPT: These two should probably be 'all' not True.
   654 
   654 
   655     def testVisitchildrensetIncludeInclude(self):
   655     def testVisitchildrensetIncludeInclude(self):
   656         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   656         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   657         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   657         m2 = matchmod.match(b'', b'', include=[b'rootfilesin:dir'])
   658         um = matchmod.unionmatcher([m1, m2])
   658         um = matchmod.unionmatcher([m1, m2])
   659         self.assertEqual(um.visitchildrenset(b'.'), {b'dir'})
   659         self.assertEqual(um.visitchildrenset(b''), {b'dir'})
   660         self.assertEqual(um.visitchildrenset(b'dir'), b'this')
   660         self.assertEqual(um.visitchildrenset(b'dir'), b'this')
   661         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   661         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   662         self.assertEqual(um.visitchildrenset(b'dir/foo'), set())
   662         self.assertEqual(um.visitchildrenset(b'dir/foo'), set())
   663         self.assertEqual(um.visitchildrenset(b'folder'), set())
   663         self.assertEqual(um.visitchildrenset(b'folder'), set())
   664         # OPT: These next two could be 'all' instead of 'this'.
   664         # OPT: These next two could be 'all' instead of 'this'.
   669     # better (giving narrower results) than patternmatcher.
   669     # better (giving narrower results) than patternmatcher.
   670     def testVisitdirIncludeInclude2(self):
   670     def testVisitdirIncludeInclude2(self):
   671         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   671         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   672         m2 = matchmod.match(b'', b'', include=[b'path:folder'])
   672         m2 = matchmod.match(b'', b'', include=[b'path:folder'])
   673         um = matchmod.unionmatcher([m1, m2])
   673         um = matchmod.unionmatcher([m1, m2])
   674         self.assertEqual(um.visitdir(b'.'), True)
   674         self.assertEqual(um.visitdir(b''), True)
   675         self.assertEqual(um.visitdir(b'dir'), True)
   675         self.assertEqual(um.visitdir(b'dir'), True)
   676         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   676         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   677         self.assertFalse(um.visitdir(b'dir/foo'))
   677         self.assertFalse(um.visitdir(b'dir/foo'))
   678         self.assertEqual(um.visitdir(b'folder'), b'all')
   678         self.assertEqual(um.visitdir(b'folder'), b'all')
   679         # OPT: These should probably be 'all' not True.
   679         # OPT: These should probably be 'all' not True.
   682 
   682 
   683     def testVisitchildrensetIncludeInclude2(self):
   683     def testVisitchildrensetIncludeInclude2(self):
   684         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   684         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   685         m2 = matchmod.match(b'', b'', include=[b'path:folder'])
   685         m2 = matchmod.match(b'', b'', include=[b'path:folder'])
   686         um = matchmod.unionmatcher([m1, m2])
   686         um = matchmod.unionmatcher([m1, m2])
   687         self.assertEqual(um.visitchildrenset(b'.'), {b'folder', b'dir'})
   687         self.assertEqual(um.visitchildrenset(b''), {b'folder', b'dir'})
   688         self.assertEqual(um.visitchildrenset(b'dir'), {b'subdir'})
   688         self.assertEqual(um.visitchildrenset(b'dir'), {b'subdir'})
   689         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   689         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   690         self.assertEqual(um.visitchildrenset(b'dir/foo'), set())
   690         self.assertEqual(um.visitchildrenset(b'dir/foo'), set())
   691         self.assertEqual(um.visitchildrenset(b'folder'), b'all')
   691         self.assertEqual(um.visitchildrenset(b'folder'), b'all')
   692         # OPT: These next two could be 'all' instead of 'this'.
   692         # OPT: These next two could be 'all' instead of 'this'.
   697     # better (giving narrower results) than patternmatcher.
   697     # better (giving narrower results) than patternmatcher.
   698     def testVisitdirIncludeInclude3(self):
   698     def testVisitdirIncludeInclude3(self):
   699         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   699         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   700         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   700         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   701         um = matchmod.unionmatcher([m1, m2])
   701         um = matchmod.unionmatcher([m1, m2])
   702         self.assertEqual(um.visitdir(b'.'), True)
   702         self.assertEqual(um.visitdir(b''), True)
   703         self.assertEqual(um.visitdir(b'dir'), True)
   703         self.assertEqual(um.visitdir(b'dir'), True)
   704         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   704         self.assertEqual(um.visitdir(b'dir/subdir'), b'all')
   705         self.assertFalse(um.visitdir(b'dir/foo'))
   705         self.assertFalse(um.visitdir(b'dir/foo'))
   706         self.assertFalse(um.visitdir(b'folder'))
   706         self.assertFalse(um.visitdir(b'folder'))
   707         self.assertEqual(um.visitdir(b'dir/subdir/x'), b'all')
   707         self.assertEqual(um.visitdir(b'dir/subdir/x'), b'all')
   710 
   710 
   711     def testVisitchildrensetIncludeInclude3(self):
   711     def testVisitchildrensetIncludeInclude3(self):
   712         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   712         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   713         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   713         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   714         um = matchmod.unionmatcher([m1, m2])
   714         um = matchmod.unionmatcher([m1, m2])
   715         self.assertEqual(um.visitchildrenset(b'.'), {b'dir'})
   715         self.assertEqual(um.visitchildrenset(b''), {b'dir'})
   716         self.assertEqual(um.visitchildrenset(b'dir'), {b'subdir'})
   716         self.assertEqual(um.visitchildrenset(b'dir'), {b'subdir'})
   717         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   717         self.assertEqual(um.visitchildrenset(b'dir/subdir'), b'all')
   718         self.assertEqual(um.visitchildrenset(b'dir/foo'), set())
   718         self.assertEqual(um.visitchildrenset(b'dir/foo'), set())
   719         self.assertEqual(um.visitchildrenset(b'folder'), set())
   719         self.assertEqual(um.visitchildrenset(b'folder'), set())
   720         self.assertEqual(um.visitchildrenset(b'dir/subdir/x'), b'all')
   720         self.assertEqual(um.visitchildrenset(b'dir/subdir/x'), b'all')
   726     def testVisitdirIncludeInclude4(self):
   726     def testVisitdirIncludeInclude4(self):
   727         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   727         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   728         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir/z'])
   728         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir/z'])
   729         um = matchmod.unionmatcher([m1, m2])
   729         um = matchmod.unionmatcher([m1, m2])
   730         # OPT: these next three could probably be False as well.
   730         # OPT: these next three could probably be False as well.
   731         self.assertEqual(um.visitdir(b'.'), True)
   731         self.assertEqual(um.visitdir(b''), True)
   732         self.assertEqual(um.visitdir(b'dir'), True)
   732         self.assertEqual(um.visitdir(b'dir'), True)
   733         self.assertEqual(um.visitdir(b'dir/subdir'), True)
   733         self.assertEqual(um.visitdir(b'dir/subdir'), True)
   734         self.assertFalse(um.visitdir(b'dir/foo'))
   734         self.assertFalse(um.visitdir(b'dir/foo'))
   735         self.assertFalse(um.visitdir(b'folder'))
   735         self.assertFalse(um.visitdir(b'folder'))
   736         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   736         self.assertEqual(um.visitdir(b'dir/subdir/z'), b'all')
   738 
   738 
   739     def testVisitchildrensetIncludeInclude4(self):
   739     def testVisitchildrensetIncludeInclude4(self):
   740         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   740         m1 = matchmod.match(b'', b'', include=[b'path:dir/subdir/x'])
   741         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir/z'])
   741         m2 = matchmod.match(b'', b'', include=[b'path:dir/subdir/z'])
   742         um = matchmod.unionmatcher([m1, m2])
   742         um = matchmod.unionmatcher([m1, m2])
   743         self.assertEqual(um.visitchildrenset(b'.'), {b'dir'})
   743         self.assertEqual(um.visitchildrenset(b''), {b'dir'})
   744         self.assertEqual(um.visitchildrenset(b'dir'), {b'subdir'})
   744         self.assertEqual(um.visitchildrenset(b'dir'), {b'subdir'})
   745         self.assertEqual(um.visitchildrenset(b'dir/subdir'), {b'x', b'z'})
   745         self.assertEqual(um.visitchildrenset(b'dir/subdir'), {b'x', b'z'})
   746         self.assertEqual(um.visitchildrenset(b'dir/foo'), set())
   746         self.assertEqual(um.visitchildrenset(b'dir/foo'), set())
   747         self.assertEqual(um.visitchildrenset(b'folder'), set())
   747         self.assertEqual(um.visitchildrenset(b'folder'), set())
   748         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   748         self.assertEqual(um.visitchildrenset(b'dir/subdir/z'), b'all')
   752 
   752 
   753     def testVisitdir(self):
   753     def testVisitdir(self):
   754         m = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   754         m = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   755         sm = matchmod.subdirmatcher(b'dir', m)
   755         sm = matchmod.subdirmatcher(b'dir', m)
   756 
   756 
   757         self.assertEqual(sm.visitdir(b'.'), True)
   757         self.assertEqual(sm.visitdir(b''), True)
   758         self.assertEqual(sm.visitdir(b'subdir'), b'all')
   758         self.assertEqual(sm.visitdir(b'subdir'), b'all')
   759         # OPT: These next two should probably be 'all' not True.
   759         # OPT: These next two should probably be 'all' not True.
   760         self.assertEqual(sm.visitdir(b'subdir/x'), True)
   760         self.assertEqual(sm.visitdir(b'subdir/x'), True)
   761         self.assertEqual(sm.visitdir(b'subdir/z'), True)
   761         self.assertEqual(sm.visitdir(b'subdir/z'), True)
   762         self.assertFalse(sm.visitdir(b'foo'))
   762         self.assertFalse(sm.visitdir(b'foo'))
   763 
   763 
   764     def testVisitchildrenset(self):
   764     def testVisitchildrenset(self):
   765         m = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   765         m = matchmod.match(b'', b'', include=[b'path:dir/subdir'])
   766         sm = matchmod.subdirmatcher(b'dir', m)
   766         sm = matchmod.subdirmatcher(b'dir', m)
   767 
   767 
   768         self.assertEqual(sm.visitchildrenset(b'.'), {b'subdir'})
   768         self.assertEqual(sm.visitchildrenset(b''), {b'subdir'})
   769         self.assertEqual(sm.visitchildrenset(b'subdir'), b'all')
   769         self.assertEqual(sm.visitchildrenset(b'subdir'), b'all')
   770         # OPT: These next two should probably be 'all' not 'this'.
   770         # OPT: These next two should probably be 'all' not 'this'.
   771         self.assertEqual(sm.visitchildrenset(b'subdir/x'), b'this')
   771         self.assertEqual(sm.visitchildrenset(b'subdir/x'), b'this')
   772         self.assertEqual(sm.visitchildrenset(b'subdir/z'), b'this')
   772         self.assertEqual(sm.visitchildrenset(b'subdir/z'), b'this')
   773         self.assertEqual(sm.visitchildrenset(b'foo'), set())
   773         self.assertEqual(sm.visitchildrenset(b'foo'), set())
   793         self.assertEqual(bool(pm(b'b.txt')), False)
   793         self.assertEqual(bool(pm(b'b.txt')), False)
   794         self.assertEqual(bool(pm(b'd/e/a.txt')), True)
   794         self.assertEqual(bool(pm(b'd/e/a.txt')), True)
   795         self.assertEqual(bool(pm(b'd/e/b.txt')), False)
   795         self.assertEqual(bool(pm(b'd/e/b.txt')), False)
   796         self.assertEqual(bool(pm(b'd/e/f/b.txt')), True)
   796         self.assertEqual(bool(pm(b'd/e/f/b.txt')), True)
   797 
   797 
   798         self.assertEqual(m.visitdir(b'.'), True)
   798         self.assertEqual(m.visitdir(b''), True)
   799         self.assertEqual(m.visitdir(b'e'), True)
   799         self.assertEqual(m.visitdir(b'e'), True)
   800         self.assertEqual(m.visitdir(b'e/f'), True)
   800         self.assertEqual(m.visitdir(b'e/f'), True)
   801         self.assertEqual(m.visitdir(b'e/f/g'), False)
   801         self.assertEqual(m.visitdir(b'e/f/g'), False)
   802 
   802 
   803         self.assertEqual(pm.visitdir(b'.'), True)
   803         self.assertEqual(pm.visitdir(b''), True)
   804         self.assertEqual(pm.visitdir(b'd'), True)
   804         self.assertEqual(pm.visitdir(b'd'), True)
   805         self.assertEqual(pm.visitdir(b'd/e'), True)
   805         self.assertEqual(pm.visitdir(b'd/e'), True)
   806         self.assertEqual(pm.visitdir(b'd/e/f'), True)
   806         self.assertEqual(pm.visitdir(b'd/e/f'), True)
   807         self.assertEqual(pm.visitdir(b'd/e/f/g'), False)
   807         self.assertEqual(pm.visitdir(b'd/e/f/g'), False)
   808 
   808 
   812         pm = matchmod.prefixdirmatcher(b'd', m)
   812         pm = matchmod.prefixdirmatcher(b'd', m)
   813 
   813 
   814         # OPT: visitchildrenset could possibly return {'e'} and {'f'} for these
   814         # OPT: visitchildrenset could possibly return {'e'} and {'f'} for these
   815         # next two, respectively; patternmatcher does not have this
   815         # next two, respectively; patternmatcher does not have this
   816         # optimization.
   816         # optimization.
   817         self.assertEqual(m.visitchildrenset(b'.'), b'this')
   817         self.assertEqual(m.visitchildrenset(b''), b'this')
   818         self.assertEqual(m.visitchildrenset(b'e'), b'this')
   818         self.assertEqual(m.visitchildrenset(b'e'), b'this')
   819         self.assertEqual(m.visitchildrenset(b'e/f'), b'this')
   819         self.assertEqual(m.visitchildrenset(b'e/f'), b'this')
   820         self.assertEqual(m.visitchildrenset(b'e/f/g'), set())
   820         self.assertEqual(m.visitchildrenset(b'e/f/g'), set())
   821 
   821 
   822         # OPT: visitchildrenset could possibly return {'d'}, {'e'}, and {'f'}
   822         # OPT: visitchildrenset could possibly return {'d'}, {'e'}, and {'f'}
   823         # for these next three, respectively; patternmatcher does not have this
   823         # for these next three, respectively; patternmatcher does not have this
   824         # optimization.
   824         # optimization.
   825         self.assertEqual(pm.visitchildrenset(b'.'), b'this')
   825         self.assertEqual(pm.visitchildrenset(b''), b'this')
   826         self.assertEqual(pm.visitchildrenset(b'd'), b'this')
   826         self.assertEqual(pm.visitchildrenset(b'd'), b'this')
   827         self.assertEqual(pm.visitchildrenset(b'd/e'), b'this')
   827         self.assertEqual(pm.visitchildrenset(b'd/e'), b'this')
   828         self.assertEqual(pm.visitchildrenset(b'd/e/f'), b'this')
   828         self.assertEqual(pm.visitchildrenset(b'd/e/f'), b'this')
   829         self.assertEqual(pm.visitchildrenset(b'd/e/f/g'), set())
   829         self.assertEqual(pm.visitchildrenset(b'd/e/f/g'), set())
   830 
   830