// 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();
  }

  @override
  void setUp() {
    createAnalysisOptionsFile(experiments: ['extension-methods']);
    super.setUp();
  }

  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_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');
  }
}
