// Copyright (c) 2014, 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 'dart:async';

import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/fix_internal.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/standard_resolution_map.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/dart/element/ast_provider.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/parser.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/source/package_map_resolver.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart'
    hide AnalysisError;
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../abstract_single_unit.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(FixProcessorTest);
    defineReflectiveTests(FixProcessorTest_UseCFE);
    defineReflectiveTests(LintFixTest);
    defineReflectiveTests(LintFixTest_UseCFE);
  });
}

typedef bool AnalysisErrorFilter(AnalysisError error);

/**
 * Base class for fix processor tests.
 */
class BaseFixProcessorTest extends AbstractSingleUnitTest {
  AnalysisErrorFilter errorFilter = (AnalysisError error) {
    return error.errorCode != HintCode.UNUSED_CATCH_CLAUSE &&
        error.errorCode != HintCode.UNUSED_CATCH_STACK &&
        error.errorCode != HintCode.UNUSED_ELEMENT &&
        error.errorCode != HintCode.UNUSED_FIELD &&
        error.errorCode != HintCode.UNUSED_LOCAL_VARIABLE;
  };

  String myPkgLibPath = '/packages/my_pkg/lib';

  String flutterPkgLibPath = '/packages/flutter/lib';

  Fix fix;

  SourceChange change;
  String resultCode;

  assert_undefinedFunction_create_returnType_bool(String lineWithTest) async {
    await resolveTestUnit('''
main() {
  bool b = true;
  $lineWithTest
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  bool b = true;
  $lineWithTest
}

bool test() {
}
''');
  }

  assertHasFix(FixKind kind, String expected, {String target}) async {
    AnalysisError error = await _findErrorToFix();
    fix = await _assertHasFix(kind, error);
    change = fix.change;

    // apply to "file"
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));

    String fileContent = testCode;
    if (target != null) {
      expect(fileEdits.first.file, convertPath(target));
      fileContent = getFile(target).readAsStringSync();
    }

    resultCode = SourceEdit.applySequence(fileContent, change.edits[0].edits);
    // verify
    expect(resultCode, expected);
  }

  assertHasFixAllFix(ErrorCode errorCode, FixKind kind, String expected,
      {String target}) async {
    AnalysisError error = await _findErrorToFixOfType(errorCode);
    fix = await _assertHasFix(kind, error, hasFixAllFix: true);
    change = fix.change;

    // apply to "file"
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));

    String fileContent = testCode;
    if (target != null) {
      expect(fileEdits.first.file, convertPath(target));
      fileContent = getFile(target).readAsStringSync();
    }

    resultCode = SourceEdit.applySequence(fileContent, change.edits[0].edits);
    // verify
    expect(resultCode, expected);
  }

  assertNoFix(FixKind kind) async {
    AnalysisError error = await _findErrorToFix();
    await _assertNoFix(kind, error);
  }

  List<LinkedEditSuggestion> expectedSuggestions(
      LinkedEditSuggestionKind kind, List<String> values) {
    return values.map((value) {
      return new LinkedEditSuggestion(value, kind);
    }).toList();
  }

  void setUp() {
    super.setUp();
    verifyNoTestUnitErrors = false;
  }

  /**
   * Computes fixes and verifies that there is a fix of the given kind.
   */
  Future<Fix> _assertHasFix(FixKind kind, AnalysisError error,
      {bool hasFixAllFix: false}) async {
    if (hasFixAllFix && !kind.canBeAppliedTogether()) {
      fail('Expected to find and return fix-all FixKind for $kind, '
          'but kind.canBeAppliedTogether is ${kind.canBeAppliedTogether}');
    }

    // Compute the fixes for this AnalysisError
    final List<Fix> fixes = await _computeFixes(error);

    // If hasFixAllFix is false, assert that none of the fixes are a fix-all fix
    if (!hasFixAllFix) {
      for (Fix fix in fixes) {
        if (fix.isFixAllFix()) {
          fail('The boolean hasFixAllFix is false, but such a fix was found '
              'in the computed set of fixes: $fixes, error: $error.');
        }
      }
    }
    // If hasFixAllFix is true, assert that there exists such a fix in the list
    else {
      bool foundFixAllFix = false;
      for (Fix fix in fixes) {
        if (fix.isFixAllFix()) {
          foundFixAllFix = true;
          break;
        }
      }
      if (!foundFixAllFix) {
        fail('The boolean hasFixAllFix is true, but no fix-all fix was found '
            'in the computed set of fixes: $fixes, error: $error.');
      }
    }

    Fix foundFix = null;
    if (!hasFixAllFix) {
      foundFix = fixes.firstWhere(
        (fix) => fix.kind == kind && !fix.isFixAllFix(),
        orElse: () => null,
      );
    } else {
      foundFix = fixes.lastWhere(
        (fix) => fix.kind == kind && fix.isFixAllFix(),
        orElse: () => null,
      );
    }
    if (foundFix == null) {
      fail('Expected to find fix $kind in\n${fixes.join('\n')}, hasFixAllFix = '
          '$hasFixAllFix');
    }
    return foundFix;
  }

  void _assertLinkedGroup(LinkedEditGroup group, List<String> expectedStrings,
      [List<LinkedEditSuggestion> expectedSuggestions]) {
    List<Position> expectedPositions = _findResultPositions(expectedStrings);
    expect(group.positions, unorderedEquals(expectedPositions));
    if (expectedSuggestions != null) {
      expect(group.suggestions, unorderedEquals(expectedSuggestions));
    }
  }

  Future _assertNoFix(FixKind kind, AnalysisError error) async {
    List<Fix> fixes = await _computeFixes(error);
    for (Fix fix in fixes) {
      if (fix.kind == kind) {
        fail('Unexpected fix $kind in\n${fixes.join('\n')}');
      }
    }
  }

  Future<List<AnalysisError>> _computeErrors() async {
    return (await driver.getResult(convertPath(testFile))).errors;
  }

  /**
   * Computes fixes for the given [error] in [testUnit].
   */
  Future<List<Fix>> _computeFixes(AnalysisError error) async {
    DartFixContext fixContext = new _DartFixContextImpl(
        resourceProvider,
        driver,
        new AstProviderForDriver(driver),
        testUnit,
        error,
        await _computeErrors());
    return await new DefaultFixContributor().internalComputeFixes(fixContext);
  }

  /**
   * Configures the [SourceFactory] to have the `my_pkg` package in
   * `/packages/my_pkg/lib` folder.
   */
  void _configureMyPkg(Map<String, String> pathToCode) {
    pathToCode.forEach((path, code) {
      newFile('$myPkgLibPath/$path', content: code);
    });
    // configure SourceFactory
    Folder myPkgFolder = getFolder(myPkgLibPath);
    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
      'my_pkg': [myPkgFolder]
    });
    SourceFactory sourceFactory = new SourceFactory(
        [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
    driver.configure(sourceFactory: sourceFactory);
    // force 'my_pkg' resolution
    addSource(
        '/tmp/other.dart',
        pathToCode.keys
            .map((path) => "import 'package:my_pkg/$path';")
            .join('\n'));
  }

  Future<AnalysisError> _findErrorToFix() async {
    List<AnalysisError> errors = await _computeErrors();
    if (errorFilter != null) {
      errors = errors.where(errorFilter).toList();
    }
    expect(errors, hasLength(1));
    return errors[0];
  }

  Future<AnalysisError> _findErrorToFixOfType(ErrorCode errorCode) async {
    List<AnalysisError> errors = await _computeErrors();
    if (errorFilter != null) {
      errors = errors.where(errorFilter).toList();
    }
    return errors.firstWhere((error) => errorCode == error.errorCode);
  }

  List<Position> _findResultPositions(List<String> searchStrings) {
    List<Position> positions = <Position>[];
    for (String search in searchStrings) {
      int offset = resultCode.indexOf(search);
      positions.add(new Position(testFile, offset));
    }
    return positions;
  }
}

@reflectiveTest
class FixProcessorTest extends BaseFixProcessorTest {
  test_addAsync_asyncFor() async {
    await resolveTestUnit('''
import 'dart:async';
void main(Stream<String> names) {
  await for (String name in names) {
    print(name);
  }
}
''');
    await assertHasFix(DartFixKind.ADD_ASYNC, '''
import 'dart:async';
Future main(Stream<String> names) async {
  await for (String name in names) {
    print(name);
  }
}
''');
  }

  test_addAsync_BAD_nullFunctionBody() async {
    await resolveTestUnit('''
var F = await;
''');
    await assertNoFix(DartFixKind.ADD_ASYNC);
  }

  test_addAsync_blockFunctionBody() async {
    await resolveTestUnit('''
foo() {}
main() {
  await foo();
}
''');
    List<AnalysisError> errors = await _computeErrors();
    expect(errors, hasLength(2));
    errors.sort((a, b) => a.message.compareTo(b.message));
    // No fix for ";".
    {
      AnalysisError error = errors[0];
      expect(error.message, "Expected to find ';'.");
      List<Fix> fixes = await _computeFixes(error);
      expect(fixes, isEmpty);
    }
    // Has fix for "await".
    {
      AnalysisError error = errors[1];
      expect(error.message, startsWith("Undefined name 'await' in function"));
      List<Fix> fixes = await _computeFixes(error);
      // has exactly one fix
      expect(fixes, hasLength(1));
      Fix fix = fixes[0];
      expect(fix.kind, DartFixKind.ADD_ASYNC);
      // apply to "file"
      List<SourceFileEdit> fileEdits = fix.change.edits;
      expect(fileEdits, hasLength(1));
      resultCode = SourceEdit.applySequence(testCode, fileEdits[0].edits);
      // verify
      expect(resultCode, '''
foo() {}
main() async {
  await foo();
}
''');
    }
  }

