22
22
but this depends on the transport.
29
27
from tempfile import TemporaryFile
34
29
from bzrlib.tests import TestCaseInTempDir, TestCase
35
from bzrlib.rio import (RioWriter, Stanza, read_stanza, read_stanzas, rio_file,
30
from bzrlib.rio import RioWriter, Stanza, read_stanza, read_stanzas
39
33
class TestRio(TestCase):
41
35
def test_stanza(self):
42
36
"""Construct rio stanza in memory"""
43
s = Stanza(number='42', name="fred")
37
s = Stanza(number=42, name="fred")
44
38
self.assertTrue('number' in s)
45
39
self.assertFalse('color' in s)
46
self.assertFalse('42' in s)
40
self.assertFalse(42 in s)
47
41
self.assertEquals(list(s.iter_pairs()),
48
[('name', 'fred'), ('number', '42')])
49
self.assertEquals(s.get('number'), '42')
42
[('name', 'fred'), ('number', 42)])
43
self.assertEquals(s.get('number'), 42)
50
44
self.assertEquals(s.get('name'), 'fred')
52
46
def test_value_checks(self):
66
60
def test_to_lines(self):
67
61
"""Write simple rio stanza to string"""
68
s = Stanza(number='42', name='fred')
62
s = Stanza(number=42, name='fred')
69
63
self.assertEquals(list(s.to_lines()),
73
def test_as_dict(self):
74
"""Convert rio Stanza to dictionary"""
75
s = Stanza(number='42', name='fred')
77
self.assertEquals(sd, dict(number='42', name='fred'))
79
67
def test_to_file(self):
80
68
"""Write rio to file"""
81
69
tmpf = TemporaryFile()
82
s = Stanza(a_thing='something with "quotes like \\"this\\""', number='42', name='fred')
70
s = Stanza(a_thing='something with "quotes like \\"this\\""', number=42, name='fred')
85
73
self.assertEqualDiff(tmpf.read(), r'''
131
135
self.assertEquals(s.get_all('a'), map(str, [10, 100, 1000]))
132
136
self.assertEquals(s.get_all('b'), map(str, [20, 200, 2000]))
134
def test_backslash(self):
138
def test_longint(self):
139
"""rio packing long integers"""
140
s = Stanza(x=-12345678901234567890,
143
s2 = read_stanza(lines)
144
self.assertEquals(s, s2)
146
def test_quoted_0(self):
147
"""Backslash quoted cases"""
135
148
s = Stanza(q='\\')
136
149
t = s.to_string()
137
self.assertEqualDiff(t, 'q: \\\n')
138
s2 = read_stanza(s.to_lines())
139
self.assertEquals(s, s2)
141
def test_blank_line(self):
142
s = Stanza(none='', one='\n', two='\n\n')
143
self.assertEqualDiff(s.to_string(), """\
151
s2 = read_stanza(s.to_lines())
152
self.assertEquals(s, s2)
154
def test_whitespace_value(self):
155
s = Stanza(space=' ', tabs='\t\t\t', combo='\n\t\t\n')
156
self.assertEqualDiff(s.to_string(), """\
163
s2 = read_stanza(s.to_lines())
164
self.assertEquals(s, s2)
165
self.rio_file_stanzas([s])
150
self.assertEqualDiff(t, 'q "\\\\"\n')
151
s2 = read_stanza(s.to_lines())
152
self.assertEquals(s, s2)
154
def test_quoted_1(self):
155
"""Backslash quoted cases"""
156
s = Stanza(q=r'\"\"')
157
self.assertEqualDiff(s.to_string(), r'q "\\\"\\\""' + '\n')
159
def test_quoted_4(self):
160
s = Stanza(q=r'""""')
162
self.assertEqualDiff(t, r'q "\"\"\"\""' + '\n')
163
s2 = read_stanza(s.to_lines())
164
self.assertEquals(s, s2)
166
def test_quoted_5(self):
167
s = Stanza(q=r'\\\\\"')
169
s2 = read_stanza(s.to_lines())
170
self.assertEquals(s, s2)
172
def test_quoted_6(self):
180
s2 = read_stanza(s.to_lines())
181
self.assertEquals(s2['q'], qval)
183
def test_quoted_7(self):
192
s2 = read_stanza(s.to_lines())
193
self.assertEquals(s2['q'], qval)
195
def test_quoted_8(self):
201
s2 = read_stanza(s.to_lines())
202
self.assertEquals(s2['q'], qval)
167
204
def test_quoted(self):
168
205
"""rio quoted string cases"""
169
206
s = Stanza(q1='"hello"',
192
226
"""Read several stanzas from file"""
193
227
tmpf = TemporaryFile()
204
238
reader = read_stanzas(tmpf)
205
239
read_iter = iter(reader)
206
240
stuff = list(reader)
207
241
self.assertEqual(stuff,
208
[ Stanza(version_header='1'),
209
Stanza(name="foo", val='123'),
210
Stanza(name="bar", val='129319'), ])
242
[ Stanza(version_header=1),
243
Stanza(name="foo", val=123),
244
Stanza(name="bar", val=129319), ])
212
246
def test_read_several(self):
213
247
"""Read several stanzas from file"""
214
248
tmpf = TemporaryFile()
222
address: "Willowglen"
256
address " \\"Willowglen\\"
230
264
s = read_stanza(tmpf)
231
self.assertEquals(s, Stanza(version_header='1'))
265
self.assertEquals(s, Stanza(version_header=1))
232
266
s = read_stanza(tmpf)
233
self.assertEquals(s, Stanza(name="foo", val='123'))
267
self.assertEquals(s, Stanza(name="foo", val=123))
234
268
s = read_stanza(tmpf)
235
269
self.assertEqualDiff(s.get('name'), 'quoted')
236
270
self.assertEqualDiff(s.get('address'), ' "Willowglen"\n 42 Wallaby Way\n Sydney')
237
271
s = read_stanza(tmpf)
238
self.assertEquals(s, Stanza(name="bar", val='129319'))
272
self.assertEquals(s, Stanza(name="bar", val=129319))
239
273
s = read_stanza(tmpf)
240
274
self.assertEquals(s, None)
241
self.check_rio_file(tmpf)
243
def check_rio_file(self, real_file):
245
read_write = rio_file(RioReader(real_file)).read()
247
self.assertEquals(read_write, real_file.read())
250
def stanzas_to_str(stanzas):
251
return rio_file(stanzas).read()
253
def rio_file_stanzas(self, stanzas):
254
new_stanzas = list(RioReader(rio_file(stanzas)))
255
self.assertEqual(new_stanzas, stanzas)
257
276
def test_tricky_quoted(self):
258
277
tmpf = TemporaryFile()
305
s "backslashes\\\\\\"
309
"""[1:]) # remove initial newline
292
311
expected_vals = ['"one"',
305
324
for expected in expected_vals:
306
325
stanza = read_stanza(tmpf)
307
self.rio_file_stanzas([stanza])
308
326
self.assertEquals(len(stanza), 1)
309
327
self.assertEqualDiff(stanza.get('s'), expected)
329
def test_write_bool(self):
330
"""Write bool to rio"""
331
l = list(Stanza(my_bool=True).to_lines())
332
self.assertEquals(l, ['my_bool 1\n'])
311
334
def test_write_empty_stanza(self):
312
335
"""Write empty stanza"""
313
336
l = list(Stanza().to_lines())
314
337
self.assertEquals(l, [])
316
def test_rio_raises_type_error(self):
317
"""TypeError on adding invalid type to Stanza"""
319
self.assertRaises(TypeError, s.add, 'foo', {})
321
def test_rio_raises_type_error_key(self):
322
"""TypeError on adding invalid type to Stanza"""
324
self.assertRaises(TypeError, s.add, 10, {})
326
def test_rio_unicode(self):
327
uni_data = u'\N{KATAKANA LETTER O}'
328
s = Stanza(foo=uni_data)
329
self.assertEquals(s.get('foo'), uni_data)
330
raw_lines = s.to_lines()
331
self.assertEquals(raw_lines,
332
['foo: ' + uni_data.encode('utf-8') + '\n'])
333
new_s = read_stanza(raw_lines)
334
self.assertEquals(new_s.get('foo'), uni_data)
336
def test_rio_to_unicode(self):
337
uni_data = u'\N{KATAKANA LETTER O}'
338
s = Stanza(foo=uni_data)
339
unicode_str = s.to_unicode()
340
self.assertEqual(u'foo: %s\n' % (uni_data,), unicode_str)
341
new_s = rio.read_stanza_unicode(unicode_str.splitlines(True))
342
self.assertEqual(uni_data, new_s.get('foo'))
344
def test_nested_rio_unicode(self):
345
uni_data = u'\N{KATAKANA LETTER O}'
346
s = Stanza(foo=uni_data)
347
parent_stanza = Stanza(child=s.to_unicode())
348
raw_lines = parent_stanza.to_lines()
349
self.assertEqual(['child: foo: ' + uni_data.encode('utf-8') + '\n',
352
new_parent = read_stanza(raw_lines)
353
child_text = new_parent.get('child')
354
self.assertEqual(u'foo: %s\n' % uni_data, child_text)
355
new_child = rio.read_stanza_unicode(child_text.splitlines(True))
356
self.assertEqual(uni_data, new_child.get('foo'))
358
def mail_munge(self, lines, dos_nl=True):
361
line = re.sub(' *\n', '\n', line)
363
line = re.sub('([^\r])\n', '\\1\r\n', line)
364
new_lines.append(line)
367
def test_patch_rio(self):
368
stanza = Stanza(data='#\n\r\\r ', space=' ' * 255, hash='#' * 255)
369
lines = rio.to_patch_lines(stanza)
371
self.assertContainsRe(line, '^# ')
372
self.assertTrue(72 >= len(line))
373
for line in rio.to_patch_lines(stanza, max_width=12):
374
self.assertTrue(12 >= len(line))
375
new_stanza = rio.read_patch_stanza(self.mail_munge(lines,
377
lines = self.mail_munge(lines)
378
new_stanza = rio.read_patch_stanza(lines)
379
self.assertEqual('#\n\r\\r ', new_stanza.get('data'))
380
self.assertEqual(' '* 255, new_stanza.get('space'))
381
self.assertEqual('#'* 255, new_stanza.get('hash'))
383
def test_patch_rio_linebreaks(self):
384
stanza = Stanza(breaktest='linebreak -/'*30)
385
self.assertContainsRe(rio.to_patch_lines(stanza, 71)[0],
387
stanza = Stanza(breaktest='linebreak-/'*30)
388
self.assertContainsRe(rio.to_patch_lines(stanza, 70)[0],
390
stanza = Stanza(breaktest='linebreak/'*30)
391
self.assertContainsRe(rio.to_patch_lines(stanza, 70)[0],