~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/matchers.py

  • Committer: Jelmer Vernooij
  • Date: 2011-06-16 15:11:12 UTC
  • mto: This revision was merged to the branch mainline in revision 5987.
  • Revision ID: jelmer@samba.org-20110616151112-wrv023lqltn71va9
Add matcher for ancestry.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
"""
28
28
 
29
29
__all__ = [
 
30
    'MatchesAncestry',
30
31
    'ReturnsUnlockable',
31
32
    ]
32
33
 
 
34
from bzrlib import (
 
35
    revision as _mod_revision,
 
36
    )
 
37
 
33
38
from testtools.matchers import Mismatch, Matcher
34
39
 
35
40
 
66
71
 
67
72
    def describe(self):
68
73
        return "%s is locked" % self.lockable_thing
 
74
 
 
75
 
 
76
class _AncestryMismatch(Mismatch):
 
77
    """Ancestry matching mismatch."""
 
78
 
 
79
    def __init__(self, tip_revision, got, expected):
 
80
        self.tip_revision = tip_revision
 
81
        self.got = got
 
82
        self.expected = expected
 
83
 
 
84
    def describe(self):
 
85
        return "mismatched ancestry for revision %r was %r, expected %r" % (
 
86
            self.tip_revision, self.got, self.expected)
 
87
 
 
88
 
 
89
class MatchesAncestry(Matcher):
 
90
    """A matcher that checks the ancestry of a particular revision.
 
91
 
 
92
    :ivar graph: Graph in which to check the ancestry
 
93
    :ivar revision_id: Revision id of the revision
 
94
    """
 
95
 
 
96
    def __init__(self, repository, revision_id):
 
97
        Matcher.__init__(self)
 
98
        self.repository = repository
 
99
        self.revision_id = revision_id
 
100
 
 
101
    def __str__(self):
 
102
        return ('MatchesAncestry(repository=%r, revision_id=%r)' % (
 
103
            self.repository, self.revision_id))
 
104
 
 
105
    def match(self, expected):
 
106
        self.repository.lock_read()
 
107
        try:
 
108
            graph = self.repository.get_graph()
 
109
            got = [r for r, p in graph.iter_ancestry([self.revision_id])]
 
110
            if not _mod_revision.NULL_REVISION in got:
 
111
                raise AssertionError("Unable to find %r in %r" % (
 
112
                    self.revision_id, self.repository))
 
113
            got.remove(_mod_revision.NULL_REVISION)
 
114
        finally:
 
115
            self.repository.unlock()
 
116
        if sorted(got) != sorted(expected):
 
117
            return _AncestryMismatch(self.revision_id, sorted(got), sorted(expected))