// 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:collection';

import 'package:test/test.dart';

import 'completion_test_support.dart';

void main() {
  var builder = CompletionTestBuilder();
  builder.buildAll();
}

/// A builder that builds the completion tests.
class CompletionTestBuilder {
  /// Number of tests that have been built that are expected to pass.
  int expectedPassCount = 0;

  /// Number of tests that have been built that are expected to fail.
  int expectedFailCount = 0;

  void buildAll() {
    buildNumberedTests();
    buildCommentSnippetTests();
    buildCompletionTests();
    buildOtherTests();
    buildLibraryTests();
    var testCount = expectedPassCount + expectedFailCount;
    print(
        'Total $testCount tests, of which $expectedFailCount are expected to fail.');
  }

  void buildCommentSnippetTests() {
    buildTests('testCommentSnippets001', '''
class X {static final num MAX = 0;num yc,xc;mth() {xc = yc = MA!1X;x!2c.abs();num f = M!3AX;}}''',
        <String>['1+MAX', '2+xc', '3+MAX']);

    buildTests('testCommentSnippets002', '''
class Y {String x='hi';mth() {x.l!1ength;int n = 0;x!2.codeUnitAt(n!3);}}''',
        <String>['1+length', '2+x', '3+n']);

    buildTests('testCommentSnippets004', '''
class A {!1int x; !2mth() {!3int y = this.!5x!6;}}class B{}''',
        <String>['1+A', '2+B', '3+x', '3-y', '5+mth', '6+x']);

    buildTests('testCommentSnippets005', '''
class Date { static Date JUN, JUL;}class X { m() { return Da!1te.JU!2L; }}''',
        <String>['1+Date', '2+JUN', '2+JUL']);

    buildTests('testCommentSnippets007', '''
class C {mth(Map x, !1) {}mtf(!2, Map x) {}m() {for (in!3t i=0; i<5; i++); A!4 x;}}class int{}class Arrays{}''',
        <String>['1+bool', '2+bool', '3+int', '4+Arrays']);

    buildTests('testCommentSnippets008', '''
class Date{}final num M = Dat!1''', <String>['1+Date']);

    // space, char, eol are important
    buildTests(
        'testCommentSnippets009',
        '''
class Maps{}class x extends!5 !2M!3 !4implements!6 !1\n{}''',
        <String>[
          '1+Map',
          '2+Maps',
          '3+Maps',
          '4-Maps',
          '4+implements',
          '5-Maps',
          '6-Map',
          '6+implements'
        ],
        failingTests: '46');

    // space, char, eol are important
    buildTests('testCommentSnippets010', '''
class x implements !1{}''', <String>['1+Map']);

    // space, char, eol are important
    buildTests('testCommentSnippets011', '''
class x implements M!1{}''', <String>['1+Map']);

    // space, char, eol are important
    buildTests('testCommentSnippets012', '''
class x implements M!1\n{}''', <String>['1+Map']);

    buildTests('testCommentSnippets013', '''
class x !2{!1}!3''', <String>['1+num', '2-num', '3+num']);

    // trailing space is important
    buildTests('testCommentSnippets014', '''
typedef n!1 ;''', <String>['1+num']);

    buildTests('testCommentSnippets015', '''
class D {f(){} g(){f!1(f!2);}}''', <String>['1+f', '2+f']);

    buildTests('testCommentSnippets016', '''
class F {m() { m(); !1}}''', <String>['1+m']);

    buildTests('testCommentSnippets017', '''
class F {var x = !1false;}''', <String>['1+true']);

    buildTests('testCommentSnippets018', '''
class Map{}class Arrays{}class C{ m(!1){} n(!2 x, q)''', <String>[
      '1+Map',
      '1+dynamic',
      '1+void',
      '1-null',
      '2+Arrays',
      '2-void',
      '2-null'
    ]);

    buildTests('testCommentSnippets019', '''
class A{m(){Object x;x.!1/**/clear()''', <String>['1+toString']);

    buildTests('testCommentSnippets020', '''
classMap{}class tst {var newt;void newf(){}test() {var newz;new!1/**/;}}''',
        <String>['1+newt', '1+newf', '1+newz', '1-Map']);

    buildTests('testCommentSnippets021', '''
class Map{}class tst {var newt;void newf(){}test() {var newz;new !1/**/;}}''',
        <String>['1+Map', '1-newt']);

    buildTests('testCommentSnippets022', '''
class Map{}class F{m(){new !1;}}''', <String>['1+Map']);

    buildTests('testCommentSnippets022a', '''
class Map{}class F{m(){new !1''', <String>['1+Map']);

    buildTests('testCommentSnippets022b', '''
class Map{factory Map.qq(){return null;}}class F{m(){new Map.!1qq();}}''',
        <String>['1+qq']);

    buildTests('testCommentSnippets023', '''
class X {X c; X(this.!1c!3) : super() {c.!2}}''',
        <String>['1+c', '2+c', '3+c']);

    buildTests('testCommentSnippets024', '''
class q {m(Map q){var x;m(!1)}n(){var x;n(!2)}}''', <String>['1+x', '2+x']);

    buildTests('testCommentSnippets025', '''
class C {num m() {var q; num x=!1 q!3 + !2/**/;}}''',
        <String>['1+q', '2+q', '3+q']);

    buildTests('testCommentSnippets026', '''
class List{}class a implements !1{}''', <String>['1+List']);

    buildTests('testCommentSnippets027', '''
class String{}class List{}class test <X extends !1String!2> {}''',
        <String>['1+List', '2+String', '2-List']);

    buildTests('testCommentSnippets028', '''
class String{}class List{}class DateTime{}typedef T Y<T extends !1>(List input);''',
        <String>['1+DateTime', '1+String']);

    buildTests('testCommentSnippets029', '''
interface A<X> default B<X extends !1List!2> {}''',
        <String>['1+DateTime', '2+List']);

    buildTests('testCommentSnippets030', '''
class Bar<T extends Foo> {const Bar(!1T!2 k);T!3 m(T!4 a, T!5 b){}final T!6 f = null;}''',
        <String>['1+T', '2+T', '3+T', '4+T', '5+T', '6+T']);

    buildTests('testCommentSnippets031', '''
class Bar<T extends Foo> {m(x){if (x is !1) return;if (x is!!!2)}}''',
        <String>['1+Bar', '1+T', '2+T', '2+Bar']);

    buildTests(
        'testCommentSnippets032',
        '''
class Fit{}class Bar<T extends Fooa> {const !2F!1ara();}''',
        <String>['1+Fit', '1+Fara', '1-Bar', '2+Fit'],
        failingTests: '1');

    // Type propagation
    buildTests('testCommentSnippets033', '''
class List{add(){}length(){}}t1() {var x;if (x is List) {x.!1add(3);}}''',
        <String>['1+add', '1+length']);

    // Type propagation
    buildTests('testCommentSnippets035', '''
class List{clear(){}length(){}}t3() {var x=[], y=x.!1length();x.!2clear();}''',
        <String>['1+length', '2+clear']);

    buildTests('testCommentSnippets036', '''
class List{}t3() {var x=new List!1}''', <String>['1+List']);

    buildTests('testCommentSnippets037', '''
class List{factory List.from(){}}t3() {var x=new List.!1}''',
        <String>['1+from']);

    buildTests('testCommentSnippets038', '''
f(){int xa; String s = '\$x!1';}''', <String>['1+xa']);

    buildTests('testCommentSnippets038a', '''
int xa; String s = '\$x!1\'''', <String>['1+xa']);

    buildTests('testCommentSnippets039', '''
f(){int xa; String s = '\$!1';}''', <String>['1+xa']);

    buildTests('testCommentSnippets039a', '''
int xa; String s = '\$!1\'''', <String>['1+xa']);

    buildTests('testCommentSnippets040', '''
class List{add(){}}class Map{}class X{m(){List list; list.!1 Map map;}}''',
        <String>['1+add']);

    buildTests('testCommentSnippets041', '''
class List{add(){}length(){}}class X{m(){List list; list.!1 zox();}}''',
        <String>['1+add']);

    buildTests('testCommentSnippets042', '''
class DateTime{static const int WED=3;int get day;}fd(){DateTime d=new DateTime.now();d.!1WED!2;}''',
        <String>['1+day', '2-WED']);

    buildTests('testCommentSnippets043', '''
class L{var k;void.!1}''', <String>['1-k']);

    buildTests('testCommentSnippets044', '''
class List{}class XXX {XXX.fisk();}main() {main(); new !1}}''',
        <String>['1+List', '1+XXX.fisk']);

    buildTests('testCommentSnippets045', '''
class List{}class XXX {XXX.fisk();}main() {main(); !1}}''',
        <String>['1+List', '1+XXX.fisk']);

    buildTests('testCommentSnippets047', '''
f(){int x;int y=!1;}''', <String>['1+x']);

    buildTests('testCommentSnippets048', '''
import 'dart:convert' as json;f() {var x=new js!1}''', <String>['1+json']);

    buildTests('testCommentSnippets049', '''
import 'dart:convert' as json;
import 'dart:convert' as jxx;
class JsonDecoderX{}
f1() {var x=new !2j!1s!3}''', <String>[
      '1+json',
      '1+jxx',
      '2+json',
      '2+jxx',
      '2-JsonDecoder',
      '3+json',
      '3-jxx'
    ]);

    buildTests('testCommentSnippets050', '''
class xdr {
  xdr();
  const xdr.a(a,b,c);
  xdr.b();
  f() => 3;
}
class xa{}
k() {
  new x!1dr().f();
  const x!2dr.!3a(1, 2, 3);
}''', <String>[
      '1+xdr',
      '1+xa',
      '1+xdr.a',
      '1+xdr.b',
      '2+xa', // suggest default constructor
      '2+xdr', // suggest normal constructor
      '2+xdr.a',
      '2+xdr.b', // suggest named constructor
      '3+b', // suggest named constructor
      '3+a'
    ]);

    // Type propagation.
    buildTests('testCommentSnippets051', '''
class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
void r() {
  var v;
  if (v is String) {
    v.!1length;
    v.!2getKeys;
  }
}''', <String>['1+length', '2-getKeys']);

    // Type propagation.
    buildTests('testCommentSnippets052', '''
class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
void r() {
  List<String> values = ['a','b','c'];
  for (var v in values) {
    v.!1toUpperCase;
    v.!2getKeys;
  }
}''', <String>['1+toUpperCase', '2-getKeys']);

    buildTests('testCommentSnippets055', '''
class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
void r() {
  String v;
  if (v is Object) {
    v.!1toUpperCase;
  }
}''', <String>['1+toUpperCase']);

    buildTests(
        'testCommentSnippets058',
        '''
typedef vo!2id callback(int k);
void x(callback q){}
void r() {
  callback v;
  x(!1);
}''',
        <String>['1+v', '2+void'],
        failingTests: '2');

    buildTests('testCommentSnippets060', '''
class Map{}
abstract class MM extends Map{factory MM() => new Map();}
class Z {
  MM x;
  f() {
    x!1
  }
}''', <String>['1+x', '1-x[]']);

    buildTests('testCommentSnippets061', '''
class A{m(){!1f(3);!2}}n(){!3f(3);!4}f(x)=>x*3;''',
        <String>['1+f', '1+n', '2+f', '2+n', '3+f', '3+n', '4+f', '4+n']);

    buildTests('testCommentSnippets064', '''
class Spline {
  Line c;
  Spline a() {
    return this;
  }
  Line b() {
    return null;
  }
  Spline f() {
    Line x = new Line();
    x.!9h()..!1a()..!2b().!7g();
    x.!8j..!3b()..!4c..!6c..!5a();
  }
}
class Line {
  Spline j;
  Line g() {
    return this;
  }
  Spline h() {
    return null;
  }
}''', <String>[
      '1+a',
      '2+b',
      '1-g',
      '2-h',
      '3+b',
      '4+c',
      '5+a',
      '6+c',
      '7+g',
      '8+j',
      '9+h'
    ]);

    buildTests('testCommentSnippets065', '''
class Spline {
  Line c;
  Spline a() {
    return this;
  }
  Line b() {
    return null;
  }
  Spline f() {
    Line x = new Line();
    x.h()..!1;
  }
}
class Line {
  Spline j;
  Line g() {
    return this;
  }
  Spline h() {
    return null;
  }
}''', <String>['1+a']);

    buildTests('testCommentSnippets066', '''
class Spline {
  Line c;
  Spline a() {
    return this;
  }
  Line b() {
    return null;
  }
  Spline f() {
    Line x = new Line();
    x.h()..a()..!1;
  }
}
class Line {
  Spline j;
  Line g() {
    return this;
  }
  Spline h() {
    return null;
  }
}''', <String>['1+b']);

    buildTests('testCommentSnippets067', '''
class Spline {
  Line c;
  Spline a() {
    return this;
  }
  Line b() {
    return null;
  }
  Spline f() {
    Line x = new Line();
    x.h()..a()..c..!1;
  }
}
class Line {
  Spline j;
  Line g() {
    return this;
  }
  Spline h() {
    return null;
  }
}''', <String>['1+b']);

    buildTests('testCommentSnippets068', '''
class Spline {
  Line c;
  Spline a() {
    return this;
  }
  Line b() {
    return null;
  }
  Spline f() {
    Line x = new Line();
    x.j..b()..c..!1;
  }
}
class Line {
  Spline j;
  Line g() {
    return this;
  }
  Spline h() {
    return null;
  }
}''', <String>['1+c']);

    buildTests('testCommentSnippets069', '''
class Spline {
  Line c;
  Spline a() {
    return this;
  }
  Line b() {
    return null;
  }
  Spline f() {
    Line x = new Line();
    x.j..b()..!1;
  }
}
class Line {
  Spline j;
  Line g() {
    return this;
  }
  Spline h() {
    return null;
  }
}''', <String>['1+c']);

    buildTests('testCommentSnippets070', '''
class Spline {
  Line c;
  Spline a() {
    return this;
  }
  Line b() {
    return null;
  }
  Spline f() {
    Line x = new Line();
    x.j..!1;
  }
}
class Line {
  Spline j;
  Line g() {
    return this;
  }
  Spline h() {
    return null;
  }
}''', <String>['1+b']);

    buildTests('testCommentSnippets072', '''
class X {
  int _p;
  set p(int x) => _p = x;
}
f() {
  X x = new X();
  x.!1p = 3;
}''', <String>['1+p']);

    buildTests('testCommentSnippets073', '''
class X {
  m() {
    JSON.stri!1;
    X f = null;
  }
}
class JSON {
  static stringify() {}
}''', <String>['1+stringify']);

    buildTests('testCommentSnippets074', '''
class X {
  m() {
    _x!1
  }
  _x1(){}
}''', <String>['1+_x1']);

    buildTests('testCommentSnippets075', '''
p(x)=>0;var E;f(q)=>!1p(!2E);''', <String>['1+p', '2+E']);

    buildTests('testCommentSnippets076', '''
class Map<K,V>{}class List<E>{}class int{}main() {var m=new Map<Lis!1t<Map<int,in!2t>>,List<!3int>>();}''',
        <String>['1+List', '2+int', '3+int']);

    buildTests('testCommentSnippets076a', '''
class Map<K,V>{}class List<E>{}class int{}main() {var m=new Map<Lis!1t<Map<int,in!2t>>,List<!3>>();}''',
        <String>['1+List', '2+int', '3+int']);

    buildTests('testCommentSnippets077', '''
class FileMode {
  static const READ = const FileMode._internal(0);
  static const WRITE = const FileMode._internal(1);
  static const APPEND = const FileMode._internal(2);
  const FileMode._internal(int this._mode);
  factory FileMode._internal1(int this._mode);
  factory FileMode(_mode);
  final int _mode;
}
class File {
  File(String path);
  File.fromPath(Path path);
}
f() => new Fil!1''', <String>[
      '1+File',
      '1+File.fromPath',
      '1+FileMode',
      '1+FileMode._internal1',
      '1+FileMode._internal'
    ]);

    buildTests('testCommentSnippets078', '''
class Map{static from()=>null;clear(){}}void main() { Map.!1 }''',
        <String>['1+from', '1-clear']); // static method, instance method

    buildTests('testCommentSnippets079', '''
class Map{static from()=>null;clear(){}}void main() { Map s; s.!1 }''',
        <String>['1-from', '1+clear']); // static method, instance method

    buildTests('testCommentSnippets080', '''
class RuntimeError{var message;}void main() { RuntimeError.!1 }''',
        <String>['1-message']); // field

    buildTests(
        'testCommentSnippets081',
        '''
class Foo {this.!1}''',
        <String>['1-Object'],
        failingTests: '1');

    // https://github.com/dart-lang/sdk/issues/33992
    buildTests(
        'testCommentSnippets082',
        '''
        class HttpRequest {}
        class HttpResponse {}
        main() {
          var v = (HttpRequest req, HttpResp!1)
        }''',
        <String>['1+HttpResponse'],
        failingTests: '1');

    buildTests('testCommentSnippets083', '''
main() {(.!1)}''', <String>['1-toString']);

    buildTests('testCommentSnippets083a', '''
main() { .!1 }''', <String>['1-toString']);

    buildTests('testCommentSnippets083b', '''
main() { null.!1 }''', <String>['1+toString']);

    buildTests('testCommentSnippets085', '''
class List{}class Map{}class Z extends List with !1Ma!2p {}''',
        <String>['1+List', '1+Map', '2+Map', '2-List']);

    buildTests(
        'testCommentSnippets086',
        '''
class Q{f(){xy() {!2};x!1y();}}''',
        <String>['1+xy', '2+f', '2-xy'],
        failingTests: '2');

    buildTests('testCommentSnippets087', '''
class Map{}class Q extends Object with !1Map {}''',
        <String>['1+Map', '1-HashMap']);

    buildTests('testCommentSnippets088', '''
class A {
  int f;
  B m(){}
}
class B extends A {
  num f;
  A m(){}
}
class Z {
  B q;
  f() {q.!1}
}''', <String>['1+f', '1+m']); // f->num, m()->A

    buildTests(
        'testCommentSnippets089',
        '''
class Q {
  fqe() {
    xya() {
      xyb() {
        !1
      }
      !3 xyb();
    };
    xza() {
      !2
    }
    xya();
    !4 xza();
  }
  fqi() {
    !5
  }
}''',
        <String>[
          '1+fqe',
          '1+fqi',
          '1+Q',
          '1-xya',
          '1-xyb',
          '1-xza',
          '2+fqe',
          '2+fqi',
          '2+Q',
          '2-xya',
          '2-xyb',
          '2-xza',
          '3+fqe',
          '3+fqi',
          '3+Q',
          '3-xya',
          '3+xyb',
          '3-xza',
          '4+fqe',
          '4+fqi',
          '4+Q',
          '4+xya',
          '4-xyb',
          '4+xza',
          '5+fqe',
          '5+fqi',
          '5+Q',
          '5-xya',
          '5-xyb',
          '5-xza'
        ],
        failingTests: '123');

    buildTests('testCommentSnippets090', '''
class X { f() { var a = 'x'; a.!1 }}''', <String>['1+length']);
  }

