// Copyright (c) 2017, 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 'dart:async';

import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/generated/parser.dart' as analyzer;
import 'package:analyzer/src/test_utilities/find_element.dart';
import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../../support/abstract_context.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(ArgumentListCompletionTargetTest);
    defineReflectiveTests(CompletionTargetTest);
  });
}

@reflectiveTest
class ArgumentListCompletionTargetTest extends _Base {
  test_Annotation_named() async {
    await createTarget('''
class Foo {
  const Foo({int a, String b});
}

@Foo(b: ^)
main() {}
''');
    assertTarget(
      '',
      'b: ',
      argIndex: 0,
      expectedExecutable: 'Foo.<init>: ({a: int, b: String}) → Foo',
      expectedParameter: 'b: String',
    );
  }

  test_Annotation_positional() async {
    await createTarget('''
class Foo {
  const Foo(int a);
}

@Foo(^)
main() {}
''');
    assertTarget(
      ')',
      '()',
      argIndex: 0,
      expectedExecutable: 'Foo.<init>: (int) → Foo',
      expectedParameter: 'a: int',
    );
  }

  test_InstanceCreationExpression_explicitNew_unresolved() async {
    await createTarget('''
main() {
  new Foo(^)
}
''');
    assertTarget(')', '()', argIndex: 0);
  }

  test_InstanceCreationExpression_generic_explicitTypeArgument() async {
    await createTarget('''
class Foo<T> {
  Foo(T a, T b);
}

main() {
  Foo<int>(^)
}
''');
    assertTarget(
      ')',
      '()',
      argIndex: 0,
      expectedExecutable: 'Foo.<init>: (int, int) → Foo<int>',
      expectedParameter: 'a: int',
    );
  }

  test_InstanceCreationExpression_generic_inferredTypeArgument() async {
    await createTarget('''
class Foo<T> {
  Foo(T a, T b);
}

main() {
  Foo(false, ^)
}
''');
    assertTarget(
      ')',
      '(false)',
      argIndex: 1,
      expectedExecutable: 'Foo.<init>: (bool, bool) → Foo<bool>',
      expectedParameter: 'b: bool',
    );
  }

  test_InstanceCreationExpression_named() async {
    await createTarget('''
class Foo {
  Foo({int a, String b, double c});
}

main() {
  Foo(b: ^)
}
''');
    assertTarget(
      '',
      'b: ',
      argIndex: 0,
      expectedExecutable: 'Foo.<init>: ({a: int, b: String, c: double}) → Foo',
      expectedParameter: 'b: String',
    );
  }

  test_InstanceCreationExpression_named_unresolved() async {
    await createTarget('''
class Foo {
  Foo({int a});
}

main() {
  Foo(b: ^)
}
''');
    assertTarget(
      '',
      'b: ',
      argIndex: 0,
      expectedExecutable: 'Foo.<init>: ({a: int}) → Foo',
    );
  }

  test_InstanceCreationExpression_namedConstructor() async {
    await createTarget('''
class Foo {
  Foo.named(int a, String b, double c);
}

main() {
  Foo.named(0, ^)
}
''');
    assertTarget(
      ')',
      '(0)',
      argIndex: 1,
      expectedExecutable: 'Foo.named: (int, String, double) → Foo',
      expectedParameter: 'b: String',
    );
  }

  test_InstanceCreationExpression_positional() async {
    await createTarget('''
class Foo {
  Foo(int a);
}

main() {
  Foo(^)
}
''');
    assertTarget(
      ')',
      '()',
      argIndex: 0,
      expectedExecutable: 'Foo.<init>: (int) → Foo',
      expectedParameter: 'a: int',
    );
  }

  test_InstanceCreationExpression_positional_isFunctional() async {
    await createTarget('''
class Foo {
  Foo(int Function(String) f);
}

main() {
  Foo(^)
}
''');
    assertTarget(
      ')',
      '()',
      argIndex: 0,
      expectedExecutable: 'Foo.<init>: ((String) → int) → Foo',
      expectedParameter: 'f: (String) → int',
      isFunctionalArgument: true,
    );
  }

  test_InstanceCreationExpression_positional_noParameter0() async {
    await createTarget('''
class Foo {}

main() {
  Foo(^)
}
''');
    assertTarget(
      ')',
      '()',
      argIndex: 0,
      expectedExecutable: 'Foo.<init>: () → Foo',
    );
  }

