Merge pull request #39 from dart-lang/0.12.1

update analyzer to 0.27.0 and update to the test package
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4630daf..460ecb7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+#### 0.12.1
+  * Update analyzer to `^0.27.0` and update to the test package.
+
 #### 0.12.0+4
   * The transformer will now give an informative error on package names with
     hyphens.
diff --git a/e2e_test/html_imports/pubspec.yaml b/e2e_test/html_imports/pubspec.yaml
index 996c03b..c7afae9 100644
--- a/e2e_test/html_imports/pubspec.yaml
+++ b/e2e_test/html_imports/pubspec.yaml
@@ -1,11 +1,10 @@
 name: html_imports
 dependencies:
-  browser: '^0.10.0'
   initialize: any
   web_components:
     path: '../../'
 dev_dependencies:
-  unittest: '^0.11.0'
+  test: '^0.12.0'
 transformers:
 - web_components:
     $include: '**/*_test.html'
diff --git a/e2e_test/html_imports/test/basic_test.dart b/e2e_test/html_imports/test/basic_test.dart
index 0f1aee8..c03e79d 100644
--- a/e2e_test/html_imports/test/basic_test.dart
+++ b/e2e_test/html_imports/test/basic_test.dart
@@ -1,24 +1,22 @@
 // Copyright (c) 2015, 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.
+@TestOn('browser')
 @HtmlImport('packages/html_imports/theme.html')
 library e2e_test.html_imports.basic_test;
 
 import 'dart:html';
 import 'package:initialize/initialize.dart' as init;
 import 'package:web_components/html_import_annotation.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