  void buildCompletionTests() {
    buildTests('testCompletion_alias_field', '''
typedef int fnint(int k); fn!1int x;''', <String>['1+fnint']);

    buildTests(
        'testCompletion_annotation_argumentList',
        '''
class AAA {",
  const AAA({int aaa, int bbb});",
}",
",
@AAA(!1)
main() {
}''',
        <String>[
          '1+AAA' /*":" + ProposalKind.ARGUMENT_LIST*/,
          '1+aaa',
          '1+bbb'
        ],
        failingTests: '1');

    buildTests(
        'testCompletion_annotation_topLevelVar',
        '''
const fooConst = null;
final fooNotConst = null;
const bar = null;

@foo!1
main() {
}''',
        <String>['1+fooConst', '1-fooNotConst', '1-bar'],
        failingTests: '1');

    buildTests('testCompletion_annotation_type', '''
class AAA {
  const AAA({int a, int b});
  const AAA.nnn(int c, int d);
}
@AAA!1
main() {
}''', <String>[
      '1+AAA' /*":" + ProposalKind.CONSTRUCTOR*/,
      '1+AAA.nnn' /*":" + ProposalKind.CONSTRUCTOR*/
    ]);

    buildTests('testCompletion_annotation_type_inClass_withoutMember', '''
class AAA {
  const AAA();
}

class C {
  @A!1
}''', <String>[
      '1+AAA' /*":" + ProposalKind.CONSTRUCTOR*/
    ]);

    buildTests('testCompletion_argument_typeName', '''
class Enum {
  static Enum FOO = new Enum();
}
f(Enum e) {}
main() {
  f(En!1);
}''', <String>['1+Enum']);

    buildTests('testCompletion_arguments_ignoreEmpty', '''
class A {
  test() {}
}
main(A a) {
  a.test(!1);
}''', <String>['1-test']);

    buildTests('testCompletion_as_asIdentifierPrefix', '''
main(p) {
  var asVisible;
  var v = as!1;
}''', <String>['1+asVisible']);

    buildTests('testCompletion_as_asPrefixedIdentifierStart', '''
class A {
  var asVisible;
}

main(A p) {
  var v = p.as!1;
}''', <String>['1+asVisible']);

    buildTests('testCompletion_as_incompleteStatement', '''
class MyClass {}
main(p) {
  var justSomeVar;
  var v = p as !1
}''', <String>['1+MyClass', '1-justSomeVar']);

    buildTests('testCompletion_cascade', '''
class A {
  aaa() {}
}


main(A a) {
  a..!1 aaa();
}''', <String>['1+aaa', '1-main']);

    buildTests('testCompletion_combinator_afterComma', '''
import 'dart:math' show cos, !1;''',
        <String>['1+pi', '1+sin', '1+Random', '1-String']);

    buildTests('testCompletion_combinator_ended', '''
import 'dart:math' show !1;"''',
        <String>['1+pi', '1+sin', '1+Random', '1-String']);

    buildTests('testCompletion_combinator_export', '''
export 'dart:math' show !1;"''',
        <String>['1+pi', '1+sin', '1+Random', '1-String']);

    buildTests('testCompletion_combinator_hide', '''
import 'dart:math' hide !1;"''',
        <String>['1+pi', '1+sin', '1+Random', '1-String']);

    buildTests('testCompletion_combinator_notEnded', '''
import 'dart:math' show !1"''',
        <String>['1+pi', '1+sin', '1+Random', '1-String']);

    buildTests('testCompletion_combinator_usePrefix', '''
import 'dart:math' show s!1"''',
        <String>['1+sin', '1+sqrt', '1-cos', '1-String']);

    buildTests(
        'testCompletion_constructor_field',
        '''
class X { X(this.field); int f!1ield;}''',
        <String>['1+field'],
        failingTests: '1');

    buildTests(
        'testCompletion_constructorArguments_showOnlyCurrent',
        '''
class A {
  A.first(int p);
  A.second(double p);
}
main() {
  new A.first(!1);
}''',
        <String>['1+A.first', '1-A.second'],
        failingTests: '1');

    buildTests(
        'testCompletion_constructorArguments_whenPrefixedType',
        '''
import 'dart:math' as m;
main() {
  new m.Random(!1);
}''',
        <String>['1+Random:ARGUMENT_LIST'],
        failingTests: '1');

    buildTests('testCompletion_dartDoc_reference_forClass', '''
/**
 * [int!1]
 * [method!2]
 */
class AAA {
  methodA() {}
}''', <String>['1+int', '1-method', '2+methodA', '2-int']);

    buildTests('testCompletion_dartDoc_reference_forConstructor', '''
class A {
  /**
   * [aa!1]
   * [int!2]
   * [method!3]
   */
  A.named(aaa, bbb) {}
  methodA() {}
}''', <String>['1+aaa', '1-bbb', '2+int', '2-double', '3+methodA']);

    buildTests(
        'testCompletion_dartDoc_reference_forFunction',
        '''
/**
 * [aa!1]
 * [int!2]
 * [function!3]
 */
functionA(aaa, bbb) {}
functionB() {}''',
        <String>[
          '1+aaa',
          '1-bbb',
          '2+int',
          '2-double',
          '3+functionA',
          '3+functionB',
          '3-int'
        ],
        failingTests: '1');

    buildTests(
        'testCompletion_dartDoc_reference_forFunctionTypeAlias',
        '''
/**
 * [aa!1]
 * [int!2]
 * [Function!3]
 */
typedef FunctionA(aaa, bbb) {}
typedef FunctionB() {}''',
        <String>[
          '1+aaa',
          '1-bbb',
          '2+int',
          '2-double',
          '3+FunctionA',
          '3+FunctionB',
          '3-int'
        ],
        failingTests: '1');

    buildTests('testCompletion_dartDoc_reference_forMethod', '''
class A {
  /**
   * [aa!1]
   * [int!2]
   * [method!3]
   */
  methodA(aaa, bbb) {}
  methodB() {}
}''', <String>[
      '1+aaa',
      '1-bbb',
      '2+int',
      '2-double',
      '3+methodA',
      '3+methodB',
      '3-int'
    ]);

    buildTests('testCompletion_dartDoc_reference_incomplete', '''
/**
 * [doubl!1 some text
 * other text
 */
class A {}
/**
 * [!2 some text
 * other text
 */
class B {}
/**
 * [!3] some text
 */
class C {}''', <String>[
      '1+double',
      '1-int',
      '2+int',
      '2+String',
      '3+int',
      '3+String'
    ]);

    buildTests('testCompletion_double_inFractionPart', '''
main() {
  1.0!1
}''', <String>['1-abs', '1-main']);

    buildTests('testCompletion_enum', '''
enum MyEnum {A, B, C}
main() {
  MyEnum.!1;
}''', <String>['1+values', '1+A', '1+B', '1+C']);

    buildTests('testCompletion_exactPrefix_hasHigherRelevance', '''
var STR;
main(p) {
  var str;
  str!1;
  STR!2;
  Str!3;
}''', <String>[
      '1+str' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
      '1+STR' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
      '2+STR' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
      '2+str' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
      '3+String' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
      '3+STR' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
      '3+str' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/
    ]);

    buildTests('testCompletion_export_dart', '''
import 'dart:math
import 'dart:_collection.dev
export 'dart:!1''', <String>[
      '1+dart:core',
      '1+dart:math',
      '1-dart:_collection.dev',
    ]);

    buildTests(
        'testCompletion_export_noStringLiteral_noSemicolon',
        '''
import !1

class A {}''',
        <String>["1+'dart:!';", "1+'package:!';"],
        failingTests: '1');

    buildTests('testCompletion_forStmt_vars', '''
class int{}class Foo { mth() { for (in!1t i = 0; i!2 < 5; i!3++); }}''',
        <String>['1+int', '2+i', '3+i']);

    buildTests('testCompletion_function', '''
class Foo { int boo = 7; mth() { PNGS.sort((String a, Str!1) => a.compareTo(b)); }}''',
        <String>['1+String']);

    // https://github.com/dart-lang/sdk/issues/33992
    buildTests(
        'testCompletion_function_partial',
        '''
class Foo { int boo = 7; mth() { PNGS.sort((String a, Str!1)); }}''',
        <String>['1+String'],
        failingTests: '1');

    buildTests(
        'testCompletion_functionTypeParameter_namedArgument',
        '''
typedef FFF(a, b, {x1, x2, y});
main(FFF fff) {
  fff(1, 2, !1)!2;
}''',
        <String>['1+x1', '2-x2'],
        failingTests: '1');

    buildTests('testCompletion_ifStmt_field1', '''
class Foo { int myField = 7; mth() { if (!1) {}}}''', <String>['1+myField']);

    buildTests('testCompletion_ifStmt_field1a', '''
class Foo { int myField = 7; mth() { if (!1) }}''', <String>['1+myField']);

    buildTests('testCompletion_ifStmt_field2', '''
class Foo { int myField = 7; mth() { if (m!1) {}}}''', <String>['1+myField']);

    buildTests('testCompletion_ifStmt_field2a', '''
class Foo { int myField = 7; mth() { if (m!1) }}''', <String>['1+myField']);

    buildTests('testCompletion_ifStmt_field2b', '''
class Foo { myField = 7; mth() { if (m!1) {}}}''', <String>['1+myField']);

    buildTests('testCompletion_ifStmt_localVar', '''
class Foo { mth() { int value = 7; if (v!1) {}}}''', <String>['1+value']);

    buildTests('testCompletion_ifStmt_localVara', '''
class Foo { mth() { value = 7; if (v!1) {}}}''', <String>['1-value']);

    buildTests('testCompletion_ifStmt_topLevelVar', '''
int topValue = 7; class Foo { mth() { if (t!1) {}}}''', <String>['1+topValue']);

    buildTests('testCompletion_ifStmt_topLevelVara', '''
topValue = 7; class Foo { mth() { if (t!1) {}}}''', <String>['1+topValue']);

    buildTests(
        'testCompletion_ifStmt_unionType_nonStrict',
        '''
class A { a() => null; x() => null}
class B { a() => null; y() => null}
void main() {
  var x;
  var c;
  if(c) {
    x = new A();
  } else {
    x = new B();
  }
  x.!1;
}''',
        <String>['1+a', '1+x', '1+y'],
        failingTests: '1');

    buildTests(
        'testCompletion_ifStmt_unionType_strict',
        '''
class A { a() => null; x() => null}
class B { a() => null; y() => null}
void main() {
  var x;
  var c;
  if(c) {
    x = new A();
  } else {
    x = new B();
  }
  x.!1;
}''',
        <String>['1+a', '1-x', '1-y'],
        failingTests: '1');

    buildTests('testCompletion_import', '''
import '!1';''', <String>['1+dart:!', '1+package:!']);

    buildTests('testCompletion_import_dart', '''
import 'dart:math
import 'dart:_collection.dev
import 'dart:!1''', <String>[
      '1+dart:core',
      '1+dart:math',
      '1-dart:_collection.dev',
    ]);

    buildTests('testCompletion_import_hasStringLiteral_noSemicolon', '''
import '!1'

class A {}''', <String>['1+dart:!', '1+package:!']);

    buildTests(
        'testCompletion_import_noSpace',
        '''
import!1''',
        <String>["1+ 'dart:!';", "1+ 'package:!';"],
        failingTests: '1');

    buildTests(
        'testCompletion_import_noStringLiteral',
        '''
import !1;''',
        <String>["1+'dart:!'", "1+'package:!'"],
        failingTests: '1');

    buildTests(
        'testCompletion_import_noStringLiteral_noSemicolon',
        '''
import !1

class A {}''',
        <String>["1+'dart:!';", "1+'package:!';"],
        failingTests: '1');

    buildTests('testCompletion_incompleteClassMember', '''
class A {
  Str!1
  final f = null;
}''', <String>['1+String', '1-bool']);

    buildTests('testCompletion_incompleteClosure_parameterType', '''
f1(cb(String s)) {}
f2(String s) {}
main() {
  f1((Str!1));
  f2((Str!2));
}''', <String>['1+String', '1-bool', '2+String', '2-bool']);

    buildTests(
        'testCompletion_inPeriodPeriod',
        '''
main(String str) {
  1 < str.!1.length;
  1 + str.!2.length;
  1 + 2 * str.!3.length;
}''',
        <String>['1+codeUnits', '2+codeUnits', '3+codeUnits'],
        failingTests: '123');

    // no checks, but no exceptions
    buildTests('testCompletion_instanceCreation_unresolved', '''
class A {
}
main() {
  new NoSuchClass(!1);
  new A.noSuchConstructor(!2);
}''', <String>['1+int', '2+int']);

    buildTests(
        'testCompletion_import_lib',
        '''
import '!1''',
        <String>['1+my_lib.dart'],
        extraFiles: <String, String>{'/my_lib.dart': ''},
        failingTests: '1');

    buildTests('testCompletion_is', '''
class MyClass {}
main(p) {
  var isVariable;
  if (p is MyCla!1) {}
  var v1 = p is MyCla!2;
  var v2 = p is !3;
  var v2 = p is!4;
}''', <String>[
      '1+MyClass',
      '2+MyClass',
      '3+MyClass',
      '3-v1',
      '4+is',
      '4-isVariable'
    ]);

    // https://github.com/dart-lang/sdk/issues/33992
    buildTests(
        'testCompletion_is_asIdentifierStart',
        '''
main(p) {
  var isVisible;
  var v1 = is!1;
  var v2 = is!2
}''',
        <String>['1+isVisible', '2+isVisible'],
        failingTests: '12');

    buildTests('testCompletion_is_asPrefixedIdentifierStart', '''
class A {
  var isVisible;
}

main(A p) {
  var v1 = p.is!1;
  var v2 = p.is!2
}''', <String>['1+isVisible', '2+isVisible']);

    buildTests('testCompletion_is_incompleteStatement1', '''
class MyClass {}
main(p) {
  var justSomeVar;
  var v = p is !1
}''', <String>['1+MyClass', '1-justSomeVar']);

    buildTests('testCompletion_is_incompleteStatement2', '''
class MyClass {}
main(p) {
  var isVariable;
  var v = p is!1
}''', <String>['1+is', '1-isVariable']);

    buildTests('testCompletion_keyword_in', '''
class Foo { int input = 7; mth() { if (in!1) {}}}''', <String>['1+input']);

    buildTests('testCompletion_keyword_syntheticIdentifier', '''
main() {
  var caseVar;
  var otherVar;
  var v = case!1
}''', <String>['1+caseVar', '1-otherVar']);

    buildTests('testCompletion_libraryIdentifier_atEOF', '''
library int.!1''', <String>['1-parse', '1-bool']);

    buildTests('testCompletion_libraryIdentifier_notEOF', '''
library int.!1''', <String>['1-parse', '1-bool']);

    buildTests(
        'testCompletion_methodRef_asArg_incompatibleFunctionType',
        '''
foo( f(int p) ) {}
class Functions {
  static myFuncInt(int p) {}
  static myFuncDouble(double p) {}
}
bar(p) {}
main(p) {
  foo( Functions.!1; );
}''',
        <String>[
          '1+myFuncInt' /*":" + ProposalKind.METHOD_NAME*/,
          '1-myFuncDouble' /*":" + ProposalKind.METHOD_NAME*/
        ],
        failingTests: '1');

    buildTests(
        'testCompletion_methodRef_asArg_notFunctionType',
        '''
foo( f(int p) ) {}
class Functions {
  static myFunc(int p) {}
}
bar(p) {}
main(p) {
  foo( (int p) => Functions.!1; );
}''',
        <String>[
          '1+myFunc' /*":" + ProposalKind.METHOD*/,
          '1-myFunc' /*":" + ProposalKind.METHOD_NAME*/
        ],
        failingTests: '1');

    buildTests('testCompletion_methodRef_asArg_ofFunctionType', '''
foo( f(int p) ) {}
class Functions {
  static int myFunc(int p) {}
}
main(p) {
  foo(Functions.!1);
}''', <String>[
      '1+myFunc' /*":" + ProposalKind.METHOD*/,
      '1+myFunc' /*":" + ProposalKind.METHOD_NAME*/
    ]);

    buildTests('testCompletion_namedArgument_alreadyUsed', '''
func({foo}) {} main() { func(foo: 0, fo!1); }''', <String>['1-foo']);

    buildTests(
        'testCompletion_namedArgument_constructor',
        '''
class A {A({foo, bar}) {}} main() { new A(fo!1); }''',
        <String>['1+foo', '1-bar'],
        failingTests: '1');

    buildTests(
        'testCompletion_namedArgument_empty',
        '''
func({foo, bar}) {} main() { func(!1); }''',
        <String>[
          '1+foo' /*":" + ProposalKind.NAMED_ARGUMENT*/,
          '1-foo' /*":" + ProposalKind.OPTIONAL_ARGUMENT*/
        ],
        failingTests: '1');

    buildTests(
        'testCompletion_namedArgument_function',
        '''
func({foo, bar}) {} main() { func(fo!1); }''',
        <String>['1+foo', '1-bar'],
        failingTests: '1');

    buildTests('testCompletion_namedArgument_notNamed', '''
func([foo]) {} main() { func(fo!1); }''', <String>['1-foo']);

    buildTests('testCompletion_namedArgument_unresolvedFunction', '''
main() { func(fo!1); }''', <String>['1-foo']);

    buildTests('testCompletion_newMemberType1', '''
class Collection{}class List extends Collection{}class Foo { !1 }''',
        <String>['1+Collection', '1+List']);

    buildTests('testCompletion_newMemberType2', '''
class Collection{}class List extends Collection{}class Foo {!1}''',
        <String>['1+Collection', '1+List']);

    buildTests('testCompletion_newMemberType3', '''
class Collection{}class List extends Collection{}class Foo {L!1}''',
        <String>['1-Collection', '1+List']);

    buildTests('testCompletion_newMemberType4', '''
class Collection{}class List extends Collection{}class Foo {C!1}''',
        <String>['1+Collection', '1-List']);

    buildTests(
        'testCompletion_positionalArgument_constructor',
        '''
class A {
  A([foo, bar]);
}
main() {
  new A(!1);
  new A(0, !2);
}''',
        <String>[
          '1+foo' /*":" + ProposalKind.OPTIONAL_ARGUMENT*/,
          '1-bar',
          '2-foo',
          '2+bar' /*":"
        + ProposalKind.OPTIONAL_ARGUMENT*/
        ],
        failingTests: '12');

    buildTests(
        'testCompletion_positionalArgument_function',
        '''
func([foo, bar]) {}
main() {
  func(!1);
  func(0, !2);
}''',
        <String>[
          '1+foo' /*":" + ProposalKind.OPTIONAL_ARGUMENT*/,
          '1-bar',
          '2-foo',
          '2+bar' /*":"
        + ProposalKind.OPTIONAL_ARGUMENT*/
        ],
        failingTests: '12');

    buildTests(
        'testCompletion_preferStaticType',
        '''
class A {
  foo() {}
}
class B extends A {
  bar() {}
}
main() {
  A v = new B();
  v.!1
}''',
        <String>[
          '1+foo',
          '1-bar,potential=false,declaringType=B',
          '1+bar,potential=true,declaringType=B'
        ],
        failingTests: '1');

    buildTests('testCompletion_privateElement_sameLibrary_constructor', '''
class A {
  A._c();
  A.c();
}
main() {
  new A.!1
}''', <String>['1+_c', '1+c']);

    buildTests('testCompletion_privateElement_sameLibrary_member', '''
class A {
  _m() {}
  m() {}
}
main(A a) {
  a.!1
}''', <String>['1+_m', '1+m']);

    buildTests('testCompletion_propertyAccess_whenClassTarget', '''
class A {
  static int FIELD;
  int field;
}
main() {
  A.!1
}''', <String>['1+FIELD', '1-field']);

    buildTests('testCompletion_propertyAccess_whenClassTarget_excludeSuper', '''
class A {
  static int FIELD_A;
  static int methodA() {}
}
class B extends A {
  static int FIELD_B;
  static int methodB() {}
}
main() {
  B.!1;
}''', <String>['1+FIELD_B', '1-FIELD_A', '1+methodB', '1-methodA']);

    buildTests('testCompletion_propertyAccess_whenInstanceTarget', '''
class A {
  static int FIELD;
  int fieldA;
}
class B {
  A a;
}
class C extends A {
  int fieldC;
}
main(B b, C c) {
  b.a.!1;
  c.!2;
}''', <String>['1-FIELD', '1+fieldA', '2+fieldC', '2+fieldA']);

    buildTests('testCompletion_return_withIdentifierPrefix', '''
f() { var vvv = 42; return v!1 }''', <String>['1+vvv']);

    buildTests('testCompletion_return_withoutExpression', '''
f() { var vvv = 42; return !1 }''', <String>['1+vvv']);

    buildTests('testCompletion_staticField1', '''
class num{}class Sunflower {static final n!2um MAX_D = 300;nu!3m xc, yc;Sun!4flower() {x!Xc = y!Yc = MA!1 }}''',
        <String>['1+MAX_D', 'X+xc', 'Y+yc', '2+num', '3+num', '4+Sunflower']);

    buildTests('testCompletion_staticField_withoutVarOrFinal', '''
class num{}class Sunflower {static n!1}''', <String>['1+num']);

    buildTests('testCompletion_super_superType', '''
class A {
  var fa;
  ma() {}
}
class B extends A {
  var fb;
  mb() {}
  main() {
    super.!1
  }
}''', <String>['1+fa', '1-fb', '1+ma', '1-mb']);

    buildTests(
        'testCompletion_superConstructorInvocation_noNamePrefix',
        '''
class A {
  A.fooA();
  A.fooB();
  A.bar();
}
class B extends A {
  B() : super.!1
}''',
        <String>['1+fooA', '1+fooB', '1+bar'],
        failingTests: '1');

    buildTests(
        'testCompletion_superConstructorInvocation_withNamePrefix',
        '''
class A {
  A.fooA();
  A.fooB();
  A.bar();
}
class B extends A {
  B() : super.f!1
}''',
        <String>['1+fooA', '1+fooB', '1-bar'],
        failingTests: '1');

    buildTests(
        'testCompletion_this_bad_inConstructorInitializer',
        '''
class A {
  var f;
  A() : f = this.!1;
}''',
        <String>['1-toString'],
        failingTests: '1');

    buildTests(
        'testCompletion_this_bad_inFieldDeclaration',
        '''
class A {
  var f = this.!1;
}''',
        <String>['1-toString'],
        failingTests: '1');

    buildTests(
        'testCompletion_this_bad_inStaticMethod',
        '''
class A {
  static m() {
    this.!1;
  }
}''',
        <String>['1-toString'],
        failingTests: '1');

    buildTests(
        'testCompletion_this_bad_inTopLevelFunction',
        '''
main() {
  this.!1;
}''',
        <String>['1-toString'],
        failingTests: '1');

    buildTests(
        'testCompletion_this_bad_inTopLevelVariableDeclaration',
        '''
var v = this.!1;''',
        <String>['1-toString'],
        failingTests: '1');

    buildTests('testCompletion_this_OK_inConstructorBody', '''
class A {
  var f;
  m() {}
  A() {
    this.!1;
  }
}''', <String>['1+f', '1+m']);

    buildTests('testCompletion_this_OK_localAndSuper', '''
class A {
  var fa;
  ma() {}
}
class B extends A {
  var fb;
  mb() {}
  main() {
    this.!1
  }
}''', <String>['1+fa', '1+fb', '1+ma', '1+mb']);

    buildTests('testCompletion_topLevelField_init2', '''
class DateTime{static var JUN;}final num M = Dat!1eTime.JUN;''',
        <String>['1+DateTime', '1-void']);

    buildTests('testCompletion_while', '''
class Foo { int boo = 7; mth() { while (b!1) {} }}''', <String>['1+boo']);
  }