  test_addAsync_closure() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
    };
    await resolveTestUnit('''
import 'dart:async';

void takeFutureCallback(Future callback()) {}

void doStuff() => takeFutureCallback(() => await 1);
''');
    await assertHasFix(DartFixKind.ADD_ASYNC, '''
import 'dart:async';

void takeFutureCallback(Future callback()) {}

void doStuff() => takeFutureCallback(() async => await 1);
''');
  }

  test_addAsync_expressionFunctionBody() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
    };
    await resolveTestUnit('''
foo() {}
main() => await foo();
''');
    await assertHasFix(DartFixKind.ADD_ASYNC, '''
foo() {}
main() async => await foo();
''');
  }

  test_addAsync_returnFuture() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
    };
    await resolveTestUnit('''
foo() {}
int main() {
  await foo();
  return 42;
}
''');
    await assertHasFix(DartFixKind.ADD_ASYNC, '''
import 'dart:async';

foo() {}
Future<int> main() async {
  await foo();
  return 42;
}
''');
  }

  test_addAsync_returnFuture_alreadyFuture() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
    };
    await resolveTestUnit('''
import 'dart:async';
foo() {}
Future<int> main() {
  await foo();
  return 42;
}
''');
    await assertHasFix(DartFixKind.ADD_ASYNC, '''
import 'dart:async';
foo() {}
Future<int> main() async {
  await foo();
  return 42;
}
''');
  }

  test_addAsync_returnFuture_dynamic() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
    };
    await resolveTestUnit('''
foo() {}
dynamic main() {
  await foo();
  return 42;
}
''');
    await assertHasFix(DartFixKind.ADD_ASYNC, '''
foo() {}
dynamic main() async {
  await foo();
  return 42;
}
''');
  }

  test_addAsync_returnFuture_noType() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
    };
    await resolveTestUnit('''
foo() {}
main() {
  await foo();
  return 42;
}
''');
    await assertHasFix(DartFixKind.ADD_ASYNC, '''
foo() {}
main() async {
  await foo();
  return 42;
}
''');
  }

  test_addExplicitCast_assignment_general() async {
    await resolveTestUnit('''
f(A a) {
  B b;
  b = a;
}
class A {}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(A a) {
  B b;
  b = a as B;
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_assignment_general_all() async {
    await resolveTestUnit('''
f(A a) {
  B b, b2;
  b = a;
  b2 = a;
}
class A {}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(A a) {
  B b, b2;
  b = a as B;
  b2 = a as B;
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_assignment_list() async {
    await resolveTestUnit('''
f(List<A> a) {
  List<B> b;
  b = a.where((e) => e is B).toList();
}
class A {}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(List<A> a) {
  List<B> b;
  b = a.where((e) => e is B).cast<B>().toList();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_assignment_list_all() async {
    await resolveTestUnit('''
f(List<A> a) {
  List<B> b, b2;
  b = a.where((e) => e is B).toList();
  b2 = a.where((e) => e is B).toList();
}
class A {}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(List<A> a) {
  List<B> b, b2;
  b = a.where((e) => e is B).cast<B>().toList();
  b2 = a.where((e) => e is B).cast<B>().toList();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_assignment_map() async {
    await resolveTestUnit('''
f(Map<A, B> a) {
  Map<B, A> b;
  b = a;
}
class A {}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(Map<A, B> a) {
  Map<B, A> b;
  b = a.cast<B, A>();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_assignment_map_all() async {
    await resolveTestUnit('''
f(Map<A, B> a) {
  Map<B, A> b, b2;
  b = a;
  b2 = a;
}
class A {}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(Map<A, B> a) {
  Map<B, A> b, b2;
  b = a.cast<B, A>();
  b2 = a.cast<B, A>();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_assignment_needsParens() async {
    await resolveTestUnit('''
f(A a) {
  B b;
  b = a..m();
}
class A {
  int m() => 0;
}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(A a) {
  B b;
  b = (a..m()) as B;
}
class A {
  int m() => 0;
}
class B {}
''');
  }

  test_addExplicitCast_assignment_needsParens_all() async {
    await resolveTestUnit('''
f(A a) {
  B b, b2;
  b = a..m();
  b2 = a..m();
}
class A {
  int m() => 0;
}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(A a) {
  B b, b2;
  b = (a..m()) as B;
  b2 = (a..m()) as B;
}
class A {
  int m() => 0;
}
class B {}
''');
  }

  test_addExplicitCast_assignment_set() async {
    await resolveTestUnit('''
f(Set<A> a) {
  Set<B> b;
  b = a;
}
class A {}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(Set<A> a) {
  Set<B> b;
  b = a.cast<B>();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_assignment_set_all() async {
    await resolveTestUnit('''
f(Set<A> a) {
  Set<B> b, b2;
  b = a;
  b2 = a;
}
class A {}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(Set<A> a) {
  Set<B> b, b2;
  b = a.cast<B>();
  b2 = a.cast<B>();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_BAD_as() async {
    await resolveTestUnit('''
f(A a) {
  C c = a as B;
}
class A {}
class B {}
class C {}
''');
    await assertNoFix(DartFixKind.ADD_EXPLICIT_CAST);
  }

  test_addExplicitCast_BAD_cast() async {
    await resolveTestUnit('''
f(List<A> a) {
  List<B> b = a.cast<A>();
}
class A {}
class B {}
''');
    await assertNoFix(DartFixKind.ADD_EXPLICIT_CAST);
  }

  test_addExplicitCast_declaration_general() async {
    await resolveTestUnit('''
f(A a) {
  B b = a;
}
class A {}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(A a) {
  B b = a as B;
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_declaration_general_all() async {
    await resolveTestUnit('''
f(A a) {
  B b = a;
  B b2 = a;
}
class A {}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(A a) {
  B b = a as B;
  B b2 = a as B;
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_declaration_list() async {
    await resolveTestUnit('''
f(List<A> a) {
  List<B> b = a.where((e) => e is B).toList();
}
class A {}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(List<A> a) {
  List<B> b = a.where((e) => e is B).cast<B>().toList();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_declaration_list_all() async {
    await resolveTestUnit('''
f(List<A> a) {
  List<B> b = a.where((e) => e is B).toList();
  List<B> b2 = a.where((e) => e is B).toList();
}
class A {}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(List<A> a) {
  List<B> b = a.where((e) => e is B).cast<B>().toList();
  List<B> b2 = a.where((e) => e is B).cast<B>().toList();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_declaration_map() async {
    await resolveTestUnit('''
f(Map<A, B> a) {
  Map<B, A> b = a;
}
class A {}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(Map<A, B> a) {
  Map<B, A> b = a.cast<B, A>();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_declaration_map_all() async {
    await resolveTestUnit('''
f(Map<A, B> a) {
  Map<B, A> b = a;
  Map<B, A> b2 = a;
}
class A {}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(Map<A, B> a) {
  Map<B, A> b = a.cast<B, A>();
  Map<B, A> b2 = a.cast<B, A>();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_declaration_needsParens() async {
    await resolveTestUnit('''
f(A a) {
  B b = a..m();
}
class A {
  int m() => 0;
}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(A a) {
  B b = (a..m()) as B;
}
class A {
  int m() => 0;
}
class B {}
''');
  }

  test_addExplicitCast_declaration_needsParens_all() async {
    await resolveTestUnit('''
f(A a) {
  B b = a..m();
  B b2 = a..m();
}
class A {
  int m() => 0;
}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(A a) {
  B b = (a..m()) as B;
  B b2 = (a..m()) as B;
}
class A {
  int m() => 0;
}
class B {}
''');
  }

  test_addExplicitCast_declaration_set() async {
    await resolveTestUnit('''
f(Set<A> a) {
  Set<B> b = a;
}
class A {}
class B {}
''');
    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
f(Set<A> a) {
  Set<B> b = a.cast<B>();
}
class A {}
class B {}
''');
  }

  test_addExplicitCast_declaration_set_all() async {
    await resolveTestUnit('''
f(Set<A> a) {
  Set<B> b = a;
  Set<B> b2 = a;
}
class A {}
class B {}
''');
    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
        DartFixKind.ADD_EXPLICIT_CAST, '''
f(Set<A> a) {
  Set<B> b = a.cast<B>();
  Set<B> b2 = a.cast<B>();
}
class A {}
class B {}
''');
  }

  test_addFieldFormalParameters_flutter() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';

class MyWidget extends StatelessWidget {
  final int a;
  final int b;
  final int c;

  MyWidget({Key key, this.a}) : super(key: key);
}
''');
    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
import 'package:flutter/widgets.dart';

class MyWidget extends StatelessWidget {
  final int a;
  final int b;
  final int c;

  MyWidget({Key key, this.a, this.b, this.c}) : super(key: key);
}
''');
  }

  test_addFieldFormalParameters_hasRequiredParameter() async {
    await resolveTestUnit('''
class Test {
  final int a;
  final int b;
  final int c;
  Test(this.a);
}
''');
    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
class Test {
  final int a;
  final int b;
  final int c;
  Test(this.a, this.b, this.c);
}
''');
  }

  test_addFieldFormalParameters_noParameters() async {
    await resolveTestUnit('''
class Test {
  final int a;
  final int b;
  final int c;
  Test();
}
''');
    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
class Test {
  final int a;
  final int b;
  final int c;
  Test(this.a, this.b, this.c);
}
''');
  }

  test_addFieldFormalParameters_noRequiredParameter() async {
    await resolveTestUnit('''
class Test {
  final int a;
  final int b;
  final int c;
  Test([this.c]);
}
''');
    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
class Test {
  final int a;
  final int b;
  final int c;
  Test(this.a, this.b, [this.c]);
}
''');
  }

  test_addFieldFormalParameters_notAllFinal() async {
    await resolveTestUnit('''
class Test {
  final int a;
  int b;
  final int c;
  Test();
}
''');
    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
class Test {
  final int a;
  int b;
  final int c;
  Test(this.a, this.c);
}
''');
  }

  test_addMissingParameter_function_positional_hasNamed() async {
    await resolveTestUnit('''
test({int a}) {}
main() {
  test(1);
}
''');
    await assertNoFix(DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL);
  }

  test_addMissingParameter_function_positional_hasZero() async {
    await resolveTestUnit('''
test() {}
main() {
  test(1);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL, '''
test([int i]) {}
main() {
  test(1);
}
''');
  }

  test_addMissingParameter_function_required_hasNamed() async {
    await resolveTestUnit('''
test({int a}) {}
main() {
  test(1);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
test(int i, {int a}) {}
main() {
  test(1);
}
''');
  }

  test_addMissingParameter_function_required_hasOne() async {
    await resolveTestUnit('''
test(int a) {}
main() {
  test(1, 2.0);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
test(int a, double d) {}
main() {
  test(1, 2.0);
}
''');
  }

  test_addMissingParameter_function_required_hasZero() async {
    await resolveTestUnit('''
test() {}
main() {
  test(1);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
test(int i) {}
main() {
  test(1);
}
''');
  }

  test_addMissingParameter_method_positional_hasOne() async {
    await resolveTestUnit('''
class A {
  test(int a) {}
  main() {
    test(1, 2.0);
  }
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL, '''
class A {
  test(int a, [double d]) {}
  main() {
    test(1, 2.0);
  }
}
''');
  }

  test_addMissingParameter_method_required_hasOne() async {
    await resolveTestUnit('''
class A {
  test(int a) {}
  main() {
    test(1, 2.0);
  }
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
class A {
  test(int a, double d) {}
  main() {
    test(1, 2.0);
  }
}
''');
  }

  test_addMissingParameter_method_required_hasZero() async {
    await resolveTestUnit('''
class A {
  test() {}
  main() {
    test(1);
  }
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
class A {
  test(int i) {}
  main() {
    test(1);
  }
}
''');
  }

  test_addMissingParameterNamed_constructor_hasNamed() async {
    await resolveTestUnit('''
class A {
  A(int a, {int b}) {}
}

main() {
  new A(1, b: 2, named: 3.0);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
class A {
  A(int a, {int b, double named}) {}
}

main() {
  new A(1, b: 2, named: 3.0);
}
''');
  }

  test_addMissingParameterNamed_constructor_hasRequired() async {
    await resolveTestUnit('''
class A {
  A(int a) {}
}

main() {
  new A(1, named: 2.0);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
class A {
  A(int a, {double named}) {}
}

main() {
  new A(1, named: 2.0);
}
''');
  }

  test_addMissingParameterNamed_constructor_noParameters() async {
    await resolveTestUnit('''
class A {
  A() {}
}

main() {
  new A(named: 42);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
class A {
  A({int named}) {}
}

main() {
  new A(named: 42);
}
''');
  }

  test_addMissingParameterNamed_constructor_noParameters_named() async {
    await resolveTestUnit('''
class A {
  A.aaa() {}
}

main() {
  new A.aaa(named: 42);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
class A {
  A.aaa({int named}) {}
}

main() {
  new A.aaa(named: 42);
}
''');
  }

  test_addMissingParameterNamed_function_hasNamed() async {
    await resolveTestUnit('''
test(int a, {int b: 0}) {}

main() {
  test(1, b: 2, named: 3.0);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
test(int a, {int b: 0, double named}) {}

main() {
  test(1, b: 2, named: 3.0);
}
''');
  }

  test_addMissingParameterNamed_function_hasRequired() async {
    await resolveTestUnit('''
test(int a) {}

main() {
  test(1, named: 2.0);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
test(int a, {double named}) {}

main() {
  test(1, named: 2.0);
}
''');
  }

  test_addMissingParameterNamed_function_noParameters() async {
    await resolveTestUnit('''
test() {}

main() {
  test(named: 42);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
test({int named}) {}

main() {
  test(named: 42);
}
''');
  }

  test_addMissingParameterNamed_method_hasNamed() async {
    await resolveTestUnit('''
class A {
  test(int a, {int b: 0}) {}

  main() {
    test(1, b: 2, named: 3.0);
  }
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
class A {
  test(int a, {int b: 0, double named}) {}

  main() {
    test(1, b: 2, named: 3.0);
  }
}
''');
  }

  test_addMissingParameterNamed_method_hasOptionalPositional() async {
    await resolveTestUnit('''
class A {
  test(int a, [int b]) {}

  main() {
    test(1, 2, named: 3.0);
  }
}
''');
    await assertNoFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED);
  }

  test_addMissingParameterNamed_method_hasRequired() async {
    await resolveTestUnit('''
class A {
  test(int a) {}

  main() {
    test(1, named: 2.0);
  }
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
class A {
  test(int a, {double named}) {}

  main() {
    test(1, named: 2.0);
  }
}
''');
  }

  test_addMissingParameterNamed_method_noParameters() async {
    await resolveTestUnit('''
class A {
  test() {}

  main() {
    test(named: 42);
  }
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
class A {
  test({int named}) {}

  main() {
    test(named: 42);
  }
}
''');
  }

  test_addMissingRequiredArg_cons_flutter_children() async {
    addFlutterPackage();
    _addMetaPackageSource();

    await resolveTestUnit('''
import 'package:flutter/widgets.dart';
import 'package:meta/meta.dart';

class MyWidget extends Widget {
  MyWidget({@required List<Widget> children});
}

build() {
  return new MyWidget();
}
''');

    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'package:flutter/widgets.dart';
import 'package:meta/meta.dart';

class MyWidget extends Widget {
  MyWidget({@required List<Widget> children});
}

build() {
  return new MyWidget(children: <Widget>[],);
}
''');
  }

  test_addMissingRequiredArg_cons_flutter_hasTrailingComma() async {
    addFlutterPackage();
    _addMetaPackageSource();

    await resolveTestUnit('''
import 'package:flutter/widgets.dart';
import 'package:meta/meta.dart';

class MyWidget extends Widget {
  MyWidget({@required int a, @required int b});
}

build() {
  return new MyWidget(a: 1,);
}
''');

    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'package:flutter/widgets.dart';
import 'package:meta/meta.dart';

class MyWidget extends Widget {
  MyWidget({@required int a, @required int b});
}

build() {
  return new MyWidget(a: 1, b: null,);
}
''');
  }

  test_addMissingRequiredArg_cons_single() async {
    _addMetaPackageSource();
    addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';

class A {
  A({@required int a}) {}
}
''');

    await resolveTestUnit('''
import 'libA.dart';

main() {
  A a = new A();
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'libA.dart';

main() {
  A a = new A(a: null);
}
''');
  }

  test_addMissingRequiredArg_cons_single_closure() async {
    _addMetaPackageSource();

    addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';

typedef void VoidCallback();

class A {
  A({@required VoidCallback onPressed}) {}
}
''');

    await resolveTestUnit('''
import 'libA.dart';

main() {
  A a = new A();
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'libA.dart';

main() {
  A a = new A(onPressed: () {});
}
''');
  }

  test_addMissingRequiredArg_cons_single_closure_2() async {
    _addMetaPackageSource();

    addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';

typedef void Callback(e);

class A {
  A({@required Callback callback}) {}
}
''');

    await resolveTestUnit('''
import 'libA.dart';

main() {
  A a = new A();
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'libA.dart';

main() {
  A a = new A(callback: (e) {});
}
''');
  }

  test_addMissingRequiredArg_cons_single_closure_3() async {
    _addMetaPackageSource();

    addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';

typedef void Callback(a,b,c);

class A {
  A({@required Callback callback}) {}
}
''');

    await resolveTestUnit('''
import 'libA.dart';

main() {
  A a = new A();
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'libA.dart';

main() {
  A a = new A(callback: (a, b, c) {});
}
''');
  }

  test_addMissingRequiredArg_cons_single_closure_4() async {
    _addMetaPackageSource();

    addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';

typedef int Callback(int a, String b,c);

class A {
  A({@required Callback callback}) {}
}
''');

    await resolveTestUnit('''
import 'libA.dart';

main() {
  A a = new A();
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'libA.dart';

main() {
  A a = new A(callback: (int a, String b, c) {});
}
''');
  }

  test_addMissingRequiredArg_cons_single_list() async {
    _addMetaPackageSource();

    addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';

class A {
  A({@required List<String> names}) {}
}
''');

    await resolveTestUnit('''
import 'libA.dart';

main() {
  A a = new A();
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'libA.dart';

main() {
  A a = new A(names: <String>[]);
}
''');
  }

  test_addMissingRequiredArg_multiple() async {
    _addMetaPackageSource();

    await resolveTestUnit('''
import 'package:meta/meta.dart';

test({@required int a, @required int bcd}) {}
main() {
  test(a: 3);
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'package:meta/meta.dart';

test({@required int a, @required int bcd}) {}
main() {
  test(a: 3, bcd: null);
}
''');
  }

  test_addMissingRequiredArg_multiple_2() async {
    _addMetaPackageSource();

    await resolveTestUnit('''
import 'package:meta/meta.dart';

test({@required int a, @required int bcd}) {}
main() {
  test();
}
''');

    // For now we expect one error per missing arg (dartbug.com/28830).
    List<AnalysisError> errors = await _computeErrors();
    expect(errors, hasLength(2));

    List<AnalysisError> filteredErrors = errors
        .where((e) => e.message == "The parameter 'a' is required.")
        .toList();
    expect(filteredErrors, hasLength(1));

    List<Fix> fixes = await _computeFixes(filteredErrors.first);

    List<Fix> filteredFixes = fixes
        .where((fix) => fix.change.message == "Add required argument 'a'")
        .toList();
    expect(filteredFixes, hasLength(1));
    change = filteredFixes.first.change;
    resultCode = SourceEdit.applySequence(testCode, change.edits[0].edits);
    // verify
    expect(resultCode, '''
import 'package:meta/meta.dart';

test({@required int a, @required int bcd}) {}
main() {
  test(a: null);
}
''');
  }

  test_addMissingRequiredArg_single() async {
    _addMetaPackageSource();

    await resolveTestUnit('''
import 'package:meta/meta.dart';

test({@required int abc}) {}
main() {
  test();
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'package:meta/meta.dart';

test({@required int abc}) {}
main() {
  test(abc: null);
}
''');
  }

  test_addMissingRequiredArg_single_normal() async {
    _addMetaPackageSource();

    await resolveTestUnit('''
import 'package:meta/meta.dart';

test(String x, {@required int abc}) {}
main() {
  test("foo");
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'package:meta/meta.dart';

test(String x, {@required int abc}) {}
main() {
  test("foo", abc: null);
}
''');
  }

  test_addMissingRequiredArg_single_with_details() async {
    _addMetaPackageSource();

    await resolveTestUnit('''
import 'package:meta/meta.dart';

test({@Required("Really who doesn't need an abc?") int abc}) {}
main() {
  test();
}
''');
    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
import 'package:meta/meta.dart';

test({@Required("Really who doesn't need an abc?") int abc}) {}
main() {
  test(abc: null);
}
''');
  }

  test_addStatic_multipleFields() async {
    await resolveTestUnit('''
class C {
  const int x = 0, y = 0;
}
''');
    await assertHasFix(DartFixKind.ADD_STATIC, '''
class C {
  static const int x = 0, y = 0;
}
''');
  }

  test_addStatic_oneField() async {
    await resolveTestUnit('''
class C {
  const int x = 0;
}
''');
    await assertHasFix(DartFixKind.ADD_STATIC, '''
class C {
  static const int x = 0;
}
''');
  }

  test_boolean() async {
    await resolveTestUnit('''
main() {
  boolean v;
}
''');
    await assertHasFix(DartFixKind.REPLACE_BOOLEAN_WITH_BOOL, '''
main() {
  bool v;
}
''');
  }

  test_boolean_all() async {
    await resolveTestUnit('''
main() {
  boolean v;
  boolean w;
}
''');
    await assertHasFixAllFix(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN,
        DartFixKind.REPLACE_BOOLEAN_WITH_BOOL, '''
main() {
  bool v;
  bool w;
}
''');
  }

  test_canBeNullAfterNullAware_chain() async {
    await resolveTestUnit('''
main(x) {
  x?.a.b.c;
}
''');
    await assertHasFix(DartFixKind.REPLACE_WITH_NULL_AWARE, '''
main(x) {
  x?.a?.b?.c;
}
''');
  }

  test_canBeNullAfterNullAware_methodInvocation() async {
    await resolveTestUnit('''
main(x) {
  x?.a.b();
}
''');
    await assertHasFix(DartFixKind.REPLACE_WITH_NULL_AWARE, '''
main(x) {
  x?.a?.b();
}
''');
  }

  test_canBeNullAfterNullAware_propertyAccess() async {
    await resolveTestUnit('''
main(x) {
  x?.a().b;
}
''');
    await assertHasFix(DartFixKind.REPLACE_WITH_NULL_AWARE, '''
main(x) {
  x?.a()?.b;
}
''');
  }

  test_changeToStaticAccess_method() async {
    await resolveTestUnit('''
class A {
  static foo() {}
}
main(A a) {
  a.foo();
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
class A {
  static foo() {}
}
main(A a) {
  A.foo();
}
''');
  }

  test_changeToStaticAccess_method_importType() async {
    addSource('/project/libA.dart', r'''
library libA;
class A {
  static foo() {}
}
''');
    addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
class B extends A {}
''');
    await resolveTestUnit('''
import 'libB.dart';
main(B b) {
  b.foo();
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
import 'libA.dart';
import 'libB.dart';
main(B b) {
  A.foo();
}
''');
  }

  test_changeToStaticAccess_method_prefixLibrary() async {
    await resolveTestUnit('''
import 'dart:async' as pref;
main(pref.Future f) {
  f.wait([]);
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
import 'dart:async' as pref;
main(pref.Future f) {
  pref.Future.wait([]);
}
''');
  }

  test_changeToStaticAccess_property() async {
    await resolveTestUnit('''
class A {
  static get foo => 42;
}
main(A a) {
  a.foo;
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
class A {
  static get foo => 42;
}
main(A a) {
  A.foo;
}
''');
  }

  test_changeToStaticAccess_property_importType() async {
    addSource('/project/libA.dart', r'''
library libA;
class A {
  static get foo => null;
}
''');
    addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
class B extends A {}
''');
    await resolveTestUnit('''
import 'libB.dart';
main(B b) {
  b.foo;
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
import 'libA.dart';
import 'libB.dart';
main(B b) {
  A.foo;
}
''');
  }

  test_changeTypeAnnotation_BAD_multipleVariables() async {
    await resolveTestUnit('''
main() {
  String a, b = 42;
}
''');
    await assertNoFix(DartFixKind.CHANGE_TYPE_ANNOTATION);
  }

  test_changeTypeAnnotation_BAD_notVariableDeclaration() async {
    await resolveTestUnit('''
main() {
  String v;
  v = 42;
}
''');
    await assertNoFix(DartFixKind.CHANGE_TYPE_ANNOTATION);
  }

  test_changeTypeAnnotation_OK_generic() async {
    await resolveTestUnit('''
main() {
  String v = <int>[];
}
''');
    await assertHasFix(DartFixKind.CHANGE_TYPE_ANNOTATION, '''
main() {
  List<int> v = <int>[];
}
''');
  }

  test_changeTypeAnnotation_OK_simple() async {
    await resolveTestUnit('''
main() {
  String v = 'abc'.length;
}
''');
    await assertHasFix(DartFixKind.CHANGE_TYPE_ANNOTATION, '''
main() {
  int v = 'abc'.length;
}
''');
  }

  test_convertToNamedArguments_BAD_ambiguous() async {
    await resolveTestUnit('''
class A {
  A({int a, int b});
}

main() {
  new A(1, 2);
}
''');
    await assertNoFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS);
  }

  test_convertToNamedArguments_BAD_noCompatibleParameter() async {
    await resolveTestUnit('''
class A {
  A({String a});
}

main() {
  new A(1);
}
''');
    await assertNoFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS);
  }

  test_convertToNamedArguments_OK_instanceCreation() async {
    await resolveTestUnit('''
class A {
  A({int a, double b});
}

main() {
  new A(1.2, 3);
}
''');
    await assertHasFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS, '''
class A {
  A({int a, double b});
}

main() {
  new A(b: 1.2, a: 3);
}
''');
  }

  test_convertToNamedArguments_OK_instanceCreation_hasPositional() async {
    await resolveTestUnit('''
class A {
  A(int a, {int b});
}

main() {
  new A(1, 2);
}
''');
    await assertHasFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS, '''
class A {
  A(int a, {int b});
}

main() {
  new A(1, b: 2);
}
''');
  }

  test_convertToNamedArguments_OK_methodInvocation() async {
    await resolveTestUnit('''
class C {
  void foo({int a}) {}
}

main(C c) {
  c.foo(1);
}
''');
    await assertHasFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS, '''
class C {
  void foo({int a}) {}
}

main(C c) {
  c.foo(a: 1);
}
''');
  }

  test_createClass() async {
    await resolveTestUnit('''
main() {
  Test v = null;
}
''');
    await assertHasFix(DartFixKind.CREATE_CLASS, '''
main() {
  Test v = null;
}

class Test {
}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
  }

  test_createClass_BAD_hasUnresolvedPrefix() async {
    await resolveTestUnit('''
main() {
  prefix.Test v = null;
}
''');
    await assertNoFix(DartFixKind.CREATE_CLASS);
  }

  test_createClass_inLibraryOfPrefix() async {
    String libCode = r'''
library my.lib;

class A {}
''';
    addSource('/project/lib.dart', libCode);
    await resolveTestUnit('''
import 'lib.dart' as lib;

main() {
  lib.A a = null;
  lib.Test t = null;
}
''');
    AnalysisError error = await _findErrorToFix();
    fix = await _assertHasFix(DartFixKind.CREATE_CLASS, error);
    change = fix.change;
    // apply to "lib.dart"
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = change.edits[0];
    expect(fileEdit.file, convertPath('/project/lib.dart'));
    expect(SourceEdit.applySequence(libCode, fileEdit.edits), r'''
library my.lib;

class A {}

class Test {
}
''');
    expect(change.linkedEditGroups, hasLength(1));
  }

  test_createClass_innerLocalFunction() async {
    await resolveTestUnit('''
f() {
  g() {
    Test v = null;
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_CLASS, '''
f() {
  g() {
    Test v = null;
  }
}

class Test {
}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
  }

  test_createClass_instanceCreation_withoutNew_fromFunction() async {
    await resolveTestUnit('''
main() {
  Test ();
}
''');
    await assertHasFix(DartFixKind.CREATE_CLASS, '''
main() {
  Test ();
}

class Test {
}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
  }

  test_createClass_instanceCreation_withoutNew_fromMethod() async {
    await resolveTestUnit('''
class A {
  main() {
    Test ();
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_CLASS, '''
class A {
  main() {
    Test ();
  }
}

class Test {
}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
  }

  test_createClass_itemOfList() async {
    await resolveTestUnit('''
main() {
  var a = [Test];
}
''');
    await assertHasFix(DartFixKind.CREATE_CLASS, '''
main() {
  var a = [Test];
}

class Test {
}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['Test];', 'Test {']);
  }

  test_createClass_itemOfList_inAnnotation() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER;
    };
    await resolveTestUnit('''
class MyAnnotation {
  const MyAnnotation(a, b);
}
@MyAnnotation(int, const [Test])
main() {}
''');
    await assertHasFix(DartFixKind.CREATE_CLASS, '''
class MyAnnotation {
  const MyAnnotation(a, b);
}
@MyAnnotation(int, const [Test])
main() {}

class Test {
}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['Test])', 'Test {']);
  }

  test_createConstructor_forFinalFields() async {
    errorFilter = (AnalysisError error) {
      return error.message.contains("'a'");
    };
    await resolveTestUnit('''
class Test {
  final int a;
  final int b = 2;
  final int c;
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, '''
class Test {
  final int a;
  final int b = 2;
  final int c;

  Test(this.a, this.c);
}
''');
  }

  test_createConstructor_forFinalFields_flutter() async {
    addFlutterPackage();
    errorFilter = (AnalysisError error) {
      return error.message.contains("'a'");
    };
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';

class MyWidget extends StatelessWidget {
  final int a;
  final int b = 2;
  final int c;
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, '''
import 'package:flutter/widgets.dart';

class MyWidget extends StatelessWidget {
  final int a;
  final int b = 2;
  final int c;

  const MyWidget({Key key, this.a, this.c}) : super(key: key);
}
''');
  }

  test_createConstructor_forFinalFields_flutter_childLast() async {
    addFlutterPackage();
    errorFilter = (AnalysisError error) {
      return error.message.contains("'a'");
    };
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';

class MyWidget extends StatelessWidget {
  final int a;
  final Widget child;
  final int b;
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, '''
import 'package:flutter/widgets.dart';

class MyWidget extends StatelessWidget {
  final int a;
  final Widget child;
  final int b;

  const MyWidget({Key key, this.a, this.b, this.child}) : super(key: key);
}
''');
  }

  test_createConstructor_forFinalFields_flutter_childrenLast() async {
    addFlutterPackage();
    errorFilter = (AnalysisError error) {
      return error.message.contains("'a'");
    };
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';

class MyWidget extends StatelessWidget {
  final int a;
  final List<Widget> children;
  final int b;
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, '''
import 'package:flutter/widgets.dart';

class MyWidget extends StatelessWidget {
  final int a;
  final List<Widget> children;
  final int b;

  const MyWidget({Key key, this.a, this.b, this.children}) : super(key: key);
}
''');
  }

  test_createConstructor_insteadOfSyntheticDefault() async {
    await resolveTestUnit('''
class A {
  int field;

  method() {}
}
main() {
  new A(1, 2.0);
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR, '''
class A {
  int field;

  A(int i, double d);

  method() {}
}
main() {
  new A(1, 2.0);
}
''');
  }

  test_createConstructor_named() async {
    await resolveTestUnit('''
class A {
  method() {}
}
main() {
  new A.named(1, 2.0);
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR, '''
class A {
  A.named(int i, double d);

  method() {}
}
main() {
  new A.named(1, 2.0);
}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['named(int ', 'named(1']);
  }

  test_createConstructor_named_emptyClassBody() async {
    await resolveTestUnit('''
class A {}
main() {
  new A.named(1);
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR, '''
class A {
  A.named(int i);
}
main() {
  new A.named(1);
}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['named(int ', 'named(1']);
  }

  test_createConstructorForFinalFields_inTopLevelMethod() async {
    await resolveTestUnit('''
main() {
  final int v;
}
''');
    await assertNoFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS);
  }

  test_createConstructorForFinalFields_topLevelField() async {
    await resolveTestUnit('''
final int v;
''');
    await assertNoFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS);
  }

  test_createConstructorSuperExplicit() async {
    await resolveTestUnit('''
class A {
  A(bool p1, int p2, double p3, String p4, {p5});
}
class B extends A {
  B() {}
}
''');
    await assertHasFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
class A {
  A(bool p1, int p2, double p3, String p4, {p5});
}
class B extends A {
  B() : super(false, 0, 0.0, '') {}
}
''');
  }

  test_createConstructorSuperExplicit_hasInitializers() async {
    await resolveTestUnit('''
class A {
  A(int p);
}
class B extends A {
  int field;
  B() : field = 42 {}
}
''');
    await assertHasFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
class A {
  A(int p);
}
class B extends A {
  int field;
  B() : field = 42, super(0) {}
}
''');
  }

  test_createConstructorSuperExplicit_named() async {
    await resolveTestUnit('''
class A {
  A.named(int p);
}
class B extends A {
  B() {}
}
''');
    await assertHasFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
class A {
  A.named(int p);
}
class B extends A {
  B() : super.named(0) {}
}
''');
  }

  test_createConstructorSuperExplicit_named_private() async {
    await resolveTestUnit('''
class A {
  A._named(int p);
}
class B extends A {
  B() {}
}
''');
    await assertNoFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION);
  }

  test_createConstructorSuperExplicit_typeArgument() async {
    await resolveTestUnit('''
class A<T> {
  A(T p);
}
class B extends A<int> {
  B();
}
''');
    await assertHasFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
class A<T> {
  A(T p);
}
class B extends A<int> {
  B() : super(0);
}
''');
  }

  test_createConstructorSuperImplicit() async {
    await resolveTestUnit('''
class A {
  A(p1, int p2, List<String> p3, [int p4]);
}
class B extends A {
  int existingField;

  void existingMethod() {}
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
class A {
  A(p1, int p2, List<String> p3, [int p4]);
}
class B extends A {
  int existingField;

  B(p1, int p2, List<String> p3) : super(p1, p2, p3);

  void existingMethod() {}
}
''');
  }

  test_createConstructorSuperImplicit_fieldInitializer() async {
    await resolveTestUnit('''
class A {
  int _field;
  A(this._field);
}
class B extends A {
  int existingField;

  void existingMethod() {}
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
class A {
  int _field;
  A(this._field);
}
class B extends A {
  int existingField;

  B(int field) : super(field);

  void existingMethod() {}
}
''');
  }

  test_createConstructorSuperImplicit_importType() async {
    addSource('/project/libA.dart', r'''
library libA;
class A {}
''');
    addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
class B {
  B(A a);
}
''');
    await resolveTestUnit('''
import 'libB.dart';
class C extends B {
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
import 'libA.dart';
import 'libB.dart';
class C extends B {
  C(A a) : super(a);
}
''');
  }

  test_createConstructorSuperImplicit_named() async {
    await resolveTestUnit('''
class A {
  A.named(p1, int p2);
}
class B extends A {
  int existingField;

  void existingMethod() {}
}
''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
class A {
  A.named(p1, int p2);
}
class B extends A {
  int existingField;

  B.named(p1, int p2) : super.named(p1, p2);

  void existingMethod() {}
}
''');
  }

  test_createConstructorSuperImplicit_private() async {
    await resolveTestUnit('''
class A {
  A._named(p);
}
class B extends A {
}
''');
    await assertNoFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER);
  }

  test_createConstructorSuperImplicit_typeArgument() async {
    await resolveTestUnit('''
class C<T> {
  final T x;
  C(this.x);
}
class D extends C<int> {
}''');
    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
class C<T> {
  final T x;
  C(this.x);
}
class D extends C<int> {
  D(int x) : super(x);
}''');
  }

  test_createField_BAD_inEnum() async {
    await resolveTestUnit('''
enum MyEnum {
  AAA, BBB
}
main() {
  MyEnum.foo;
}
''');
    await assertNoFix(DartFixKind.CREATE_FIELD);
  }

  test_createField_BAD_inSDK() async {
    await resolveTestUnit('''
main(List p) {
  p.foo = 1;
}
''');
    await assertNoFix(DartFixKind.CREATE_FIELD);
  }

  test_createField_getter_multiLevel() async {
    await resolveTestUnit('''
class A {
}
class B {
  A a;
}
class C {
  B b;
}
main(C c) {
  int v = c.b.a.test;
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  int test;
}
class B {
  A a;
}
class C {
  B b;
}
main(C c) {
  int v = c.b.a.test;
}
''');
  }

  test_createField_getter_qualified_instance() async {
    await resolveTestUnit('''
class A {
}
main(A a) {
  int v = a.test;
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  int test;
}
main(A a) {
  int v = a.test;
}
''');
  }

  test_createField_getter_qualified_instance_differentLibrary() async {
    addSource('/project/other.dart', '''
/**
 * A comment to push the offset of the braces for the following class
 * declaration past the end of the content of the test file. Used to catch an
 * index out of bounds exception that occurs when using the test source instead
 * of the target source to compute the location at which to insert the field.
 */
class A {
}
''');
    await resolveTestUnit('''
import 'other.dart';
main(A a) {
  int v = a.test;
}
''');
    await assertHasFix(
        DartFixKind.CREATE_FIELD,
        '''
/**
 * A comment to push the offset of the braces for the following class
 * declaration past the end of the content of the test file. Used to catch an
 * index out of bounds exception that occurs when using the test source instead
 * of the target source to compute the location at which to insert the field.
 */
class A {
  int test;
}
''',
        target: '/project/other.dart');
  }

  test_createField_getter_qualified_instance_dynamicType() async {
    await resolveTestUnit('''
class A {
  B b;
  void f(Object p) {
    p == b.test;
  }
}
class B {
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  B b;
  void f(Object p) {
    p == b.test;
  }
}
class B {
  var test;
}
''');
  }

  test_createField_getter_qualified_propagatedType() async {
    await resolveTestUnit('''
class A {
  A get self => this;
}
main() {
  var a = new A();
  int v = a.self.test;
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  int test;

  A get self => this;
}
main() {
  var a = new A();
  int v = a.self.test;
}
''');
  }

  test_createField_getter_unqualified_instance_asInvocationArgument() async {
    await resolveTestUnit('''
class A {
  main() {
    f(test);
  }
}
f(String s) {}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  String test;

  main() {
    f(test);
  }
}
f(String s) {}
''');
  }

  test_createField_getter_unqualified_instance_assignmentRhs() async {
    await resolveTestUnit('''
class A {
  main() {
    int v = test;
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  int test;

  main() {
    int v = test;
  }
}
''');
  }

  test_createField_getter_unqualified_instance_asStatement() async {
    await resolveTestUnit('''
class A {
  main() {
    test;
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  var test;

  main() {
    test;
  }
}
''');
  }

  test_createField_hint() async {
    await resolveTestUnit('''
class A {
}
main(A a) {
  var x = a;
  int v = x.test;
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  int test;
}
main(A a) {
  var x = a;
  int v = x.test;
}
''');
  }

  test_createField_hint_setter() async {
    await resolveTestUnit('''
class A {
}
main(A a) {
  var x = a;
  x.test = 0;
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  int test;
}
main(A a) {
  var x = a;
  x.test = 0;
}
''');
  }

  test_createField_importType() async {
    addSource('/project/libA.dart', r'''
library libA;
class A {}
''');
    addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
A getA() => null;
''');
    await resolveTestUnit('''
import 'libB.dart';
class C {
}
main(C c) {
  c.test = getA();
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
import 'libA.dart';
import 'libB.dart';
class C {
  A test;
}
main(C c) {
  c.test = getA();
}
''');
  }

  test_createField_invalidInitializer_withoutType() async {
    await resolveTestUnit('''
class C {
  C(this.text);
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class C {
  var text;

  C(this.text);
}
''');
  }

  test_createField_invalidInitializer_withType() async {
    await resolveTestUnit('''
class C {
  C(String this.text);
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class C {
  String text;

  C(String this.text);
}
''');
  }

  test_createField_setter_generic_BAD() async {
    await resolveTestUnit('''
class A {
}
class B<T> {
  List<T> items;
  main(A a) {
    a.test = items;
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  List test;
}
class B<T> {
  List<T> items;
  main(A a) {
    a.test = items;
  }
}
''');
  }

  test_createField_setter_generic_OK_local() async {
    await resolveTestUnit('''
class A<T> {
  List<T> items;

  main(A a) {
    test = items;
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A<T> {
  List<T> items;

  List<T> test;

  main(A a) {
    test = items;
  }
}
''');
  }

  test_createField_setter_qualified_instance_hasField() async {
    await resolveTestUnit('''
class A {
  int aaa;
  int zzz;

  existingMethod() {}
}
main(A a) {
  a.test = 5;
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  int aaa;
  int zzz;

  int test;

  existingMethod() {}
}
main(A a) {
  a.test = 5;
}
''');
  }

  test_createField_setter_qualified_instance_hasMethod() async {
    await resolveTestUnit('''
class A {
  existingMethod() {}
}
main(A a) {
  a.test = 5;
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  int test;

  existingMethod() {}
}
main(A a) {
  a.test = 5;
}
''');
  }

  test_createField_setter_qualified_static() async {
    await resolveTestUnit('''
class A {
}
main() {
  A.test = 5;
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  static int test;
}
main() {
  A.test = 5;
}
''');
  }

  test_createField_setter_unqualified_instance() async {
    await resolveTestUnit('''
class A {
  main() {
    test = 5;
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  int test;

  main() {
    test = 5;
  }
}
''');
  }

  test_createField_setter_unqualified_static() async {
    await resolveTestUnit('''
class A {
  static main() {
    test = 5;
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_FIELD, '''
class A {
  static int test;

  static main() {
    test = 5;
  }
}
''');
  }

  test_createFile_forImport() async {
    testFile = '/my/project/bin/test.dart';
    await resolveTestUnit('''
import 'my_file.dart';
''');
    AnalysisError error = await _findErrorToFix();
    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
    change = fix.change;
    // validate change
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = change.edits[0];
    expect(fileEdit.file, convertPath('/my/project/bin/my_file.dart'));
    expect(fileEdit.fileStamp, -1);
    expect(fileEdit.edits, hasLength(1));
    expect(fileEdit.edits[0].replacement, contains('library my_file;'));
  }

  test_createFile_forImport_BAD_inPackage_lib_justLib() async {
    newFile('/projects/my_package/pubspec.yaml', content: 'name: my_package');
    testFile = '/projects/my_package/test.dart';
    await resolveTestUnit('''
import 'lib';
''');
    await assertNoFix(DartFixKind.CREATE_FILE);
  }

  test_createFile_forImport_BAD_notDart() async {
    testFile = '/my/project/bin/test.dart';
    await resolveTestUnit('''
import 'my_file.txt';
''');
    await assertNoFix(DartFixKind.CREATE_FILE);
  }

  test_createFile_forImport_inPackage_lib() async {
    newFile('/projects/my_package/pubspec.yaml', content: 'name: my_package');
    testFile = '/projects/my_package/lib/test.dart';
    newFolder('/projects/my_package/lib');
    await resolveTestUnit('''
import 'a/bb/c_cc/my_lib.dart';
''');
    AnalysisError error = await _findErrorToFix();
    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
    change = fix.change;
    // validate change
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = change.edits[0];
    expect(fileEdit.file,
        convertPath('/projects/my_package/lib/a/bb/c_cc/my_lib.dart'));
    expect(fileEdit.fileStamp, -1);
    expect(fileEdit.edits, hasLength(1));
    expect(fileEdit.edits[0].replacement,
        contains('library my_package.a.bb.c_cc.my_lib;'));
  }

  test_createFile_forImport_inPackage_test() async {
    newFile('/projects/my_package/pubspec.yaml', content: 'name: my_package');
    testFile = '/projects/my_package/test/misc/test_all.dart';
    await resolveTestUnit('''
import 'a/bb/my_lib.dart';
''');
    AnalysisError error = await _findErrorToFix();
    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
    change = fix.change;
    // validate change
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = change.edits[0];
    expect(fileEdit.file,
        convertPath('/projects/my_package/test/misc/a/bb/my_lib.dart'));
    expect(fileEdit.fileStamp, -1);
    expect(fileEdit.edits, hasLength(1));
    expect(fileEdit.edits[0].replacement,
        contains('library my_package.test.misc.a.bb.my_lib;'));
  }

  test_createFile_forPart() async {
    testFile = convertPath('/my/project/bin/test.dart');
    await resolveTestUnit('''
library my.lib;
part 'my_part.dart';
''');
    AnalysisError error = await _findErrorToFix();
    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
    change = fix.change;
    // validate change
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = change.edits[0];
    expect(fileEdit.file, convertPath('/my/project/bin/my_part.dart'));
    expect(fileEdit.fileStamp, -1);
    expect(fileEdit.edits, hasLength(1));
    expect(fileEdit.edits[0].replacement, contains('part of my.lib;'));
  }

  test_createFile_forPart_inPackageLib() async {
    newFile('/my/pubspec.yaml', content: r'''
name: my_test
''');
    testFile = '/my/lib/test.dart';
    addTestSource('''
library my.lib;
part 'my_part.dart';
''', Uri.parse('package:my/test.dart'));
    // configure SourceFactory
    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
      'my': <Folder>[getFolder('/my/lib')],
    });
    SourceFactory sourceFactory = new SourceFactory(
        [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
    driver.configure(sourceFactory: sourceFactory);
    testUnit = (await driver.getResult(convertPath(testFile))).unit;
    // prepare fix
    AnalysisError error = await _findErrorToFix();
    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
    change = fix.change;
    // validate change
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = change.edits[0];
    expect(fileEdit.file, convertPath('/my/lib/my_part.dart'));
    expect(fileEdit.fileStamp, -1);
    expect(fileEdit.edits, hasLength(1));
    expect(fileEdit.edits[0].replacement, contains('part of my.lib;'));
  }

  test_createGetter_BAD_inSDK() async {
    await resolveTestUnit('''
main(List p) {
  int v = p.foo;
}
''');
    await assertNoFix(DartFixKind.CREATE_GETTER);
  }

  test_createGetter_hint_getter() async {
    await resolveTestUnit('''
class A {
}
main(A a) {
  var x = a;
  int v = x.test;
}
''');
    await assertHasFix(DartFixKind.CREATE_GETTER, '''
class A {
  int get test => null;
}
main(A a) {
  var x = a;
  int v = x.test;
}
''');
  }

  test_createGetter_location_afterLastGetter() async {
    await resolveTestUnit('''
class A {
  int existingField;

  int get existingGetter => null;

  existingMethod() {}
}
main(A a) {
  int v = a.test;
}
''');
    await assertHasFix(DartFixKind.CREATE_GETTER, '''
class A {
  int existingField;

  int get existingGetter => null;

  int get test => null;

  existingMethod() {}
}
main(A a) {
  int v = a.test;
}
''');
  }

  test_createGetter_multiLevel() async {
    await resolveTestUnit('''
class A {
}
class B {
  A a;
}
class C {
  B b;
}
main(C c) {
  int v = c.b.a.test;
}
''');
    await assertHasFix(DartFixKind.CREATE_GETTER, '''
class A {
  int get test => null;
}
class B {
  A a;
}
class C {
  B b;
}
main(C c) {
  int v = c.b.a.test;
}
''');
  }

  test_createGetter_qualified_instance() async {
    await resolveTestUnit('''
class A {
}
main(A a) {
  int v = a.test;
}
''');
    await assertHasFix(DartFixKind.CREATE_GETTER, '''
class A {
  int get test => null;
}
main(A a) {
  int v = a.test;
}
''');
  }

  test_createGetter_qualified_instance_differentLibrary() async {
    addSource('/project/other.dart', '''
/**
 * A comment to push the offset of the braces for the following class
 * declaration past the end of the content of the test file. Used to catch an
 * index out of bounds exception that occurs when using the test source instead
 * of the target source to compute the location at which to insert the field.
 */
class A {
}
''');
    await resolveTestUnit('''
import 'other.dart';
main(A a) {
  int v = a.test;
}
''');
    await assertHasFix(
        DartFixKind.CREATE_GETTER,
        '''
/**
 * A comment to push the offset of the braces for the following class
 * declaration past the end of the content of the test file. Used to catch an
 * index out of bounds exception that occurs when using the test source instead
 * of the target source to compute the location at which to insert the field.
 */
class A {
  int get test => null;
}
''',
        target: '/project/other.dart');
  }

  test_createGetter_qualified_instance_dynamicType() async {
    await resolveTestUnit('''
class A {
  B b;
  void f(Object p) {
    p == b.test;
  }
}
class B {
}
''');
    await assertHasFix(DartFixKind.CREATE_GETTER, '''
class A {
  B b;
  void f(Object p) {
    p == b.test;
  }
}
class B {
  get test => null;
}
''');
  }

  test_createGetter_qualified_propagatedType() async {
    await resolveTestUnit('''
class A {
  A get self => this;
}
main() {
  var a = new A();
  int v = a.self.test;
}
''');
    await assertHasFix(DartFixKind.CREATE_GETTER, '''
class A {
  A get self => this;

  int get test => null;
}
main() {
  var a = new A();
  int v = a.self.test;
}
''');
  }

  test_createGetter_setterContext() async {
    await resolveTestUnit('''
class A {
}
main(A a) {
  a.test = 42;
}
''');
    await assertNoFix(DartFixKind.CREATE_GETTER);
  }

  test_createGetter_unqualified_instance_asInvocationArgument() async {
    await resolveTestUnit('''
class A {
  main() {
    f(test);
  }
}
f(String s) {}
''');
    await assertHasFix(DartFixKind.CREATE_GETTER, '''
class A {
  String get test => null;

  main() {
    f(test);
  }
}
f(String s) {}
''');
  }

  test_createGetter_unqualified_instance_assignmentLhs() async {
    await resolveTestUnit('''
class A {
  main() {
    test = 42;
  }
}
''');
    await assertNoFix(DartFixKind.CREATE_GETTER);
  }

  test_createGetter_unqualified_instance_assignmentRhs() async {
    await resolveTestUnit('''
class A {
  main() {
    int v = test;
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_GETTER, '''
class A {
  int get test => null;

  main() {
    int v = test;
  }
}
''');
  }

  test_createGetter_unqualified_instance_asStatement() async {
    await resolveTestUnit('''
class A {
  main() {
    test;
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_GETTER, '''
class A {
  get test => null;

  main() {
    test;
  }
}
''');
  }

  test_createLocalVariable_functionType_named() async {
    await resolveTestUnit('''
typedef MY_FUNCTION(int p);
foo(MY_FUNCTION f) {}
main() {
  foo(bar);
}
''');
    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
typedef MY_FUNCTION(int p);
foo(MY_FUNCTION f) {}
main() {
  MY_FUNCTION bar;
  foo(bar);
}
''');
  }

  test_createLocalVariable_functionType_named_generic() async {
    await resolveTestUnit('''
typedef MY_FUNCTION<T>(T p);
foo(MY_FUNCTION<int> f) {}
main() {
  foo(bar);
}
''');
    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
typedef MY_FUNCTION<T>(T p);
foo(MY_FUNCTION<int> f) {}
main() {
  MY_FUNCTION<int> bar;
  foo(bar);
}
''');
  }

  @failingTest
  test_createLocalVariable_functionType_synthetic() async {
    await resolveTestUnit('''
foo(f(int p)) {}
main() {
  foo(bar);
}
''');
    await assertNoFix(DartFixKind.CREATE_LOCAL_VARIABLE);
  }

  test_createLocalVariable_read_typeAssignment() async {
    await resolveTestUnit('''
main() {
  int a = test;
}
''');
    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
main() {
  int test;
  int a = test;
}
''');
  }

  test_createLocalVariable_read_typeCondition() async {
    await resolveTestUnit('''
main() {
  if (!test) {
    print(42);
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
main() {
  bool test;
  if (!test) {
    print(42);
  }
}
''');
  }

  test_createLocalVariable_read_typeInvocationArgument() async {
    await resolveTestUnit('''
main() {
  f(test);
}
f(String p) {}
''');
    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
main() {
  String test;
  f(test);
}
f(String p) {}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['String test;']);
    _assertLinkedGroup(change.linkedEditGroups[1], ['test;', 'test);']);
  }

  test_createLocalVariable_read_typeInvocationTarget() async {
    await resolveTestUnit('''
main() {
  test.add('hello');
}
''');
    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
main() {
  var test;
  test.add('hello');
}
''');
    _assertLinkedGroup(change.linkedEditGroups[0], ['test;', 'test.add(']);
  }

  test_createLocalVariable_withImport() async {
    addPackageSource('pkg', 'a/a.dart', '''
class A {}
''');
    addPackageSource('pkg', 'b/b.dart', '''
class B {}
''');
    addPackageSource('pkg', 'c/c.dart', '''
import 'package:pkg/a/a.dart';
import 'package:pkg/b/b.dart';

class C {
  C(A a, B b);
}
''');

    await resolveTestUnit('''
import 'package:pkg/a/a.dart';
import 'package:pkg/c/c.dart';

main() {
  A a;
  new C(a, b);
}
''');
    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
import 'package:pkg/a/a.dart';
import 'package:pkg/b/b.dart';
import 'package:pkg/c/c.dart';

main() {
  A a;
  B b;
  new C(a, b);
}
''');

    List<LinkedEditGroup> groups = change.linkedEditGroups;
    expect(groups, hasLength(2));
    LinkedEditGroup typeGroup = groups[0];
    List<Position> typePositions = typeGroup.positions;
    expect(typePositions, hasLength(1));
    expect(typePositions[0].offset, 112);
    LinkedEditGroup nameGroup = groups[1];
    List<Position> groupPositions = nameGroup.positions;
    expect(groupPositions, hasLength(2));
    expect(groupPositions[0].offset, 114);
    expect(groupPositions[1].offset, 128);
  }

  test_createLocalVariable_write_assignment() async {
    await resolveTestUnit('''
main() {
  test = 42;
}
''');
    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
main() {
  var test = 42;
}
''');
  }

  test_createLocalVariable_write_assignment_compound() async {
    await resolveTestUnit('''
main() {
  test += 42;
}
''');
    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
main() {
  int test;
  test += 42;
}
''');
  }

  test_createMissingOverrides_field_untyped() async {
    await resolveTestUnit('''
class A {
  var f;
}

class B implements A {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
class A {
  var f;
}

class B implements A {
  @override
  var f;
}
''');
  }

  test_createMissingOverrides_functionTypeAlias() async {
    await resolveTestUnit('''
typedef int Binary(int left, int right);

abstract class Emulator {
  void performBinary(Binary binary);
}

class MyEmulator extends Emulator {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
typedef int Binary(int left, int right);

abstract class Emulator {
  void performBinary(Binary binary);
}

class MyEmulator extends Emulator {
  @override
  void performBinary(Binary binary) {
    // TODO: implement performBinary
  }
}
''');
  }

  test_createMissingOverrides_functionTypedParameter() async {
    await resolveTestUnit('''
abstract class A {
  forEach(int f(double p1, String p2));
}

class B extends A {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
abstract class A {
  forEach(int f(double p1, String p2));
}

class B extends A {
  @override
  forEach(int Function(double p1, String p2) f) {
    // TODO: implement forEach
  }
}
''');
  }

  test_createMissingOverrides_generics_typeArguments() async {
    await resolveTestUnit('''
class Iterator<T> {
}

abstract class IterableMixin<T> {
  Iterator<T> get iterator;
}

class Test extends IterableMixin<int> {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
class Iterator<T> {
}

abstract class IterableMixin<T> {
  Iterator<T> get iterator;
}

class Test extends IterableMixin<int> {
  // TODO: implement iterator
  @override
  Iterator<int> get iterator => null;
}
''');
  }

  test_createMissingOverrides_generics_typeParameters() async {
    await resolveTestUnit('''
abstract class ItemProvider<T> {
  List<T> getItems();
}

class Test<V> extends ItemProvider<V> {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
abstract class ItemProvider<T> {
  List<T> getItems();
}

class Test<V> extends ItemProvider<V> {
  @override
  List<V> getItems() {
    // TODO: implement getItems
  }
}
''');
  }

  test_createMissingOverrides_getter() async {
    await resolveTestUnit('''
abstract class A {
  get g1;
  int get g2;
}

class B extends A {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
abstract class A {
  get g1;
  int get g2;
}

class B extends A {
  // TODO: implement g1
  @override
  get g1 => null;

  // TODO: implement g2
  @override
  int get g2 => null;
}
''');
  }

  test_createMissingOverrides_importPrefix() async {
    await resolveTestUnit('''
import 'dart:async' as aaa;
abstract class A {
  Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
}

class B extends A {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
import 'dart:async' as aaa;
abstract class A {
  Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
}

class B extends A {
  @override
  Map<aaa.Future, List<aaa.Future>> g(aaa.Future p) {
    // TODO: implement g
  }
}
''');
  }

  test_createMissingOverrides_mergeToField_getterSetter() async {
    await resolveTestUnit('''
class A {
  int ma;
  void mb() {}
  double mc;
}

class B implements A {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
class A {
  int ma;
  void mb() {}
  double mc;
}

class B implements A {
  @override
  int ma;

  @override
  double mc;

  @override
  void mb() {
    // TODO: implement mb
  }
}
''');
  }

  test_createMissingOverrides_method() async {
    await resolveTestUnit('''
abstract class A {
  m1();
  int m2();
  String m3(int p1, double p2, Map<int, List<String>> p3);
  String m4(p1, p2);
  String m5(p1, [int p2 = 2, int p3, p4 = 4]);
  String m6(p1, {int p2 = 2, int p3, p4: 4});
}

class B extends A {
}
''');
    String expectedCode = '''
abstract class A {
  m1();
  int m2();
  String m3(int p1, double p2, Map<int, List<String>> p3);
  String m4(p1, p2);
  String m5(p1, [int p2 = 2, int p3, p4 = 4]);
  String m6(p1, {int p2 = 2, int p3, p4: 4});
}

class B extends A {
  @override
  m1() {
    // TODO: implement m1
  }

  @override
  int m2() {
    // TODO: implement m2
  }

  @override
  String m3(int p1, double p2, Map<int, List<String>> p3) {
    // TODO: implement m3
  }

  @override
  String m4(p1, p2) {
    // TODO: implement m4
  }

  @override
  String m5(p1, [int p2 = 2, int p3, p4 = 4]) {
    // TODO: implement m5
  }

  @override
  String m6(p1, {int p2 = 2, int p3, p4 = 4}) {
    // TODO: implement m6
  }
}
''';
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, expectedCode);
    // end position should be on "m1", not on "m2", "m3", etc
    {
      Position endPosition = change.selection;
      expect(endPosition, isNotNull);
      expect(endPosition.file, testFile);
      int endOffset = endPosition.offset;
      String endString = expectedCode.substring(endOffset, endOffset + 25);
      expect(endString, contains('m1'));
      expect(endString, isNot(contains('m2')));
      expect(endString, isNot(contains('m3')));
      expect(endString, isNot(contains('m4')));
      expect(endString, isNot(contains('m5')));
      expect(endString, isNot(contains('m6')));
    }
  }

  test_createMissingOverrides_method_emptyClassBody() async {
    await resolveTestUnit('''
abstract class A {
  void foo();
}

class B extends A {}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
abstract class A {
  void foo();
}

class B extends A {
  @override
  void foo() {
    // TODO: implement foo
  }
}
''');
  }

  test_createMissingOverrides_method_generic() async {
    await resolveTestUnit('''
class C<T> {}
class V<E> {}

abstract class A {
  E1 foo<E1, E2 extends C<int>>(V<E2> v);
}

class B implements A {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
class C<T> {}
class V<E> {}

abstract class A {
  E1 foo<E1, E2 extends C<int>>(V<E2> v);
}

class B implements A {
  @override
  E1 foo<E1, E2 extends C<int>>(V<E2> v) {
    // TODO: implement foo
  }
}
''');
  }

  test_createMissingOverrides_method_generic_withBounds() async {
    // https://github.com/dart-lang/sdk/issues/31199
    await resolveTestUnit('''
abstract class A<K, V> {
  List<T> foo<T extends V>(K key);
}

class B<K, V> implements A<K, V> {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
abstract class A<K, V> {
  List<T> foo<T extends V>(K key);
}

class B<K, V> implements A<K, V> {
  @override
  List<T> foo<T extends V>(K key) {
    // TODO: implement foo
  }
}
''');
  }

  test_createMissingOverrides_method_notEmptyClassBody() async {
    await resolveTestUnit('''
abstract class A {
  void foo();
}

class B extends A {
  void bar() {}
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
abstract class A {
  void foo();
}

class B extends A {
  void bar() {}

  @override
  void foo() {
    // TODO: implement foo
  }
}
''');
  }

  test_createMissingOverrides_operator() async {
    await resolveTestUnit('''
abstract class A {
  int operator [](int index);
  void operator []=(int index, String value);
}

class B extends A {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
abstract class A {
  int operator [](int index);
  void operator []=(int index, String value);
}

class B extends A {
  @override
  int operator [](int index) {
    // TODO: implement []
  }

  @override
  void operator []=(int index, String value) {
    // TODO: implement []=
  }
}
''');
  }

  test_createMissingOverrides_setter() async {
    await resolveTestUnit('''
abstract class A {
  set s1(x);
  set s2(int x);
  void set s3(String x);
}

class B extends A {
}
''');
    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
abstract class A {
  set s1(x);
  set s2(int x);
  void set s3(String x);
}

class B extends A {
  @override
  set s1(x) {
    // TODO: implement s1
  }

  @override
  set s2(int x) {
    // TODO: implement s2
  }

  @override
  set s3(String x) {
    // TODO: implement s3
  }
}
''');
  }

  test_createNoSuchMethod_BAD_classTypeAlias() async {
    await resolveTestUnit('''
abstract class A {
  m();
}

class B = Object with A;
''');
    await assertNoFix(
      DartFixKind.CREATE_NO_SUCH_METHOD,
    );
  }

  test_createNoSuchMethod_OK() async {
    await resolveTestUnit('''
abstract class A {
  m1();
  int m2();
}

class B extends A {
  existing() {}
}
''');
    await assertHasFix(DartFixKind.CREATE_NO_SUCH_METHOD, '''
abstract class A {
  m1();
  int m2();
}

class B extends A {
  existing() {}

  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
''');
  }

  test_creationFunction_forFunctionType_cascadeSecond() async {
    await resolveTestUnit('''
class A {
  B ma() => null;
}
class B {
  useFunction(int g(double a, String b)) {}
}

main() {
  A a = new A();
  a..ma().useFunction(test);
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
class A {
  B ma() => null;
}
class B {
  useFunction(int g(double a, String b)) {}
}

main() {
  A a = new A();
  a..ma().useFunction(test);
}

int test(double a, String b) {
}
''');
  }

  test_creationFunction_forFunctionType_coreFunction() async {
    await resolveTestUnit('''
main() {
  useFunction(g: test);
}
useFunction({Function g}) {}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  useFunction(g: test);
}
useFunction({Function g}) {}

test() {
}
''');
  }

  test_creationFunction_forFunctionType_dynamicArgument() async {
    await resolveTestUnit('''
main() {
  useFunction(test);
}
useFunction(int g(a, b)) {}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  useFunction(test);
}
useFunction(int g(a, b)) {}

int test(a, b) {
}
''');
  }

  test_creationFunction_forFunctionType_function() async {
    await resolveTestUnit('''
main() {
  useFunction(test);
}
useFunction(int g(double a, String b)) {}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  useFunction(test);
}
useFunction(int g(double a, String b)) {}

int test(double a, String b) {
}
''');
  }

  test_creationFunction_forFunctionType_function_namedArgument() async {
    await resolveTestUnit('''
main() {
  useFunction(g: test);
}
useFunction({int g(double a, String b)}) {}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  useFunction(g: test);
}
useFunction({int g(double a, String b)}) {}

int test(double a, String b) {
}
''');
  }

  test_creationFunction_forFunctionType_importType() async {
    addSource('/project/libA.dart', r'''
library libA;
class A {}
''');
    addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
useFunction(int g(A a)) {}
''');
    await resolveTestUnit('''
import 'libB.dart';
main() {
  useFunction(test);
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
import 'libA.dart';
import 'libB.dart';
main() {
  useFunction(test);
}

int test(A a) {
}
''');
  }

  test_creationFunction_forFunctionType_method_enclosingClass_static() async {
    await resolveTestUnit('''
class A {
  static foo() {
    useFunction(test);
  }
}
useFunction(int g(double a, String b)) {}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  static foo() {
    useFunction(test);
  }

  static int test(double a, String b) {
  }
}
useFunction(int g(double a, String b)) {}
''');
  }

  test_creationFunction_forFunctionType_method_enclosingClass_static2() async {
    await resolveTestUnit('''
class A {
  var f;
  A() : f = useFunction(test);
}
useFunction(int g(double a, String b)) {}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  var f;
  A() : f = useFunction(test);

  static int test(double a, String b) {
  }
}
useFunction(int g(double a, String b)) {}
''');
  }

  test_creationFunction_forFunctionType_method_targetClass() async {
    await resolveTestUnit('''
main(A a) {
  useFunction(a.test);
}
class A {
}
useFunction(int g(double a, String b)) {}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
main(A a) {
  useFunction(a.test);
}
class A {
  int test(double a, String b) {
  }
}
useFunction(int g(double a, String b)) {}
''');
  }

  test_creationFunction_forFunctionType_method_targetClass_hasOtherMember() async {
    await resolveTestUnit('''
main(A a) {
  useFunction(a.test);
}
class A {
  m() {}
}
useFunction(int g(double a, String b)) {}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
main(A a) {
  useFunction(a.test);
}
class A {
  m() {}

  int test(double a, String b) {
  }
}
useFunction(int g(double a, String b)) {}
''');
  }

  test_creationFunction_forFunctionType_notFunctionType() async {
    await resolveTestUnit('''
main(A a) {
  useFunction(a.test);
}
typedef A();
useFunction(g) {}
''');
    await assertNoFix(DartFixKind.CREATE_METHOD);
    await assertNoFix(DartFixKind.CREATE_FUNCTION);
  }

  test_creationFunction_forFunctionType_unknownTarget() async {
    await resolveTestUnit('''
main(A a) {
  useFunction(a.test);
}
class A {
}
useFunction(g) {}
''');
    await assertNoFix(DartFixKind.CREATE_METHOD);
  }

  test_expectedToken_semicolon() async {
    await resolveTestUnit('''
main() {
  print(0)
}
''');
    await assertHasFix(DartFixKind.INSERT_SEMICOLON, '''
main() {
  print(0);
}
''');
  }

  test_illegalAsyncReturnType_adjacentNodes() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
    };
    await resolveTestUnit('''
import 'dart:async';
var v;int main() async => 0;
''');
    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
import 'dart:async';
var v;Future<int> main() async => 0;
''');
  }

  test_illegalAsyncReturnType_asyncLibrary_import() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
    };
    await resolveTestUnit('''
library main;
int main() async {
}
''');
    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
library main;

import 'dart:async';

Future<int> main() async {
}
''');
  }

  test_illegalAsyncReturnType_asyncLibrary_usePrefix() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
    };
    await resolveTestUnit('''
import 'dart:async' as al;
int main() async {
}
''');
    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
import 'dart:async' as al;
al.Future<int> main() async {
}
''');
  }

  test_illegalAsyncReturnType_complexTypeName() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
    };
    await resolveTestUnit('''
import 'dart:async';
List<int> main() async {
}
''');
    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
import 'dart:async';
Future<List<int>> main() async {
}
''');
  }

  @failingTest // This is likely not going to be an error in dart 2.
  test_illegalAsyncReturnType_void() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
    };
    await resolveTestUnit('''
import 'dart:async';
void main() async {
}
''');
    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
import 'dart:async';
Future main() async {
}
''');
  }

  test_importLibraryPackage_preferDirectOverExport() async {
    _configureMyPkg({'b.dart': 'class Test {}', 'a.dart': "export 'b.dart';"});
    await resolveTestUnit('''
main() {
  Test test = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'package:my_pkg/b.dart';

main() {
  Test test = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT2, '''
import 'package:my_pkg/a.dart';

main() {
  Test test = null;
}
''');
  }

  test_importLibraryPackage_preferDirectOverExport_src() async {
    myPkgLibPath = '/my/src/packages/my_pkg/lib';
    _configureMyPkg({'b.dart': 'class Test {}', 'a.dart': "export 'b.dart';"});
    await resolveTestUnit('''
main() {
  Test test = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'package:my_pkg/b.dart';

main() {
  Test test = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT2, '''
import 'package:my_pkg/a.dart';

main() {
  Test test = null;
}
''');
  }

  test_importLibraryProject_BAD_inLibSrc_differentContextRoot() async {
    addPackageSource('bbb', 'b1.dart', r'''
import 'src/b2.dart';
''');
    addPackageSource('bbb', 'src/b2.dart', 'class Test {}');
    await resolveTestUnit('''
import 'package:bbb/b1.dart';
main() {
  Test t;
}
''');
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_CLASS;
    };
    await assertNoFix(DartFixKind.IMPORT_LIBRARY_PROJECT3);
  }

  test_importLibraryProject_BAD_notInLib_BUILD() async {
    testFile = '/project/lib/test.dart';
    addSource('/other/test/lib.dart', 'class Test {}');
    await resolveTestUnit('''
main() {
  Test t;
}
''');
    await assertNoFix(DartFixKind.IMPORT_LIBRARY_PROJECT1);
  }

  test_importLibraryProject_BAD_notInLib_pubspec() async {
    testFile = '/project/lib/test.dart';
    addSource('/other/test/lib.dart', 'class Test {}');
    await resolveTestUnit('''
main() {
  Test t;
}
''');
    await assertNoFix(DartFixKind.IMPORT_LIBRARY_PROJECT1);
  }

  test_importLibraryProject_OK_inLibSrc_thisContextRoot() async {
    testFile = '/project/lib/test.dart';
    packageMap['project'] = [newFolder('/project/lib')];
    addSource('/project/lib/src/lib.dart', 'class Test {}');
    configureDriver();
    await resolveTestUnit('''
main() {
  Test t;
}
''');
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_CLASS;
    };
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT3, '''
import 'package:project/src/lib.dart';

main() {
  Test t;
}
''');
  }

  test_importLibraryProject_withClass_annotation() async {
    testFile = '/project/lib/test.dart';
    addSource('/project/lib/lib.dart', '''
library lib;
class Test {
  const Test(int p);
}
''');
    await resolveTestUnit('''
@Test(0)
main() {
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

@Test(0)
main() {
}
''');
  }

  test_importLibraryProject_withClass_hasOtherLibraryWithPrefix() async {
    testFile = '/project/bin/test.dart';
    addSource('/project/bin/a.dart', '''
library a;
class One {}
''');
    addSource('/project/bin/b.dart', '''
library b;
class One {}
class Two {}
''');
    await resolveTestUnit('''
import 'b.dart' show Two;
main () {
  new Two();
  new One();
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'a.dart';
import 'b.dart' show Two;
main () {
  new Two();
  new One();
}
''');
  }

  test_importLibraryProject_withClass_inParentFolder() async {
    testFile = '/project/bin/test.dart';
    addSource('/project/lib.dart', '''
library lib;
class Test {}
''');
    await resolveTestUnit('''
main() {
  Test t = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import '../lib.dart';

main() {
  Test t = null;
}
''');
  }

  test_importLibraryProject_withClass_inRelativeFolder() async {
    testFile = '/project/bin/test.dart';
    addSource('/project/lib/sub/folder/lib.dart', '''
library lib;
class Test {}
''');
    await resolveTestUnit('''
main() {
  Test t = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import '../lib/sub/folder/lib.dart';

main() {
  Test t = null;
}
''');
  }

  test_importLibraryProject_withClass_inSameFolder() async {
    testFile = '/project/bin/test.dart';
    addSource('/project/bin/lib.dart', '''
library lib;
class Test {}
''');
    await resolveTestUnit('''
main() {
  Test t = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

main() {
  Test t = null;
}
''');
  }

  test_importLibraryProject_withClass_instanceCreation_const() async {
    testFile = '/project/lib/test.dart';
    addSource('/project/lib/lib.dart', '''
class Test {
  const Test();
}
''');
    await resolveTestUnit('''
main() {
  return const Test();
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

main() {
  return const Test();
}
''');
  }

  test_importLibraryProject_withClass_instanceCreation_const_namedConstructor() async {
    testFile = '/project/lib/test.dart';
    addSource('/project/lib/lib.dart', '''
class Test {
  const Test.named();
}
''');
    await resolveTestUnit('''
main() {
  const Test.named();
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

main() {
  const Test.named();
}
''');
  }

  test_importLibraryProject_withClass_instanceCreation_implicit() async {
    testFile = '/project/lib/test.dart';
    addSource('/project/lib/lib.dart', '''
class Test {
  const Test();
}
''');
    await resolveTestUnit('''
main() {
  return Test();
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

main() {
  return Test();
}
''');
  }

  test_importLibraryProject_withClass_instanceCreation_new() async {
    testFile = '/project/lib/test.dart';
    addSource('/project/lib/lib.dart', '''
class Test {
  const Test();
}
''');
    await resolveTestUnit('''
main() {
  return new Test();
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

main() {
  return new Test();
}
''');
  }

  test_importLibraryProject_withClass_instanceCreation_new_namedConstructor() async {
    testFile = '/project/lib/test.dart';
    addSource('/project/lib/lib.dart', '''
class Test {
  Test.named();
}
''');
    await resolveTestUnit('''
main() {
  new Test.named();
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

main() {
  new Test.named();
}
''');
  }

  test_importLibraryProject_withFunction() async {
    testFile = '/project/lib/test.dart';
    addSource('/project/lib/lib.dart', '''
library lib;
myFunction() {}
''');
    await resolveTestUnit('''
main() {
  myFunction();
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

main() {
  myFunction();
}
''');
  }

  test_importLibraryProject_withFunction_unresolvedMethod() async {
    testFile = '/project/lib/test.dart';
    addSource('/project/lib/lib.dart', '''
library lib;
myFunction() {}
''');
    await resolveTestUnit('''
class A {
  main() {
    myFunction();
  }
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

class A {
  main() {
    myFunction();
  }
}
''');
  }

  test_importLibraryProject_withFunctionTypeAlias() async {
    testFile = '/project/bin/test.dart';
    addSource('/project/bin/lib.dart', '''
library lib;
typedef MyFunction();
''');
    await resolveTestUnit('''
main() {
  MyFunction t = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

main() {
  MyFunction t = null;
}
''');
  }

  test_importLibraryProject_withTopLevelVariable() async {
    testFile = '/project/lib/test.dart';
    addSource('/project/lib/lib.dart', '''
library lib;
int MY_VAR = 42;
''');
    await resolveTestUnit('''
main() {
  print(MY_VAR);
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
import 'lib.dart';

main() {
  print(MY_VAR);
}
''');
  }

  test_importLibrarySdk_withClass_AsExpression() async {
    await resolveTestUnit('''
main(p) {
  p as Future;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

main(p) {
  p as Future;
}
''');
  }

  test_importLibrarySdk_withClass_instanceCreation_explicitNew() async {
    await resolveTestUnit('''
class C {
  foo() {
    new Future();
  }
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

class C {
  foo() {
    new Future();
  }
}
''');
  }

  test_importLibrarySdk_withClass_instanceCreation_explicitNew_namedConstructor() async {
    await resolveTestUnit('''
class C {
  foo() {
    new Future.value(0);
  }
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

class C {
  foo() {
    new Future.value(0);
  }
}
''');
  }

  test_importLibrarySdk_withClass_instanceCreation_implicitNew() async {
    configurePreviewDart2();
    await resolveTestUnit('''
class C {
  foo() {
    Future();
  }
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

class C {
  foo() {
    Future();
  }
}
''');
  }

  test_importLibrarySdk_withClass_instanceCreation_implicitNew_namedConstructor() async {
    configurePreviewDart2();
    await resolveTestUnit('''
class C {
  foo() {
    Future.value(0);
  }
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

class C {
  foo() {
    Future.value(0);
  }
}
''');
  }

  test_importLibrarySdk_withClass_invocationTarget() async {
    await resolveTestUnit('''
main() {
  Future.wait(null);
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

main() {
  Future.wait(null);
}
''');
  }

  test_importLibrarySdk_withClass_IsExpression() async {
    await resolveTestUnit('''
main(p) {
  p is Future;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

main(p) {
  p is Future;
}
''');
  }

  test_importLibrarySdk_withClass_itemOfList() async {
    await resolveTestUnit('''
main() {
  var a = [Future];
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

main() {
  var a = [Future];
}
''');
  }

  test_importLibrarySdk_withClass_itemOfList_inAnnotation() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER;
    };
    await resolveTestUnit('''
class MyAnnotation {
  const MyAnnotation(a, b);
}
@MyAnnotation(int, const [Future])
main() {}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

class MyAnnotation {
  const MyAnnotation(a, b);
}
@MyAnnotation(int, const [Future])
main() {}
''');
  }

  test_importLibrarySdk_withClass_typeAnnotation() async {
    await resolveTestUnit('''
main() {
  Future f = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

main() {
  Future f = null;
}
''');
  }

  test_importLibrarySdk_withClass_typeAnnotation_PrefixedIdentifier() async {
    await resolveTestUnit('''
main() {
  Future.wait;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

main() {
  Future.wait;
}
''');
  }

  test_importLibrarySdk_withClass_typeArgument() async {
    await resolveTestUnit('''
main() {
  List<Future> futures = [];
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:async';

main() {
  List<Future> futures = [];
}
''');
  }

  test_importLibrarySdk_withTopLevelVariable() async {
    await resolveTestUnit('''
main() {
  print(PI);
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:math';

main() {
  print(PI);
}
''');
  }

  test_importLibrarySdk_withTopLevelVariable_annotation() async {
    await resolveTestUnit('''
@PI
main() {
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
import 'dart:math';

@PI
main() {
}
''');
  }

  test_importLibraryShow_project() async {
    testFile = '/project/bin/test.dart';
    addSource('/project/bin/lib.dart', '''
class A {}
class B {}
''');
    await resolveTestUnit('''
import 'lib.dart' show A;
main() {
  A a;
  B b;
}
''');
    await assertNoFix(DartFixKind.IMPORT_LIBRARY_PROJECT1);
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SHOW, '''
import 'lib.dart' show A, B;
main() {
  A a;
  B b;
}
''');
  }

  test_importLibraryShow_sdk() async {
    await resolveTestUnit('''
import 'dart:async' show Stream;
main() {
  Stream s = null;
  Future f = null;
}
''');
    await assertNoFix(DartFixKind.IMPORT_LIBRARY_SDK);
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SHOW, '''
import 'dart:async' show Future, Stream;
main() {
  Stream s = null;
  Future f = null;
}
''');
  }

  test_invokeConstructorUsingNew() async {
    if (previewDart2) {
      return;
    }
    await resolveTestUnit('''
class C {
  C.c();
}
main() {
  C c = C.c();
}
''');
    await assertHasFix(DartFixKind.INVOKE_CONSTRUCTOR_USING_NEW, '''
class C {
  C.c();
}
main() {
  C c = new C.c();
}
''');
  }

  test_isNotNull() async {
    await resolveTestUnit('''
main(p) {
  p is! Null;
}
''');
    await assertHasFix(DartFixKind.USE_NOT_EQ_NULL, '''
main(p) {
  p != null;
}
''');
  }

  test_isNotNull_all() async {
    await resolveTestUnit('''
main(p, q) {
  p is! Null;
  q is! Null;
}
''');
    await assertHasFixAllFix(
        HintCode.TYPE_CHECK_IS_NOT_NULL, DartFixKind.USE_NOT_EQ_NULL, '''
main(p, q) {
  p != null;
  q != null;
}
''');
  }

  test_isNull() async {
    await resolveTestUnit('''
main(p) {
  p is Null;
}
''');
    await assertHasFix(DartFixKind.USE_EQ_EQ_NULL, '''
main(p) {
  p == null;
}
''');
  }

  test_isNull_all() async {
    await resolveTestUnit('''
main(p, q) {
  p is Null;
  q is Null;
}
''');
    await assertHasFixAllFix(
        HintCode.TYPE_CHECK_IS_NULL, DartFixKind.USE_EQ_EQ_NULL, '''
main(p, q) {
  p == null;
  q == null;
}
''');
  }

  test_makeEnclosingClassAbstract_declaresAbstractMethod() async {
    await resolveTestUnit('''
class A {
  m();
}
''');
    await assertHasFix(DartFixKind.MAKE_CLASS_ABSTRACT, '''
abstract class A {
  m();
}
''');
  }

  test_makeEnclosingClassAbstract_inheritsAbstractMethod() async {
    await resolveTestUnit('''
abstract class A {
  m();
}
class B extends A {
}
''');
    await assertHasFix(DartFixKind.MAKE_CLASS_ABSTRACT, '''
abstract class A {
  m();
}
abstract class B extends A {
}
''');
  }

  test_makeFieldNotFinal_hasType() async {
    await resolveTestUnit('''
class A {
  final int fff = 1;
  main() {
    fff = 2;
  }
}
''');
    await assertHasFix(DartFixKind.MAKE_FIELD_NOT_FINAL, '''
class A {
  int fff = 1;
  main() {
    fff = 2;
  }
}
''');
  }

  test_makeFieldNotFinal_noType() async {
    await resolveTestUnit('''
class A {
  final fff = 1;
  main() {
    fff = 2;
  }
}
''');
    await assertHasFix(DartFixKind.MAKE_FIELD_NOT_FINAL, '''
class A {
  var fff = 1;
  main() {
    fff = 2;
  }
}
''');
  }

  test_noException_1() async {
    await resolveTestUnit('''
main(p) {
  p i s Null;
}''');
    List<AnalysisError> errors = await _computeErrors();
    for (var error in errors) {
      await _computeFixes(error);
    }
  }

  test_nonBoolCondition_addNotNull() async {
    await resolveTestUnit('''
main(String p) {
  if (p) {
    print(p);
  }
}
''');
    await assertHasFix(DartFixKind.ADD_NE_NULL, '''
main(String p) {
  if (p != null) {
    print(p);
  }
}
''');
  }

  test_nonBoolCondition_addNotNull_all() async {
    await resolveTestUnit('''
main(String p, String q) {
  if (p) {
    print(p);
  }
  if (q) {
    print(q);
  }
}
''');
    await assertHasFixAllFix(
        StaticTypeWarningCode.NON_BOOL_CONDITION, DartFixKind.ADD_NE_NULL, '''
main(String p, String q) {
  if (p != null) {
    print(p);
  }
  if (q != null) {
    print(q);
  }
}
''');
  }

  test_removeDeadCode_condition() async {
    await resolveTestUnit('''
main(int p) {
  if (true || p > 5) {
    print(1);
  }
}
''');
    await assertHasFix(DartFixKind.REMOVE_DEAD_CODE, '''
main(int p) {
  if (true) {
    print(1);
  }
}
''');
  }

  test_removeDeadCode_statements_one() async {
    await resolveTestUnit('''
int main() {
  print(0);
  return 42;
  print(1);
}
''');
    await assertHasFix(DartFixKind.REMOVE_DEAD_CODE, '''
int main() {
  print(0);
  return 42;
}
''');
  }

  test_removeDeadCode_statements_two() async {
    await resolveTestUnit('''
int main() {
  print(0);
  return 42;
  print(1);
  print(2);
}
''');
    await assertHasFix(DartFixKind.REMOVE_DEAD_CODE, '''
int main() {
  print(0);
  return 42;
}
''');
  }

  test_removeParentheses_inGetterDeclaration() async {
    await resolveTestUnit('''
class A {
  int get foo() => 0;
}
''');
    await assertHasFix(DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION, '''
class A {
  int get foo => 0;
}
''');
  }

  test_removeParentheses_inGetterInvocation() async {
    await resolveTestUnit('''
class A {
  int get foo => 0;
}
main(A a) {
  a.foo();
}
''');
    await assertHasFix(DartFixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION, '''
class A {
  int get foo => 0;
}
main(A a) {
  a.foo;
}
''');
  }

  test_removeUnnecessaryCast_assignment() async {
    await resolveTestUnit('''
main(Object p) {
  if (p is String) {
    String v = ((p as String));
  }
}
''');
    await assertHasFix(DartFixKind.REMOVE_UNNECESSARY_CAST, '''
main(Object p) {
  if (p is String) {
    String v = p;
  }
}
''');
  }

  test_removeUnnecessaryCast_assignment_all() async {
    await resolveTestUnit('''
main(Object p, Object q) {
  if (p is String) {
    String v = ((p as String));
  }
  if (q is int) {
    int v = ((q as int));
  }
}
''');
    await assertHasFixAllFix(
        HintCode.UNNECESSARY_CAST, DartFixKind.REMOVE_UNNECESSARY_CAST, '''
main(Object p, Object q) {
  if (p is String) {
    String v = p;
  }
  if (q is int) {
    int v = q;
  }
}
''');
  }

  test_removeUnusedCatchClause() async {
    errorFilter = (AnalysisError error) => true;
    await resolveTestUnit('''
main() {
  try {
    throw 42;
  } on int catch (e) {
  }
}
''');
    await assertHasFix(DartFixKind.REMOVE_UNUSED_CATCH_CLAUSE, '''
main() {
  try {
    throw 42;
  } on int {
  }
}
''');
  }

  test_removeUnusedCatchStack() async {
    errorFilter = (AnalysisError error) => true;
    await resolveTestUnit('''
main() {
  try {
    throw 42;
  } catch (e, stack) {
  }
}
''');
    await assertHasFix(DartFixKind.REMOVE_UNUSED_CATCH_STACK, '''
main() {
  try {
    throw 42;
  } catch (e) {
  }
}
''');
  }

  test_removeUnusedImport() async {
    await resolveTestUnit('''
import 'dart:math';
main() {
}
''');
    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
main() {
}
''');
  }

  test_removeUnusedImport_all() async {
    await resolveTestUnit('''
import 'dart:math';
import 'dart:math';
import 'dart:math';
main() {
}
''');
    await assertHasFixAllFix(
        HintCode.UNUSED_IMPORT, DartFixKind.REMOVE_UNUSED_IMPORT, '''
main() {
}
''');
  }

  test_removeUnusedImport_all_diverseImports() async {
    await resolveTestUnit('''
import 'dart:math';
import 'dart:math';
import 'dart:async';
main() {
}
''');
    await assertHasFixAllFix(
        HintCode.UNUSED_IMPORT, DartFixKind.REMOVE_UNUSED_IMPORT, '''
main() {
}
''');
  }

  test_removeUnusedImport_all_diverseImports2() async {
    await resolveTestUnit('''
import 'dart:async';
import 'dart:math' as math;
import 'dart:async';

var tau = math.pi * 2;

main() {
}
''');
    await assertHasFixAllFix(
        HintCode.UNUSED_IMPORT, DartFixKind.REMOVE_UNUSED_IMPORT, '''
import 'dart:math' as math;

var tau = math.pi * 2;

main() {
}
''');
  }

  test_removeUnusedImport_all_singleLine() async {
    await resolveTestUnit('''
import 'dart:math'; import 'dart:math'; import 'dart:math';
main() {
}
''');
    await assertHasFixAllFix(
        HintCode.UNUSED_IMPORT, DartFixKind.REMOVE_UNUSED_IMPORT, '''
main() {
}
''');
  }

  test_removeUnusedImport_anotherImportOnLine() async {
    await resolveTestUnit('''
import 'dart:math'; import 'dart:async';

main() {
  Future f;
}
''');
    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
import 'dart:async';

main() {
  Future f;
}
''');
  }

  test_removeUnusedImport_severalLines() async {
    await resolveTestUnit('''
import
  'dart:math';
main() {
}
''');
    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
main() {
}
''');
  }

  test_replaceVarWithDynamic() async {
    errorFilter = (AnalysisError error) {
      return error.errorCode == ParserErrorCode.VAR_AS_TYPE_NAME;
    };
    await resolveTestUnit('''
class A {
  Map<String, var> m;
}
''');
    await assertHasFix(DartFixKind.REPLACE_VAR_WITH_DYNAMIC, '''
class A {
  Map<String, dynamic> m;
}
''');
  }

  test_replaceWithConstInstanceCreation_explicitNew() async {
    await resolveTestUnit('''
class A {
  const A();
}
const a = new A();
''');
    await assertHasFix(DartFixKind.USE_CONST, '''
class A {
  const A();
}
const a = const A();
''');
  }

  @failingTest
  test_replaceWithConstInstanceCreation_implicitNew() async {
    // This test fails because the implicit `new` isn't yet recognized.
    await resolveTestUnit('''
class A {
  const A();
}
const a = A();
''');
    await assertHasFix(DartFixKind.USE_CONST, '''
class A {
  const A();
}
const a = const A();
''');
  }

  test_undefinedClass_useSimilar_BAD_prefixed() async {
    await resolveTestUnit('''
import 'dart:async' as c;
main() {
  c.Fture v = null;
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
import 'dart:async' as c;
main() {
  c.Future v = null;
}
''');
  }

  test_undefinedClass_useSimilar_fromImport() async {
    await resolveTestUnit('''
main() {
  Stirng s = 'abc';
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
main() {
  String s = 'abc';
}
''');
  }

  test_undefinedClass_useSimilar_fromThisLibrary() async {
    await resolveTestUnit('''
class MyClass {}
main() {
  MyCalss v = null;
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class MyClass {}
main() {
  MyClass v = null;
}
''');
  }

  test_undefinedFunction_create_bottomArgument() async {
    await resolveTestUnit('''
main() {
  test(throw 42);
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  test(throw 42);
}

void test(param0) {
}
''');
  }

  test_undefinedFunction_create_duplicateArgumentNames() async {
    await resolveTestUnit('''
class C {
  int x;
}

foo(C c1, C c2) {
  bar(c1.x, c2.x);
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
class C {
  int x;
}

foo(C c1, C c2) {
  bar(c1.x, c2.x);
}

void bar(int x, int x2) {
}
''');
  }

  test_undefinedFunction_create_dynamicArgument() async {
    await resolveTestUnit('''
main() {
  dynamic v;
  test(v);
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  dynamic v;
  test(v);
}

void test(v) {
}
''');
  }

  test_undefinedFunction_create_dynamicReturnType() async {
    await resolveTestUnit('''
main() {
  dynamic v = test();
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  dynamic v = test();
}

test() {
}
''');
  }

  test_undefinedFunction_create_fromFunction() async {
    await resolveTestUnit('''
main() {
  int v = myUndefinedFunction(1, 2.0, '3');
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  int v = myUndefinedFunction(1, 2.0, '3');
}

int myUndefinedFunction(int i, double d, String s) {
}
''');
  }

  test_undefinedFunction_create_fromMethod() async {
    await resolveTestUnit('''
class A {
  main() {
    int v = myUndefinedFunction(1, 2.0, '3');
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
class A {
  main() {
    int v = myUndefinedFunction(1, 2.0, '3');
  }
}

int myUndefinedFunction(int i, double d, String s) {
}
''');
  }

  test_undefinedFunction_create_generic_BAD() async {
    await resolveTestUnit('''
class A<T> {
  Map<int, T> items;
  main() {
    process(items);
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
class A<T> {
  Map<int, T> items;
  main() {
    process(items);
  }
}

void process(Map items) {
}
''');
  }

  test_undefinedFunction_create_generic_OK() async {
    await resolveTestUnit('''
class A {
  List<int> items;
  main() {
    process(items);
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
class A {
  List<int> items;
  main() {
    process(items);
  }
}

void process(List<int> items) {
}
''');
    _assertLinkedGroup(
        change.linkedEditGroups[2],
        ['List<int> items) {'],
        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
            ['List<int>', 'Iterable<int>', 'Object']));
  }

  test_undefinedFunction_create_importType() async {
    addSource('/project/lib.dart', r'''
library lib;
import 'dart:async';
Future getFuture() => null;
''');
    await resolveTestUnit('''
import 'lib.dart';
main() {
  test(getFuture());
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
import 'dart:async';

import 'lib.dart';
main() {
  test(getFuture());
}

void test(Future future) {
}
''');
  }

  test_undefinedFunction_create_nullArgument() async {
    await resolveTestUnit('''
main() {
  test(null);
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  test(null);
}

void test(param0) {
}
''');
  }

  test_undefinedFunction_create_returnType_bool_expressions() async {
    await assert_undefinedFunction_create_returnType_bool("!test();");
    await assert_undefinedFunction_create_returnType_bool("b && test();");
    await assert_undefinedFunction_create_returnType_bool("test() && b;");
    await assert_undefinedFunction_create_returnType_bool("b || test();");
    await assert_undefinedFunction_create_returnType_bool("test() || b;");
  }

  test_undefinedFunction_create_returnType_bool_statements() async {
    await assert_undefinedFunction_create_returnType_bool("assert ( test() );");
    await assert_undefinedFunction_create_returnType_bool("if ( test() ) {}");
    await assert_undefinedFunction_create_returnType_bool(
        "while ( test() ) {}");
    await assert_undefinedFunction_create_returnType_bool(
        "do {} while ( test() );");
  }

  test_undefinedFunction_create_returnType_fromAssignment_eq() async {
    await resolveTestUnit('''
main() {
  int v;
  v = myUndefinedFunction();
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  int v;
  v = myUndefinedFunction();
}

int myUndefinedFunction() {
}
''');
  }

  test_undefinedFunction_create_returnType_fromAssignment_plusEq() async {
    await resolveTestUnit('''
main() {
  int v;
  v += myUndefinedFunction();
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  int v;
  v += myUndefinedFunction();
}

num myUndefinedFunction() {
}
''');
  }

  test_undefinedFunction_create_returnType_fromBinary_right() async {
    await resolveTestUnit('''
main() {
  0 + myUndefinedFunction();
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  0 + myUndefinedFunction();
}

num myUndefinedFunction() {
}
''');
  }

  test_undefinedFunction_create_returnType_fromInitializer() async {
    await resolveTestUnit('''
main() {
  int v = myUndefinedFunction();
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  int v = myUndefinedFunction();
}

int myUndefinedFunction() {
}
''');
  }

  test_undefinedFunction_create_returnType_fromInvocationArgument() async {
    await resolveTestUnit('''
foo(int p) {}
main() {
  foo( myUndefinedFunction() );
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
foo(int p) {}
main() {
  foo( myUndefinedFunction() );
}

int myUndefinedFunction() {
}
''');
  }

  test_undefinedFunction_create_returnType_fromReturn() async {
    await resolveTestUnit('''
int main() {
  return myUndefinedFunction();
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
int main() {
  return myUndefinedFunction();
}

int myUndefinedFunction() {
}
''');
  }

  test_undefinedFunction_create_returnType_void() async {
    await resolveTestUnit('''
main() {
  myUndefinedFunction();
}
''');
    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
main() {
  myUndefinedFunction();
}

void myUndefinedFunction() {
}
''');
  }

  test_undefinedFunction_useSimilar_fromImport() async {
    await resolveTestUnit('''
main() {
  pritn(0);
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
main() {
  print(0);
}
''');
  }

  test_undefinedFunction_useSimilar_prefixed_fromImport() async {
    await resolveTestUnit('''
import 'dart:core' as c;
main() {
  c.prnt(42);
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
import 'dart:core' as c;
main() {
  c.print(42);
}
''');
  }

  test_undefinedFunction_useSimilar_prefixed_ignoreLocal() async {
    await resolveTestUnit('''
import 'dart:async' as c;
main() {
  c.main();
}
''');
    await assertNoFix(DartFixKind.CHANGE_TO);
  }

  test_undefinedFunction_useSimilar_thisLibrary() async {
    await resolveTestUnit('''
myFunction() {}
main() {
  myFuntcion();
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
myFunction() {}
main() {
  myFunction();
}
''');
  }

  test_undefinedGetter_useSimilar_hint() async {
    await resolveTestUnit('''
class A {
  int myField;
}
main(A a) {
  var x = a;
  print(x.myFild);
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  int myField;
}
main(A a) {
  var x = a;
  print(x.myField);
}
''');
  }

  test_undefinedGetter_useSimilar_qualified() async {
    await resolveTestUnit('''
class A {
  int myField;
}
main(A a) {
  print(a.myFild);
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  int myField;
}
main(A a) {
  print(a.myField);
}
''');
  }

  test_undefinedGetter_useSimilar_qualified_static() async {
    await resolveTestUnit('''
class A {
  static int MY_NAME = 1;
}
main() {
  A.MY_NAM;
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  static int MY_NAME = 1;
}
main() {
  A.MY_NAME;
}
''');
  }

  test_undefinedGetter_useSimilar_unqualified() async {
    await resolveTestUnit('''
class A {
  int myField;
  main() {
    print(myFild);
  }
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  int myField;
  main() {
    print(myField);
  }
}
''');
  }

  test_undefinedMethod_create_BAD_inSDK() async {
    await resolveTestUnit('''
main() {
  List.foo();
}
''');
    await assertNoFix(DartFixKind.CREATE_METHOD);
  }

  test_undefinedMethod_create_BAD_targetIsEnum() async {
    await resolveTestUnit('''
enum MyEnum {A, B}
main() {
  MyEnum.foo();
}
''');
    await assertNoFix(DartFixKind.CREATE_METHOD);
  }

  test_undefinedMethod_create_generic_BAD_argumentType() async {
    await resolveTestUnit('''
class A<T> {
  B b;
  Map<int, T> items;
  main() {
    b.process(items);
  }
}

class B {
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A<T> {
  B b;
  Map<int, T> items;
  main() {
    b.process(items);
  }
}

class B {
  void process(Map items) {}
}
''');
  }

  test_undefinedMethod_create_generic_BAD_returnType() async {
    await resolveTestUnit('''
class A<T> {
  main() {
    T t = new B().compute();
  }
}

class B {
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A<T> {
  main() {
    T t = new B().compute();
  }
}

class B {
  compute() {}
}
''');
  }

  test_undefinedMethod_create_generic_OK_literal() async {
    await resolveTestUnit('''
class A {
  B b;
  List<int> items;
  main() {
    b.process(items);
  }
}

class B {}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  B b;
  List<int> items;
  main() {
    b.process(items);
  }
}

class B {
  void process(List<int> items) {}
}
''');
  }

  test_undefinedMethod_create_generic_OK_local() async {
    await resolveTestUnit('''
class A<T> {
  List<T> items;
  main() {
    process(items);
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A<T> {
  List<T> items;
  main() {
    process(items);
  }

  void process(List<T> items) {}
}
''');
  }

  test_undefinedMethod_createQualified_emptyClassBody() async {
    await resolveTestUnit('''
class A {}
main() {
  A.myUndefinedMethod();
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  static void myUndefinedMethod() {}
}
main() {
  A.myUndefinedMethod();
}
''');
  }

  test_undefinedMethod_createQualified_fromClass() async {
    await resolveTestUnit('''
class A {
}
main() {
  A.myUndefinedMethod();
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  static void myUndefinedMethod() {}
}
main() {
  A.myUndefinedMethod();
}
''');
  }

  test_undefinedMethod_createQualified_fromClass_hasOtherMember() async {
    await resolveTestUnit('''
class A {
  foo() {}
}
main() {
  A.myUndefinedMethod();
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  foo() {}

  static void myUndefinedMethod() {}
}
main() {
  A.myUndefinedMethod();
}
''');
  }

  test_undefinedMethod_createQualified_fromInstance() async {
    await resolveTestUnit('''
class A {
}
main(A a) {
  a.myUndefinedMethod();
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  void myUndefinedMethod() {}
}
main(A a) {
  a.myUndefinedMethod();
}
''');
  }

  test_undefinedMethod_createQualified_targetIsFunctionType() async {
    await resolveTestUnit('''
typedef A();
main() {
  A.myUndefinedMethod();
}
''');
    await assertNoFix(DartFixKind.CREATE_METHOD);
  }

  test_undefinedMethod_createQualified_targetIsUnresolved() async {
    await resolveTestUnit('''
main() {
  NoSuchClass.myUndefinedMethod();
}
''');
    await assertNoFix(DartFixKind.CREATE_METHOD);
  }

  test_undefinedMethod_createUnqualified_duplicateArgumentNames() async {
    await resolveTestUnit('''
class C {
  int x;
}

class D {
  foo(C c1, C c2) {
    bar(c1.x, c2.x);
  }
}''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class C {
  int x;
}

class D {
  foo(C c1, C c2) {
    bar(c1.x, c2.x);
  }

  void bar(int x, int x2) {}
}''');
  }

  test_undefinedMethod_createUnqualified_parameters() async {
    await resolveTestUnit('''
class A {
  main() {
    myUndefinedMethod(0, 1.0, '3');
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  main() {
    myUndefinedMethod(0, 1.0, '3');
  }

  void myUndefinedMethod(int i, double d, String s) {}
}
''');
    // linked positions
    int index = 0;
    _assertLinkedGroup(
        change.linkedEditGroups[index++], ['void myUndefinedMethod(']);
    _assertLinkedGroup(change.linkedEditGroups[index++],
        ['myUndefinedMethod(0', 'myUndefinedMethod(int']);
    _assertLinkedGroup(
        change.linkedEditGroups[index++],
        ['int i'],
        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
            ['int', 'num', 'Object', 'Comparable<num>']));
    _assertLinkedGroup(change.linkedEditGroups[index++], ['i,']);
    _assertLinkedGroup(
        change.linkedEditGroups[index++],
        ['double d'],
        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
            ['double', 'num', 'Object', 'Comparable<num>']));
    _assertLinkedGroup(change.linkedEditGroups[index++], ['d,']);
    _assertLinkedGroup(
        change.linkedEditGroups[index++],
        ['String s'],
        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
            ['String', 'Object', 'Comparable<String>']));
    _assertLinkedGroup(change.linkedEditGroups[index++], ['s)']);
  }

  test_undefinedMethod_createUnqualified_parameters_named() async {
    await resolveTestUnit('''
class A {
  main() {
    myUndefinedMethod(0, bbb: 1.0, ccc: '2');
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  main() {
    myUndefinedMethod(0, bbb: 1.0, ccc: '2');
  }

  void myUndefinedMethod(int i, {double bbb, String ccc}) {}
}
''');
    // linked positions
    int index = 0;
    _assertLinkedGroup(
        change.linkedEditGroups[index++], ['void myUndefinedMethod(']);
    _assertLinkedGroup(change.linkedEditGroups[index++],
        ['myUndefinedMethod(0', 'myUndefinedMethod(int']);
    _assertLinkedGroup(
        change.linkedEditGroups[index++],
        ['int i'],
        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
            ['int', 'num', 'Object', 'Comparable<num>']));
    _assertLinkedGroup(change.linkedEditGroups[index++], ['i,']);
    _assertLinkedGroup(
        change.linkedEditGroups[index++],
        ['double bbb'],
        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
            ['double', 'num', 'Object', 'Comparable<num>']));
    _assertLinkedGroup(
        change.linkedEditGroups[index++],
        ['String ccc'],
        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
            ['String', 'Object', 'Comparable<String>']));
  }

  test_undefinedMethod_createUnqualified_returnType() async {
    await resolveTestUnit('''
class A {
  main() {
    int v = myUndefinedMethod();
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  main() {
    int v = myUndefinedMethod();
  }

  int myUndefinedMethod() {}
}
''');
    // linked positions
    _assertLinkedGroup(change.linkedEditGroups[0], ['int myUndefinedMethod(']);
    _assertLinkedGroup(change.linkedEditGroups[1],
        ['myUndefinedMethod();', 'myUndefinedMethod() {']);
  }

  test_undefinedMethod_createUnqualified_staticFromField() async {
    await resolveTestUnit('''
class A {
  static var f = myUndefinedMethod();
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  static var f = myUndefinedMethod();

  static myUndefinedMethod() {}
}
''');
  }

  test_undefinedMethod_createUnqualified_staticFromMethod() async {
    await resolveTestUnit('''
class A {
  static main() {
    myUndefinedMethod();
  }
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  static main() {
    myUndefinedMethod();
  }

  static void myUndefinedMethod() {}
}
''');
  }

  test_undefinedMethod_hint_createQualified_fromInstance() async {
    await resolveTestUnit('''
class A {
}
main() {
  var a = new A();
  a.myUndefinedMethod();
}
''');
    await assertHasFix(DartFixKind.CREATE_METHOD, '''
class A {
  void myUndefinedMethod() {}
}
main() {
  var a = new A();
  a.myUndefinedMethod();
}
''');
  }

  test_undefinedMethod_parameterType_differentPrefixInTargetUnit() async {
    String code2 = r'''
library test2;
import 'test3.dart' as bbb;
export 'test3.dart';
class D {
}
''';
    addSource('/project/test2.dart', code2);
    addSource('/project/test3.dart', r'''
library test3;
class E {}
''');
    await resolveTestUnit('''
library test;
import 'test2.dart' as aaa;
main(aaa.D d, aaa.E e) {
  d.foo(e);
}
''');
    AnalysisError error = await _findErrorToFix();
    fix = await _assertHasFix(DartFixKind.CREATE_METHOD, error);
    change = fix.change;
    // apply to "test2.dart"
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = change.edits[0];
    expect(fileEdit.file, convertPath('/project/test2.dart'));
    expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
library test2;
import 'test3.dart' as bbb;
export 'test3.dart';
class D {
  void foo(bbb.E e) {}
}
''');
  }

  test_undefinedMethod_parameterType_inTargetUnit() async {
    String code2 = r'''
library test2;
class D {
}
class E {}
''';
    addSource('/project/test2.dart', code2);
    await resolveTestUnit('''
library test;
import 'test2.dart' as test2;
main(test2.D d, test2.E e) {
  d.foo(e);
}
''');
    AnalysisError error = await _findErrorToFix();
    fix = await _assertHasFix(DartFixKind.CREATE_METHOD, error);
    change = fix.change;
    // apply to "test2.dart"
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = change.edits[0];
    expect(fileEdit.file, convertPath('/project/test2.dart'));
    expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
library test2;
class D {
  void foo(E e) {}
}
class E {}
''');
  }

  test_undefinedMethod_useSimilar_ignoreOperators() async {
    await resolveTestUnit('''
main(Object object) {
  object.then();
}
''');
    await assertNoFix(DartFixKind.CHANGE_TO);
  }

  test_undefinedMethod_useSimilar_qualified() async {
    await resolveTestUnit('''
class A {
  myMethod() {}
}
main() {
  A a = new A();
  a.myMehtod();
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  myMethod() {}
}
main() {
  A a = new A();
  a.myMethod();
}
''');
  }

  test_undefinedMethod_useSimilar_unqualified_superClass() async {
    await resolveTestUnit('''
class A {
  myMethod() {}
}
class B extends A {
  main() {
    myMehtod();
  }
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  myMethod() {}
}
class B extends A {
  main() {
    myMethod();
  }
}
''');
  }

  test_undefinedMethod_useSimilar_unqualified_thisClass() async {
    await resolveTestUnit('''
class A {
  myMethod() {}
  main() {
    myMehtod();
  }
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  myMethod() {}
  main() {
    myMethod();
  }
}
''');
  }

  test_undefinedParameter_convertFlutterChild_BAD_listNotWidget() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';
build() {
  return new Container(
    child: new Row(
      child: <Widget>[
        new Container(),
        null,
      ],
    ),
  );
}
''');
    await assertNoFix(DartFixKind.CONVERT_FLUTTER_CHILD);
  }

  test_undefinedParameter_convertFlutterChild_OK_hasList() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';
build() {
  return new Container(
    child: new Row(
      child: [
        new Text('111'),
        new Text('222'),
      ],
    ),
  );
}
''');
    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
import 'package:flutter/widgets.dart';
build() {
  return new Container(
    child: new Row(
      children: <Widget>[
        new Text('111'),
        new Text('222'),
      ],
    ),
  );
}
''');
  }

  test_undefinedParameter_convertFlutterChild_OK_hasTypedList() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';
build() {
  return new Container(
    child: new Row(
      child: <Widget>[
        new Text('111'),
        new Text('222'),
      ],
    ),
  );
}
''');
    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
import 'package:flutter/widgets.dart';
build() {
  return new Container(
    child: new Row(
      children: <Widget>[
        new Text('111'),
        new Text('222'),
      ],
    ),
  );
}
''');
  }

  test_undefinedParameter_convertFlutterChild_OK_multiLine() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/material.dart';
build() {
  return new Scaffold(
    body: new Row(
      child: new Container(
        width: 200.0,
        height: 300.0,
      ),
    ),
  );
}
''');
    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
import 'package:flutter/material.dart';
build() {
  return new Scaffold(
    body: new Row(
      children: <Widget>[
        new Container(
          width: 200.0,
          height: 300.0,
        ),
      ],
    ),
  );
}
''');
  }

  test_undefinedParameter_convertFlutterChild_OK_widgetVariable() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/material.dart';
build() {
  var text = new Text('foo');
  new Row(
    child: text,
  );
}
''');
    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
import 'package:flutter/material.dart';
build() {
  var text = new Text('foo');
  new Row(
    children: <Widget>[text],
  );
}
''');
  }

  test_undefinedParameter_convertFlutterChildren_BAD_notWidget() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';
build() {
  return new Center(
    children: [
      new Object(),
    ],
  );
}
''');
    await assertNoFix(DartFixKind.CONVERT_FLUTTER_CHILDREN);
  }

  test_undefinedParameter_convertFlutterChildren_OK_multiLine() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';
build() {
  return new Center(
    children: [
      new Container(
        width: 200.0,
        height: 300.0,
      ),
    ],
  );
}
''');
    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILDREN, '''
import 'package:flutter/widgets.dart';
build() {
  return new Center(
    child: new Container(
      width: 200.0,
      height: 300.0,
    ),
  );
}
''');
  }

  test_undefinedParameter_convertFlutterChildren_OK_singleLine() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';
build() {
  return new Center(
    children: [
      new Text('foo'),
    ],
  );
}
''');
    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILDREN, '''
import 'package:flutter/widgets.dart';
build() {
  return new Center(
    child: new Text('foo'),
  );
}
''');
  }

  test_undefinedParameter_convertFlutterChildren_OK_singleLine2() async {
    addFlutterPackage();
    await resolveTestUnit('''
import 'package:flutter/widgets.dart';
build() {
  var text = new Text('foo');
  new Center(
    children: [text],
  );
}
''');
    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILDREN, '''
import 'package:flutter/widgets.dart';
build() {
  var text = new Text('foo');
  new Center(
    child: text,
  );
}
''');
  }

  test_undefinedSetter_useSimilar_hint() async {
    await resolveTestUnit('''
class A {
  int myField;
}
main(A a) {
  var x = a;
  x.myFild = 42;
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  int myField;
}
main(A a) {
  var x = a;
  x.myField = 42;
}
''');
  }

  test_undefinedSetter_useSimilar_qualified() async {
    await resolveTestUnit('''
class A {
  int myField;
}
main(A a) {
  a.myFild = 42;
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  int myField;
}
main(A a) {
  a.myField = 42;
}
''');
  }

  test_undefinedSetter_useSimilar_unqualified() async {
    await resolveTestUnit('''
class A {
  int myField;
  main() {
    myFild = 42;
  }
}
''');
    await assertHasFix(DartFixKind.CHANGE_TO, '''
class A {
  int myField;
  main() {
    myField = 42;
  }
}
''');
  }

  test_useEffectiveIntegerDivision() async {
    await resolveTestUnit('''
main() {
  var a = 5;
  var b = 2;
  print((a / b).toInt());
}
''');
    await assertHasFix(DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION, '''
main() {
  var a = 5;
  var b = 2;
  print(a ~/ b);
}
''');
  }

  test_useImportPrefix_withClass() async {
    await resolveTestUnit('''
import 'dart:async' as pref;
main() {
  pref.Stream s = null;
  Future f = null;
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PREFIX, '''
import 'dart:async' as pref;
main() {
  pref.Stream s = null;
  pref.Future f = null;
}
''');
  }

  test_useImportPrefix_withTopLevelVariable() async {
    await resolveTestUnit('''
import 'dart:math' as pref;
main() {
  print(pref.E);
  print(PI);
}
''');
    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PREFIX, '''
import 'dart:math' as pref;
main() {
  print(pref.E);
  print(pref.PI);
}
''');
  }

  void _addMetaPackageSource() {
    addPackageSource('meta', 'meta.dart', r'''
library meta;

const Required required = const Required();

class Required {
  final String reason;
  const Required([this.reason]);
}
''');
  }
}

@reflectiveTest
class FixProcessorTest_UseCFE extends FixProcessorTest {
  @override
  bool get useCFE => true;

  @failingTest
  @override
  test_addAsync_blockFunctionBody() => super.test_addAsync_blockFunctionBody();

  @failingTest
  @override
  test_addAsync_closure() => super.test_addAsync_closure();

  @failingTest
  @override
  test_addAsync_expressionFunctionBody() =>
      super.test_addAsync_expressionFunctionBody();

  @failingTest
  @override
  test_addAsync_returnFuture() => super.test_addAsync_returnFuture();

  @failingTest
  @override
  test_addAsync_returnFuture_alreadyFuture() =>
      super.test_addAsync_returnFuture_alreadyFuture();

  @failingTest
  @override
  test_addAsync_returnFuture_dynamic() =>
      super.test_addAsync_returnFuture_dynamic();

  @failingTest
  @override
  test_addAsync_returnFuture_noType() =>
      super.test_addAsync_returnFuture_noType();

  @failingTest
  @override
  test_addExplicitCast_assignment_general() =>
      super.test_addExplicitCast_assignment_general();

  @failingTest
  @override
  test_addExplicitCast_assignment_general_all() =>
      super.test_addExplicitCast_assignment_general_all();

  @failingTest
  @override
  test_addExplicitCast_assignment_map() =>
      super.test_addExplicitCast_assignment_map();

  @failingTest
  @override
  test_addExplicitCast_assignment_map_all() =>
      super.test_addExplicitCast_assignment_map_all();

  @failingTest
  @override
  test_addExplicitCast_assignment_needsParens() =>
      super.test_addExplicitCast_assignment_needsParens();

  @failingTest
  @override
  test_addExplicitCast_assignment_needsParens_all() =>
      super.test_addExplicitCast_assignment_needsParens_all();

  @failingTest
  @override
  test_addExplicitCast_assignment_set() =>
      super.test_addExplicitCast_assignment_set();

  @failingTest
  @override
  test_addExplicitCast_assignment_set_all() =>
      super.test_addExplicitCast_assignment_set_all();

  @failingTest
  @override
  test_addExplicitCast_declaration_general() =>
      super.test_addExplicitCast_declaration_general();

  @failingTest
  @override
  test_addExplicitCast_declaration_general_all() =>
      super.test_addExplicitCast_declaration_general_all();

  @failingTest
  @override
  test_addExplicitCast_declaration_map() =>
      super.test_addExplicitCast_declaration_map();

  @failingTest
  @override
  test_addExplicitCast_declaration_map_all() =>
      super.test_addExplicitCast_declaration_map_all();

  @failingTest
  @override
  test_addExplicitCast_declaration_needsParens() =>
      super.test_addExplicitCast_declaration_needsParens();

  @failingTest
  @override
  test_addExplicitCast_declaration_needsParens_all() =>
      super.test_addExplicitCast_declaration_needsParens_all();

  @failingTest
  @override
  test_addExplicitCast_declaration_set() =>
      super.test_addExplicitCast_declaration_set();

  @failingTest
  @override
  test_addExplicitCast_declaration_set_all() =>
      super.test_addExplicitCast_declaration_set_all();

  @failingTest
  @override
  test_addFieldFormalParameters_flutter() =>
      super.test_addFieldFormalParameters_flutter();

  @failingTest
  @override
  test_addFieldFormalParameters_hasRequiredParameter() =>
      super.test_addFieldFormalParameters_hasRequiredParameter();

  @failingTest
  @override
  test_addFieldFormalParameters_noParameters() =>
      super.test_addFieldFormalParameters_noParameters();

  @failingTest
  @override
  test_addFieldFormalParameters_noRequiredParameter() =>
      super.test_addFieldFormalParameters_noRequiredParameter();

  @failingTest
  @override
  test_addFieldFormalParameters_notAllFinal() =>
      super.test_addFieldFormalParameters_notAllFinal();

  @failingTest
  @override
  test_addMissingParameter_function_positional_hasZero() =>
      super.test_addMissingParameter_function_positional_hasZero();

  @failingTest
  @override
  test_addMissingParameter_function_required_hasNamed() =>
      super.test_addMissingParameter_function_required_hasNamed();

  @failingTest
  @override
  test_addMissingParameter_function_required_hasOne() =>
      super.test_addMissingParameter_function_required_hasOne();

  @failingTest
  @override
  test_addMissingParameter_function_required_hasZero() =>
      super.test_addMissingParameter_function_required_hasZero();

  @failingTest
  @override
  test_addMissingParameter_method_positional_hasOne() =>
      super.test_addMissingParameter_method_positional_hasOne();

  @failingTest
  @override
  test_addMissingParameter_method_required_hasOne() =>
      super.test_addMissingParameter_method_required_hasOne();

  @failingTest
  @override
  test_addMissingParameter_method_required_hasZero() =>
      super.test_addMissingParameter_method_required_hasZero();

  @failingTest
  @override
  test_addMissingParameterNamed_constructor_hasNamed() =>
      super.test_addMissingParameterNamed_constructor_hasNamed();

  @failingTest
  @override
  test_addMissingParameterNamed_constructor_hasRequired() =>
      super.test_addMissingParameterNamed_constructor_hasRequired();

  @failingTest
  @override
  test_addMissingParameterNamed_constructor_noParameters() =>
      super.test_addMissingParameterNamed_constructor_noParameters();

  @failingTest
  @override
  test_addMissingParameterNamed_constructor_noParameters_named() =>
      super.test_addMissingParameterNamed_constructor_noParameters_named();

  @failingTest
  @override
  test_addMissingParameterNamed_function_hasNamed() =>
      super.test_addMissingParameterNamed_function_hasNamed();

  @failingTest
  @override
  test_addMissingParameterNamed_function_hasRequired() =>
      super.test_addMissingParameterNamed_function_hasRequired();

  @failingTest
  @override
  test_addMissingParameterNamed_function_noParameters() =>
      super.test_addMissingParameterNamed_function_noParameters();

  @failingTest
  @override
  test_addMissingParameterNamed_method_hasNamed() =>
      super.test_addMissingParameterNamed_method_hasNamed();

  @failingTest
  @override
  test_addMissingParameterNamed_method_hasRequired() =>
      super.test_addMissingParameterNamed_method_hasRequired();

  @failingTest
  @override
  test_addMissingParameterNamed_method_noParameters() =>
      super.test_addMissingParameterNamed_method_noParameters();

  @failingTest
  @override
  test_addMissingRequiredArg_multiple() =>
      super.test_addMissingRequiredArg_multiple();

  @failingTest
  @override
  test_addMissingRequiredArg_multiple_2() =>
      super.test_addMissingRequiredArg_multiple_2();

  @failingTest
  @override
  test_addMissingRequiredArg_single() =>
      super.test_addMissingRequiredArg_single();

  @failingTest
  @override
  test_addMissingRequiredArg_single_normal() =>
      super.test_addMissingRequiredArg_single_normal();

  @failingTest
  @override
  test_addMissingRequiredArg_single_with_details() =>
      super.test_addMissingRequiredArg_single_with_details();

  @failingTest
  @override
  test_addStatic_multipleFields() => super.test_addStatic_multipleFields();

  @failingTest
  @override
  test_addStatic_oneField() => super.test_addStatic_oneField();

  @failingTest
  @override
  test_boolean() => super.test_boolean();

  @failingTest
  @override
  test_boolean_all() => super.test_boolean_all();

  @failingTest
  @override
  test_changeToStaticAccess_method() =>
      super.test_changeToStaticAccess_method();

  @failingTest
  @override
  test_changeToStaticAccess_method_importType() =>
      super.test_changeToStaticAccess_method_importType();

  @failingTest
  @override
  test_changeToStaticAccess_method_prefixLibrary() =>
      super.test_changeToStaticAccess_method_prefixLibrary();

  @failingTest
  @override
  test_changeToStaticAccess_property() =>
      super.test_changeToStaticAccess_property();

  @failingTest
  @override
  test_changeToStaticAccess_property_importType() =>
      super.test_changeToStaticAccess_property_importType();

  @failingTest
  @override
  test_convertToNamedArguments_OK_instanceCreation() =>
      super.test_convertToNamedArguments_OK_instanceCreation();

  @failingTest
  @override
  test_convertToNamedArguments_OK_instanceCreation_hasPositional() =>
      super.test_convertToNamedArguments_OK_instanceCreation_hasPositional();

  @failingTest
  @override
  test_convertToNamedArguments_OK_methodInvocation() =>
      super.test_convertToNamedArguments_OK_methodInvocation();

  @failingTest
  @override
  test_createClass() => super.test_createClass();

  @failingTest
  @override
  test_createClass_inLibraryOfPrefix() =>
      super.test_createClass_inLibraryOfPrefix();

  @failingTest
  @override
  test_createClass_innerLocalFunction() =>
      super.test_createClass_innerLocalFunction();

  @failingTest
  @override
  test_createClass_instanceCreation_withoutNew_fromFunction() =>
      super.test_createClass_instanceCreation_withoutNew_fromFunction();

  @failingTest
  @override
  test_createClass_instanceCreation_withoutNew_fromMethod() =>
      super.test_createClass_instanceCreation_withoutNew_fromMethod();

  @failingTest
  @override
  test_createClass_itemOfList() => super.test_createClass_itemOfList();

  @failingTest
  @override
  test_createClass_itemOfList_inAnnotation() =>
      super.test_createClass_itemOfList_inAnnotation();

  @failingTest
  @override
  test_createConstructor_forFinalFields() =>
      super.test_createConstructor_forFinalFields();

  @failingTest
  @override
  test_createConstructor_forFinalFields_flutter() =>
      super.test_createConstructor_forFinalFields_flutter();

  @failingTest
  @override
  test_createConstructor_forFinalFields_flutter_childLast() =>
      super.test_createConstructor_forFinalFields_flutter_childLast();

  @failingTest
  @override
  test_createConstructor_forFinalFields_flutter_childrenLast() =>
      super.test_createConstructor_forFinalFields_flutter_childrenLast();

  @failingTest
  @override
  test_createConstructor_insteadOfSyntheticDefault() =>
      super.test_createConstructor_insteadOfSyntheticDefault();

  @failingTest
  @override
  test_createConstructor_named() => super.test_createConstructor_named();

  @failingTest
  @override
  test_createConstructor_named_emptyClassBody() =>
      super.test_createConstructor_named_emptyClassBody();

  @failingTest
  @override
  test_createConstructorSuperExplicit() =>
      super.test_createConstructorSuperExplicit();

  @failingTest
  @override
  test_createConstructorSuperExplicit_hasInitializers() =>
      super.test_createConstructorSuperExplicit_hasInitializers();

  @failingTest
  @override
  test_createConstructorSuperExplicit_named() =>
      super.test_createConstructorSuperExplicit_named();

  @failingTest
  @override
  test_createConstructorSuperExplicit_named_private() =>
      super.test_createConstructorSuperExplicit_named_private();

  @failingTest
  @override
  test_createConstructorSuperExplicit_typeArgument() =>
      super.test_createConstructorSuperExplicit_typeArgument();

  @failingTest
  @override
  test_createConstructorSuperImplicit() =>
      super.test_createConstructorSuperImplicit();

  @failingTest
  @override
  test_createConstructorSuperImplicit_fieldInitializer() =>
      super.test_createConstructorSuperImplicit_fieldInitializer();

  @failingTest
  @override
  test_createConstructorSuperImplicit_importType() =>
      super.test_createConstructorSuperImplicit_importType();

  @failingTest
  @override
  test_createConstructorSuperImplicit_named() =>
      super.test_createConstructorSuperImplicit_named();

  @failingTest
  @override
  test_createConstructorSuperImplicit_private() =>
      super.test_createConstructorSuperImplicit_private();

  @failingTest
  @override
  test_createConstructorSuperImplicit_typeArgument() =>
      super.test_createConstructorSuperImplicit_typeArgument();

  @failingTest
  @override
  test_createField_getter_unqualified_instance_asInvocationArgument() =>
      super.test_createField_getter_unqualified_instance_asInvocationArgument();

  @failingTest
  @override
  test_createField_getter_unqualified_instance_assignmentRhs() =>
      super.test_createField_getter_unqualified_instance_assignmentRhs();

  @failingTest
  @override
  test_createField_getter_unqualified_instance_asStatement() =>
      super.test_createField_getter_unqualified_instance_asStatement();

  @failingTest
  @override
  test_createField_invalidInitializer_withoutType() =>
      super.test_createField_invalidInitializer_withoutType();

  @failingTest
  @override
  test_createField_invalidInitializer_withType() =>
      super.test_createField_invalidInitializer_withType();

  @failingTest
  @override
  test_createField_setter_generic_OK_local() =>
      super.test_createField_setter_generic_OK_local();

  @failingTest
  @override
  test_createField_setter_unqualified_instance() =>
      super.test_createField_setter_unqualified_instance();

  @failingTest
  @override
  test_createFile_forImport() => super.test_createFile_forImport();

  @failingTest
  @override
  test_createFile_forImport_BAD_inPackage_lib_justLib() =>
      super.test_createFile_forImport_BAD_inPackage_lib_justLib();

  @failingTest
  @override
  test_createFile_forImport_BAD_notDart() =>
      super.test_createFile_forImport_BAD_notDart();

  @failingTest
  @override
  test_createFile_forImport_inPackage_lib() =>
      super.test_createFile_forImport_inPackage_lib();

  @failingTest
  @override
  test_createFile_forImport_inPackage_test() =>
      super.test_createFile_forImport_inPackage_test();

  @failingTest
  @override
  test_createFile_forPart() => super.test_createFile_forPart();

  @failingTest
  @override
  test_createFile_forPart_inPackageLib() =>
      super.test_createFile_forPart_inPackageLib();

  @failingTest
  @override
  test_createGetter_unqualified_instance_asInvocationArgument() =>
      super.test_createGetter_unqualified_instance_asInvocationArgument();

  @failingTest
  @override
  test_createGetter_unqualified_instance_assignmentLhs() =>
      super.test_createGetter_unqualified_instance_assignmentLhs();

  @failingTest
  @override
  test_createGetter_unqualified_instance_assignmentRhs() =>
      super.test_createGetter_unqualified_instance_assignmentRhs();

  @failingTest
  @override
  test_createGetter_unqualified_instance_asStatement() =>
      super.test_createGetter_unqualified_instance_asStatement();

  @failingTest
  @override
  test_createLocalVariable_functionType_named() =>
      super.test_createLocalVariable_functionType_named();

  @failingTest
  @override
  test_createLocalVariable_functionType_named_generic() =>
      super.test_createLocalVariable_functionType_named_generic();

  @override
  test_createLocalVariable_functionType_synthetic() =>
      super.test_createLocalVariable_functionType_synthetic();

  @failingTest
  @override
  test_createLocalVariable_read_typeAssignment() =>
      super.test_createLocalVariable_read_typeAssignment();

  @failingTest
  @override
  test_createLocalVariable_read_typeCondition() =>
      super.test_createLocalVariable_read_typeCondition();

  @failingTest
  @override
  test_createLocalVariable_read_typeInvocationArgument() =>
      super.test_createLocalVariable_read_typeInvocationArgument();

  @failingTest
  @override
  test_createLocalVariable_read_typeInvocationTarget() =>
      super.test_createLocalVariable_read_typeInvocationTarget();

  @failingTest
  @override
  test_createLocalVariable_withImport() =>
      super.test_createLocalVariable_withImport();

  @failingTest
  @override
  test_createLocalVariable_write_assignment() =>
      super.test_createLocalVariable_write_assignment();

  @failingTest
  @override
  test_createLocalVariable_write_assignment_compound() =>
      super.test_createLocalVariable_write_assignment_compound();

  @failingTest
  @override
  test_createMissingOverrides_field_untyped() =>
      super.test_createMissingOverrides_field_untyped();

  @failingTest
  @override
  test_createMissingOverrides_functionTypeAlias() =>
      super.test_createMissingOverrides_functionTypeAlias();

  @failingTest
  @override
  test_createMissingOverrides_functionTypedParameter() =>
      super.test_createMissingOverrides_functionTypedParameter();

  @failingTest
  @override
  test_createMissingOverrides_generics_typeArguments() =>
      super.test_createMissingOverrides_generics_typeArguments();

  @failingTest
  @override
  test_createMissingOverrides_generics_typeParameters() =>
      super.test_createMissingOverrides_generics_typeParameters();

  @failingTest
  @override
  test_createMissingOverrides_getter() =>
      super.test_createMissingOverrides_getter();

  @failingTest
  @override
  test_createMissingOverrides_importPrefix() =>
      super.test_createMissingOverrides_importPrefix();

  @failingTest
  @override
  test_createMissingOverrides_mergeToField_getterSetter() =>
      super.test_createMissingOverrides_mergeToField_getterSetter();

  @failingTest
  @override
  test_createMissingOverrides_method() =>
      super.test_createMissingOverrides_method();

  @failingTest
  @override
  test_createMissingOverrides_method_emptyClassBody() =>
      super.test_createMissingOverrides_method_emptyClassBody();

  @failingTest
  @override
  test_createMissingOverrides_method_generic() =>
      super.test_createMissingOverrides_method_generic();

  @failingTest
  @override
  test_createMissingOverrides_method_generic_withBounds() =>
      super.test_createMissingOverrides_method_generic_withBounds();

  @failingTest
  @override
  test_createMissingOverrides_method_notEmptyClassBody() =>
      super.test_createMissingOverrides_method_notEmptyClassBody();

  @failingTest
  @override
  test_createMissingOverrides_operator() =>
      super.test_createMissingOverrides_operator();

  @failingTest
  @override
  test_createMissingOverrides_setter() =>
      super.test_createMissingOverrides_setter();

  @failingTest
  @override
  test_createNoSuchMethod_OK() => super.test_createNoSuchMethod_OK();

  @failingTest
  @override
  test_creationFunction_forFunctionType_cascadeSecond() =>
      super.test_creationFunction_forFunctionType_cascadeSecond();

  @failingTest
  @override
  test_creationFunction_forFunctionType_dynamicArgument() =>
      super.test_creationFunction_forFunctionType_dynamicArgument();

  @failingTest
  @override
  test_creationFunction_forFunctionType_function() =>
      super.test_creationFunction_forFunctionType_function();

  @failingTest
  @override
  test_creationFunction_forFunctionType_function_namedArgument() =>
      super.test_creationFunction_forFunctionType_function_namedArgument();

  @failingTest
  @override
  test_creationFunction_forFunctionType_importType() =>
      super.test_creationFunction_forFunctionType_importType();

  @failingTest
  @override
  test_creationFunction_forFunctionType_method_enclosingClass_static() => super
      .test_creationFunction_forFunctionType_method_enclosingClass_static();

  @failingTest
  @override
  test_creationFunction_forFunctionType_method_enclosingClass_static2() => super
      .test_creationFunction_forFunctionType_method_enclosingClass_static2();

  @failingTest
  @override
  test_creationFunction_forFunctionType_method_targetClass() =>
      super.test_creationFunction_forFunctionType_method_targetClass();

  @failingTest
  @override
  test_creationFunction_forFunctionType_method_targetClass_hasOtherMember() => super
      .test_creationFunction_forFunctionType_method_targetClass_hasOtherMember();

  @failingTest
  @override
  test_expectedToken_semicolon() => super.test_expectedToken_semicolon();

  @failingTest
  @override
  test_illegalAsyncReturnType_adjacentNodes() =>
      super.test_illegalAsyncReturnType_adjacentNodes();

  @failingTest
  @override
  test_illegalAsyncReturnType_asyncLibrary_import() =>
      super.test_illegalAsyncReturnType_asyncLibrary_import();

  @failingTest
  @override
  test_illegalAsyncReturnType_asyncLibrary_usePrefix() =>
      super.test_illegalAsyncReturnType_asyncLibrary_usePrefix();

  @failingTest
  @override
  test_illegalAsyncReturnType_complexTypeName() =>
      super.test_illegalAsyncReturnType_complexTypeName();

  @failingTest
  @override
  test_importLibraryPackage_preferDirectOverExport() =>
      super.test_importLibraryPackage_preferDirectOverExport();

  @failingTest
  @override
  test_importLibraryPackage_preferDirectOverExport_src() =>
      super.test_importLibraryPackage_preferDirectOverExport_src();

  @failingTest
  @override
  test_importLibraryProject_BAD_inLibSrc_differentContextRoot() =>
      super.test_importLibraryProject_BAD_inLibSrc_differentContextRoot();

  @failingTest
  @override
  test_importLibraryProject_OK_inLibSrc_thisContextRoot() =>
      super.test_importLibraryProject_OK_inLibSrc_thisContextRoot();

  @failingTest
  @override
  test_importLibraryProject_withClass_annotation() =>
      super.test_importLibraryProject_withClass_annotation();

  @failingTest
  @override
  test_importLibraryProject_withClass_inParentFolder() =>
      super.test_importLibraryProject_withClass_inParentFolder();

  @failingTest
  @override
  test_importLibraryProject_withClass_inRelativeFolder() =>
      super.test_importLibraryProject_withClass_inRelativeFolder();

  @failingTest
  @override
  test_importLibraryProject_withClass_inSameFolder() =>
      super.test_importLibraryProject_withClass_inSameFolder();

  @failingTest
  @override
  test_importLibraryProject_withClass_instanceCreation_implicit() =>
      super.test_importLibraryProject_withClass_instanceCreation_implicit();

  @failingTest
  @override
  test_importLibraryProject_withFunction() =>
      super.test_importLibraryProject_withFunction();

  @failingTest
  @override
  test_importLibraryProject_withFunction_unresolvedMethod() =>
      super.test_importLibraryProject_withFunction_unresolvedMethod();

  @failingTest
  @override
  test_importLibraryProject_withFunctionTypeAlias() =>
      super.test_importLibraryProject_withFunctionTypeAlias();

  @failingTest
  @override
  test_importLibraryProject_withTopLevelVariable() =>
      super.test_importLibraryProject_withTopLevelVariable();

  @failingTest
  @override
  test_importLibrarySdk_withClass_AsExpression() =>
      super.test_importLibrarySdk_withClass_AsExpression();

  @failingTest
  @override
  test_importLibrarySdk_withClass_instanceCreation_explicitNew() =>
      super.test_importLibrarySdk_withClass_instanceCreation_explicitNew();

  @failingTest
  @override
  test_importLibrarySdk_withClass_instanceCreation_explicitNew_namedConstructor() =>
      super
          .test_importLibrarySdk_withClass_instanceCreation_explicitNew_namedConstructor();

  @failingTest
  @override
  test_importLibrarySdk_withClass_instanceCreation_implicitNew() =>
      super.test_importLibrarySdk_withClass_instanceCreation_implicitNew();

  @failingTest
  @override
  test_importLibrarySdk_withClass_instanceCreation_implicitNew_namedConstructor() =>
      super
          .test_importLibrarySdk_withClass_instanceCreation_implicitNew_namedConstructor();

  @failingTest
  @override
  test_importLibrarySdk_withClass_invocationTarget() =>
      super.test_importLibrarySdk_withClass_invocationTarget();

  @failingTest
  @override
  test_importLibrarySdk_withClass_IsExpression() =>
      super.test_importLibrarySdk_withClass_IsExpression();

  @failingTest
  @override
  test_importLibrarySdk_withClass_itemOfList() =>
      super.test_importLibrarySdk_withClass_itemOfList();

  @failingTest
  @override
  test_importLibrarySdk_withClass_itemOfList_inAnnotation() =>
      super.test_importLibrarySdk_withClass_itemOfList_inAnnotation();

  @failingTest
  @override
  test_importLibrarySdk_withClass_typeAnnotation() =>
      super.test_importLibrarySdk_withClass_typeAnnotation();

  @failingTest
  @override
  test_importLibrarySdk_withClass_typeAnnotation_PrefixedIdentifier() =>
      super.test_importLibrarySdk_withClass_typeAnnotation_PrefixedIdentifier();

  @failingTest
  @override
  test_importLibrarySdk_withClass_typeArgument() =>
      super.test_importLibrarySdk_withClass_typeArgument();

  @failingTest
  @override
  test_importLibrarySdk_withTopLevelVariable() =>
      super.test_importLibrarySdk_withTopLevelVariable();

  @failingTest
  @override
  test_importLibrarySdk_withTopLevelVariable_annotation() =>
      super.test_importLibrarySdk_withTopLevelVariable_annotation();

  @failingTest
  @override
  test_importLibraryShow_project() => super.test_importLibraryShow_project();

  @failingTest
  @override
  test_importLibraryShow_sdk() => super.test_importLibraryShow_sdk();

  @failingTest
  @override
  test_makeFieldNotFinal_hasType() => super.test_makeFieldNotFinal_hasType();

  @failingTest
  @override
  test_makeFieldNotFinal_noType() => super.test_makeFieldNotFinal_noType();

  @failingTest
  @override
  test_noException_1() => super.test_noException_1();

  @failingTest
  @override
  test_nonBoolCondition_addNotNull() =>
      super.test_nonBoolCondition_addNotNull();

  @failingTest
  @override
  test_nonBoolCondition_addNotNull_all() =>
      super.test_nonBoolCondition_addNotNull_all();

  @failingTest
  @override
  test_removeParentheses_inGetterDeclaration() =>
      super.test_removeParentheses_inGetterDeclaration();

  @failingTest
  @override
  test_removeParentheses_inGetterInvocation() =>
      super.test_removeParentheses_inGetterInvocation();

  @failingTest
  @override
  test_replaceVarWithDynamic() => super.test_replaceVarWithDynamic();

  @failingTest
  @override
  test_replaceWithConstInstanceCreation_explicitNew() =>
      super.test_replaceWithConstInstanceCreation_explicitNew();

  @failingTest
  @override
  test_undefinedClass_useSimilar_BAD_prefixed() =>
      super.test_undefinedClass_useSimilar_BAD_prefixed();

  @failingTest
  @override
  test_undefinedClass_useSimilar_fromImport() =>
      super.test_undefinedClass_useSimilar_fromImport();

  @failingTest
  @override
  test_undefinedClass_useSimilar_fromThisLibrary() =>
      super.test_undefinedClass_useSimilar_fromThisLibrary();

  @failingTest
  @override
  test_undefinedFunction_create_bottomArgument() =>
      super.test_undefinedFunction_create_bottomArgument();

  @failingTest
  @override
  test_undefinedFunction_create_duplicateArgumentNames() =>
      super.test_undefinedFunction_create_duplicateArgumentNames();

  @failingTest
  @override
  test_undefinedFunction_create_dynamicArgument() =>
      super.test_undefinedFunction_create_dynamicArgument();

  @failingTest
  @override
  test_undefinedFunction_create_dynamicReturnType() =>
      super.test_undefinedFunction_create_dynamicReturnType();

  @failingTest
  @override
  test_undefinedFunction_create_fromFunction() =>
      super.test_undefinedFunction_create_fromFunction();

  @failingTest
  @override
  test_undefinedFunction_create_fromMethod() =>
      super.test_undefinedFunction_create_fromMethod();

  @failingTest
  @override
  test_undefinedFunction_create_generic_BAD() =>
      super.test_undefinedFunction_create_generic_BAD();

  @failingTest
  @override
  test_undefinedFunction_create_generic_OK() =>
      super.test_undefinedFunction_create_generic_OK();

  @failingTest
  @override
  test_undefinedFunction_create_importType() =>
      super.test_undefinedFunction_create_importType();

  @failingTest
  @override
  test_undefinedFunction_create_nullArgument() =>
      super.test_undefinedFunction_create_nullArgument();

  @failingTest
  @override
  test_undefinedFunction_create_returnType_bool_expressions() =>
      super.test_undefinedFunction_create_returnType_bool_expressions();

  @failingTest
  @override
  test_undefinedFunction_create_returnType_bool_statements() =>
      super.test_undefinedFunction_create_returnType_bool_statements();

  @failingTest
  @override
  test_undefinedFunction_create_returnType_fromAssignment_eq() =>
      super.test_undefinedFunction_create_returnType_fromAssignment_eq();

  @failingTest
  @override
  test_undefinedFunction_create_returnType_fromAssignment_plusEq() =>
      super.test_undefinedFunction_create_returnType_fromAssignment_plusEq();

  @failingTest
  @override
  test_undefinedFunction_create_returnType_fromBinary_right() =>
      super.test_undefinedFunction_create_returnType_fromBinary_right();

  @failingTest
  @override
  test_undefinedFunction_create_returnType_fromInitializer() =>
      super.test_undefinedFunction_create_returnType_fromInitializer();

  @failingTest
  @override
  test_undefinedFunction_create_returnType_fromInvocationArgument() =>
      super.test_undefinedFunction_create_returnType_fromInvocationArgument();

  @failingTest
  @override
  test_undefinedFunction_create_returnType_fromReturn() =>
      super.test_undefinedFunction_create_returnType_fromReturn();

  @failingTest
  @override
  test_undefinedFunction_create_returnType_void() =>
      super.test_undefinedFunction_create_returnType_void();

  @failingTest
  @override
  test_undefinedFunction_useSimilar_fromImport() =>
      super.test_undefinedFunction_useSimilar_fromImport();

  @failingTest
  @override
  test_undefinedFunction_useSimilar_prefixed_fromImport() =>
      super.test_undefinedFunction_useSimilar_prefixed_fromImport();

  @failingTest
  @override
  test_undefinedFunction_useSimilar_thisLibrary() =>
      super.test_undefinedFunction_useSimilar_thisLibrary();

  @failingTest
  @override
  test_undefinedGetter_useSimilar_unqualified() =>
      super.test_undefinedGetter_useSimilar_unqualified();

  @failingTest
  @override
  test_undefinedMethod_create_BAD_targetIsEnum() =>
      super.test_undefinedMethod_create_BAD_targetIsEnum();

  @failingTest
  @override
  test_undefinedMethod_create_generic_OK_local() =>
      super.test_undefinedMethod_create_generic_OK_local();

  @failingTest
  @override
  test_undefinedMethod_createUnqualified_duplicateArgumentNames() =>
      super.test_undefinedMethod_createUnqualified_duplicateArgumentNames();

  @failingTest
  @override
  test_undefinedMethod_createUnqualified_parameters() =>
      super.test_undefinedMethod_createUnqualified_parameters();

  @failingTest
  @override
  test_undefinedMethod_createUnqualified_parameters_named() =>
      super.test_undefinedMethod_createUnqualified_parameters_named();

  @failingTest
  @override
  test_undefinedMethod_createUnqualified_returnType() =>
      super.test_undefinedMethod_createUnqualified_returnType();

  @failingTest
  @override
  test_undefinedMethod_parameterType_differentPrefixInTargetUnit() =>
      super.test_undefinedMethod_parameterType_differentPrefixInTargetUnit();

  @failingTest
  @override
  test_undefinedMethod_parameterType_inTargetUnit() =>
      super.test_undefinedMethod_parameterType_inTargetUnit();

  @failingTest
  @override
  test_undefinedMethod_useSimilar_unqualified_superClass() =>
      super.test_undefinedMethod_useSimilar_unqualified_superClass();

  @failingTest
  @override
  test_undefinedMethod_useSimilar_unqualified_thisClass() =>
      super.test_undefinedMethod_useSimilar_unqualified_thisClass();

  @failingTest
  @override
  test_undefinedSetter_useSimilar_unqualified() =>
      super.test_undefinedSetter_useSimilar_unqualified();

  @failingTest
  @override
  test_useImportPrefix_withClass() => super.test_useImportPrefix_withClass();

  @failingTest
  @override
  test_useImportPrefix_withTopLevelVariable() =>
      super.test_useImportPrefix_withTopLevelVariable();
}

@reflectiveTest
class LintFixTest extends BaseFixProcessorTest {
  AnalysisError error;

  Future applyFix(FixKind kind) async {
    fix = await _assertHasFix(kind, error);
    change = fix.change;
    // apply to "file"
    List<SourceFileEdit> fileEdits = change.edits;
    expect(fileEdits, hasLength(1));
    resultCode = SourceEdit.applySequence(testCode, change.edits[0].edits);
  }

  @override
  assertNoFix(FixKind kind) async {
    await _assertNoFix(kind, error);
  }

  Future<Null> findLint(String src, String lintCode, {int length: 1}) async {
    int errorOffset = src.indexOf('/*LINT*/');
    await resolveTestUnit(src.replaceAll('/*LINT*/', ''));
    error = new AnalysisError(
        resolutionMap.elementDeclaredByCompilationUnit(testUnit).source,
        errorOffset,
        length,
        new LintCode(lintCode, '<ignored>'));
  }

  test_addRequiredAnnotation() async {
    String src = '''
void function({String /*LINT*/param}) {
  assert(param != null);
}
''';
    await findLint(src, LintNames.always_require_non_null_named_parameters);
    await applyFix(DartFixKind.LINT_ADD_REQUIRED);
    verifyResult('''
void function({@required String param}) {
  assert(param != null);
}
''');
  }

  test_isNotEmpty() async {
    String src = '''
f(c) {
  if (/*LINT*/!c.isEmpty) {}
}
''';
    await findLint(src, LintNames.prefer_is_not_empty);

    await applyFix(DartFixKind.USE_IS_NOT_EMPTY);

    verifyResult('''
f(c) {
  if (c.isNotEmpty) {}
}
''');
  }

  test_lint_addMissingOverride_field() async {
    String src = '''
class abstract Test {
  int get t;
}
class Sub extends Test {
  int /*LINT*/t = 42;
}
''';
    await findLint(src, LintNames.annotate_overrides);

    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);

    verifyResult('''
class abstract Test {
  int get t;
}
class Sub extends Test {
  @override
  int t = 42;
}
''');
  }

  test_lint_addMissingOverride_getter() async {
    String src = '''
class Test {
  int get t => null;
}
class Sub extends Test {
  int get /*LINT*/t => null;
}
''';
    await findLint(src, LintNames.annotate_overrides);

    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);

    verifyResult('''
class Test {
  int get t => null;
}
class Sub extends Test {
  @override
  int get t => null;
}
''');
  }

  test_lint_addMissingOverride_method() async {
    String src = '''
class Test {
  void t() { }
}
class Sub extends Test {
  void /*LINT*/t() { }
}
''';
    await findLint(src, LintNames.annotate_overrides);

    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);

    verifyResult('''
class Test {
  void t() { }
}
class Sub extends Test {
  @override
  void t() { }
}
''');
  }

  test_lint_addMissingOverride_method_with_doc_comment() async {
    String src = '''
class Test {
  void t() { }
}
class Sub extends Test {
  /// Doc comment.
  void /*LINT*/t() { }
}
''';
    await findLint(src, LintNames.annotate_overrides);

    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);

    verifyResult('''
class Test {
  void t() { }
}
class Sub extends Test {
  /// Doc comment.
  @override
  void t() { }
}
''');
  }

  test_lint_addMissingOverride_method_with_doc_comment_2() async {
    String src = '''
class Test {
  void t() { }
}
class Sub extends Test {
  /**
   * Doc comment.
   */
  void /*LINT*/t() { }
}
''';
    await findLint(src, LintNames.annotate_overrides);

    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);

    verifyResult('''
class Test {
  void t() { }
}
class Sub extends Test {
  /**
   * Doc comment.
   */
  @override
  void t() { }
}
''');
  }

  test_lint_addMissingOverride_method_with_doc_comment_and_metadata() async {
    String src = '''
class Test {
  void t() { }
}
class Sub extends Test {
  /// Doc comment.
  @foo
  void /*LINT*/t() { }
}
''';
    await findLint(src, LintNames.annotate_overrides);

    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);

    verifyResult('''
class Test {
  void t() { }
}
class Sub extends Test {
  /// Doc comment.
  @override
  @foo
  void t() { }
}
''');
  }

  test_lint_addMissingOverride_method_with_non_doc_comment() async {
    String src = '''
class Test {
  void t() { }
}
class Sub extends Test {
  // Non-doc comment.
  void /*LINT*/t() { }
}
''';
    await findLint(src, LintNames.annotate_overrides);

    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);

    verifyResult('''
class Test {
  void t() { }
}
class Sub extends Test {
  // Non-doc comment.
  @override
  void t() { }
}
''');
  }

  test_lint_removeInterpolationBraces() async {
    String src = r'''
main() {
  var v = 42;
  print('v: /*LINT*/${ v}');
}
''';
    await findLint(src, LintNames.unnecessary_brace_in_string_interp,
        length: 4);
    await applyFix(DartFixKind.LINT_REMOVE_INTERPOLATION_BRACES);
    verifyResult(r'''
main() {
  var v = 42;
  print('v: $v');
}
''');
  }

  test_makeFieldFinal_noKeyword() async {
    String src = '''
class C {
  /*LINT*/f = 2;
}
''';
    await findLint(src, LintNames.prefer_final_fields);

    await applyFix(DartFixKind.MAKE_FINAL);

    verifyResult('''
class C {
  final f = 2;
}
''');
  }

  test_makeFieldFinal_type() async {
    String src = '''
class C {
  int /*LINT*/f = 2;
}
''';
    await findLint(src, LintNames.prefer_final_fields);

    await applyFix(DartFixKind.MAKE_FINAL);

    verifyResult('''
class C {
  final int f = 2;
}
''');
  }

  test_makeFieldFinal_var() async {
    String src = '''
class C {
  var /*LINT*/f = 2;
}
''';
    await findLint(src, LintNames.prefer_final_fields);

    await applyFix(DartFixKind.MAKE_FINAL);

    verifyResult('''
class C {
  final f = 2;
}
''');
  }

  test_makeLocalFinal_type() async {
    String src = '''
bad() {
  int /*LINT*/x = 2;
}
''';
    await findLint(src, LintNames.prefer_final_locals);

    await applyFix(DartFixKind.MAKE_FINAL);

    verifyResult('''
bad() {
  final int x = 2;
}
''');
  }

  test_makeLocalFinal_var() async {
    String src = '''
bad() {
  var /*LINT*/x = 2;
}
''';
    await findLint(src, LintNames.prefer_final_locals);

    await applyFix(DartFixKind.MAKE_FINAL);

    verifyResult('''
bad() {
  final x = 2;
}
''');
  }

  test_removeAwait_intLiteral() async {
    String src = '''
bad() async {
  print(/*LINT*/await 23);
}
''';
    await findLint(src, LintNames.await_only_futures);

    await applyFix(DartFixKind.REMOVE_AWAIT);

    verifyResult('''
bad() async {
  print(23);
}
''');
  }

  test_removeAwait_StringLiteral() async {
    String src = '''
bad() async {
  print(/*LINT*/await 'hola');
}
''';
    await findLint(src, LintNames.await_only_futures);

    await applyFix(DartFixKind.REMOVE_AWAIT);

    verifyResult('''
bad() async {
  print('hola');
}
''');
  }

  test_removeEmptyCatch_newLine() async {
    String src = '''
void foo() {
  try {}
  catch (e) {/*LINT*/}
  finally {}
}
''';
    await findLint(src, LintNames.empty_catches);

    await applyFix(DartFixKind.REMOVE_EMPTY_CATCH);

    verifyResult('''
void foo() {
  try {}
  finally {}
}
''');
  }

  test_removeEmptyCatch_sameLine() async {
    String src = '''
void foo() {
  try {} catch (e) {/*LINT*/} finally {}
}
''';
    await findLint(src, LintNames.empty_catches);

    await applyFix(DartFixKind.REMOVE_EMPTY_CATCH);

    verifyResult('''
void foo() {
  try {} finally {}
}
''');
  }

  test_removeEmptyConstructorBody() async {
    String src = '''
class C {
  C() {/*LINT*/}
}
''';
    await findLint(src, LintNames.empty_constructor_bodies);

    await applyFix(DartFixKind.REMOVE_EMPTY_CONSTRUCTOR_BODY);

    verifyResult('''
class C {
  C();
}
''');
  }

  test_removeEmptyElse_newLine() async {
    String src = '''
void foo(bool cond) {
  if (cond) {
    //
  }
  else /*LINT*/;
}
''';
    await findLint(src, LintNames.avoid_empty_else);

    await applyFix(DartFixKind.REMOVE_EMPTY_ELSE);

    verifyResult('''
void foo(bool cond) {
  if (cond) {
    //
  }
}
''');
  }

  test_removeEmptyElse_sameLine() async {
    String src = '''
void foo(bool cond) {
  if (cond) {
    //
  } else /*LINT*/;
}
''';
    await findLint(src, LintNames.avoid_empty_else);

    await applyFix(DartFixKind.REMOVE_EMPTY_ELSE);

    verifyResult('''
void foo(bool cond) {
  if (cond) {
    //
  }
}
''');
  }

  test_removeEmptyStatement_insideBlock() async {
    String src = '''
void foo() {
  while(true) {
    /*LINT*/;
  }
}
''';
    await findLint(src, LintNames.empty_statements);

    await applyFix(DartFixKind.REMOVE_EMPTY_STATEMENT);

    verifyResult('''
void foo() {
  while(true) {
  }
}
''');
  }

  test_removeEmptyStatement_outOfBlock_otherLine() async {
    String src = '''
void foo() {
  while(true)
  /*LINT*/;
  print('hi');
}
''';
    await findLint(src, LintNames.empty_statements);

    await applyFix(DartFixKind.REPLACE_WITH_BRACKETS);

    verifyResult('''
void foo() {
  while(true) {}
  print('hi');
}
''');
  }

  test_removeEmptyStatement_outOfBlock_sameLine() async {
    String src = '''
void foo() {
  while(true)/*LINT*/;
  print('hi');
}
''';
    await findLint(src, LintNames.empty_statements);

    await applyFix(DartFixKind.REPLACE_WITH_BRACKETS);

    verifyResult('''
void foo() {
  while(true) {}
  print('hi');
}
''');
  }

  test_removeInitializer_field() async {
    String src = '''
class Test {
  int /*LINT*/x = null;
}
''';
    await findLint(src, LintNames.avoid_init_to_null);

    await applyFix(DartFixKind.REMOVE_INITIALIZER);

    verifyResult('''
class Test {
  int x;
}
''');
  }

  test_removeInitializer_listOfVariableDeclarations() async {
    String src = '''
String a = 'a', /*LINT*/b = null, c = 'c';
''';
    await findLint(src, LintNames.avoid_init_to_null);

    await applyFix(DartFixKind.REMOVE_INITIALIZER);

    verifyResult('''
String a = 'a', b, c = 'c';
''');
  }

  test_removeInitializer_topLevel() async {
    String src = '''
var /*LINT*/x = null;
''';
    await findLint(src, LintNames.avoid_init_to_null);

    await applyFix(DartFixKind.REMOVE_INITIALIZER);

    verifyResult('''
var x;
''');
  }

  test_removeMethodDeclaration_getter() async {
    String src = '''
class A {
  int x;
}
class B extends A {
  @override
  int get /*LINT*/x => super.x;
}
''';
    await findLint(src, LintNames.unnecessary_override);

    await applyFix(DartFixKind.REMOVE_METHOD_DECLARATION);

    verifyResult('''
class A {
  int x;
}
class B extends A {
}
''');
  }

  test_removeMethodDeclaration_method() async {
    String src = '''
class A {
  @override
  String /*LINT*/toString() => super.toString();
}
''';
    await findLint(src, LintNames.unnecessary_override);

    await applyFix(DartFixKind.REMOVE_METHOD_DECLARATION);

    verifyResult('''
class A {
}
''');
  }

  test_removeMethodDeclaration_setter() async {
    String src = '''
class A {
  int x;
}
class B extends A {
  @override
  set /*LINT*/x(int other) {
    this.x = other;
  }
}
''';
    await findLint(src, LintNames.unnecessary_override);

    await applyFix(DartFixKind.REMOVE_METHOD_DECLARATION);

    verifyResult('''
class A {
  int x;
}
class B extends A {
}
''');
  }

  test_removeThisExpression_methodInvocation_oneCharacterOperator() async {
    String src = '''
class A {
  void foo() {
    /*LINT*/this.foo();
  }
}
''';
    await findLint(src, LintNames.unnecessary_this);

    await applyFix(DartFixKind.REMOVE_THIS_EXPRESSION);

    verifyResult('''
class A {
  void foo() {
    foo();
  }
}
''');
  }

  test_removeThisExpression_methodInvocation_twoCharactersOperator() async {
    String src = '''
class A {
  void foo() {
    /*LINT*/this?.foo();
  }
}
''';
    await findLint(src, LintNames.unnecessary_this);

    await applyFix(DartFixKind.REMOVE_THIS_EXPRESSION);

    verifyResult('''
class A {
  void foo() {
    foo();
  }
}
''');
  }

  test_removeThisExpression_notAThisExpression() async {
    String src = '''
void foo() {
  final /*LINT*/this.id;
}
''';
    await findLint(src, LintNames.unnecessary_this);

    await assertNoFix(DartFixKind.REMOVE_THIS_EXPRESSION);
  }

  test_removeThisExpression_propertyAccess_oneCharacterOperator() async {
    String src = '''
class A {
  int x;
  void foo() {
    /*LINT*/this.x = 2;
  }
}
''';
    await findLint(src, LintNames.unnecessary_this);

    await applyFix(DartFixKind.REMOVE_THIS_EXPRESSION);

    verifyResult('''
class A {
  int x;
  void foo() {
    x = 2;
  }
}
''');
  }

  test_removeThisExpression_propertyAccess_twoCharactersOperator() async {
    String src = '''
class A {
  int x;
  void foo() {
    /*LINT*/this?.x = 2;
  }
}
''';
    await findLint(src, LintNames.unnecessary_this);

    await applyFix(DartFixKind.REMOVE_THIS_EXPRESSION);

    verifyResult('''
class A {
  int x;
  void foo() {
    x = 2;
  }
}
''');
  }

  test_removeTypeAnnotation_avoidAnnotatingWithDynamic_InsideFunctionTypedFormalParameter() async {
    String src = '''
bad(void foo(/*LINT*/dynamic x)) {
  return null;
}
''';
    await findLint(src, LintNames.avoid_annotating_with_dynamic);

    await applyFix(DartFixKind.REMOVE_TYPE_NAME);

    verifyResult('''
bad(void foo(x)) {
  return null;
}
''');
  }

  test_removeTypeAnnotation_avoidAnnotatingWithDynamic_NamedParameter() async {
    String src = '''
bad({/*LINT*/dynamic defaultValue}) {
  return null;
}
''';
    await findLint(src, LintNames.avoid_annotating_with_dynamic);

    await applyFix(DartFixKind.REMOVE_TYPE_NAME);

    verifyResult('''
bad({defaultValue}) {
  return null;
}
''');
  }

  test_removeTypeAnnotation_avoidAnnotatingWithDynamic_NormalParameter() async {
    String src = '''
bad(/*LINT*/dynamic defaultValue) {
  return null;
}
''';
    await findLint(src, LintNames.avoid_annotating_with_dynamic);

    await applyFix(DartFixKind.REMOVE_TYPE_NAME);

    verifyResult('''
bad(defaultValue) {
  return null;
}
''');
  }

  test_removeTypeAnnotation_avoidAnnotatingWithDynamic_OptionalParameter() async {
    String src = '''
bad([/*LINT*/dynamic defaultValue]) {
  return null;
}
''';
    await findLint(src, LintNames.avoid_annotating_with_dynamic);

    await applyFix(DartFixKind.REMOVE_TYPE_NAME);

    verifyResult('''
bad([defaultValue]) {
  return null;
}
''');
  }

  test_removeTypeAnnotation_avoidReturnTypesOnSetters_void() async {
    String src = '''
/*LINT*/void set speed2(int ms) {}
''';
    await findLint(src, LintNames.avoid_return_types_on_setters);

    await applyFix(DartFixKind.REMOVE_TYPE_NAME);

    verifyResult('''
set speed2(int ms) {}
''');
  }

  test_removeTypeAnnotation_avoidTypesOnClosureParameters_FunctionTypedFormalParameter() async {
    String src = '''
var functionWithFunction = (/*LINT*/int f(int x)) => f(0);
''';
    await findLint(src, LintNames.avoid_types_on_closure_parameters);

    await applyFix(DartFixKind.REPLACE_WITH_IDENTIFIER);

    verifyResult('''
var functionWithFunction = (f) => f(0);
''');
  }

  test_removeTypeAnnotation_avoidTypesOnClosureParameters_NamedParameter() async {
    String src = '''
var x = ({/*LINT*/Future<int> defaultValue}) {
  return null;
};
''';
    await findLint(src, LintNames.avoid_types_on_closure_parameters);

    await applyFix(DartFixKind.REMOVE_TYPE_NAME);

    verifyResult('''
var x = ({defaultValue}) {
  return null;
};
''');
  }

  test_removeTypeAnnotation_avoidTypesOnClosureParameters_NormalParameter() async {
    String src = '''
var x = (/*LINT*/Future<int> defaultValue) {
  return null;
};
''';
    await findLint(src, LintNames.avoid_types_on_closure_parameters);

    await applyFix(DartFixKind.REMOVE_TYPE_NAME);

    verifyResult('''
var x = (defaultValue) {
  return null;
};
''');
  }

  test_removeTypeAnnotation_avoidTypesOnClosureParameters_OptionalParameter() async {
    String src = '''
var x = ([/*LINT*/Future<int> defaultValue]) {
  return null;
};
''';
    await findLint(src, LintNames.avoid_types_on_closure_parameters);

    await applyFix(DartFixKind.REMOVE_TYPE_NAME);

    verifyResult('''
var x = ([defaultValue]) {
  return null;
};
''');
  }

  test_removeTypeAnnotation_typeInitFormals_void() async {
    String src = '''
class C {
  int f;
  C(/*LINT*/int this.f);
}
''';
    await findLint(src, LintNames.type_init_formals);

    await applyFix(DartFixKind.REMOVE_TYPE_NAME);

    verifyResult('''
class C {
  int f;
  C(this.f);
}
''');
  }

  test_renameToCamelCase_BAD_parameter_optionalNamed() async {
    String src = '''
foo({int /*LINT*/my_integer_variable}) {
  print(my_integer_variable);
}
''';
    await findLint(src, LintNames.non_constant_identifier_names);
    await assertNoFix(DartFixKind.RENAME_TO_CAMEL_CASE);
  }

  test_renameToCamelCase_OK_localVariable() async {
    String src = '''
main() {
  int /*LINT*/my_integer_variable = 42;
  int foo;
  print(my_integer_variable);
  print(foo);
}
''';
    await findLint(src, LintNames.non_constant_identifier_names);

    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);

    verifyResult('''
main() {
  int myIntegerVariable = 42;
  int foo;
  print(myIntegerVariable);
  print(foo);
}
''');
  }

  test_renameToCamelCase_OK_parameter_closure() async {
    String src = '''
main() {
  [0, 1, 2].forEach((/*LINT*/my_integer_variable) {
    print(my_integer_variable);
  });
}
''';
    await findLint(src, LintNames.non_constant_identifier_names);

    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);

    verifyResult('''
main() {
  [0, 1, 2].forEach((myIntegerVariable) {
    print(myIntegerVariable);
  });
}
''');
  }

  test_renameToCamelCase_OK_parameter_function() async {
    String src = '''
main(int /*LINT*/my_integer_variable) {
  print(my_integer_variable);
}
''';
    await findLint(src, LintNames.non_constant_identifier_names);

    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);

    verifyResult('''
main(int myIntegerVariable) {
  print(myIntegerVariable);
}
''');
  }

  test_renameToCamelCase_OK_parameter_method() async {
    String src = '''
class A {
  main(int /*LINT*/my_integer_variable) {
    print(my_integer_variable);
  }
}
''';
    await findLint(src, LintNames.non_constant_identifier_names);

    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);

    verifyResult('''
class A {
  main(int myIntegerVariable) {
    print(myIntegerVariable);
  }
}
''');
  }

  test_renameToCamelCase_OK_parameter_optionalPositional() async {
    String src = '''
main([int /*LINT*/my_integer_variable]) {
  print(my_integer_variable);
}
''';
    await findLint(src, LintNames.non_constant_identifier_names);

    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);

    verifyResult('''
main([int myIntegerVariable]) {
  print(myIntegerVariable);
}
''');
  }

  test_replaceFinalWithConst_method() async {
    String src = '''
/*LINT*/final int a = 1;
''';
    await findLint(src, LintNames.prefer_const_declarations);

    await applyFix(DartFixKind.REPLACE_FINAL_WITH_CONST);

    verifyResult('''
const int a = 1;
''');
  }

  test_replaceWithConditionalAssignment_withCodeBeforeAndAfter() async {
    String src = '''
class Person {
  String _fullName;
  void foo() {
    print('hi');
    /*LINT*/if (_fullName == null) {
      _fullName = getFullUserName(this);
    }
    print('hi');
  }
}
''';
    await findLint(src, LintNames.prefer_conditional_assignment);

    await applyFix(DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT);

    verifyResult('''
class Person {
  String _fullName;
  void foo() {
    print('hi');
    _fullName ??= getFullUserName(this);
    print('hi');
  }
}
''');
  }

  test_replaceWithConditionalAssignment_withOneBlock() async {
    String src = '''
class Person {
  String _fullName;
  void foo() {
    /*LINT*/if (_fullName == null) {
      _fullName = getFullUserName(this);
    }
  }
}
''';
    await findLint(src, LintNames.prefer_conditional_assignment);

    await applyFix(DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT);

    verifyResult('''
class Person {
  String _fullName;
  void foo() {
    _fullName ??= getFullUserName(this);
  }
}
''');
  }

  test_replaceWithConditionalAssignment_withoutBlock() async {
    String src = '''
class Person {
  String _fullName;
  void foo() {
    /*LINT*/if (_fullName == null)
      _fullName = getFullUserName(this);
  }
}
''';
    await findLint(src, LintNames.prefer_conditional_assignment);

    await applyFix(DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT);

    verifyResult('''
class Person {
  String _fullName;
  void foo() {
    _fullName ??= getFullUserName(this);
  }
}
''');
  }

  test_replaceWithConditionalAssignment_withTwoBlock() async {
    String src = '''
class Person {
  String _fullName;
  void foo() {
    /*LINT*/if (_fullName == null) {{
      _fullName = getFullUserName(this);
    }}
  }
}
''';
    await findLint(src, LintNames.prefer_conditional_assignment);

    await applyFix(DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT);

    verifyResult('''
class Person {
  String _fullName;
  void foo() {
    _fullName ??= getFullUserName(this);
  }
}
''');
  }

  test_replaceWithLiteral_linkedHashMap_withCommentsInGeneric() async {
    String src = '''
import 'dart:collection';

final a = /*LINT*/new LinkedHashMap<int,/*comment*/int>();
''';
    await findLint(src, LintNames.prefer_collection_literals);

    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);

    verifyResult('''
import 'dart:collection';

final a = <int,/*comment*/int>{};
''');
  }

  test_replaceWithLiteral_linkedHashMap_withDynamicGenerics() async {
    String src = '''
import 'dart:collection';

final a = /*LINT*/new LinkedHashMap<dynamic,dynamic>();
''';
    await findLint(src, LintNames.prefer_collection_literals);

    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);

    verifyResult('''
import 'dart:collection';

final a = <dynamic,dynamic>{};
''');
  }

  test_replaceWithLiteral_linkedHashMap_withGeneric() async {
    String src = '''
import 'dart:collection';

final a = /*LINT*/new LinkedHashMap<int,int>();
''';
    await findLint(src, LintNames.prefer_collection_literals);

    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);

    verifyResult('''
import 'dart:collection';

final a = <int,int>{};
''');
  }

  test_replaceWithLiteral_linkedHashMap_withoutGeneric() async {
    String src = '''
import 'dart:collection';

final a = /*LINT*/new LinkedHashMap();
''';
    await findLint(src, LintNames.prefer_collection_literals);

    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);

    verifyResult('''
import 'dart:collection';

final a = {};
''');
  }

  test_replaceWithLiteral_list_withGeneric() async {
    String src = '''
final a = /*LINT*/new List<int>();
''';
    await findLint(src, LintNames.prefer_collection_literals);

    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);

    verifyResult('''
final a = <int>[];
''');
  }

  test_replaceWithLiteral_list_withoutGeneric() async {
    String src = '''
final a = /*LINT*/new List();
''';
    await findLint(src, LintNames.prefer_collection_literals);

    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);

    verifyResult('''
final a = [];
''');
  }

  test_replaceWithLiteral_map_withGeneric() async {
    String src = '''
final a = /*LINT*/new Map<int,int>();
''';
    await findLint(src, LintNames.prefer_collection_literals);

    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);

    verifyResult('''
final a = <int,int>{};
''');
  }

  test_replaceWithLiteral_map_withoutGeneric() async {
    String src = '''
final a = /*LINT*/new Map();
''';
    await findLint(src, LintNames.prefer_collection_literals);

    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);

    verifyResult('''
final a = {};
''');
  }

  test_replaceWithTearOff_function_oneParameter() async {
    String src = '''
final x = /*LINT*/(name) {
  print(name);
};
''';
    await findLint(src, LintNames.unnecessary_lambdas);

    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);

    verifyResult('''
final x = print;
''');
  }

  test_replaceWithTearOff_function_zeroParameters() async {
    String src = '''
void foo(){}
Function finalVar() {
  return /*LINT*/() {
    foo();
  };
}
''';
    await findLint(src, LintNames.unnecessary_lambdas);

    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);

    verifyResult('''
void foo(){}
Function finalVar() {
  return foo;
}
''');
  }

  test_replaceWithTearOff_lambda_asArgument() async {
    String src = '''
void foo() {
  bool isPair(int a) => a % 2 == 0;
  final finalList = <int>[];
  finalList.where(/*LINT*/(number) =>
    isPair(number));
}
''';
    await findLint(src, LintNames.unnecessary_lambdas);

    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);

    verifyResult('''
void foo() {
  bool isPair(int a) => a % 2 == 0;
  final finalList = <int>[];
  finalList.where(isPair);
}
''');
  }

  test_replaceWithTearOff_method_oneParameter() async {
    String src = '''
var a = /*LINT*/(x) => finalList.remove(x);
''';
    await findLint(src, LintNames.unnecessary_lambdas);

    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);

    verifyResult('''
var a = finalList.remove;
''');
  }

  test_replaceWithTearOff_method_zeroParameter() async {
    String src = '''
final Object a;
Function finalVar() {
  return /*LINT*/() {
    return a.toString();
  };
}
''';
    await findLint(src, LintNames.unnecessary_lambdas);

    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);

    verifyResult('''
final Object a;
Function finalVar() {
  return a.toString;
}
''');
  }

  void verifyResult(String expectedResult) {
    expect(resultCode, expectedResult);
  }
}

@reflectiveTest
class LintFixTest_UseCFE extends LintFixTest {
  @override
  bool get useCFE => true;

  @failingTest
  @override
  test_lint_addMissingOverride_method_with_doc_comment_and_metadata() =>
      super.test_lint_addMissingOverride_method_with_doc_comment_and_metadata();

  @failingTest
  @override
  test_replaceWithLiteral_linkedHashMap_withCommentsInGeneric() =>
      super.test_replaceWithLiteral_linkedHashMap_withCommentsInGeneric();

  @failingTest
  @override
  test_replaceWithLiteral_linkedHashMap_withDynamicGenerics() =>
      super.test_replaceWithLiteral_linkedHashMap_withDynamicGenerics();

  @failingTest
  @override
  test_replaceWithLiteral_linkedHashMap_withGeneric() =>
      super.test_replaceWithLiteral_linkedHashMap_withGeneric();

  @failingTest
  @override
  test_replaceWithLiteral_linkedHashMap_withoutGeneric() =>
      super.test_replaceWithLiteral_linkedHashMap_withoutGeneric();

  @failingTest
  @override
  test_replaceWithLiteral_map_withGeneric() =>
      super.test_replaceWithLiteral_map_withGeneric();

  @failingTest
  @override
  test_replaceWithLiteral_map_withoutGeneric() =>
      super.test_replaceWithLiteral_map_withoutGeneric();
}

class _DartFixContextImpl implements DartFixContext {
  @override
  final ResourceProvider resourceProvider;

  @override
  final AnalysisDriver analysisDriver;

  @override
  final AstProvider astProvider;

  @override
  final CompilationUnit unit;

  @override
  final AnalysisError error;

  @override
  final List<AnalysisError> errors;

  _DartFixContextImpl(this.resourceProvider, this.analysisDriver,
      this.astProvider, this.unit, this.error, this.errors);

  @override
  GetTopLevelDeclarations get getTopLevelDeclarations =>
      analysisDriver.getTopLevelNameDeclarations;
}
