66from test .common import CommonTestCase
77
88
9- class TestAutocat (CommonTestCase ):
9+ # region ---- <Test Expressions> ----
10+ class TestExpr (CommonTestCase ):
1011 def test_autocat (self ):
1112 self .assertCstMatchesSnapshot ('"abc" "="\n "1" .. a .. "b".d();' )
1213
14+ def test_mod_supported (self ):
15+ self .assertCstMatchesSnapshot ('c=a%b;' )
16+
1317
14- class TreeGenTest (CommonTestCase ):
18+ class TestItemChain (CommonTestCase ):
1519 def test_item_chain (self ):
1620 self .assertCstMatchesSnapshot ('a[7].b.0.fn["c" .. 2] = fn(9).k[7 + r](3,);' )
1721
1822 def test_fn_call_in_lvalue (self ):
1923 self .assertCstMatchesSnapshot ('a(7).b.0.fn()["c" .. 2] = fn(9).k[7 + r](3,);' )
2024
25+ def test_empty_sqb_error (self ):
26+ with self .assertRaises (LocatedCstError ) as err :
27+ TreeGen (Tokenizer ('v=a[]+b' )).parse ()
28+ exc = err .exception
29+ self .assertBetweenIncl (3 , 4 , exc .region .start )
30+ self .assertEqual (4 , exc .region .end - 1 )
31+
32+ def test_getattr__issue_09 (self ):
33+ t = Tokenizer ('fn(call_arg).a;' ).tokenize ()
34+ node = CstGen (t ).parse ()
35+ self .assertMatchesSnapshot (node , 'after_call' )
36+ t = Tokenizer ('(paren + x).b;' ).tokenize ()
37+ node = CstGen (t ).parse ()
38+ self .assertMatchesSnapshot (node , 'after_paren' )
39+ t = Tokenizer ('"a string".b;' ).tokenize ()
40+ node = CstGen (t ).parse ()
41+ self .assertMatchesSnapshot (node , 'after_string' )
42+
43+ def test_getitem__issue_09 (self ):
44+ t = Tokenizer ('fn(call_arg)[1];' ).tokenize ()
45+ node = CstGen (t ).parse ()
46+ self .assertMatchesSnapshot (node , 'after_call' )
47+ t = Tokenizer ('(paren + x)[2];' ).tokenize ()
48+ node = CstGen (t ).parse ()
49+ self .assertMatchesSnapshot (node , 'after_paren' )
50+ t = Tokenizer ('"a string"["key_" .. 3];' ).tokenize ()
51+ node = CstGen (t ).parse ()
52+ self .assertMatchesSnapshot (node , 'after_string' )
53+ # endregion </Test Expressions>
54+
55+
56+ # region ---- <Test Statements> ----
57+ class TestSmt (CommonTestCase ):
2158 def test_aug_assign (self ):
2259 self .assertCstMatchesSnapshot ('a[1] += a.2;' )
2360
24- def test__mod_supported (self ):
25- self .assertCstMatchesSnapshot ('c=a%b;' )
61+ def test_empty_smt__issue_04 (self ):
62+ t = Tokenizer ('let a=9;;' ).tokenize ()
63+ node = CstGen (t ).parse ()
64+ self .assertMatchesSnapshot (node )
65+
66+
67+ class TestDecl (CommonTestCase ):
68+ def test_empty_assign_source_error (self ):
69+ t = Tokenizer ('let a= ;' ).tokenize ()
70+ with self .assertRaises (LocatedCstError ) as err :
71+ CstGen (t ).parse ()
72+ self .assertBetweenIncl (5 , 7 , err .exception .region .start )
73+ self .assertBetweenIncl (7 , 8 , err .exception .region .end )
74+ self .assertContains (str (err .exception ), "semi" )
2675
2776 def test_decl_no_value (self ):
2877 self .assertCstMatchesSnapshot ('let b;' )
@@ -57,6 +106,14 @@ def test_repeat(self):
57106 self .assertCstMatchesSnapshot ('repeat a || !b && c >= 6 {}' )
58107 self .assertCstMatchesSnapshot ('repeat!(7%8){(7.7).abc(6,7,8);}' )
59108
109+ def test_empty_condition_error (self ):
110+ t = Tokenizer ('if {x();}' ).tokenize ()
111+ with self .assertRaises (LocatedCstError ) as err :
112+ CstGen (t ).parse ()
113+ self .assertBetweenIncl (0 , 3 , err .exception .region .start )
114+ self .assertBetweenIncl (2 , 4 , err .exception .region .end )
115+ self .assertContains (str (err .exception ), "brace" )
116+
60117 def test_else_if_else (self ):
61118 self .assertCstMatchesSnapshot ('if(1){}else if(a||!b&&c!=6){}' )
62119 self .assertCstMatchesSnapshot ('if(1){}else{a();}' )
@@ -83,62 +140,7 @@ def test_one_param(self):
83140
84141 def test_two_param (self ):
85142 self .assertCstMatchesSnapshot ('def a(number a, string b){RESULT=a.."="..b;}' )
86-
87-
88- class TestTreeGenErrors (CommonTestCase ):
89- def test_empty_sqb_error (self ):
90- with self .assertRaises (LocatedCstError ) as err :
91- TreeGen (Tokenizer ('v=a[]+b' )).parse ()
92- exc = err .exception
93- self .assertBetweenIncl (3 , 4 , exc .region .start )
94- self .assertEqual (4 , exc .region .end - 1 )
95-
96-
97- class TestItemChain (CommonTestCase ):
98- def test_getattr__issue_09 (self ):
99- t = Tokenizer ('fn(call_arg).a;' ).tokenize ()
100- node = CstGen (t ).parse ()
101- self .assertMatchesSnapshot (node , 'after_call' )
102- t = Tokenizer ('(paren + x).b;' ).tokenize ()
103- node = CstGen (t ).parse ()
104- self .assertMatchesSnapshot (node , 'after_paren' )
105- t = Tokenizer ('"a string".b;' ).tokenize ()
106- node = CstGen (t ).parse ()
107- self .assertMatchesSnapshot (node , 'after_string' )
108-
109- def test_getitem__issue_09 (self ):
110- t = Tokenizer ('fn(call_arg)[1];' ).tokenize ()
111- node = CstGen (t ).parse ()
112- self .assertMatchesSnapshot (node , 'after_call' )
113- t = Tokenizer ('(paren + x)[2];' ).tokenize ()
114- node = CstGen (t ).parse ()
115- self .assertMatchesSnapshot (node , 'after_paren' )
116- t = Tokenizer ('"a string"["key_" .. 3];' ).tokenize ()
117- node = CstGen (t ).parse ()
118- self .assertMatchesSnapshot (node , 'after_string' )
119-
120-
121- class TestEmptyExpr (CommonTestCase ):
122- def test_error_empty_assign_source (self ):
123- t = Tokenizer ('let a= ;' ).tokenize ()
124- with self .assertRaises (LocatedCstError ) as err :
125- CstGen (t ).parse ()
126- self .assertBetweenIncl (5 , 7 , err .exception .region .start )
127- self .assertBetweenIncl (7 , 8 , err .exception .region .end )
128- self .assertContains (str (err .exception ), "semi" )
129-
130- def test_error_empty_condition (self ):
131- t = Tokenizer ('if {x();}' ).tokenize ()
132- with self .assertRaises (LocatedCstError ) as err :
133- CstGen (t ).parse ()
134- self .assertBetweenIncl (0 , 3 , err .exception .region .start )
135- self .assertBetweenIncl (2 , 4 , err .exception .region .end )
136- self .assertContains (str (err .exception ), "brace" )
137-
138- def test_empty_expr_issue_04 (self ):
139- t = Tokenizer ('let a=9;;' ).tokenize ()
140- node = CstGen (t ).parse ()
141- self .assertMatchesSnapshot (node )
143+ # endregion </Test Statements>
142144
143145
144146if __name__ == '__main__' :
0 commit comments