// 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/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/extension_member_contributor.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'completion_contributor_util.dart';

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

@reflectiveTest
class ExtensionMemberContributorTest extends DartCompletionContributorTest {
  @override
  DartCompletionContributor createContributor() {
    return ExtensionMemberContributor();
  }

  Future<void> test_extended_members_inExtension_field() async {
    addTestSource('''
class A {
  int a = 0;
}
class B extends A {
  int b = 0;
}
extension E on B {
  void e() {
    ^
  }
}
''');
    await computeSuggestions();
    assertSuggestField('a', 'int');
    assertSuggestField('b', 'int');
  }

  Future<void> test_extended_members_inExtension_getter_setter() async {
    addTestSource('''
class A {
  int get a => 0;
}
class B extends A {
  set b(int b) { }
}
extension E on B {
  void e() {
    ^
  }
}
''');
    await computeSuggestions();
    assertSuggestGetter('a', 'int');
    assertSuggestSetter('b');
  }

  Future<void> test_extended_members_inExtension_method() async {
    addTestSource('''
class A {
  void a() { }
}
class B extends A {
  void b() { }
}
extension E on B {
  void e() {
    ^
  }
}
''');
    await computeSuggestions();
    assertSuggestMethod('b', 'B', 'void');
    assertSuggestMethod('a', 'A', 'void');
  }

  Future<void> test_extended_members_inExtension_method_paramType() async {
    addTestSource('''
class A<T> {
  T a() => null;
}

extension E on A<int> {
  void e() {
    ^
  }
}
''');
    await computeSuggestions();
    assertSuggestMethod('a', 'A', 'int');
  }

  Future<void> test_extension() async {
    addTestSource('''
extension E on int {}
void f() {
  E.a^
}
''');
    await computeSuggestions();
    assertNoSuggestions();
  }

  Future<void> test_extension_onDynamic() async {
    addTestSource('''
extension E on dynamic {
  void e() {}
}
void f(String s) {
  s.^;
}
''');
    await computeSuggestions();
    assertSuggestMethod('e', null, 'void');
  }

  Future<void> test_extensionOverride_doesNotMatch() async {
    addTestSource('''
extension E on int {
  bool a(int b, int c) {}
  int get b => 0;
  set c(int d) {}
}
void f() {
  E('3').a^
}
''');
    await computeSuggestions();
    assertSuggestMethod('a', null, 'bool', defaultArgListString: 'b, c');
    assertSuggestGetter('b', 'int');
    assertSuggestSetter('c');
  }

  Future<void> test_extensionOverride_matches() async {
    addTestSource('''
extension E on int {
  bool a(int b, int c) {}
  int get b => 0;
  set c(int d) {}
}
void f() {
  E(2).a^
}
''');
    await computeSuggestions();
    assertSuggestMethod('a', null, 'bool', defaultArgListString: 'b, c');
    assertSuggestGetter('b', 'int');
    assertSuggestSetter('c');
  }

  Future<void> test_function_doesNotMatch() async {
    addTestSource('''
extension E<T extends num> on List<T> {
  bool a(int b, int c) {}
  int get b => 0;
  set c(int d) {}
}
List<T> g<T>(T x) => [x];
void f(String s) {
  g(s).a^
}
''');
    await computeSuggestions();
    assertNotSuggested('a');
    assertNotSuggested('b');
    assertNotSuggested('c');
  }

  Future<void> test_function_matches() async {
    addTestSource('''
extension E on int {
  bool a(int b, int c) {}
  int get b => 0;
  set c(int d) {}
}
void f() {
  g().a^
}
int g() => 3;
''');
    await computeSuggestions();
    assertSuggestMethod('a', null, 'bool', defaultArgListString: 'b, c');
    assertSuggestGetter('b', 'int');
    assertSuggestSetter('c');
  }

