diff --git a/lib/src/async_package_resolver.dart b/lib/src/async_package_resolver.dart
index ef75081..03f6bbe 100644
--- a/lib/src/async_package_resolver.dart
+++ b/lib/src/async_package_resolver.dart
@@ -12,18 +12,27 @@
 
   AsyncPackageResolver(this._inner);
 
+  @override
   Future<Map<String, Uri>> get packageConfigMap async =>
       _inner.packageConfigMap;
 
+  @override
   Future<Uri> get packageConfigUri async => _inner.packageConfigUri;
+  @override
   Future<Uri> get packageRoot async => _inner.packageRoot;
+  @override
   Future<SyncPackageResolver> get asSync async => _inner;
+  @override
   Future<String> get processArgument async => _inner.processArgument;
 
+  @override
   Future<Uri> resolveUri(packageUri) async => _inner.resolveUri(packageUri);
+  @override
   Future<Uri> urlFor(String package, [String path]) async =>
       _inner.urlFor(package, path);
+  @override
   Future<Uri> packageUriFor(url) async => _inner.packageUriFor(url);
+  @override
   Future<String> packagePath(String package) async =>
       _inner.packagePath(package);
 }
diff --git a/lib/src/current_isolate_resolver.dart b/lib/src/current_isolate_resolver.dart
index e3b9770..f06a19a 100644
--- a/lib/src/current_isolate_resolver.dart
+++ b/lib/src/current_isolate_resolver.dart
@@ -16,6 +16,7 @@
 PackageResolver currentIsolateResolver() => _CurrentIsolateResolver();
 
 class _CurrentIsolateResolver implements PackageResolver {
+  @override
   Future<Map<String, Uri>> get packageConfigMap async {
     if (_packageConfigMap != null) return _packageConfigMap;
 
@@ -27,11 +28,14 @@
 
   Map<String, Uri> _packageConfigMap;
 
+  @override
   Future<Uri> get packageConfigUri => Isolate.packageConfig;
 
   // ignore: deprecated_member_use
+  @override
   Future<Uri> get packageRoot => Isolate.packageRoot;
 
+  @override
   Future<SyncPackageResolver> get asSync async {
     var root = await packageRoot;
     if (root != null) return PackageRootResolver(root);
@@ -46,24 +50,29 @@
     return PackageConfigResolver(map, uri: await packageConfigUri);
   }
 
+  @override
   Future<String> get processArgument async {
     var configUri = await packageConfigUri;
-    if (configUri != null) return "--packages=$configUri";
+    if (configUri != null) return '--packages=$configUri';
 
     var root = await packageRoot;
-    if (root != null) return "--package-root=$root";
+    if (root != null) return '--package-root=$root';
 
     return null;
   }
 
+  @override
   Future<Uri> resolveUri(packageUri) =>
-      Isolate.resolvePackageUri(asPackageUri(packageUri, "packageUri"));
+      Isolate.resolvePackageUri(asPackageUri(packageUri, 'packageUri'));
 
+  @override
   Future<Uri> urlFor(String package, [String path]) =>
       Isolate.resolvePackageUri(Uri.parse("package:$package/${path ?? ''}"));
 
+  @override
   Future<Uri> packageUriFor(url) async => (await asSync).packageUriFor(url);
 
+  @override
   Future<String> packagePath(String package) async {
     var root = await packageRoot;
     if (root != null) return PackageRootResolver(root).packagePath(package);
diff --git a/lib/src/no_package_resolver.dart b/lib/src/no_package_resolver.dart
index 50ea132..f534bb7 100644
--- a/lib/src/no_package_resolver.dart
+++ b/lib/src/no_package_resolver.dart
@@ -9,26 +9,35 @@
 
 /// A package resolution strategy that is unable to resolve any `package:` URIs.
 class NoPackageResolver implements SyncPackageResolver {
+  @override
   Map<String, Uri> get packageConfigMap => null;
+  @override
   Uri get packageConfigUri => null;
+  @override
   Uri get packageRoot => null;
+  @override
   String get processArgument => null;
 
+  @override
   PackageResolver get asAsync => AsyncPackageResolver(this);
 
+  @override
   Uri resolveUri(packageUri) {
     // Verify that the URI is valid.
-    asPackageUri(packageUri, "packageUri");
+    asPackageUri(packageUri, 'packageUri');
     return null;
   }
 
+  @override
   Uri urlFor(String package, [String path]) => null;
 
+  @override
   Uri packageUriFor(url) {
     // Verify that the URI is a valid type.
-    asUri(url, "url");
+    asUri(url, 'url');
     return null;
   }
 
+  @override
   String packagePath(String package) => null;
 }
diff --git a/lib/src/package_config_resolver.dart b/lib/src/package_config_resolver.dart
index 9d56b2e..b57e5d0 100644
--- a/lib/src/package_config_resolver.dart
+++ b/lib/src/package_config_resolver.dart
@@ -15,30 +15,35 @@
 
 /// A package resolution strategy based on a package config map.
 class PackageConfigResolver implements SyncPackageResolver {
+  @override
   final packageRoot = null;
 
+  @override
   final Map<String, Uri> packageConfigMap;
 
+  @override
   Uri get packageConfigUri {
     if (_uri != null) return _uri;
 
     var buffer = StringBuffer();
-    packages_file.write(buffer, packageConfigMap, comment: "");
+    packages_file.write(buffer, packageConfigMap, comment: '');
     _uri =
-        UriData.fromString(buffer.toString(), parameters: {"charset": "utf-8"})
+        UriData.fromString(buffer.toString(), parameters: {'charset': 'utf-8'})
             .uri;
     return _uri;
   }
 
   Uri _uri;
 
+  @override
   PackageResolver get asAsync => AsyncPackageResolver(this);
 
-  String get processArgument => "--packages=$packageConfigUri";
+  @override
+  String get processArgument => '--packages=$packageConfigUri';
 
   PackageConfigResolver(Map<String, Uri> packageConfigMap, {uri})
       : packageConfigMap = _normalizeMap(packageConfigMap),
-        _uri = uri == null ? null : asUri(uri, "uri");
+        _uri = uri == null ? null : asUri(uri, 'uri');
 
   /// Normalizes the URIs in [map] to ensure that they all end in a trailing
   /// slash.
@@ -46,8 +51,9 @@
       UnmodifiableMapView(
           mapMap(map, value: (_, uri) => ensureTrailingSlash(uri)));
 
+  @override
   Uri resolveUri(packageUri) {
-    var uri = asPackageUri(packageUri, "packageUri");
+    var uri = asPackageUri(packageUri, 'packageUri');
 
     var baseUri = packageConfigMap[uri.pathSegments.first];
     if (baseUri == null) return null;
@@ -62,6 +68,7 @@
     return baseUri.replace(pathSegments: segments);
   }
 
+  @override
   Uri urlFor(String package, [String path]) {
     var baseUri = packageConfigMap[package];
     if (baseUri == null) return null;
@@ -69,23 +76,25 @@
     return baseUri.resolve(path);
   }
 
+  @override
   Uri packageUriFor(url) {
-    url = asUri(url, "url").toString();
+    url = asUri(url, 'url').toString();
 
     // Make sure isWithin works if [url] is exactly the base.
-    var nested = p.url.join(url, "_");
+    var nested = p.url.join(url, '_');
     for (var package in packageConfigMap.keys) {
       var base = packageConfigMap[package].toString();
       if (!p.url.isWithin(base, nested)) continue;
 
       var relative = p.url.relative(url, from: base);
       if (relative == '.') relative = '';
-      return Uri.parse("package:$package/$relative");
+      return Uri.parse('package:$package/$relative');
     }
 
     return null;
   }
 
+  @override
   String packagePath(String package) {
     var lib = packageConfigMap[package];
     if (lib == null) return null;
diff --git a/lib/src/package_root_resolver.dart b/lib/src/package_root_resolver.dart
index c0e96c7..d6e6299 100644
--- a/lib/src/package_root_resolver.dart
+++ b/lib/src/package_root_resolver.dart
@@ -11,41 +11,50 @@
 
 /// A package resolution strategy based on a package root URI.
 class PackageRootResolver implements SyncPackageResolver {
+  @override
   final packageConfigMap = null;
+  @override
   final packageConfigUri = null;
 
+  @override
   final Uri packageRoot;
 
+  @override
   PackageResolver get asAsync => AsyncPackageResolver(this);
 
-  String get processArgument => "--package-root=$packageRoot";
+  @override
+  String get processArgument => '--package-root=$packageRoot';
 
   PackageRootResolver(packageRoot)
-      : packageRoot = ensureTrailingSlash(asUri(packageRoot, "packageRoot"));
+      : packageRoot = ensureTrailingSlash(asUri(packageRoot, 'packageRoot'));
 
+  @override
   Uri resolveUri(packageUri) {
-    packageUri = asPackageUri(packageUri, "packageUri");
+    packageUri = asPackageUri(packageUri, 'packageUri');
 
     // Following [Isolate.resolvePackageUri], "package:foo" resolves to null.
     if (packageUri.pathSegments.length == 1) return null;
     return packageRoot.resolve(packageUri.path);
   }
 
+  @override
   Uri urlFor(String package, [String path]) {
-    var result = packageRoot.resolve("$package/");
+    var result = packageRoot.resolve('$package/');
     return path == null ? result : result.resolve(path);
   }
 
+  @override
   Uri packageUriFor(url) {
     var packageRootString = packageRoot.toString();
-    url = asUri(url, "url").toString();
+    url = asUri(url, 'url').toString();
     if (!p.url.isWithin(packageRootString, url)) return null;
 
     var relative = p.url.relative(url, from: packageRootString);
-    if (!relative.contains("/")) relative += "/";
-    return Uri.parse("package:$relative");
+    if (!relative.contains('/')) relative += '/';
+    return Uri.parse('package:$relative');
   }
 
+  @override
   String packagePath(String package) =>
       packagePathForRoot(package, packageRoot);
 }
diff --git a/lib/src/sync_package_resolver.dart b/lib/src/sync_package_resolver.dart
index 1b7b47e..796d332 100644
--- a/lib/src/sync_package_resolver.dart
+++ b/lib/src/sync_package_resolver.dart
@@ -100,7 +100,7 @@
   /// [uri] may be a [String] or a [Uri].
   static Future<SyncPackageResolver> loadConfig(uri,
       {http.Client client}) async {
-    uri = asUri(uri, "uri");
+    uri = asUri(uri, 'uri');
     return SyncPackageResolver.config(await loadConfigMap(uri, client: client),
         uri: uri);
   }
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 1609d56..04a174c 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -53,10 +53,10 @@
 
   if (uri.scheme != 'package') {
     throw FormatException(
-        "Can only resolve a package: URI.", uri.toString(), 0);
+        'Can only resolve a package: URI.', uri.toString(), 0);
   } else if (uri.pathSegments.isEmpty) {
     throw FormatException(
-        "Expected package name.", uri.toString(), "package:".length);
+        'Expected package name.', uri.toString(), 'package:'.length);
   }
 
   return uri;
@@ -70,16 +70,16 @@
   if (uri is Uri) return uri;
   if (uri is String) return Uri.parse(uri);
 
-  throw ArgumentError.value(uri, name, "Must be a String or a Uri.");
+  throw ArgumentError.value(uri, name, 'Must be a String or a Uri.');
 }
 
 /// Returns a copy of [uri] with a trailing slash.
 ///
 /// If [uri] already ends in a slash, returns it as-is.
 Uri ensureTrailingSlash(Uri uri) {
-  if (uri.pathSegments.isEmpty) return uri.replace(path: "/");
+  if (uri.pathSegments.isEmpty) return uri.replace(path: '/');
   if (uri.pathSegments.last.isEmpty) return uri;
-  return uri.replace(pathSegments: uri.pathSegments.toList()..add(""));
+  return uri.replace(pathSegments: uri.pathSegments.toList()..add(''));
 }
 
 String packagePathForRoot(String package, Uri root) =>
diff --git a/test/current_isolate_info_test.dart b/test/current_isolate_info_test.dart
index 4377ef8..551fe3d 100644
--- a/test/current_isolate_info_test.dart
+++ b/test/current_isolate_info_test.dart
@@ -17,18 +17,18 @@
   // It's important to test these, because they use PackageConfig.current and
   // they're used to verify the output of the inner isolate's
   // PackageConfig.current.
-  test("_packageResolverLibUri is correct", () async {
+  test('_packageResolverLibUri is correct', () async {
     var libPath = p.fromUri(await _packageResolverLibUri);
     expect(File(p.join(libPath, 'package_resolver.dart')).exists(),
         completion(isTrue));
   });
 
-  test("_pathLibUri is correct", () async {
+  test('_pathLibUri is correct', () async {
     var libPath = p.fromUri(await _pathLibUri);
     expect(File(p.join(libPath, 'path.dart')).exists(), completion(isTrue));
   });
 
-  group("with a package config", () {
+  group('with a package config', () {
     var resolver;
     setUp(() async {
       var map;
@@ -49,65 +49,65 @@
 
       // Ensure that we have at least one URI that ends with "/" and one that
       // doesn't. Both of these cases need to be tested.
-      expect(map["package_resolver"].path, endsWith("/"));
-      map["path"] = Uri.parse(p.url.normalize(map["path"].toString()));
-      expect(map["path"].path, isNot(endsWith("/")));
+      expect(map['package_resolver'].path, endsWith('/'));
+      map['path'] = Uri.parse(p.url.normalize(map['path'].toString()));
+      expect(map['path'].path, isNot(endsWith('/')));
 
       resolver = PackageResolver.config(map);
     });
 
-    test("exposes the config map", () async {
-      expect(await _spawn("""() async {
+    test('exposes the config map', () async {
+      expect(await _spawn('''() async {
         var serializable = {};
         (await PackageResolver.current.packageConfigMap)
             .forEach((package, uri) {
           serializable[package] = uri.toString();
         });
         return serializable;
-      }()""", resolver),
-          containsPair("package_resolver", await _packageResolverLibUri));
+      }()''', resolver),
+          containsPair('package_resolver', await _packageResolverLibUri));
     });
 
-    test("exposes the config URI", () async {
+    test('exposes the config URI', () async {
       expect(
           await _spawn(
-              "(await PackageResolver.current.packageConfigUri).toString()",
+              '(await PackageResolver.current.packageConfigUri).toString()',
               resolver),
           equals((await resolver.packageConfigUri).toString()));
     });
 
-    test("exposes a null package root", () async {
+    test('exposes a null package root', () async {
       expect(
           // Use "== null" because if it *is* a URI, it'll crash the isolate
           // when we try to send it over the port.
           await _spawn(
-              "(await PackageResolver.current.packageRoot) == null", resolver),
+              '(await PackageResolver.current.packageRoot) == null', resolver),
           isTrue);
     });
 
-    test("processArgument uses --packages", () async {
-      expect(await _spawn("PackageResolver.current.processArgument", resolver),
+    test('processArgument uses --packages', () async {
+      expect(await _spawn('PackageResolver.current.processArgument', resolver),
           equals(await resolver.processArgument));
     });
 
-    group("resolveUri", () {
-      test("with a matching package", () async {
+    group('resolveUri', () {
+      test('with a matching package', () async {
         expect(await _spawn("""() async {
           var uri = await PackageResolver.current.resolveUri(
               'package:package_resolver/foo/bar.dart');
           return uri.toString();
         }()""", resolver),
-            equals(p.url.join(await _packageResolverLibUri, "foo/bar.dart")));
+            equals(p.url.join(await _packageResolverLibUri, 'foo/bar.dart')));
 
         expect(await _spawn("""() async {
           var uri = await PackageResolver.current.resolveUri(
               'package:path/foo/bar.dart');
           return uri.toString();
         }()""", resolver),
-            equals(p.url.join(await _pathLibUri, "foo/bar.dart")));
+            equals(p.url.join(await _pathLibUri, 'foo/bar.dart')));
       });
 
-      test("with a matching package with no path", () async {
+      test('with a matching package with no path', () async {
         expect(await _spawn("""() async {
           var uri = await PackageResolver.current.resolveUri(
               'package:package_resolver');
@@ -120,7 +120,7 @@
         }()""", resolver), isTrue);
       });
 
-      test("with a matching package with an empty path", () async {
+      test('with a matching package with an empty path', () async {
         expect(await _spawn("""() async {
           var uri = await PackageResolver.current.resolveUri(
               'package:package_resolver/');
@@ -133,7 +133,7 @@
         }()""", resolver), (await _pathLibUri).toString());
       });
 
-      test("with a URI object", () async {
+      test('with a URI object', () async {
         expect(await _spawn("""() async {
           var uri = await PackageResolver.current.resolveUri(
               Uri.parse('package:package_resolver/foo/bar.dart'));
@@ -142,7 +142,7 @@
             equals(p.url.join(await _packageResolverLibUri, 'foo/bar.dart')));
       });
 
-      test("with a non-matching package", () async {
+      test('with a non-matching package', () async {
         expect(await _spawn("""() async {
           var uri = await PackageResolver.current.resolveUri(
               Uri.parse('package:not-a-package/foo/bar.dart'));
@@ -150,18 +150,18 @@
         }()""", resolver), isTrue);
       });
 
-      test("with an invalid argument type", () async {
-        expect(await _spawn("""() async {
+      test('with an invalid argument type', () async {
+        expect(await _spawn('''() async {
           try {
             await PackageResolver.current.resolveUri(12);
             return false;
           } on ArgumentError catch (_) {
             return true;
           }
-        }()""", resolver), isTrue);
+        }()''', resolver), isTrue);
       });
 
-      test("with a non-package URI", () async {
+      test('with a non-package URI', () async {
         expect(await _spawn("""() async {
           try {
             await PackageResolver.current.resolveUri('file:///zip/zap');
@@ -172,15 +172,15 @@
         }()""", resolver), isTrue);
       });
 
-      test("with an invalid package URI", () async {
-        expect(await _spawn("""() async {
+      test('with an invalid package URI', () async {
+        expect(await _spawn('''() async {
           try {
             await PackageResolver.current.resolveUri("package:");
             return false;
           } on FormatException catch (_) {
             return true;
           }
-        }()""", resolver), isTrue);
+        }()''', resolver), isTrue);
       });
     });
   });
@@ -215,8 +215,8 @@
       message.send(await ($expression));
     }
   """,
-      mimeType: "application/dart",
-      parameters: {"charset": "utf-8"});
+      mimeType: 'application/dart',
+      parameters: {'charset': 'utf-8'});
 
   var receivePort = ReceivePort();
   var errorPort = ReceivePort();
diff --git a/test/no_package_info_test.dart b/test/no_package_info_test.dart
index 1679808..ee9c8b2 100644
--- a/test/no_package_info_test.dart
+++ b/test/no_package_info_test.dart
@@ -12,34 +12,34 @@
     resolver = SyncPackageResolver.none;
   });
 
-  test("exposes everything as null", () {
+  test('exposes everything as null', () {
     expect(resolver.packageConfigMap, isNull);
     expect(resolver.packageConfigUri, isNull);
     expect(resolver.packageRoot, isNull);
     expect(resolver.processArgument, isNull);
-    expect(resolver.resolveUri("package:foo/bar.dart"), isNull);
-    expect(resolver.urlFor("foo"), isNull);
-    expect(resolver.urlFor("foo", "bar.dart"), isNull);
-    expect(resolver.packageUriFor("file:///foo/bar.dart"), isNull);
-    expect(resolver.packagePath("foo"), isNull);
+    expect(resolver.resolveUri('package:foo/bar.dart'), isNull);
+    expect(resolver.urlFor('foo'), isNull);
+    expect(resolver.urlFor('foo', 'bar.dart'), isNull);
+    expect(resolver.packageUriFor('file:///foo/bar.dart'), isNull);
+    expect(resolver.packagePath('foo'), isNull);
   });
 
-  group("resolveUri", () {
-    test("with an invalid argument type", () {
+  group('resolveUri', () {
+    test('with an invalid argument type', () {
       expect(() => resolver.resolveUri(12), throwsArgumentError);
     });
 
-    test("with a non-package URI", () {
+    test('with a non-package URI', () {
       expect(
-          () => resolver.resolveUri("file:///zip/zap"), throwsFormatException);
+          () => resolver.resolveUri('file:///zip/zap'), throwsFormatException);
     });
 
-    test("with an invalid package URI", () {
-      expect(() => resolver.resolveUri("package:"), throwsFormatException);
+    test('with an invalid package URI', () {
+      expect(() => resolver.resolveUri('package:'), throwsFormatException);
     });
   });
 
-  test("packageUriFor with an invalid argument type", () {
+  test('packageUriFor with an invalid argument type', () {
     expect(() => resolver.packageUriFor(12), throwsArgumentError);
   });
 }
diff --git a/test/package_config_info_test.dart b/test/package_config_info_test.dart
index a4a1c12..8eb00f4 100644
--- a/test/package_config_info_test.dart
+++ b/test/package_config_info_test.dart
@@ -15,168 +15,168 @@
   SyncPackageResolver resolver;
   setUp(() {
     resolver = SyncPackageResolver.config({
-      "foo": Uri.parse("file:///foo/bar/"),
-      "bar": Uri.parse("http://dartlang.org/bar")
-    }, uri: "file:///myapp/.packages");
+      'foo': Uri.parse('file:///foo/bar/'),
+      'bar': Uri.parse('http://dartlang.org/bar')
+    }, uri: 'file:///myapp/.packages');
   });
 
-  group("constructor", () {
-    test("with a URI object", () {
+  group('constructor', () {
+    test('with a URI object', () {
       var resolver = SyncPackageResolver.config({},
-          uri: Uri.parse("file:///myapp/.packages"));
+          uri: Uri.parse('file:///myapp/.packages'));
       expect(resolver.packageConfigUri,
-          equals(Uri.parse("file:///myapp/.packages")));
+          equals(Uri.parse('file:///myapp/.packages')));
     });
 
-    test("with an invalid URI type", () {
+    test('with an invalid URI type', () {
       expect(
           () => SyncPackageResolver.config({}, uri: 12), throwsArgumentError);
     });
   });
 
-  test("exposes the config map", () {
+  test('exposes the config map', () {
     expect(
         resolver.packageConfigMap,
         equals({
-          "foo": Uri.parse("file:///foo/bar/"),
-          "bar": Uri.parse("http://dartlang.org/bar/")
+          'foo': Uri.parse('file:///foo/bar/'),
+          'bar': Uri.parse('http://dartlang.org/bar/')
         }));
   });
 
-  test("exposes the config URI if passed", () {
+  test('exposes the config URI if passed', () {
     expect(resolver.packageConfigUri,
-        equals(Uri.parse("file:///myapp/.packages")));
+        equals(Uri.parse('file:///myapp/.packages')));
   });
 
-  test("exposes a data: config URI if none is passed", () {
+  test('exposes a data: config URI if none is passed', () {
     resolver = SyncPackageResolver.config(resolver.packageConfigMap);
     expect(
         resolver.packageConfigUri,
-        equals(Uri.parse("data:;charset=utf-8,"
-            "foo:file:///foo/bar/%0A"
-            "bar:http://dartlang.org/bar/%0A")));
+        equals(Uri.parse('data:;charset=utf-8,'
+            'foo:file:///foo/bar/%0A'
+            'bar:http://dartlang.org/bar/%0A')));
   });
 
-  test("exposes a null root", () {
+  test('exposes a null root', () {
     expect(resolver.packageRoot, isNull);
   });
 
-  test("processArgument uses --packages", () {
+  test('processArgument uses --packages', () {
     expect(
-        resolver.processArgument, equals("--packages=file:///myapp/.packages"));
+        resolver.processArgument, equals('--packages=file:///myapp/.packages'));
   });
 
-  group("resolveUri", () {
-    test("with a matching package", () {
-      expect(resolver.resolveUri("package:foo/bang/qux.dart"),
-          equals(Uri.parse("file:///foo/bar/bang/qux.dart")));
-      expect(resolver.resolveUri("package:bar/bang/qux.dart"),
-          equals(Uri.parse("http://dartlang.org/bar/bang/qux.dart")));
+  group('resolveUri', () {
+    test('with a matching package', () {
+      expect(resolver.resolveUri('package:foo/bang/qux.dart'),
+          equals(Uri.parse('file:///foo/bar/bang/qux.dart')));
+      expect(resolver.resolveUri('package:bar/bang/qux.dart'),
+          equals(Uri.parse('http://dartlang.org/bar/bang/qux.dart')));
     });
 
-    test("with a matching package with no path", () {
-      expect(resolver.resolveUri("package:foo"), isNull);
+    test('with a matching package with no path', () {
+      expect(resolver.resolveUri('package:foo'), isNull);
     });
 
-    test("with a matching package with an empty path", () {
-      expect(resolver.resolveUri("package:bar/"),
-          equals(Uri.parse("http://dartlang.org/bar/")));
+    test('with a matching package with an empty path', () {
+      expect(resolver.resolveUri('package:bar/'),
+          equals(Uri.parse('http://dartlang.org/bar/')));
     });
 
-    test("with a URI object", () {
-      expect(resolver.resolveUri(Uri.parse("package:foo/bang/qux.dart")),
-          equals(Uri.parse("file:///foo/bar/bang/qux.dart")));
+    test('with a URI object', () {
+      expect(resolver.resolveUri(Uri.parse('package:foo/bang/qux.dart')),
+          equals(Uri.parse('file:///foo/bar/bang/qux.dart')));
     });
 
-    test("with a non-matching package", () {
-      expect(resolver.resolveUri("package:zap/bang/qux.dart"), isNull);
+    test('with a non-matching package', () {
+      expect(resolver.resolveUri('package:zap/bang/qux.dart'), isNull);
     });
 
-    test("with an invalid argument type", () {
+    test('with an invalid argument type', () {
       expect(() => resolver.resolveUri(12), throwsArgumentError);
     });
 
-    test("with a non-package URI", () {
+    test('with a non-package URI', () {
       expect(
-          () => resolver.resolveUri("file:///zip/zap"), throwsFormatException);
+          () => resolver.resolveUri('file:///zip/zap'), throwsFormatException);
     });
 
-    test("with an invalid package URI", () {
-      expect(() => resolver.resolveUri("package:"), throwsFormatException);
+    test('with an invalid package URI', () {
+      expect(() => resolver.resolveUri('package:'), throwsFormatException);
     });
   });
 
-  group("urlFor", () {
-    test("with a matching package and no path", () {
-      expect(resolver.urlFor("foo"), equals(Uri.parse("file:///foo/bar/")));
-      expect(resolver.urlFor("bar"),
-          equals(Uri.parse("http://dartlang.org/bar/")));
+  group('urlFor', () {
+    test('with a matching package and no path', () {
+      expect(resolver.urlFor('foo'), equals(Uri.parse('file:///foo/bar/')));
+      expect(resolver.urlFor('bar'),
+          equals(Uri.parse('http://dartlang.org/bar/')));
     });
 
-    test("with a matching package and a path", () {
-      expect(resolver.urlFor("foo", "bang/qux.dart"),
-          equals(Uri.parse("file:///foo/bar/bang/qux.dart")));
-      expect(resolver.urlFor("bar", "bang/qux.dart"),
-          equals(Uri.parse("http://dartlang.org/bar/bang/qux.dart")));
+    test('with a matching package and a path', () {
+      expect(resolver.urlFor('foo', 'bang/qux.dart'),
+          equals(Uri.parse('file:///foo/bar/bang/qux.dart')));
+      expect(resolver.urlFor('bar', 'bang/qux.dart'),
+          equals(Uri.parse('http://dartlang.org/bar/bang/qux.dart')));
     });
 
-    test("with a non-matching package and no path", () {
-      expect(resolver.urlFor("zap"), isNull);
+    test('with a non-matching package and no path', () {
+      expect(resolver.urlFor('zap'), isNull);
     });
   });
 
-  group("packageUriFor", () {
-    test("converts matching URIs to package:", () {
-      expect(resolver.packageUriFor("file:///foo/bar/bang/qux.dart"),
-          equals(Uri.parse("package:foo/bang/qux.dart")));
-      expect(resolver.packageUriFor("http://dartlang.org/bar/bang/qux.dart"),
-          equals(Uri.parse("package:bar/bang/qux.dart")));
+  group('packageUriFor', () {
+    test('converts matching URIs to package:', () {
+      expect(resolver.packageUriFor('file:///foo/bar/bang/qux.dart'),
+          equals(Uri.parse('package:foo/bang/qux.dart')));
+      expect(resolver.packageUriFor('http://dartlang.org/bar/bang/qux.dart'),
+          equals(Uri.parse('package:bar/bang/qux.dart')));
     });
 
-    test("converts URIs with no paths", () {
-      expect(resolver.packageUriFor("file:///foo/bar"),
-          equals(Uri.parse("package:foo/")));
-      expect(resolver.packageUriFor("http://dartlang.org/bar/"),
-          equals(Uri.parse("package:bar/")));
+    test('converts URIs with no paths', () {
+      expect(resolver.packageUriFor('file:///foo/bar'),
+          equals(Uri.parse('package:foo/')));
+      expect(resolver.packageUriFor('http://dartlang.org/bar/'),
+          equals(Uri.parse('package:bar/')));
     });
 
-    test("with a URI object", () {
-      expect(resolver.packageUriFor(Uri.parse("file:///foo/bar/bang/qux.dart")),
-          equals(Uri.parse("package:foo/bang/qux.dart")));
+    test('with a URI object', () {
+      expect(resolver.packageUriFor(Uri.parse('file:///foo/bar/bang/qux.dart')),
+          equals(Uri.parse('package:foo/bang/qux.dart')));
     });
 
-    test("with an invalid argument type", () {
+    test('with an invalid argument type', () {
       expect(() => resolver.packageUriFor(12), throwsArgumentError);
     });
   });
 
-  group("packagePath", () {
+  group('packagePath', () {
     setUp(() {
       resolver = SyncPackageResolver.config({
-        "foo": p.toUri(p.join(p.current, 'lib')),
-        "bar": Uri.parse("http://dartlang.org/bar")
+        'foo': p.toUri(p.join(p.current, 'lib')),
+        'bar': Uri.parse('http://dartlang.org/bar')
       });
     });
 
-    test("with a matching package", () {
-      expect(resolver.packagePath("foo"), equals(p.current));
-    }, testOn: "vm");
+    test('with a matching package', () {
+      expect(resolver.packagePath('foo'), equals(p.current));
+    }, testOn: 'vm');
 
-    test("with a package with a non-file scheme", () {
-      expect(resolver.packagePath("bar"), isNull);
+    test('with a package with a non-file scheme', () {
+      expect(resolver.packagePath('bar'), isNull);
     });
 
-    test("with a non-matching", () {
-      expect(resolver.packagePath("baz"), isNull);
+    test('with a non-matching', () {
+      expect(resolver.packagePath('baz'), isNull);
     });
   });
 
-  group("loadConfig", () {
+  group('loadConfig', () {
     var server;
     var sandbox;
     setUp(() async {
       sandbox =
-          (await Directory.systemTemp.createTemp("package_resolver_test")).path;
+          (await Directory.systemTemp.createTemp('package_resolver_test')).path;
     });
 
     tearDown(() async {
@@ -184,29 +184,29 @@
       await Directory(sandbox).delete(recursive: true);
     });
 
-    test("with an http: URI", () async {
+    test('with an http: URI', () async {
       server = await shelf_io.serve((request) {
-        return shelf.Response.ok("foo:file:///foo/bar/\n"
-            "bar:http://dartlang.org/bar/");
+        return shelf.Response.ok('foo:file:///foo/bar/\n'
+            'bar:http://dartlang.org/bar/');
       }, 'localhost', 0);
 
       var resolver = await SyncPackageResolver.loadConfig(
-          "http://localhost:${server.port}");
+          'http://localhost:${server.port}');
 
       expect(
           resolver.packageConfigMap,
           equals({
-            "foo": Uri.parse("file:///foo/bar/"),
-            "bar": Uri.parse("http://dartlang.org/bar/")
+            'foo': Uri.parse('file:///foo/bar/'),
+            'bar': Uri.parse('http://dartlang.org/bar/')
           }));
       expect(resolver.packageConfigUri,
-          equals(Uri.parse("http://localhost:${server.port}")));
+          equals(Uri.parse('http://localhost:${server.port}')));
     });
 
-    test("with a file: URI", () async {
-      var packagesPath = p.join(sandbox, ".packages");
-      File(packagesPath).writeAsStringSync("foo:file:///foo/bar/\n"
-          "bar:http://dartlang.org/bar/");
+    test('with a file: URI', () async {
+      var packagesPath = p.join(sandbox, '.packages');
+      File(packagesPath).writeAsStringSync('foo:file:///foo/bar/\n'
+          'bar:http://dartlang.org/bar/');
 
       var resolver =
           await SyncPackageResolver.loadConfig(p.toUri(packagesPath));
@@ -214,46 +214,46 @@
       expect(
           resolver.packageConfigMap,
           equals({
-            "foo": Uri.parse("file:///foo/bar/"),
-            "bar": Uri.parse("http://dartlang.org/bar/")
+            'foo': Uri.parse('file:///foo/bar/'),
+            'bar': Uri.parse('http://dartlang.org/bar/')
           }));
       expect(resolver.packageConfigUri, equals(p.toUri(packagesPath)));
     });
 
-    test("with a data: URI", () async {
-      var data = Uri.parse("data:;charset=utf-8,"
-          "foo:file:///foo/bar/%0A"
-          "bar:http://dartlang.org/bar/%0A");
+    test('with a data: URI', () async {
+      var data = Uri.parse('data:;charset=utf-8,'
+          'foo:file:///foo/bar/%0A'
+          'bar:http://dartlang.org/bar/%0A');
       var resolver = await SyncPackageResolver.loadConfig(data);
 
       expect(
           resolver.packageConfigMap,
           equals({
-            "foo": Uri.parse("file:///foo/bar/"),
-            "bar": Uri.parse("http://dartlang.org/bar/")
+            'foo': Uri.parse('file:///foo/bar/'),
+            'bar': Uri.parse('http://dartlang.org/bar/')
           }));
       expect(resolver.packageConfigUri, equals(data));
     });
 
-    test("with a package: URI", () async {
+    test('with a package: URI', () async {
       var resolver = await SyncPackageResolver.loadConfig(
-          "package:package_resolver/src/test_package_config");
+          'package:package_resolver/src/test_package_config');
 
       expect(
           resolver.packageConfigMap,
           equals({
-            "foo": Uri.parse("file:///foo/bar/"),
-            "bar": Uri.parse("http://dartlang.org/bar/")
+            'foo': Uri.parse('file:///foo/bar/'),
+            'bar': Uri.parse('http://dartlang.org/bar/')
           }));
       expect(
           resolver.packageConfigUri,
           equals(
-              Uri.parse("package:package_resolver/src/test_package_config")));
+              Uri.parse('package:package_resolver/src/test_package_config')));
     });
 
-    test("with an unsupported scheme", () {
-      expect(SyncPackageResolver.loadConfig("asdf:foo/bar"),
+    test('with an unsupported scheme', () {
+      expect(SyncPackageResolver.loadConfig('asdf:foo/bar'),
           throwsUnsupportedError);
     });
-  }, testOn: "vm");
+  }, testOn: 'vm');
 }
diff --git a/test/package_root_info_test.dart b/test/package_root_info_test.dart
index 200d6e5..8eb06cf 100644
--- a/test/package_root_info_test.dart
+++ b/test/package_root_info_test.dart
@@ -12,142 +12,142 @@
 void main() {
   var resolver;
   setUp(() {
-    resolver = SyncPackageResolver.root("file:///foo/bar");
+    resolver = SyncPackageResolver.root('file:///foo/bar');
   });
 
-  group("constructor", () {
-    test("with a URI object", () {
-      var resolver = SyncPackageResolver.root(Uri.parse("file:///foo/bar/"));
-      expect(resolver.packageRoot, equals(Uri.parse("file:///foo/bar/")));
+  group('constructor', () {
+    test('with a URI object', () {
+      var resolver = SyncPackageResolver.root(Uri.parse('file:///foo/bar/'));
+      expect(resolver.packageRoot, equals(Uri.parse('file:///foo/bar/')));
     });
 
-    test("with a URI without a path component", () {
+    test('with a URI without a path component', () {
       var resolver =
-          SyncPackageResolver.root(Uri.parse("http://localhost:1234"));
-      expect(resolver.packageRoot, equals(Uri.parse("http://localhost:1234/")));
+          SyncPackageResolver.root(Uri.parse('http://localhost:1234'));
+      expect(resolver.packageRoot, equals(Uri.parse('http://localhost:1234/')));
     });
 
-    test("with an invalid URI type", () {
+    test('with an invalid URI type', () {
       expect(() => SyncPackageResolver.root(12), throwsArgumentError);
     });
   });
 
-  test("exposes a null config map", () {
+  test('exposes a null config map', () {
     expect(resolver.packageConfigMap, isNull);
   });
 
-  test("exposes a null config URI", () {
+  test('exposes a null config URI', () {
     expect(resolver.packageConfigUri, isNull);
   });
 
-  test("exposes the root root", () {
-    expect(resolver.packageRoot, equals(Uri.parse("file:///foo/bar/")));
+  test('exposes the root root', () {
+    expect(resolver.packageRoot, equals(Uri.parse('file:///foo/bar/')));
   });
 
-  test("processArgument uses --package-root", () {
-    expect(resolver.processArgument, equals("--package-root=file:///foo/bar/"));
+  test('processArgument uses --package-root', () {
+    expect(resolver.processArgument, equals('--package-root=file:///foo/bar/'));
   });
 
-  group("resolveUri", () {
-    test("with a package", () {
-      expect(resolver.resolveUri("package:baz/bang/qux.dart"),
-          equals(Uri.parse("file:///foo/bar/baz/bang/qux.dart")));
+  group('resolveUri', () {
+    test('with a package', () {
+      expect(resolver.resolveUri('package:baz/bang/qux.dart'),
+          equals(Uri.parse('file:///foo/bar/baz/bang/qux.dart')));
     });
 
-    test("with a package with no path", () {
-      expect(resolver.resolveUri("package:baz"), isNull);
+    test('with a package with no path', () {
+      expect(resolver.resolveUri('package:baz'), isNull);
     });
 
-    test("with a package with an empty path", () {
-      expect(resolver.resolveUri("package:baz/"),
-          equals(Uri.parse("file:///foo/bar/baz/")));
+    test('with a package with an empty path', () {
+      expect(resolver.resolveUri('package:baz/'),
+          equals(Uri.parse('file:///foo/bar/baz/')));
     });
 
-    test("with a URI object", () {
-      expect(resolver.resolveUri(Uri.parse("package:baz/bang/qux.dart")),
-          equals(Uri.parse("file:///foo/bar/baz/bang/qux.dart")));
+    test('with a URI object', () {
+      expect(resolver.resolveUri(Uri.parse('package:baz/bang/qux.dart')),
+          equals(Uri.parse('file:///foo/bar/baz/bang/qux.dart')));
     });
 
-    test("with an invalid argument type", () {
+    test('with an invalid argument type', () {
       expect(() => resolver.resolveUri(12), throwsArgumentError);
     });
 
-    test("with a non-package URI", () {
+    test('with a non-package URI', () {
       expect(
-          () => resolver.resolveUri("file:///zip/zap"), throwsFormatException);
+          () => resolver.resolveUri('file:///zip/zap'), throwsFormatException);
     });
 
-    test("with an invalid package URI", () {
-      expect(() => resolver.resolveUri("package:"), throwsFormatException);
+    test('with an invalid package URI', () {
+      expect(() => resolver.resolveUri('package:'), throwsFormatException);
     });
   });
 
-  group("urlFor", () {
-    test("with no path", () {
-      expect(resolver.urlFor("baz"), equals(Uri.parse("file:///foo/bar/baz/")));
+  group('urlFor', () {
+    test('with no path', () {
+      expect(resolver.urlFor('baz'), equals(Uri.parse('file:///foo/bar/baz/')));
     });
 
-    test("with a path", () {
-      expect(resolver.urlFor("baz", "bang/qux.dart"),
-          equals(Uri.parse("file:///foo/bar/baz/bang/qux.dart")));
+    test('with a path', () {
+      expect(resolver.urlFor('baz', 'bang/qux.dart'),
+          equals(Uri.parse('file:///foo/bar/baz/bang/qux.dart')));
     });
   });
 
-  group("packageUriFor", () {
-    test("converts a matching URI to a package:", () {
-      expect(resolver.packageUriFor("file:///foo/bar/bang/qux.dart"),
-          equals(Uri.parse("package:bang/qux.dart")));
+  group('packageUriFor', () {
+    test('converts a matching URI to a package:', () {
+      expect(resolver.packageUriFor('file:///foo/bar/bang/qux.dart'),
+          equals(Uri.parse('package:bang/qux.dart')));
     });
 
-    test("converts a matching URI with no path", () {
-      expect(resolver.packageUriFor("file:///foo/bar/baz"),
-          equals(Uri.parse("package:baz/")));
-      expect(resolver.packageUriFor("file:///foo/bar/baz/"),
-          equals(Uri.parse("package:baz/")));
+    test('converts a matching URI with no path', () {
+      expect(resolver.packageUriFor('file:///foo/bar/baz'),
+          equals(Uri.parse('package:baz/')));
+      expect(resolver.packageUriFor('file:///foo/bar/baz/'),
+          equals(Uri.parse('package:baz/')));
     });
 
-    test("with a URI object", () {
-      expect(resolver.packageUriFor(Uri.parse("file:///foo/bar/bang/qux.dart")),
-          equals(Uri.parse("package:bang/qux.dart")));
+    test('with a URI object', () {
+      expect(resolver.packageUriFor(Uri.parse('file:///foo/bar/bang/qux.dart')),
+          equals(Uri.parse('package:bang/qux.dart')));
     });
 
-    test("with an invalid argument type", () {
+    test('with an invalid argument type', () {
       expect(() => resolver.packageUriFor(12), throwsArgumentError);
     });
   });
 
-  group("packagePath", () {
+  group('packagePath', () {
     var sandbox;
     setUp(() async {
       sandbox =
-          (await Directory.systemTemp.createTemp("package_resolver_test")).path;
+          (await Directory.systemTemp.createTemp('package_resolver_test')).path;
     });
 
     tearDown(() async {
       await Directory(sandbox).delete(recursive: true);
     });
 
-    test("with a file: scheme", () async {
-      var packageLib = p.join(sandbox, "foo/lib");
+    test('with a file: scheme', () async {
+      var packageLib = p.join(sandbox, 'foo/lib');
       await Directory(packageLib).create(recursive: true);
 
-      var packagesDir = p.join(sandbox, "packages");
-      var fooLink = p.join(packagesDir, "foo");
+      var packagesDir = p.join(sandbox, 'packages');
+      var fooLink = p.join(packagesDir, 'foo');
       await Link(fooLink).create(packageLib, recursive: true);
 
-      var packagesLink = p.join(sandbox, "foo/packages");
+      var packagesLink = p.join(sandbox, 'foo/packages');
       await Link(packagesLink).create(packagesDir);
 
       var resolver = SyncPackageResolver.root(p.toUri(packagesLink));
 
-      expect(resolver.packagePath("foo"),
-          equals(Directory(p.join(sandbox, "foo")).resolveSymbolicLinksSync()));
-      expect(resolver.packagePath("bar"), isNull);
+      expect(resolver.packagePath('foo'),
+          equals(Directory(p.join(sandbox, 'foo')).resolveSymbolicLinksSync()));
+      expect(resolver.packagePath('bar'), isNull);
     });
 
-    test("without a file: scheme", () {
-      var resolver = SyncPackageResolver.root("http://dartlang.org/bar");
-      expect(resolver.packagePath("foo"), isNull);
+    test('without a file: scheme', () {
+      var resolver = SyncPackageResolver.root('http://dartlang.org/bar');
+      expect(resolver.packagePath('foo'), isNull);
     });
-  }, testOn: "vm");
+  }, testOn: 'vm');
 }
