----- Original Message -----

> From: Ben Reser <b...@reser.org>
> To: Prabhu Gnana Sundar <prabh...@collab.net>
> Cc: "dev@subversion.apache.org" <dev@subversion.apache.org>
> Sent: Wednesday, 23 January 2013, 11:19
> Subject: Re: [PATCH] Support regex in EXPECTED ERR list
> 
> On the whole I'm going to say that this patch is not the right
> approach to doing what you want.  Given the other email I sent I think
> what you want to do is reasonable.  But should be handled by adjusting
> the is_regex path in ExpectedOutput to be able to handle lists of
> regex.
> 
> On Tue, Jan 22, 2013 at 11:38 PM, Prabhu Gnana Sundar
> <prabh...@collab.net> wrote:
>>  Index: tests/cmdline/svntest/verify.py
>>  ===================================================================
>>  --- tests/cmdline/svntest/verify.py    (revision 1427745)
>>  +++ tests/cmdline/svntest/verify.py    (working copy)
>>  @@ -166,16 +166,20 @@ class ExpectedOutput:
>>       "Return whether EXPECTED and ACTUAL are equivalent."
>>       if not self.is_regex:
>>         if self.match_all:
>>  -        # The EXPECTED lines must match the ACTUAL lines, one-to-one, in
>>  -        # the same order.
>>  -        return expected == actual
>>  +        if not actual:
>>  +          return True
> 
> You really don't want to mess with the existing 1:1 matching like
> you've done here.
> 
>>         # The EXPECTED lines must match a subset of the ACTUAL lines,
>>         # one-to-one, in the same order, with zero or more other ACTUAL
>>         # lines interspersed among the matching ACTUAL lines.
>>         i_expected = 0
>>         for actual_line in actual:
>>  -        if expected[i_expected] == actual_line:
>>  +        # As soon an actual_line matches something, then we're good.
>>  +        # Also check if the regex in the EXPECTED line matches the
>>  +        # corresponding ACTUAL line.
>>  +        if ((expected[i_expected] == actual_line) or
>>  +            (expected[i_expected].startswith(".*") and
>>  +             re.match(expected[i_expected], actual_line))):
>>             i_expected += 1
>>             if i_expected == len(expected):
>>                return True
> 
> Looking for .* is not a valid way of determining if something is a
> regex.  If you want to match the first character then you'll end up
> having to put a bogus .* in your pattern to deal with this.
> 
> If you look just below the code you changed you'll see:
> expected_re = expected[0]
> 
> I'd look at that and adjust it.
> 
> Now the question is how.  I can see two ways:
> 
> 1) list of regular expressions, as long as one matches any single line
> with match_all=False then it's good and if match_all=True then every
> line must match at least one of the expressions.

That's no better than the current typical usage of 
RegexOutput('regex1|regex2|regex3|...', match_all=...), is it?

> 2) An ordered list of regular expressions where one is consumed for each line.
> 
> The first way is easier to maintain consistency with the current
> implementation.  If you really want the second way then I'd suggest
> subclassing RegexOutput with another class like say RegexListOutput,
> add another flag to the implementation e.g. is_regex_list = True, and
> create a 3rd code path in is_equivalent_list.

Lots of our tests contain code that tries to work around the limitations or 
simply doesn't test for as strict a match as it ought to, because the available 
Output classes don't provide a way to match a sequence of lines in a specific 
order.

So, implementing (2) would be useful.

- Julian

Reply via email to