27
27
import java .util .HashMap ;
28
28
import java .util .Map ;
29
29
import java .util .Set ;
30
- import java .util .function .Function ;
31
30
import java .util .stream .Collectors ;
32
31
import org .junit .Before ;
33
32
import org .junit .Test ;
48
47
49
48
import static org .assertj .core .api .Assertions .assertThat ;
50
49
import static org .assertj .core .api .Assertions .tuple ;
50
+ import static org .sonar .python .types .TypeShed .symbolsForModule ;
51
51
52
52
public class TypeShedTest {
53
53
@@ -153,16 +153,16 @@ public void third_party_symbols() {
153
153
154
154
@ Test
155
155
public void should_resolve_packages () {
156
- assertThat (TypeShed . symbolsForModule ("urllib" )).isNotEmpty ();
157
- assertThat (TypeShed . symbolsForModule ("ctypes" )).isNotEmpty ();
158
- assertThat (TypeShed . symbolsForModule ("email" )).isNotEmpty ();
159
- assertThat (TypeShed . symbolsForModule ("json" )).isNotEmpty ();
160
- assertThat (TypeShed . symbolsForModule ("docutils" )).isNotEmpty ();
161
- assertThat (TypeShed . symbolsForModule ("ctypes.util" )).isNotEmpty ();
162
- assertThat (TypeShed . symbolsForModule ("lib2to3.pgen2.grammar" )).isNotEmpty ();
156
+ assertThat (symbolsForModule ("urllib" )).isNotEmpty ();
157
+ assertThat (symbolsForModule ("ctypes" )).isNotEmpty ();
158
+ assertThat (symbolsForModule ("email" )).isNotEmpty ();
159
+ assertThat (symbolsForModule ("json" )).isNotEmpty ();
160
+ assertThat (symbolsForModule ("docutils" )).isNotEmpty ();
161
+ assertThat (symbolsForModule ("ctypes.util" )).isNotEmpty ();
162
+ assertThat (symbolsForModule ("lib2to3.pgen2.grammar" )).isNotEmpty ();
163
163
// resolved but still empty
164
- assertThat (TypeShed . symbolsForModule ("cryptography" )).isEmpty ();
165
- assertThat (TypeShed . symbolsForModule ("kazoo" )).isEmpty ();
164
+ assertThat (symbolsForModule ("cryptography" )).isEmpty ();
165
+ assertThat (symbolsForModule ("kazoo" )).isEmpty ();
166
166
}
167
167
168
168
@ Test
@@ -271,8 +271,8 @@ public void package_sqlite3_connect_type_in_ambiguous_symbol() {
271
271
272
272
@ Test
273
273
public void stub_files_symbols () {
274
- Set <Symbol > mathSymbols = TypeShed . symbolsForModule ("math" );
275
- Set <Symbol > djangoHttpSymbols = TypeShed . symbolsForModule ("django.http" );
274
+ Collection <Symbol > mathSymbols = symbolsForModule ("math" ). values ( );
275
+ Collection <Symbol > djangoHttpSymbols = symbolsForModule ("django.http" ). values ( );
276
276
277
277
Collection <Symbol > symbols = TypeShed .stubFilesSymbols ();
278
278
assertThat (symbols )
@@ -282,7 +282,7 @@ public void stub_files_symbols() {
282
282
283
283
@ Test
284
284
public void deserialize_annoy_protobuf () {
285
- Map <String , Symbol > deserializedAnnoySymbols = TypeShed . symbolsForModule ("annoy" ).stream ()
285
+ Map <String , Symbol > deserializedAnnoySymbols = symbolsForModule ("annoy" ). values ( ).stream ()
286
286
.collect (Collectors .toMap (Symbol ::fullyQualifiedName , s -> s ));
287
287
assertThat (deserializedAnnoySymbols .values ()).extracting (Symbol ::kind , Symbol ::fullyQualifiedName )
288
288
.containsExactlyInAnyOrder (tuple (Kind .CLASS , "annoy._Vector" ), tuple (Kind .CLASS , "annoy.AnnoyIndex" ));
@@ -321,7 +321,7 @@ public void deserialize_annoy_protobuf() {
321
321
322
322
@ Test
323
323
public void deserialize_nonexistent_or_incorrect_protobuf () {
324
- assertThat (TypeShed . symbolsForModule ("NOT_EXISTENT" )).isEmpty ();
324
+ assertThat (symbolsForModule ("NOT_EXISTENT" )).isEmpty ();
325
325
assertThat (TypeShed .getSymbolsFromProtobufModule (null )).isEmpty ();
326
326
InputStream targetStream = new ByteArrayInputStream ("foo" .getBytes ());
327
327
assertThat (TypeShed .deserializedModule ("mod" , targetStream )).isNull ();
@@ -451,7 +451,7 @@ public void pythonVersions() {
451
451
@ Test
452
452
public void symbolWithFQN_should_be_consistent () {
453
453
// smtplib imports typing.Sequence only in Python3, hence typing.Sequence has kind CLASS
454
- TypeShed . symbolsForModule ("smtplib" );
454
+ symbolsForModule ("smtplib" );
455
455
Symbol sequence = TypeShed .symbolWithFQN ("typing.Sequence" );
456
456
assertThat (sequence .kind ()).isEqualTo (Kind .AMBIGUOUS );
457
457
Map <String , Symbol > typing = symbolsForModule ("typing" );
@@ -464,12 +464,6 @@ private static SymbolsProtos.ModuleSymbol moduleSymbol(String protobuf) throws T
464
464
return builder .build ();
465
465
}
466
466
467
- private static Map <String , Symbol > symbolsForModule (String moduleName ) {
468
- Set <Symbol > symbols = TypeShed .symbolsForModule (moduleName );
469
- assertThat (symbols .stream ().map (Symbol ::name )).doesNotHaveDuplicates ();
470
- return symbols .stream ().collect (Collectors .toMap (Symbol ::name , Function .identity ()));
471
- }
472
-
473
467
@ Test
474
468
public void variables_from_protobuf () throws TextFormat .ParseException {
475
469
SymbolsProtos .ModuleSymbol moduleSymbol = moduleSymbol (
@@ -508,7 +502,19 @@ public void typeshed_common_symbols() {
508
502
python2Symbols .put ("a" , a1 );
509
503
python2Symbols .put ("b" , b );
510
504
Map <String , Symbol > python3Symbols = Collections .singletonMap ("a" , a2 );
511
- Set <Symbol > symbols = TypeShedThirdParties .commonSymbols (python2Symbols , python3Symbols , "mod" );
505
+ Collection <Symbol > symbols = TypeShedThirdParties .commonSymbols (python2Symbols , python3Symbols , "mod" ). values ( );
512
506
assertThat (symbols ).extracting (Symbol ::kind , Symbol ::name ).containsExactlyInAnyOrder (tuple (Kind .AMBIGUOUS , "a" ), tuple (Kind .OTHER , "b" ));
513
507
}
508
+
509
+ @ Test
510
+ public void symbol_from_submodule_access () {
511
+ Map <String , Symbol > os = symbolsForModule ("os" );
512
+ SymbolImpl path = (SymbolImpl ) os .get ("path" );
513
+ Symbol samefile = path .getChildrenSymbolByName ().get ("samefile" );
514
+ assertThat (samefile ).isNotNull ();
515
+
516
+ Map <String , Symbol > osPath = symbolsForModule ("os.path" );
517
+ Symbol samefileFromSubModule = osPath .get ("samefile" );
518
+ assertThat (samefileFromSubModule ).isSameAs (samefile );
519
+ }
514
520
}
0 commit comments