-main() {
-  useHtmlConfiguration();
-
+main() async {
   // Waits until all html imports are loaded.
-  init.run().then((_) {
-    test('text is red', () {
-      var p = document.createElement('p');
-      document.body.append(p);
-      expect(p.getComputedStyle().color, 'rgb(255, 0, 0)');
-    });
+  await init.run();
+
+  test('text is red', () {
+    var p = document.createElement('p');
+    document.body.append(p);
+    expect(p.getComputedStyle().color, 'rgb(255, 0, 0)');
   });
 }
diff --git a/e2e_test/html_imports/test/basic_test.html b/e2e_test/html_imports/test/basic_test.html
index e899e5d..c1d95f6 100644
--- a/e2e_test/html_imports/test/basic_test.html
+++ b/e2e_test/html_imports/test/basic_test.html
@@ -4,9 +4,7 @@
     <meta name="dart.unittest" content="full-stack-traces">
   </head>
   <body>
-    <script type="text/javascript"
-            src="/root_dart/tools/testing/dart/test_controller.js"></script>
-    <script type="application/dart" src="basic_test.dart"></script>
-    <script src="packages/browser/dart.js"></script>
+    <link rel="x-dart-test" href="basic_test.dart">
+    <script src="packages/test/dart.js"></script>
   </body>
 </html>
diff --git a/lib/build/html_import_annotation_recorder.dart b/lib/build/html_import_annotation_recorder.dart
index ba5d2ab..9474d69 100644
--- a/lib/build/html_import_annotation_recorder.dart
+++ b/lib/build/html_import_annotation_recorder.dart
@@ -67,11 +67,11 @@
     if (annotationElement.element is PropertyAccessorElement) {
       originalImportPath = resolver.evaluateConstant(
               element.library, annotation.name).value.fields[
-          'filePath'].stringValue;
+          'filePath'].toStringValue();
     } else {
       assert(annotationElement.element is ConstructorElement);
       originalImportPath = resolver.evaluateConstant(element.library,
-          annotation.arguments.arguments.first).value.stringValue;
+          annotation.arguments.arguments.first).value.toStringValue();
     }
 
     var libPath;
diff --git a/pubspec.yaml b/pubspec.yaml
index a6672d8..c6fd6d0 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.12.0+4
+version: 0.12.1
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://github.com/dart-lang/web-components/
 description: >
@@ -10,14 +10,14 @@
   elements, by hiding DOM subtrees under shadow roots. HTML Imports let authors
   bundle code and HTML as if they were libraries.
 dependencies:
-  analyzer: '>=0.22.4 <0.27.0'
+  analyzer: '^0.27.0'
   barback: '>=0.14.2 <0.16.0'
-  code_transformers: '^0.2.7'
+  code_transformers: '^0.3.0'
   html: '^0.12.0'
   initialize: '^0.6.0'
   path: '^1.3.0'
 dev_dependencies:
-  unittest: '^0.11.0'
+  test: '^0.12.0'
   browser: '^0.10.0'
 transformers:
 - web_components/build/mirrors_remover:
@@ -29,6 +29,8 @@
       - test/custom_element_proxy_test.html
       - test/html_import_annotation_test.html
       - test/init_web_components_test.html
+- test/pub_serve:
+    $include: test/**_test{.*,}.dart
 
 environment:
   sdk: ">=1.9.0-dev.7.1 <2.0.0"
diff --git a/test/build/html_import_annotation_recorder_test.dart b/test/build/html_import_annotation_recorder_test.dart
index a6e832c..0b0fa0d 100644
--- a/test/build/html_import_annotation_recorder_test.dart
+++ b/test/build/html_import_annotation_recorder_test.dart
@@ -1,13 +1,13 @@
 // Copyright (c) 2015, 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.
+@TestOn('vm')
 library web_components.test.build.html_import_annotation_recorder_test;
 
 import 'package:code_transformers/tests.dart' hide testPhases;
 import 'package:web_components/build/html_import_annotation_recorder.dart';
 import 'package:initialize/transformer.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'common.dart';
 
 testPhases(String name, Map<String, String> inputs,
@@ -29,8 +29,6 @@
 }
 
 main() {
-  useCompactVMConfiguration();
-
   testPhases('basic', {
     'a|web/index.dart': '''
         @HtmlImport('index.html')
diff --git a/test/build/import_crawler_test.dart b/test/build/import_crawler_test.dart
index 50d6d80..cf0b3de 100644
--- a/test/build/import_crawler_test.dart
+++ b/test/build/import_crawler_test.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2015, 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.
+@TestOn('vm')
 library web_components.test.build.import_crawler_test;
 
 import 'dart:async';
@@ -10,7 +11,7 @@
 import 'package:html/dom.dart' show Document;
 import 'package:web_components/build/common.dart';
 import 'package:web_components/build/import_crawler.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
 
 class _TestTransformer extends Transformer {
   final String _entryPoint;
@@ -48,7 +49,6 @@
 }
 
 main() {
-  useCompactVMConfiguration();
   runTests([[new _TestTransformer('web/index.html')]]);
   // Test with a preparsed original document as well.
   runTests([[new _TestTransformer('web/index.html', true)]]);
diff --git a/test/build/import_inliner_test.dart b/test/build/import_inliner_test.dart
index 046fcf4..f31fe4e 100644
--- a/test/build/import_inliner_test.dart
+++ b/test/build/import_inliner_test.dart
@@ -1,865 +1,43 @@
 // Copyright (c) 2015, 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.
+@TestOn('vm')
 library web_components.test.build.import_inliner_test;
 
 import 'package:code_transformers/tests.dart';
 import 'package:web_components/build/import_inliner.dart';
 import 'package:web_components/build/messages.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 var transformer = new ImportInlinerTransformer(null, ['{{', '[[']);
 var phases = [[transformer]];
 
 main() {
-  useCompactVMConfiguration();
-
-//  group('rel=import', importTests);
-//  group('url attributes', urlAttributeTests);
-//  group('deep entrypoints', entryPointTests);
-  group('templates', templateTests);
+  group('rel=import', importTests);
+  group('url attributes', urlAttributeTests);
+  group('deep entrypoints', entryPointTests);
+  // group('templates', templateTests);
 }
 
-//void importTests() {
-//  testPhases('no imports', phases, {
-//    'a|web/index.html': '''
-//        <!DOCTYPE html><html><head></head><body></body></html>''',
-//  }, {
-//    'a|web/index.html': '''
-//        <!DOCTYPE html><html><head></head><body></body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('one import, removes dart script', phases, {
-//    'a|web/index.html': '''
-//        <!DOCTYPE html>
-//        <html>
-//          <head><link rel="import" href="packages/a/foo.html"></head>
-//          <body></body>
-//        </html>''',
-//    'a|lib/foo.html': '''
-//        <div>hello from foo!</div>
-//        <script type="application/dart" src="foo.dart"></script>
-//        ''',
-//  }, {
-//    'a|web/index.html': '''
-//        <!DOCTYPE html>
-//        <html>
-//          <head></head>
-//          <body>
-//            <div hidden="">
-//              <div>hello from foo!</div>
-//            </div>
-//          </body>
-//        </html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('preserves order of scripts', phases, {
-//    'a|web/index.html': '''
-//        <!DOCTYPE html><html><head>
-//        <script type="text/javascript">/*first*/</script>
-//        <script src="second.js"></script>
-//        <link rel="import" href="packages/a/foo.html">
-//        <script>/*forth*/</script>
-//        </head></html>''',
-//    'a|lib/foo.html': '''
-//        <!DOCTYPE html><html><head><script>/*third*/</script>
-//        </head><body><polymer-element>2</polymer-element></html>''',
-//    'a|web/second.js': '/*second*/'
-//  }, {
-//    'a|web/index.html': '''
-//        <!DOCTYPE html><html><head>
-//        <script type="text/javascript">/*first*/</script>
-//        <script src="second.js"></script>
-//        </head><body>
-//        <div hidden="">
-//        <script>/*third*/</script>
-//        <polymer-element>2</polymer-element>
-//        <script>/*forth*/</script>
-//        </div>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('preserves order of scripts, extract Dart scripts', phases, {
-//    'a|web/index.html': '''
-//        <!DOCTYPE html>
-//        <html>
-//          <head>
-//            <script type="text/javascript">/*first*/</script>
-//            <script src="second.js"></script>
-//            <link rel="import" href="test2.html">
-//            <script type="application/dart">/*fifth*/</script>
-//          </head>
-//        </html>''',
-//    'a|web/test2.html': '''
-//        <!DOCTYPE html>
-//        <html>
-//          <head>
-//            <script>/*third*/</script>
-//            <script type="application/dart">/*forth*/</script>
-//          </head>
-//          <body>
-//            <polymer-element>2</polymer-element>
-//          </body>
-//        </html>''',
-//    'a|web/second.js': '/*second*/'
-//  }, {
-//    'a|web/index.html': '''
-//        <!DOCTYPE html>
-//        <html>
-//          <head>
-//            <script type="text/javascript">/*first*/</script>
-//            <script src="second.js"></script>
-//          </head>
-//          <body>
-//            <div hidden="">
-//            <script>/*third*/</script>
-//            <polymer-element>2</polymer-element>
-//            <script type="application/dart">/*fifth*/</script>
-//            </div>
-//          </body>
-//        </html>''',
-//    'a|web/test2.html': '''
-//        <!DOCTYPE html>
-//        <html>
-//          <head>
-//            <script>/*third*/</script>
-//            <script type="application/dart">/*forth*/</script>
-//          </head>
-//          <body>
-//            <polymer-element>2</polymer-element>
-//          </body>
-//        </html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('no transformation outside web/', phases, {
-//    'a|lib/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test2.html">
-//        </head></html>''',
-//    'a|lib/test2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>2</polymer-element></html>''',
-//  }, {
-//    'a|lib/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test2.html">
-//        </head></html>''',
-//    'a|lib/test2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>2</polymer-element></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('shallow, elements, many', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test2.html">
-//        <link rel="import" href="test3.html">
-//        </head></html>''',
-//    'a|web/test2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>2</polymer-element></html>''',
-//    'a|web/test3.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>3</polymer-element></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>2</polymer-element>
-//        <polymer-element>3</polymer-element>
-//        </div>
-//        </body></html>''',
-//    'a|web/test2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>2</polymer-element></html>''',
-//    'a|web/test3.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>3</polymer-element></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('deep, elements, one per file', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test2.html">
-//        </head></html>''',
-//    'a|web/test2.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="assets/b/test3.html">
-//        </head><body><polymer-element>2</polymer-element></html>''',
-//    'b|asset/test3.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="../../packages/c/test4.html">
-//        </head><body><polymer-element>3</polymer-element></html>''',
-//    'c|lib/test4.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>4</polymer-element></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>4</polymer-element>
-//        <polymer-element>3</polymer-element>
-//        <polymer-element>2</polymer-element>
-//        </div>
-//        </body></html>''',
-//    'a|web/test2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>4</polymer-element>
-//        <polymer-element>3</polymer-element>
-//        </div>
-//        <polymer-element>2</polymer-element>
-//        </body></html>''',
-//    'b|asset/test3.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="../../packages/c/test4.html">
-//        </head><body><polymer-element>3</polymer-element></html>''',
-//    'c|lib/test4.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>4</polymer-element></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('deep, elements, many imports', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test2a.html">
-//        <link rel="import" href="test2b.html">
-//        </head></html>''',
-//    'a|web/test2a.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test3a.html">
-//        <link rel="import" href="test3b.html">
-//        </head><body><polymer-element>2a</polymer-element></body></html>''',
-//    'a|web/test2b.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test4a.html">
-//        <link rel="import" href="test4b.html">
-//        </head><body><polymer-element>2b</polymer-element></body></html>''',
-//    'a|web/test3a.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>3a</polymer-element></body></html>''',
-//    'a|web/test3b.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>3b</polymer-element></body></html>''',
-//    'a|web/test4a.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>4a</polymer-element></body></html>''',
-//    'a|web/test4b.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>4b</polymer-element></body></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>3a</polymer-element>
-//        <polymer-element>3b</polymer-element>
-//        <polymer-element>2a</polymer-element>
-//        <polymer-element>4a</polymer-element>
-//        <polymer-element>4b</polymer-element>
-//        <polymer-element>2b</polymer-element>
-//        </div>
-//        </body></html>''',
-//    'a|web/test2a.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>3a</polymer-element>
-//        <polymer-element>3b</polymer-element>
-//        </div>
-//        <polymer-element>2a</polymer-element>
-//        </body></html>''',
-//    'a|web/test2b.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>4a</polymer-element>
-//        <polymer-element>4b</polymer-element>
-//        </div>
-//        <polymer-element>2b</polymer-element>
-//        </body></html>''',
-//    'a|web/test3a.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <polymer-element>3a</polymer-element>
-//        </body></html>''',
-//    'a|web/test3b.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <polymer-element>3b</polymer-element>
-//        </body></html>''',
-//    'a|web/test4a.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <polymer-element>4a</polymer-element>
-//        </body></html>''',
-//    'a|web/test4b.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <polymer-element>4b</polymer-element>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('imports cycle, 1-step lasso', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_2.html">
-//        </head><body><polymer-element>1</polymer-element></html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head><body><polymer-element>2</polymer-element></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>2</polymer-element>
-//        <polymer-element>1</polymer-element>
-//        </div>
-//        </body></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>2</polymer-element>
-//        </div>
-//        <polymer-element>1</polymer-element></body></html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>1</polymer-element>
-//        </div>
-//        <polymer-element>2</polymer-element></body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('imports cycle, 1-step lasso, scripts too', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_2.html">
-//        </head><body><polymer-element>1</polymer-element>
-//        <script src="s1"></script></html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head><body><polymer-element>2</polymer-element>
-//        <script src="s2"></script></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>2</polymer-element>
-//        <script src="s2"></script>
-//        <polymer-element>1</polymer-element>
-//        <script src="s1"></script>
-//        </div>
-//        </body></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>2</polymer-element>
-//        <script src="s2"></script>
-//        </div>
-//        <polymer-element>1</polymer-element>
-//        <script src="s1"></script></body></html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>1</polymer-element>
-//        <script src="s1"></script>
-//        </div>
-//        <polymer-element>2</polymer-element>
-//        <script src="s2"></script></body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('imports cycle, 1-step lasso, Dart scripts too', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_2.html">
-//        </head><body><polymer-element>1</polymer-element>
-//        <script type="application/dart" src="s1.dart"></script>
-//        </html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head><body><polymer-element>2
-//        <script type="application/dart" src="s2.dart"></script>
-//        </polymer-element>
-//        </html>''',
-//    'a|web/s1.dart': '',
-//    'a|web/s2.dart': '',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>2</polymer-element>
-//        <polymer-element>1</polymer-element>
-//        </div>
-//        </body></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>2</polymer-element>
-//        </div>
-//        <polymer-element>1</polymer-element>
-//        <script type="application/dart" src="s1.dart"></script>
-//        </body></html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>1</polymer-element>
-//        </div>
-//        <polymer-element>2
-//        <script type="application/dart" src="s2.dart"></script>
-//        </polymer-element>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('imports with Dart script after JS script', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head><body>
-//        <foo>42</foo><bar-baz></bar-baz>
-//        <polymer-element>1'
-//        <script src="s1.js"></script>
-//        <script type="application/dart" src="s1.dart"></script>
-//        </polymer-element>
-//        'FOO'</body></html>''',
-//    'a|web/s1.dart': '',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <foo>42</foo><bar-baz></bar-baz>
-//        <polymer-element>1'
-//        <script src="s1.js"></script>
-//        </polymer-element>
-//        'FOO'
-//        </div>
-//        </body></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <foo>42</foo><bar-baz></bar-baz>
-//        <polymer-element>1'
-//        <script src="s1.js"></script>
-//        <script type="application/dart" src="s1.dart"></script>
-//        </polymer-element>
-//        'FOO'</body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('imports cycle, 2-step lasso', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_2.html">
-//        </head><body><polymer-element>1</polymer-element></html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_3.html">
-//        </head><body><polymer-element>2</polymer-element></html>''',
-//    'a|web/test_3.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head><body><polymer-element>3</polymer-element></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>3</polymer-element>
-//        <polymer-element>2</polymer-element>
-//        <polymer-element>1</polymer-element>
-//        </div>
-//        </body></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>3</polymer-element>
-//        <polymer-element>2</polymer-element>
-//        </div>
-//        <polymer-element>1</polymer-element></body></html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>1</polymer-element>
-//        <polymer-element>3</polymer-element>
-//        </div>
-//        <polymer-element>2</polymer-element></body></html>''',
-//    'a|web/test_3.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>2</polymer-element>
-//        <polymer-element>1</polymer-element>
-//        </div>
-//        <polymer-element>3</polymer-element></body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('imports cycle, self cycle', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        </head><body><polymer-element>1</polymer-element></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>1</polymer-element>
-//        </div>
-//        </body></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <polymer-element>1</polymer-element></body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('imports DAG', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_1.html">
-//        <link rel="import" href="test_2.html">
-//        </head></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_3.html">
-//        </head><body><polymer-element>1</polymer-element></body></html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="test_3.html">
-//        </head><body><polymer-element>2</polymer-element></body></html>''',
-//    'a|web/test_3.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body><polymer-element>3</polymer-element></body></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>3</polymer-element>
-//        <polymer-element>1</polymer-element>
-//        <polymer-element>2</polymer-element>
-//        </div>
-//        </body></html>''',
-//    'a|web/test_1.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>3</polymer-element>
-//        </div>
-//        <polymer-element>1</polymer-element></body></html>''',
-//    'a|web/test_2.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <div hidden="">
-//        <polymer-element>3</polymer-element>
-//        </div>
-//        <polymer-element>2</polymer-element></body></html>''',
-//    'a|web/test_3.html': '''
-//        <!DOCTYPE html><html><head>
-//        </head><body>
-//        <polymer-element>3</polymer-element></body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('missing html imports throw errors', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="foo.html">
-//        </head></html>''',
-//  }, {}, [
-//    'warning: ${inlineImportFail.create({
-//          'error': 'Could not find asset a|web/foo.html.'
-//      }).snippet} '
-//        '(web/test.html 1 8)',
-//  ], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('absolute uri', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="stylesheet" href="/foo.css">
-//        </head></html>''',
-//    'a|web/test2.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="stylesheet" href="http://example.com/bar.css">
-//        </head></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="stylesheet" href="/foo.css">
-//        </head></html>''',
-//    'a|web/test2.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="stylesheet" href="http://example.com/bar.css">
-//        </head></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//}
-//
-//void urlAttributeTests() {
-//  testPhases('url attributes are normalized', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="foo/test_1.html">
-//        <link rel="import" href="foo/test_2.html">
-//        </head></html>''',
-//    'a|web/foo/test_1.html': '''
-//        <script src="baz.jpg"></script>''',
-//    'a|web/foo/test_2.html': '''
-//        <foo-element src="baz.jpg"></foo-element>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <div hidden="">
-//        <script src="foo/baz.jpg"></script>
-//        <foo-element src="baz.jpg"></foo-element>
-//        </div>
-//        </body></html>''',
-//    'a|web/foo/test_1.html': '''
-//        <script src="baz.jpg"></script>''',
-//    'a|web/foo/test_2.html': '''
-//        <foo-element src="baz.jpg"></foo-element>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('paths with an invalid prefix are not normalized', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="packages/a/test.html">
-//        </head></html>''',
-//    'a|lib/test.html': '''
-//        <img src="[[bar]]">''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <div hidden="">
-//        <img src="[[bar]]">
-//        </div>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('relative paths followed by invalid characters are normalized',
-//      phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="foo/test.html">
-//        </head></html>''',
-//    'a|web/foo/test.html': '''
-//        <img src="baz/{{bar}}">
-//        <img src="./{{bar}}">''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <div hidden="">
-//        <img src="foo/baz/{{bar}}">
-//        <img src="foo/{{bar}}">
-//        </div>
-//        </body></html>''',
-//  }, null, StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('relative paths in _* attributes are normalized', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="foo/test.html">
-//        </head></html>''',
-//    'a|web/foo/test.html': '''
-//        <img _src="./{{bar}}">
-//        <a _href="./{{bar}}">test</a>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <div hidden="">
-//        <img _src="foo/{{bar}}">
-//        <a _href="foo/{{bar}}">test</a>
-//        </div>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('paths starting with a binding are treated as absolute', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="packages/a/foo.html">
-//        </head></html>''',
-//    'a|lib/foo.html': '''
-//        <img _src="{{bar}}">
-//        <img _src="[[bar]]">''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <div hidden="">
-//          <img _src="{{bar}}">
-//          <img _src="[[bar]]">
-//        </div>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('arbitrary bindings can exist in paths', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <img src="./{{(bar[2] + baz[\'foo\']) * 14 / foobar() - 0.5}}.jpg">
-//        <img src="./[[bar[2]]].jpg">
-//        </body></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <img src="{{(bar[2] + baz[\'foo\']) * 14 / foobar() - 0.5}}.jpg">
-//        <img src="[[bar[2]]].jpg">
-//        </body></html>''',
-//  }, null, StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('multiple bindings can exist in paths', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <img src="./{{bar[0]}}/{{baz[1]}}.{{extension}}">
-//        </body></html>''',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <img src="{{bar[0]}}/{{baz[1]}}.{{extension}}">
-//        </body></html>''',
-//  }, null, StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('relative paths in deep imports', phases, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="foo/foo.html">
-//        </head></html>''',
-//    'a|web/foo/foo.html': '''
-//        <link rel="import" href="bar.html">''',
-//    'a|web/foo/bar.html': '''
-//        <style rel="stylesheet" href="baz.css"></style>
-//        <style rel="stylesheet" href="../css/zap.css"></style>''',
-//    'a|web/foo/baz.css': '',
-//    'a|web/css/zap.css': '',
-//  }, {
-//    'a|web/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <div hidden="">
-//          <style rel="stylesheet" href="foo/baz.css"></style>
-//          <style rel="stylesheet" href="css/zap.css"></style>
-//        </div>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//}
-//
-//void entryPointTests() {
-//  testPhases('one level deep entry points normalize correctly', phases, {
-//    'a|web/test/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="../../packages/a/foo/foo.html">
-//        </head></html>''',
-//    'a|lib/foo/foo.html': '''
-//        <script rel="import" href="../../../packages/b/bar/bar.js">
-//        </script>''',
-//    'b|lib/bar/bar.js': '''
-//        console.log("here");''',
-//  }, {
-//    'a|web/test/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <div hidden="">
-//        <script rel="import" href="../packages/b/bar/bar.js"></script>
-//        </div>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('includes in entry points normalize correctly', phases, {
-//    'a|web/test/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <script src="packages/a/foo/bar.js"></script>
-//        </head></html>''',
-//    'a|lib/foo/bar.js': '''
-//        console.log("here");''',
-//  }, {
-//    'a|web/test/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <script src="../packages/a/foo/bar.js"></script>
-//        </head><body>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//
-//  testPhases('two level deep entry points normalize correctly', phases, {
-//    'a|web/test/well/test.html': '''
-//        <!DOCTYPE html><html><head>
-//        <link rel="import" href="../../../packages/a/foo/foo.html">
-//        </head></html>''',
-//    'a|lib/foo/foo.html': '''
-//        <script rel="import" href="../../../packages/b/bar/bar.js"></script>''',
-//    'b|lib/bar/bar.js': '''
-//        console.log("here");''',
-//  }, {
-//    'a|web/test/well/test.html': '''
-//        <!DOCTYPE html><html><head></head><body>
-//        <div hidden="">
-//        <script rel="import" href="../../packages/b/bar/bar.js"></script>
-//        </div>
-//        </body></html>''',
-//  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
-//}
+void importTests() {
+  testPhases('no imports', phases, {
+    'a|web/index.html': '''
+        <!DOCTYPE html><html><head></head><body></body></html>''',
+  }, {
+    'a|web/index.html': '''
+        <!DOCTYPE html><html><head></head><body></body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
 
-void templateTests() {
-  testPhases('allows template inside table', phases, {
+  testPhases('one import, removes dart script', phases, {
     'a|web/index.html': '''
         <!DOCTYPE html>
         <html>
           <head><link rel="import" href="packages/a/foo.html"></head>
-          <body>
-            <dom-module id="hello-element">
-              <template>
-                <table>
-                  <thead>
-                    <tr><th>first</th><th>last</th></tr>
-                  </thead>
-                  <tbody>
-                    <template is="dom-repeat" items="{{data}}">
-                      <tr>
-                        <td>{{item.first}}</td>
-                        <td>{{item.last}}</td>
-                      </tr>
-                    </template>
-                  </tbody>
-                </table>
-              </template>
-            </dom-module>
-          </body>
+          <body></body>
         </html>''',
     'a|lib/foo.html': '''
-        <div>hello!</div>
+        <div>hello from foo!</div>
+        <script type="application/dart" src="foo.dart"></script>
         ''',
   }, {
     'a|web/index.html': '''
@@ -868,26 +46,846 @@
           <head></head>
           <body>
             <div hidden="">
-              <div>hello!</div>
+              <div>hello from foo!</div>
             </div>
-            <dom-module id="hello-element">
-              <template>
-                <table>
-                  <thead>
-                    <tr><th>first</th><th>last</th></tr>
-                  </thead>
-                  <tbody>
-                    <template is="dom-repeat" items="{{data}}">
-                      <tr>
-                        <td>{{item.first}}</td>
-                        <td>{{item.last}}</td>
-                      </tr>
-                    </template>
-                  </tbody>
-                </table>
-              </template>
-            </dom-module>
           </body>
         </html>''',
   }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('preserves order of scripts', phases, {
+    'a|web/index.html': '''
+        <!DOCTYPE html><html><head>
+        <script type="text/javascript">/*first*/</script>
+        <script src="second.js"></script>
+        <link rel="import" href="packages/a/foo.html">
+        <script>/*forth*/</script>
+        </head></html>''',
+    'a|lib/foo.html': '''
+        <!DOCTYPE html><html><head><script>/*third*/</script>
+        </head><body><polymer-element>2</polymer-element></html>''',
+    'a|web/second.js': '/*second*/'
+  }, {
+    'a|web/index.html': '''
+        <!DOCTYPE html><html><head>
+        <script type="text/javascript">/*first*/</script>
+        <script src="second.js"></script>
+        </head><body>
+        <div hidden="">
+        <script>/*third*/</script>
+        <polymer-element>2</polymer-element>
+        <script>/*forth*/</script>
+        </div>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('preserves order of scripts, extract Dart scripts', phases, {
+    'a|web/index.html': '''
+        <!DOCTYPE html>
+        <html>
+          <head>
+            <script type="text/javascript">/*first*/</script>
+            <script src="second.js"></script>
+            <link rel="import" href="test2.html">
+            <script type="application/dart">/*fifth*/</script>
+          </head>
+        </html>''',
+    'a|web/test2.html': '''
+        <!DOCTYPE html>
+        <html>
+          <head>
+            <script>/*third*/</script>
+            <script type="application/dart">/*forth*/</script>
+          </head>
+          <body>
+            <polymer-element>2</polymer-element>
+          </body>
+        </html>''',
+    'a|web/second.js': '/*second*/'
+  }, {
+    'a|web/index.html': '''
+        <!DOCTYPE html>
+        <html>
+          <head>
+            <script type="text/javascript">/*first*/</script>
+            <script src="second.js"></script>
+          </head>
+          <body>
+            <div hidden="">
+            <script>/*third*/</script>
+            <polymer-element>2</polymer-element>
+            <script type="application/dart">/*fifth*/</script>
+            </div>
+          </body>
+        </html>''',
+    'a|web/test2.html': '''
+        <!DOCTYPE html>
+        <html>
+          <head>
+            <script>/*third*/</script>
+            <script type="application/dart">/*forth*/</script>
+          </head>
+          <body>
+            <polymer-element>2</polymer-element>
+          </body>
+        </html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('no transformation outside web/', phases, {
+    'a|lib/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test2.html">
+        </head></html>''',
+    'a|lib/test2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>2</polymer-element></html>''',
+  }, {
+    'a|lib/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test2.html">
+        </head></html>''',
+    'a|lib/test2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>2</polymer-element></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('shallow, elements, many', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test2.html">
+        <link rel="import" href="test3.html">
+        </head></html>''',
+    'a|web/test2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>2</polymer-element></html>''',
+    'a|web/test3.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>3</polymer-element></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>2</polymer-element>
+        <polymer-element>3</polymer-element>
+        </div>
+        </body></html>''',
+    'a|web/test2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>2</polymer-element></html>''',
+    'a|web/test3.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>3</polymer-element></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('deep, elements, one per file', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test2.html">
+        </head></html>''',
+    'a|web/test2.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="assets/b/test3.html">
+        </head><body><polymer-element>2</polymer-element></html>''',
+    'b|asset/test3.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="../../packages/c/test4.html">
+        </head><body><polymer-element>3</polymer-element></html>''',
+    'c|lib/test4.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>4</polymer-element></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>4</polymer-element>
+        <polymer-element>3</polymer-element>
+        <polymer-element>2</polymer-element>
+        </div>
+        </body></html>''',
+    'a|web/test2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>4</polymer-element>
+        <polymer-element>3</polymer-element>
+        </div>
+        <polymer-element>2</polymer-element>
+        </body></html>''',
+    'b|asset/test3.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="../../packages/c/test4.html">
+        </head><body><polymer-element>3</polymer-element></html>''',
+    'c|lib/test4.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>4</polymer-element></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('deep, elements, many imports', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test2a.html">
+        <link rel="import" href="test2b.html">
+        </head></html>''',
+    'a|web/test2a.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test3a.html">
+        <link rel="import" href="test3b.html">
+        </head><body><polymer-element>2a</polymer-element></body></html>''',
+    'a|web/test2b.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test4a.html">
+        <link rel="import" href="test4b.html">
+        </head><body><polymer-element>2b</polymer-element></body></html>''',
+    'a|web/test3a.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>3a</polymer-element></body></html>''',
+    'a|web/test3b.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>3b</polymer-element></body></html>''',
+    'a|web/test4a.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>4a</polymer-element></body></html>''',
+    'a|web/test4b.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>4b</polymer-element></body></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>3a</polymer-element>
+        <polymer-element>3b</polymer-element>
+        <polymer-element>2a</polymer-element>
+        <polymer-element>4a</polymer-element>
+        <polymer-element>4b</polymer-element>
+        <polymer-element>2b</polymer-element>
+        </div>
+        </body></html>''',
+    'a|web/test2a.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>3a</polymer-element>
+        <polymer-element>3b</polymer-element>
+        </div>
+        <polymer-element>2a</polymer-element>
+        </body></html>''',
+    'a|web/test2b.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>4a</polymer-element>
+        <polymer-element>4b</polymer-element>
+        </div>
+        <polymer-element>2b</polymer-element>
+        </body></html>''',
+    'a|web/test3a.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <polymer-element>3a</polymer-element>
+        </body></html>''',
+    'a|web/test3b.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <polymer-element>3b</polymer-element>
+        </body></html>''',
+    'a|web/test4a.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <polymer-element>4a</polymer-element>
+        </body></html>''',
+    'a|web/test4b.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <polymer-element>4b</polymer-element>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('imports cycle, 1-step lasso', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_2.html">
+        </head><body><polymer-element>1</polymer-element></html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head><body><polymer-element>2</polymer-element></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>2</polymer-element>
+        <polymer-element>1</polymer-element>
+        </div>
+        </body></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>2</polymer-element>
+        </div>
+        <polymer-element>1</polymer-element></body></html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>1</polymer-element>
+        </div>
+        <polymer-element>2</polymer-element></body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('imports cycle, 1-step lasso, scripts too', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_2.html">
+        </head><body><polymer-element>1</polymer-element>
+        <script src="s1"></script></html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head><body><polymer-element>2</polymer-element>
+        <script src="s2"></script></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>2</polymer-element>
+        <script src="s2"></script>
+        <polymer-element>1</polymer-element>
+        <script src="s1"></script>
+        </div>
+        </body></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>2</polymer-element>
+        <script src="s2"></script>
+        </div>
+        <polymer-element>1</polymer-element>
+        <script src="s1"></script></body></html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>1</polymer-element>
+        <script src="s1"></script>
+        </div>
+        <polymer-element>2</polymer-element>
+        <script src="s2"></script></body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('imports cycle, 1-step lasso, Dart scripts too', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_2.html">
+        </head><body><polymer-element>1</polymer-element>
+        <script type="application/dart" src="s1.dart"></script>
+        </html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head><body><polymer-element>2
+        <script type="application/dart" src="s2.dart"></script>
+        </polymer-element>
+        </html>''',
+    'a|web/s1.dart': '',
+    'a|web/s2.dart': '',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>2</polymer-element>
+        <polymer-element>1</polymer-element>
+        </div>
+        </body></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>2</polymer-element>
+        </div>
+        <polymer-element>1</polymer-element>
+        <script type="application/dart" src="s1.dart"></script>
+        </body></html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>1</polymer-element>
+        </div>
+        <polymer-element>2
+        <script type="application/dart" src="s2.dart"></script>
+        </polymer-element>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('imports with Dart script after JS script', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head><body>
+        <foo>42</foo><bar-baz></bar-baz>
+        <polymer-element>1'
+        <script src="s1.js"></script>
+        <script type="application/dart" src="s1.dart"></script>
+        </polymer-element>
+        'FOO'</body></html>''',
+    'a|web/s1.dart': '',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <foo>42</foo><bar-baz></bar-baz>
+        <polymer-element>1'
+        <script src="s1.js"></script>
+        </polymer-element>
+        'FOO'
+        </div>
+        </body></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <foo>42</foo><bar-baz></bar-baz>
+        <polymer-element>1'
+        <script src="s1.js"></script>
+        <script type="application/dart" src="s1.dart"></script>
+        </polymer-element>
+        'FOO'</body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('imports cycle, 2-step lasso', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_2.html">
+        </head><body><polymer-element>1</polymer-element></html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_3.html">
+        </head><body><polymer-element>2</polymer-element></html>''',
+    'a|web/test_3.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head><body><polymer-element>3</polymer-element></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>3</polymer-element>
+        <polymer-element>2</polymer-element>
+        <polymer-element>1</polymer-element>
+        </div>
+        </body></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>3</polymer-element>
+        <polymer-element>2</polymer-element>
+        </div>
+        <polymer-element>1</polymer-element></body></html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>1</polymer-element>
+        <polymer-element>3</polymer-element>
+        </div>
+        <polymer-element>2</polymer-element></body></html>''',
+    'a|web/test_3.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>2</polymer-element>
+        <polymer-element>1</polymer-element>
+        </div>
+        <polymer-element>3</polymer-element></body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('imports cycle, self cycle', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        </head><body><polymer-element>1</polymer-element></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>1</polymer-element>
+        </div>
+        </body></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <polymer-element>1</polymer-element></body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('imports DAG', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_1.html">
+        <link rel="import" href="test_2.html">
+        </head></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_3.html">
+        </head><body><polymer-element>1</polymer-element></body></html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="test_3.html">
+        </head><body><polymer-element>2</polymer-element></body></html>''',
+    'a|web/test_3.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body><polymer-element>3</polymer-element></body></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>3</polymer-element>
+        <polymer-element>1</polymer-element>
+        <polymer-element>2</polymer-element>
+        </div>
+        </body></html>''',
+    'a|web/test_1.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>3</polymer-element>
+        </div>
+        <polymer-element>1</polymer-element></body></html>''',
+    'a|web/test_2.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <div hidden="">
+        <polymer-element>3</polymer-element>
+        </div>
+        <polymer-element>2</polymer-element></body></html>''',
+    'a|web/test_3.html': '''
+        <!DOCTYPE html><html><head>
+        </head><body>
+        <polymer-element>3</polymer-element></body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('missing html imports throw errors', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="foo.html">
+        </head></html>''',
+  }, {}, [
+    'warning: ${inlineImportFail.create({
+          'error': 'Could not find asset a|web/foo.html.'
+      }).snippet} '
+        '(web/test.html 1 8)',
+  ], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('absolute uri', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="stylesheet" href="/foo.css">
+        </head></html>''',
+    'a|web/test2.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="stylesheet" href="http:example.com/bar.css">
+        </head></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="stylesheet" href="/foo.css">
+        </head></html>''',
+    'a|web/test2.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="stylesheet" href="http:example.com/bar.css">
+        </head></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
 }
+
+void urlAttributeTests() {
+  testPhases('url attributes are normalized', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="foo/test_1.html">
+        <link rel="import" href="foo/test_2.html">
+        </head></html>''',
+    'a|web/foo/test_1.html': '''
+        <script src="baz.jpg"></script>''',
+    'a|web/foo/test_2.html': '''
+        <foo-element src="baz.jpg"></foo-element>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <div hidden="">
+        <script src="foo/baz.jpg"></script>
+        <foo-element src="baz.jpg"></foo-element>
+        </div>
+        </body></html>''',
+    'a|web/foo/test_1.html': '''
+        <script src="baz.jpg"></script>''',
+    'a|web/foo/test_2.html': '''
+        <foo-element src="baz.jpg"></foo-element>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('paths with an invalid prefix are not normalized', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="packages/a/test.html">
+        </head></html>''',
+    'a|lib/test.html': '''
+        <img src="[[bar]]">''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <div hidden="">
+        <img src="[[bar]]">
+        </div>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('relative paths followed by invalid characters are normalized',
+      phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="foo/test.html">
+        </head></html>''',
+    'a|web/foo/test.html': '''
+        <img src="baz/{{bar}}">
+        <img src="./{{bar}}">''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <div hidden="">
+        <img src="foo/baz/{{bar}}">
+        <img src="foo/{{bar}}">
+        </div>
+        </body></html>''',
+  }, null, StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('relative paths in _* attributes are normalized', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="foo/test.html">
+        </head></html>''',
+    'a|web/foo/test.html': '''
+        <img _src="./{{bar}}">
+        <a _href="./{{bar}}">test</a>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <div hidden="">
+        <img _src="foo/{{bar}}">
+        <a _href="foo/{{bar}}">test</a>
+        </div>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('paths starting with a binding are treated as absolute', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="packages/a/foo.html">
+        </head></html>''',
+    'a|lib/foo.html': '''
+        <img _src="{{bar}}">
+        <img _src="[[bar]]">''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <div hidden="">
+          <img _src="{{bar}}">
+          <img _src="[[bar]]">
+        </div>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('arbitrary bindings can exist in paths', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <img src="./{{(bar[2] + baz[\'foo\']) * 14 / foobar() - 0.5}}.jpg">
+        <img src="./[[bar[2]]].jpg">
+        </body></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <img src="{{(bar[2] + baz[\'foo\']) * 14 / foobar() - 0.5}}.jpg">
+        <img src="[[bar[2]]].jpg">
+        </body></html>''',
+  }, null, StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('multiple bindings can exist in paths', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <img src="./{{bar[0]}}/{{baz[1]}}.{{extension}}">
+        </body></html>''',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <img src="{{bar[0]}}/{{baz[1]}}.{{extension}}">
+        </body></html>''',
+  }, null, StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('relative paths in deep imports', phases, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="foo/foo.html">
+        </head></html>''',
+    'a|web/foo/foo.html': '''
+        <link rel="import" href="bar.html">''',
+    'a|web/foo/bar.html': '''
+        <style rel="stylesheet" href="baz.css"></style>
+        <style rel="stylesheet" href="../css/zap.css"></style>''',
+    'a|web/foo/baz.css': '',
+    'a|web/css/zap.css': '',
+  }, {
+    'a|web/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <div hidden="">
+          <style rel="stylesheet" href="foo/baz.css"></style>
+          <style rel="stylesheet" href="css/zap.css"></style>
+        </div>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+}
+
+void entryPointTests() {
+  testPhases('one level deep entry points normalize correctly', phases, {
+    'a|web/test/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="../../packages/a/foo/foo.html">
+        </head></html>''',
+    'a|lib/foo/foo.html': '''
+        <script rel="import" href="../../../packages/b/bar/bar.js">
+        </script>''',
+    'b|lib/bar/bar.js': '''
+        console.log("here");''',
+  }, {
+    'a|web/test/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <div hidden="">
+        <script rel="import" href="../packages/b/bar/bar.js"></script>
+        </div>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('includes in entry points normalize correctly', phases, {
+    'a|web/test/test.html': '''
+        <!DOCTYPE html><html><head>
+        <script src="packages/a/foo/bar.js"></script>
+        </head></html>''',
+    'a|lib/foo/bar.js': '''
+        console.log("here");''',
+  }, {
+    'a|web/test/test.html': '''
+        <!DOCTYPE html><html><head>
+        <script src="../packages/a/foo/bar.js"></script>
+        </head><body>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+
+  testPhases('two level deep entry points normalize correctly', phases, {
+    'a|web/test/well/test.html': '''
+        <!DOCTYPE html><html><head>
+        <link rel="import" href="../../../packages/a/foo/foo.html">
+        </head></html>''',
+    'a|lib/foo/foo.html': '''
+        <script rel="import" href="../../../packages/b/bar/bar.js"></script>''',
+    'b|lib/bar/bar.js': '''
+        console.log("here");''',
+  }, {
+    'a|web/test/well/test.html': '''
+        <!DOCTYPE html><html><head></head><body>
+        <div hidden="">
+        <script rel="import" href="../../packages/b/bar/bar.js"></script>
+        </div>
+        </body></html>''',
+  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+}
+
+// void templateTests() {
+//   testPhases('allows template inside table', phases, {
+//     'a|web/index.html': '''
+//         <!DOCTYPE html>
+//         <html>
+//           <head><link rel="import" href="packages/a/foo.html"></head>
+//           <body>
+//             <dom-module id="hello-element">
+//               <template>
+//                 <table>
+//                   <thead>
+//                     <tr><th>first</th><th>last</th></tr>
+//                   </thead>
+//                   <tbody>
+//                     <template is="dom-repeat" items="{{data}}">
+//                       <tr>
+//                         <td>{{item.first}}</td>
+//                         <td>{{item.last}}</td>
+//                       </tr>
+//                     </template>
+//                   </tbody>
+//                 </table>
+//               </template>
+//             </dom-module>
+//           </body>
+//         </html>''',
+//     'a|lib/foo.html': '''
+//         <div>hello!</div>
+//         ''',
+//   }, {
+//     'a|web/index.html': '''
+//         <!DOCTYPE html>
+//         <html>
+//           <head></head>
+//           <body>
+//             <div hidden="">
+//               <div>hello!</div>
+//             </div>
+//             <dom-module id="hello-element">
+//               <template>
+//                 <table>
+//                   <thead>
+//                     <tr><th>first</th><th>last</th></tr>
+//                   </thead>
+//                   <tbody>
+//                     <template is="dom-repeat" items="{{data}}">
+//                       <tr>
+//                         <td>{{item.first}}</td>
+//                         <td>{{item.last}}</td>
+//                       </tr>
+//                     </template>
+//                   </tbody>
+//                 </table>
+//               </template>
+//             </dom-module>
+//           </body>
+//         </html>''',
+//   }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
+// }
diff --git a/test/build/mirrors_remover_test.dart b/test/build/mirrors_remover_test.dart
index 0d3f2e4..b327133 100644
--- a/test/build/mirrors_remover_test.dart
+++ b/test/build/mirrors_remover_test.dart
@@ -1,16 +1,14 @@
 // Copyright (c) 2015, 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.
+@TestOn('vm')
 library web_components.test.build.mirrors_remover_test;
 
 import 'package:code_transformers/tests.dart';
 import 'package:web_components/build/mirrors_remover.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 main() {
-  useCompactVMConfiguration();
-
   var transformer = new MirrorsRemoverTransformer();
   var phases = [[transformer]];
 
diff --git a/test/build/script_compactor_test.dart b/test/build/script_compactor_test.dart
index a72f3e6..a0c2ce3 100644
--- a/test/build/script_compactor_test.dart
+++ b/test/build/script_compactor_test.dart
@@ -1,20 +1,18 @@
 // Copyright (c) 2015, 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.
+@TestOn('vm')
 library web_components.test.build.script_compactor_test;
 
 import 'package:code_transformers/tests.dart';
 import 'package:web_components/build/messages.dart';
 import 'package:web_components/build/script_compactor.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 var transformer = new ScriptCompactorTransformer();
 var phases = [[transformer]];
 
 main() {
-  useCompactVMConfiguration();
-
   group('basic', basicTests);
   group('code extraction tests', codeExtractorTests);
   group('fixes import/export/part URIs', dartUriTests);
diff --git a/test/build/test_compatibility_test.dart b/test/build/test_compatibility_test.dart
index 25272ac..19adfb8 100644
--- a/test/build/test_compatibility_test.dart
+++ b/test/build/test_compatibility_test.dart
@@ -1,19 +1,17 @@
 // Copyright (c) 2015, 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.
+@TestOn('vm')
 library web_components.test.build.test_compatibility_test;
 
 import 'package:code_transformers/tests.dart';
 import 'package:web_components/build/test_compatibility.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 var start = new RewriteXDartTestToScript(null);
 var end = new RewriteScriptToXDartTest(null);
 
 main() {
-  useCompactVMConfiguration();
-
   testPhases('can rewrite x-dart-test link tags to script tags', [[start]], {
     'a|test/index.html': '''
         <!DOCTYPE html>
diff --git a/test/build/transformer_test.dart b/test/build/transformer_test.dart
index 446eced..df07267 100644
--- a/test/build/transformer_test.dart
+++ b/test/build/transformer_test.dart
@@ -1,11 +1,12 @@
 // Copyright (c) 2015, 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.
+@TestOn('vm')
 library web_components.test.build.transformer_test;
 
 import 'package:code_transformers/tests.dart';
 import 'package:web_components/transformer.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
 import 'common.dart';
 
 var transformer = new WebComponentsTransformerGroup(
@@ -13,8 +14,6 @@
 var phases = [[transformer]];
 
 main() {
-  useCompactVMConfiguration();
-
   testPhases('full app', phases, {
     'a|web/index.html': '''
         <!DOCTYPE html>
diff --git a/test/custom_element_proxy_test.dart b/test/custom_element_proxy_test.dart
index a74942b..b20a213 100644
--- a/test/custom_element_proxy_test.dart
+++ b/test/custom_element_proxy_test.dart
@@ -1,13 +1,13 @@
 // Copyright (c) 2015, 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.
+@TestOn('browser')
 library custom_element_proxy_test;
 
 import 'dart:async';
 import 'dart:html';
 import 'dart:js';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:web_components/web_components.dart';
 
 @CustomElementProxy('basic-element')
@@ -32,7 +32,6 @@
 }
 
 main() {
-  useHtmlConfiguration();
   initWebComponents().then((_) {
     var container = querySelector('#container') as DivElement;
 
diff --git a/test/custom_element_proxy_test.html b/test/custom_element_proxy_test.html
index 87053ed..384fbfd 100644
--- a/test/custom_element_proxy_test.html
+++ b/test/custom_element_proxy_test.html
@@ -33,9 +33,7 @@
     });
   </script>
 
-  <script type="text/javascript"
-      src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  <script type="application/dart" src="custom_element_proxy_test.dart"></script>
-  <script type="text/javascript" src="/packages/browser/dart.js"></script>
+  <link rel="x-dart-test" href="custom_element_proxy_test.dart">
+  <script src="packages/test/dart.js"></script>
 </body>
 </html>
diff --git a/test/custom_element_test.dart b/test/custom_element_test.dart
index 94a995a..734c0e5 100644
--- a/test/custom_element_test.dart
+++ b/test/custom_element_test.dart
@@ -1,12 +1,12 @@
 // Copyright (c) 2015, 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.
+@TestOn('browser')
 library web_components.test.custom_element_test;
 
 import 'dart:async';
 import 'dart:html';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:web_components/web_components.dart';
 
 @CustomElement('basic-element')
@@ -32,7 +32,6 @@
 }
 
 main() {
-  useHtmlConfiguration();
   initWebComponents().then((_) {
     var container = querySelector('#container') as DivElement;
 
diff --git a/test/custom_element_test.html b/test/custom_element_test.html
index 6041cd7..08220c2 100644
--- a/test/custom_element_test.html
+++ b/test/custom_element_test.html
@@ -22,9 +22,7 @@
   <div id="container">
   </div>
 
-  <script type="text/javascript"
-          src="packages/unittest/test_controller.js"></script>
-  <script type="application/dart" src="custom_element_test.dart"></script>
-  <script type="text/javascript" src="packages/browser/dart.js"></script>
+  <link rel="x-dart-test" href="custom_element_test.dart">
+  <script src="packages/test/dart.js"></script>
 </body>
 </html>
diff --git a/test/html_import_annotation_test.dart b/test/html_import_annotation_test.dart
index 6b81a58..d935e57 100644
--- a/test/html_import_annotation_test.dart
+++ b/test/html_import_annotation_test.dart
@@ -1,34 +1,27 @@
 // Copyright (c) 2015, 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.
+@TestOn('browser')
 @HtmlImport(importPath)
-// This one will throw a build time warning, but should still work dynamically.
-@HtmlImport('bad_import.html')
 library web_components.test.html_import_annotation;
 
 import 'dart:html';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:web_components/web_components.dart';
 import 'foo/bar.dart';
 
 const String importPath = 'my_import.html';
 
-main() {
-  useHtmlConfiguration();
+main() async {
+  await initWebComponents();
 
   test('adds import to head', () {
-    return initWebComponents().then((_) {
-      var my_import = document.head.querySelector('link[href="$importPath"]');
-      expect(my_import, isNotNull);
-      expect(my_import.import.body.text, 'Hello world!\n');
+    var my_import = document.head.querySelector('link[href="$importPath"]');
+    expect(my_import, isNotNull);
+    expect(my_import.import.body.text, 'Hello world!\n');
 
-      var bar = document.head.querySelector('link[href="foo/bar.html"]');
-      expect(bar, isNotNull);
-      expect(bar.import.body.text, 'bar\n');
-
-      var bad = document.head.querySelector('link[href="bad_import.html"]');
-      expect(bad.import, isNull);
-    });
+    var bar = document.head.querySelector('link[href="foo/bar.html"]');
+    expect(bar, isNotNull);
+    expect(bar.import.body.text, 'bar\n');
   });
 }
diff --git a/test/html_import_annotation_test.html b/test/html_import_annotation_test.html
index a3455c5..8af5394 100644
--- a/test/html_import_annotation_test.html
+++ b/test/html_import_annotation_test.html
@@ -17,9 +17,7 @@
 <body>
   <h1> Running html_import_annotation test </h1>
 
-  <script type="text/javascript"
-      src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  <script type="application/dart" src="html_import_annotation_test.dart"></script>
-  <script type="text/javascript" src="/packages/browser/dart.js"></script>
+  <link rel="x-dart-test" href="html_import_annotation_test.dart">
+  <script src="packages/test/dart.js"></script>
 </body>
 </html>
diff --git a/test/init_web_components_test.dart b/test/init_web_components_test.dart
index 9b66acf..cd418e2 100644
--- a/test/init_web_components_test.dart
+++ b/test/init_web_components_test.dart
@@ -2,10 +2,10 @@
 // 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.
 @initializeTracker
+@TestOn('browser')
 library web_components.test.init_web_components_test;
 
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:initialize/initialize.dart' show LibraryIdentifier;
 import 'package:initialize/src/initialize_tracker.dart';
 import 'package:web_components/web_components.dart';
@@ -13,8 +13,6 @@
 const String importPath = 'my_import.html';
 
 main() {
-  useHtmlConfiguration();
-
   test('can initialize scripts from html imports', () {
     return initWebComponents().then((_) {
       var expectedInitializers = [
diff --git a/test/init_web_components_test.html b/test/init_web_components_test.html
index d418e6e..d8fd3dc 100644
--- a/test/init_web_components_test.html
+++ b/test/init_web_components_test.html
@@ -18,9 +18,7 @@
 <body>
   <h1> Running init_web_components test </h1>
 
-  <script type="text/javascript"
-      src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  <script type="application/dart" src="init_web_components_test.dart"></script>
-  <script type="text/javascript" src="/packages/browser/dart.js"></script>
+  <link rel="x-dart-test" href="init_web_components_test.dart">
+  <script src="packages/test/dart.js"></script>
 </body>
 </html>
diff --git a/test/interop_test.dart b/test/interop_test.dart
index 20cce29..30bde10 100644
--- a/test/interop_test.dart
+++ b/test/interop_test.dart
@@ -1,19 +1,17 @@
 // Copyright (c) 2013, 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.
-
+@TestOn('browser')
 library template_wrappers_test;
 
 import 'dart:html';
 import 'dart:async';
 import 'dart:js' show context, JsObject;
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:web_components/interop.dart';
 import 'package:web_components/polyfill.dart';
 
 main() {
-  useHtmlConfiguration();
   setUp(() => customElementsReady);
 
   test('interop is supported', () {
@@ -67,7 +65,7 @@
     expect(c is HtmlElement, isTrue, reason: 'x-c is HtmlElement');
     expect(c is XCWrapper, isFalse, reason: 'x-c should not be upgraded yet');
     expect(_readX(c), null, reason: 'x-c has not been registered in JS yet');
-  });
+  }, skip: 'https://github.com/dart-lang/web-components/issues/38');
 
   test('anything created after registering Dart type is upgraded', () {
     context.callMethod('addA');
@@ -97,7 +95,7 @@
     expect(d is XDWrapper, isTrue, reason: 'x-d is upgraded to XDWrapper');
     expect(d.x, 5);
     expect(d.wrapperCount, 4);
-  });
+  }, skip: 'https://github.com/dart-lang/web-components/issues/38');
 
   test('events seen if Dart type is registered before registerElement', () {
     var c = document.querySelector('x-c');
@@ -119,7 +117,7 @@
     expect(c is XCWrapper, isTrue, reason: 'x-c is upgraded to XCWrapper');
     expect(c.x, 7);
     expect(c.wrapperCount, 6);
-  });
+  }, skip: 'https://github.com/dart-lang/web-components/issues/38');
 
   test('element can extend another element', () {
     registerDartType('x-e', XEWrapper);
@@ -129,7 +127,7 @@
     expect(e is XEWrapper, isTrue);
     expect(e.x, 8);
     expect(e.y, 9);
-  });
+  }, skip: 'https://github.com/dart-lang/web-components/issues/38');
 }
 int _count = 0;
 
diff --git a/test/interop_test.html b/test/interop_test.html
index 9b3e5fa..019beab 100644
--- a/test/interop_test.html
+++ b/test/interop_test.html
@@ -10,9 +10,9 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/webcomponents.js"></script>
-  <script src="/packages/web_components/dart_support.js"></script>
-  <script src="/packages/web_components/interop_support.js"></script>
+  <script src="packages/web_components/webcomponents-lite.js"></script>
+  <script src="packages/web_components/interop_support.js"></script>
+  <script src="packages/web_components/dart_support.js"></script>
 </head>
 <body>
   <h1> Running interop_test </h1>
@@ -76,9 +76,8 @@
   <div is="x-b" id="i2"></div>
   <x-c id="i3"></x-c>
   <x-d id="i4"></x-d>
-  <script type="text/javascript"
-      src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  <script type="application/dart" src="interop_test.dart"></script>
-  <script type="text/javascript" src="/packages/browser/dart.js"></script>
-</body>
+  <link rel="x-dart-test" href="interop_test.dart">
+  <script src="packages/test/dart.js"></script>
+  <!-- <script type="application/dart" src="interop_test.dart"></script>
+  <script src="packages/browser/dart.js"></script> -->
 </html>
diff --git a/test/location_wrapper_test.dart b/test/location_wrapper_test.dart
index a1c531a..6120d03 100644
--- a/test/location_wrapper_test.dart
+++ b/test/location_wrapper_test.dart
@@ -2,15 +2,13 @@
 // 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.
 
+@TestOn('browser')
 library template_wrappers_test;
 
 import 'dart:html';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 main() {
-  useHtmlConfiguration();
-
   test('OK to access location with platform.js', () {
     expect(window.location.toString(), window.location.href);
   });
diff --git a/test/location_wrapper_test.html b/test/location_wrapper_test.html
index 21d59fd..ee18f17 100644
--- a/test/location_wrapper_test.html
+++ b/test/location_wrapper_test.html
@@ -15,9 +15,7 @@
 </head>
 <body>
   <h1> Running template_wrappers_test </h1>
-  <script type="text/javascript"
-      src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  <script type="application/dart" src="location_wrapper_test.dart"></script>
-  <script type="text/javascript" src="/packages/browser/dart.js"></script>
+  <link rel="x-dart-test" href="location_wrapper_test.dart">
+  <script src="packages/test/dart.js"></script>
 </body>
 </html>