21
21
22
22
import com .sonar .sslr .api .Token ;
23
23
import com .sonar .sslr .impl .Lexer ;
24
- import java .util .LinkedHashMap ;
25
24
import java .util .List ;
26
25
import java .util .Map ;
27
26
import org .junit .jupiter .api .BeforeAll ;
32
31
33
32
import static org .assertj .core .api .Assertions .assertThat ;
34
33
import static org .junit .jupiter .api .Assertions .assertThrows ;
34
+ import static org .sonar .python .PythonTestUtils .mapToColumnMappingList ;
35
35
36
36
class TokenEnricherTest {
37
37
private static TestLexer lexer ;
@@ -78,8 +78,8 @@ void shouldThrowIllegalStateException() {
78
78
//when the mapping is not present for the current line
79
79
var code = "a = 1\n \n b=3" ;
80
80
var offsetMap = Map .of (
81
- 1 , new IPythonLocation (200 , 23 , Map . of () ),
82
- 2 , new IPythonLocation (201 , 23 , Map . of () ));
81
+ 1 , new IPythonLocation (200 , 23 ),
82
+ 2 , new IPythonLocation (201 , 23 ));
83
83
var originalTokens = lexer .lex (code );
84
84
Throwable throwable = assertThrows (IllegalStateException .class , () -> TokenEnricher .enrichTokens (originalTokens , offsetMap ));
85
85
assertThat (throwable .getMessage ()).isEqualTo ("No IPythonLocation found for line 3" );
@@ -89,26 +89,29 @@ void shouldThrowIllegalStateException() {
89
89
void shouldProvideOffsetForEscapeChar () {
90
90
var code = "a = \" 1\" " ;
91
91
var expectedTokens = lexer .lex (code );
92
- var escapedChars = new LinkedHashMap <Integer , Integer >();
93
- escapedChars .put (4 , 305 );
94
- escapedChars .put (6 , 308 );
92
+ var escapedChars = mapToColumnMappingList (Map .of (4 , 1 , 6 , 1 ));
95
93
var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 , escapedChars )));
96
94
var stringToken = tokens .get (2 );
97
95
assertThat (stringToken .line ()).isEqualTo (100 );
98
96
assertThat (stringToken .column ()).isEqualTo (304 );
99
97
assertThat (stringToken .includedEscapeChars ()).isEqualTo (2 );
98
+
99
+ var eofToken = tokens .get (3 );
100
+ assertThat (eofToken .line ()).isEqualTo (100 );
101
+ assertThat (eofToken .column ()).isEqualTo (309 );
100
102
}
101
103
102
104
@ Test
103
105
void shouldComputeColCorrectly () {
104
106
var code = "a = f\" {b} \\ n test\" + \" 1\" " ;
105
107
var expectedTokens = lexer .lex (code );
106
- var escapedChars = new LinkedHashMap <Integer , Integer >();
107
- escapedChars .put (5 , 305 );
108
- escapedChars .put (10 , 311 );
109
- escapedChars .put (17 , 319 );
110
- escapedChars .put (21 , 324 );
111
- escapedChars .put (23 , 327 );
108
+ var escapedChars = mapToColumnMappingList (Map .ofEntries (
109
+ Map .entry (5 , 1 ),
110
+ Map .entry (10 , 1 ),
111
+ Map .entry (17 , 1 ),
112
+ Map .entry (21 , 1 ),
113
+ Map .entry (23 , 1 )
114
+ ));
112
115
var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 , escapedChars )));
113
116
var stringToken = tokens .get (tokens .size () - 2 );
114
117
assertThat (stringToken .line ()).isEqualTo (100 );
@@ -121,11 +124,33 @@ void shouldComputeColCorrectly() {
121
124
assertThat (eofToken .includedEscapeChars ()).isZero ();
122
125
}
123
126
127
+ @ Test
128
+ void shouldComputeTabColCorrectly () {
129
+ var code = "\t a" ;
130
+ var expectedTokens = lexer .lex (code );
131
+ var escapedChars = mapToColumnMappingList (Map .of (0 , 1 ));
132
+ var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 , escapedChars )));
133
+ var tabToken = tokens .get (0 );
134
+ assertThat (tabToken .line ()).isEqualTo (100 );
135
+ assertThat (tabToken .column ()).isEqualTo (300 );
136
+ assertThat (tabToken .includedEscapeChars ()).isEqualTo (1 );
137
+
138
+ var idToken = tokens .get (1 );
139
+ assertThat (idToken .line ()).isEqualTo (100 );
140
+ assertThat (idToken .column ()).isEqualTo (302 );
141
+ assertThat (idToken .includedEscapeChars ()).isZero ();
142
+
143
+ var eofToken = tokens .get (2 );
144
+ assertThat (eofToken .line ()).isEqualTo (100 );
145
+ assertThat (eofToken .column ()).isEqualTo (303 );
146
+ assertThat (eofToken .includedEscapeChars ()).isZero ();
147
+ }
148
+
124
149
@ Test
125
150
void shouldComputeColCorrectlyForTrivia () {
126
151
var code = "a = 3 # comment" ;
127
152
var expectedTokens = lexer .lex (code );
128
- var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 , Map . of (- 1 , 0 ) )));
153
+ var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 )));
129
154
var trivias = tokens .get (tokens .size () - 1 ).trivia ();
130
155
assertThat (trivias ).hasSize (1 );
131
156
assertThat (trivias .get (0 ).token ().line ()).isEqualTo (100 );
@@ -137,7 +162,8 @@ void shouldComputeColCorrectlyForTrivia() {
137
162
void shouldComputeColCorrectlyForTriviaWithEscapeChar () {
138
163
var code = "a = 3 # test\\ n" ;
139
164
var expectedTokens = lexer .lex (code );
140
- var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 , Map .of (-1 , 1 , 12 , 13 ))));
165
+ var escapedChars = mapToColumnMappingList (Map .of (12 , 1 ));
166
+ var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 , escapedChars )));
141
167
var trivias = tokens .get (tokens .size () - 1 ).trivia ();
142
168
assertThat (trivias ).hasSize (1 );
143
169
assertThat (trivias .get (0 ).token ().line ()).isEqualTo (100 );
@@ -149,7 +175,8 @@ void shouldComputeColCorrectlyForTriviaWithEscapeChar() {
149
175
void shouldComputeColCorrectlyForTriviaOnDifferentLine () {
150
176
var code = "# comment\n a = 3" ;
151
177
var expectedTokens = lexer .lex (code );
152
- var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 , Map .of (-1 , 0 )), 2 , new IPythonLocation (101 , 300 , Map .of (-1 , 0 ))));
178
+ var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 ), 2 ,
179
+ new IPythonLocation (101 , 300 )));
153
180
assertThat (tokens .get (0 ).line ()).isEqualTo (101 );
154
181
var trivias = tokens .get (0 ).trivia ();
155
182
assertThat (trivias ).hasSize (1 );
@@ -162,10 +189,7 @@ void shouldComputeColCorrectlyForTriviaOnDifferentLine() {
162
189
void shouldComputeCorrectlyForSingleQuote () {
163
190
var code = "a = '1'" ;
164
191
var expectedTokens = lexer .lex (code );
165
- var escapedChars = new LinkedHashMap <Integer , Integer >();
166
- escapedChars .put (4 , 305 );
167
- escapedChars .put (6 , 308 );
168
- var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 , escapedChars )));
192
+ var tokens = TokenEnricher .enrichTokens (expectedTokens , Map .of (1 , new IPythonLocation (100 , 300 )));
169
193
var stringToken = tokens .get (2 );
170
194
assertThat (stringToken .line ()).isEqualTo (100 );
171
195
assertThat (stringToken .column ()).isEqualTo (304 );
0 commit comments