Skip to content

Commit 4054fc9

Browse files
add new unit tests, exclude some files from coverage report
1 parent a3fe326 commit 4054fc9

13 files changed

Lines changed: 1853 additions & 24 deletions

.coveragerc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ branch = true
33
omit =
44
hcl2/__main__.py
55
hcl2/lark_parser.py
6+
hcl2/version.py
7+
hcl2/__init__.py
8+
hcl2/rules/__init__.py
69

710
[report]
811
show_missing = true

test/helpers/__init__.py

Lines changed: 0 additions & 3 deletions
This file was deleted.

test/helpers/hcl2_helper.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

test/unit/__init__.py

Whitespace-only changes.

test/unit/rules/__init__.py

Whitespace-only changes.

test/unit/rules/test_abstract.py

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
from unittest import TestCase
2+
3+
from lark import Token, Tree
4+
from lark.tree import Meta
5+
6+
from hcl2.rules.abstract import LarkElement, LarkToken, LarkRule
7+
from hcl2.utils import SerializationOptions, SerializationContext
8+
9+
10+
# --- Concrete stubs for testing ABCs ---
11+
12+
13+
class ConcreteToken(LarkToken):
14+
@staticmethod
15+
def lark_name() -> str:
16+
return "TEST_TOKEN"
17+
18+
@property
19+
def serialize_conversion(self):
20+
return str
21+
22+
23+
class IntToken(LarkToken):
24+
@staticmethod
25+
def lark_name() -> str:
26+
return "INT_TOKEN"
27+
28+
@property
29+
def serialize_conversion(self):
30+
return int
31+
32+
33+
class ConcreteRule(LarkRule):
34+
@staticmethod
35+
def lark_name() -> str:
36+
return "test_rule"
37+
38+
def serialize(self, options=SerializationOptions(), context=SerializationContext()):
39+
return "test"
40+
41+
42+
# --- Tests ---
43+
44+
45+
class TestLarkToken(TestCase):
46+
def test_init_stores_value(self):
47+
token = ConcreteToken("hello")
48+
self.assertEqual(token.value, "hello")
49+
50+
def test_value_property(self):
51+
token = ConcreteToken(42)
52+
self.assertEqual(token.value, 42)
53+
54+
def test_set_value(self):
55+
token = ConcreteToken("old")
56+
token.set_value("new")
57+
self.assertEqual(token.value, "new")
58+
59+
def test_str(self):
60+
token = ConcreteToken("hello")
61+
self.assertEqual(str(token), "hello")
62+
63+
def test_str_numeric(self):
64+
token = ConcreteToken(42)
65+
self.assertEqual(str(token), "42")
66+
67+
def test_repr(self):
68+
token = ConcreteToken("hello")
69+
self.assertEqual(repr(token), "<LarkToken instance: TEST_TOKEN hello>")
70+
71+
def test_to_lark_returns_token(self):
72+
token = ConcreteToken("val")
73+
lark_token = token.to_lark()
74+
self.assertIsInstance(lark_token, Token)
75+
self.assertEqual(lark_token.type, "TEST_TOKEN")
76+
self.assertEqual(lark_token, "val")
77+
78+
def test_serialize_uses_conversion(self):
79+
token = ConcreteToken("hello")
80+
self.assertEqual(token.serialize(), "hello")
81+
82+
def test_serialize_int_conversion(self):
83+
token = IntToken("42")
84+
result = token.serialize()
85+
self.assertEqual(result, 42)
86+
self.assertIsInstance(result, int)
87+
88+
def test_lark_name(self):
89+
self.assertEqual(ConcreteToken.lark_name(), "TEST_TOKEN")
90+
91+
92+
class TestLarkRule(TestCase):
93+
def test_init_sets_children(self):
94+
t1 = ConcreteToken("a")
95+
t2 = ConcreteToken("b")
96+
rule = ConcreteRule([t1, t2])
97+
self.assertEqual(rule.children, [t1, t2])
98+
99+
def test_init_sets_parent_and_index(self):
100+
t1 = ConcreteToken("a")
101+
t2 = ConcreteToken("b")
102+
rule = ConcreteRule([t1, t2])
103+
self.assertIs(t1._parent, rule)
104+
self.assertIs(t2._parent, rule)
105+
self.assertEqual(t1._index, 0)
106+
self.assertEqual(t2._index, 1)
107+
108+
def test_init_skips_none_children_for_parent_index(self):
109+
t1 = ConcreteToken("a")
110+
rule = ConcreteRule([None, t1, None])
111+
self.assertIs(t1._parent, rule)
112+
self.assertEqual(t1._index, 1)
113+
114+
def test_init_with_meta(self):
115+
meta = Meta()
116+
rule = ConcreteRule([], meta)
117+
self.assertIs(rule._meta, meta)
118+
119+
def test_init_without_meta(self):
120+
rule = ConcreteRule([])
121+
self.assertIsNotNone(rule._meta)
122+
123+
def test_parent_property(self):
124+
child_rule = ConcreteRule([])
125+
parent_rule = ConcreteRule([child_rule])
126+
self.assertIs(child_rule.parent, parent_rule)
127+
128+
def test_index_property(self):
129+
child_rule = ConcreteRule([])
130+
ConcreteRule([child_rule])
131+
self.assertEqual(child_rule.index, 0)
132+
133+
def test_children_property(self):
134+
t = ConcreteToken("x")
135+
rule = ConcreteRule([t])
136+
self.assertEqual(rule.children, [t])
137+
138+
def test_to_lark_builds_tree(self):
139+
t1 = ConcreteToken("a")
140+
t2 = ConcreteToken("b")
141+
rule = ConcreteRule([t1, t2])
142+
tree = rule.to_lark()
143+
self.assertIsInstance(tree, Tree)
144+
self.assertEqual(tree.data, "test_rule")
145+
self.assertEqual(len(tree.children), 2)
146+
147+
def test_to_lark_skips_none_children(self):
148+
t1 = ConcreteToken("a")
149+
rule = ConcreteRule([None, t1, None])
150+
tree = rule.to_lark()
151+
self.assertEqual(len(tree.children), 1)
152+
self.assertEqual(tree.children[0], "a")
153+
154+
def test_repr(self):
155+
rule = ConcreteRule([])
156+
self.assertEqual(repr(rule), "<LarkRule: ConcreteRule>")
157+
158+
def test_nested_rules(self):
159+
inner = ConcreteRule([ConcreteToken("x")])
160+
outer = ConcreteRule([inner])
161+
self.assertIs(inner.parent, outer)
162+
tree = outer.to_lark()
163+
self.assertEqual(tree.data, "test_rule")
164+
self.assertEqual(len(tree.children), 1)
165+
self.assertIsInstance(tree.children[0], Tree)
166+
167+
168+
class TestLarkElement(TestCase):
169+
def test_set_index(self):
170+
token = ConcreteToken("x")
171+
token.set_index(5)
172+
self.assertEqual(token._index, 5)
173+
174+
def test_set_parent(self):
175+
token = ConcreteToken("x")
176+
parent = ConcreteRule([])
177+
token.set_parent(parent)
178+
self.assertIs(token._parent, parent)

0 commit comments

Comments
 (0)