19
19
*/
20
20
package org .sonar .python .semantic .v2 ;
21
21
22
- import org .junit .jupiter .api .Assertions ;
22
+ import java .util .Set ;
23
+ import org .assertj .core .api .Assertions ;
23
24
import org .junit .jupiter .api .Test ;
24
25
import org .sonar .plugins .python .api .tree .AssignmentStatement ;
25
26
import org .sonar .plugins .python .api .tree .FileInput ;
26
27
import org .sonar .plugins .python .api .tree .FunctionDef ;
27
28
import org .sonar .plugins .python .api .tree .ImportName ;
28
29
import org .sonar .plugins .python .api .tree .Name ;
29
30
import org .sonar .python .PythonTestUtils ;
31
+ import org .sonar .python .tree .TreeUtils ;
30
32
31
33
class SymbolTableBuilderV2Test {
32
34
33
35
34
36
@ Test
35
- void test () {
36
- var builder = new SymbolTableBuilderV2 ();
37
+ void testSymbolTableModuleSymbols () {
38
+ FileInput fileInput = PythonTestUtils .parse (
39
+ """
40
+ import lib
41
+
42
+ v = lib.foo()
43
+ a = lib.A()
44
+ b = a.do_something()
45
+ x = 42
46
+
47
+ def script_do_something(param):
48
+ c = 42
49
+ return c
50
+
51
+ script_do_something()
52
+ """
53
+ );
54
+
55
+ var symbolTable = new SymbolTableBuilderV2 (fileInput )
56
+ .build ();
57
+
58
+ var moduleSymbols = symbolTable .getSymbolsByRootTree (fileInput );
59
+ Assertions .assertThat (moduleSymbols )
60
+ .hasSize (6 )
61
+ .extracting (SymbolV2 ::name )
62
+ .contains ("lib" , "a" , "b" , "v" , "x" , "script_do_something" );
63
+ }
64
+
65
+ @ Test
66
+ void testSymbolTableLocalSymbols () {
67
+ FileInput fileInput = PythonTestUtils .parse (
68
+ """
69
+ import lib
70
+ a = lib.A()
71
+ def script_do_something(param):
72
+ c = 42
73
+ return c
74
+ """
75
+ );
76
+
77
+ var symbolTable = new SymbolTableBuilderV2 (fileInput )
78
+ .build ();
79
+
80
+ var localSymbols = TreeUtils .firstChild (fileInput , FunctionDef .class ::isInstance )
81
+ .map (symbolTable ::getSymbolsByRootTree )
82
+ .orElseGet (Set ::of );
83
+
84
+ Assertions .assertThat (localSymbols )
85
+ .hasSize (2 )
86
+ .extracting (SymbolV2 ::name )
87
+ .contains ("param" , "c" );
88
+ }
89
+
90
+ @ Test
91
+ void testSymbolTableGlobalSymbols () {
92
+ FileInput fileInput = PythonTestUtils .parse (
93
+ """
94
+ global a
95
+ def script_do_something(param):
96
+ global b
97
+
98
+ """
99
+ );
100
+
101
+ var symbolTable = new SymbolTableBuilderV2 (fileInput )
102
+ .build ();
103
+
104
+ var localSymbols = TreeUtils .firstChild (fileInput , FunctionDef .class ::isInstance )
105
+ .map (symbolTable ::getSymbolsByRootTree )
106
+ .orElseGet (Set ::of );
107
+ var moduleSymbols = symbolTable .getSymbolsByRootTree (fileInput );
108
+
109
+ Assertions .assertThat (localSymbols )
110
+ .hasSize (1 )
111
+ .extracting (SymbolV2 ::name )
112
+ .contains ("param" );
113
+
114
+ Assertions .assertThat (moduleSymbols )
115
+ .hasSize (3 )
116
+ .extracting (SymbolV2 ::name )
117
+ .contains ("a" , "b" , "script_do_something" );
118
+ }
119
+
120
+ @ Test
121
+ void testNameSymbols () {
37
122
FileInput fileInput = PythonTestUtils .parse (
38
123
"""
39
124
import lib
@@ -49,89 +134,68 @@ def script_do_something(param):
49
134
script_do_something()
50
135
"""
51
136
);
52
- builder .visitFileInput (fileInput );
53
137
54
- Assertions .assertNotNull (fileInput .statements ());
138
+ new SymbolTableBuilderV2 (fileInput )
139
+ .build ();
140
+
141
+ var statements = fileInput .statements ().statements ();
55
142
56
143
{
57
- var importStatement = (ImportName ) fileInput . statements (). statements () .get (0 );
144
+ var importStatement = (ImportName ) statements .get (0 );
58
145
var libName = importStatement .modules ().get (0 ).dottedName ().names ().get (0 );
59
- var symbol = libName .symbolV2 ();
60
- Assertions .assertNotNull (symbol );
61
- Assertions .assertEquals ("lib" , symbol .name ());
62
- Assertions .assertEquals (3 , symbol .usages ().size ());
146
+ assertNameSymbol (libName , "lib" , 3 );
63
147
}
64
148
65
149
{
66
- var assignmentStatement = (AssignmentStatement ) fileInput . statements (). statements () .get (1 );
150
+ var assignmentStatement = (AssignmentStatement ) statements .get (1 );
67
151
var vName = (Name ) assignmentStatement .children ().get (0 ).children ().get (0 );
68
- var vNameSymbol = vName .symbolV2 ();
69
- Assertions .assertNotNull (vNameSymbol );
70
- Assertions .assertEquals ("v" , vNameSymbol .name ());
71
- Assertions .assertEquals (1 , vNameSymbol .usages ().size ());
152
+ assertNameSymbol (vName , "v" , 1 );
72
153
73
154
var libName = (Name ) assignmentStatement .children ().get (2 ).children ().get (0 ).children ().get (0 );
74
- var symbol = libName .symbolV2 ();
75
- Assertions .assertNotNull (symbol );
76
- Assertions .assertEquals ("lib" , symbol .name ());
77
- Assertions .assertEquals (3 , symbol .usages ().size ());
155
+ assertNameSymbol (libName , "lib" , 3 );
78
156
}
79
157
80
158
{
81
- var assignmentStatement = (AssignmentStatement ) fileInput . statements (). statements () .get (2 );
159
+ var assignmentStatement = (AssignmentStatement ) statements .get (2 );
82
160
var aName = (Name ) assignmentStatement .children ().get (0 ).children ().get (0 );
83
- var aNameSymbol = aName .symbolV2 ();
84
- Assertions .assertNotNull (aNameSymbol );
85
- Assertions .assertEquals ("a" , aNameSymbol .name ());
86
- Assertions .assertEquals (2 , aNameSymbol .usages ().size ());
161
+ assertNameSymbol (aName , "a" , 2 );
87
162
88
163
var libName = (Name ) assignmentStatement .children ().get (2 ).children ().get (0 ).children ().get (0 );
89
- var symbol = libName .symbolV2 ();
90
- Assertions .assertNotNull (symbol );
91
- Assertions .assertEquals ("lib" , symbol .name ());
92
- Assertions .assertEquals (3 , symbol .usages ().size ());
164
+ assertNameSymbol (libName , "lib" , 3 );
93
165
}
94
166
95
167
{
96
- var assignmentStatement = (AssignmentStatement ) fileInput . statements (). statements () .get (3 );
168
+ var assignmentStatement = (AssignmentStatement ) statements .get (3 );
97
169
var bName = (Name ) assignmentStatement .children ().get (0 ).children ().get (0 );
98
- var bNameSymbol = bName .symbolV2 ();
99
- Assertions .assertNotNull (bNameSymbol );
100
- Assertions .assertEquals ("b" , bNameSymbol .name ());
101
- Assertions .assertEquals (1 , bNameSymbol .usages ().size ());
170
+ assertNameSymbol (bName , "b" , 1 );
102
171
103
172
var aName = (Name ) assignmentStatement .children ().get (2 ).children ().get (0 ).children ().get (0 );
104
- var aNameSymbol = aName .symbolV2 ();
105
- Assertions .assertNotNull (aNameSymbol );
106
- Assertions .assertEquals ("a" , aNameSymbol .name ());
107
- Assertions .assertEquals (2 , aNameSymbol .usages ().size ());
173
+ assertNameSymbol (aName , "a" , 2 );
108
174
}
109
175
110
176
{
111
- var assignmentStatement = (AssignmentStatement ) fileInput . statements (). statements () .get (4 );
177
+ var assignmentStatement = (AssignmentStatement ) statements .get (4 );
112
178
var xName = (Name ) assignmentStatement .children ().get (0 ).children ().get (0 );
113
- var xNameSymbol = xName .symbolV2 ();
114
- Assertions .assertNotNull (xNameSymbol );
115
- Assertions .assertEquals ("x" , xNameSymbol .name ());
116
- Assertions .assertEquals (1 , xNameSymbol .usages ().size ());
179
+ assertNameSymbol (xName , "x" , 1 );
117
180
}
118
181
119
182
{
120
- var functionDef = (FunctionDef ) fileInput . statements (). statements () .get (5 );
183
+ var functionDef = (FunctionDef ) statements .get (5 );
121
184
var scriptFunctionName = (Name ) functionDef .name ();
122
- var scriptFunctionNameSymbol = scriptFunctionName .symbolV2 ();
123
- Assertions .assertNotNull (scriptFunctionNameSymbol );
124
- Assertions .assertEquals ("script_do_something" , scriptFunctionNameSymbol .name ());
125
- Assertions .assertEquals (2 , scriptFunctionNameSymbol .usages ().size ());
185
+ assertNameSymbol (scriptFunctionName , "script_do_something" , 2 );
126
186
}
127
187
128
188
{
129
- var functionCallName = (Name ) fileInput .statements ().statements ().get (6 ).children ().get (0 ).children ().get (0 );
130
- var functionCallNameSymbol = functionCallName .symbolV2 ();
131
- Assertions .assertNotNull (functionCallNameSymbol );
132
- Assertions .assertEquals ("script_do_something" , functionCallNameSymbol .name ());
133
- Assertions .assertEquals (2 , functionCallNameSymbol .usages ().size ());
189
+ var functionCallName = (Name ) statements .get (6 ).children ().get (0 ).children ().get (0 );
190
+ assertNameSymbol (functionCallName , "script_do_something" , 2 );
134
191
}
135
192
136
193
}
194
+
195
+ private static void assertNameSymbol (Name name , String expectedSymbolName , int expectedUsagesCount ) {
196
+ var symbol = name .symbolV2 ();
197
+ Assertions .assertThat (symbol ).isNotNull ();
198
+ Assertions .assertThat (symbol .name ()).isEqualTo (expectedSymbolName );
199
+ Assertions .assertThat (symbol .usages ()).hasSize (expectedUsagesCount );
200
+ }
137
201
}
0 commit comments