28
28
import java .util .function .Function ;
29
29
import java .util .stream .Collectors ;
30
30
import org .junit .Before ;
31
- import org .junit .Ignore ;
32
31
import org .junit .Test ;
33
32
import org .sonar .api .utils .log .LogTester ;
34
33
import org .sonar .api .utils .log .LoggerLevel ;
@@ -115,7 +114,7 @@ public void none_type() {
115
114
116
115
@ Test
117
116
public void typing_module () {
118
- Map <String , Symbol > symbols = TypeShed . symbolsForModule ("typing" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
117
+ Map <String , Symbol > symbols = symbolsForModule ("typing" );
119
118
assertThat (symbols .values ()).allMatch (symbol -> symbol .usages ().isEmpty ());
120
119
// python3 specific
121
120
assertThat (symbols .get ("Awaitable" ).kind ()).isEqualTo (Kind .CLASS );
@@ -125,25 +124,25 @@ public void typing_module() {
125
124
126
125
@ Test
127
126
public void stdlib_symbols () {
128
- Map <String , Symbol > mathSymbols = TypeShed . symbolsForModule ("math" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
127
+ Map <String , Symbol > mathSymbols = symbolsForModule ("math" );
129
128
Symbol acosSymbol = mathSymbols .get ("acos" );
130
129
assertThat (acosSymbol .kind ()).isEqualTo (Kind .FUNCTION );
131
130
assertThat (((FunctionSymbolImpl ) acosSymbol ).declaredReturnType ().canOnlyBe ("float" )).isTrue ();
132
131
assertThat (TypeShed .symbolWithFQN ("math" , "math.acos" )).isSameAs (acosSymbol );
133
132
assertThat (mathSymbols .values ()).allMatch (symbol -> symbol .usages ().isEmpty ());
134
133
135
- Map <String , Symbol > threadingSymbols = TypeShed . symbolsForModule ("threading" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
134
+ Map <String , Symbol > threadingSymbols = symbolsForModule ("threading" );
136
135
assertThat (threadingSymbols .get ("Thread" ).kind ()).isEqualTo (Kind .CLASS );
137
136
assertThat (threadingSymbols .values ()).allMatch (symbol -> symbol .usages ().isEmpty ());
138
137
139
- Map <String , Symbol > imaplibSymbols = TypeShed . symbolsForModule ("imaplib" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
138
+ Map <String , Symbol > imaplibSymbols = symbolsForModule ("imaplib" );
140
139
assertThat (imaplibSymbols ).isNotEmpty ();
141
140
assertThat (imaplibSymbols .values ()).allMatch (symbol -> symbol .usages ().isEmpty ());
142
141
}
143
142
144
143
@ Test
145
144
public void third_party_symbols () {
146
- Map <String , Symbol > emojiSymbols = TypeShed . symbolsForModule ("emoji" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
145
+ Map <String , Symbol > emojiSymbols = symbolsForModule ("emoji" );
147
146
Symbol emojizeSymbol = emojiSymbols .get ("emojize" );
148
147
assertThat (emojizeSymbol .kind ()).isEqualTo (Kind .FUNCTION );
149
148
assertThat (((FunctionSymbolImpl ) emojizeSymbol ).declaredReturnType ().canOnlyBe ("str" )).isTrue ();
@@ -166,7 +165,7 @@ public void should_resolve_packages() {
166
165
167
166
@ Test
168
167
public void package_symbols () {
169
- Map <String , Symbol > cursesSymbols = TypeShed . symbolsForModule ("curses" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
168
+ Map <String , Symbol > cursesSymbols = symbolsForModule ("curses" );
170
169
Symbol wrapperSymbol = cursesSymbols .get ("wrapper" );
171
170
assertThat (wrapperSymbol .kind ()).isEqualTo (Kind .FUNCTION );
172
171
assertThat (((FunctionSymbolImpl ) wrapperSymbol ).declaredReturnType ()).isEqualTo (AnyType .ANY );
@@ -175,7 +174,7 @@ public void package_symbols() {
175
174
176
175
@ Test
177
176
public void package_submodules_symbols () {
178
- Map <String , Symbol > asciiSymbols = TypeShed . symbolsForModule ("curses.ascii" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
177
+ Map <String , Symbol > asciiSymbols = symbolsForModule ("curses.ascii" );
179
178
Symbol isalnumSymbol = asciiSymbols .get ("isalnum" );
180
179
assertThat (isalnumSymbol .kind ()).isEqualTo (Kind .FUNCTION );
181
180
assertThat (((FunctionSymbolImpl ) isalnumSymbol ).declaredReturnType ().canOnlyBe ("bool" )).isTrue ();
@@ -184,7 +183,7 @@ public void package_submodules_symbols() {
184
183
185
184
@ Test
186
185
public void package_inner_submodules_symbols () {
187
- Map <String , Symbol > driverSymbols = TypeShed . symbolsForModule ("lib2to3.pgen2.driver" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
186
+ Map <String , Symbol > driverSymbols = symbolsForModule ("lib2to3.pgen2.driver" );
188
187
Symbol loadGrammarSymbol = driverSymbols .get ("load_grammar" );
189
188
// There is a small difference between Python 2 and Python 3 symbols: Python 2 uses Text instead of str
190
189
assertThat (loadGrammarSymbol .kind ()).isEqualTo (Kind .AMBIGUOUS );
@@ -193,7 +192,7 @@ public void package_inner_submodules_symbols() {
193
192
194
193
@ Test
195
194
public void package_relative_import () {
196
- Map <String , Symbol > osSymbols = TypeShed . symbolsForModule ("os" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity (), AmbiguousSymbolImpl :: create ) );
195
+ Map <String , Symbol > osSymbols = symbolsForModule ("os" );
197
196
// TODO: Add imported symbols SONARPY-938
198
197
// Symbol sysSymbol = osSymbols.get("sys");
199
198
// assertThat(sysSymbol.kind()).isEqualTo(Kind.AMBIGUOUS);
@@ -202,35 +201,33 @@ public void package_relative_import() {
202
201
assertThat (timesResult .kind ()).isEqualTo (Kind .CLASS );
203
202
assertThat (timesResult .fullyQualifiedName ()).isEqualTo ("posix.times_result" );
204
203
205
- Map <String , Symbol > requestsSymbols = TypeShed . symbolsForModule ("requests" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity (), AmbiguousSymbolImpl :: create ) );
204
+ Map <String , Symbol > requestsSymbols = symbolsForModule ("requests" );
206
205
Symbol requestSymbol = requestsSymbols .get ("request" );
207
206
assertThat (requestSymbol .kind ()).isEqualTo (Kind .FUNCTION );
208
207
assertThat (requestSymbol .fullyQualifiedName ()).isEqualTo ("requests.api.request" );
209
208
}
210
209
211
210
@ Test
212
211
public void package_member_fqn_points_to_original_fqn () {
213
- Map <String , Symbol > symbols = TypeShed . symbolsForModule ("flask" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
212
+ Map <String , Symbol > symbols = symbolsForModule ("flask" );
214
213
Symbol targetSymbol = symbols .get ("Response" );
215
214
assertThat (targetSymbol .fullyQualifiedName ()).isEqualTo ("flask.wrappers.Response" );
216
215
assertThat (TypeShed .symbolWithFQN ("flask" , "flask.Response" )).isSameAs (targetSymbol );
217
216
}
218
217
219
- // TODO: there shouldn't be more than two symbols with the same name SONARPY-941
220
- // TODO: FileIO is ambiguous and it has FQN null
221
- @ Ignore
218
+
219
+ @ Test
222
220
public void package_member_ambigous_symbol_common_fqn () {
223
- Map <String , Symbol > symbols = TypeShed . symbolsForModule ("io" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
221
+ Map <String , Symbol > symbols = symbolsForModule ("io" );
224
222
Symbol targetSymbol = symbols .get ("FileIO" );
225
223
assertThat (targetSymbol .fullyQualifiedName ()).isEqualTo ("io.FileIO" );
226
224
assertThat (TypeShed .symbolWithFQN ("io" , "io.FileIO" )).isSameAs (targetSymbol );
227
225
}
228
226
229
227
@ Test
230
228
public void two_exported_symbols_with_same_local_names () {
231
- // TODO: there shouldn't be more than two symbols with the same name SONARPY-941
232
- Map <String , Symbol > osSymbols = TypeShed .symbolsForModule ("os" ).stream ().collect (Collectors .toMap (Symbol ::name , Function .identity (), AmbiguousSymbolImpl ::create ));
233
- Map <String , Symbol > posixSymbols = TypeShed .symbolsForModule ("posix" ).stream ().collect (Collectors .toMap (Symbol ::name , Function .identity (), AmbiguousSymbolImpl ::create ));
229
+ Map <String , Symbol > osSymbols = symbolsForModule ("os" );
230
+ Map <String , Symbol > posixSymbols = symbolsForModule ("posix" );
234
231
Symbol setupSymbolFromPosix = posixSymbols .get ("stat_result" );
235
232
Symbol setupSymbolFromOs = osSymbols .get ("stat_result" );
236
233
assertThat (setupSymbolFromPosix .kind ()).isEqualTo (Kind .CLASS );
@@ -239,32 +236,32 @@ public void two_exported_symbols_with_same_local_names() {
239
236
240
237
@ Test
241
238
public void package_django () {
242
- Map <String , Symbol > djangoSymbols = TypeShed . symbolsForModule ("django.http" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity (), AmbiguousSymbolImpl :: create ) );
239
+ Map <String , Symbol > djangoSymbols = symbolsForModule ("django.http" );
243
240
Symbol responseSymbol = djangoSymbols .get ("HttpResponse" );
244
241
assertThat (responseSymbol .kind ()).isEqualTo (Kind .CLASS );
245
242
assertThat (responseSymbol .fullyQualifiedName ()).isEqualTo ("django.http.response.HttpResponse" );
246
243
}
247
244
248
245
@ Test
249
246
public void return_type_hints () {
250
- Map <String , Symbol > symbols = TypeShed . symbolsForModule ("typing" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
247
+ Map <String , Symbol > symbols = symbolsForModule ("typing" );
251
248
assertThat (((FunctionSymbolImpl ) symbols .get ("get_args" )).annotatedReturnTypeName ()).isEqualTo ("tuple" );
252
- symbols = TypeShed . symbolsForModule ("flask_mail" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
249
+ symbols = symbolsForModule ("flask_mail" );
253
250
ClassSymbol mail = (ClassSymbol ) symbols .get ("Mail" );
254
251
assertThat (((FunctionSymbol ) mail .declaredMembers ().stream ().iterator ().next ()).annotatedReturnTypeName ()).isNull ();
255
252
}
256
253
257
254
@ Test
258
255
public void package_django_class_property_type () {
259
- Map <String , Symbol > djangoSymbols = TypeShed . symbolsForModule ("django.http.request" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity (), AmbiguousSymbolImpl :: create ) );
256
+ Map <String , Symbol > djangoSymbols = symbolsForModule ("django.http.request" );
260
257
Symbol requestSymbol = djangoSymbols .get ("HttpRequest" );
261
258
assertThat (requestSymbol .kind ()).isEqualTo (Kind .CLASS );
262
259
assertThat (((ClassSymbol ) requestSymbol ).declaredMembers ().iterator ().next ().annotatedTypeName ()).isEqualTo ("django.http.request.QueryDict" );
263
260
}
264
261
265
262
@ Test
266
263
public void package_sqlite3_connect_type_in_ambiguous_symbol () {
267
- Map <String , Symbol > djangoSymbols = TypeShed . symbolsForModule ("sqlite3" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity (), AmbiguousSymbolImpl :: create ) );
264
+ Map <String , Symbol > djangoSymbols = symbolsForModule ("sqlite3" );
268
265
Symbol requestSymbol = djangoSymbols .get ("connect" );
269
266
assertThat (((FunctionSymbolImpl ) ((((AmbiguousSymbolImpl ) requestSymbol ).alternatives ()).toArray ()[0 ])).annotatedReturnTypeName ()).isEqualTo ("sqlite3.dbapi2.Connection" );
270
267
}
@@ -454,7 +451,7 @@ public void symbolWithFQN_should_be_consistent() {
454
451
TypeShed .symbolsForModule ("smtplib" );
455
452
Symbol sequence = TypeShed .symbolWithFQN ("typing.Sequence" );
456
453
assertThat (sequence .kind ()).isEqualTo (Kind .AMBIGUOUS );
457
- Map <String , Symbol > typing = TypeShed . symbolsForModule ("typing" ). stream (). collect ( Collectors . toMap ( Symbol :: name , Function . identity ()) );
454
+ Map <String , Symbol > typing = symbolsForModule ("typing" );
458
455
assertThat (sequence ).isSameAs (typing .get ("Sequence" ));
459
456
}
460
457
@@ -463,4 +460,10 @@ private static SymbolsProtos.ModuleSymbol moduleSymbol(String protobuf) throws T
463
460
TextFormat .merge (protobuf , builder );
464
461
return builder .build ();
465
462
}
463
+
464
+ private static Map <String , Symbol > symbolsForModule (String moduleName ) {
465
+ Set <Symbol > symbols = TypeShed .symbolsForModule (moduleName );
466
+ assertThat (symbols .stream ().map (Symbol ::name )).doesNotHaveDuplicates ();
467
+ return symbols .stream ().collect (Collectors .toMap (Symbol ::name , Function .identity ()));
468
+ }
466
469
}
0 commit comments