blob: 42e28200c3930b442ef06a969b9f0d8e4e425d8f [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../../client/completion_driver_test.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(HideClauseTest);
defineReflectiveTests(ImportDirectiveTest);
defineReflectiveTests(ShowClauseTest);
});
}
@reflectiveTest
class HideClauseTest extends AbstractCompletionDriverTest
with HideClauseTestCases {}
mixin HideClauseTestCases on AbstractCompletionDriverTest {
Future<void> test_afterComma_beforeSemicolon() async {
allowedIdentifiers = {'pi'};
await computeSuggestions('''
import "dart:math" hide pi, ^;
''');
// The purpose of this test is to ensure that `pi` is not suggested.
assertResponse(r'''
suggestions
''');
}
Future<void> test_afterHide_beforeSemicolon() async {
newFile('$testPackageLibPath/ab.dart', '''
part "ab_part.dart";
class A0 {}
class B0 {}
''');
newFile('$testPackageLibPath/ab_part.dart', '''
part of 'ab.dart';
var T1;
P0 F1() => new P0();
class P0 {}
''');
newFile('$testPackageLibPath/cd.dart', '''
class C0 {}
class D0 {}
''');
await computeSuggestions('''
import "ab.dart" hide ^;
import "cd.dart";
class F0 {}
''');
// Part of the purpose of this test is to ensure that we don't suggest names
// from other imports ('C0' and 'D0') or locally defined names ('F0').
// TODO(scheglov): It might be also interesting what happens when we have
// just a getter, just a setter, a pair of a getter and a setter.
assertResponse(r'''
suggestions
A0
kind: class
B0
kind: class
P0
kind: class
F1
kind: function
T1
kind: topLevelVariable
''');
}
}
@reflectiveTest
class ImportDirectiveTest extends AbstractCompletionDriverTest
with ImportDirectiveTestCases {}
mixin ImportDirectiveTestCases on AbstractCompletionDriverTest {
Future<void> test_afterDeferred_beforeSemicolon() async {
await computeSuggestions('''
import "foo" deferred ^;
''');
assertResponse(r'''
suggestions
as
kind: keyword
''');
}
Future<void> test_afterDeferred_beforeSemicolon_partial() async {
await computeSuggestions('''
import "foo" deferred a^
''');
assertResponse(r'''
replacement
left: 1
suggestions
as
kind: keyword
''');
}
Future<void> test_afterLeftQuote_beforeRightQuote() async {
await computeSuggestions('''
import "^"
''');
assertResponse(r'''
suggestions
dart:
kind: import
dart:async
kind: import
dart:async2
kind: import
dart:collection
kind: import
dart:convert
kind: import
dart:ffi
kind: import
dart:html
kind: import
dart:io
kind: import
dart:isolate
kind: import
dart:js
kind: import
dart:js_interop
kind: import
dart:math
kind: import
dart:typed_data
kind: import
package:
kind: import
package:test/
kind: import
package:test/test.dart
kind: import
dart:core
kind: import
''');
}
Future<void> test_afterPrefix_beforeSemicolon() async {
await computeSuggestions('''
import "foo" as foo ^;
''');
assertResponse(r'''
suggestions
hide
kind: keyword
show
kind: keyword
''');
}
Future<void> test_afterPrefix_beforeSemicolon_deferred() async {
await computeSuggestions('''
import "foo" deferred as foo ^;
''');
assertResponse(r'''
suggestions
hide
kind: keyword
show
kind: keyword
''');
}
Future<void> test_afterUri_beforeAs() async {
await computeSuggestions('''
import "foo" ^ as foo;
''');
assertResponse(r'''
suggestions
deferred
kind: keyword
''');
}
Future<void> test_afterUri_beforeAs_partial_d() async {
await computeSuggestions('''
import "foo" d^ as foo;
''');
assertResponse(r'''
replacement
left: 1
suggestions
deferred
kind: keyword
''');
}
Future<void> test_afterUri_beforeAs_partial_def() async {
await computeSuggestions('''
import "package:foo/foo.dart" def^ as foo;
''');
assertResponse(r'''
replacement
left: 3
suggestions
deferred
kind: keyword
''');
}
Future<void> test_afterUri_beforeEnd() async {
await computeSuggestions('''
import "foo" ^
''');
assertResponse(r'''
suggestions
as
kind: keyword
deferred as
kind: keyword
hide
kind: keyword
show
kind: keyword
''');
}
Future<void> test_afterUri_beforeEnd_partial() async {
await computeSuggestions('''
import "foo" d^
''');
assertResponse(r'''
replacement
left: 1
suggestions
deferred as
kind: keyword
''');
}
Future<void> test_afterUri_beforeHide_partial() async {
await computeSuggestions('''
import "foo" d^ hide foo;
''');
assertResponse(r'''
replacement
left: 1
suggestions
deferred as
kind: keyword
hide
kind: keyword
''');
}
Future<void> test_afterUri_beforeImport_partial_d() async {
await computeSuggestions('''
import "foo" d^
import
''');
assertResponse(r'''
replacement
left: 1
suggestions
deferred as
kind: keyword
''');
}
Future<void> test_afterUri_beforeImport_partial_sh() async {
await computeSuggestions('''
import "foo" sh^
import "bar";
import "baz";
''');
assertResponse(r'''
replacement
left: 2
suggestions
show
kind: keyword
''');
}
Future<void> test_afterUri_beforeSemicolon() async {
await computeSuggestions('''
import "foo" ^;
''');
assertResponse(r'''
suggestions
as
kind: keyword
deferred as
kind: keyword
hide
kind: keyword
show
kind: keyword
''');
}
Future<void> test_afterUri_beforeSemicolon_partial() async {
await computeSuggestions('''
import "foo" d^;
''');
assertResponse(r'''
replacement
left: 1
suggestions
deferred as
kind: keyword
''');
}
Future<void> test_afterUri_beforeShow_partial() async {
await computeSuggestions('''
import "foo" d^ show foo;
''');
assertResponse(r'''
replacement
left: 1
suggestions
deferred as
kind: keyword
hide
kind: keyword
''');
}
}
@reflectiveTest
class ShowClauseTest extends AbstractCompletionDriverTest
with ShowClauseTestCases {}
mixin ShowClauseTestCases on AbstractCompletionDriverTest {
Future<void> test_afterComma_beforeSemicolon() async {
await computeSuggestions('''
import "dart:math" show pi, ^;
''');
// The purpose of this test is to ensure that `pi` is not suggested.
assertResponse(r'''
suggestions
''');
}
Future<void> test_afterShow_beforeSemicolon() async {
newFile('$testPackageLibPath/ab.dart', '''
part "ab_part.dart";
class A0 {}
class B0 {}
class _A1 {}
void f(_A1 a) {}
''');
newFile('$testPackageLibPath/ab_part.dart', '''
part of 'ab.dart';
var T1;
P1 F1() => new P1();
typedef P1 F2(int blat);
class C1 = Object with M;
class P1 {}
mixin M {}
''');
newFile('$testPackageLibPath/cd.dart', '''
class C0 {}
class D0 {}
''');
await computeSuggestions('''
import "ab.dart" show ^;
import "cd.dart";
class G0 {}
''');
// Part of the purpose of this test is to ensure that we don't suggest names
// from other imports ('C0' and 'D0') or locally defined names ('G0').
assertResponse(r'''
suggestions
A0
kind: class
B0
kind: class
C1
kind: class
P1
kind: class
T1
kind: topLevelVariable
F1
kind: function
F2
kind: typeAlias
''');
}
Future<void> test_afterShow_beforeSemicolon_math() async {
allowedIdentifiers = {'pi'};
await computeSuggestions('''
import "dart:math" show ^;
''');
assertResponse(r'''
suggestions
pi
kind: topLevelVariable
''');
}
Future<void> test_afterShow_beforeSemicolon_recursiveExport() async {
newFile('$testPackageLibPath/a.dart', '''
class A0 {}
''');
newFile('$testPackageLibPath/b.dart', '''
export 'a.dart';
export 'b.dart';
class B0 {}
''');
await computeSuggestions('''
import "b.dart" show ^;
''');
assertResponse(r'''
suggestions
A0
kind: class
B0
kind: class
''');
}
Future<void> test_afterShow_beforeSemicolon_withRestrictedExport() async {
newFile('$testPackageLibPath/a.dart', '''
class A0 {}
class B0 {}
''');
newFile('$testPackageLibPath/b.dart', '''
export 'a.dart' show A0;
''');
await computeSuggestions('''
import 'b.dart' show ^;
''');
// The purpose of this test is to ensure that `B0` is not suggested.
assertResponse(r'''
suggestions
A0
kind: class
''');
}
}