// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
import 'package:analysis_server/src/protocol_server.dart' show SourceEdit;
import 'package:analysis_server/src/services/correction/fix/analysis_options/fix_generator.dart';
import 'package:analyzer/error/error.dart' as engine;
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/task/options.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart'
    show SourceFileEdit;
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
import 'package:yaml/src/yaml_node.dart';
import 'package:yaml/yaml.dart';

/// A base class providing utility methods for tests of fixes associated with
/// errors in Dart files.
class AnalysisOptionsFixTest with ResourceProviderMixin {
  Future<void> assertHasFix(
      String initialContent, String expectedContent) async {
    List<Fix> fixes = await _getFixes(initialContent);
    expect(fixes, hasLength(1));
    List<SourceFileEdit> fileEdits = fixes[0].change.edits;
    expect(fileEdits, hasLength(1));

    String actualContent =
        SourceEdit.applySequence(initialContent, fileEdits[0].edits);
    expect(actualContent, expectedContent);
  }

  Future<void> assertHasNoFix(String initialContent) async {
    List<Fix> fixes = await _getFixes(initialContent);
    expect(fixes, hasLength(0));
  }

  Future<List<Fix>> _getFixes(String content) {
    File optionsFile = getFile('/analysis_options.yaml');
    SourceFactory sourceFactory = new SourceFactory([]);
    List<engine.AnalysisError> errors = analyzeAnalysisOptions(
        optionsFile.createSource(), content, sourceFactory);
    expect(errors, hasLength(1));
    engine.AnalysisError error = errors[0];
    YamlMap options = _parseYaml(content);
    AnalysisOptionsFixGenerator generator =
        new AnalysisOptionsFixGenerator(error, content, options);
    return generator.computeFixes();
  }

  YamlMap _parseYaml(String content) {
    if (content == null) {
      return new YamlMap();
    }
    try {
      YamlNode doc = loadYamlNode(content);
      if (doc is YamlMap) {
        return doc;
      }
      return new YamlMap();
    } catch (exception) {
      return null;
    }
  }
}