  test_InstanceCreationExpression_positional_noParameter1() async {
    await createTarget('''
class Foo {}

main() {
  Foo(a, ^)
}
''');
    assertTarget(
      ')',
      '(a)',
      argIndex: 1,
      expectedExecutable: 'Foo.<init>: () → Foo',
    );
  }

  test_MethodInvocation_named() async {
    await createTarget('''
int foo({int a, String b, double c}) {}

main() {
  foo(b: ^)
}
''');
    assertTarget(
      '',
      'b: ',
      argIndex: 0,
      expectedExecutable: 'foo: ({a: int, b: String, c: double}) → int',
      expectedParameter: 'b: String',
    );
  }

  test_MethodInvocation_named_isFunctional() async {
    await createTarget('''
int foo({int Function(String) f}) {}

main() {
  foo(f: ^)
}
''');
    assertTarget(
      '',
      'f: ',
      argIndex: 0,
      expectedExecutable: 'foo: ({f: (String) → int}) → int',
      expectedParameter: 'f: (String) → int',
      isFunctionalArgument: true,
    );
  }

  test_MethodInvocation_named_unresolved() async {
    await createTarget('''
int foo({int a}) {}

main() {
  foo(b: ^)
}
''');
    assertTarget(
      '',
      'b: ',
      argIndex: 0,
      expectedExecutable: 'foo: ({a: int}) → int',
    );
  }

  test_MethodInvocation_positional2() async {
    await createTarget('''
int foo(int a, String b) {}

main() {
  foo(0, ^)
}
''');
    assertTarget(
      ')',
      '(0)',
      argIndex: 1,
      expectedExecutable: 'foo: (int, String) → int',
      expectedParameter: 'b: String',
    );
  }

  test_MethodInvocation_positional_isFunctional() async {
    await createTarget('''
int foo(int Function(String) f) {}

main() {
  foo(^)
}
''');
    assertTarget(
      ')',
      '()',
      argIndex: 0,
      expectedExecutable: 'foo: ((String) → int) → int',
      expectedParameter: 'f: (String) → int',
      isFunctionalArgument: true,
    );
  }

  test_MethodInvocation_positional_isFunctional2() async {
    await createTarget('''
class C {
  int foo(int Function(String) f) {}
}

main(C c) {
  c.foo(^)
}
''');
    assertTarget(
      ')',
      '()',
      argIndex: 0,
      expectedExecutable: 'C.foo: ((String) → int) → int',
      expectedParameter: 'f: (String) → int',
      isFunctionalArgument: true,
    );
  }

  test_MethodInvocation_positional_withPrefix() async {
    await createTarget('''
int foo(int a, String b) {}

main() {
  foo(n^)
}
''');
    assertTarget(
      'n',
      '(n)',
      argIndex: 0,
      expectedExecutable: 'foo: (int, String) → int',
      expectedParameter: 'a: int',
    );
  }

  test_MethodInvocation_positional_withPrefix2() async {
    await createTarget('''
int foo(int a, String b) {}

main() {
  foo((n)^)
}
''');
    assertTarget(
      ')',
      '((n))',
      argIndex: 0,
      expectedExecutable: 'foo: (int, String) → int',
      expectedParameter: 'a: int',
    );
  }

  test_MethodInvocation_positional_withSuffix() async {
    await createTarget('''
int foo(int a, String b) {}

main() {
  foo(^n)
}
''');
    assertTarget(
      'n',
      '(n)',
      argIndex: 0,
      expectedExecutable: 'foo: (int, String) → int',
      expectedParameter: 'a: int',
    );
  }

  test_MethodInvocation_unresolved() async {
    await createTarget('''
main() {
  foo(^)
}
''');
    assertTarget(')', '()', argIndex: 0);
  }

  test_not_ListLiteral() async {
    await createTarget('''
main() {
  print([^]);
}
''');
    expect(target.argIndex, isNull);
    expect(target.executableElement, isNull);
    expect(target.parameterElement, isNull);
  }
}

@reflectiveTest
class CompletionTargetTest extends _Base {
  test_AsExpression_identifier() async {
    // SimpleIdentifier  TypeName  AsExpression
    await createTarget(
        'class A {var b; X _c; foo() {var a; (a^ as String).foo();}');
    assertTarget('a as String', '(a as String)');
  }

  test_AsExpression_keyword() async {
    // SimpleIdentifier  TypeName  AsExpression
    await createTarget(
        'class A {var b; X _c; foo() {var a; (a ^as String).foo();}');
    assertTarget('as', 'a as String');
  }

