13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Tests for rio serialization
28
29
from tempfile import TemporaryFile
30
34
from bzrlib.tests import TestCaseInTempDir, TestCase
31
from bzrlib.rio import RioWriter, Stanza, read_stanza, read_stanzas
35
from bzrlib.rio import (RioWriter, Stanza, read_stanza, read_stanzas, rio_file,
34
39
class TestRio(TestCase):
49
54
# these aren't enforced at construction time
50
55
## self.assertRaises(ValueError,
51
56
## Stanza, complex=42 + 3j)
52
## self.assertRaises(ValueError,
57
## self.assertRaises(ValueError,
53
58
## Stanza, several=range(10))
55
60
def test_empty_value(self):
118
123
def test_repeated_field(self):
119
124
"""Repeated field in rio"""
121
for k, v in [('a', '10'), ('b', '20'), ('a', '100'), ('b', '200'),
126
for k, v in [('a', '10'), ('b', '20'), ('a', '100'), ('b', '200'),
122
127
('a', '1000'), ('b', '2000')]:
124
129
s2 = read_stanza(s.to_lines())
149
154
def test_whitespace_value(self):
150
155
s = Stanza(space=' ', tabs='\t\t\t', combo='\n\t\t\n')
151
156
self.assertEqualDiff(s.to_string(), """\
158
163
s2 = read_stanza(s.to_lines())
159
164
self.assertEquals(s, s2)
165
self.rio_file_stanzas([s])
161
167
def test_quoted(self):
162
168
"""rio quoted string cases"""
163
s = Stanza(q1='"hello"',
169
s = Stanza(q1='"hello"',
165
171
q3='\n\n"for"\n',
166
172
q4='for\n"\nfor',
173
179
s2 = read_stanza(s.to_lines())
174
180
self.assertEquals(s, s2)
181
# apparent bug in read_stanza
182
# s3 = read_stanza(self.stanzas_to_str([s]))
183
# self.assertEquals(s, s3)
176
185
def test_read_empty(self):
177
186
"""Detect end of rio file"""
178
187
s = read_stanza([])
179
188
self.assertEqual(s, None)
180
189
self.assertTrue(s is None)
182
191
def test_read_iter(self):
183
192
"""Read several stanzas from file"""
184
193
tmpf = TemporaryFile()
229
238
self.assertEquals(s, Stanza(name="bar", val='129319'))
230
239
s = read_stanza(tmpf)
231
240
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)
233
257
def test_tricky_quoted(self):
234
258
tmpf = TemporaryFile()
299
324
self.assertRaises(TypeError, s.add, 10, {})
301
326
def test_rio_unicode(self):
302
# intentionally use cStringIO which doesn't accomodate unencoded unicode objects
303
sio = cStringIO.StringIO()
304
327
uni_data = u'\N{KATAKANA LETTER O}'
305
328
s = Stanza(foo=uni_data)
306
329
self.assertEquals(s.get('foo'), uni_data)
310
333
new_s = read_stanza(raw_lines)
311
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],