diff --git a/tests/compiler/dart2js/codegen/forloop_box_test.dart b/tests/compiler/dart2js/codegen/forloop_box_test.dart
index 915cbf4..0a5c3dd 100644
--- a/tests/compiler/dart2js/codegen/forloop_box_test.dart
+++ b/tests/compiler/dart2js/codegen/forloop_box_test.dart
@@ -54,7 +54,8 @@
     Expect.isFalse(generated2.contains('main_closure(i)'),
         'for-loop variable should have been boxed');
 
-    String generated3 = await compileAll(ONLY_UPDATE_LOOP_VAR_TEST);
+    String generated3 =
+        await compileAll(ONLY_UPDATE_LOOP_VAR_TEST, compileMode: compileMode);
     Expect.isFalse(generated3.contains('main_closure(i)'),
         'for-loop variable should have been boxed');
     Expect.isFalse(generated3.contains(', _box_0.b = 3,'),
diff --git a/tests/compiler/dart2js/codegen/list_tracer_length_test.dart b/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
index d5e8d72..7dc40b5 100644
--- a/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
+++ b/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
@@ -2,8 +2,7 @@
 // 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.
 
-/// TODO(johnniwinther): Move this to the codegen folder. Currently this only
-/// works with the mock compiler.
+/// TODO(johnniwinther): Currently this only works with the mock compiler.
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
@@ -90,23 +89,28 @@
 }
 """;
 
-void checkRangeError(String test, {bool hasRangeError}) {
-  asyncTest(() => compileAll(test).then((generated) {
-        Expect.equals(hasRangeError, generated.contains('ioore'));
-      }));
+checkRangeError(String test, {bool hasRangeError}) async {
+  String generated = await compileAll(test, compileMode: CompileMode.memory);
+  Expect.equals(
+      hasRangeError,
+      generated.contains('ioore'),
+      "Unexpected use of 'hasRangeError' for test:\n$test\n"
+      "in code\n$generated");
 }
 
 main() {
-  checkRangeError(TEST1, hasRangeError: false);
-  checkRangeError(TEST2('insert', 'null, null'), hasRangeError: true);
-  checkRangeError(TEST2('add', 'null'), hasRangeError: true);
-  checkRangeError(TEST2('clear', ''), hasRangeError: true);
-  checkRangeError(TEST2('toString', ''), hasRangeError: false);
-  checkRangeError(TEST3, hasRangeError: false);
-  checkRangeError(TEST4, hasRangeError: true);
-  checkRangeError(TEST5, hasRangeError: true);
-  checkRangeError(TEST6, hasRangeError: true);
-  checkRangeError(TEST7, hasRangeError: false);
-  checkRangeError(TEST8, hasRangeError: true);
-  checkRangeError(TEST9, hasRangeError: false);
+  asyncTest(() async {
+    await checkRangeError(TEST1, hasRangeError: false);
+    await checkRangeError(TEST2('insert', 'null, null'), hasRangeError: true);
+    await checkRangeError(TEST2('add', 'null'), hasRangeError: true);
+    await checkRangeError(TEST2('clear', ''), hasRangeError: true);
+    await checkRangeError(TEST2('toString', ''), hasRangeError: false);
+    await checkRangeError(TEST3, hasRangeError: false);
+    await checkRangeError(TEST4, hasRangeError: true);
+    await checkRangeError(TEST5, hasRangeError: true);
+    await checkRangeError(TEST6, hasRangeError: true);
+    await checkRangeError(TEST7, hasRangeError: false);
+    await checkRangeError(TEST8, hasRangeError: true);
+    await checkRangeError(TEST9, hasRangeError: false);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
index 03ae59c..1d3464c 100644
--- a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
@@ -2,8 +2,7 @@
 // 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.
 
-/// TODO(johnniwinther): Move this to the codegen folder. Currently this only
-/// works with the mock compiler.
+/// TODO(johnniwinther): Currently this only works with the mock compiler.
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
@@ -70,47 +69,59 @@
 }
 
 main() {
-  asyncTest(() => compileAll(TEST1).then((generated) {
-        Expect.isTrue(generated.contains('if (typeof t1'));
-      }));
+  asyncTest(() async {
+    String generated1 =
+        await compileAll(TEST1, compileMode: CompileMode.memory);
+    Expect.isTrue(generated1.contains('if (typeof t1'));
 
-  asyncTest(() => compileAll(TEST2).then((generated) {
-        Expect.isTrue(generated.contains('if (typeof t1'));
-      }));
+    String generated2 =
+        await compileAll(TEST2, compileMode: CompileMode.memory);
+    Expect.isTrue(generated2.contains('if (typeof t1'));
 
-  asyncTest(() => compileAll(TEST3).then((generated) {
-        Expect.isTrue(generated.contains('if (typeof t1'));
-      }));
+    String generated3 =
+        await compileAll(TEST3, compileMode: CompileMode.memory);
+    Expect.isTrue(generated3.contains('if (typeof t1'));
 
-  asyncTest(() => compileAll(TEST4).then((generated) {
-        Expect.isTrue(generated.contains('if (typeof t1'));
-      }));
+    String generated4 =
+        await compileAll(TEST4, compileMode: CompileMode.memory);
+    Expect.isTrue(generated4.contains('if (typeof t1'));
 
-  asyncTest(() => compileAll(TEST5).then((generated) {
-        Expect.isFalse(generated.contains('iae'));
-      }));
+    String generated5 =
+        await compileAll(TEST5, compileMode: CompileMode.memory);
+    Expect.isFalse(generated5.contains('iae'));
 
-  asyncTest(() => compileAll(TEST6).then((generated) {
-        Expect.isFalse(generated.contains('iae'));
-      }));
+    String generated6 =
+        await compileAll(TEST6, compileMode: CompileMode.memory);
+    Expect.isFalse(generated6.contains('iae'));
 
-  var memberInvocations = const <String>[
-    'first',
-    'last',
-    'single',
-    'singleWhere((x) => true)',
-    'elementAt(0)',
-    'removeAt(0)',
-    'removeLast()',
-  ];
-  memberInvocations
-      .map((member) => generateTest('$member'))
-      .forEach((String test) {
-    asyncTest(() => compileAll(test, expectedErrors: 0, expectedWarnings: 0)
-            .then((generated) {
-          Expect.isTrue(generated.contains('+ 42'));
-          Expect.isFalse(generated.contains('if (typeof t1'));
-          Expect.isFalse(generated.contains('if (t1 == null)'));
-        }));
+    var memberInvocations = const <String>[
+      'first',
+      'last',
+      'single',
+      'singleWhere((x) => true)',
+      'elementAt(0)',
+      'removeAt(0)',
+      'removeLast()',
+    ];
+    for (String member in memberInvocations) {
+      String generated = await compileAll(generateTest('$member'),
+          expectedErrors: 0,
+          expectedWarnings: 0,
+          compileMode: CompileMode.memory);
+      Expect.isTrue(
+          generated.contains('+ 42'),
+          "Missing '+ 42' code for invocation '$member':\n"
+          "$generated");
+      // TODO(johnniwinther): Update this test to query the generated code for
+      // main only.
+      /*Expect.isFalse(
+          generated.contains('if (typeof t1'),
+          "Unexpected 'if (typeof t1' code for invocation '$member':\n"
+          "$generated");
+      Expect.isFalse(
+          generated.contains('if (t1 == null)'),
+          "Unexpected 'if (t1 == null)' code for invocation '$member':\n"
+          "$generated");*/
+    }
   });
 }
diff --git a/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
index 4d87085..617e482 100644
--- a/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
+++ b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
@@ -25,15 +25,15 @@
 void main() {
   runTest({bool useKernel}) async {
     String generated = await compileAll(TEST,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.mock);
-    Expect.isTrue(generated.contains('return c + c;'));
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    Expect.isTrue(generated.contains('return c + c;'),
+        "Expected generated code to contain 'return c + c;':\n$generated");
   }
 
   asyncTest(() async {
     print('--test from ast---------------------------------------------------');
     await runTest(useKernel: false);
-    // TODO(johnniwinther): This test only works with the mock compiler.
-    //print('--test from kernel----------------------------------------------');
-    //await runTest(useKernel: true);
+    print('--test from kernel----------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/codegen/static_closure_test.dart b/tests/compiler/dart2js/codegen/static_closure_test.dart
index 67fe7d1..99a57e7 100644
--- a/tests/compiler/dart2js/codegen/static_closure_test.dart
+++ b/tests/compiler/dart2js/codegen/static_closure_test.dart
@@ -11,7 +11,7 @@
 main() {
   runTest({bool useKernel}) async {
     String code = await compileAll(r'''main() { print(main); }''',
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.mock);
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
     // At some point, we will have to closurize global functions
     // differently, at which point this test will break. Then it is time
     // to implement a way to call a Dart closure from JS foreign
@@ -21,15 +21,14 @@
     // toStringWrapper in captureStackTrace in js_helper.dart.
     Expect.isTrue(
         code.contains(
-            new RegExp(r'print\([$A-Z]+\.lib___main\$closure\(\)\);')),
+            new RegExp(r'print\([$A-Z]+\.main__main\$closure\(\)\);')),
         code);
   }
 
   asyncTest(() async {
     print('--test from ast---------------------------------------------------');
     await runTest(useKernel: false);
-    // TODO(johnniwinther): This test only works with the mock compiler.
-    //print('--test from kernel----------------------------------------------');
-    //await runTest(useKernel: true);
+    print('--test from kernel----------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/codegen/type_inference8_test.dart b/tests/compiler/dart2js/codegen/type_inference8_test.dart
index 9c37e97..1222676 100644
--- a/tests/compiler/dart2js/codegen/type_inference8_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference8_test.dart
@@ -9,6 +9,7 @@
 import "package:compiler/src/types/types.dart";
 import "package:expect/expect.dart";
 import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 import 'dart:async';
 
@@ -31,27 +32,27 @@
 }
 """;
 