  void buildLibraryTests() {
    Map<String, String> sources = HashMap<String, String>();

    buildTests('test_export_ignoreIfThisLibraryExports', '''
export 'dart:math';
libFunction() {};
main() {
  !1
}''', <String>['1-cos', '1+libFunction']);

    sources.clear();
    sources['/lib.dart'] = '''
library lib;
export 'dart:math' hide sin;
libFunction() {};''';
    buildTests(
        'test_export_showIfImportLibraryWithExport',
        '''
import 'lib.dart' as p;
main() {
  p.!1
}''',
        <String>['1+cos', '1-sin', '1+libFunction'],
        extraFiles: sources,
        failingTests: '1');

    buildTests('test_importPrefix_hideCombinator', '''
import 'dart:math' as math hide pi;
main() {
  math.!1
}''', <String>['1-pi', '1+ln10']);

    buildTests('test_importPrefix_showCombinator', '''
import 'dart:math' as math show pi;
main() {
  math.!1
}''', <String>['1+pi', '1-ln10']);

    sources.clear();
    sources['/lib.dart'] = '''
library lib
class _A
  foo() {}

class A extends _A {
}''';
    buildTests(
        'test_memberOfPrivateClass_otherLibrary',
        '''
import 'lib.dart';
main(A a) {
  a.!1
}''',
        <String>['1+foo'],
        extraFiles: sources,
        failingTests: '1');

    sources.clear();
    sources['/lib.dart'] = '''
library lib;
class A {
  A.c();
  A._c();
}''';
    buildTests(
        'test_noPrivateElement_otherLibrary_constructor',
        '''
import 'lib.dart';
main() {
  new A.!1
}''',
        <String>['1-_c', '1+c'],
        failingTests: '1');

    sources.clear();
    sources['/lib.dart'] = '''
library lib;
class A {
  var f;
  var _f;
}''';
    buildTests(
        'test_noPrivateElement_otherLibrary_member',
        '''
              import 'lib.dart';
              main(A a) {
                a.!1
              }''',
        <String>['1-_f', '1+f'],
        extraFiles: sources,
        failingTests: '1');

    sources.clear();
    sources['/firth.dart'] = '''
library firth;
class SerializationException {
  const SerializationException();
}''';
    buildTests(
        'testLibrary001',
        '''
import 'firth.dart';
main() {
throw new Seria!1lizationException();}''',
        <String>['1+SerializationException'],
        extraFiles: sources,
        failingTests: '1');

    // Type propagation.
    // TODO Include corelib analysis (this works in the editor)
    buildTests(
        'testLibrary002',
        '''t2() {var q=[0],z=q.!1length;q.!2clear();}''',
        <String>['1+length', '1+isEmpty', '2+clear']);

    // TODO Include corelib analysis
    buildTests('testLibrary003', '''class X{var q; f() {q.!1a!2}}''',
        <String>['1+end', '2+abs', '2-end'],
        failingTests: '12');

    // TODO Include corelib analysis
    // Resolving dart:html takes between 2.5s and 30s; json, about 0.12s
    buildTests('testLibrary004', '''
            library foo;
            import 'dart:convert' as json;
            class JsonDecoderX{}
            f1() {var x=new json.!1}
            f2() {var x=new json.JsonDe!2}
            f3() {var x=new json.JsonDecoder!3}''', <String>[
      '1+JsonDecoder',
      '1-JsonDecoderX',
      '2+JsonDecoder',
      '2-JsonDecoderX',
      '3+JsonDecoder',
      '3-JsonDecoderX'
    ]);

    // TODO Enable after type propagation is implemented. Not yet.
    // TODO Include corelib analysis
    buildTests('testLibrary005',
        '''var PHI;main(){PHI=5.3;PHI.abs().!1 Object x;}''', <String>['1+abs'],
        failingTests: '1');

    // Exercise import and export handling.
    // Libraries are defined in partial order of increasing dependency.
    sources.clear();
    sources['/exp2a.dart'] = '''
library exp2a;
e2a() {}''';
    sources['/exp1b.dart'] = '''
library exp1b;",
e1b() {}''';
    sources['/exp1a.dart'] = '''
library exp1a;",
export 'exp1b.dart';",
e1a() {}''';
    sources['/imp1.dart'] = '''
library imp1;
export 'exp1a.dart';
i1() {}''';
    sources['/imp2.dart'] = '''
library imp2;
export 'exp2a.dart';
i2() {}''';
    buildTests(
        'testLibrary006',
        '''
import 'imp1.dart';
import 'imp2.dart';
main() {!1
  i1();
  i2();
  e1a();
  e1b();
  e2a();
}''',
        <String>['1+i1', '1+i2', '1+e1a', '1+e2a', '1+e1b'],
        extraFiles: sources,
        failingTests: '1');

    // Exercise import and export handling.
    // Libraries are defined in partial order of increasing dependency.
    sources.clear();
    sources['/l1.dart'] = '''
library l1;
var _l1t; var l1t;''';
    buildTests(
        'testLibrary007',
        '''
import 'l1.dart';
main() {
  var x = l!1
  var y = _!2
}''',
        <String>['1+l1t', '1-_l1t', '2-_l1t'],
        extraFiles: sources,
        failingTests: '1');

    // Check private library exclusion
    sources.clear();
    sources['/public.dart'] = '''
library public;
class NonPrivate {
  void publicMethod() {
  }
}''';
    sources['/private.dart'] = '''
library _private;
import 'public.dart';
class Private extends NonPrivate {
  void privateMethod() {
  }
}''';
    buildTests(
        'testLibrary008',
        '''
import 'private.dart';
import 'public.dart';
class Test {
  void test() {
    NonPrivate x = new NonPrivate();
    x.!1 //publicMethod but not privateMethod should appear
  }
}''',
        <String>['1-privateMethod', '1+publicMethod'],
        extraFiles: sources,
        failingTests: '1');

    // Exercise library prefixes.
    sources.clear();
    sources['/lib.dart'] = '''
library lib;
int X = 1;
void m(){}
class Y {}''';
    buildTests(
        'testLibrary009',
        '''
import 'lib.dart' as Q;
void a() {
  var x = Q.!1
}
void b() {
  var x = [Q.!2]
}
void c() {
  var x = new List.filled([Q.!3], null)
}
void d() {
  new Q.!4
}''',
        <String>[
          '1+X',
          '1+m',
          '1+Y',
          '2+X',
          '2+m',
          '2+Y',
          '3+X',
          '3+m',
          '3+Y',
          '4+Y',
          '4-m',
          '4-X'
        ],
        extraFiles: sources,
        failingTests: '1234');
  }

