Migrate SimpleResolverTest from task model.

R=brianwilkerson@google.com

Change-Id: Icb45287e7f63f5139468eed5b84c45822f6da5ed
Reviewed-on: https://dart-review.googlesource.com/c/92846
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index f1362ce..86b3e1f 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -128,6 +128,10 @@
     throw StateError('Not found: $name');
   }
 
+  FieldFormalParameterElement fieldFormalParameter(String name) {
+    return parameter(name) as FieldFormalParameterElement;
+  }
+
   FunctionElement function(String name) {
     for (var function in unitElement.functions) {
       if (function.name == name) {
@@ -333,6 +337,9 @@
       for (var method in class_.methods) {
         findIn(method.parameters);
       }
+      for (var accessor in class_.accessors) {
+        findIn(accessor.parameters);
+      }
     }
 
     if (result != null) {
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index bb9f453..21883f7 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -35,6 +35,10 @@
     return _node(search, (n) => n is Block);
   }
 
+  BreakStatement breakStatement(String search) {
+    return _node(search, (n) => n is BreakStatement);
+  }
+
   CascadeExpression cascade(String search) {
     return _node(search, (n) => n is CascadeExpression);
   }
@@ -55,10 +59,22 @@
     return _node(search, (n) => n is ConstructorDeclaration);
   }
 
+  ConstructorFieldInitializer constructorFieldInitializer(String search) {
+    return _node(search, (n) => n is ConstructorFieldInitializer);
+  }
+
+  ContinueStatement continueStatement(String search) {
+    return _node(search, (n) => n is ContinueStatement);
+  }
+
   DefaultFormalParameter defaultParameter(String search) {
     return _node(search, (n) => n is DefaultFormalParameter);
   }
 
+  DoStatement doStatement(String search) {
+    return _node(search, (n) => n is DoStatement);
+  }
+
   ExportDirective export(String search) {
     return _node(search, (n) => n is ExportDirective);
   }
@@ -75,6 +91,14 @@
     return _node(search, (n) => n is FieldFormalParameter);
   }
 
+  ForEachStatement forEachStatement(String search) {
+    return _node(search, (n) => n is ForEachStatement);
+  }
+
+  ForStatement forStatement(String search) {
+    return _node(search, (n) => n is ForStatement);
+  }
+
   FunctionBody functionBody(String search) {
     return _node(search, (n) => n is FunctionBody);
   }
@@ -87,6 +111,10 @@
     return _node(search, (n) => n is FunctionExpression);
   }
 
+  FunctionTypeAlias functionTypeAlias(String search) {
+    return _node(search, (n) => n is FunctionTypeAlias);
+  }
+
   GenericFunctionType genericFunctionType(String search) {
     return _node(search, (n) => n is GenericFunctionType);
   }
@@ -183,6 +211,10 @@
     return _node(search, (n) => n is SuperExpression);
   }
 
+  SwitchStatement switchStatement(String search) {
+    return _node(search, (n) => n is SwitchStatement);
+  }
+
   ThisExpression this_(String search) {
     return _node(search, (n) => n is ThisExpression);
   }
@@ -211,6 +243,10 @@
     return _node(search, (n) => n is VariableDeclaration);
   }
 
+  WhileStatement whileStatement(String search) {
+    return _node(search, (n) => n is WhileStatement);
+  }
+
   AstNode _node(String search, bool Function(AstNode) predicate) {
     var index = content.indexOf(search);
     if (content.indexOf(search, index + 1) != -1) {
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index c4b5223..a4d99bb 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -3,20 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_resolution_map.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../util/element_type_matchers.dart';
-import '../utils.dart';
+import '../src/dart/resolution/driver_resolution.dart';
 import 'resolver_test_case.dart';
-import 'test_support.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -24,111 +17,109 @@
   });
 }
 
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
 @reflectiveTest
-class SimpleResolverTest extends ResolverTestCase {
+class SimpleResolverTest extends DriverResolutionTest {
   test_argumentResolution_required_matching() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   void f() {
     g(1, 2, 3);
   }
   void g(a, b, c) {}
 }''');
-    _validateArgumentResolution(source, [0, 1, 2]);
+    await _validateArgumentResolution([0, 1, 2]);
   }
 
   test_argumentResolution_required_tooFew() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   void f() {
     g(1, 2);
   }
   void g(a, b, c) {}
 }''');
-    _validateArgumentResolution(source, [0, 1]);
+    await _validateArgumentResolution([0, 1]);
   }
 
   test_argumentResolution_required_tooMany() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   void f() {
     g(1, 2, 3);
   }
   void g(a, b) {}
 }''');
-    _validateArgumentResolution(source, [0, 1, -1]);
+    await _validateArgumentResolution([0, 1, -1]);
   }
 
   test_argumentResolution_requiredAndNamed_extra() async {
-    Source source = addSource(r'''
+    addTestFile('''
 class A {
   void f() {
     g(1, 2, c: 3, d: 4);
   }
   void g(a, b, {c}) {}
 }''');
-    _validateArgumentResolution(source, [0, 1, 2, -1]);
+    await _validateArgumentResolution([0, 1, 2, -1]);
   }
 
   test_argumentResolution_requiredAndNamed_matching() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   void f() {
     g(1, 2, c: 3);
   }
   void g(a, b, {c}) {}
 }''');
-    _validateArgumentResolution(source, [0, 1, 2]);
+    await _validateArgumentResolution([0, 1, 2]);
   }
 
   test_argumentResolution_requiredAndNamed_missing() async {
-    Source source = addSource(r'''
+    addTestFile('''
 class A {
   void f() {
     g(1, 2, d: 3);
   }
   void g(a, b, {c, d}) {}
 }''');
-    _validateArgumentResolution(source, [0, 1, 3]);
+    await _validateArgumentResolution([0, 1, 3]);
   }
 
   test_argumentResolution_requiredAndPositional_fewer() async {
-    Source source = addSource(r'''
+    addTestFile('''
 class A {
   void f() {
     g(1, 2, 3);
   }
   void g(a, b, [c, d]) {}
 }''');
-    _validateArgumentResolution(source, [0, 1, 2]);
+    await _validateArgumentResolution([0, 1, 2]);
   }
 
   test_argumentResolution_requiredAndPositional_matching() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   void f() {
     g(1, 2, 3, 4);
   }
   void g(a, b, [c, d]) {}
 }''');
-    _validateArgumentResolution(source, [0, 1, 2, 3]);
+    await _validateArgumentResolution([0, 1, 2, 3]);
   }
 
   test_argumentResolution_requiredAndPositional_more() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   void f() {
     g(1, 2, 3, 4);
   }
   void g(a, b, [c]) {}
 }''');
-    _validateArgumentResolution(source, [0, 1, 2, -1]);
+    await _validateArgumentResolution([0, 1, 2, -1]);
   }
 
   test_argumentResolution_setter_propagated() async {
-    CompilationUnit unit = await resolveSource(r'''
+    addTestFile(r'''
 main() {
   var a = new A();
   a.sss = 0;
@@ -136,20 +127,17 @@
 class A {
   set sss(x) {}
 }''');