-Future runTest1() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST1, uri);
-  return compiler.run(uri).then((_) {
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var commonMasks = typesInferrer.closedWorld.commonMasks;
-    MemberElement element = findElement(compiler, "foo");
-    var mask = typesInferrer.getReturnTypeOfMember(element);
-    var falseType =
-        new ValueTypeMask(commonMasks.boolType, new FalseConstantValue());
-    // 'foo' should always return false
-    Expect.equals(falseType, mask);
-    // the argument to 'bar' is always false
-    dynamic bar = findElement(compiler, "bar");
-    var barArg = bar.parameters.first;
-    var barArgMask = typesInferrer.getTypeOfParameter(barArg);
-    Expect.equals(falseType, barArgMask);
-    var barCode = compiler.backend.getGeneratedCode(bar);
-    Expect.isTrue(barCode.contains('"bbb"'));
-    Expect.isFalse(barCode.contains('"aaa"'));
-  });
+Future runTest1() async {
+  var result = await runCompiler(
+      memorySourceFiles: {'main.dart': TEST1},
+      options: ['--use-old-frontend', '--disable-inlining']);
+  var compiler = result.compiler;
+  var typesInferrer = compiler.globalInference.typesInferrerInternal;
+  var commonMasks = typesInferrer.closedWorld.commonMasks;
+  MemberElement element = findElement(compiler, "foo");
+  var mask = typesInferrer.getReturnTypeOfMember(element);
+  var falseType =
+      new ValueTypeMask(commonMasks.boolType, new FalseConstantValue());
+  // 'foo' should always return false
+  Expect.equals(falseType, mask);
+  // the argument to 'bar' is always false
+  dynamic bar = findElement(compiler, "bar");
+  var barArg = bar.parameters.first;
+  var barArgMask = typesInferrer.getTypeOfParameter(barArg);
+  Expect.equals(falseType, barArgMask);
+  var barCode = compiler.backend.getGeneratedCode(bar);
+  Expect.isTrue(barCode.contains('"bbb"'));
+  Expect.isFalse(barCode.contains('"aaa"'));
 }
 
 const String TEST2 = r"""
@@ -74,26 +75,26 @@
 }
 """;
 