  void buildNumberedTests() {
    buildTests('test001', '''
void r1(var v) {
  v.!1toString!2().!3hash!4Code
}''', <String>[
      '1+toString',
      '1-==',
      '2+toString',
      '3+hashCode',
      '3+toString',
      '4+hashCode',
      '4-toString'
    ]);

    buildTests('test002', '''
void r2(var vim) {
  v!1.toString()
}''', <String>['1+vim']);

    buildTests('test003', '''
class A {
  int a() => 3;
  int b() => this.!1a();
}''', <String>['1+a']);

    buildTests(
        'test004',
        '''
class A {
  int x;
  A() : this.!1x = 1;
  A.b() : this();
  A.c() : this.!2b();
  g() => new A.!3c();
}''',
        <String>['1+x', '2+b', '3+c'],
        failingTests: '12');

    buildTests(
        'test005',
        '''
class A {}
void rr(var vim) {
  var !1vq = v!2.toString();
  var vf;
  v!3.toString();
}''',
        <String>[
          '1-A',
          '1-vim',
          '1+vq',
          '1-vf',
          '1-this',
          '1-void',
          '1-null',
          '1-false',
          '2-A',
          '2+vim',
          '2-vf',
          '2-vq',
          '2-this',
          '2-void',
          '2-null',
          '2-false',
          '3+vf',
          '3+vq',
          '3+vim',
          '3-A'
        ],
        failingTests: '1');

    buildTests('test006', '''
void r2(var vim, {va: 2, b: 3}) {
  v!1.toString()
}''', <String>['1+va', '1-b']);

    buildTests('test007', '''
void r2(var vim, [va: 2, b: 3]) {
  v!1.toString()
}''', <String>['1+va', '1-b']);

    // keywords
    buildTests(
        'test008',
        '''
!1class Aclass {}
class Bclass !2extends!3 !4Aclass {}
!5abstract class Eclass implements Aclass, Bclass {}
class Fclass extends Bclass !6with !7 Eclass {}''',
        <String>[
          '1+class',
          '1-implements',
          '1-extends',
          '1-with',
          '2+extends',
          '3+extends',
          '4+Aclass',
          '4-Bclass',
          '5+abstract',
          '6+with',
          '7+Eclass',
          '7-Dclass',
          '7-Ctype',
        ],
        failingTests: '2346');

    // keywords
    buildTests(
        'test009',
        '''
typedef !1dy!2namic TestFn1();
typedef !3vo!4id TestFn2();
typ!7edef !5n!6''',
        <String>[
          '1+void',
          '1+TestFn2',
          '2+dynamic',
          '2-void',
          '3+dynamic',
          '4+void',
          '4-dynamic',
          '5+TestFn2',
          '6+num',
          '7+typedef'
        ],
        failingTests: '1234');

    buildTests(
        'test010',
        '''
class test !8<!1t !2 !3extends String,!4 List,!5 !6>!7 {}
class tezetst !9<!BString,!C !DList>!A {}''',
        <String>[
          '1-String',
          '1-List',
          '1-test',
          '2-String',
          '2-test',
          '3+extends',
          '4-tezetst',
          '4-test',
          '5-String',
          '6-List',
          '7-List',
          '8-List',
          '9-String',
          'A-String',
          'B-String',
          'C-List',
          'C-tezetst',
          'D-List',
          'D-test'
        ],
        failingTests: '23');

    // name generation with conflicts
    buildTests('test011', '''r2(var object, Object object1, Object !1);''',
        <String>['1+object2'],
        failingTests: '1');

    // reserved words
    buildTests(
        'test012',
        '''
class X {
  f() {
    g(!1var!2 z) {!3true.!4toString();};
  }
}''',
        <String>[
          '1+var',
          '1+dynamic',
          '1-f',
          '2+var',
          '2-dynamic',
          '3+false',
          '3+true',
          '4+toString'
        ],
        failingTests: '123');

    // conditions & operators
    buildTests(
        'test013',
        '''
class Q {
  bool x;
  List zs;
  int k;
  var a;
  mth() {
    while (!1x !9);
    do{} while(!2x !8);
    for(z in !3zs) {}
    switch(!4k) {case 1:{!0}}
    try {
    } on !5Object catch(a){}
    if (!7x !6) {} else {};
  }
}''',
        <String>[
          '1+x',
          '2+x',
          '3+zs',
          '4+k',
          '5+Q',
          '5-a',
          '6+==',
          '7+x',
          '8+==',
          '9+==',
          '0+k'
        ],
        failingTests: '689');

    // keywords
    buildTests(
        'test014',
        '''
class Q {
  bool x;
  List zs;
  int k;
  !Dvar a;
  !Evoid mth() {
    !1while (z) { !Gcontinue; };
    !2do{ !Hbreak; } !3while(x);
    !4for(z !5in zs) {}
    !6for (int i; i < 3; i++);
    !7switch(k) {!8case 1:{} !9default:{}}
    !Atry {
    } !Bon Object !Ccatch(a){}
    !Fassert true;
    !Jif (x) {} !Kelse {};
    !Lreturn;
  }
}''',
        <String>[
          '1+while',
          '2+do',
          '3+while',
          '4+for',
          '5+in',
          '6+for',
          '7+switch',
          '8+case',
          '9+default:',
          'A+try',
          'B+on',
          'C+catch',
          'D+var',
          'E+void',
          'F+assert',
          'G+continue',
          'H+break',
          'J+if',
          'K+else',
          'L+return'
        ],
        failingTests: '3CK');

    // operators in function
    buildTests('test015', '''f(a,b,c) => a + b * c !1;''', <String>['1+=='],
        failingTests: '1');

    // operators in return
    buildTests(
        'test016',
        '''class X {dynamic f(a,b,c) {return a + b * c !1;}}''',
        <String>['1+=='],
        failingTests: '1');

    // keywords
    buildTests(
        'test017',
        '''
!1!2import 'x' !5as r;
!3export '!8uri' !6hide Q !7show X;
!4part 'x';''',
        <String>[
          '1+library',
          "2+import \'\';",
          "3+export \'\';",
          "4+part \'\';",
          '5+as',
          '6+hide',
          '7+show',
          '8-null'
        ],
        failingTests: '234567'); //TODO(jwren) 234 failing as correct selection
    // offset assertions can't be passed into buildTests(..)

    // keywords
    buildTests('test018', '''!1part !2of foo;''', <String>['1+part', '2+of'],
        failingTests: '12');

    buildTests('test019', '''
var truefalse = 0;
var falsetrue = 1;
main() {
  var foo = true!1
}''', <String>['1+true', '1+truefalse', '1-falsetrue']);

    buildTests('test020', '''var x = null.!1''', <String>['1+toString']);

    buildTests('test021', '''var x = .!1''', <String>['1-toString']);

    buildTests('test022', '''var x = .!1;''', <String>['1-toString']);

    buildTests('test023', '''
class Map{getKeys(){}}
class X {
  static x1(Map m) {
    m.!1getKeys;
  }
  x2(Map m) {
    m.!2getKeys;
  }
}''', <String>['1+getKeys', '2+getKeys']);

// Note lack of semicolon following completion location
    buildTests('test024', '''
class List{factory List.from(Iterable other) {}}
class F {
  f() {
    new List.!1
  }
}''', <String>['1+from']);

    buildTests('test025', '''
class R {
  static R _m;
  static R m;
  f() {
    var a = !1m;
    var b = _!2m;
    var c = !3g();
  }
  static g() {
    var a = !4m;
    var b = _!5m;
    var c = !6g();
  }
}
class T {
  f() {
    R x;
    x.!7g();
    x.!8m;
    x._!9m;
  }
  static g() {
    var q = R._!Am;
    var g = R.!Bm;
    var h = R.!Cg();
  }
  h() {
    var q = R._!Dm;
    var g = R.!Em;
    var h = R.!Fg();
  }
}''', <String>[
      '1+m',
      '2+_m',
      '3+g',
      '4+m',
      '5+_m',
      '6+g',
      '7-g',
      '8-m',
      '9-_m',
      'A+_m',
      'B+m',
      'C+g',
      'D+_m',
      'E+m',
      'F+g'
    ]);

    buildTests('test026', '''var aBcD; var x=ab!1''', <String>['1+aBcD']);

    buildTests(
        'test027', '''m(){try{}catch(eeee,ssss){s!1}''', <String>['1+ssss']);

    // https://github.com/dart-lang/sdk/issues/33992
    buildTests('test028', '''m(){var isX=3;if(is!1)''', <String>['1+isX'],
        failingTests: '1');

    buildTests('test029', '''m(){[1].forEach((x)=>!1x);}''', <String>['1+x']);

    buildTests('test030', '''n(){[1].forEach((x){!1});}''', <String>['1+x']);

    buildTests(
        'test031',
        '''class Caster {} m() {try {} on Cas!1ter catch (CastBlock) {!2}}''',
        <String>['1+Caster', '1-CastBlock', '2+Caster', '2+CastBlock']);

    buildTests('test032', '''
const ONE = 1;
const ICHI = 10;
const UKSI = 100;
const EIN = 1000;
m() {
  int x;
  switch (x) {
    case !3ICHI:
    case UKSI:
    case EIN!2:
    case ONE!1: return;
    default: return;
  }
}''', <String>[
      '1+ONE',
      '1-UKSI',
      '2+EIN',
      '2-ICHI',
      '3+ICHI',
      '3+UKSI',
      '3+EIN',
      '3+ONE'
    ]);

    buildTests(
        'test033',
        '''class A{}class B extends A{b(){}}class C implements A {c(){}}class X{x(){A f;f.!1}}''',
        <String>['1+b', '1-c'],
        failingTests: '1');

    // TODO(scheglov) decide what to do with Type for untyped field (not
    // supported by the new store)
    // test analysis of untyped fields and top-level vars
    buildTests(
        'test034',
        '''
var topvar;
class Top {top(){}}
class Left extends Top {left(){}}
class Right extends Top {right(){}}
t1() {
  topvar = new Left();
}
t2() {
  topvar = new Right();
}
class A {
  var field;
  a() {
    field = new Left();
  }
  b() {
    field = new Right();
  }
  test() {
    topvar.!1top();
    field.!2top();
  }
}''',
        <String>['1+top', '2+top'],
        failingTests: '12');

    // test analysis of untyped fields and top-level vars
    buildTests('test035', '''class Y {final x='hi';mth() {x.!1length;}}''',
        <String>['1+length']);

    // TODO(scheglov) decide what to do with Type for untyped field (not
    // supported by the new store)
    // test analysis of untyped fields and top-level vars
    buildTests(
        'test036',
        '''
class A1 {
  var field;
  A1() : field = 0;
  q() {
    A1 a = new A1();
    a.field.!1
  }
}
main() {
  A1 a = new A1();
  a.field.!2
}''',
        <String>['1+round', '2+round'],
        failingTests: '12');

    buildTests(
        'test037',
        '''
class HttpServer{}
class HttpClient{}
main() {
  new HtS!1
}''',
        <String>['1+HttpServer', '1-HttpClient'],
        failingTests: '1');

    buildTests('test038', '''
class X {
  x(){}
}
class Y {
  y(){}
}
class A<Z extends X> {
  Y ay;
  Z az;
  A(this.ay, this.az) {
    ay.!1y;
    az.!2x;
  }
}''', <String>['1+y', '1-x', '2+x', '2-y']);

    // test analysis of untyped fields and top-level vars
    buildTests(
        'test039', '''class X{}var x = null as !1X;''', <String>['1-void']);

    // test arg lists with named params
    buildTests('test040', '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1)!2;}''',
        <String>['1+x1', '2-x2'],
        failingTests: '1');

    // test arg lists with named params
    buildTests('test041', '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1''',
        <String>['1+x1', '1+x2', '1+y'],
        failingTests: '1');

    // test arg lists with named params
    buildTests('test042', '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1;!2''',
        <String>['1+x1', '1+x2', '2-y'],
        failingTests: '1');
  }