  Future<void> test_identifier_doesNotMatch() async {
    addTestSource('''
extension E<T extends num> on List<T> {
  bool a(int b, int c) {}
  int get b => 0;
  set c(int d) {}
}
void f(List<String> l) {
  l.a^
}
''');
    await computeSuggestions();
    assertNotSuggested('a');
    assertNotSuggested('b');
    assertNotSuggested('c');
  }

  Future<void> test_identifier_matches() async {
    addTestSource('''
extension E<T extends num> on List<T> {
  bool a(int b, int c) {}
  int get b => 0;
  set c(int d) {}
}
void f(List<int> l) {
  l.a^
}
''');
    await computeSuggestions();
    assertSuggestMethod('a', null, 'bool', defaultArgListString: 'b, c');
    assertSuggestGetter('b', 'int');
    assertSuggestSetter('c');
  }

  Future<void> test_literal_doesNotMatch() async {
    addTestSource('''
extension E on String {
  bool a(int b, int c) {}
  int get b => 0;
  set c(int d) {}
}

void f() {
  0.^
}
''');
    await computeSuggestions();
    assertNotSuggested('a');
    assertNotSuggested('b');
    assertNotSuggested('c');
  }

  Future<void> test_literal_doesNotMatch_generic() async {
    addTestSource('''
extension E<T extends num> on List<T> {
  bool a(int b, int c) {}
  int get b => 0;
  set c(int d) {}
}
void f() {
  ['a'].a^
}
''');
    await computeSuggestions();
    assertNotSuggested('a');
    assertNotSuggested('b');
    assertNotSuggested('c');
  }

  Future<void> test_literal_matches() async {
    addTestSource('''
extension E on int {
  bool a(int b, int c) {}
  int get b => 0;
  set c(int d) {}
}
void f() {
  2.a^
}
''');
    await computeSuggestions();
    assertSuggestMethod('a', null, 'bool', defaultArgListString: 'b, c');
    assertSuggestGetter('b', 'int');
    assertSuggestSetter('c');
  }

  Future<void> test_members_inExtendedClassMethod_getter() async {
    addTestSource('''
class Person {
  void doSomething() {
    ^
  }
}
extension E on Person {
  String get name => '';
  set id(int id) {}
  void work() { }
}
''');
    await computeSuggestions();
    assertSuggestGetter('name', 'String');
  }

  Future<void> test_members_inExtendedClassMethod_method() async {
    addTestSource('''
class Person {
  void doSomething() {
    ^
  }
}
extension E on Person {
  String get name => '';
  set id(int id) {}
  void work() { }
}
''');
    await computeSuggestions();
    assertSuggestMethod('work', null, 'void');
  }

  Future<void> test_members_inExtendedClassMethod_multipleExtensions() async {
    addTestSource('''
class Person {
  void doSomething() {
    ^
  }
}
extension E on Person {
  String get name => '';
}

extension E2 on Person {
  void work() { }
}

''');
    await computeSuggestions();
    assertSuggestGetter('name', 'String');
    assertSuggestMethod('work', null, 'void');
  }

  Future<void> test_members_inExtendedClassMethod_setter() async {
    addTestSource('''
class Person {
  void doSomething() {
    ^
  }
}
extension E on Person {
  String get name => '';
  set id(int id) {}
  void work() { }
}
''');
    await computeSuggestions();
    assertSuggestSetter('id');
  }

  Future<void> test_members_inMixinMethod_method() async {
    addTestSource('''
class Person { }
extension E on Person {
  void work() { }
}

mixin M on Person {
  void f() {
    ^
  }
}
''');
    await computeSuggestions();
    assertSuggestMethod('work', null, 'void');
  }

  Future<void> test_members_with_this_inExtendedClass() async {
    addTestSource('''
class Person {
  void doSomething() {
    this.^
  }
}
extension E on Person {
  String get name => '';
  set id(int id) {}
  void work() { }
}
''');
    await computeSuggestions();
    assertSuggestSetter('id');
    assertSuggestGetter('name', 'String');
    assertSuggestMethod('work', null, 'void');
  }
}
