887
from StringIO import StringIO
888
from bzrlib.diff import internal_diff
889
class MockTree(object):
891
object.__init__(self)
897
return self.paths.iterkeys()
899
def add_dir(self, file_id, path):
900
self.paths[file_id] = path
901
self.ids[path] = file_id
903
def add_file(self, file_id, path, contents):
904
self.add_dir(file_id, path)
905
self.contents[file_id] = contents
907
def path2id(self, path):
908
return self.ids.get(path)
910
def id2path(self, file_id):
911
return self.paths.get(file_id)
913
def has_id(self, file_id):
914
return self.id2path(file_id) is not None
916
def get_file(self, file_id):
918
result.write(self.contents[file_id])
922
class CTreeTester(unittest.TestCase):
924
def make_tree_1(self):
926
mtree.add_dir("a", "grandparent")
927
mtree.add_dir("b", "grandparent/parent")
928
mtree.add_file("c", "grandparent/parent/file", "Hello\n")
929
mtree.add_dir("d", "grandparent/alt_parent")
930
return ChangesetTree(mtree), mtree
932
def test_renames(self):
933
"""Ensure that file renames have the proper effect on children"""
934
ctree = self.make_tree_1()[0]
935
self.assertEqual(ctree.old_path("grandparent"), "grandparent")
936
self.assertEqual(ctree.old_path("grandparent/parent"), "grandparent/parent")
937
self.assertEqual(ctree.old_path("grandparent/parent/file"),
938
"grandparent/parent/file")
940
self.assertEqual(ctree.id2path("a"), "grandparent")
941
self.assertEqual(ctree.id2path("b"), "grandparent/parent")
942
self.assertEqual(ctree.id2path("c"), "grandparent/parent/file")
944
self.assertEqual(ctree.path2id("grandparent"), "a")
945
self.assertEqual(ctree.path2id("grandparent/parent"), "b")
946
self.assertEqual(ctree.path2id("grandparent/parent/file"), "c")
948
self.assertEqual(ctree.path2id("grandparent2"), None)
949
self.assertEqual(ctree.path2id("grandparent2/parent"), None)
950
self.assertEqual(ctree.path2id("grandparent2/parent/file"), None)
952
ctree.note_rename("grandparent", "grandparent2")
953
self.assertEqual(ctree.old_path("grandparent"), None)
954
self.assertEqual(ctree.old_path("grandparent/parent"), None)
955
self.assertEqual(ctree.old_path("grandparent/parent/file"), None)
957
self.assertEqual(ctree.id2path("a"), "grandparent2")
958
self.assertEqual(ctree.id2path("b"), "grandparent2/parent")
959
self.assertEqual(ctree.id2path("c"), "grandparent2/parent/file")
961
self.assertEqual(ctree.path2id("grandparent2"), "a")
962
self.assertEqual(ctree.path2id("grandparent2/parent"), "b")
963
self.assertEqual(ctree.path2id("grandparent2/parent/file"), "c")
965
self.assertEqual(ctree.path2id("grandparent"), None)
966
self.assertEqual(ctree.path2id("grandparent/parent"), None)
967
self.assertEqual(ctree.path2id("grandparent/parent/file"), None)
969
ctree.note_rename("grandparent/parent", "grandparent2/parent2")
970
self.assertEqual(ctree.id2path("a"), "grandparent2")
971
self.assertEqual(ctree.id2path("b"), "grandparent2/parent2")
972
self.assertEqual(ctree.id2path("c"), "grandparent2/parent2/file")
974
self.assertEqual(ctree.path2id("grandparent2"), "a")
975
self.assertEqual(ctree.path2id("grandparent2/parent2"), "b")
976
self.assertEqual(ctree.path2id("grandparent2/parent2/file"), "c")
978
self.assertEqual(ctree.path2id("grandparent2/parent"), None)
979
self.assertEqual(ctree.path2id("grandparent2/parent/file"), None)
981
ctree.note_rename("grandparent/parent/file",
982
"grandparent2/parent2/file2")
983
self.assertEqual(ctree.id2path("a"), "grandparent2")
984
self.assertEqual(ctree.id2path("b"), "grandparent2/parent2")
985
self.assertEqual(ctree.id2path("c"), "grandparent2/parent2/file2")
987
self.assertEqual(ctree.path2id("grandparent2"), "a")
988
self.assertEqual(ctree.path2id("grandparent2/parent2"), "b")
989
self.assertEqual(ctree.path2id("grandparent2/parent2/file2"), "c")
991
self.assertEqual(ctree.path2id("grandparent2/parent2/file"), None)
993
def test_moves(self):
994
"""Ensure that file moves have the proper effect on children"""
995
ctree = self.make_tree_1()[0]
996
ctree.note_rename("grandparent/parent/file",
997
"grandparent/alt_parent/file")
998
self.assertEqual(ctree.id2path("c"), "grandparent/alt_parent/file")
999
self.assertEqual(ctree.path2id("grandparent/alt_parent/file"), "c")
1000
self.assertEqual(ctree.path2id("grandparent/parent/file"), None)
1002
def unified_diff(self, old, new):
1004
internal_diff("old", old, "new", new, out)
1008
def make_tree_2(self):
1009
ctree = self.make_tree_1()[0]
1010
ctree.note_rename("grandparent/parent/file",
1011
"grandparent/alt_parent/file")
1012
self.assertEqual(ctree.id2path("e"), None)
1013
self.assertEqual(ctree.path2id("grandparent/parent/file"), None)
1014
ctree.note_id("e", "grandparent/parent/file")
1017
def test_adds(self):
1018
"""File/inventory adds"""
1019
ctree = self.make_tree_2()
1020
add_patch = self.unified_diff([], ["Extra cheese\n"])
1021
ctree.note_patch("grandparent/parent/file", add_patch)
1022
self.adds_test(ctree)
1024
def adds_test(self, ctree):
1025
self.assertEqual(ctree.id2path("e"), "grandparent/parent/file")
1026
self.assertEqual(ctree.path2id("grandparent/parent/file"), "e")
1027
self.assertEqual(ctree.get_file("e").read(), "Extra cheese\n")
1029
def test_adds2(self):
1030
"""File/inventory adds, with patch-compatibile renames"""
1031
ctree = self.make_tree_2()
1032
ctree.contents_by_id = False
1033
add_patch = self.unified_diff(["Hello\n"], ["Extra cheese\n"])
1034
ctree.note_patch("grandparent/parent/file", add_patch)
1035
self.adds_test(ctree)
1037
def make_tree_3(self):
1038
ctree, mtree = self.make_tree_1()
1039
mtree.add_file("e", "grandparent/parent/topping", "Anchovies\n")
1040
ctree.note_rename("grandparent/parent/file",
1041
"grandparent/alt_parent/file")
1042
ctree.note_rename("grandparent/parent/topping",
1043
"grandparent/alt_parent/stopping")
1046
def get_file_test(self, ctree):
1047
self.assertEqual(ctree.get_file("e").read(), "Lemon\n")
1048
self.assertEqual(ctree.get_file("c").read(), "Hello\n")
1050
def test_get_file(self):
1051
"""Get file contents"""
1052
ctree = self.make_tree_3()
1053
mod_patch = self.unified_diff(["Anchovies\n"], ["Lemon\n"])
1054
ctree.note_patch("grandparent/alt_parent/stopping", mod_patch)
1055
self.get_file_test(ctree)
1057
def test_get_file2(self):
1058
"""Get file contents, with patch-compatibile renames"""
1059
ctree = self.make_tree_3()
1060
ctree.contents_by_id = False
1061
mod_patch = self.unified_diff([], ["Lemon\n"])
1062
ctree.note_patch("grandparent/alt_parent/stopping", mod_patch)
1063
mod_patch = self.unified_diff([], ["Hello\n"])
1064
ctree.note_patch("grandparent/alt_parent/file", mod_patch)
1065
self.get_file_test(ctree)
1067
def test_delete(self):
1068
"Deletion by changeset"
1069
ctree = self.make_tree_1()[0]
1070
self.assertEqual(ctree.get_file("c").read(), "Hello\n")
1071
ctree.note_deletion("grandparent/parent/file")
1072
self.assertEqual(ctree.id2path("c"), None)
1073
self.assertEqual(ctree.path2id("grandparent/parent/file"), None)
1075
def sorted_ids(self, tree):
1080
def test_iteration(self):
1081
"""Ensure that iteration through ids works properly"""
1082
ctree = self.make_tree_1()[0]
1083
self.assertEqual(self.sorted_ids(ctree), ['a', 'b', 'c', 'd'])
1084
ctree.note_deletion("grandparent/parent/file")
1085
ctree.note_id("e", "grandparent/alt_parent/fool")
1086
self.assertEqual(self.sorted_ids(ctree), ['a', 'b', 'd', 'e'])
1089
patchesTestSuite = unittest.makeSuite(CTreeTester,'test_')
1090
runner = unittest.TextTestRunner()
1091
runner.run(patchesTestSuite)