Extract DartFileEditBuilder.importLibrary() into separate file.

R=brianwilkerson@google.com

Change-Id: I2f4a4943ad4db573504a890e29424357e0775839
Reviewed-on: https://dart-review.googlesource.com/c/89722
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 1ed1d1d..b9d641f 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -28,6 +28,7 @@
     defineReflectiveTests(DartEditBuilderImplTest);
     defineReflectiveTests(DartFileEditBuilderImplTest);
     defineReflectiveTests(DartLinkedEditBuilderImplTest);
+    defineReflectiveTests(ImportLibraryTest);
   });
 }
 
@@ -77,318 +78,6 @@
 @reflectiveTest
 class DartEditBuilderImplTest extends AbstractContextTest
     with BuilderTestMixin {
-  test_importLibraries_DP() async {
-    await _assertImportLibrary('''
-import 'dart:aaa';
-import 'dart:ccc';
-
-import 'package:aaa/aaa.dart';
-import 'package:ccc/ccc.dart';
-''', ['dart:bbb', 'package:bbb/bbb.dart'], '''
-import 'dart:aaa';
-import 'dart:bbb';
-import 'dart:ccc';
-
-import 'package:aaa/aaa.dart';
-import 'package:bbb/bbb.dart';
-import 'package:ccc/ccc.dart';
-''');
-  }
-
-  test_importLibraries_PD() async {
-    await _assertImportLibrary('''
-import 'dart:aaa';
-import 'dart:ccc';
-
-import 'package:aaa/aaa.dart';
-import 'package:ccc/ccc.dart';
-''', ['package:bbb/bbb.dart', 'dart:bbb'], '''
-import 'dart:aaa';
-import 'dart:bbb';
-import 'dart:ccc';
-
-import 'package:aaa/aaa.dart';
-import 'package:bbb/bbb.dart';
-import 'package:ccc/ccc.dart';
-''');
-  }
-
-  test_importLibrary_afterLibraryDirective_dart() async {
-    await _assertImportLibrary('''
-library test;
-
-class A {}
-''', ['dart:async'], '''
-library test;
-
-import 'dart:async';
-
-
-class A {}
-''');
-  }
-
-  test_importLibrary_dart_beforeDart() async {
-    await _assertImportLibrary('''
-import 'dart:aaa';
-import 'dart:ccc';
-''', ['dart:bbb'], '''
-import 'dart:aaa';
-import 'dart:bbb';
-import 'dart:ccc';
-''');
-  }
-
-  test_importLibrary_dart_beforeDart_first() async {
-    await _assertImportLibrary('''
-import 'dart:bbb';
-''', ['dart:aaa'], '''
-import 'dart:aaa';
-import 'dart:bbb';
-''');
-  }
-
-  test_importLibrary_dart_beforePackage() async {
-    await _assertImportLibrary('''
-import 'package:foo/foo.dart';
-''', ['dart:async'], '''
-import 'dart:async';
-
-import 'package:foo/foo.dart';
-''');
-  }
-
-  test_importLibrary_noDirectives_docComment() async {
-    await _assertImportLibrary('''
-/// Documentation comment.
-/// Continues.
-void main() {}
-''', ['dart:async'], '''
-import 'dart:async';
-
-/// Documentation comment.
-/// Continues.
-void main() {}
-''');
-  }
-
-  test_importLibrary_noDirectives_hashBang() async {
-    await _assertImportLibrary('''
-#!/bin/dart
-
-void main() {}
-''', ['dart:async'], '''
-#!/bin/dart
-
-import 'dart:async';
-
-void main() {}
-''');
-  }
-
-  test_importLibrary_noDirectives_lineComment() async {
-    await _assertImportLibrary('''
-// Not documentation comment.
-// Continues.
-
-void main() {}
-''', ['dart:async'], '''
-// Not documentation comment.
-// Continues.
-
-import 'dart:async';
-
-void main() {}
-''');
-  }
-
-  test_importLibrary_package_afterDart() async {
-    await _assertImportLibrary('''
-import 'dart:async';
-''', ['package:aaa/aaa.dart'], '''
-import 'dart:async';
-
-import 'package:aaa/aaa.dart';
-''');
-  }
-
-  test_importLibrary_package_afterPackage() async {
-    await _assertImportLibrary('''
-import 'package:aaa/a1.dart';
-
-import 'foo.dart';
-''', ['package:aaa/a2.dart'], '''
-import 'package:aaa/a1.dart';
-import 'package:aaa/a2.dart';
-
-import 'foo.dart';
-''');
-  }
-
-  test_importLibrary_package_afterPackage_leadingComment() async {
-    await _assertImportLibrary('''
-// comment
-import 'package:aaa/a1.dart';
-
-import 'foo.dart';
-''', ['package:aaa/a2.dart'], '''
-// comment
-import 'package:aaa/a1.dart';
-import 'package:aaa/a2.dart';
-
-import 'foo.dart';
-''');
-  }
-
-  test_importLibrary_package_afterPackage_trailingComment() async {
-    await _assertImportLibrary('''
-import 'package:aaa/a1.dart'; // comment
-
-import 'foo.dart';
-''', ['package:aaa/a2.dart'], '''
-import 'package:aaa/a1.dart'; // comment
-import 'package:aaa/a2.dart';
-
-import 'foo.dart';
-''');
-  }
-
-  test_importLibrary_package_beforePackage() async {
-    await _assertImportLibrary('''
-import 'package:aaa/a1.dart';
-import 'package:aaa/a3.dart';
-
-import 'foo.dart';
-''', ['package:aaa/a2.dart'], '''
-import 'package:aaa/a1.dart';
-import 'package:aaa/a2.dart';
-import 'package:aaa/a3.dart';
-
-import 'foo.dart';
-''');
-  }
-
-  test_importLibrary_package_beforePackage_first() async {
-    await _assertImportLibrary('''
-import 'package:aaa/a2.dart';
-
-import 'foo.dart';
-''', ['package:aaa/a1.dart'], '''
-import 'package:aaa/a1.dart';
-import 'package:aaa/a2.dart';
-
-import 'foo.dart';
-''');
-  }
-
-  test_importLibrary_package_beforePackage_leadingComments() async {
-    await _assertImportLibrary('''
-// comment a2
-import 'package:aaa/a2.dart';
-
-import 'foo.dart';
-''', ['package:aaa/a1.dart'], '''
-// comment a2
-import 'package:aaa/a1.dart';
-import 'package:aaa/a2.dart';
-
-import 'foo.dart';
-''');
-  }
-
-  test_importLibrary_package_beforePackage_trailingComments() async {
-    await _assertImportLibrary('''
-import 'package:aaa/a2.dart'; // comment a2
-
-import 'foo.dart';
-''', ['package:aaa/a1.dart'], '''
-import 'package:aaa/a1.dart';
-import 'package:aaa/a2.dart'; // comment a2
-
-import 'foo.dart';
-''');
-  }
-
-  test_importLibrary_package_beforeRelative() async {
-    await _assertImportLibrary('''
-import 'foo.dart';
-''', ['package:aaa/aaa.dart'], '''
-import 'package:aaa/aaa.dart';
-
-import 'foo.dart';
-''');
-  }
-
-  test_importLibrary_relative_afterDart() async {
-    await _assertImportLibrary('''
-import 'dart:async';
-''', ['aaa.dart'], '''
-import 'dart:async';
-
-import 'aaa.dart';
-''');
-  }
-
-  test_importLibrary_relative_afterPackage() async {
-    await _assertImportLibrary('''
-import 'package:foo/foo.dart';
-''', ['aaa.dart'], '''
-import 'package:foo/foo.dart';
-
-import 'aaa.dart';
-''');
-  }
-
-  test_importLibrary_relative_beforeRelative() async {
-    await _assertImportLibrary('''
-import 'dart:async';
-
-import 'package:foo/foo.dart';
-
-import 'aaa.dart';
-import 'ccc.dart';
-''', ['bbb.dart'], '''
-import 'dart:async';
-
-import 'package:foo/foo.dart';
-
-import 'aaa.dart';
-import 'bbb.dart';
-import 'ccc.dart';
-''');
-  }
-
-  test_importLibrary_relative_beforeRelative_first() async {
-    await _assertImportLibrary('''
-import 'dart:async';
-
-import 'package:foo/foo.dart';
-
-import 'bbb.dart';
-''', ['aaa.dart'], '''
-import 'dart:async';
-
-import 'package:foo/foo.dart';
-
-import 'aaa.dart';
-import 'bbb.dart';
-''');
-  }
-
-  test_importLibrary_relative_last() async {
-    await _assertImportLibrary('''
-import 'dart:async';
-
-import 'package:foo/foo.dart';
-''', ['aaa.dart'], '''
-import 'dart:async';
-
-import 'package:foo/foo.dart';
-
-import 'aaa.dart';
-''');
-  }
-
   test_writeClassDeclaration_interfaces() async {
     String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {}');
@@ -2259,25 +1948,6 @@
     expect(edit.replacement, equalsIgnoringWhitespace('implements A, B'));
   }
 
-  Future<void> _assertImportLibrary(
-      String initialCode, List<String> newUris, String expectedCode) async {
-    String path = convertPath('/home/test/lib/test.dart');
-    addSource(path, initialCode);
-    DartChangeBuilderImpl builder = newBuilder();
-    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
-      for (String newUri in newUris) {
-        builder.importLibrary(Uri.parse(newUri));
-      }
-    });
-
-    String resultCode = initialCode;
-    List<SourceEdit> edits = getEdits(builder);
-    for (SourceEdit edit in edits) {
-      resultCode = edit.apply(resultCode);
-    }
-    expect(resultCode, expectedCode);
-  }
-
   /**
    * Assuming that the [content] being edited defines a class named `A` whose
    * member with the given [nameToOverride] to be overridden and has
@@ -2462,3 +2132,433 @@
         unorderedEquals(['Object', 'A', 'B', 'C']));
   }
 }
+
+@reflectiveTest
+class ImportLibraryTest extends AbstractContextTest with BuilderTestMixin {
+  test_afterLibraryDirective_dart() async {
+    await _assertImportLibrary(
+      initialCode: '''
+library test;
+
+class A {}
+''',
+      uriList: ['dart:async'],
+      expectedCode: '''
+library test;
+
+import 'dart:async';
+
+
+class A {}
+''',
+    );
+  }
+
+  test_dart_beforeDart() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:aaa';
+import 'dart:ccc';
+''',
+      uriList: ['dart:bbb'],
+      expectedCode: '''
+import 'dart:aaa';
+import 'dart:bbb';
+import 'dart:ccc';
+''',
+    );
+  }
+
+  test_dart_beforeDart_first() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:bbb';
+''',
+      uriList: ['dart:aaa'],
+      expectedCode: '''
+import 'dart:aaa';
+import 'dart:bbb';
+''',
+    );
+  }
+
+  test_dart_beforePackage() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'package:foo/foo.dart';
+''',
+      uriList: ['dart:async'],
+      expectedCode: '''
+import 'dart:async';
+
+import 'package:foo/foo.dart';
+''',
+    );
+  }
+
+  test_multiple_dart_then_package() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:aaa';
+import 'dart:ccc';
+
+import 'package:aaa/aaa.dart';
+import 'package:ccc/ccc.dart';
+''',
+      uriList: ['dart:bbb', 'package:bbb/bbb.dart'],
+      expectedCode: '''
+import 'dart:aaa';
+import 'dart:bbb';
+import 'dart:ccc';
+
+import 'package:aaa/aaa.dart';
+import 'package:bbb/bbb.dart';
+import 'package:ccc/ccc.dart';
+''',
+    );
+  }
+
+  test_multiple_package_then_dart() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:aaa';
+import 'dart:ccc';
+
+import 'package:aaa/aaa.dart';
+import 'package:ccc/ccc.dart';
+''',
+      uriList: ['package:bbb/bbb.dart', 'dart:bbb'],
+      expectedCode: '''
+import 'dart:aaa';
+import 'dart:bbb';
+import 'dart:ccc';
+
+import 'package:aaa/aaa.dart';
+import 'package:bbb/bbb.dart';
+import 'package:ccc/ccc.dart';
+''',
+    );
+  }
+
+  test_noDirectives_docComment() async {
+    await _assertImportLibrary(
+      initialCode: '''
+/// Documentation comment.
+/// Continues.
+void main() {}
+''',
+      uriList: ['dart:async'],
+      expectedCode: '''
+import 'dart:async';
+
+/// Documentation comment.
+/// Continues.
+void main() {}
+''',
+    );
+  }
+
+  test_noDirectives_hashBang() async {
+    await _assertImportLibrary(
+      initialCode: '''
+#!/bin/dart
+
+void main() {}
+''',
+      uriList: ['dart:async'],
+      expectedCode: '''
+#!/bin/dart
+
+import 'dart:async';
+
+void main() {}
+''',
+    );
+  }
+
+  test_noDirectives_lineComment() async {
+    await _assertImportLibrary(
+      initialCode: '''
+// Not documentation comment.
+// Continues.
+
+void main() {}
+''',
+      uriList: ['dart:async'],
+      expectedCode: '''
+// Not documentation comment.
+// Continues.
+
+import 'dart:async';
+
+void main() {}
+''',
+    );
+  }
+
+  test_package_afterDart() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:async';
+''',
+      uriList: ['package:aaa/aaa.dart'],
+      expectedCode: '''
+import 'dart:async';
+
+import 'package:aaa/aaa.dart';
+''',
+    );
+  }
+
+  test_package_afterPackage() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'package:aaa/a1.dart';
+
+import 'foo.dart';
+''',
+      uriList: ['package:aaa/a2.dart'],
+      expectedCode: '''
+import 'package:aaa/a1.dart';
+import 'package:aaa/a2.dart';
+
+import 'foo.dart';
+''',
+    );
+  }
+
+  test_package_afterPackage_leadingComment() async {
+    await _assertImportLibrary(
+      initialCode: '''
+// comment
+import 'package:aaa/a1.dart';
+
+import 'foo.dart';
+''',
+      uriList: ['package:aaa/a2.dart'],
+      expectedCode: '''
+// comment
+import 'package:aaa/a1.dart';
+import 'package:aaa/a2.dart';
+
+import 'foo.dart';
+''',
+    );
+  }
+
+  test_package_afterPackage_trailingComment() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'package:aaa/a1.dart'; // comment
+
+import 'foo.dart';
+''',
+      uriList: ['package:aaa/a2.dart'],
+      expectedCode: '''
+import 'package:aaa/a1.dart'; // comment
+import 'package:aaa/a2.dart';
+
+import 'foo.dart';
+''',
+    );
+  }
+
+  test_package_beforePackage() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'package:aaa/a1.dart';
+import 'package:aaa/a3.dart';
+
+import 'foo.dart';
+''',
+      uriList: ['package:aaa/a2.dart'],
+      expectedCode: '''
+import 'package:aaa/a1.dart';
+import 'package:aaa/a2.dart';
+import 'package:aaa/a3.dart';
+
+import 'foo.dart';
+''',
+    );
+  }
+
+  test_package_beforePackage_first() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'package:aaa/a2.dart';
+
+import 'foo.dart';
+''',
+      uriList: ['package:aaa/a1.dart'],
+      expectedCode: '''
+import 'package:aaa/a1.dart';
+import 'package:aaa/a2.dart';
+
+import 'foo.dart';
+''',
+    );
+  }
+
+  test_package_beforePackage_leadingComments() async {
+    await _assertImportLibrary(
+      initialCode: '''
+// comment a2
+import 'package:aaa/a2.dart';
+
+import 'foo.dart';
+''',
+      uriList: ['package:aaa/a1.dart'],
+      expectedCode: '''
+// comment a2
+import 'package:aaa/a1.dart';
+import 'package:aaa/a2.dart';
+
+import 'foo.dart';
+''',
+    );
+  }
+
+  test_package_beforePackage_trailingComments() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'package:aaa/a2.dart'; // comment a2
+
+import 'foo.dart';
+''',
+      uriList: ['package:aaa/a1.dart'],
+      expectedCode: '''
+import 'package:aaa/a1.dart';
+import 'package:aaa/a2.dart'; // comment a2
+
+import 'foo.dart';
+''',
+    );
+  }
+
+  test_package_beforeRelative() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'foo.dart';
+''',
+      uriList: ['package:aaa/aaa.dart'],
+      expectedCode: '''
+import 'package:aaa/aaa.dart';
+
+import 'foo.dart';
+''',
+    );
+  }
+
+  test_relative_afterDart() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:async';
+''',
+      uriList: ['aaa.dart'],
+      expectedCode: '''
+import 'dart:async';
+
+import 'aaa.dart';
+''',
+    );
+  }
+
+  test_relative_afterPackage() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'package:foo/foo.dart';
+''',
+      uriList: ['aaa.dart'],
+      expectedCode: '''
+import 'package:foo/foo.dart';
+
+import 'aaa.dart';
+''',
+    );
+  }
+
+  test_relative_beforeRelative() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:async';
+
+import 'package:foo/foo.dart';
+
+import 'aaa.dart';
+import 'ccc.dart';
+''',
+      uriList: ['bbb.dart'],
+      expectedCode: '''
+import 'dart:async';
+
+import 'package:foo/foo.dart';
+
+import 'aaa.dart';
+import 'bbb.dart';
+import 'ccc.dart';
+''',
+    );
+  }
+
+  test_relative_beforeRelative_first() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:async';
+
+import 'package:foo/foo.dart';
+
+import 'bbb.dart';
+''',
+      uriList: ['aaa.dart'],
+      expectedCode: '''
+import 'dart:async';
+
+import 'package:foo/foo.dart';
+
+import 'aaa.dart';
+import 'bbb.dart';
+''',
+    );
+  }
+
+  test_relative_last() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:async';
+
+import 'package:foo/foo.dart';
+''',
+      uriList: ['aaa.dart'],
+      expectedCode: '''
+import 'dart:async';
+
+import 'package:foo/foo.dart';
+
+import 'aaa.dart';
+''',
+    );
+  }
+
+  Future<void> _assertImportLibrary({
+    String initialCode,
+    List<String> uriList,
+    String expectedCode,
+  }) async {
+    String path = convertPath('/home/test/lib/test.dart');
+    addSource(path, initialCode);
+    DartChangeBuilderImpl builder = newBuilder();
+    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
+      for (var i = 0; i < uriList.length; ++i) {
+        var uri = Uri.parse(uriList[i]);
+        builder.importLibrary(uri);
+      }
+    });
+
+    String resultCode = initialCode;
+    List<SourceEdit> edits = getEdits(builder);
+    for (SourceEdit edit in edits) {
+      resultCode = edit.apply(resultCode);
+    }
+    expect(resultCode, expectedCode);
+  }
+}