// Copyright (c) 2017, 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/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../support/integration_tests.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(GetFixesTest);
    defineReflectiveTests(GetFixesTest_UseCFE);
  });
}

@reflectiveTest
class GetFixesTest extends AbstractAnalysisServerIntegrationTest {
  test_has_fixes() async {
    String pathname = sourcePath('test.dart');
    String text = r'''
Future f;
''';
    writeFile(pathname, text);
    standardAnalysisSetup();

    await analysisFinished;
    expect(currentAnalysisErrors[pathname], isNotEmpty);

    EditGetFixesResult result =
        await sendEditGetFixes(pathname, text.indexOf('Future f'));
    expect(result.fixes, hasLength(1));

    // expect a suggestion to add the dart:async import
    AnalysisErrorFixes fix = result.fixes.first;
    expect(fix.error.code, 'undefined_class');
    expect(fix.fixes, isNotEmpty);

    SourceChange change = fix.fixes.singleWhere(
        (SourceChange change) => change.message.startsWith('Import '));
    expect(change.edits, hasLength(1));
    expect(change.edits.first.edits, hasLength(1));
  }

  test_no_fixes() async {
    String pathname = sourcePath('test.dart');
    String text = r'''
import 'dart:async';

Future f;
''';
    writeFile(pathname, text);
    standardAnalysisSetup();

    EditGetFixesResult result =
        await sendEditGetFixes(pathname, text.indexOf('Future f'));
    expect(result.fixes, isEmpty);
  }
}

@reflectiveTest
class GetFixesTest_UseCFE extends GetFixesTest {
  @override
  bool get useCFE => true;

  @override
  @failingTest
  Future test_has_fixes() => super.test_has_fixes();

  @failingTest
  @override
  test_no_fixes() {
    fail('Test crashes with CFE');
  }
}
