Skip to content

Commit a186503

Browse files
committed
Update unittests (#16, #17)
1 parent ed53b54 commit a186503

File tree

2 files changed

+250
-66
lines changed

2 files changed

+250
-66
lines changed
Lines changed: 60 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
1-
from typing import Iterator
1+
from typing import Iterator, Optional
22
import unittest
33

44
from w3.dom import Node
55
from w3.dom import NodeType
66
from w3.dom import NodeList
77

88

9-
def _make_nodes(n: int) -> Iterator[Node]:
9+
def _create_document_node():
10+
return Node(node_type=NodeType.DOCUMENT_NODE,
11+
node_name='#document',
12+
owner_document=None)
13+
14+
15+
def _create_text_node(document: Node):
16+
assert document.node_type == NodeType.DOCUMENT_NODE
17+
return Node(node_type=NodeType.TEXT_NODE,
18+
node_name='#text',
19+
owner_document=document)
20+
21+
22+
def _make_nodes(n: int, document: Optional[Node] = None) -> Iterator[Node]:
1023
"""Accessor to create `n` random nodes immediatly.
1124
1225
Args:
@@ -15,17 +28,21 @@ def _make_nodes(n: int) -> Iterator[Node]:
1528
Yields:
1629
A randomly generated node.
1730
"""
31+
if document is None:
32+
document = _create_document_node()
1833
for _ in range(n):
19-
yield Node(NodeType.TEXT_NODE, '#text')
34+
yield _create_text_node(document)
2035

2136

22-
class Test_NodeList(unittest.TestCase):
23-
def testInit(self):
37+
class Test_Dunder(unittest.TestCase):
38+
def testInit_Empty(self):
2439
NodeList()
25-
# Initiate with a node
40+
41+
def testInit_SingleNode(self):
2642
node = next(_make_nodes(1))
2743
NodeList([node])
28-
# Initiate with multiple nodes.
44+
45+
def testInit_MultipleNodes(self):
2946
NodeList(_make_nodes(4))
3047

3148
def testIter(self):
@@ -51,39 +68,56 @@ def testGetItem(self):
5168
self.assertEqual(node_list[i], nodes[i])
5269

5370
def testSetItem(self):
54-
node = Node(NodeType.TEXT_NODE,
55-
'#text')
56-
node_list = NodeList(_make_nodes(4))
57-
node_list[2] = node
58-
self.assertEqual(node_list[2], node)
71+
document = _create_document_node()
72+
text_node = _create_text_node(document)
73+
node_list = NodeList(_make_nodes(4, document))
74+
node_list[2] = text_node
75+
self.assertEqual(node_list[2], text_node)
76+
77+
def testContains(self):
78+
nodes = [*_make_nodes(4)]
79+
node_list = NodeList(nodes)
80+
for n in node_list:
81+
self.assertIn(n, node_list)
82+
83+
def testContains_NotIn(self):
84+
internal_nodes = [*_make_nodes(4)]
85+
external_node = _make_nodes(1)
86+
node_list = NodeList(internal_nodes)
87+
self.assertNotIn(external_node, node_list)
88+
89+
90+
class Test_Length(unittest.TestCase):
91+
def test_Empty(self):
92+
node_list = NodeList()
93+
self.assertEqual(node_list.length, 0)
5994

60-
def testItem_inSize(self):
95+
def test_OneItem(self):
96+
node_list = NodeList(_make_nodes(1))
97+
self.assertEqual(node_list.length, 1)
98+
99+
def test_SomeItems(self):
100+
node_list = NodeList(_make_nodes(5))
101+
self.assertEqual(node_list.length, 5)
102+
103+
104+
class Test_Item(unittest.TestCase):
105+
def test_InSize(self):
61106
nodes = [*_make_nodes(5)]
62107
node_list = NodeList(nodes)
63108
for i in range(5):
64109
self.assertEqual(node_list.item(i), nodes[i])
65110

66-
def testItem_greaterOrEqualThanSize(self):
111+
def test_GreaterOrEqualThanSize(self):
67112
node_list = NodeList(_make_nodes(5))
68113
for i in range(5, 8):
69114
self.assertIsNone(node_list.item(i))
70115

71-
def testItem_notValid(self):
116+
def test_InvalidIndex(self):
72117
node_list = NodeList(_make_nodes(5))
73118
for idx in [-1, -9999, 'hi', '1', None, Node, NodeList, b'0']:
74119
self.assertIsNone(node_list.item(idx))
75120

76-
def testLength(self):
77-
# Empty NodeList
78-
node_list = NodeList()
79-
self.assertEqual(node_list.length, 0)
80-
# NodeList with a node.
81-
node_list = NodeList(_make_nodes(1))
82-
self.assertEqual(node_list.length, 1)
83-
# NodeList with some items.
84-
node_list = NodeList(_make_nodes(5))
85-
self.assertEqual(node_list.length, 5)
86-
87121

88122
if __name__ == '__main__':
89123
unittest.main()

w3/python/core/fundamental_interface/Node_test.py

Lines changed: 190 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,72 +5,222 @@
55
from w3.dom import NodeType
66

77

8-
class Test_Node(unittest.TestCase):
9-
def test_init(self):
10-
node = Node(node_type=NodeType.DOCUMENT_NODE,
11-
node_name='#document',
12-
read_only=False)
13-
self.assertEqual(node.node_type, NodeType.DOCUMENT_NODE)
14-
self.assertEqual(node.node_name, '#document')
15-
self.assertEqual(node.node_value, '')
8+
def _create_document_node():
9+
return Node(node_type=NodeType.DOCUMENT_NODE,
10+
node_name='#document',
11+
owner_document=None)
12+
13+
14+
def _create_element_node(document: Node):
15+
assert document.node_type == NodeType.DOCUMENT_NODE
16+
return Node(node_type=NodeType.ELEMENT_NODE,
17+
node_name='tagName',
18+
owner_document=document)
19+
20+
21+
class Test_Dunder(unittest.TestCase):
22+
def testInit(self):
23+
# Creating document node.
24+
document = Node(node_type=NodeType.DOCUMENT_NODE,
25+
node_name='#document',
26+
owner_document=None,
27+
read_only=False)
28+
self.assertEqual(document.node_type, NodeType.DOCUMENT_NODE)
29+
self.assertEqual(document.node_name, '#document')
30+
self.assertEqual(document.node_value, '')
1631

17-
def testNodeValue_get(self):
18-
node = Node(node_type=NodeType.TEXT_NODE,
32+
33+
class Test_NodeValue(unittest.TestCase):
34+
def testGetter(self):
35+
document = _create_document_node()
36+
text = Node(node_type=NodeType.TEXT_NODE,
1937
node_name='#text',
38+
owner_document=document,
2039
node_value='lorem ipsum')
21-
self.assertEqual(node.node_value, 'lorem ipsum')
40+
self.assertEqual(text.node_value, 'lorem ipsum')
2241

23-
def testNodeValue_set(self):
24-
# set value from constructor
25-
node = Node(node_type=NodeType.TEXT_NODE,
42+
def testConstructor(self):
43+
document = _create_document_node()
44+
text = Node(node_type=NodeType.TEXT_NODE,
2645
node_name='#text',
46+
owner_document=document,
2747
node_value='foo',
2848
read_only=False)
29-
self.assertEqual(node.node_value, 'foo')
30-
# set using setter
31-
node.node_value = 'bar'
32-
self.assertEqual(node.node_value, 'bar')
49+
self.assertEqual(text.node_value, 'foo')
3350

34-
def testNodeValue_setReadOnly(self):
35-
node = Node(node_type=NodeType.TEXT_NODE,
51+
def testSetter(self):
52+
document = _create_document_node()
53+
text = Node(node_type=NodeType.TEXT_NODE,
3654
node_name='#text',
55+
owner_document=document,
56+
read_only=False)
57+
text.node_value = 'bar'
58+
self.assertEqual(text.node_value, 'bar')
59+
60+
def testSetter_ReadOnly(self):
61+
document = _create_document_node()
62+
text = Node(node_type=NodeType.TEXT_NODE,
63+
node_name='#text',
64+
owner_document=document,
3765
node_value='foo',
3866
read_only=True)
3967
try:
40-
node.node_value = 'bar'
68+
text.node_value = 'bar'
4169
except DOMException as e:
4270
code = e.args[0]
4371
self.assertEqual(code, DOMException.NO_MODIFICATION_ALLOWED_ERR)
4472
else:
4573
self.fail()
4674
# `node_value` should not be modified.
47-
self.assertEqual(node.node_value, 'foo')
75+
self.assertEqual(text.node_value, 'foo')
76+
4877

49-
def testNodeType_get(self):
78+
class Test_NodeType(unittest.TestCase):
79+
def testGetter(self):
80+
document = _create_document_node()
5081
for node_type in NodeType:
5182
node = Node(node_type=node_type,
52-
node_name='')
83+
node_name='',
84+
owner_document=document)
5385
self.assertEqual(node.node_type, node_type)
5486

55-
def testNodeType_setCorrectTypes(self):
87+
def testSetter_CorrectTypes(self):
88+
document = _create_document_node()
5689
for node_type in NodeType:
57-
node = Node(node_type=node_type,
58-
node_name='')
59-
self.assertEqual(node.node_type, node_type)
90+
Node(node_type=node_type,
91+
node_name='',
92+
owner_document=document)
6093

61-
def testNodeType_setWrongTypes(self):
62-
for node_type in [-1, None, 'hi', Node, True, NodeType, 'DOCUMENT_NODE']:
63-
with self.assertRaises(TypeError):
94+
def testSetter_WrongTypes(self):
95+
document = _create_document_node()
96+
for node_type in [-1, None, 'hi', True, Node, NodeType, 'DOCUMENT_NODE']:
97+
try:
6498
Node(node_type=node_type,
65-
node_name='')
66-
67-
def testParentNode_get(self):
68-
parent_node = Node(node_type=NodeType.DOCUMENT_FRAGMENT_NODE,
69-
node_name='#document-fragment')
70-
node = Node(node_type=NodeType.ELEMENT_NODE,
71-
node_name='tagName',
72-
parent_node=parent_node)
73-
self.assertEqual(node.parent_node, parent_node)
99+
node_name='',
100+
owner_document=document)
101+
self.fail()
102+
except Exception:
103+
pass
104+
105+
106+
class Test_ParentNode(unittest.TestCase):
107+
def testConstrutor(self):
108+
document = _create_document_node()
109+
docfrag = Node(node_type=NodeType.DOCUMENT_FRAGMENT_NODE,
110+
node_name='#document-fragment',
111+
owner_document=document)
112+
self.assertIsNone(docfrag.parent_node)
113+
114+
def testGetter(self):
115+
document = _create_document_node()
116+
parent_node = _create_element_node(document)
117+
child_node = _create_element_node(document)
118+
# Warning: this is assuming that `append_child()` method works properly.
119+
parent_node.append_child(child_node)
120+
self.assertEqual(child_node.parent_node, parent_node)
121+
122+
123+
class Test_InsertBefore(unittest.TestCase):
124+
def test_WithoutRefNode(self):
125+
document = _create_document_node()
126+
parent_node = _create_element_node(document)
127+
child_node = _create_element_node(document)
128+
# Testing
129+
parent_node.insert_before(child_node)
130+
self.assertEqual(child_node.parent_node, parent_node)
131+
self.assertEqual(parent_node.child_nodes.item(0), child_node)
132+
self.assertEqual(parent_node.child_nodes.length, 1)
133+
134+
def test_WithRefNode(self):
135+
document = _create_document_node()
136+
parent_node = _create_element_node(document)
137+
first_child_node = _create_element_node(document)
138+
second_child_node = _create_element_node(document)
139+
# Warning: this is assuming that `append_child()` method works properly.
140+
parent_node.append_child(second_child_node)
141+
# Testing
142+
parent_node.insert_before(first_child_node, second_child_node)
143+
self.assertEqual(first_child_node.parent_node, parent_node)
144+
self.assertEqual(parent_node.child_nodes.item(0), first_child_node)
145+
self.assertEqual(parent_node.child_nodes.item(1), second_child_node)
146+
self.assertEqual(parent_node.child_nodes.length, 2)
147+
148+
def test_InsertExistingChild(self):
149+
document = _create_document_node()
150+
parent_node = _create_element_node(document)
151+
first_child_node = _create_element_node(document)
152+
second_child_node = _create_element_node(document)
153+
# Warning: this is assuming that `append_child()` method works properly.
154+
parent_node.append_child(first_child_node)
155+
parent_node.append_child(second_child_node)
156+
# Testing
157+
parent_node.insert_before(second_child_node, first_child_node)
158+
self.assertEqual(second_child_node.parent_node, parent_node)
159+
self.assertEqual(parent_node.child_nodes.item(0), second_child_node)
160+
self.assertEqual(parent_node.child_nodes.item(1), first_child_node)
161+
self.assertEqual(parent_node.child_nodes.length, 2)
162+
163+
def test_InsertDocumentFragmentNode(self):
164+
document = _create_document_node()
165+
parent_node = _create_element_node(document)
166+
docfrag_node = Node(node_type=NodeType.DOCUMENT_FRAGMENT_NODE,
167+
node_name='#document-fragment',
168+
owner_document=document)
169+
first_child_node = _create_element_node(document)
170+
second_child_node = _create_element_node(document)
171+
# Warning: this is assuming that `append_child()` method works properly.
172+
docfrag_node.append_child(first_child_node)
173+
docfrag_node.append_child(second_child_node)
174+
# Testing
175+
parent_node.insert_before(docfrag_node)
176+
self.assertEqual(parent_node.child_nodes.item(0), first_child_node)
177+
self.assertEqual(parent_node.child_nodes.item(1), second_child_node)
178+
self.assertEqual(parent_node.child_nodes.length, 2)
179+
180+
def test_Raises_HIERARCHY_REQUEST_ERR(self):
181+
self.skipTest(NotImplemented) # TODO
182+
183+
def test_Raises_WRONG_DOCUMENT_ERR(self):
184+
document_1 = _create_document_node()
185+
document_2 = _create_document_node()
186+
elem_node_1 = _create_element_node(document_1)
187+
elem_node_2 = _create_element_node(document_2)
188+
try:
189+
elem_node_1.insert_before(elem_node_2)
190+
except DOMException as e:
191+
code = e.args[0]
192+
self.assertEqual(code, DOMException.WRONG_DOCUMENT_ERR)
193+
else:
194+
self.fail()
195+
196+
def test_Raises_NO_MODIFICATION_ALLOWED_ERR(self):
197+
document = _create_document_node()
198+
elem_node_readonly = Node(node_type=NodeType.ELEMENT_NODE,
199+
node_name='tagName',
200+
owner_document=document,
201+
read_only=True)
202+
elem_node_child = _create_element_node(document)
203+
try:
204+
elem_node_readonly.insert_before(elem_node_child)
205+
except DOMException as e:
206+
code = e.args[0]
207+
self.assertEqual(code, DOMException.NO_MODIFICATION_ALLOWED_ERR)
208+
else:
209+
self.fail()
210+
211+
def test_Raises_NOT_FOUND_ERR(self):
212+
document = _create_document_node()
213+
elem_node_parent = _create_element_node(document)
214+
elem_node_child = _create_element_node(document)
215+
elem_node_error = _create_element_node(document)
216+
# Testing
217+
try:
218+
elem_node_parent.insert_before(elem_node_child, elem_node_error)
219+
except DOMException as e:
220+
code = e.args[0]
221+
self.assertEqual(code, DOMException.NOT_FOUND_ERR)
222+
else:
223+
self.fail()
74224

75225

76226
if __name__ == '__main__':

0 commit comments

Comments
 (0)