blob: 78579f890a47288fb013a88f24eb4b7b856a72ce [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:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../../client/completion_driver_test.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(UriTest);
});
}
@reflectiveTest
class UriTest extends AbstractCompletionDriverTest with UriTestCases {}
mixin UriTestCases on AbstractCompletionDriverTest {
@override
bool get includeKeywords => false;
@override
Future<void> setUp() async {
await super.setUp();
allowedKinds = {CompletionSuggestionKind.IMPORT};
}
Future<void> test_after_import() async {
await computeSuggestions('''
import "p"^
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_after_import_raw() async {
await computeSuggestions('''
import r"p"^
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_before_import() async {
await computeSuggestions('''
import ^"p"
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_before_import_raw() async {
await computeSuggestions('''
import ^r"p"
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_before_import_raw2() async {
await computeSuggestions('''
import r^"p"
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_export_package2() async {
var fooRootPath = '$workspaceRootPath/foo';
var barRootPath = '$workspaceRootPath/bar';
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'foo', rootPath: fooRootPath)
..add(name: 'bar', rootPath: barRootPath),
);
newFile('$fooRootPath/lib/foo.dart', '''
library foo;
''');
newFile('$fooRootPath/lib/baz/too.dart', '''
library too;
''');
newFile('$barRootPath/lib/bar.dart', '''
library bar;
''');
await computeSuggestions('''
export "package:foo/baz/^" import
''');
assertResponse(r'''
replacement
left: 16
suggestions
package:foo/baz/
kind: import
package:foo/baz/too.dart
kind: import
''');
}
Future<void> test_import() 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_import2() async {
await computeSuggestions('''
import "^" 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_import3() async {
await computeSuggestions('''
import "^ import
''');
assertResponse(r'''
replacement
right: 7
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_import_configuration() async {
await computeSuggestions('''
import "" if (dart.library.io) "^"
''');
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_import_configuration_without_closing_quote_eof() async {
await computeSuggestions('''
import "" if (dart.library.io) "^
''');
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_import_configuration_without_closing_quote_eof2() async {
await computeSuggestions('''
import "" if (dart.library.io) "^d
''');
assertResponse(r'''
replacement
right: 1
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_import_configuration_without_closing_quote_eof3() async {
await computeSuggestions('''
import "" if (dart.library.io) "d^
''');
// TODO(brianwilkerson): We should be suggesting `dart:` and `package:`. The
// test used to include those before being converted, but no longer does.
assertResponse(r'''
replacement
left: 1
suggestions
''');
}
Future<void> test_import_configuration_without_closing_quote_eof4() async {
await computeSuggestions('''
import "" if (dart.library.io) "d^"
''');
assertResponse(r'''
replacement
left: 1
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:test/test.dart
kind: import
dart:core
kind: import
''');
}
Future<void> test_import_dart() async {
await computeSuggestions('''
import "d^" import
''');
assertResponse(r'''
replacement
left: 1
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
dart:core
kind: import
''');
}
Future<void> test_import_dart2() async {
await computeSuggestions('''
import "dart:async"; import "d^"
''');
assertResponse(r'''
replacement
left: 1
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
dart:core
kind: import
''');
}
Future<void> test_import_file() async {
newFile('$testPackageRootPath/other.dart', '');
newFile('$testPackageRootPath/foo/bar.dart', '');
newFile('$workspaceRootPath/blat.dart', '');
await computeSuggestions('''
import "^" import
''');
// TODO(brianwilkerson): Before being converted, this test used to produce
// 'other.dart' and 'foo/'.
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_import_file2() async {
newFile('$testPackageRootPath/other.dart', '');
newFile('$testPackageRootPath/foo/bar.dart', '');
newFile('$workspaceRootPath/blat.dart', '');
await computeSuggestions('''
import "..^" import
''');
// TODO(brianwilkerson): Before being converted, this test used to produce
// 'other.dart' and 'foo/'.
assertResponse(r'''
replacement
left: 2
suggestions
''');
}
Future<void> test_import_file_child() async {
newFile('$testPackageRootPath/other.dart', '');
newFile('$testPackageRootPath/foo/bar.dart', '');
newFile('$workspaceRootPath/blat.dart', '');
await computeSuggestions('''
import "foo/^" import
''');
// TODO(brianwilkerson): Before being converted, this test used to produce
// 'foo/bar.dart'.
assertResponse(r'''
replacement
left: 4
suggestions
''');
}
Future<void> test_import_file_outside_lib() async {
newFile('$testPackageLibPath/other.dart', '''
''');
newFile('$testPackageLibPath/foo/bar.dart', '''
''');
newFile('$testPackageRootPath/blat.dart', '''
''');
newFile('$testPackageRootPath/bin/boo.dart', '''
''');
await computeSuggestions('''
import "../^" import
''');
assertResponse(r'''
replacement
left: 3
suggestions
''');
}
Future<void> test_import_file_parent() async {
newFile('$testPackageRootPath/other.dart', '');
newFile('$testPackageRootPath/foo/bar.dart', '');
newFile('$workspaceRootPath/blat.dart', '');
newFile('$workspaceRootPath/aaa/boo.dart', '');
await computeSuggestions('''
import "../^" import
''');
// TODO(brianwilkerson): Before being converted this test used to produce
// '../blat.dart' and '../aaa/'.
assertResponse(r'''
replacement
left: 3
suggestions
''');
}
Future<void> test_import_file_parent2() async {
newFile('$testPackageRootPath/other.dart', '');
newFile('$testPackageRootPath/foo/bar.dart', '');
newFile('$workspaceRootPath/blat.dart', '');
await computeSuggestions('''
import "../b^" import
''');
// TODO(brianwilkerson): Before being converted, this test used to produce
// '../blat.dart'.
assertResponse(r'''
replacement
left: 4
suggestions
''');
}
Future<void> test_import_no_dot_folders() async {
newFolder('$testPackageRootPath/.foo');
await computeSuggestions('''
import "package:^";
''');
assertResponse(r'''
replacement
left: 8
suggestions
package:
kind: import
package:test/
kind: import
''');
}
Future<void> test_import_only_dart_files() async {
newAnalysisOptionsYamlFile(testPackageRootPath, '');
newFile('$testPackageRootPath/other.dart', '');
await computeSuggestions('''
import "package:^";
''');
assertResponse(r'''
replacement
left: 8
suggestions
package:
kind: import
package:test/
kind: import
''');
}
Future<void> test_import_package() async {
var fooRootPath = '$workspaceRootPath/foo';
var barRootPath = '$workspaceRootPath/bar';
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'foo', rootPath: fooRootPath)
..add(name: 'bar', rootPath: barRootPath),
);
newFile('$fooRootPath/lib/foo.dart', '''
''');
newFile('$fooRootPath/lib/baz/too.dart', '''
''');
newFile('$barRootPath/lib/bar.dart', '''
''');
await computeSuggestions('''
import "p^" import
''');
assertResponse(r'''
replacement
left: 1
suggestions
package:
kind: import
package:bar/
kind: import
package:foo/
kind: import
package:test/
kind: import
''');
}
Future<void> test_import_package2() async {
var fooRootPath = '$workspaceRootPath/foo';
var barRootPath = '$workspaceRootPath/bar';
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'foo', rootPath: fooRootPath)
..add(name: 'bar', rootPath: barRootPath),
);
newFile('$fooRootPath/lib/foo.dart', '''
''');
newFile('$fooRootPath/lib/baz/too.dart', '''
''');
newFile('$barRootPath/lib/bar.dart', '''
''');
await computeSuggestions('''
import "package:foo/baz/^" import
''');
assertResponse(r'''
replacement
left: 16
suggestions
package:foo/baz/
kind: import
package:foo/baz/too.dart
kind: import
''');
}
Future<void> test_import_package2_raw() async {
var fooRootPath = '$workspaceRootPath/foo';
var barRootPath = '$workspaceRootPath/bar';
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'foo', rootPath: fooRootPath)
..add(name: 'bar', rootPath: barRootPath),
);
newFile('$fooRootPath/lib/foo.dart', '''
''');
newFile('$fooRootPath/lib/baz/too.dart', '''
''');
newFile('$barRootPath/lib/bar.dart', '''
''');
await computeSuggestions('''
import r"package:foo/baz/^" import
''');
assertResponse(r'''
replacement
left: 16
suggestions
package:foo/baz/
kind: import
package:foo/baz/too.dart
kind: import
''');
}
Future<void> test_import_package2_with_trailing() async {
var fooRootPath = '$workspaceRootPath/foo';
var barRootPath = '$workspaceRootPath/bar';
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'foo', rootPath: fooRootPath)
..add(name: 'bar', rootPath: barRootPath),
);
newFile('$fooRootPath/lib/foo.dart', '''
''');
newFile('$fooRootPath/lib/baz/too.dart', '''
''');
newFile('$barRootPath/lib/bar.dart', '''
''');
await computeSuggestions('''
import "package:foo/baz/^.dart" import
''');
assertResponse(r'''
replacement
left: 16
right: 5
suggestions
package:foo/baz/
kind: import
package:foo/baz/too.dart
kind: import
''');
}
Future<void> test_import_package_missing_lib() async {
var barRootPath = '$workspaceRootPath/bar';
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'bar', rootPath: barRootPath),
);
await computeSuggestions('''
import "p^" class
''');
assertResponse(r'''
replacement
left: 1
suggestions
package:
kind: import
package:bar/
kind: import
package:test/
kind: import
''');
}
Future<void> test_import_package_raw() async {
var fooRootPath = '$workspaceRootPath/foo';
var barRootPath = '$workspaceRootPath/bar';
writeTestPackageConfig(
config: PackageConfigFileBuilder()
..add(name: 'foo', rootPath: fooRootPath)
..add(name: 'bar', rootPath: barRootPath),
);
newFile('$fooRootPath/lib/foo.dart', '''
''');
newFile('$fooRootPath/lib/baz/too.dart', '''
''');
newFile('$barRootPath/lib/bar.dart', '''
''');
await computeSuggestions('''
import r"p^" import
''');
assertResponse(r'''
replacement
left: 1
suggestions
package:
kind: import
package:bar/
kind: import
package:foo/
kind: import
package:test/
kind: import
''');
}
Future<void> test_import_raw() async {
await computeSuggestions('''
import r"^" 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_import_without_any_quotes() async {
await computeSuggestions('''
import ^ import
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_import_without_any_quotes_eof() async {
await computeSuggestions('''
import ^
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_import_without_closing_quote_eof() 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_import_without_closing_quote_eof2() async {
await computeSuggestions('''
import "^d
''');
assertResponse(r'''
replacement
right: 1
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_import_without_closing_quote_eof3() async {
await computeSuggestions('''
import "d^
''');
// TODO(brianwilkerson): Before being converted, this test used to produce
// 'dart:' and 'package:'.
assertResponse(r'''
replacement
left: 1
suggestions
''');
}
Future<void> test_import_without_closing_quote_eof4() async {
await computeSuggestions('''
import "d^"
''');
assertResponse(r'''
replacement
left: 1
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
dart:core
kind: import
''');
}
Future<void> test_outside_import() async {
await computeSuggestions('''
import ^"d" import
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_outside_import2() async {
await computeSuggestions('''
import "d"^ import
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_part_file() async {
newFile('$testPackageLibPath/a.dart', '');
newFile('$testPackageLibPath/foo/b.dart', '');
await computeSuggestions('''
part '^'
''');
assertResponse(r'''
suggestions
a.dart
kind: import
foo/
kind: import
''');
}
Future<void> test_part_file_child() async {
newFile('$testPackageLibPath/a.dart', '');
newFile('$testPackageLibPath/foo/b.dart', '');
await computeSuggestions('''
part 'foo/^'
''');
assertResponse(r'''
replacement
left: 4
suggestions
foo/b.dart
kind: import
''');
}
Future<void> test_part_file_parent() async {
testFilePath = getFile('$testPackageLibPath/foo/test.dart').path;
newFile('$testPackageLibPath/a.dart', '');
newFile('$testPackageLibPath/bar/b.dart', '');
await computeSuggestions('''
part '../^'
''');
assertResponse(r'''
replacement
left: 3
suggestions
../a.dart
kind: import
../bar/
kind: import
../foo/
kind: import
''');
}
Future<void> test_partOf_file() async {
newFile('$testPackageLibPath/a.dart', '');
newFile('$testPackageLibPath/foo/b.dart', '');
await computeSuggestions('''
part of '^'
''');
assertResponse(r'''
suggestions
a.dart
kind: import
foo/
kind: import
''');
}
}