# HG changeset patch # User Yuya Nishihara # Date 1427712700 -32400 # Node ID 263bbed1833ce5e1ec68422a75284b50b7539395 # Parent 405cb38448ad00e4345d234a06e857b569777ad8 revset: test current behavior of addset class The addset class isn't simple and it has a hidden bug that will be fixed by future patches. So let's test the current behavior. diff -r 405cb38448ad -r 263bbed1833c mercurial/revset.py --- a/mercurial/revset.py Mon Apr 27 23:03:20 2015 +0900 +++ b/mercurial/revset.py Mon Mar 30 19:51:40 2015 +0900 @@ -2944,6 +2944,64 @@ If the ascending attribute is set, that means the two structures are ordered in either an ascending or descending way. Therefore, we can add them maintaining the order by iterating over both at the same time + + >>> xs = baseset([0, 3, 2]) + >>> ys = baseset([5, 2, 4]) + + >>> rs = addset(xs, ys) + >>> bool(rs), 0 in rs, 1 in rs, 5 in rs, rs.first(), rs.last() + (True, True, False, True, 0, 4) + >>> rs = addset(xs, baseset([])) + >>> bool(rs), 0 in rs, 1 in rs, rs.first(), rs.last() + (True, True, False, 0, 2) + >>> rs = addset(baseset([]), baseset([])) + >>> bool(rs), 0 in rs, rs.first(), rs.last() + (False, False, None, None) + + iterate unsorted: + >>> rs = addset(xs, ys) + >>> [x for x in rs] # without _genlist + [0, 3, 2, 5, 4] + >>> assert not rs._genlist + >>> len(rs) + 5 + >>> [x for x in rs] # with _genlist + [0, 3, 2, 5, 4] + >>> assert rs._genlist + + iterate ascending: + >>> rs = addset(xs, ys, ascending=True) + >>> [x for x in rs], [x for x in rs.fastasc()] # without _asclist + ([0, 2, 3, 4, 5], [0, 2, 3, 4, 5]) + >>> assert not rs._asclist + >>> len(rs) # BROKEN + 6 + >>> [x for x in rs], [x for x in rs.fastasc()] # BROKEN with _asclist + ([0, 2, 2, 3, 4, 5], [0, 2, 2, 3, 4, 5]) + >>> assert rs._asclist + + iterate descending: + >>> rs = addset(xs, ys, ascending=False) + >>> [x for x in rs], [x for x in rs.fastdesc()] # without _asclist + ([5, 4, 3, 2, 0], [5, 4, 3, 2, 0]) + >>> assert not rs._asclist + >>> len(rs) # BROKEN + 6 + >>> [x for x in rs], [x for x in rs.fastdesc()] # BROKEN with _asclist + ([5, 4, 3, 2, 2, 0], [5, 4, 3, 2, 2, 0]) + >>> assert rs._asclist + + iterate ascending without fastasc: + >>> rs = addset(xs, generatorset(ys), ascending=True) + >>> assert rs.fastasc is None + >>> [x for x in rs] # BROKEN + [0, 2, 2, 3, 4, 5] + + iterate descending without fastdesc: + >>> rs = addset(generatorset(xs), ys, ascending=False) + >>> assert rs.fastdesc is None + >>> [x for x in rs] # BROKEN + [5, 4, 3, 2, 2, 0] """ def __init__(self, revs1, revs2, ascending=None): self._r1 = revs1 diff -r 405cb38448ad -r 263bbed1833c tests/test-revset.t --- a/tests/test-revset.t Mon Apr 27 23:03:20 2015 +0900 +++ b/tests/test-revset.t Mon Mar 30 19:51:40 2015 +0900 @@ -833,6 +833,54 @@ 4 5 +test that `or` operation skips duplicated revisions from right-hand side + + $ try 'reverse(1::5) or ancestors(4)' + (or + (func + ('symbol', 'reverse') + (dagrange + ('symbol', '1') + ('symbol', '5'))) + (func + ('symbol', 'ancestors') + ('symbol', '4'))) + * set: + , + >>> + 5 + 3 + 1 + 0 + 2 + 4 + $ try 'sort(ancestors(4) or reverse(1::5))' + (func + ('symbol', 'sort') + (or + (func + ('symbol', 'ancestors') + ('symbol', '4')) + (func + ('symbol', 'reverse') + (dagrange + ('symbol', '1') + ('symbol', '5'))))) + * set: + , + >> + 0 + 1 + 2 + 3 + 4 + 5 + check that conversion to only works $ try --optimize '::3 - ::1' (minus