// Copyright (c) 2018, 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/protocol_server.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../analysis_abstract.dart';
import '../mocks.dart';

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

@reflectiveTest
class AnalysisSignatureTest extends AbstractAnalysisTest {
  Future<Response> prepareRawSignature(String search) {
    var offset = findOffset(search);
    return prepareRawSignatureAt(offset);
  }

  Future<Response> prepareRawSignatureAt(int offset, {String? file}) async {
    await waitForTasksFinished();
    var request =
        AnalysisGetSignatureParams(file ?? testFile, offset).toRequest('0');
    return waitResponse(request);
  }

  Future<AnalysisGetSignatureResult> prepareSignature(String search) {
    var offset = findOffset(search);
    return prepareSignatureAt(offset);
  }

  Future<AnalysisGetSignatureResult> prepareSignatureAt(int offset,
      {String? file}) async {
    var response = await prepareRawSignatureAt(offset, file: file);
    return AnalysisGetSignatureResult.fromResponse(response);
  }

  @override
  Future<void> setUp() async {
    super.setUp();
    await createProject();
  }

  Future<void> test_constructor() async {
    addTestFile('''
/// MyClass doc
class MyClass {
  /// MyClass constructor doc
  MyClass(String name, {int length}) {}
}
main() {
  var a = new MyClass("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('MyClass'));
    expect(result.dartdoc, equals('MyClass constructor doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(result.parameters[1],
        equals(ParameterInfo(ParameterKind.OPTIONAL_NAMED, 'length', 'int')));
  }

  Future<void> test_constructor_factory() async {
    addTestFile('''
/// MyClass doc
class MyClass {
  /// MyClass private constructor doc
  MyClass._() {}
  /// MyClass factory constructor doc
  factory MyClass(String name, {int length}) {
    return new MyClass._();
  }
}
main() {
  var a = new MyClass("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('MyClass'));
    expect(result.dartdoc, equals('MyClass factory constructor doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(result.parameters[1],
        equals(ParameterInfo(ParameterKind.OPTIONAL_NAMED, 'length', 'int')));
  }

  Future<void> test_constructor_named() async {
    addTestFile('''
/// MyClass doc
class MyClass {
  /// MyClass.foo constructor doc
  MyClass.foo(String name, {int length}) {}
}
main() {
  var a = new MyClass.foo("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('MyClass.foo'));
    expect(result.dartdoc, equals('MyClass.foo constructor doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(result.parameters[1],
        equals(ParameterInfo(ParameterKind.OPTIONAL_NAMED, 'length', 'int')));
  }

  Future<void> test_does_not_walk_up_over_closure() async {
    addTestFile('''
one(String name, int length) {}
main() {
  one("Danny", () {
    /*^*/
  });
}
''');
    var result = await prepareRawSignature('/*^*/');
    var error = result.error!;
    expect(error.code, equals(RequestErrorCode.GET_SIGNATURE_UNKNOWN_FUNCTION));
  }

  Future<void> test_error_file_not_analyzed() async {
    var result = await prepareRawSignatureAt(0,
        file: convertPath('/not/in/project.dart'));
    var error = result.error!;
    expect(error.code, equals(RequestErrorCode.GET_SIGNATURE_INVALID_FILE));
  }

  Future<void> test_error_function_unknown() async {
    addTestFile('''
someFunc(/*^*/);
''');
    var result = await prepareRawSignature('/*^*/');
    var error = result.error!;
    expect(error.code, equals(RequestErrorCode.GET_SIGNATURE_UNKNOWN_FUNCTION));
  }

  Future<void> test_error_offset_invalid() async {
    addTestFile('''
a() {}
''');
    var result = await prepareRawSignatureAt(1000);
    var error = result.error!;
    expect(error.code, equals(RequestErrorCode.GET_SIGNATURE_INVALID_OFFSET));
  }

  Future<void> test_function_expression() async {
    addTestFile('''
/// f doc
int Function(String) f(String s) => (int i) => int.parse(s) + i;
main() {
  print(f('3'/*^*/)(2));
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('f'));
    expect(result.dartdoc, equals('f doc'));
    expect(result.parameters, hasLength(1));
    expect(
        result.parameters[0],
        equals(
            ParameterInfo(ParameterKind.REQUIRED_POSITIONAL, 's', 'String')));
  }

  Future<void> test_function_from_other_file() async {
    newFile2('/project/bin/other.dart', '''
/// one doc
one(String name, int length) {}
main() {
  one("Danny", /*^*/);
}
''');
    addTestFile('''
import 'other.dart';
main() {
  one("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(
        result.parameters[1],
        equals(
            ParameterInfo(ParameterKind.REQUIRED_POSITIONAL, 'length', 'int')));
  }

  Future<void> test_function_irrelevant_parens() async {
    addTestFile('''
/// one doc
one(String name, int length) {}
main() {
  one("Danny", (((1 * 2/*^*/))));
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(
        result.parameters[1],
        equals(
            ParameterInfo(ParameterKind.REQUIRED_POSITIONAL, 'length', 'int')));
  }

  Future<void> test_function_named() async {
    addTestFile('''
/// one doc
one(String name, {int length}) {}
main() {
  one("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(result.parameters[1],
        equals(ParameterInfo(ParameterKind.OPTIONAL_NAMED, 'length', 'int')));
  }

  Future<void> test_function_named_with_default_int() async {
    addTestFile('''
/// one doc
one(String name, {int length = 1}) {}
main() {
  one("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(
        result.parameters[1],
        equals(ParameterInfo(ParameterKind.OPTIONAL_NAMED, 'length', 'int',
            defaultValue: '1')));
  }

  Future<void> test_function_named_with_default_string() async {
    addTestFile('''
/// one doc
one(String name, {String email = "a@b.c"}) {}
main() {
  one("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(
        result.parameters[1],
        equals(ParameterInfo(ParameterKind.OPTIONAL_NAMED, 'email', 'String',
            defaultValue: '"a@b.c"')));
  }

  Future<void> test_function_nested_call_inner() async {
    // eg. foo(bar(1, 2));
    addTestFile('''
/// one doc
one(String one) {}
/// two doc
String two(String two) { return ""; }
main() {
  one(two(/*^*/));
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('two'));
    expect(result.dartdoc, equals('two doc'));
    expect(result.parameters, hasLength(1));
    expect(
        result.parameters[0],
        equals(
            ParameterInfo(ParameterKind.REQUIRED_POSITIONAL, 'two', 'String')));
  }

  Future<void> test_function_nested_call_outer() async {
    // eg. foo(bar(1, 2));
    addTestFile('''
/// one doc
one(String one) {}
/// two doc
String two(String two) { return ""; }
main() {
  one(two(),/*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(1));
    expect(
        result.parameters[0],
        equals(
            ParameterInfo(ParameterKind.REQUIRED_POSITIONAL, 'one', 'String')));
  }

  Future<void> test_function_no_dart_doc() async {
    addTestFile('''
one(String name, int length) {}
main() {
  one("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, isNull);
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(
        result.parameters[1],
        equals(
            ParameterInfo(ParameterKind.REQUIRED_POSITIONAL, 'length', 'int')));
  }

  Future<void> test_function_optional() async {
    addTestFile('''
/// one doc
one(String name, [int length]) {}
main() {
  one("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(
        result.parameters[1],
        equals(
            ParameterInfo(ParameterKind.OPTIONAL_POSITIONAL, 'length', 'int')));
  }

  Future<void> test_function_optional_with_default() async {
    addTestFile('''
/// one doc
one(String name, [int length = 11]) {}
main() {
  one("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(
        result.parameters[1],
        equals(ParameterInfo(ParameterKind.OPTIONAL_POSITIONAL, 'length', 'int',
            defaultValue: '11')));
  }

  Future<void> test_function_required() async {
    addTestFile('''
/// one doc
one(String name, int length) {}
main() {
  one("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(
        result.parameters[1],
        equals(
            ParameterInfo(ParameterKind.REQUIRED_POSITIONAL, 'length', 'int')));
  }

  Future<void> test_function_zero_arguments() async {
    addTestFile('''
/// one doc
one() {}
main() {
  one(/*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('one'));
    expect(result.dartdoc, equals('one doc'));
    expect(result.parameters, hasLength(0));
  }

  Future<void> test_invalidFilePathFormat_notAbsolute() async {
    var request = AnalysisGetSignatureParams('test.dart', 0).toRequest('0');
    var response = await waitResponse(request);
    expect(
      response,
      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
    );
  }

  Future<void> test_invalidFilePathFormat_notNormalized() async {
    var request =
        AnalysisGetSignatureParams(convertPath('/foo/../bar/test.dart'), 0)
            .toRequest('0');
    var response = await waitResponse(request);
    expect(
      response,
      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
    );
  }

  Future<void> test_method_instance() async {
    addTestFile('''
/// MyClass doc
class MyClass {
  /// MyClass constructor doc
  MyClass(String name, {int length}) {}
  /// MyClass instance method
  myMethod(String name, {int length}) {}
}
main() {
  var a = new MyClass("Danny");
  a.myMethod("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('myMethod'));
    expect(result.dartdoc, equals('MyClass instance method'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(result.parameters[1],
        equals(ParameterInfo(ParameterKind.OPTIONAL_NAMED, 'length', 'int')));
  }

  Future<void> test_method_static() async {
    addTestFile('''
/// MyClass doc
class MyClass {
  /// MyClass constructor doc
  MyClass(String name, {int length}) {}
  /// MyClass static method
  static void myStaticMethod(String name, {int length}) {}
}
main() {
  MyClass.myStaticMethod("Danny", /*^*/);
}
''');
    var result = await prepareSignature('/*^*/');
    expect(result.name, equals('myStaticMethod'));
    expect(result.dartdoc, equals('MyClass static method'));
    expect(result.parameters, hasLength(2));
    expect(
        result.parameters[0],
        equals(ParameterInfo(
            ParameterKind.REQUIRED_POSITIONAL, 'name', 'String')));
    expect(result.parameters[1],
        equals(ParameterInfo(ParameterKind.OPTIONAL_NAMED, 'length', 'int')));
  }
}