-Future runTest2() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST2, uri);
-  return compiler.run(uri).then((_) {
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var commonMasks = typesInferrer.closedWorld.commonMasks;
-    MemberElement element = findElement(compiler, "foo");
-    var mask = typesInferrer.getReturnTypeOfMember(element);
-    // Can't infer value for foo's return type, it could be either true or false
-    Expect.identical(commonMasks.boolType, mask);
-    dynamic bar = findElement(compiler, "bar");
-    var barArg = bar.parameters.first;
-    var barArgMask = typesInferrer.getTypeOfParameter(barArg);
-    // The argument to bar should have the same type as the return type of foo
-    Expect.identical(commonMasks.boolType, barArgMask);
-    var barCode = compiler.backend.getGeneratedCode(bar);
-    Expect.isTrue(barCode.contains('"bbb"'));
-    // Still must output the print for "aaa"
-    Expect.isTrue(barCode.contains('"aaa"'));
-  });
+Future runTest2() async {
+  var result = await runCompiler(
+      memorySourceFiles: {'main.dart': TEST2},
+      options: ['--use-old-frontend', '--disable-inlining']);
+  var compiler = result.compiler;
+  var typesInferrer = compiler.globalInference.typesInferrerInternal;
+  var commonMasks = typesInferrer.closedWorld.commonMasks;
+  MemberElement element = findElement(compiler, "foo");
+  var mask = typesInferrer.getReturnTypeOfMember(element);
+  // Can't infer value for foo's return type, it could be either true or false
+  Expect.identical(commonMasks.boolType, mask);
+  dynamic bar = findElement(compiler, "bar");
+  var barArg = bar.parameters.first;
+  var barArgMask = typesInferrer.getTypeOfParameter(barArg);
+  // The argument to bar should have the same type as the return type of foo
+  Expect.identical(commonMasks.boolType, barArgMask);
+  var barCode = compiler.backend.getGeneratedCode(bar);
+  Expect.isTrue(barCode.contains('"bbb"'));
+  // Still must output the print for "aaa"
+  Expect.isTrue(barCode.contains('"aaa"'));
 }
 
 main() {
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index dfd7721..c578e2c 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -34,22 +34,18 @@
 
 export 'package:compiler/src/tree/tree.dart';
 
-import 'old_frontend/mock_compiler.dart';
-export 'old_frontend/mock_compiler.dart';
-
 import 'memory_compiler.dart';
 
 import 'output_collector.dart';
 export 'output_collector.dart';
 
-enum CompileMode { mock, memory, kernel }
+enum CompileMode { memory, kernel }
 
-/// Compile [code] and returns either the code for [methodName] or, if [returnAll] is
-/// true, the code for the entire program.
+/// Compile [code] and returns either the code for [methodName] or, if
+/// [returnAll] is true, the code for the entire program.
 ///
 /// If [check] is provided, it is executed on the code for [entry] before
-/// returning. If [useMock] is `true` the [MockCompiler] is used for
-/// compilation, otherwise the memory compiler is used.
+/// returning.
 Future<String> compile(String code,
     {String entry: 'main',
     String methodName,
@@ -116,87 +112,37 @@
     bool minify: false,
     int expectedErrors,
     int expectedWarnings,
-    CompileMode compileMode: CompileMode.mock}) async {
+    CompileMode compileMode: CompileMode.memory}) async {
   OutputCollector outputCollector = new OutputCollector();
-  if (compileMode == CompileMode.mock) {
-    Uri uri = new Uri(scheme: 'source');
-    MockCompiler compiler = mockCompilerFor(code, uri,
-        coreSource: coreSource,
-        disableInlining: disableInlining,
-        minify: minify,
-        expectedErrors: expectedErrors,
-        trustTypeAnnotations: trustTypeAnnotations,
-        expectedWarnings: expectedWarnings,
-        outputProvider: outputCollector);
-    compiler.diagnosticHandler = createHandler(compiler, code);
-    bool compilationSucceeded = await compiler.run(uri);
-    Expect.isTrue(
-        compilationSucceeded,
-        'Unexpected compilation error(s): '
-        '${compiler.diagnosticCollector.errors}');
-  } else {
-    DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
-    if (coreSource != null) {
-      throw new UnsupportedError(
-          'coreSource is not supported for $compileMode');
-    }
-    List<String> options = <String>[];
-    if (disableInlining) {
-      options.add(Flags.disableInlining);
-    }
-    if (trustTypeAnnotations) {
-      options.add(Flags.trustTypeAnnotations);
-    }
-    if (minify) {
-      options.add(Flags.minify);
-    }
-    if (compileMode == CompileMode.kernel) {
-      options.add(Flags.useKernel);
-    }
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': code},
-        options: options,
-        outputProvider: outputCollector,
-        diagnosticHandler: diagnosticCollector);
-    Expect.isTrue(
-        result.isSuccess,
-        'Unexpected compilation error(s): '
-        '${diagnosticCollector.errors}');
+  DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
+  if (coreSource != null) {
+    throw new UnsupportedError('coreSource is not supported for $compileMode');
   }
+  List<String> options = <String>[];
+  if (disableInlining) {
+    options.add(Flags.disableInlining);
+  }
+  if (trustTypeAnnotations) {
+    options.add(Flags.trustTypeAnnotations);
+  }
+  if (minify) {
+    options.add(Flags.minify);
+  }
+  if (compileMode == CompileMode.kernel) {
+    options.add(Flags.useKernel);
+  }
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: {'main.dart': code},
+      options: options,
+      outputProvider: outputCollector,
+      diagnosticHandler: diagnosticCollector);
+  Expect.isTrue(
+      result.isSuccess,
+      'Unexpected compilation error(s): '
+      '${diagnosticCollector.errors}');
   return outputCollector.getOutput('', OutputType.js);
 }
 