  test_AsExpression_keyword2() async {
    // SimpleIdentifier  TypeName  AsExpression
    await createTarget(
        'class A {var b; X _c; foo() {var a; (a a^s String).foo();}');
    assertTarget('as', 'a as String');
  }

  test_AsExpression_keyword3() async {
    // SimpleIdentifier  TypeName  AsExpression
    await createTarget(
        'class A {var b; X _c; foo() {var a; (a as^ String).foo();}');
    assertTarget('as', 'a as String');
  }

  test_AsExpression_type() async {
    // SimpleIdentifier  TypeName  AsExpression
    await createTarget(
        'class A {var b; X _c; foo() {var a; (a as ^String).foo();}');
    assertTarget('String', 'a as String');
  }

  test_Block() async {
    // Block
    await createTarget('main() {^}');
    assertTarget('}', '{}');
  }

  test_Block_keyword() async {
    await createTarget(
        'class C { static C get instance => null; } main() {C.in^}');
    assertTarget('in', 'C.in');
  }

  test_Block_keyword2() async {
    await createTarget(
        'class C { static C get instance => null; } main() {C.i^n}');
    assertTarget('in', 'C.in');
  }

  test_FormalParameter_partialType() async {
    // SimpleIdentifier  PrefixedIdentifier  TypeName
    await createTarget('foo(b.^ f) { }');
    assertTarget('f', 'b.f');
  }

  test_FormalParameter_partialType2() async {
    // SimpleIdentifier  PrefixedIdentifier  TypeName
    await createTarget('foo(b.z^ f) { }');
    assertTarget('z', 'b.z');
  }

  test_FormalParameter_partialType3() async {
    // SimpleIdentifier  PrefixedIdentifier  TypeName
    await createTarget('foo(b.^) { }');
    assertTarget('', 'b.');
  }

  test_FormalParameterList() async {
    // Token  FormalParameterList  FunctionExpression
    await createTarget('foo(^) { }');
    assertTarget(')', '()');
  }