  void buildOtherTests() {
    buildTests('test_classMembers_inGetter',
        '''class A { var fff; get z {ff!1}}''', <String>['1+fff']);

    buildTests(
        'testSingle',
        '''class A {int x; !2mth() {int y = this.x;}}class B{}''',
        <String>['2+B']);
  }

  /// Generate a set of completion tests based on the given [originalSource].
  ///
  /// The source string has completion points embedded in it, which are
  /// identified by '!X' where X is a single character. Each X is matched to
  /// positive or negative results in the array of [validationStrings].
  /// Validation strings contain the name of a prediction with a two character
  /// prefix. The first character of the prefix corresponds to an X in the
  /// [originalSource]. The second character is either a '+' or a '-' indicating
  /// whether the string is a positive or negative result.
  ///
  /// The [originalSource] is the source for a completion test that contains
  /// completion points. The [validationStrings] are the positive and negative
  /// predictions.
  ///
  /// Optional argument [failingTests], if given, is a string, each character of
  /// which corresponds to an X in the [originalSource] for which the test is
  /// expected to fail.  This should be used to mark known completion bugs that
  /// have not yet been fixed.
  void buildTests(String baseName, String originalSource, List<String> results,
      {Map<String, String>? extraFiles, String failingTests = ''}) {
    var completionTests = LocationSpec.from(originalSource, results);
    completionTests.sort((LocationSpec first, LocationSpec second) {
      return first.id.compareTo(second.id);
    });
    if (completionTests.isEmpty) {
      test(baseName, () {
        fail("Expected exclamation point ('!') within the source denoting the"
            'position at which code completion should occur');
      });
    }
    var allSpecIds =
        completionTests.map((LocationSpec spec) => spec.id).toSet();
    for (var id in failingTests.split('')) {
      if (!allSpecIds.contains(id)) {
        test('$baseName-$id', () {
          fail(
              "Test case '$id' included in failingTests, but this id does not exist.");
        });
      }
    }
    for (var spec in completionTests) {
      var testName = '$baseName-${spec.id}';
      if (failingTests.contains(spec.id)) {
        ++expectedFailCount;
        test('$testName (expected failure $expectedFailCount)', () {
          var test = CompletionTestCase();
          expect(
            () => test.runTest(spec, extraFiles),
            throwsA(anything),
          );
        });
      } else {
        ++expectedPassCount;
        test(testName, () {
          var test = CompletionTestCase();
          return test.runTest(spec, extraFiles);
        });
      }
    }
  }
}