-Future analyzeAndCheck(
-    String code, String name, check(MockCompiler compiler, Element element),
-    {int expectedErrors, int expectedWarnings}) {
-  Uri uri = new Uri(scheme: 'source');
-  MockCompiler compiler = mockCompilerFor(code, uri,
-      expectedErrors: expectedErrors,
-      expectedWarnings: expectedWarnings,
-      analyzeOnly: true);
-  return compiler.run(uri).then((_) {
-    Element element = findElement(compiler, name);
-    return check(compiler, element);
-  });
-}
-
-Future compileSources(
-    Map<String, String> sources, check(MockCompiler compiler)) {
-  Uri base = new Uri(scheme: 'source', path: '/');
-  Uri mainUri = base.resolve('main.dart');
-  String mainCode = sources['main.dart'];
-  Expect.isNotNull(mainCode, 'No source code found for "main.dart"');
-  MockCompiler compiler = mockCompilerFor(mainCode, mainUri);
-  sources.forEach((String path, String code) {
-    if (path == 'main.dart') return;
-    compiler.registerSource(base.resolve(path), code);
-  });
-
-  return compiler.run(mainUri).then((_) {
-    return check(compiler);
-  });
-}
-
 Element findElement(compiler, String name, [Uri library]) {
   LibraryElement lib = compiler.frontendStrategy.elementEnvironment.mainLibrary;
   if (library != null) {
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 66b9211..ed2eb24 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -1,14 +1,17 @@
 # Copyright (c) 2012, 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.
+
 analyze_dart_test: Slow, Pass
 analyze_test: Slow, Pass
 async_await_syntax_test: Pass # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
 boolified_operator_test: Fail # Issue 8001
 closure/closure_test: Pass, Slow
 codegen/gvn_dynamic_field_get_test: Fail # Issue 18519
+codegen/list_tracer_length_test: Fail # Issue 33051
 codegen/load_elimination_test: Pass, Slow
 codegen/logical_expression_test: Fail # Issue 17027
+codegen/side_effect_tdiv_regression_test: Fail # Issue 33050
 codegen/simple_function_subtype_test: Fail # simple_function_subtype_test is temporarily(?) disabled due to new method for building function type tests.
 deferred_loading/deferred_loading_test: Slow, Pass
 equivalence/id_equivalence1_test: Pass, Slow
diff --git a/tests/compiler/dart2js/old_frontend/mock_compiler.dart b/tests/compiler/dart2js/old_frontend/mock_compiler.dart
deleted file mode 100644
index 2bb5bee..0000000
--- a/tests/compiler/dart2js/old_frontend/mock_compiler.dart
+++ /dev/null
@@ -1,401 +0,0 @@
-// Copyright (c) 2016, 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.
-
-library mock_compiler;
-
-import 'dart:async';
-import 'dart:collection';
-
-import 'package:compiler/compiler_new.dart' as api;
-import 'package:compiler/src/common/names.dart' show Uris;
-import 'package:compiler/src/constants/expressions.dart';
-import 'package:compiler/src/elements/resolution_types.dart'
-    show ResolutionDartType;
-import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
-import 'package:compiler/src/diagnostics/source_span.dart';
-import 'package:compiler/src/diagnostics/spannable.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/elements/visitor.dart';
-import 'package:compiler/src/library_loader.dart' show LoadedLibraries;
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/options.dart' show CompilerOptions;
-import 'package:compiler/src/resolution/members.dart';
-import 'package:compiler/src/resolution/registry.dart';
-import 'package:compiler/src/resolution/scope.dart';
-import 'package:compiler/src/resolution/tree_elements.dart';
-import 'package:compiler/src/resolved_uri_translator.dart';
-import 'package:compiler/src/script.dart';
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/old_to_new_api.dart';
-import 'parser_helper.dart';
-
-import 'package:compiler/src/elements/modelx.dart'
-    show ErroneousElementX, FunctionElementX;
-
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/common/tasks.dart' show Measurer;
-
-import 'package:compiler/src/deferred_load.dart' show OutputUnit;
-
-import 'package:compiler/src/resolution/deferred_load.dart'
-    show AstDeferredLoadTask;
-
-import 'mock_libraries.dart';
-import '../diagnostic_helper.dart';
-
-export '../diagnostic_helper.dart';
-
-final Uri PATCH_CORE = new Uri(scheme: 'patch', path: 'core');
-
-typedef String LibrarySourceProvider(Uri uri);
-
-class MockCompiler extends Compiler {
-  api.CompilerDiagnostics diagnosticHandler;
-  final api.CompilerInput provider = null;
-
-  /// Expected number of warnings. If `null`, the number of warnings is
-  /// not checked.
-  final int expectedWarnings;
-
-  /// Expected number of errors. If `null`, the number of errors is not checked.
-  final int expectedErrors;
-  final Map<String, SourceFile> sourceFiles;
-  Node parsedTree;
-  final LibrarySourceProvider librariesOverride;
-  final DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
-  final ResolvedUriTranslator resolvedUriTranslator =
-      new MockResolvedUriTranslator();
-  final Measurer measurer = new Measurer();
-  LibraryElement mainApp;
-
-  MockCompiler.internal(
-      {Map<String, String> coreSource,
-      bool enableTypeAssertions: false,
-      bool enableUserAssertions: false,
-      bool enableMinification: false,
-      bool disableTypeInference: false,
-      bool analyzeAll: false,
-      bool analyzeOnly: false,
-      // Our unit tests check code generation output that is
-      // affected by inlining support.
-      bool disableInlining: true,
-      bool trustTypeAnnotations: false,
-      bool trustJSInteropTypeAnnotations: false,
-      bool enableAsyncAwait: false,
-      int this.expectedWarnings,
-      int this.expectedErrors,
-      api.CompilerOutput outputProvider,
-      LibrarySourceProvider this.librariesOverride})
-      : sourceFiles = new Map<String, SourceFile>(),
-        super(
-            options: new CompilerOptions()
-              ..entryPoint = new Uri(scheme: 'mock')
-              ..libraryRoot = Uri.parse('placeholder_library_root_for_mock/')
-              ..useKernel = false
-              ..enableTypeAssertions = enableTypeAssertions
-              ..enableUserAssertions = enableUserAssertions
-              ..disableInlining = disableInlining
-              ..enableAssertMessage = true
-              ..enableMinification = enableMinification
-              ..disableTypeInference = disableTypeInference
-              ..analyzeAll = analyzeAll
-              ..analyzeOnly = analyzeOnly
-              ..trustTypeAnnotations = trustTypeAnnotations
-              ..trustJSInteropTypeAnnotations = trustJSInteropTypeAnnotations
-              ..shownPackageWarnings = const [],
-            outputProvider: outputProvider) {
-    deferredLoadTask = new MockDeferredLoadTask(this);
-
-    registerSource(
-        Uris.dart_core, buildLibrarySource(DEFAULT_CORE_LIBRARY, coreSource));
-    registerSource(PATCH_CORE, DEFAULT_PATCH_CORE_SOURCE);
-    registerSource(
-        Uris.dart__internal, buildLibrarySource(DEFAULT_INTERNAL_LIBRARY));
-
-    registerSource(
-        Uris.dart__js_helper, buildLibrarySource(DEFAULT_JS_HELPER_LIBRARY));
-    registerSource(Uris.dart__foreign_helper,
-        buildLibrarySource(DEFAULT_FOREIGN_HELPER_LIBRARY));
-    registerSource(Uris.dart__interceptors,
-        buildLibrarySource(DEFAULT_INTERCEPTORS_LIBRARY));
-    registerSource(Uris.dart__isolate_helper,
-        buildLibrarySource(DEFAULT_ISOLATE_HELPER_LIBRARY));
-    registerSource(Uris.dart_mirrors, DEFAULT_MIRRORS_SOURCE);
-    registerSource(Uris.dart__js_mirrors, DEFAULT_JS_MIRRORS_SOURCE);
-
-    Map<String, String> asyncLibrarySource = <String, String>{};
-    asyncLibrarySource.addAll(DEFAULT_ASYNC_LIBRARY);
-    if (enableAsyncAwait) {
-      asyncLibrarySource.addAll(ASYNC_AWAIT_LIBRARY);
-    }
-    registerSource(Uris.dart_async, buildLibrarySource(asyncLibrarySource));
-  }
-
-  /// Initialize the mock compiler with an empty main library.
-  Future<Uri> init([String mainSource = ""]) {
-    Uri uri = new Uri(scheme: "mock");
-    registerSource(uri, mainSource);
-    return libraryLoader
-        .loadLibrary(uri)
-        .then((LoadedLibraries loadedLibraries) {
-      processLoadedLibraries(loadedLibraries);
-      mainApp = loadedLibraries.rootLibrary;
-      startResolution();
-      // We need to make sure the Object class is resolved. When registering a
-      // dynamic invocation the ArgumentTypesRegistry eventually iterates over
-      // the interfaces of the Object class which would be 'null' if the class
-      // wasn't resolved.
-      ClassElement objectClass = resolution.commonElements.objectClass;
-      objectClass.ensureResolved(resolution);
-    }).then((_) => uri);
-  }
-
-  Future<bool> run(Uri uri, [String mainSource = ""]) {
-    return init(mainSource).then((Uri mainUri) {
-      return super.run(uri == null ? mainUri : uri);
-    }).then((result) {
-      if (expectedErrors != null &&
-          expectedErrors != diagnosticCollector.errors.length) {
-        throw "unexpected error during compilation "
-            "${diagnosticCollector.errors}";
-      } else if (expectedWarnings != null &&
-          expectedWarnings != diagnosticCollector.warnings.length) {
-        throw "unexpected warnings during compilation "
-            "${diagnosticCollector.warnings}";
-      } else {
-        return result;
-      }
-    });
-  }
-
-  /**
-   * Registers the [source] with [uri] making it possible load [source] as a
-   * library.  If an override has been provided in [librariesOverride], that
-   * is used instead.
-   */
-  void registerSource(Uri uri, String source) {
-    if (librariesOverride != null) {
-      String override = librariesOverride(uri);
-      if (override != null) {
-        source = override;
-      }
-    }
-    sourceFiles[uri.toString()] = new MockFile(source);
-  }
-
-  void reportDiagnostic(DiagnosticMessage message,
-      List<DiagnosticMessage> infoMessages, api.Diagnostic kind) {
-    void processMessage(DiagnosticMessage message, api.Diagnostic kind) {
-      SourceSpan span = message.sourceSpan;
-      Uri uri;
-      int begin;
-      int end;
-      String text = '${message.message}';
-      if (span != null) {
-        uri = span.uri;
-        begin = span.begin;
-        end = span.end;
-      }
-      diagnosticCollector.report(message.message, uri, begin, end, text, kind);
-      if (diagnosticHandler != null) {
-        diagnosticHandler.report(message.message, uri, begin, end, text, kind);
-      }
-    }
-
-    processMessage(message, kind);
-    infoMessages.forEach((i) => processMessage(i, api.Diagnostic.INFO));
-  }
-
-  CollectingTreeElements resolveStatement(String text) {
-    parsedTree = parseStatement(text);
-    LibraryElement library = mainApp;
-    return resolveNodeStatement(parsedTree, new MockElement(library));
-  }
-
-  TreeElementMapping resolveNodeStatement(
-      Node tree, ExecutableElement element) {
-    ResolverVisitor visitor = new ResolverVisitor(
-        this.resolution,
-        element,
-        new ResolutionRegistry(
-            this.backend.target, new CollectingTreeElements(element)),
-        scope:
-            new MockTypeVariablesScope(element.enclosingElement.buildScope()));
-    if (visitor.scope is LibraryScope ||
-        visitor.scope is MockTypeVariablesScope) {
-      visitor.scope = new MethodScope(visitor.scope, element);
-    }
-    visitor.visit(tree);
-    visitor.scope = new LibraryScope(element.library);
-    return visitor.registry.mapping;
-  }
-
-  resolverVisitor() {
-    LibraryElement library = mainApp;
-    Element mockElement = new MockElement(library.entryCompilationUnit);
-    ResolverVisitor visitor = new ResolverVisitor(
-        this.resolution,
-        mockElement,
-        new ResolutionRegistry(
-            this.backend.target, new CollectingTreeElements(mockElement)),
-        scope: mockElement.enclosingElement.buildScope());
-    visitor.scope = new MethodScope(visitor.scope, mockElement);
-    return visitor;
-  }
-
-  parseScript(String text, [LibraryElement library]) {
-    if (library == null) library = mainApp;
-    parseUnit(text, this, library, registerSource);
-  }
-
-  Future scanBuiltinLibraries() {
-    // Do nothing. The mock core library is already handled in the constructor.
-    return new Future.value();
-  }
-
-  Future<LibraryElement> scanBuiltinLibrary(String name) {
-    // Do nothing. The mock core library is already handled in the constructor.
-    return new Future.value();
-  }
-
-  // The mock library doesn't need any patches.
-  Uri resolvePatchUri(String dartLibraryName) {
-    if (dartLibraryName == 'core') {
-      return PATCH_CORE;
-    }
-    return null;
-  }
-
-  Future<Script> readScript(Uri uri, [Spannable spannable]) {
-    SourceFile sourceFile = sourceFiles[uri.toString()];
-    if (sourceFile == null) throw new ArgumentError(uri);
-    return new Future.value(new Script(uri, uri, sourceFile));
-  }
-
-  Element lookupElementIn(ScopeContainerElement container, name) {
-    Element element = container.localLookup(name);
-    return element != null
-        ? element
-        : new ErroneousElementX(null, null, name, container);
-  }
-
-  /// Create a new [MockCompiler] and apply it asynchronously to [f].
-  static Future<T> create<T>(FutureOr<T> f(MockCompiler compiler)) {
-    MockCompiler compiler = new MockCompiler.internal();
-    return compiler.init().then((_) => f(compiler));
-  }
-}
-
-class MockResolvedUriTranslator implements ResolvedUriTranslator {
-  static final dynamic _emptySet = new Set();
-
-  Uri translate(LibraryElement importingLibrary, Uri resolvedUri,
-          Spannable spannable) =>
-      resolvedUri;
-  Set<Uri> get disallowedLibraryUris => _emptySet;
-  bool get mockableLibraryUsed => false;
-  Map<String, Uri> get sdkLibraries => const <String, Uri>{};
-}
-
-class CollectingTreeElements extends TreeElementMapping {
-  final Map<Node, Element> map = new LinkedHashMap<Node, Element>();
-
-  CollectingTreeElements(Element currentElement) : super(currentElement);
-
-  operator []=(Node node, Element element) {
-    map[node] = element;
-  }
-
-  operator [](Node node) => map[node];
-
-  void remove(Node node) {
-    map.remove(node);
-  }
-
-  List<ConstantExpression> get constants {
-    List<ConstantExpression> list = <ConstantExpression>[];
-    forEachConstantNode((_, c) => list.add(c));
-    return list;
-  }
-}
-
-class MockTypeVariablesScope extends TypeVariablesScope {
-  @override
-  List<ResolutionDartType> get typeVariables => <ResolutionDartType>[];
-  MockTypeVariablesScope(Scope parent) : super(parent);
-  String toString() => 'MockTypeVariablesScope($parent)';
-}
-
-// The mock compiler does not split the program in output units.
-class MockDeferredLoadTask extends AstDeferredLoadTask {
-  MockDeferredLoadTask(Compiler compiler) : super(compiler);
-
-  OutputUnit getElementOutputUnit(dynamic dependency) {
-    return mainOutputUnit;
-  }
-}
-
-api.CompilerDiagnostics createHandler(MockCompiler compiler, String text,
-    {bool verbose: false}) {
-  return new LegacyCompilerDiagnostics(
-      (uri, int begin, int end, String message, kind) {
-    if (kind == api.Diagnostic.VERBOSE_INFO && !verbose) return;
-    SourceFile sourceFile;
-    if (uri == null) {
-      sourceFile = new StringSourceFile.fromName('analysis', text);
-    } else {
-      sourceFile = compiler.sourceFiles[uri.toString()];
-    }
-    if (sourceFile != null && begin != null && end != null) {
-      print('${kind}: ${sourceFile.getLocationMessage(message, begin, end)}');
-    } else {
-      print('${kind}: $message');
-    }
-  });
-}
-
-class MockElement extends FunctionElementX {
-  MockElement(Element enclosingElement)
-      : super('', ElementKind.FUNCTION, Modifiers.EMPTY, enclosingElement);
-
-  get node => null;
-
-  parseNode(_) => null;
-
-  bool get hasNode => false;
-
-  accept(ElementVisitor visitor, arg) {
-    return visitor.visitMethodElement(this, arg);
-  }
-}
-
-// TODO(herhut): Disallow warnings and errors during compilation by default.
-MockCompiler mockCompilerFor(String code, Uri uri,
-    {bool analyzeAll: false,
-    bool analyzeOnly: false,
-    Map<String, String> coreSource,
-    bool disableInlining: true,
-    bool minify: false,
-    bool trustTypeAnnotations: false,
-    bool enableTypeAssertions: false,
-    bool enableUserAssertions: false,
-    int expectedErrors,
-    int expectedWarnings,
-    api.CompilerOutput outputProvider}) {
-  MockCompiler compiler = new MockCompiler.internal(
-      analyzeAll: analyzeAll,
-      analyzeOnly: analyzeOnly,
-      coreSource: coreSource,
-      disableInlining: disableInlining,
-      enableMinification: minify,
-      trustTypeAnnotations: trustTypeAnnotations,
-      enableTypeAssertions: enableTypeAssertions,
-      enableUserAssertions: enableUserAssertions,
-      expectedErrors: expectedErrors,
-      expectedWarnings: expectedWarnings,
-      outputProvider: outputProvider);
-  compiler.registerSource(uri, code);
-  compiler.diagnosticHandler = createHandler(compiler, code);
-  return compiler;
-}
diff --git a/tests/compiler/dart2js/old_frontend/options_helper.dart b/tests/compiler/dart2js/old_frontend/options_helper.dart
deleted file mode 100644
index ec63774..0000000
--- a/tests/compiler/dart2js/old_frontend/options_helper.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2016, 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.
-
-library options_helper;
-
-import 'package:compiler/src/options.dart';
-export 'package:compiler/src/options.dart';
-
-class MockDiagnosticOptions implements DiagnosticOptions {
-  const MockDiagnosticOptions();
-
-  bool get fatalWarnings => false;
-  bool get terseDiagnostics => false;
-  bool get suppressWarnings => false;
-  bool get suppressHints => false;
-  bool get showAllPackageWarnings => false;
-  bool get hidePackageWarnings => true;
-  bool showPackageWarningsFor(Uri uri) => false;
-}
diff --git a/tests/compiler/dart2js/old_frontend/parser_helper.dart b/tests/compiler/dart2js/old_frontend/parser_helper.dart
deleted file mode 100644
index 55a4f34..0000000
--- a/tests/compiler/dart2js/old_frontend/parser_helper.dart
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (c) 2016, 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.
-
-library parser_helper;
-
-import 'package:expect/expect.dart';
-
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/id_generator.dart';
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/parser/element_listener.dart';
-import 'package:compiler/src/parser/node_listener.dart';
-import 'package:compiler/src/parser/diet_parser_task.dart';
-import 'package:front_end/src/fasta/parser.dart' hide parse;
-import 'package:front_end/src/fasta/scanner.dart' hide scan;
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/util/util.dart';
-
-import 'package:compiler/src/elements/modelx.dart'
-    show CompilationUnitElementX, ElementX, LibraryElementX;
-
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/options.dart';
-import 'package:compiler/src/diagnostics/source_span.dart';
-import 'package:compiler/src/diagnostics/spannable.dart';
-import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import 'package:compiler/src/script.dart';
-
-import 'options_helper.dart';
-
-export 'package:front_end/src/fasta/parser.dart' hide parse;
-export 'package:front_end/src/fasta/scanner.dart' hide scan;
-export 'package:compiler/src/diagnostics/diagnostic_listener.dart';
-export 'package:compiler/src/parser/node_listener.dart';
-export 'package:compiler/src/parser/diet_parser_task.dart';
-export 'package:front_end/src/fasta/scanner/token_constants.dart';
-
-import 'mock_compiler.dart';
-
-class LoggerCanceler extends DiagnosticReporter {
-  DiagnosticOptions get options => const MockDiagnosticOptions();
-
-  void log(message) {
-    print(message);
-  }
-
-  void internalError(Spannable node, message) {
-    log(message);
-  }
-
-  SourceSpan spanFromSpannable(node) {
-    throw 'unsupported operation';
-  }
-
-  SourceSpan spanFromToken(token) => null;
-
-  void reportError(DiagnosticMessage message,
-      [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
-    log(message);
-    infos.forEach(log);
-  }
-
-  void reportWarning(DiagnosticMessage message,
-      [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
-    log(message);
-    infos.forEach(log);
-  }
-
-  void reportInfo(Spannable node, MessageKind errorCode,
-      [Map arguments = const {}]) {
-    log(new Message(MessageTemplate.TEMPLATES[errorCode], arguments, false));
-  }
-
-  void reportHint(DiagnosticMessage message,
-      [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
-    log(message);
-    infos.forEach(log);
-  }
-
-  withCurrentElement(Entity element, f()) => f();
-
-  @override
-  DiagnosticMessage createMessage(Spannable spannable, MessageKind messageKind,
-      [Map arguments = const {}]) {
-    return new DiagnosticMessage(null, spannable,
-        new Message(MessageTemplate.TEMPLATES[messageKind], arguments, false));
-  }
-
-  @override
-  bool get hasReportedError => false;
-}
-
-Token scan(String text) => new StringScanner(text).tokenize();
-
-Node parseBodyCode(String text, Function parseMethod,
-    {DiagnosticReporter reporter}) {
-  Token tokens = scan(text);
-  if (reporter == null) reporter = new LoggerCanceler();
-  Uri uri = new Uri(scheme: "source");
-  Script script = new Script(uri, uri, new MockFile(text));
-  LibraryElement library = new LibraryElementX(script);
-  NodeListener listener = new NodeListener(
-      new ScannerOptions(canUseNative: true),
-      reporter,
-      library.entryCompilationUnit);
-  Parser parser = new Parser(listener);
-  Token endToken = parseMethod(parser, tokens).next;
-  assert(endToken.kind == EOF_TOKEN);
-  Node node = listener.popNode();
-  Expect.isNotNull(node);
-  Expect.isTrue(listener.nodes.isEmpty, 'Not empty: ${listener.nodes}');
-  return node;
-}
-
-Node parseStatement(String text) => parseBodyCode(
-    text,
-    (parser, tokens) =>
-        parser.parseStatement(parser.syntheticPreviousToken(tokens)));
-
-Node parseFunction(String text, MockCompiler compiler) {
-  ElementX element = parseUnit(text, compiler, compiler.mainApp).head;
-  Expect.isNotNull(element);
-  Expect.equals(ElementKind.FUNCTION, element.kind);
-  return element.parseNode(compiler.parsingContext);
-}
-
-Node parseMember(String text, {DiagnosticReporter reporter}) {
-  return parseBodyCode(
-      text, (parser, tokens) => parser.parseClassMember(tokens),
-      reporter: reporter);
-}
-
-class MockFile extends StringSourceFile {
-  MockFile(text) : super.fromName('<string>', text);
-}
-
-var sourceCounter = 0;
-
-Link<Element> parseUnit(String text, Compiler compiler, LibraryElement library,
-    [void registerSource(Uri uri, String source)]) {
-  Token tokens = scan(text);
-  Uri uri = new Uri(scheme: "source", path: '${++sourceCounter}');
-  if (registerSource != null) {
-    registerSource(uri, text);
-  }
-  var script = new Script(uri, uri, new MockFile(text));
-  var unit = new CompilationUnitElementX(script, library);
-  DiagnosticReporter reporter = compiler.reporter;
-  ElementListener listener = new ElementListener(
-      compiler.parsingContext.getScannerOptionsFor(library),
-      reporter,
-      unit,
-      new IdGenerator());
-  PartialParser parser = new PartialParser(listener);
-  reporter.withCurrentElement(unit, () => parser.parseUnit(tokens));
-  return unit.localMembers;
-}
-
-NodeList fullParseUnit(String source, {DiagnosticReporter reporter}) {
-  return parseBodyCode(source, (parser, tokens) => parser.parseUnit(tokens),
-      reporter: reporter);
-}
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart
deleted file mode 100644
index bd74cbe..0000000
--- a/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/io/code_output.dart';
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/io/source_information.dart';
-import 'package:compiler/src/js_backend/js_backend.dart';
-import 'package:compiler/src/js_emitter/full_emitter/emitter.dart' as full
-    show Emitter;
-
-import '../old_frontend/mock_compiler.dart';
-
-Future<CodeOutput> compileAll(SourceFile sourceFile) {
-  MockCompiler compiler = new MockCompiler.internal();
-  Uri uri = new Uri(path: sourceFile.filename);
-  compiler.sourceFiles[uri.toString()] = sourceFile;
-  JavaScriptBackend backend = compiler.backend;
-  return compiler.run(uri).then((_) {
-    // TODO(floitsch): the outputBuffers are only accessible in the full
-    // emitter.
-    full.Emitter fullEmitter = backend.emitter.emitter;
-    return fullEmitter
-        .outputBuffers[compiler.backend.outputUnitData.mainOutputUnit];
-  });
-}
-
-void testSourceMapLocations(String codeWithMarkers) {
-  List<int> expectedLocations = new List<int>();
-  for (int i = 0; i < codeWithMarkers.length; ++i) {
-    if (codeWithMarkers[i] == '@') {
-      expectedLocations.add(i - expectedLocations.length);
-    }
-  }
-  String code = codeWithMarkers.replaceAll('@', '');
-
-  SourceFile sourceFile = new StringSourceFile.fromName('<test script>', code);
-  asyncTest(() => compileAll(sourceFile).then((CodeOutput output) {
-        Set<int> locations = new Set<int>();
-        SourceLocations sourceLocations = output.sourceLocations.single;
-        sourceLocations
-            .forEachSourceLocation((int offset, SourceLocation sourcePosition) {
-          if (sourcePosition != null &&
-              sourcePosition.sourceUri == sourceFile.uri) {
-            locations.add(sourcePosition.offset);
-          }
-        });
-
-        for (int i = 0; i < expectedLocations.length; ++i) {
-          int expectedLocation = expectedLocations[i];
-          if (!locations.contains(expectedLocation)) {
-            int originalLocation = expectedLocation + i;
-            SourceFile sourceFileWithMarkers =
-                new StringSourceFile.fromName('<test script>', codeWithMarkers);
-            String message = sourceFileWithMarkers.getLocationMessage(
-                'Missing location', originalLocation, originalLocation + 1);
-            Expect.fail(message);
-          }
-        }
-      }));
-}
-
-String FUNCTIONS_TEST = '''
-@void main() { print(test(15)); @}
-// The 'if' has been added to avoid inlining of 'test'.
-@int test(int x) { if (x != null) return x; else return null; @}''';
-
-String RETURN_TEST = 'void main() { print(((x) { @return x; })(0)); }';
-
-String NOT_TEST = 'void main() { ((x) { if (@!x) print(x); })(1==2); }';
-
-String UNARY_TEST = 'void main() { ((x, y) { print(@-x + @~y); })(1,2); }';
-
-String BINARY_TEST =
-    'void main() { ((x, y) { if (x @!= y) print(x @* y); })(1,2); }';
-
-String SEND_TEST = '''
-void main() {
-  @staticSend(0);
-  NewSend o = @new NewSend();
-  @o.dynamicSend(0);
-  var closureSend = (x) { print(x); };
-  @closureSend(0);
-}
-// The 'if' has been added to avoid inlining of 'staticSend'.
-void staticSend(x) { if (x == null) return; print(x); }
-class NewSend { void dynamicSend(x) { print(x); } }
-''';
-
-String SEND_SET_TEST = '''
-String global;
-void main() { @global = ''; print(new A().foo()); }
-class A { int x; foo() { @x = 3; } }''';
-
-String LOOP_TEST = '''
-void main() {
-  @for (int i = 0; i < 100; ++i) { print(test(13)); @}
-}
-int test(int x) {
-  int result = 1; @while (result < x) { result <<= 1; @} return result;
-}''';
-
-String INTERCEPTOR_TEST = '''void main() { var l = []; @l.add(0); print(l); }
-''';
-
-main() {
-  // These tests are fragile, since mappings for specific source locations
-  // could disappear due to various optimizations like code elimination,
-  // function inlining, etc. If you broke the test, please try to rewrite it
-  // so that the new code is not optimized, otherwise just remove the marker
-  // from problematic location.
-  testSourceMapLocations(FUNCTIONS_TEST);
-  testSourceMapLocations(RETURN_TEST);
-  testSourceMapLocations(NOT_TEST);
-  testSourceMapLocations(UNARY_TEST);
-  testSourceMapLocations(BINARY_TEST);
-  testSourceMapLocations(SEND_TEST);
-  testSourceMapLocations(SEND_SET_TEST);
-  testSourceMapLocations(LOOP_TEST);
-  testSourceMapLocations(INTERCEPTOR_TEST);
-}
diff --git a/tests/compiler/dart2js_extra/dummy_compiler_test.dart b/tests/compiler/dart2js_extra/dummy_compiler_test.dart
index 09c60e4..3e3a64f 100644
--- a/tests/compiler/dart2js_extra/dummy_compiler_test.dart
+++ b/tests/compiler/dart2js_extra/dummy_compiler_test.dart
@@ -11,7 +11,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler.dart';
 
-import '../dart2js/old_frontend/mock_libraries.dart';
+import 'mock_libraries.dart';
 
 String libProvider(Uri uri) {
   if (uri.path.endsWith(".platform")) {
diff --git a/tests/compiler/dart2js/old_frontend/mock_libraries.dart b/tests/compiler/dart2js_extra/mock_libraries.dart
similarity index 100%
rename from tests/compiler/dart2js/old_frontend/mock_libraries.dart
rename to tests/compiler/dart2js_extra/mock_libraries.dart
