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

import 'package:analysis_server/src/services/correction/fix/data_driven/add_type_parameter.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/modify_parameters.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/rename.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
import 'package:matcher/matcher.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'transform_set_parser_test_support.dart';

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(TransformSetParserTest);
  });
}

@reflectiveTest
class TransformSetParserTest extends AbstractTransformSetParserTest {
  void test_addParameter_optionalNamed() {
    parse('''
version: 1
transforms:
- title: 'Add'
  element:
    uris: ['test.dart']
    function: 'f'
  changes:
    - kind: 'addParameter'
      index: 0
      name: 'p'
      style: optional_named
      argumentValue:
        kind: 'argument'
        index: 1
''');
    var transforms = result.transformsFor('f', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Add');
    expect(transform.changes, hasLength(1));
    var change = transform.changes[0] as ModifyParameters;
    var modifications = change.modifications;
    expect(modifications, hasLength(1));
    var modification = modifications[0] as AddParameter;
    expect(modification.index, 0);
    expect(modification.name, 'p');
    expect(modification.isRequired, false);
    expect(modification.isPositional, false);
    var value = modification.argumentValue as ArgumentExtractor;
    var parameter = value.parameter as PositionalParameterReference;
    expect(parameter.index, 1);
  }

  void test_addParameter_optionalPositional() {
    parse('''
version: 1
transforms:
- title: 'Add'
  element:
    uris: ['test.dart']
    function: 'f'
  changes:
    - kind: 'addParameter'
      index: 0
      name: 'p'
      style: optional_positional
      defaultValue:
        kind: 'argument'
        index: 1
''');
    var transforms = result.transformsFor('f', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Add');
    expect(transform.changes, hasLength(1));
    var change = transform.changes[0] as ModifyParameters;
    var modifications = change.modifications;
    expect(modifications, hasLength(1));
    var modification = modifications[0] as AddParameter;
    expect(modification.index, 0);
    expect(modification.name, 'p');
    expect(modification.isRequired, false);
    expect(modification.isPositional, true);
    var value = modification.defaultValue as ArgumentExtractor;
    var parameter = value.parameter as PositionalParameterReference;
    expect(parameter.index, 1);
  }

  void test_addParameter_requiredNamed() {
    parse('''
version: 1
transforms:
- title: 'Add'
  element:
    uris: ['test.dart']
    function: 'f'
  changes:
    - kind: 'addParameter'
      index: 0
      name: 'p'
      style: required_named
      argumentValue:
        kind: 'argument'
        index: 1
''');
    var transforms = result.transformsFor('f', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Add');
    expect(transform.changes, hasLength(1));
    var change = transform.changes[0] as ModifyParameters;
    var modifications = change.modifications;
    expect(modifications, hasLength(1));
    var modification = modifications[0] as AddParameter;
    expect(modification.index, 0);
    expect(modification.name, 'p');
    expect(modification.isRequired, true);
    expect(modification.isPositional, false);
    var value = modification.argumentValue as ArgumentExtractor;
    var parameter = value.parameter as PositionalParameterReference;
    expect(parameter.index, 1);
  }

  void test_addParameter_requiredPositional() {
    parse('''
version: 1
transforms:
- title: 'Add'
  element:
    uris: ['test.dart']
    function: 'f'
  changes:
    - kind: 'addParameter'
      index: 0
      name: 'p'
      style: required_positional
      argumentValue:
        kind: 'argument'
        index: 1
''');
    var transforms = result.transformsFor('f', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Add');
    expect(transform.changes, hasLength(1));
    var change = transform.changes[0] as ModifyParameters;
    var modifications = change.modifications;
    expect(modifications, hasLength(1));
    var modification = modifications[0] as AddParameter;
    expect(modification.index, 0);
    expect(modification.name, 'p');
    expect(modification.isRequired, true);
    expect(modification.isPositional, true);
    var value = modification.argumentValue as ArgumentExtractor;
    var parameter = value.parameter as PositionalParameterReference;
    expect(parameter.index, 1);
  }

  void test_addTypeParameter_fromNamedArgument() {
    parse('''
version: 1
transforms:
- title: 'Add'
  element:
    uris:
      - 'test.dart'
    class: 'A'
  changes:
    - kind: 'addTypeParameter'
      index: 0
      name: 'T'
      value:
        kind: 'argument'
        name: 'p'
''');
    var transforms = result.transformsFor('A', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Add');
    expect(transform.changes, hasLength(1));
    var change = transform.changes[0] as AddTypeParameter;
    expect(change.index, 0);
    expect(change.name, 'T');
    var value = change.value as ArgumentExtractor;
    var parameter = value.parameter as NamedParameterReference;
    expect(parameter.name, 'p');
  }

  void test_addTypeParameter_fromPositionalArgument() {
    parse('''
version: 1
transforms:
- title: 'Add'
  element:
    uris:
      - 'test.dart'
    class: 'A'
  changes:
    - kind: 'addTypeParameter'
      index: 0
      name: 'T'
      value:
        kind: 'argument'
        index: 2
''');
    var transforms = result.transformsFor('A', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Add');
    expect(transform.changes, hasLength(1));
    var change = transform.changes[0] as AddTypeParameter;
    expect(change.index, 0);
    expect(change.name, 'T');
    var value = change.value as ArgumentExtractor;
    var parameter = value.parameter as PositionalParameterReference;
    expect(parameter.index, 2);
  }

  void test_element_getter_inMixin() {
    parse('''
version: 1
transforms:
- title: 'Rename g'
  element:
    uris: ['test.dart']
    getter: 'g'
    inMixin: 'A'
  changes: []
''');
    var transforms = result.transformsFor('g', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Rename g');
    expect(transform.changes, isEmpty);
  }

  void test_element_getter_topLevel() {
    parse('''
version: 1
transforms:
- title: 'Rename g'
  element:
    uris: ['test.dart']
    getter: 'g'
  changes: []
''');
    var transforms = result.transformsFor('g', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Rename g');
    expect(transform.changes, isEmpty);
  }

  void test_element_method_inClass() {
    parse('''
version: 1
transforms:
- title: 'Rename m'
  element:
    uris: ['test.dart']
    method: 'm'
    inClass: 'A'
  changes: []
''');
    var transforms = result.transformsFor('m', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Rename m');
    expect(transform.changes, isEmpty);
  }

  void test_incomplete() {
    parse('''
version: 1
transforms:
''');
    expect(result, null);
    errorListener.assertErrors([
      error(TransformSetErrorCode.invalidValue, 21, 0),
    ]);
  }

  void test_invalidYaml() {
    parse('''
[
''');
    expect(result, null);
    errorListener.assertErrors([
      error(TransformSetErrorCode.yamlSyntaxError, 2, 0),
    ]);
  }

  void test_removeParameter_named() {
    parse('''
version: 1
transforms:
- title: 'Remove'
  element:
    uris: ['test.dart']
    function: 'f'
  changes:
    - kind: 'removeParameter'
      name: 'p'
''');
    var transforms = result.transformsFor('f', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Remove');
    expect(transform.changes, hasLength(1));
    var change = transform.changes[0] as ModifyParameters;
    var modifications = change.modifications;
    expect(modifications, hasLength(1));
    var modification = modifications[0] as RemoveParameter;
    var parameter = modification.parameter as NamedParameterReference;
    expect(parameter.name, 'p');
  }

  void test_removeParameter_positional() {
    parse('''
version: 1
transforms:
- title: 'Remove'
  element:
    uris: ['test.dart']
    function: 'f'
  changes:
    - kind: 'removeParameter'
      index: 0
''');
    var transforms = result.transformsFor('f', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Remove');
    expect(transform.changes, hasLength(1));
    var change = transform.changes[0] as ModifyParameters;
    var modifications = change.modifications;
    expect(modifications, hasLength(1));
    var modification = modifications[0] as RemoveParameter;
    var parameter = modification.parameter as PositionalParameterReference;
    expect(parameter.index, 0);
  }

  void test_rename() {
    parse('''
version: 1
transforms:
- title: 'Rename A'
  element:
    uris:
      - 'test.dart'
    class: 'A'
  changes:
    - kind: 'rename'
      newName: 'B'
''');
    var transforms = result.transformsFor('A', ['test.dart']);
    expect(transforms, hasLength(1));
    var transform = transforms[0];
    expect(transform.title, 'Rename A');
    expect(transform.changes, hasLength(1));
    var rename = transform.changes[0] as Rename;
    expect(rename.newName, 'B');
  }
}
