75
76
'<Element attr="1">text\nmore</Element>')
77
78
self.assertEquals(element.pformat(),
79
'<Element attr="1">\n text\n more\n')
82
element = nodes.Element()
83
element += nodes.Element()
84
self.assert_(len(element))
86
self.assert_(not len(element))
88
def test_normal_attributes(self):
89
element = nodes.Element()
90
self.assert_(not element.has_key('foo'))
91
self.assertRaises(KeyError, element.__getitem__, 'foo')
92
element['foo'] = 'sometext'
93
self.assertEquals(element['foo'], 'sometext')
95
self.assertRaises(KeyError, element.__getitem__, 'foo')
97
def test_default_attributes(self):
98
element = nodes.Element()
99
self.assertEquals(element['ids'], [])
100
self.assertEquals(element.non_default_attributes(), {})
101
self.assert_(not element.is_not_default('ids'))
102
self.assert_(element['ids'] is not nodes.Element()['ids'])
103
element['ids'].append('someid')
104
self.assertEquals(element['ids'], ['someid'])
105
self.assertEquals(element.non_default_attributes(),
107
self.assert_(element.is_not_default('ids'))
109
def test_update_basic_atts(self):
110
element1 = nodes.Element(ids=['foo', 'bar'], test=['test1'])
111
element2 = nodes.Element(ids=['baz', 'qux'], test=['test2'])
112
element1.update_basic_atts(element2)
113
# 'ids' are appended because 'ids' is a basic attribute.
114
self.assertEquals(element1['ids'], ['foo', 'bar', 'baz', 'qux'])
115
# 'test' is not overwritten because it is not a basic attribute.
116
self.assertEquals(element1['test'], ['test1'])
118
def test_replace_self(self):
119
parent = nodes.Element(ids=['parent'])
120
child1 = nodes.Element(ids=['child1'])
121
grandchild = nodes.Element(ids=['grandchild'])
123
child2 = nodes.Element(ids=['child2'])
124
twins = [nodes.Element(ids=['twin%s' % i]) for i in (1, 2)]
126
child3 = nodes.Element(ids=['child3'])
127
child4 = nodes.Element(ids=['child4'])
128
parent += [child1, child2, child3, child4]
129
self.assertEquals(parent.pformat(), """\
130
<Element ids="parent">
131
<Element ids="child1">
132
<Element ids="grandchild">
133
<Element ids="child2">
134
<Element ids="twin1">
135
<Element ids="twin2">
136
<Element ids="child3">
137
<Element ids="child4">
139
# Replace child1 with the grandchild.
140
child1.replace_self(child1[0])
141
self.assertEquals(parent[0], grandchild)
142
# Assert that 'ids' have been updated.
143
self.assertEquals(grandchild['ids'], ['grandchild', 'child1'])
144
# Replace child2 with its children.
145
child2.replace_self(child2[:])
146
self.assertEquals(parent[1:3], twins)
147
# Assert that 'ids' have been propagated to first child.
148
self.assertEquals(twins[0]['ids'], ['twin1', 'child2'])
149
self.assertEquals(twins[1]['ids'], ['twin2'])
150
# Replace child3 with new child.
151
newchild = nodes.Element(ids=['newchild'])
152
child3.replace_self(newchild)
153
self.assertEquals(parent[3], newchild)
154
self.assertEquals(newchild['ids'], ['newchild', 'child3'])
155
# Crazy but possible case: Substitute child4 for itself.
156
child4.replace_self(child4)
157
# Make sure the 'child4' ID hasn't been duplicated.
158
self.assertEquals(child4['ids'], ['child4'])
159
self.assertEquals(len(parent), 5)
85
162
class MiscTests(unittest.TestCase):
105
182
normed = nodes.make_id(input)
106
183
self.assertEquals(normed, output)
185
def test_traverse(self):
188
e[0] += nodes.Element()
189
e[0] += nodes.TextElement()
190
e[0][1] += nodes.Text('some text')
193
self.assertEquals(list(e.traverse()),
194
[e, e[0], e[0][0], e[0][1], e[0][1][0], e[1], e[2]])
195
self.assertEquals(list(e.traverse(include_self=0)),
196
[e[0], e[0][0], e[0][1], e[0][1][0], e[1], e[2]])
197
self.assertEquals(list(e.traverse(descend=0)),
199
self.assertEquals(list(e[0].traverse(descend=0, ascend=1)),
201
self.assertEquals(list(e[0][0].traverse(descend=0, ascend=1)),
202
[e[0][0], e[0][1], e[1], e[2]])
203
self.assertEquals(list(e[0][0].traverse(descend=0, siblings=1)),
205
self.testlist = e[0:2]
206
self.assertEquals(list(e.traverse(condition=self.not_in_testlist)),
207
[e, e[0][0], e[0][1], e[0][1][0], e[2]])
208
# Return siblings despite siblings=0 because ascend is true.
209
self.assertEquals(list(e[1].traverse(ascend=1, siblings=0)),
211
self.assertEquals(list(e[0].traverse()),
212
[e[0], e[0][0], e[0][1], e[0][1][0]])
213
self.testlist = [e[0][0], e[0][1]]
214
self.assertEquals(list(e[0].traverse(condition=self.not_in_testlist)),
216
self.testlist.append(e[0][1][0])
217
self.assertEquals(list(e[0].traverse(condition=self.not_in_testlist)),
219
self.assertEquals(list(e.traverse(nodes.TextElement)), [e[0][1]])
221
def test_next_node(self):
224
e[0] += nodes.Element()
225
e[0] += nodes.TextElement()
226
e[0][1] += nodes.Text('some text')
229
self.testlist = [e[0], e[0][1], e[1]]
230
compare = [(e, e[0][0]),
232
(e[0][0], e[0][1][0]),
233
(e[0][1], e[0][1][0]),
237
for node, next_node in compare:
238
self.assertEquals(node.next_node(self.not_in_testlist, ascend=1),
240
self.assertEquals(e[0][0].next_node(ascend=1), e[0][1])
241
self.assertEquals(e[2].next_node(), None)
243
def not_in_testlist(self, x):
244
return x not in self.testlist
247
grandchild = nodes.Text('rawsource')
248
child = nodes.emphasis('rawsource', grandchild, att='child')
249
e = nodes.Element('rawsource', child, att='e')
252
self.assert_(e is not e_copy)
253
# Internal attributes (like `rawsource`) are not copied.
254
self.assertEquals(e.rawsource, 'rawsource')
255
self.assertEquals(e_copy.rawsource, '')
256
self.assertEquals(e_copy['att'], 'e')
257
# Children are not copied.
258
self.assertEquals(len(e_copy), 0)
260
e_deepcopy = e.deepcopy()
261
self.assertEquals(e_deepcopy.rawsource, '')
262
self.assertEquals(e_deepcopy['att'], 'e')
263
# Children are copied recursively.
264
self.assertEquals(e_deepcopy[0][0], grandchild)
265
self.assert_(e_deepcopy[0][0] is not grandchild)
266
self.assertEquals(e_deepcopy[0]['att'], 'child')
109
269
class TreeCopyVisitorTests(unittest.TestCase):
123
283
def compare_trees(self, one, two):
124
284
self.assertEquals(one.__class__, two.__class__)
125
285
self.assertNotEquals(id(one), id(two))
126
children1 = one.get_children()
127
children2 = two.get_children()
128
self.assertEquals(len(children1), len(children2))
129
for i in range(len(children1)):
130
self.compare_trees(children1[i], children2[i])
286
self.assertEquals(len(one.children), len(two.children))
287
for i in range(len(one.children)):
288
self.compare_trees(one.children[i], two.children[i])
132
290
def test_copy_whole(self):
133
291
visitor = nodes.TreeCopyVisitor(self.document)
148
306
normed = nodes.fully_normalize_name(input)
149
307
self.assertEquals(normed, output)
309
def test_set_id_default(self):
311
document = utils.new_document('test')
313
element = nodes.Element(names=['test'])
314
document.set_id(element)
315
self.assertEquals(element['ids'], ['test'])
317
element = nodes.Element()
318
document.set_id(element)
319
self.assertEquals(element['ids'], ['id1'])
321
def test_set_id_custom(self):
323
document = utils.new_document('test')
325
document.settings.id_prefix = 'prefix'
326
document.settings.auto_id_prefix = 'auto'
328
element = nodes.Element(names=['test'])
329
document.set_id(element)
330
self.assertEquals(element['ids'], ['prefixtest'])
332
element = nodes.Element()
333
document.set_id(element)
334
self.assertEquals(element['ids'], ['prefixauto1'])
152
337
if __name__ == '__main__':