  test_FunctionDeclaration_inLineComment() async {
    // Comment  CompilationUnit
    await createTarget('''
      // normal comment ^
      zoo(z) { } String name;''');
    assertTarget('// normal comment ', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_inLineComment2() async {
    // Comment  CompilationUnit
    await createTarget('''
      // normal ^comment
      zoo(z) { } String name;''');
    assertTarget('// normal comment', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_inLineComment3() async {
    // Comment  CompilationUnit
    await createTarget('''
      // normal comment ^
      // normal comment 2
      zoo(z) { } String name;''');
    assertTarget('// normal comment ', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_inLineComment4() async {
    // Comment  CompilationUnit
    await createTarget('''
      // normal comment
      // normal comment 2^
      zoo(z) { } String name;''');
    assertTarget('// normal comment 2', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_inLineDocComment() async {
    // Comment  FunctionDeclaration  CompilationUnit
    await createTarget('''
      /// some dartdoc ^
      zoo(z) { } String name;''');
    assertTarget('/// some dartdoc ', '');
    expect(target.containingNode is Comment, isTrue);
    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
  }

  test_FunctionDeclaration_inLineDocComment2() async {
    // Comment  FunctionDeclaration  CompilationUnit
    await createTarget('''
      /// some ^dartdoc
      zoo(z) { } String name;''');
    assertTarget('/// some dartdoc', '');
    expect(target.containingNode is Comment, isTrue);
    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
  }

  test_FunctionDeclaration_inStarComment() async {
    // Comment  CompilationUnit
    await createTarget('/* ^ */ zoo(z) {} String name;');
    assertTarget('/*  */', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_inStarComment2() async {
    // Comment  CompilationUnit
    await createTarget('/*  *^/ zoo(z) {} String name;');
    assertTarget('/*  */', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_inStarDocComment() async {
    // Comment  FunctionDeclaration  CompilationUnit
    await createTarget('/** ^ */ zoo(z) { } String name;');
    assertTarget('/**  */', '');
    expect(target.containingNode is Comment, isTrue);
    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
  }

  test_FunctionDeclaration_inStarDocComment2() async {
    // Comment  FunctionDeclaration  CompilationUnit
    await createTarget('/**  *^/ zoo(z) { } String name;');
    assertTarget('/**  */', '');
    expect(target.containingNode is Comment, isTrue);
    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
  }

  test_FunctionDeclaration_returnType() async {
    // CompilationUnit
    await createTarget('^ zoo(z) { } String name;');
    assertTarget('zoo(z) {}', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_returnType_afterLineComment() async {
    // FunctionDeclaration  CompilationUnit
    await createTarget('''
      // normal comment
      ^ zoo(z) {} String name;''');
    assertTarget('zoo(z) {}', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_returnType_afterLineComment2() async {
    // FunctionDeclaration  CompilationUnit
    // TOD(danrubel) left align all test source
    await createTarget('''
// normal comment
^ zoo(z) {} String name;''');
    assertTarget('zoo(z) {}', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_returnType_afterLineDocComment() async {
    // SimpleIdentifier  FunctionDeclaration  CompilationUnit
    await createTarget('''
      /// some dartdoc
      ^ zoo(z) { } String name; ''');
    assertTarget('zoo', 'zoo(z) {}');
  }

  test_FunctionDeclaration_returnType_afterLineDocComment2() async {
    // SimpleIdentifier  FunctionDeclaration  CompilationUnit
    await createTarget('''
/// some dartdoc
^ zoo(z) { } String name;''');
    assertTarget('zoo', 'zoo(z) {}');
  }

  test_FunctionDeclaration_returnType_afterStarComment() async {
    // CompilationUnit
    await createTarget('/* */ ^ zoo(z) { } String name;');
    assertTarget('zoo(z) {}', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_returnType_afterStarComment2() async {
    // CompilationUnit
    await createTarget('/* */^ zoo(z) { } String name;');
    assertTarget('zoo(z) {}', 'zoo(z) {} String name;');
  }

  test_FunctionDeclaration_returnType_afterStarDocComment() async {
    // FunctionDeclaration  CompilationUnit
    await createTarget('/** */ ^ zoo(z) { } String name;');
    assertTarget('zoo', 'zoo(z) {}');
  }

  test_FunctionDeclaration_returnType_afterStarDocComment2() async {
    // FunctionDeclaration  CompilationUnit
    await createTarget('/** */^ zoo(z) { } String name;');
    assertTarget('zoo', 'zoo(z) {}');
  }

  test_IfStatement_droppedToken() async {
    // Comment  ClassDeclaration  CompilationUnit
    await createTarget('main() { if (v i^) }');
    if (usingFastaParser) {
      assertTarget(')', 'if (v) ;', droppedToken: 'i');
    } else {
      assertTarget('i;', 'if (v) i;');
    }
  }

  test_InstanceCreationExpression_identifier() async {
    // InstanceCreationExpression  ExpressionStatement  Block
    await createTarget('class C {foo(){var f; {var x;} new ^C();}}');
    assertTarget('C', 'new C()');
  }

  test_InstanceCreationExpression_keyword() async {
    // InstanceCreationExpression  ExpressionStatement  Block
    await createTarget('class C {foo(){var f; {var x;} new^ }}');
    assertTarget('new ();', '{var f; {var x;} new ();}');
  }

  test_InstanceCreationExpression_keyword2() async {
    // InstanceCreationExpression  ExpressionStatement  Block
    await createTarget('class C {foo(){var f; {var x;} new^ C();}}');
    assertTarget('new C();', '{var f; {var x;} new C();}');
  }

  test_MapLiteralEntry() async {
    // MapLiteralEntry  MapLiteral  VariableDeclaration
    await createTarget('foo = {^');
    // fasta scanner inserts synthetic closing '}'
    assertTarget('}', '{}');
  }

  test_MapLiteralEntry1() async {
    // MapLiteralEntry  MapLiteral  VariableDeclaration
    await createTarget('foo = {1: 2, T^');
    assertTarget('T : ', '{1 : 2, T : }');
  }

  test_MapLiteralEntry2() async {
    // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
    await createTarget('foo = {7:T^};');
    assertTarget('T', '7 : T');
  }

  test_MethodDeclaration_inLineComment() async {
    // Comment  ClassDeclaration  CompilationUnit
    await createTarget('''
      class C2 {
        // normal comment ^
        zoo(z) { } String name; }''');
    assertTarget('// normal comment ', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_inLineComment2() async {
    // Comment  ClassDeclaration  CompilationUnit
    await createTarget('''
      class C2 {
        // normal ^comment
        zoo(z) { } String name; }''');
    assertTarget('// normal comment', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_inLineComment3() async {
    // Comment  ClassDeclaration  CompilationUnit
    await createTarget('''
      class C2 {
        // normal comment ^
        // normal comment 2
        zoo(z) { } String name; }''');
    assertTarget('// normal comment ', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_inLineComment4() async {
    // Comment  ClassDeclaration  CompilationUnit
    await createTarget('''
      class C2 {
        // normal comment
        // normal comment 2^
        zoo(z) { } String name; }''');
    assertTarget('// normal comment 2', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_inLineDocComment() async {
    // Comment  MethodDeclaration  ClassDeclaration  CompilationUnit
    await createTarget('''
      class C2 {
        /// some dartdoc ^
        zoo(z) { } String name; }''');
    assertTarget('/// some dartdoc ', '');
    expect(target.containingNode is Comment, isTrue);
    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
  }

  test_MethodDeclaration_inLineDocComment2() async {
    // Comment  MethodDeclaration  ClassDeclaration  CompilationUnit
    await createTarget('''
      class C2 {
        /// some ^dartdoc
        zoo(z) { } String name; }''');
    assertTarget('/// some dartdoc', '');
    expect(target.containingNode is Comment, isTrue);
    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
  }

  test_MethodDeclaration_inStarComment() async {
    // Comment  ClassDeclaration  CompilationUnit
    await createTarget('class C2 {/* ^ */ zoo(z) {} String name;}');
    assertTarget('/*  */', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_inStarComment2() async {
    // Comment  ClassDeclaration  CompilationUnit
    await createTarget('class C2 {/*  *^/ zoo(z) {} String name;}');
    assertTarget('/*  */', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_inStarDocComment() async {
    // Comment  MethodDeclaration  ClassDeclaration  CompilationUnit
    await createTarget('class C2 {/** ^ */ zoo(z) { } String name; }');
    assertTarget('/**  */', '');
    expect(target.containingNode is Comment, isTrue);
    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
  }

  test_MethodDeclaration_inStarDocComment2() async {
    // Comment  MethodDeclaration  ClassDeclaration  CompilationUnit
    await createTarget('class C2 {/**  *^/ zoo(z) { } String name; }');
    assertTarget('/**  */', '');
    expect(target.containingNode is Comment, isTrue);
    expect(target.containingNode.parent.toSource(), 'zoo(z) {}');
  }

  test_MethodDeclaration_returnType() async {
    // ClassDeclaration  CompilationUnit
    await createTarget('class C2 {^ zoo(z) { } String name; }');
    assertTarget('zoo(z) {}', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_returnType_afterLineComment() async {
    // MethodDeclaration  ClassDeclaration  CompilationUnit
    await createTarget('''
      class C2 {
        // normal comment
        ^ zoo(z) {} String name;}''');
    assertTarget('zoo(z) {}', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_returnType_afterLineComment2() async {
    // MethodDeclaration  ClassDeclaration  CompilationUnit
    // TOD(danrubel) left align all test source
    await createTarget('''
class C2 {
  // normal comment
^ zoo(z) {} String name;}''');
    assertTarget('zoo(z) {}', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_returnType_afterLineDocComment() async {
    // SimpleIdentifier  MethodDeclaration  ClassDeclaration  CompilationUnit
    await createTarget('''
      class C2 {
        /// some dartdoc
        ^ zoo(z) { } String name; }''');
    assertTarget('zoo', 'zoo(z) {}');
  }

  test_MethodDeclaration_returnType_afterLineDocComment2() async {
    // SimpleIdentifier  MethodDeclaration  ClassDeclaration  CompilationUnit
    await createTarget('''
class C2 {
  /// some dartdoc
^ zoo(z) { } String name; }''');
    assertTarget('zoo', 'zoo(z) {}');
  }

  test_MethodDeclaration_returnType_afterStarComment() async {
    // ClassDeclaration  CompilationUnit
    await createTarget('class C2 {/* */ ^ zoo(z) { } String name; }');
    assertTarget('zoo(z) {}', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_returnType_afterStarComment2() async {
    // ClassDeclaration  CompilationUnit
    await createTarget('class C2 {/* */^ zoo(z) { } String name; }');
    assertTarget('zoo(z) {}', 'class C2 {zoo(z) {} String name;}');
  }

  test_MethodDeclaration_returnType_afterStarDocComment() async {
    // MethodDeclaration  ClassDeclaration  CompilationUnit
    await createTarget('class C2 {/** */ ^ zoo(z) { } String name; }');
    assertTarget('zoo', 'zoo(z) {}');
  }

  test_MethodDeclaration_returnType_afterStarDocComment2() async {
    // MethodDeclaration  ClassDeclaration  CompilationUnit
    await createTarget('class C2 {/** */^ zoo(z) { } String name; }');
    assertTarget('zoo', 'zoo(z) {}');
  }

  test_SwitchStatement_c() async {
    // Token('c') SwitchStatement
    await createTarget('main() { switch(x) {c^} }');
    assertTarget('}', 'switch (x) {}', droppedToken: 'c');
  }

  test_SwitchStatement_c2() async {
    // Token('c') SwitchStatement
    await createTarget('main() { switch(x) { c^ } }');
    assertTarget('}', 'switch (x) {}', droppedToken: 'c');
  }

  test_SwitchStatement_empty() async {
    // SwitchStatement
    await createTarget('main() { switch(x) {^} }');
    assertTarget('}', 'switch (x) {}');
  }

  test_SwitchStatement_empty2() async {
    // SwitchStatement
    await createTarget('main() { switch(x) { ^ } }');
    assertTarget('}', 'switch (x) {}');
  }

  test_TypeArgumentList() async {
    // TypeName  TypeArgumentList  TypeName
    await createTarget('main() { C<^> c; }');
    assertTarget('', '<>');
  }

  test_TypeArgumentList2() async {
    // TypeName  TypeArgumentList  TypeName
    await createTarget('main() { C<C^> c; }');
    assertTarget('C', '<C>');
  }

  test_VariableDeclaration_lhs_identifier_after() async {
    // VariableDeclaration  VariableDeclarationList
    await createTarget('main() {int b^ = 1;}');
    assertTarget('b = 1', 'int b = 1');
  }

  test_VariableDeclaration_lhs_identifier_before() async {
    // VariableDeclaration  VariableDeclarationList
    await createTarget('main() {int ^b = 1;}');
    assertTarget('b = 1', 'int b = 1');
  }
}

class _Base extends AbstractContextTest {
  int offset;
  CompletionTarget target;
  FindElement findElement;

  bool get usingFastaParser => analyzer.Parser.useFasta;

  void assertTarget(
    String entityText,
    String nodeText, {
    int argIndex: null,
    String droppedToken,
    bool isFunctionalArgument: false,
    String expectedExecutable,
    String expectedParameter,
  }) {
    expect(
      target.entity.toString(),
      entityText,
      reason: 'entity',
    );

    expect(
      target.containingNode.toString(),
      nodeText,
      reason: 'containingNode',
    );

    expect(
      target.argIndex,
      argIndex,
      reason: 'argIndex',
    );

    expect(
      target.droppedToken?.toString(),
      droppedToken ?? isNull,
      reason: 'droppedToken',
    );

    var actualExecutable = target.executableElement;
    if (expectedExecutable == null) {
      expect(actualExecutable, isNull);
    } else {
      expect(_executableStr(actualExecutable), expectedExecutable);
    }

    var actualParameter = target.parameterElement;
    if (expectedParameter == null) {
      expect(actualParameter, isNull);
    } else {
      expect(_parameterStr(actualParameter), expectedParameter);
    }

    expect(target.isFunctionalArgument(), isFunctionalArgument);
  }

  Future<void> createTarget(String content) async {
    expect(offset, isNull, reason: 'Call createTarget exactly once');

    offset = content.indexOf('^');
    expect(offset, isNot(equals(-1)), reason: 'missing ^');

    int nextOffset = content.indexOf('^', offset + 1);
    expect(nextOffset, equals(-1), reason: 'too many ^');

    content = content.substring(0, offset) + content.substring(offset + 1);

    var path = convertPath('/home/test/lib/test.dart');
    newFile(path, content: content);

    var result = await driver.getResult(path);
    findElement = FindElement(result.unit);

    target = new CompletionTarget.forOffset(result.unit, offset);
  }

  static String _executableNameStr(ExecutableElement executable) {
    var executableEnclosing = executable.enclosingElement;
    if (executableEnclosing is CompilationUnitElement) {
      return executable.name;
    } else if (executable is ConstructorElement) {
      if (executable.name == '') {
        return '${executableEnclosing.name}.<init>';
      } else {
        return '${executableEnclosing.name}.${executable.name}';
      }
    } else if (executable is MethodElement) {
      return '${executableEnclosing.name}.${executable.name}';
    }
    fail('Unexpected element: $executable');
  }

  static String _executableStr(ExecutableElement element) {
    var executableStr = _executableNameStr(element);

    return '$executableStr: ${element.type}';
  }

  static String _parameterStr(ParameterElement element) {
    return '${element.name}: ${element.type}';
  }
}