-    // find "a.sss = 0"
-    AssignmentExpression assignment;
-    {
-      var statements = AstFinder.getStatementsInTopLevelFunction(unit, 'main');
-      var statement = statements[1] as ExpressionStatement;
-      assignment = statement.expression as AssignmentExpression;
-    }
-    // get parameter
-    Expression rhs = assignment.rightHandSide;
-    expect(rhs.staticParameterElement, isNotNull);
+    await resolveTestFile();
+
+    var rhs = findNode.assignment(' = 0;').rightHandSide;
+    expect(
+      rhs.staticParameterElement,
+      findElement.parameter('x'),
+    );
   }
 
   test_argumentResolution_setter_propagated_propertyAccess() async {
-    CompilationUnit unit = await resolveSource(r'''
+    addTestFile(r'''
 main() {
   var a = new A();
   a.b.sss = 0;
@@ -160,20 +148,17 @@
 class B {
   set sss(x) {}
 }''');
-    // find "a.b.sss = 0"
-    AssignmentExpression assignment;
-    {
-      var statements = AstFinder.getStatementsInTopLevelFunction(unit, 'main');
-      var statement = statements[1] as ExpressionStatement;
-      assignment = statement.expression as AssignmentExpression;
-    }
-    // get parameter
-    Expression rhs = assignment.rightHandSide;
-    expect(rhs.staticParameterElement, isNotNull);
+    await resolveTestFile();
+
+    var rhs = findNode.assignment(' = 0;').rightHandSide;
+    expect(
+      rhs.staticParameterElement,
+      findElement.parameter('x'),
+    );
   }
 
   test_argumentResolution_setter_static() async {
-    CompilationUnit unit = await resolveSource(r'''
+    addTestFile(r'''
 main() {
   A a = new A();
   a.sss = 0;
@@ -181,26 +166,17 @@
 class A {
   set sss(x) {}
 }''');
-    // find "a.sss = 0"
-    AssignmentExpression assignment;
-    {
-      var statements = AstFinder.getStatementsInTopLevelFunction(unit, 'main');
-      var statement = statements[1] as ExpressionStatement;
-      assignment = statement.expression as AssignmentExpression;
-    }
-    // get parameter
-    Expression rhs = assignment.rightHandSide;
-    ParameterElement parameter = rhs.staticParameterElement;
-    expect(parameter, isNotNull);
-    expect(parameter.displayName, "x");
-    // validate
-    ClassElement classA = unit.declaredElement.types[0];
-    PropertyAccessorElement setter = classA.accessors[0];
-    expect(setter.parameters[0], same(parameter));
+    await resolveTestFile();
+
+    var rhs = findNode.assignment(' = 0;').rightHandSide;
+    expect(
+      rhs.staticParameterElement,
+      findElement.parameter('x'),
+    );
   }
 
   test_argumentResolution_setter_static_propertyAccess() async {
-    CompilationUnit unit = await resolveSource(r'''
+    addTestFile(r'''
 main() {
   A a = new A();
   a.b.sss = 0;
@@ -211,28 +187,19 @@
 class B {
   set sss(x) {}
 }''');
-    // find "a.b.sss = 0"
-    AssignmentExpression assignment;
-    {
-      var statements = AstFinder.getStatementsInTopLevelFunction(unit, 'main');
-      var statement = statements[1] as ExpressionStatement;
-      assignment = statement.expression as AssignmentExpression;
-    }
-    // get parameter
-    Expression rhs = assignment.rightHandSide;
-    ParameterElement parameter = rhs.staticParameterElement;
-    expect(parameter, isNotNull);
-    expect(parameter.displayName, "x");
-    // validate
-    ClassElement classB = unit.declaredElement.types[1];
-    PropertyAccessorElement setter = classB.accessors[0];
-    expect(setter.parameters[0], same(parameter));
+    await resolveTestFile();
+
+    var rhs = findNode.assignment(' = 0;').rightHandSide;
+    expect(
+      rhs.staticParameterElement,
+      findElement.parameter('x'),
+    );
   }
 
   test_breakTarget_labeled() async {
     // Verify that the target of the label is correctly found and is recorded
     // as the unlabeled portion of the statement.
-    String text = r'''
+    addTestFile(r'''
 void f() {
   loop1: while (true) {
     loop2: for (int i = 0; i < 10; i++) {
@@ -241,70 +208,65 @@
     }
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    WhileStatement whileStatement = EngineTestCase.findNode(
-        unit, text, 'while (true)', (n) => n is WhileStatement);
-    ForStatement forStatement =
-        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
-    BreakStatement break1 = EngineTestCase.findNode(
-        unit, text, 'break loop1', (n) => n is BreakStatement);
-    BreakStatement break2 = EngineTestCase.findNode(
-        unit, text, 'break loop2', (n) => n is BreakStatement);
+''');
+    await resolveTestFile();
+
+    var break1 = findNode.breakStatement('break loop1;');
+    var whileStatement = findNode.whileStatement('while (');
     expect(break1.target, same(whileStatement));
+
+    var break2 = findNode.breakStatement('break loop2;');
+    var forStatement = findNode.forStatement('for (');
     expect(break2.target, same(forStatement));
   }
 
   test_breakTarget_unlabeledBreakFromDo() async {
-    String text = r'''
+    addTestFile('''
 void f() {
   do {
     break;
   } while (true);
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    DoStatement doStatement =
-        EngineTestCase.findNode(unit, text, 'do', (n) => n is DoStatement);
-    BreakStatement breakStatement = EngineTestCase.findNode(
-        unit, text, 'break', (n) => n is BreakStatement);
+''');
+    await resolveTestFile();
+
+    var doStatement = findNode.doStatement('do {');
+    var breakStatement = findNode.breakStatement('break;');
     expect(breakStatement.target, same(doStatement));
   }
 
   test_breakTarget_unlabeledBreakFromFor() async {
-    String text = r'''
+    addTestFile(r'''
 void f() {
   for (int i = 0; i < 10; i++) {
     break;
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    ForStatement forStatement =
-        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
-    BreakStatement breakStatement = EngineTestCase.findNode(
-        unit, text, 'break', (n) => n is BreakStatement);
+''');
+    await resolveTestFile();
+
+    var forStatement = findNode.forStatement('for (');
+    var breakStatement = findNode.breakStatement('break;');
     expect(breakStatement.target, same(forStatement));
   }
 
   test_breakTarget_unlabeledBreakFromForEach() async {
-    String text = r'''
+    addTestFile('''
 void f() {
   for (x in []) {
     break;
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    ForEachStatement forStatement = EngineTestCase.findNode(
-        unit, text, 'for', (n) => n is ForEachStatement);
-    BreakStatement breakStatement = EngineTestCase.findNode(
-        unit, text, 'break', (n) => n is BreakStatement);
+''');
+    await resolveTestFile();
+
+    var forStatement = findNode.forEachStatement('for (');
+    var breakStatement = findNode.breakStatement('break;');
     expect(breakStatement.target, same(forStatement));
   }
 
   test_breakTarget_unlabeledBreakFromSwitch() async {
-    String text = r'''
+    addTestFile(r'''
 void f() {
   while (true) {
     switch (0) {
@@ -313,35 +275,33 @@
     }
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    SwitchStatement switchStatement = EngineTestCase.findNode(
-        unit, text, 'switch', (n) => n is SwitchStatement);
-    BreakStatement breakStatement = EngineTestCase.findNode(
-        unit, text, 'break', (n) => n is BreakStatement);
+''');
+    await resolveTestFile();
+
+    var switchStatement = findNode.switchStatement('switch (');
+    var breakStatement = findNode.breakStatement('break;');
     expect(breakStatement.target, same(switchStatement));
   }
 
   test_breakTarget_unlabeledBreakFromWhile() async {
-    String text = r'''
+    addTestFile(r'''
 void f() {
   while (true) {
     break;
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    WhileStatement whileStatement = EngineTestCase.findNode(
-        unit, text, 'while', (n) => n is WhileStatement);
-    BreakStatement breakStatement = EngineTestCase.findNode(
-        unit, text, 'break', (n) => n is BreakStatement);
+''');
+    await resolveTestFile();
+
+    var whileStatement = findNode.whileStatement('while (');
+    var breakStatement = findNode.breakStatement('break;');
     expect(breakStatement.target, same(whileStatement));
   }
 
   test_breakTarget_unlabeledBreakToOuterFunction() async {
     // Verify that unlabeled break statements can't resolve to loops in an
     // outer function.
-    String text = r'''
+    addTestFile(r'''
 void f() {
   while (true) {
     void g() {
@@ -349,40 +309,34 @@
     }
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    BreakStatement breakStatement = EngineTestCase.findNode(
-        unit, text, 'break', (n) => n is BreakStatement);
+''');
+    await resolveTestFile();
+
+    var breakStatement = findNode.breakStatement('break;');
     expect(breakStatement.target, isNull);
   }
 
   test_class_definesCall() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 class A {
   int call(int x) { return x; }
 }
 int f(A a) {
   return a(0);
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_class_extends_implements() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 class A extends B implements C {}
 class B {}
 class C {}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_continueTarget_labeled() async {
     // Verify that the target of the label is correctly found and is recorded
     // as the unlabeled portion of the statement.
-    String text = r'''
+    addTestFile('''
 void f() {
   loop1: while (true) {
     loop2: for (int i = 0; i < 10; i++) {
@@ -391,86 +345,80 @@
     }
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    WhileStatement whileStatement = EngineTestCase.findNode(
-        unit, text, 'while (true)', (n) => n is WhileStatement);
-    ForStatement forStatement =
-        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
-    ContinueStatement continue1 = EngineTestCase.findNode(
-        unit, text, 'continue loop1', (n) => n is ContinueStatement);
-    ContinueStatement continue2 = EngineTestCase.findNode(
-        unit, text, 'continue loop2', (n) => n is ContinueStatement);
+''');
+    await resolveTestFile();
+
+    var continue1 = findNode.continueStatement('continue loop1');
+    var whileStatement = findNode.whileStatement('while (');
     expect(continue1.target, same(whileStatement));
+
+    var continue2 = findNode.continueStatement('continue loop2');
+    var forStatement = findNode.forStatement('for (');
     expect(continue2.target, same(forStatement));
   }
 
   test_continueTarget_unlabeledContinueFromDo() async {
-    String text = r'''
+    addTestFile('''
 void f() {
   do {
     continue;
   } while (true);
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    DoStatement doStatement =
-        EngineTestCase.findNode(unit, text, 'do', (n) => n is DoStatement);
-    ContinueStatement continueStatement = EngineTestCase.findNode(
-        unit, text, 'continue', (n) => n is ContinueStatement);
+''');
+    await resolveTestFile();
+
+    var doStatement = findNode.doStatement('do {');
+    var continueStatement = findNode.continueStatement('continue;');
     expect(continueStatement.target, same(doStatement));
   }
 
   test_continueTarget_unlabeledContinueFromFor() async {
-    String text = r'''
+    addTestFile('''
 void f() {
   for (int i = 0; i < 10; i++) {
     continue;
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    ForStatement forStatement =
-        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
-    ContinueStatement continueStatement = EngineTestCase.findNode(
-        unit, text, 'continue', (n) => n is ContinueStatement);
+''');
+    await resolveTestFile();
+
+    var forStatement = findNode.forStatement('for (');
+    var continueStatement = findNode.continueStatement('continue;');
     expect(continueStatement.target, same(forStatement));
   }
 
   test_continueTarget_unlabeledContinueFromForEach() async {
-    String text = r'''
+    addTestFile(r'''
 void f() {
   for (x in []) {
     continue;
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    ForEachStatement forStatement = EngineTestCase.findNode(
-        unit, text, 'for', (n) => n is ForEachStatement);
-    ContinueStatement continueStatement = EngineTestCase.findNode(
-        unit, text, 'continue', (n) => n is ContinueStatement);
+''');
+    await resolveTestFile();
+
+    var forStatement = findNode.forEachStatement('for (');
+    var continueStatement = findNode.continueStatement('continue;');
     expect(continueStatement.target, same(forStatement));
   }
 
   test_continueTarget_unlabeledContinueFromWhile() async {
-    String text = r'''
+    addTestFile(r'''
 void f() {
   while (true) {
     continue;
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    WhileStatement whileStatement = EngineTestCase.findNode(
-        unit, text, 'while', (n) => n is WhileStatement);
-    ContinueStatement continueStatement = EngineTestCase.findNode(
-        unit, text, 'continue', (n) => n is ContinueStatement);
+''');
+    await resolveTestFile();
+
+    var whileStatement = findNode.whileStatement('while (');
+    var continueStatement = findNode.continueStatement('continue;');
     expect(continueStatement.target, same(whileStatement));
   }
 
   test_continueTarget_unlabeledContinueSkipsSwitch() async {
-    String text = r'''
+    addTestFile(r'''
 void f() {
   while (true) {
     switch (0) {
@@ -479,19 +427,18 @@
     }
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    WhileStatement whileStatement = EngineTestCase.findNode(
-        unit, text, 'while', (n) => n is WhileStatement);
-    ContinueStatement continueStatement = EngineTestCase.findNode(
-        unit, text, 'continue', (n) => n is ContinueStatement);
+''');
+    await resolveTestFile();
+
+    var whileStatement = findNode.whileStatement('while (');
+    var continueStatement = findNode.continueStatement('continue;');
     expect(continueStatement.target, same(whileStatement));
   }
 
   test_continueTarget_unlabeledContinueToOuterFunction() async {
     // Verify that unlabeled continue statements can't resolve to loops in an
     // outer function.
-    String text = r'''
+    addTestFile(r'''
 void f() {
   while (true) {
     void g() {
@@ -499,77 +446,76 @@
     }
   }
 }
-''';
-    CompilationUnit unit = await resolveSource(text);
-    ContinueStatement continueStatement = EngineTestCase.findNode(
-        unit, text, 'continue', (n) => n is ContinueStatement);
+''');
+    await resolveTestFile();
+
+    var continueStatement = findNode.continueStatement('continue;');
     expect(continueStatement.target, isNull);
   }
 
   test_empty() async {
-    Source source = addSource("");
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    addTestFile('');
+    await resolveTestFile();
+    assertNoTestErrors();
   }
 
   test_entryPoint_exported() async {
-    addNamedSource("/two.dart", r'''
-library two;
-main() {}''');
-    Source source = addNamedSource("/one.dart", r'''
-library one;
-export 'two.dart';''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    FunctionElement main = library.entryPoint;
+    newFile('/test/lib/a.dart', content: r'''
+main() {}
+''');
+
+    addTestFile(r'''
+export 'a.dart';
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var library = result.libraryElement;
+    var main = library.entryPoint;
+
     expect(main, isNotNull);
     expect(main.library, isNot(same(library)));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_entryPoint_local() async {
-    Source source = addNamedSource("/one.dart", r'''
-library one;
-main() {}''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    FunctionElement main = library.entryPoint;
+    addTestFile(r'''
+main() {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var library = result.libraryElement;
+    var main = library.entryPoint;
+
     expect(main, isNotNull);
     expect(main.library, same(library));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_entryPoint_none() async {
-    Source source = addNamedSource("/one.dart", "library one;");
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
+    addTestFile('');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var library = result.libraryElement;
     expect(library.entryPoint, isNull);
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_enum_externalLibrary() async {
-    addNamedSource("/my_lib.dart", r'''
-library my_lib;
-enum EEE {A, B, C}''');
-    Source source = addSource(r'''
-import 'my_lib.dart';
-main() {
-  EEE e = null;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    newFile('/test/lib/a.dart', content: r'''
+enum EEE {A, B, C}
+''');
+    addTestFile(r'''
+import 'a.dart';
+
+void f(EEE e) {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   test_extractedMethodAsConstant() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 abstract class Comparable<T> {
   int compareTo(T other);
   static int compare(Comparable a, Comparable b) => a.compareTo(b);
@@ -577,64 +523,55 @@
 class A {
   void sort([compare = Comparable.compare]) {}
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    verifyTestResolved();
   }
 
   test_fieldFormalParameter() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   int x;
   int y;
   A(this.x) : y = x {}
 }''');
-    CompilationUnit unit =
-        analysisContext2.resolveCompilationUnit2(source, source);
-    ClassDeclaration classA = unit.declarations[0];
-    FieldDeclaration field = classA.members[0];
-    ConstructorDeclaration constructor = classA.members[2];
-    ParameterElement paramElement =
-        constructor.parameters.parameters[0].declaredElement;
-    expect(paramElement, isFieldFormalParameterElement);
-    expect((paramElement as FieldFormalParameterElement).field,
-        field.fields.variables[0].declaredElement);
-    ConstructorFieldInitializer initializer = constructor.initializers[0];
-    SimpleIdentifier identifierX = initializer.expression;
-    expect(identifierX.staticElement, paramElement);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
 
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    var xParameter = findNode.fieldFormalParameter('this.x');
+
+    var xParameterElement =
+        xParameter.declaredElement as FieldFormalParameterElement;
+    expect(xParameterElement.field, findElement.field('x'));
+
+    assertElement(
+      findNode.simple('x {}'),
+      xParameterElement,
+    );
   }
 
   test_forEachLoops_nonConflicting() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 f() {
   List list = [1,2,3];
   for (int x in list) {}
   for (int x in list) {}
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    verifyTestResolved();
   }
 
   test_forLoops_nonConflicting() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 f() {
   for (int i = 0; i < 3; i++) {
   }
   for (int i = 0; i < 3; i++) {
   }
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    verifyTestResolved();
   }
 
   test_functionTypeAlias() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 typedef bool P(e);
 class A {
   P p;
@@ -642,13 +579,11 @@
     if (p(e)) {}
   }
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    verifyTestResolved();
   }
 
   test_getter_and_setter_fromMixins_bare_identifier() async {
-    Source source = addSource('''
+    addTestFile('''
 class B {}
 class M1 {
   get x => null;
@@ -664,24 +599,21 @@
   }
 }
 ''');
-    var analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
     // Verify that both the getter and setter for "x" in C.f() refer to the
     // accessors defined in M2.
-    List<Statement> statements =
-        AstFinder.getStatementsInMethod(analysisResult.unit, 'C', 'f');
-    var statement = statements[0] as ExpressionStatement;
-    AssignmentExpression assignment = statement.expression;
-    SimpleIdentifier leftHandSide = assignment.leftHandSide;
+    var leftHandSide = findNode.simple('x +=');
     expect(
-        resolutionMap
-            .staticElementForIdentifier(leftHandSide)
-            .enclosingElement
-            .name,
-        'M2');
-    expect(leftHandSide.auxiliaryElements.staticElement.enclosingElement.name,
-        'M2');
+      leftHandSide.staticElement,
+      findElement.setter('x', of: 'M2'),
+    );
+    expect(
+      leftHandSide.auxiliaryElements.staticElement,
+      findElement.getter('x', of: 'M2'),
+    );
   }
 
   @failingTest
@@ -689,7 +621,7 @@
     // TODO(paulberry): it appears that auxiliaryElements isn't properly set on
     // a SimpleIdentifier that's inside a property access.  This bug should be
     // fixed.
-    Source source = addSource(r'''
+    addTestFile(r'''
 class B {}
 class M1 {
   get x => null;
@@ -704,30 +636,24 @@
   new C().x += 1;
 }
 ''');
-    var analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    assertNoTestErrors();
+    verifyTestResolved();
+
     // Verify that both the getter and setter for "x" in "new C().x" refer to
     // the accessors defined in M2.
-    List<Statement> statements =
-        AstFinder.getStatementsInTopLevelFunction(analysisResult.unit, 'main');
-    var statement = statements[0] as ExpressionStatement;
-    AssignmentExpression assignment = statement.expression;
-    PropertyAccess propertyAccess = assignment.leftHandSide;
+    var leftHandSide = findNode.simple('x +=');
     expect(
-        resolutionMap
-            .staticElementForIdentifier(propertyAccess.propertyName)
-            .enclosingElement
-            .name,
-        'M2');
+      leftHandSide.staticElement,
+      findElement.setter('x', of: 'M2'),
+    );
     expect(
-        propertyAccess
-            .propertyName.auxiliaryElements.staticElement.enclosingElement.name,
-        'M2');
+      leftHandSide.auxiliaryElements.staticElement,
+      findElement.getter('x', of: 'M2'),
+    );
   }
 
   test_getter_fromMixins_bare_identifier() async {
-    Source source = addSource('''
+    addTestFile('''
 class B {}
 class M1 {
   get x => null;
@@ -741,21 +667,20 @@
   }
 }
 ''');
-    var analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
     // Verify that the getter for "x" in C.f() refers to the getter defined in
     // M2.
-    var statements =
-        AstFinder.getStatementsInMethod(analysisResult.unit, 'C', 'f');
-    var statement = statements[0] as ReturnStatement;
-    SimpleIdentifier x = statement.expression;
-    expect(resolutionMap.staticElementForIdentifier(x).enclosingElement.name,
-        'M2');
+    expect(
+      findNode.simple('x;').staticElement,
+      findElement.getter('x', of: 'M2'),
+    );
   }
 
   test_getter_fromMixins_property_access() async {
-    Source source = addSource('''
+    addTestFile('''
 class B {}
 class M1 {
   get x => null;
@@ -768,26 +693,20 @@
   var y = new C().x;
 }
 ''');
-    var analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
     // Verify that the getter for "x" in "new C().x" refers to the getter
     // defined in M2.
-    List<Statement> statements =
-        AstFinder.getStatementsInTopLevelFunction(analysisResult.unit, 'main');
-    var statement = statements[0] as VariableDeclarationStatement;
-    PropertyAccess propertyAccess =
-        statement.variables.variables[0].initializer;
     expect(
-        resolutionMap
-            .staticElementForIdentifier(propertyAccess.propertyName)
-            .enclosingElement
-            .name,
-        'M2');
+      findNode.simple('x;').staticElement,
+      findElement.getter('x', of: 'M2'),
+    );
   }
 
   test_getterAndSetterWithDifferentTypes() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   int get f => 0;
   void set f(String s) {}
@@ -795,38 +714,35 @@
 g (A a) {
   a.f = a.f.toString();
 }''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
-    verify([source]);
+    await resolveTestFile();
+    assertTestErrors([StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
+    verifyTestResolved();
   }
 
   test_hasReferenceToSuper() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {}
 class B {toString() => super.toString();}''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    List<ClassElement> classes = unit.types;
-    expect(classes, hasLength(2));
-    expect(classes[0].hasReferenceToSuper, isFalse);
-    expect(classes[1].hasReferenceToSuper, isTrue);
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var a = findElement.class_('A');
+    expect(a.hasReferenceToSuper, isFalse);
+
+    var b = findElement.class_('B');
+    expect(b.hasReferenceToSuper, isTrue);
   }
 
   test_import_hide() async {
-    addNamedSource("/lib1.dart", r'''
-library lib1;
+    newFile('/test/lib/lib1.dart', content: r'''
 set foo(value) {}
 class A {}''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
+
+    newFile('/test/lib/lib2.dart', content: r'''
 set foo(value) {}''');
-    Source source = addNamedSource("/lib3.dart", r'''
+
+    addTestFile(r'''
 import 'lib1.dart' hide foo;
 import 'lib2.dart';
 
@@ -834,26 +750,25 @@
   foo = 0;
 }
 A a;''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   test_import_prefix() async {
-    addNamedSource("/two.dart", r'''
-library two;
+    newFile('/test/lib/a.dart', content: r'''
 f(int x) {
   return x * x;
 }''');
-    Source source = addNamedSource("/one.dart", r'''
-library one;
-import 'two.dart' as _two;
+
+    addTestFile(r'''
+import 'a.dart' as _a;
 main() {
-  _two.f(0);
+  _a.f(0);
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   test_import_prefix_doesNotExist() async {
@@ -862,7 +777,7 @@
     // single error generated when the only problem is that an imported file
     // does not exist.
     //
-    Source source = addNamedSource("/a.dart", r'''
+    addTestFile('''
 import 'missing.dart' as p;
 int a = p.q + p.r.s;
 String b = p.t(a) + p.u(v: 0);
@@ -879,9 +794,9 @@
   H(int i) : super(i);
 }
 ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
-    verify([source]);
+    await resolveTestFile();
+    assertTestErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+    verifyTestResolved();
   }
 
   test_import_show_doesNotExist() async {
@@ -890,7 +805,7 @@
     // single error generated when the only problem is that an imported file
     // does not exist.
     //
-    Source source = addNamedSource("/a.dart", r'''
+    addTestFile('''
 import 'missing.dart' show q, r, t, u, T, U, V, W;
 int a = q + r.s;
 String b = t(a) + u(v: 0);
@@ -907,28 +822,28 @@
   H(int i) : super(i);
 }
 ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
-    verify([source]);
+    await resolveTestFile();
+    assertTestErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+    verifyTestResolved();
   }
 
+  @failingTest
   test_import_spaceInUri() async {
-    addNamedSource("/sub folder/lib.dart", r'''
-library lib;
+    // TODO(scheglov) Fix this. The problem is in `package` URI resolver.
+    newFile('/test/lib/sub folder/a.dart', content: r'''
 foo() {}''');
-    Source source = addNamedSource("/app.dart", r'''
-import 'sub folder/lib.dart';
+
+    await assertNoErrorsInCode(r'''
+import 'sub folder/a.dart';
 
 main() {
   foo();
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    verifyTestResolved();
   }
 
   test_indexExpression_typeParameters() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 f() {
   List<int> a;
   a[0];
@@ -937,24 +852,22 @@
   List<List<List<int>>> c;
   c[0][0][0];
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    verifyTestResolved();
   }
 
   test_indexExpression_typeParameters_invalidAssignmentWarning() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 f() {
   List<List<int>> b;
   b[0][0] = 'hi';
 }''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
+    await resolveTestFile();
+    assertTestErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verifyTestResolved();
   }
 
   test_indirectOperatorThroughCall() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 class A {
   B call() { return new B(); }
 }
@@ -970,113 +883,91 @@
 main() {
   g(f()[0]);
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    verifyTestResolved();
   }
 
   test_invoke_dynamicThroughGetter() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 class A {
   List get X => [() => 0];
   m(A a) {
     X.last;
   }
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    verifyTestResolved();
   }
 
   test_isValidMixin_badSuperclass() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A extends B {}
 class B {}
 class C = Object with A;''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    ClassElement a = unit.getType('A');
+    await resolveTestFile();
+    assertTestErrors([CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verifyTestResolved();
+
+    var a = findElement.class_('A');
     expect(a.isValidMixin, isFalse);
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
-    verify([source]);
   }
 
   test_isValidMixin_constructor() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   A() {}
 }
 class C = Object with A;''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    ClassElement a = unit.getType('A');
-    expect(a.isValidMixin, isFalse);
-    await computeAnalysisResult(source);
-    assertErrors(
-      source,
+    await resolveTestFile();
+    assertTestErrors(
       [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR],
     );
-    verify([source]);
+    verifyTestResolved();
+
+    var a = findElement.class_('A');
+    expect(a.isValidMixin, isFalse);
   }
 
   test_isValidMixin_factoryConstructor() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   factory A() => null;
 }
 class C = Object with A;''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    ClassElement a = unit.getType('A');
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var a = findElement.class_('A');
     expect(a.isValidMixin, isTrue);
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_isValidMixin_super() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   toString() {
     return super.toString();
   }
 }
 class C = Object with A;''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    ClassElement a = unit.getType('A');
+    await resolveTestFile();
+    assertTestErrors([CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
+    verifyTestResolved();
+
+    var a = findElement.class_('A');
     expect(a.isValidMixin, isFalse);
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
-    verify([source]);
   }
 
   test_isValidMixin_valid() async {
-    Source source = addSource('''
+    await assertNoErrorsInCode('''
 class A {}
 class C = Object with A;''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    ClassElement a = unit.getType('A');
+    verifyTestResolved();
+
+    var a = findElement.class_('A');
     expect(a.isValidMixin, isTrue);
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_labels_switch() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 void doSwitch(int target) {
   switch (target) {
     l0: case 0:
@@ -1087,269 +978,174 @@
       continue l1;
   }
 }''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    verifyTestResolved();
   }
 
   test_localVariable_types_invoked() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 main() {
   var myVar = (int p) => 'foo';
   myVar(42);
 }''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnit unit =
-        analysisContext.resolveCompilationUnit(source, library);
-    expect(unit, isNotNull);
-    List<bool> found = [false];
-    List<CaughtException> thrownException = new List<CaughtException>(1);
-    unit.accept(new _SimpleResolverTest_localVariable_types_invoked(
-        this, found, thrownException));
-    if (thrownException[0] != null) {
-      throw new AnalysisException(
-          "Exception", new CaughtException(thrownException[0], null));
-    }
-    expect(found[0], isTrue);
+    await resolveTestFile();
+
+    var node = findNode.simple('myVar(42)');
+    assertType(node, '(int) → String');
   }
 
   test_metadata_class() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 @A class C<A> {}''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unitElement = library.definingCompilationUnit;
-    expect(unitElement, isNotNull);
-    List<ClassElement> classes = unitElement.types;
-    expect(classes, hasLength(1));
-    List<ElementAnnotation> annotations = classes[0].metadata;
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var annotations = findElement.class_('C').metadata;
     expect(annotations, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
 
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    NodeList<CompilationUnitMember> declarations = unit.declarations;
-    expect(declarations, hasLength(2));
-
-    TopLevelVariableDeclaration variableDeclaration = declarations[0];
-    ClassDeclaration classDeclaration = declarations[1];
-
-    PropertyInducingElement expectedElement =
-        variableDeclaration.variables.variables[0].name.staticElement;
-
-    Element actualElement = classDeclaration.metadata[0].name.staticElement;
-    expect(actualElement, same(expectedElement.getter));
+    var cDeclaration = findNode.classDeclaration('C<A>');
+    assertElement(
+      cDeclaration.metadata[0].name,
+      findElement.topGet('A'),
+    );
   }
 
   test_metadata_field() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 class C {
   @A int f;
 }''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    List<ClassElement> classes = unit.types;
-    expect(classes, hasLength(1));
-    FieldElement field = classes[0].fields[0];
-    List<ElementAnnotation> annotations = field.metadata;
-    expect(annotations, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var metadata = findElement.field('f').metadata;
+    expect(metadata, hasLength(1));
   }
 
   test_metadata_fieldFormalParameter() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 class C {
   int f;
   C(@A this.f);
 }''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    List<ClassElement> classes = unit.types;
-    expect(classes, hasLength(1));
-    List<ConstructorElement> constructors = classes[0].constructors;
-    expect(constructors, hasLength(1));
-    List<ParameterElement> parameters = constructors[0].parameters;
-    expect(parameters, hasLength(1));
-    List<ElementAnnotation> annotations = parameters[0].metadata;
-    expect(annotations, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var metadata = findElement.fieldFormalParameter('f').metadata;
+    expect(metadata, hasLength(1));
   }
 
   test_metadata_function() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 @A f() {}''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    List<FunctionElement> functions = unit.functions;
-    expect(functions, hasLength(1));
-    List<ElementAnnotation> annotations = functions[0].metadata;
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var annotations = findElement.topFunction('f').metadata;
     expect(annotations, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_metadata_functionTypedParameter() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 f(@A int p(int x)) {}''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    List<FunctionElement> functions = unit.functions;
-    expect(functions, hasLength(1));
-    List<ParameterElement> parameters = functions[0].parameters;
-    expect(parameters, hasLength(1));
-    List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    expect(annotations1, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var metadata = findElement.parameter('p').metadata;
+    expect(metadata, hasLength(1));
   }
 
   test_metadata_libraryDirective() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 @A library lib;
 const A = null;''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    List<ElementAnnotation> annotations = library.metadata;
-    expect(annotations, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var metadata = result.libraryElement.metadata;
+    expect(metadata, hasLength(1));
   }
 
   test_metadata_method() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 class C {
   @A void m() {}
 }''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    List<ClassElement> classes = unit.types;
-    expect(classes, hasLength(1));
-    MethodElement method = classes[0].methods[0];
-    List<ElementAnnotation> annotations = method.metadata;
-    expect(annotations, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var metadata = findElement.method('m').metadata;
+    expect(metadata, hasLength(1));
   }
 
   test_metadata_namedParameter() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 f({@A int p : 0}) {}''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    List<FunctionElement> functions = unit.functions;
-    expect(functions, hasLength(1));
-    List<ParameterElement> parameters = functions[0].parameters;
-    expect(parameters, hasLength(1));
-    List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    expect(annotations1, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var metadata = findElement.parameter('p').metadata;
+    expect(metadata, hasLength(1));
   }
 
   test_metadata_positionalParameter() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 f([@A int p = 0]) {}''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    List<FunctionElement> functions = unit.functions;
-    expect(functions, hasLength(1));
-    List<ParameterElement> parameters = functions[0].parameters;
-    expect(parameters, hasLength(1));
-    List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    expect(annotations1, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    var metadata = findElement.parameter('p').metadata;
+    expect(metadata, hasLength(1));
   }
 
   test_metadata_simpleParameter() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 f(@A p1, @A int p2) {}''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    expect(unit, isNotNull);
-    List<FunctionElement> functions = unit.functions;
-    expect(functions, hasLength(1));
-    List<ParameterElement> parameters = functions[0].parameters;
-    expect(parameters, hasLength(2));
-    List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    expect(annotations1, hasLength(1));
-    List<ElementAnnotation> annotations2 = parameters[1].metadata;
-    expect(annotations2, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
+    expect(findElement.parameter('p1').metadata, hasLength(1));
+    expect(findElement.parameter('p2').metadata, hasLength(1));
   }
 
   test_metadata_typedef() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 const A = null;
 @A typedef F<A>();''');
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    CompilationUnitElement unitElement = library.definingCompilationUnit;
-    expect(unitElement, isNotNull);
-    List<FunctionTypeAliasElement> aliases = unitElement.functionTypeAliases;
-    expect(aliases, hasLength(1));
-    List<ElementAnnotation> annotations = aliases[0].metadata;
-    expect(annotations, hasLength(1));
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    NodeList<CompilationUnitMember> declarations = unit.declarations;
-    expect(declarations, hasLength(2));
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
 
-    TopLevelVariableDeclaration variableDeclaration = declarations[0];
-    FunctionTypeAlias functionTypeAlias = declarations[1];
+    expect(
+      findElement.genericTypeAlias('F').metadata,
+      hasLength(1),
+    );
 
-    PropertyInducingElement expectedElement =
-        variableDeclaration.variables.variables[0].name.staticElement;
-
-    Element actualElement = functionTypeAlias.metadata[0].name.staticElement;
-    expect(actualElement, same(expectedElement.getter));
+    var actualElement = findNode.annotation('@A').name.staticElement;
+    expect(actualElement, findElement.topGet('A'));
   }
 
   test_method_fromMixin() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class B {
   bar() => 1;
 }
@@ -1361,13 +1157,13 @@
   bar() => super.bar();
   foo() => super.foo();
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   test_method_fromMixins() async {
-    Source source = addSource('''
+    addTestFile('''
 class B {}
 class M1 {
   void f() {}
@@ -1380,24 +1176,18 @@
   new C().f();
 }
 ''');
-    var analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    // Verify that the "f" in "new C().f()" refers to the "f" defined in M2.
-    List<Statement> statements =
-        AstFinder.getStatementsInTopLevelFunction(analysisResult.unit, 'main');
-    var statement = statements[0] as ExpressionStatement;
-    MethodInvocation expr = statement.expression;
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
     expect(
-        resolutionMap
-            .staticElementForIdentifier(expr.methodName)
-            .enclosingElement
-            .name,
-        'M2');
+      findNode.simple('f();').staticElement,
+      findElement.method('f', of: 'M2'),
+    );
   }
 
   test_method_fromMixins_bare_identifier() async {
-    Source source = addSource('''
+    addTestFile('''
 class B {}
 class M1 {
   void f() {}
@@ -1411,25 +1201,18 @@
   }
 }
 ''');
-    var analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    // Verify that the call to f() in C.g() refers to the method defined in M2.
-    List<Statement> statements =
-        AstFinder.getStatementsInMethod(analysisResult.unit, 'C', 'g');
-    var statement = statements[0] as ExpressionStatement;
-    MethodInvocation invocation = statement.expression;
-    SimpleIdentifier methodName = invocation.methodName;
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
     expect(
-        resolutionMap
-            .staticElementForIdentifier(methodName)
-            .enclosingElement
-            .name,
-        'M2');
+      findNode.simple('f();').staticElement,
+      findElement.method('f', of: 'M2'),
+    );
   }
 
   test_method_fromMixins_invoked_from_outside_class() async {
-    Source source = addSource('''
+    addTestFile('''
 class B {}
 class M1 {
   void f() {}
@@ -1442,25 +1225,18 @@
   new C().f();
 }
 ''');
-    var analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    // Verify that the call to f() in "new C().f()" refers to the method
-    // defined in M2.
-    List<Statement> statements =
-        AstFinder.getStatementsInTopLevelFunction(analysisResult.unit, 'main');
-    var statement = statements[0] as ExpressionStatement;
-    MethodInvocation invocation = statement.expression;
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
     expect(
-        resolutionMap
-            .staticElementForIdentifier(invocation.methodName)
-            .enclosingElement
-            .name,
-        'M2');
+      findNode.simple('f();').staticElement,
+      findElement.method('f', of: 'M2'),
+    );
   }
 
   test_method_fromSuperclassMixin() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   void m1() {}
 }
@@ -1471,13 +1247,13 @@
 f(C c) {
   c.m1();
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   test_methodCascades() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   void m1() {}
   void m2() {}
@@ -1487,13 +1263,13 @@
      ..m2();
   }
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   test_methodCascades_withSetter() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   String name;
   void m1() {}
@@ -1505,23 +1281,23 @@
      ..m2();
   }
 }''');
-    // failing with error code: INVOCATION_OF_NON_FUNCTION
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   test_resolveAgainstNull() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 f(var p) {
   return null == p;
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   test_setter_fromMixins_bare_identifier() async {
-    Source source = addSource('''
+    addTestFile('''
 class B {}
 class M1 {
   set x(value) {}
@@ -1535,26 +1311,18 @@
   }
 }
 ''');
-    var analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    // Verify that the setter for "x" in C.f() refers to the setter defined in
-    // M2.
-    List<Statement> statements =
-        AstFinder.getStatementsInMethod(analysisResult.unit, 'C', 'f');
-    var statement = statements[0] as ExpressionStatement;
-    AssignmentExpression assignment = statement.expression;
-    SimpleIdentifier leftHandSide = assignment.leftHandSide;
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
     expect(
-        resolutionMap
-            .staticElementForIdentifier(leftHandSide)
-            .enclosingElement
-            .name,
-        'M2');
+      findNode.simple('x = ').staticElement,
+      findElement.setter('x', of: 'M2'),
+    );
   }
 
   test_setter_fromMixins_property_access() async {
-    Source source = addSource('''
+    addTestFile('''
 class B {}
 class M1 {
   set x(value) {}
@@ -1567,26 +1335,18 @@
   new C().x = 1;
 }
 ''');
-    var analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    // Verify that the setter for "x" in "new C().x" refers to the setter
-    // defined in M2.
-    List<Statement> statements =
-        AstFinder.getStatementsInTopLevelFunction(analysisResult.unit, 'main');
-    var statement = statements[0] as ExpressionStatement;
-    AssignmentExpression assignment = statement.expression;
-    PropertyAccess propertyAccess = assignment.leftHandSide;
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
+
     expect(
-        resolutionMap
-            .staticElementForIdentifier(propertyAccess.propertyName)
-            .enclosingElement
-            .name,
-        'M2');
+      findNode.simple('x = ').staticElement,
+      findElement.setter('x', of: 'M2'),
+    );
   }
 
   test_setter_inherited() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 class A {
   int get x => 0;
   set x(int p) {}
@@ -1595,49 +1355,41 @@
   int get x => super.x == null ? 0 : super.x;
   int f() => x = 1;
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   test_setter_static() async {
-    Source source = addSource(r'''
+    addTestFile(r'''
 set s(x) {
 }
 
 main() {
   s = 123;
 }''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  @failingTest
-  test_staticInvocation() async {
-    Source source = addSource(r'''
-class A {
-  static int get g => (a,b) => 0;
-}
-class B {
-  f() {
-    A.g(1,0);
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await resolveTestFile();
+    assertNoTestErrors();
+    verifyTestResolved();
   }
 
   /**
-   * Resolve the given source and verify that the arguments in a specific method invocation were
-   * correctly resolved.
+   * Verify that all of the identifiers in the [result] have been resolved.
+   */
+  void verifyTestResolved() {
+    var verifier = new ResolutionVerifier();
+    result.unit.accept(verifier);
+    verifier.assertResolved();
+  }
+
+  /**
+   * Resolve the test file and verify that the arguments in a specific method
+   * invocation were correctly resolved.
    *
-   * The source is expected to be source for a compilation unit, the first declaration is expected
-   * to be a class, the first member of which is expected to be a method with a block body, and the
-   * first statement in the body is expected to be an expression statement whose expression is a
-   * method invocation. It is the arguments to that method invocation that are tested. The method
-   * invocation can contain errors.
+   * The file is expected to define a method named `g`, and has exactly one
+   * [MethodInvocation] in a statement ending with `);`. It is the arguments to
+   * that method invocation that are tested. The method invocation can contain
+   * errors.
    *
    * The arguments were resolved correctly if the number of expressions in the list matches the
    * length of the array of indices and if, for each index in the array of indices, the parameter to
@@ -1645,66 +1397,33 @@
    * parameters at that index. Arguments that should not be resolved to a parameter because of an
    * error can be denoted by including a negative index in the array of indices.
    *
-   * @param source the source to be resolved
    * @param indices the array of indices used to associate arguments with parameters
    * @throws Exception if the source could not be resolved or if the structure of the source is not
    *           valid
    */
-  void _validateArgumentResolution(Source source, List<int> indices) {
-    LibraryElement library = resolve2(source);
-    expect(library, isNotNull);
-    ClassElement classElement = library.definingCompilationUnit.types[0];
-    List<ParameterElement> parameters = classElement.methods[1].parameters;
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    expect(unit, isNotNull);
-    ClassDeclaration classDeclaration =
-        unit.declarations[0] as ClassDeclaration;
-    MethodDeclaration methodDeclaration =
-        classDeclaration.members[0] as MethodDeclaration;
-    Block block = (methodDeclaration.body as BlockFunctionBody).block;
-    ExpressionStatement statement = block.statements[0] as ExpressionStatement;
-    MethodInvocation invocation = statement.expression as MethodInvocation;
-    NodeList<Expression> arguments = invocation.argumentList.arguments;
-    int argumentCount = arguments.length;
+  Future<void> _validateArgumentResolution(List<int> indices) async {
+    await resolveTestFile();
+
+    var g = findElement.method('g');
+    var parameters = g.parameters;
+
+    var invocation = findNode.methodInvocation(');');
+
+    var arguments = invocation.argumentList.arguments;
+
+    var argumentCount = arguments.length;
     expect(argumentCount, indices.length);
-    for (int i = 0; i < argumentCount; i++) {
-      Expression argument = arguments[i];
-      ParameterElement element = argument.staticParameterElement;
-      int index = indices[i];
+
+    for (var i = 0; i < argumentCount; i++) {
+      var argument = arguments[i];
+      var actualParameter = argument.staticParameterElement;
+
+      var index = indices[i];
       if (index < 0) {
-        expect(element, isNull);
+        expect(actualParameter, isNull);
       } else {
-        expect(element, same(parameters[index]));
-      }
-    }
-  }
-}
-
-class _SimpleResolverTest_localVariable_types_invoked
-    extends RecursiveAstVisitor<void> {
-  final SimpleResolverTest test;
-
-  List<bool> found;
-
-  List<CaughtException> thrownException;
-
-  _SimpleResolverTest_localVariable_types_invoked(
-      this.test, this.found, this.thrownException)
-      : super();
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    if (node.name == "myVar" && node.parent is MethodInvocation) {
-      try {
-        found[0] = true;
-        // check static type
-        DartType staticType = node.staticType;
-        expect(staticType is FunctionType, isTrue);
-        FunctionType functionType = staticType;
-        expect(functionType.parameters[0].type, test.typeProvider.intType);
-        expect(functionType.returnType, test.typeProvider.stringType);
-      } on AnalysisException catch (e, stackTrace) {
-        thrownException[0] = new CaughtException(e, stackTrace);
+        var expectedParameter = parameters[index];
+        expect(actualParameter, same(expectedParameter));
       }
     }
   }