38
46
self.assertTrue('number' in s)
39
47
self.assertFalse('color' in s)
40
48
self.assertFalse('42' in s)
41
self.assertEquals(list(s.iter_pairs()),
49
self.assertEqual(list(s.iter_pairs()),
42
50
[('name', 'fred'), ('number', '42')])
43
self.assertEquals(s.get('number'), '42')
44
self.assertEquals(s.get('name'), 'fred')
51
self.assertEqual(s.get('number'), '42')
52
self.assertEqual(s.get('name'), 'fred')
46
54
def test_value_checks(self):
47
55
"""rio checks types on construction"""
48
56
# these aren't enforced at construction time
49
57
## self.assertRaises(ValueError,
50
58
## Stanza, complex=42 + 3j)
51
## self.assertRaises(ValueError,
59
## self.assertRaises(ValueError,
52
60
## Stanza, several=range(10))
54
62
def test_empty_value(self):
101
115
s = read_stanza(lines)
102
116
self.assertTrue('revision' in s)
103
117
self.assertEqualDiff(s.get('revision'), 'mbp@sourcefrog.net-123-abc')
104
self.assertEquals(list(s.iter_pairs()),
118
self.assertEqual(list(s.iter_pairs()),
105
119
[('revision', 'mbp@sourcefrog.net-123-abc'),
106
120
('timestamp', '1130653962'),
107
121
('timezone', '36000'),
108
122
('committer', "Martin Pool <mbp@test.sourcefrog.net>")])
109
self.assertEquals(len(s), 4)
123
self.assertEqual(len(s), 4)
111
125
def test_repeated_field(self):
112
126
"""Repeated field in rio"""
114
for k, v in [('a', '10'), ('b', '20'), ('a', '100'), ('b', '200'),
128
for k, v in [('a', '10'), ('b', '20'), ('a', '100'), ('b', '200'),
115
129
('a', '1000'), ('b', '2000')]:
117
131
s2 = read_stanza(s.to_lines())
118
self.assertEquals(s, s2)
119
self.assertEquals(s.get_all('a'), map(str, [10, 100, 1000]))
120
self.assertEquals(s.get_all('b'), map(str, [20, 200, 2000]))
132
self.assertEqual(s, s2)
133
self.assertEqual(s.get_all('a'), map(str, [10, 100, 1000]))
134
self.assertEqual(s.get_all('b'), map(str, [20, 200, 2000]))
122
136
def test_backslash(self):
123
137
s = Stanza(q='\\')
124
138
t = s.to_string()
125
139
self.assertEqualDiff(t, 'q: \\\n')
126
140
s2 = read_stanza(s.to_lines())
127
self.assertEquals(s, s2)
141
self.assertEqual(s, s2)
129
143
def test_blank_line(self):
130
144
s = Stanza(none='', one='\n', two='\n\n')
131
145
self.assertEqualDiff(s.to_string(), """\
139
153
s2 = read_stanza(s.to_lines())
140
self.assertEquals(s, s2)
154
self.assertEqual(s, s2)
142
156
def test_whitespace_value(self):
143
157
s = Stanza(space=' ', tabs='\t\t\t', combo='\n\t\t\n')
144
158
self.assertEqualDiff(s.to_string(), """\
151
165
s2 = read_stanza(s.to_lines())
152
self.assertEquals(s, s2)
166
self.assertEqual(s, s2)
167
self.rio_file_stanzas([s])
154
169
def test_quoted(self):
155
170
"""rio quoted string cases"""
156
s = Stanza(q1='"hello"',
171
s = Stanza(q1='"hello"',
158
173
q3='\n\n"for"\n',
159
174
q4='for\n"\nfor',
166
181
s2 = read_stanza(s.to_lines())
167
self.assertEquals(s, s2)
182
self.assertEqual(s, s2)
183
# apparent bug in read_stanza
184
# s3 = read_stanza(self.stanzas_to_str([s]))
185
# self.assertEqual(s, s3)
169
187
def test_read_empty(self):
170
188
"""Detect end of rio file"""
171
189
s = read_stanza([])
172
190
self.assertEqual(s, None)
173
191
self.assertTrue(s is None)
193
def test_read_nul_byte(self):
194
"""File consisting of a nul byte causes an error."""
195
self.assertRaises(ValueError, read_stanza, ['\0'])
197
def test_read_nul_bytes(self):
198
"""File consisting of many nul bytes causes an error."""
199
self.assertRaises(ValueError, read_stanza, ['\0' * 100])
175
201
def test_read_iter(self):
176
202
"""Read several stanzas from file"""
177
203
tmpf = TemporaryFile()
214
240
s = read_stanza(tmpf)
215
self.assertEquals(s, Stanza(version_header='1'))
241
self.assertEqual(s, Stanza(version_header='1'))
216
242
s = read_stanza(tmpf)
217
self.assertEquals(s, Stanza(name="foo", val='123'))
243
self.assertEqual(s, Stanza(name="foo", val='123'))
218
244
s = read_stanza(tmpf)
219
245
self.assertEqualDiff(s.get('name'), 'quoted')
220
246
self.assertEqualDiff(s.get('address'), ' "Willowglen"\n 42 Wallaby Way\n Sydney')
221
247
s = read_stanza(tmpf)
222
self.assertEquals(s, Stanza(name="bar", val='129319'))
248
self.assertEqual(s, Stanza(name="bar", val='129319'))
223
249
s = read_stanza(tmpf)
224
self.assertEquals(s, None)
250
self.assertEqual(s, None)
251
self.check_rio_file(tmpf)
253
def check_rio_file(self, real_file):
255
read_write = rio_file(RioReader(real_file)).read()
257
self.assertEqual(read_write, real_file.read())
260
def stanzas_to_str(stanzas):
261
return rio_file(stanzas).read()
263
def rio_file_stanzas(self, stanzas):
264
new_stanzas = list(RioReader(rio_file(stanzas)))
265
self.assertEqual(new_stanzas, stanzas)
226
267
def test_tricky_quoted(self):
227
268
tmpf = TemporaryFile()
274
315
for expected in expected_vals:
275
316
stanza = read_stanza(tmpf)
276
self.assertEquals(len(stanza), 1)
317
self.rio_file_stanzas([stanza])
318
self.assertEqual(len(stanza), 1)
277
319
self.assertEqualDiff(stanza.get('s'), expected)
279
321
def test_write_empty_stanza(self):
280
322
"""Write empty stanza"""
281
323
l = list(Stanza().to_lines())
282
self.assertEquals(l, [])
324
self.assertEqual(l, [])
326
def test_rio_raises_type_error(self):
327
"""TypeError on adding invalid type to Stanza"""
329
self.assertRaises(TypeError, s.add, 'foo', {})
331
def test_rio_raises_type_error_key(self):
332
"""TypeError on adding invalid type to Stanza"""
334
self.assertRaises(TypeError, s.add, 10, {})
336
def test_rio_unicode(self):
337
uni_data = u'\N{KATAKANA LETTER O}'
338
s = Stanza(foo=uni_data)
339
self.assertEqual(s.get('foo'), uni_data)
340
raw_lines = s.to_lines()
341
self.assertEqual(raw_lines,
342
['foo: ' + uni_data.encode('utf-8') + '\n'])
343
new_s = read_stanza(raw_lines)
344
self.assertEqual(new_s.get('foo'), uni_data)
346
def test_rio_to_unicode(self):
347
uni_data = u'\N{KATAKANA LETTER O}'
348
s = Stanza(foo=uni_data)
349
unicode_str = s.to_unicode()
350
self.assertEqual(u'foo: %s\n' % (uni_data,), unicode_str)
351
new_s = rio.read_stanza_unicode(unicode_str.splitlines(True))
352
self.assertEqual(uni_data, new_s.get('foo'))
354
def test_nested_rio_unicode(self):
355
uni_data = u'\N{KATAKANA LETTER O}'
356
s = Stanza(foo=uni_data)
357
parent_stanza = Stanza(child=s.to_unicode())
358
raw_lines = parent_stanza.to_lines()
359
self.assertEqual(['child: foo: ' + uni_data.encode('utf-8') + '\n',
362
new_parent = read_stanza(raw_lines)
363
child_text = new_parent.get('child')
364
self.assertEqual(u'foo: %s\n' % uni_data, child_text)
365
new_child = rio.read_stanza_unicode(child_text.splitlines(True))
366
self.assertEqual(uni_data, new_child.get('foo'))
368
def mail_munge(self, lines, dos_nl=True):
371
line = re.sub(' *\n', '\n', line)
373
line = re.sub('([^\r])\n', '\\1\r\n', line)
374
new_lines.append(line)
377
def test_patch_rio(self):
378
stanza = Stanza(data='#\n\r\\r ', space=' ' * 255, hash='#' * 255)
379
lines = rio.to_patch_lines(stanza)
381
self.assertContainsRe(line, '^# ')
382
self.assertTrue(72 >= len(line))
383
for line in rio.to_patch_lines(stanza, max_width=12):
384
self.assertTrue(12 >= len(line))
385
new_stanza = rio.read_patch_stanza(self.mail_munge(lines,
387
lines = self.mail_munge(lines)
388
new_stanza = rio.read_patch_stanza(lines)
389
self.assertEqual('#\n\r\\r ', new_stanza.get('data'))
390
self.assertEqual(' '* 255, new_stanza.get('space'))
391
self.assertEqual('#'* 255, new_stanza.get('hash'))
393
def test_patch_rio_linebreaks(self):
394
stanza = Stanza(breaktest='linebreak -/'*30)
395
self.assertContainsRe(rio.to_patch_lines(stanza, 71)[0],
397
stanza = Stanza(breaktest='linebreak-/'*30)
398
self.assertContainsRe(rio.to_patch_lines(stanza, 70)[0],
400
stanza = Stanza(breaktest='linebreak/'*30)
401
self.assertContainsRe(rio.to_patch_lines(stanza, 70)[0],