def test_has_ancestor(self): """ Some complex tree. C -- G -- H -------- K / / \ A -- B -- D -- F -- J -- L -- M-- \ / E --- I """ doc_id = 'dummy' root = Changeset(doc_id, "user0", []) assert not root.has_ancestor(self.cs0) A = Changeset(doc_id, "user0", [root]) assert A.has_ancestor(root) assert not A.has_ancestor(self.cs0) B = Changeset(doc_id,"user1",[A]) assert B.has_ancestor(A) assert B.has_ancestor(root) C = Changeset(doc_id,"user3",[B]) assert C.has_ancestor(root) assert C.has_ancestor(A) assert C.has_ancestor(B) D = Changeset(doc_id,"user4",[B]) assert D.has_ancestor(root) assert D.has_ancestor(A) assert D.has_ancestor(B) assert not D.has_ancestor(C) E = Changeset(doc_id,"user5",[D]) assert E.has_ancestor(root) assert E.has_ancestor(A) assert E.has_ancestor(B) assert E.has_ancestor(D) assert not E.has_ancestor(C) F = Changeset(doc_id,"user6",[D]) assert F.has_ancestor(root) assert F.has_ancestor(A) assert F.has_ancestor(B) assert F.has_ancestor(D) assert not F.has_ancestor(C) assert not F.has_ancestor(E) G = Changeset(doc_id,"user5",[C]) assert G.has_ancestor(root) assert G.has_ancestor(A) assert G.has_ancestor(B) assert G.has_ancestor(C) assert not G.has_ancestor(D) assert not G.has_ancestor(E) assert not G.has_ancestor(F) H = Changeset(doc_id,"user5",[G,F]) assert H.has_ancestor(root) assert H.has_ancestor(A) assert H.has_ancestor(B) assert H.has_ancestor(C) assert H.has_ancestor(G) assert H.has_ancestor(D) assert not H.has_ancestor(E) assert H.has_ancestor(F) I = Changeset(doc_id,"user6",[E]) assert I.has_ancestor(root) assert I.has_ancestor(A) assert I.has_ancestor(B) assert not I.has_ancestor(C) assert I.has_ancestor(D) assert I.has_ancestor(E) assert not I.has_ancestor(F) assert not I.has_ancestor(G) assert not I.has_ancestor(H) J = Changeset(doc_id,"user5",[I,F]) assert J.has_ancestor(root) assert J.has_ancestor(A) assert J.has_ancestor(B) assert not J.has_ancestor(C) assert J.has_ancestor(D) assert J.has_ancestor(E) assert J.has_ancestor(F) assert not J.has_ancestor(G) assert not J.has_ancestor(H) assert J.has_ancestor(I) K = Changeset(doc_id,"user5",[H]) assert K.has_ancestor(root) assert K.has_ancestor(A) assert K.has_ancestor(B) assert K.has_ancestor(C) assert K.has_ancestor(D) assert not K.has_ancestor(E) assert K.has_ancestor(F) assert K.has_ancestor(G) assert K.has_ancestor(H) assert not K.has_ancestor(I) assert not K.has_ancestor(J) L = Changeset(doc_id,"user5",[J]) assert L.has_ancestor(root) assert L.has_ancestor(A) assert L.has_ancestor(B) assert not L.has_ancestor(C) assert L.has_ancestor(D) assert L.has_ancestor(E) assert L.has_ancestor(F) assert not L.has_ancestor(G) assert not L.has_ancestor(H) assert L.has_ancestor(I) assert L.has_ancestor(J) assert not L.has_ancestor(K) M = Changeset(doc_id,"user5",[K,L]) assert M.has_ancestor(root) assert M.has_ancestor(A) assert M.has_ancestor(B) assert M.has_ancestor(C) assert M.has_ancestor(D) assert M.has_ancestor(E) assert M.has_ancestor(F) assert M.has_ancestor(G) assert M.has_ancestor(H) assert M.has_ancestor(I) assert M.has_ancestor(J) assert M.has_ancestor(K) assert M.has_ancestor(L)