##// END OF EJS Templates
test-manifest.py: rewrite tests in terms of manifestdict...
Martin von Zweigbergk -
r24466:f310ca66 default
parent child Browse files
Show More
@@ -5,6 +5,7 b' import itertools'
5 5 import silenttestrunner
6 6
7 7 from mercurial import manifest as manifestmod
8 from mercurial import match as matchmod
8 9
9 10 HASH_1 = '1' * 40
10 11 HASH_2 = 'f' * 40
@@ -26,6 +27,9 b" A_HUGE_MANIFEST = ''.join(sorted("
26 27 itertools.cycle((HASH_1, HASH_2)),
27 28 itertools.cycle(('', 'x', 'l')))))
28 29
30 def parsemanifest(text):
31 return manifestmod.manifestdict(text)
32
29 33 class testmanifest(unittest.TestCase):
30 34
31 35 def assertIn(self, thing, container, msg=None):
@@ -38,41 +42,55 b' class testmanifest(unittest.TestCase):'
38 42 self.assert_(thing in container, msg)
39 43
40 44 def testEmptyManifest(self):
41 m = manifestmod._lazymanifest('')
45 m = parsemanifest('')
42 46 self.assertEqual(0, len(m))
43 self.assertEqual([], list(m.iterentries()))
47 self.assertEqual([], list(m))
44 48
45 49 def testManifest(self):
46 m = manifestmod._lazymanifest(A_SHORT_MANIFEST)
47 want = [
48 ('bar/baz/qux.py', binascii.unhexlify(HASH_2), 'l'),
49 ('foo', binascii.unhexlify(HASH_1), ''),
50 ]
51 self.assertEqual(len(want), len(m))
52 self.assertEqual(want, list(m.iterentries()))
53 self.assertEqual((binascii.unhexlify(HASH_1), ''), m['foo'])
50 m = parsemanifest(A_SHORT_MANIFEST)
51 self.assertEqual(['bar/baz/qux.py', 'foo'], list(m))
52 self.assertEqual(binascii.unhexlify(HASH_2), m['bar/baz/qux.py'])
53 self.assertEqual('l', m.flags('bar/baz/qux.py'))
54 self.assertEqual(binascii.unhexlify(HASH_1), m['foo'])
55 self.assertEqual('', m.flags('foo'))
54 56 self.assertRaises(KeyError, lambda : m['wat'])
55 self.assertEqual((binascii.unhexlify(HASH_2), 'l'),
56 m['bar/baz/qux.py'])
57 57
58 58 def testSetItem(self):
59 want = binascii.unhexlify(HASH_1), ''
59 want = binascii.unhexlify(HASH_1)
60 60
61 m = manifestmod._lazymanifest('')
61 m = parsemanifest('')
62 62 m['a'] = want
63 63 self.assertIn('a', m)
64 64 self.assertEqual(want, m['a'])
65 65 self.assertEqual('a\0' + HASH_1 + '\n', m.text())
66 66
67 m = manifestmod._lazymanifest(A_SHORT_MANIFEST)
67 m = parsemanifest(A_SHORT_MANIFEST)
68 68 m['a'] = want
69 69 self.assertEqual(want, m['a'])
70 70 self.assertEqual('a\0' + HASH_1 + '\n' + A_SHORT_MANIFEST,
71 71 m.text())
72 72
73 def testSetFlag(self):
74 want = 'x'
75
76 m = parsemanifest('')
77 # first add a file; a file-less flag makes no sense
78 m['a'] = binascii.unhexlify(HASH_1)
79 m.setflag('a', want)
80 self.assertEqual(want, m.flags('a'))
81 self.assertEqual('a\0' + HASH_1 + want + '\n', m.text())
82
83 m = parsemanifest(A_SHORT_MANIFEST)
84 # first add a file; a file-less flag makes no sense
85 m['a'] = binascii.unhexlify(HASH_1)
86 m.setflag('a', want)
87 self.assertEqual(want, m.flags('a'))
88 self.assertEqual('a\0' + HASH_1 + want + '\n' + A_SHORT_MANIFEST,
89 m.text())
90
73 91 def testCopy(self):
74 m = manifestmod._lazymanifest(A_SHORT_MANIFEST)
75 m['a'] = binascii.unhexlify(HASH_1), ''
92 m = parsemanifest(A_SHORT_MANIFEST)
93 m['a'] = binascii.unhexlify(HASH_1)
76 94 m2 = m.copy()
77 95 del m
78 96 del m2 # make sure we don't double free() anything
@@ -80,65 +98,74 b' class testmanifest(unittest.TestCase):'
80 98 def testCompaction(self):
81 99 unhex = binascii.unhexlify
82 100 h1, h2 = unhex(HASH_1), unhex(HASH_2)
83 m = manifestmod._lazymanifest(A_SHORT_MANIFEST)
84 m['alpha'] = h1, ''
85 m['beta'] = h2, ''
101 m = parsemanifest(A_SHORT_MANIFEST)
102 m['alpha'] = h1
103 m['beta'] = h2
86 104 del m['foo']
87 105 want = 'alpha\0%s\nbar/baz/qux.py\0%sl\nbeta\0%s\n' % (
88 106 HASH_1, HASH_2, HASH_2)
89 107 self.assertEqual(want, m.text())
90 108 self.assertEqual(3, len(m))
91 self.assertEqual((h1, ''), m['alpha'])
92 self.assertEqual((h2, ''), m['beta'])
109 self.assertEqual(['alpha', 'bar/baz/qux.py', 'beta'], list(m))
110 self.assertEqual(h1, m['alpha'])
111 self.assertEqual(h2, m['bar/baz/qux.py'])
112 self.assertEqual(h2, m['beta'])
113 self.assertEqual('', m.flags('alpha'))
114 self.assertEqual('l', m.flags('bar/baz/qux.py'))
115 self.assertEqual('', m.flags('beta'))
93 116 self.assertRaises(KeyError, lambda : m['foo'])
94 w = [('alpha', h1, ''), ('bar/baz/qux.py', h2, 'l'), ('beta', h2, '')]
95 self.assertEqual(w, list(m.iterentries()))
96 117
97 118 def testSetGetNodeSuffix(self):
98 clean = manifestmod._lazymanifest(A_SHORT_MANIFEST)
99 m = manifestmod._lazymanifest(A_SHORT_MANIFEST)
100 h, f = m['foo']
101 want = h + 'a', f
119 clean = parsemanifest(A_SHORT_MANIFEST)
120 m = parsemanifest(A_SHORT_MANIFEST)
121 h = m['foo']
122 f = m.flags('foo')
123 want = h + 'a'
102 124 # Merge code wants to set 21-byte fake hashes at times
103 125 m['foo'] = want
104 126 self.assertEqual(want, m['foo'])
105 self.assertEqual([('bar/baz/qux.py', binascii.unhexlify(HASH_2), 'l'),
106 ('foo', binascii.unhexlify(HASH_1) + 'a', '')],
107 list(m.iterentries()))
127 self.assertEqual([('bar/baz/qux.py', binascii.unhexlify(HASH_2)),
128 ('foo', binascii.unhexlify(HASH_1) + 'a')],
129 list(m.iteritems()))
108 130 # Sometimes it even tries a 22-byte fake hash, but we can
109 131 # return 21 and it'll work out
110 m['foo'] = want[0] + '+', f
132 m['foo'] = want + '+'
111 133 self.assertEqual(want, m['foo'])
112 134 # make sure the suffix survives a copy
113 m2 = m.filtercopy(lambda x: x == 'foo')
135 match = matchmod.match('', '', ['re:foo'])
136 m2 = m.matches(match)
114 137 self.assertEqual(want, m2['foo'])
115 138 self.assertEqual(1, len(m2))
116 139 self.assertEqual(('foo\0%s\n' % HASH_1), m2.text())
117 140 m2 = m.copy()
118 141 self.assertEqual(want, m2['foo'])
119 142 # suffix with iteration
120 self.assertEqual([('bar/baz/qux.py', binascii.unhexlify(HASH_2), 'l'),
121 ('foo', want[0], '')], list(m.iterentries()))
143 self.assertEqual([('bar/baz/qux.py', binascii.unhexlify(HASH_2)),
144 ('foo', want)],
145 list(m.iteritems()))
146
122 147 # shows up in diff
123 self.assertEqual({'foo': (want, (h, ''))}, m.diff(clean))
124 self.assertEqual({'foo': ((h, ''), want)}, clean.diff(m))
148 self.assertEqual({'foo': ((want, f), (h, ''))}, m.diff(clean))
149 self.assertEqual({'foo': ((h, ''), (want, f))}, clean.diff(m))
125 150
126 def testFilterCopyException(self):
127 m = manifestmod._lazymanifest(A_SHORT_MANIFEST)
151 def testMatchException(self):
152 m = parsemanifest(A_SHORT_MANIFEST)
153 match = matchmod.match('', '', ['re:.*'])
128 154 def filt(path):
129 155 if path == 'foo':
130 156 assert False
131 157 return True
132 self.assertRaises(AssertionError, m.filtercopy, filt)
158 match.matchfn = filt
159 self.assertRaises(AssertionError, m.matches, match)
133 160
134 161 def testRemoveItem(self):
135 m = manifestmod._lazymanifest(A_SHORT_MANIFEST)
162 m = parsemanifest(A_SHORT_MANIFEST)
136 163 del m['foo']
137 164 self.assertRaises(KeyError, lambda : m['foo'])
138 165 self.assertEqual(1, len(m))
139 166 self.assertEqual(1, len(list(m)))
140 167 # now restore and make sure everything works right
141 m['foo'] = 'a' * 20, ''
168 m['foo'] = 'a' * 20
142 169 self.assertEqual(2, len(m))
143 170 self.assertEqual(2, len(list(m)))
144 171
@@ -146,9 +173,9 b' class testmanifest(unittest.TestCase):'
146 173 MISSING = (None, '')
147 174 addl = 'z-only-in-left\0' + HASH_1 + '\n'
148 175 addr = 'z-only-in-right\0' + HASH_2 + 'x\n'
149 left = manifestmod._lazymanifest(
176 left = parsemanifest(
150 177 A_SHORT_MANIFEST.replace(HASH_1, HASH_3 + 'x') + addl)
151 right = manifestmod._lazymanifest(A_SHORT_MANIFEST + addr)
178 right = parsemanifest(A_SHORT_MANIFEST + addr)
152 179 want = {
153 180 'foo': ((binascii.unhexlify(HASH_3), 'x'),
154 181 (binascii.unhexlify(HASH_1), '')),
@@ -162,14 +189,14 b' class testmanifest(unittest.TestCase):'
162 189 'foo': (MISSING, (binascii.unhexlify(HASH_3), 'x')),
163 190 'z-only-in-left': (MISSING, (binascii.unhexlify(HASH_1), '')),
164 191 }
165 self.assertEqual(want, manifestmod._lazymanifest('').diff(left))
192 self.assertEqual(want, parsemanifest('').diff(left))
166 193
167 194 want = {
168 195 'bar/baz/qux.py': ((binascii.unhexlify(HASH_2), 'l'), MISSING),
169 196 'foo': ((binascii.unhexlify(HASH_3), 'x'), MISSING),
170 197 'z-only-in-left': ((binascii.unhexlify(HASH_1), ''), MISSING),
171 198 }
172 self.assertEqual(want, left.diff(manifestmod._lazymanifest('')))
199 self.assertEqual(want, left.diff(parsemanifest('')))
173 200 copy = right.copy()
174 201 del copy['z-only-in-right']
175 202 del right['foo']
@@ -179,7 +206,7 b' class testmanifest(unittest.TestCase):'
179 206 }
180 207 self.assertEqual(want, right.diff(copy))
181 208
182 short = manifestmod._lazymanifest(A_SHORT_MANIFEST)
209 short = parsemanifest(A_SHORT_MANIFEST)
183 210 pruned = short.copy()
184 211 del pruned['foo']
185 212 want = {
@@ -200,32 +227,32 b' class testmanifest(unittest.TestCase):'
200 227 backwards = ''.join(
201 228 l + '\n' for l in reversed(A_SHORT_MANIFEST.split('\n')) if l)
202 229 try:
203 manifestmod._lazymanifest(backwards)
230 parsemanifest(backwards)
204 231 self.fail('Should have raised ValueError')
205 232 except ValueError, v:
206 233 self.assertIn('Manifest lines not in sorted order.', str(v))
207 234
208 235 def testNoTerminalNewline(self):
209 236 try:
210 manifestmod._lazymanifest(A_SHORT_MANIFEST + 'wat')
237 parsemanifest(A_SHORT_MANIFEST + 'wat')
211 238 self.fail('Should have raised ValueError')
212 239 except ValueError, v:
213 240 self.assertIn('Manifest did not end in a newline.', str(v))
214 241
215 242 def testNoNewLineAtAll(self):
216 243 try:
217 manifestmod._lazymanifest('wat')
244 parsemanifest('wat')
218 245 self.fail('Should have raised ValueError')
219 246 except ValueError, v:
220 247 self.assertIn('Manifest did not end in a newline.', str(v))
221 248
222 249 def testHugeManifest(self):
223 m = manifestmod._lazymanifest(A_HUGE_MANIFEST)
250 m = parsemanifest(A_HUGE_MANIFEST)
224 251 self.assertEqual(HUGE_MANIFEST_ENTRIES, len(m))
225 252 self.assertEqual(len(m), len(list(m)))
226 253
227 254 def testIntersectFiles(self):
228 m = manifestmod.manifestdict(A_HUGE_MANIFEST)
255 m = parsemanifest(A_HUGE_MANIFEST)
229 256 m2 = m.intersectfiles(['file1', 'file200', 'file300'])
230 257 w = ('file1\0%sx\n'
231 258 'file200\0%sl\n'
General Comments 0
You need to be logged in to leave comments. Login now