blob: 1589df0d629d27936c605db7a3558caf4eea710a [file] [log] [blame]
// Copyright (c) 2016, 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:analysis_server/src/services/correction/util.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../abstract_single_unit.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(UtilTest);
});
}
@reflectiveTest
class UtilTest extends AbstractSingleUnitTest {
test_addLibraryImports_dart_hasImports_between() async {
await resolveTestUnit('''
import 'dart:async';
import 'dart:math';
''');
Source newLibrary = _getDartSource('dart:collection');
_assertAddLibraryImport(<Source>[newLibrary], '''
import 'dart:async';
import 'dart:collection';
import 'dart:math';
''');
}
test_addLibraryImports_dart_hasImports_first() async {
await resolveTestUnit('''
import 'dart:collection';
import 'dart:math';
''');
Source newLibrary = _getDartSource('dart:async');
_assertAddLibraryImport(<Source>[newLibrary], '''
import 'dart:async';
import 'dart:collection';
import 'dart:math';
''');
}
test_addLibraryImports_dart_hasImports_last() async {
await resolveTestUnit('''
import 'dart:async';
import 'dart:collection';
''');
Source newLibrary = _getDartSource('dart:math');
_assertAddLibraryImport(<Source>[newLibrary], '''
import 'dart:async';
import 'dart:collection';
import 'dart:math';
''');
}
test_addLibraryImports_dart_hasImports_multiple() async {
await resolveTestUnit('''
import 'dart:collection';
import 'dart:math';
''');
Source newLibrary1 = _getDartSource('dart:async');
Source newLibrary2 = _getDartSource('dart:html');
_assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
import 'dart:async';
import 'dart:collection';
import 'dart:html';
import 'dart:math';
''');
}
test_addLibraryImports_dart_hasImports_multiple_first() async {
await resolveTestUnit('''
import 'dart:html';
import 'dart:math';
''');
Source newLibrary1 = _getDartSource('dart:async');
Source newLibrary2 = _getDartSource('dart:collection');
_assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
import 'dart:async';
import 'dart:collection';
import 'dart:html';
import 'dart:math';
''');
}
test_addLibraryImports_dart_hasImports_multiple_last() async {
await resolveTestUnit('''
import 'dart:async';
import 'dart:collection';
''');
Source newLibrary1 = _getDartSource('dart:html');
Source newLibrary2 = _getDartSource('dart:math');
_assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
import 'dart:async';
import 'dart:collection';
import 'dart:html';
import 'dart:math';
''');
}
test_addLibraryImports_dart_hasLibraryDirective() async {
await resolveTestUnit('''
library test;
class A {}
''');
Source newLibrary1 = _getDartSource('dart:math');
Source newLibrary2 = _getDartSource('dart:async');
_assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
library test;
import 'dart:async';
import 'dart:math';
class A {}
''');
}
test_addLibraryImports_dart_noDirectives_hasComment() async {
await resolveTestUnit('''
/// Comment.
class A {}
''');
Source newLibrary1 = _getDartSource('dart:math');
Source newLibrary2 = _getDartSource('dart:async');
_assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
/// Comment.
import 'dart:async';
import 'dart:math';
class A {}
''');
}
test_addLibraryImports_dart_noDirectives_hasShebang() async {
await resolveTestUnit('''
#!/bin/dart
class A {}
''');
Source newLibrary1 = _getDartSource('dart:math');
Source newLibrary2 = _getDartSource('dart:async');
_assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
#!/bin/dart
import 'dart:async';
import 'dart:math';
class A {}
''');
}
test_addLibraryImports_dart_noDirectives_noShebang() async {
await resolveTestUnit('''
class A {}
''');
Source newLibrary1 = _getDartSource('dart:math');
Source newLibrary2 = _getDartSource('dart:async');
_assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
import 'dart:async';
import 'dart:math';
class A {}
''');
}
test_addLibraryImports_package_hasDart_hasPackages_insertAfter() async {
addPackageSource('aaa', 'aaa.dart', '');
await resolveTestUnit('''
import 'dart:async';
import 'package:aaa/aaa.dart';
''');
Source newLibrary = _getSource('/lib/bbb.dart', 'package:bbb/bbb.dart');
_assertAddLibraryImport(<Source>[newLibrary], '''
import 'dart:async';
import 'package:aaa/aaa.dart';
import 'package:bbb/bbb.dart';
''');
}
test_addLibraryImports_package_hasDart_hasPackages_insertBefore() async {
addPackageSource('bbb', 'bbb.dart', '');
await resolveTestUnit('''
import 'dart:async';
import 'package:bbb/bbb.dart';
''');
Source newLibrary = _getSource('/lib/aaa.dart', 'package:aaa/aaa.dart');
_assertAddLibraryImport(<Source>[newLibrary], '''
import 'dart:async';
import 'package:aaa/aaa.dart';
import 'package:bbb/bbb.dart';
''');
}
test_addLibraryImports_package_hasImports_between() async {
addPackageSource('aaa', 'aaa.dart', '');
addPackageSource('ddd', 'ddd.dart', '');
await resolveTestUnit('''
import 'package:aaa/aaa.dart';
import 'package:ddd/ddd.dart';
''');
Source newLibrary1 = _getSource('/lib/bbb.dart', 'package:bbb/bbb.dart');
Source newLibrary2 = _getSource('/lib/ccc.dart', 'package:ccc/ccc.dart');
_assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
import 'package:aaa/aaa.dart';
import 'package:bbb/bbb.dart';
import 'package:ccc/ccc.dart';
import 'package:ddd/ddd.dart';
''');
}
void _assertAddLibraryImport(List<Source> newLibraries, String expectedCode) {
SourceChange change = new SourceChange('');
addLibraryImports(change, testLibraryElement, newLibraries.toSet());
SourceFileEdit testEdit = change.getFileEdit(testFile);
expect(testEdit, isNotNull);
String resultCode = SourceEdit.applySequence(testCode, testEdit.edits);
expect(resultCode, expectedCode);
}
Source _getDartSource(String uri) {
String path = removeStart(uri, 'dart:');
return new _SourceMock('/sdk/lib/$path.dart', Uri.parse(uri));
}
Source _getSource(String path, String uri) {
return new _SourceMock(path, Uri.parse(uri));
}
}
class _SourceMock implements Source {
@override
final String fullName;
@override
final Uri uri;
_SourceMock(this.fullName, this.uri);
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}