diff --git a/benchmark/benchmark.dart b/benchmark/benchmark.dart
index 4fe479a..60550a4 100644
--- a/benchmark/benchmark.dart
+++ b/benchmark/benchmark.dart
@@ -41,8 +41,8 @@
     var context = p.Context(style: style);
     var files = genericPaths.toList()..addAll(platformPaths[style]);
 
-    benchmark(String name, Function function) {
-      runBenchmark("${style.name}-$name", 100000, () {
+    void benchmark(String name, Function function) {
+      runBenchmark('${style.name}-$name', 100000, () {
         for (var file in files) {
           function(file);
         }
@@ -50,7 +50,7 @@
     }
 
     void benchmarkPairs(String name, void Function(String, String) function) {
-      runBenchmark("${style.name}-$name", 1000, () {
+      runBenchmark('${style.name}-$name', 1000, () {
         for (var file1 in files) {
           for (var file2 in files) {
             function(file1, file2);
@@ -102,5 +102,5 @@
 
   var rate =
       (count / stopwatch.elapsedMicroseconds).toStringAsFixed(5).padLeft(9);
-  print("${name.padLeft(32)}: $rate iter/us (${stopwatch.elapsed})");
+  print('${name.padLeft(32)}: $rate iter/us (${stopwatch.elapsed})');
 }
diff --git a/lib/src/context.dart b/lib/src/context.dart
index 30db74e..8c7af5a 100644
--- a/lib/src/context.dart
+++ b/lib/src/context.dart
@@ -30,15 +30,15 @@
       if (style == null) {
         current = p.current;
       } else {
-        current = ".";
+        current = '.';
       }
     }
 
     if (style == null) {
       style = Style.platform;
     } else if (style is! InternalStyle) {
-      throw ArgumentError("Only styles defined by the path package are "
-          "allowed.");
+      throw ArgumentError('Only styles defined by the path package are '
+          'allowed.');
     }
 
     return Context._(style as InternalStyle, current);
@@ -59,7 +59,7 @@
   final String _current;
 
   /// The current directory that relative paths are relative to.
-  String get current => _current != null ? _current : p.current;
+  String get current => _current ?? p.current;
 
   /// Gets the path separator for the context's [style]. On Mac and Linux,
   /// this is `/`. On Windows, it's `\`.
@@ -80,7 +80,7 @@
       String part6,
       String part7]) {
     _validateArgList(
-        "absolute", [part1, part2, part3, part4, part5, part6, part7]);
+        'absolute', [part1, part2, part3, part4, part5, part6, part7]);
 
     // If there's a single absolute path, just return it. This is a lot faster
     // for the common case of `p.absolute(path)`.
@@ -124,10 +124,8 @@
   String dirname(String path) {
     var parsed = _parse(path);
     parsed.removeTrailingSeparators();
-    if (parsed.parts.isEmpty) return parsed.root == null ? '.' : parsed.root;
-    if (parsed.parts.length == 1) {
-      return parsed.root == null ? '.' : parsed.root;
-    }
+    if (parsed.parts.isEmpty) return parsed.root ?? '.';
+    if (parsed.parts.length == 1) return parsed.root ?? '.';
     parsed.parts.removeLast();
     parsed.separators.removeLast();
     parsed.removeTrailingSeparators();
@@ -185,7 +183,7 @@
   /// On POSIX systems, absolute paths start with a `/` (forward slash). On
   /// Windows, an absolute path starts with `\\`, or a drive letter followed by
   /// `:/` or `:\`.
-  bool isRelative(String path) => !this.isAbsolute(path);
+  bool isRelative(String path) => !isAbsolute(path);
 
   /// Returns `true` if [path] is a root-relative path and `false` if it's not.
   ///
@@ -228,7 +226,7 @@
       part7,
       part8
     ];
-    _validateArgList("join", parts);
+    _validateArgList('join', parts);
     return joinAll(parts.where((part) => part != null));
   }
 
@@ -252,7 +250,7 @@
     var isAbsoluteAndNotRootRelative = false;
 
     for (var part in parts.where((part) => part != '')) {
-      if (this.isRootRelative(part) && isAbsoluteAndNotRootRelative) {
+      if (isRootRelative(part) && isAbsoluteAndNotRootRelative) {
         // If the new part is root-relative, it preserves the previous root but
         // replaces the path after it.
         var parsed = _parse(part);
@@ -264,8 +262,8 @@
         }
         buffer.clear();
         buffer.write(parsed.toString());
-      } else if (this.isAbsolute(part)) {
-        isAbsoluteAndNotRootRelative = !this.isRootRelative(part);
+      } else if (isAbsolute(part)) {
+        isAbsoluteAndNotRootRelative = !isRootRelative(part);
         // An absolute path discards everything before it.
         buffer.clear();
         buffer.write(part);
@@ -450,24 +448,24 @@
   /// thrown.
   String relative(String path, {String from}) {
     // Avoid expensive computation if the path is already relative.
-    if (from == null && this.isRelative(path)) return this.normalize(path);
+    if (from == null && isRelative(path)) return normalize(path);
 
     from = from == null ? current : absolute(from);
 
     // We can't determine the path from a relative path to an absolute path.
-    if (this.isRelative(from) && this.isAbsolute(path)) {
-      return this.normalize(path);
+    if (isRelative(from) && isAbsolute(path)) {
+      return normalize(path);
     }
 
     // If the given path is relative, resolve it relative to the context's
     // current directory.
-    if (this.isRelative(path) || this.isRootRelative(path)) {
-      path = this.absolute(path);
+    if (isRelative(path) || isRootRelative(path)) {
+      path = absolute(path);
     }
 
     // If the path is still relative and `from` is absolute, we're unable to
     // find a path from `from` to `path`.
-    if (this.isRelative(path) && this.isAbsolute(from)) {
+    if (isRelative(path) && isAbsolute(from)) {
       throw PathException('Unable to find a path to "$path" from "$from".');
     }
 
@@ -585,7 +583,7 @@
       return _PathRelation.different;
     }
 
-    if (!this.isRelative(relative)) return _PathRelation.different;
+    if (!isRelative(relative)) return _PathRelation.different;
     if (relative == '.') return _PathRelation.equal;
     if (relative == '..') return _PathRelation.different;
     return (relative.length >= 3 &&
@@ -1078,12 +1076,12 @@
 
     // Show the arguments.
     var message = StringBuffer();
-    message.write("$method(");
+    message.write('$method(');
     message.write(args
         .take(numArgs)
-        .map((arg) => arg == null ? "null" : '"$arg"')
-        .join(", "));
-    message.write("): part ${i - 1} was null, but part $i was not.");
+        .map((arg) => arg == null ? 'null' : '"$arg"')
+        .join(', '));
+    message.write('): part ${i - 1} was null, but part $i was not.');
     throw ArgumentError(message.toString());
   }
 }
@@ -1095,23 +1093,24 @@
   ///
   /// Note that this applies even if the path ends beneath its original root. It
   /// takes precendence over any other return values that may apple.
-  static const aboveRoot = _PathDirection("above root");
+  static const aboveRoot = _PathDirection('above root');
 
   /// The path contains enough ".." components that it ends at its original
   /// root.
-  static const atRoot = _PathDirection("at root");
+  static const atRoot = _PathDirection('at root');
 
   /// The path contains enough ".." components that at some point it reaches its
   /// original root, but it ends beneath that root.
-  static const reachesRoot = _PathDirection("reaches root");
+  static const reachesRoot = _PathDirection('reaches root');
 
   /// The path never reaches to or above its original root.
-  static const belowRoot = _PathDirection("below root");
+  static const belowRoot = _PathDirection('below root');
 
   final String name;
 
   const _PathDirection(this.name);
 
+  @override
   String toString() => name;
 }
 
@@ -1120,25 +1119,26 @@
   /// The first path is a proper parent of the second.
   ///
   /// For example, `foo` is a proper parent of `foo/bar`, but not of `foo`.
-  static const within = _PathRelation("within");
+  static const within = _PathRelation('within');
 
   /// The two paths are equivalent.
   ///
   /// For example, `foo//bar` is equivalent to `foo/bar`.
-  static const equal = _PathRelation("equal");
+  static const equal = _PathRelation('equal');
 
   /// The first path is neither a parent of nor equal to the second.
-  static const different = _PathRelation("different");
+  static const different = _PathRelation('different');
 
   /// We couldn't quickly determine any information about the paths'
   /// relationship to each other.
   ///
   /// Only returned by [Context._isWithinOrEqualsFast].
-  static const inconclusive = _PathRelation("inconclusive");
+  static const inconclusive = _PathRelation('inconclusive');
 
   final String name;
 
   const _PathRelation(this.name);
 
+  @override
   String toString() => name;
 }
diff --git a/lib/src/internal_style.dart b/lib/src/internal_style.dart
index 8a7f2a6..53b4ade 100644
--- a/lib/src/internal_style.dart
+++ b/lib/src/internal_style.dart
@@ -14,6 +14,7 @@
   /// The default path separator for this style.
   ///
   /// On POSIX, this is `/`. On Windows, it's `\`.
+  @override
   String get separator;
 
   /// Returns whether [path] contains a separator.
@@ -41,6 +42,7 @@
 
   /// Gets the root prefix of [path] if path is absolute. If [path] is relative,
   /// returns `null`.
+  @override
   String getRoot(String path) {
     var length = rootLength(path);
     if (length > 0) return path.substring(0, length);
@@ -53,9 +55,11 @@
   bool isRootRelative(String path);
 
   /// Returns the path represented by [uri] in this style.
+  @override
   String pathFromUri(Uri uri);
 
   /// Returns the URI that represents the relative path made of [parts].
+  @override
   Uri relativePathToUri(String path) {
     var segments = context.split(path);
 
@@ -66,6 +70,7 @@
   }
 
   /// Returns the URI that represents [path], which is assumed to be absolute.
+  @override
   Uri absolutePathToUri(String path);
 
   /// Returns whether [codeUnit1] and [codeUnit2] are considered equivalent for
diff --git a/lib/src/parsed_path.dart b/lib/src/parsed_path.dart
index e4b7feb..42c9f2f 100644
--- a/lib/src/parsed_path.dart
+++ b/lib/src/parsed_path.dart
@@ -78,9 +78,9 @@
       this.style, this.root, this.isRootRelative, this.parts, this.separators);
 
   String get basename {
-    var copy = this.clone();
+    var copy = clone();
     copy.removeTrailingSeparators();
-    if (copy.parts.isEmpty) return root == null ? '' : root;
+    if (copy.parts.isEmpty) return root ?? '';
     return copy.parts.last;
   }
 
@@ -148,6 +148,7 @@
     removeTrailingSeparators();
   }
 
+  @override
   String toString() {
     var builder = StringBuffer();
     if (root != null) builder.write(root);
diff --git a/lib/src/path_exception.dart b/lib/src/path_exception.dart
index 55f5be3..12a8432 100644
--- a/lib/src/path_exception.dart
+++ b/lib/src/path_exception.dart
@@ -9,5 +9,6 @@
 
   PathException(this.message);
 
-  String toString() => "PathException: $message";
+  @override
+  String toString() => 'PathException: $message';
 }
diff --git a/lib/src/path_set.dart b/lib/src/path_set.dart
index 6a2afd1..03a7eeb 100644
--- a/lib/src/path_set.dart
+++ b/lib/src/path_set.dart
@@ -43,39 +43,57 @@
   // implement these, but we want to avoid adding dependencies from path because
   // it's so widely used that even brief version skew can be very painful.
 
+  @override
   Iterator<String> get iterator => _inner.iterator;
 
+  @override
   int get length => _inner.length;
 
+  @override
   bool add(String value) => _inner.add(value);
 
+  @override
   void addAll(Iterable<String> elements) => _inner.addAll(elements);
 
+  @override
   Set<T> cast<T>() => _inner.cast<T>();
 
+  @override
   void clear() => _inner.clear();
 
+  @override
   bool contains(Object other) => _inner.contains(other);
 
+  @override
   bool containsAll(Iterable<Object> other) => _inner.containsAll(other);
 
+  @override
   Set<String> difference(Set<Object> other) => _inner.difference(other);
 
+  @override
   Set<String> intersection(Set<Object> other) => _inner.intersection(other);
 
+  @override
   String lookup(Object element) => _inner.lookup(element);
 
+  @override
   bool remove(Object value) => _inner.remove(value);
 
+  @override
   void removeAll(Iterable<Object> elements) => _inner.removeAll(elements);
 
-  void removeWhere(bool test(String element)) => _inner.removeWhere(test);
+  @override
+  void removeWhere(bool Function(String) test) => _inner.removeWhere(test);
 
+  @override
   void retainAll(Iterable<Object> elements) => _inner.retainAll(elements);
 
-  void retainWhere(bool test(String element)) => _inner.retainWhere(test);
+  @override
+  void retainWhere(bool Function(String) test) => _inner.retainWhere(test);
 
+  @override
   Set<String> union(Set<String> other) => _inner.union(other);
 
+  @override
   Set<String> toSet() => _inner.toSet();
 }
diff --git a/lib/src/style.dart b/lib/src/style.dart
index 659c78c..409394c 100644
--- a/lib/src/style.dart
+++ b/lib/src/style.dart
@@ -52,35 +52,36 @@
   /// A [Context] that uses this style.
   Context get context => Context(style: this);
 
-  @Deprecated("Most Style members will be removed in path 2.0.")
+  @Deprecated('Most Style members will be removed in path 2.0.')
   String get separator;
 
-  @Deprecated("Most Style members will be removed in path 2.0.")
+  @Deprecated('Most Style members will be removed in path 2.0.')
   Pattern get separatorPattern;
 
-  @Deprecated("Most Style members will be removed in path 2.0.")
+  @Deprecated('Most Style members will be removed in path 2.0.')
   Pattern get needsSeparatorPattern;
 
-  @Deprecated("Most Style members will be removed in path 2.0.")
+  @Deprecated('Most Style members will be removed in path 2.0.')
   Pattern get rootPattern;
 
-  @Deprecated("Most Style members will be removed in path 2.0.")
+  @Deprecated('Most Style members will be removed in path 2.0.')
   Pattern get relativeRootPattern;
 
-  @Deprecated("Most style members will be removed in path 2.0.")
+  @Deprecated('Most style members will be removed in path 2.0.')
   String getRoot(String path);
 
-  @Deprecated("Most style members will be removed in path 2.0.")
+  @Deprecated('Most style members will be removed in path 2.0.')
   String getRelativeRoot(String path);
 
-  @Deprecated("Most style members will be removed in path 2.0.")
+  @Deprecated('Most style members will be removed in path 2.0.')
   String pathFromUri(Uri uri);
 
-  @Deprecated("Most style members will be removed in path 2.0.")
+  @Deprecated('Most style members will be removed in path 2.0.')
   Uri relativePathToUri(String path);
 
-  @Deprecated("Most style members will be removed in path 2.0.")
+  @Deprecated('Most style members will be removed in path 2.0.')
   Uri absolutePathToUri(String path);
 
+  @override
   String toString() => name;
 }
diff --git a/lib/src/style/posix.dart b/lib/src/style/posix.dart
index e673613..0b9803b 100644
--- a/lib/src/style/posix.dart
+++ b/lib/src/style/posix.dart
@@ -10,33 +10,46 @@
 class PosixStyle extends InternalStyle {
   PosixStyle();
 
+  @override
   final name = 'posix';
+  @override
   final separator = '/';
   final separators = const ['/'];
 
   // Deprecated properties.
 
+  @override
   final separatorPattern = RegExp(r'/');
+  @override
   final needsSeparatorPattern = RegExp(r'[^/]$');
+  @override
   final rootPattern = RegExp(r'^/');
+  @override
   final relativeRootPattern = null;
 
+  @override
   bool containsSeparator(String path) => path.contains('/');
 
+  @override
   bool isSeparator(int codeUnit) => codeUnit == chars.slash;
 
+  @override
   bool needsSeparator(String path) =>
       path.isNotEmpty && !isSeparator(path.codeUnitAt(path.length - 1));
 
+  @override
   int rootLength(String path, {bool withDrive = false}) {
     if (path.isNotEmpty && isSeparator(path.codeUnitAt(0))) return 1;
     return 0;
   }
 
+  @override
   bool isRootRelative(String path) => false;
 
+  @override
   String getRelativeRoot(String path) => null;
 
+  @override
   String pathFromUri(Uri uri) {
     if (uri.scheme == '' || uri.scheme == 'file') {
       return Uri.decodeComponent(uri.path);
@@ -44,17 +57,18 @@
     throw ArgumentError("Uri $uri must have scheme 'file:'.");
   }
 
+  @override
   Uri absolutePathToUri(String path) {
     var parsed = ParsedPath.parse(path, this);
     if (parsed.parts.isEmpty) {
       // If the path is a bare root (e.g. "/"), [components] will
       // currently be empty. We add two empty components so the URL constructor
       // produces "file:///", with a trailing slash.
-      parsed.parts.addAll(["", ""]);
+      parsed.parts.addAll(['', '']);
     } else if (parsed.hasTrailingSeparator) {
       // If the path has a trailing slash, add a single empty component so the
       // URI has a trailing slash as well.
-      parsed.parts.add("");
+      parsed.parts.add('');
     }
 
     return Uri(scheme: 'file', pathSegments: parsed.parts);
diff --git a/lib/src/style/url.dart b/lib/src/style/url.dart
index a189916..b9d6dff 100644
--- a/lib/src/style/url.dart
+++ b/lib/src/style/url.dart
@@ -10,21 +10,30 @@
 class UrlStyle extends InternalStyle {
   UrlStyle();
 
+  @override
   final name = 'url';
+  @override
   final separator = '/';
   final separators = const ['/'];
 
   // Deprecated properties.
 
+  @override
   final separatorPattern = RegExp(r'/');
-  final needsSeparatorPattern = RegExp(r"(^[a-zA-Z][-+.a-zA-Z\d]*://|[^/])$");
-  final rootPattern = RegExp(r"[a-zA-Z][-+.a-zA-Z\d]*://[^/]*");
-  final relativeRootPattern = RegExp(r"^/");
+  @override
+  final needsSeparatorPattern = RegExp(r'(^[a-zA-Z][-+.a-zA-Z\d]*://|[^/])$');
+  @override
+  final rootPattern = RegExp(r'[a-zA-Z][-+.a-zA-Z\d]*://[^/]*');
+  @override
+  final relativeRootPattern = RegExp(r'^/');
 
+  @override
   bool containsSeparator(String path) => path.contains('/');
 
+  @override
   bool isSeparator(int codeUnit) => codeUnit == chars.slash;
 
+  @override
   bool needsSeparator(String path) {
     if (path.isEmpty) return false;
 
@@ -33,9 +42,10 @@
 
     // A URI that's just "scheme://" needs an extra separator, despite ending
     // with "/".
-    return path.endsWith("://") && rootLength(path) == path.length;
+    return path.endsWith('://') && rootLength(path) == path.length;
   }
 
+  @override
   int rootLength(String path, {bool withDrive = false}) {
     if (path.isEmpty) return 0;
     if (isSeparator(path.codeUnitAt(0))) return 1;
@@ -64,13 +74,18 @@
     return 0;
   }
 
+  @override
   bool isRootRelative(String path) =>
       path.isNotEmpty && isSeparator(path.codeUnitAt(0));
 
+  @override
   String getRelativeRoot(String path) => isRootRelative(path) ? '/' : null;
 
+  @override
   String pathFromUri(Uri uri) => uri.toString();
 
+  @override
   Uri relativePathToUri(String path) => Uri.parse(path);
+  @override
   Uri absolutePathToUri(String path) => Uri.parse(path);
 }
diff --git a/lib/src/style/windows.dart b/lib/src/style/windows.dart
index 37c501f..287733a 100644
--- a/lib/src/style/windows.dart
+++ b/lib/src/style/windows.dart
@@ -15,27 +15,37 @@
 class WindowsStyle extends InternalStyle {
   WindowsStyle();
 
+  @override
   final name = 'windows';
+  @override
   final separator = '\\';
   final separators = const ['/', '\\'];
 
   // Deprecated properties.
 
+  @override
   final separatorPattern = RegExp(r'[/\\]');
+  @override
   final needsSeparatorPattern = RegExp(r'[^/\\]$');
+  @override
   final rootPattern = RegExp(r'^(\\\\[^\\]+\\[^\\/]+|[a-zA-Z]:[/\\])');
-  final relativeRootPattern = RegExp(r"^[/\\](?![/\\])");
+  @override
+  final relativeRootPattern = RegExp(r'^[/\\](?![/\\])');
 
+  @override
   bool containsSeparator(String path) => path.contains('/');
 
+  @override
   bool isSeparator(int codeUnit) =>
       codeUnit == chars.slash || codeUnit == chars.backslash;
 
+  @override
   bool needsSeparator(String path) {
     if (path.isEmpty) return false;
     return !isSeparator(path.codeUnitAt(path.length - 1));
   }
 
+  @override
   int rootLength(String path, {bool withDrive = false}) {
     if (path.isEmpty) return 0;
     if (path.codeUnitAt(0) == chars.slash) return 1;
@@ -62,14 +72,17 @@
     return 3;
   }
 
+  @override
   bool isRootRelative(String path) => rootLength(path) == 1;
 
+  @override
   String getRelativeRoot(String path) {
     var length = rootLength(path);
     if (length == 1) return path[0];
     return null;
   }
 
+  @override
   String pathFromUri(Uri uri) {
     if (uri.scheme != '' && uri.scheme != 'file') {
       throw ArgumentError("Uri $uri must have scheme 'file:'.");
@@ -81,15 +94,16 @@
       // replaceFirst removes the extra initial slash. Otherwise, leave the
       // slash to match IE's interpretation of "/foo" as a root-relative path.
       if (path.length >= 3 && path.startsWith('/') && isDriveLetter(path, 1)) {
-        path = path.replaceFirst("/", "");
+        path = path.replaceFirst('/', '');
       }
     } else {
       // Network paths look like "file://hostname/path/to/file".
       path = '\\\\${uri.host}$path';
     }
-    return Uri.decodeComponent(path.replaceAll("/", "\\"));
+    return Uri.decodeComponent(path.replaceAll('/', '\\'));
   }
 
+  @override
   Uri absolutePathToUri(String path) {
     var parsed = ParsedPath.parse(path, this);
     if (parsed.root.startsWith(r'\\')) {
@@ -103,7 +117,7 @@
       if (parsed.hasTrailingSeparator) {
         // If the path has a trailing slash, add a single empty component so the
         // URI has a trailing slash as well.
-        parsed.parts.add("");
+        parsed.parts.add('');
       }
 
       return Uri(
@@ -116,18 +130,19 @@
       // "file:///C:/", with a trailing slash. We also add an empty component if
       // the URL otherwise has a trailing slash.
       if (parsed.parts.isEmpty || parsed.hasTrailingSeparator) {
-        parsed.parts.add("");
+        parsed.parts.add('');
       }
 
       // Get rid of the trailing "\" in "C:\" because the URI constructor will
       // add a separator on its own.
       parsed.parts
-          .insert(0, parsed.root.replaceAll("/", "").replaceAll("\\", ""));
+          .insert(0, parsed.root.replaceAll('/', '').replaceAll('\\', ''));
 
       return Uri(scheme: 'file', pathSegments: parsed.parts);
     }
   }
 
+  @override
   bool codeUnitsEqual(int codeUnit1, int codeUnit2) {
     if (codeUnit1 == codeUnit2) return true;
 
@@ -144,6 +159,7 @@
     return upperCase1 >= chars.lowerA && upperCase1 <= chars.lowerZ;
   }
 
+  @override
   bool pathsEqual(String path1, String path2) {
     if (identical(path1, path2)) return true;
     if (path1.length != path2.length) return false;
@@ -155,6 +171,7 @@
     return true;
   }
 
+  @override
   int canonicalizeCodeUnit(int codeUnit) {
     if (codeUnit == chars.slash) return chars.backslash;
     if (codeUnit < chars.upperA) return codeUnit;
@@ -162,5 +179,6 @@
     return codeUnit | _asciiCaseBit;
   }
 
+  @override
   String canonicalizePart(String part) => part.toLowerCase();
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index 918c4fe..95451a9 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: path
-version: 1.6.4
+version: 1.6.5-dev
 
 description: >-
   A string-based path manipulation library. All of the path operations you know
diff --git a/test/browser_test.dart b/test/browser_test.dart
index 88aa286..1a6f623 100644
--- a/test/browser_test.dart
+++ b/test/browser_test.dart
@@ -9,7 +9,7 @@
 import 'package:test/test.dart';
 import 'package:path/path.dart' as path;
 
-main() {
+void main() {
   group('new Context()', () {
     test('uses the window location if root and style are omitted', () {
       var context = path.Context();
@@ -19,7 +19,7 @@
 
     test('uses "." if root is omitted', () {
       var context = path.Context(style: path.Style.platform);
-      expect(context.current, ".");
+      expect(context.current, '.');
     });
 
     test('uses the host platform if style is omitted', () {
diff --git a/test/io_test.dart b/test/io_test.dart
index c53d8dc..2a83c72 100644
--- a/test/io_test.dart
+++ b/test/io_test.dart
@@ -9,7 +9,7 @@
 import 'package:test/test.dart';
 import 'package:path/path.dart' as path;
 
-main() {
+void main() {
   group('new Context()', () {
     test('uses the current directory if root and style are omitted', () {
       var context = path.Context();
@@ -18,7 +18,7 @@
 
     test('uses "." if root is omitted', () {
       var context = path.Context(style: path.Style.platform);
-      expect(context.current, ".");
+      expect(context.current, '.');
     });
 
     test('uses the host platform if style is omitted', () {
@@ -43,7 +43,7 @@
     test('uses the previous working directory if deleted', () {
       var dir = io.Directory.current.path;
       try {
-        var tempPath = path.normalize(path.absolute("temp_cwd"));
+        var tempPath = path.normalize(path.absolute('temp_cwd'));
         var temp = io.Directory(tempPath);
         temp.createSync();
         io.Directory.current = temp;
diff --git a/test/path_map_test.dart b/test/path_map_test.dart
index 4e0c57e..c9170e1 100644
--- a/test/path_map_test.dart
+++ b/test/path_map_test.dart
@@ -7,25 +7,25 @@
 import 'package:path/path.dart';
 
 void main() {
-  group("considers equal", () {
-    test("two identical paths", () {
+  group('considers equal', () {
+    test('two identical paths', () {
       var map = PathMap<int>();
-      map[join("foo", "bar")] = 1;
-      map[join("foo", "bar")] = 2;
+      map[join('foo', 'bar')] = 1;
+      map[join('foo', 'bar')] = 2;
       expect(map, hasLength(1));
-      expect(map, containsPair(join("foo", "bar"), 2));
+      expect(map, containsPair(join('foo', 'bar'), 2));
     });
 
-    test("two logically equivalent paths", () {
+    test('two logically equivalent paths', () {
       var map = PathMap<int>();
-      map["foo"] = 1;
-      map[absolute("foo")] = 2;
+      map['foo'] = 1;
+      map[absolute('foo')] = 2;
       expect(map, hasLength(1));
-      expect(map, containsPair("foo", 2));
-      expect(map, containsPair(absolute("foo"), 2));
+      expect(map, containsPair('foo', 2));
+      expect(map, containsPair(absolute('foo'), 2));
     });
 
-    test("two nulls", () {
+    test('two nulls', () {
       var map = PathMap<int>();
       map[null] = 1;
       map[null] = 2;
@@ -34,47 +34,47 @@
     });
   });
 
-  group("considers unequal", () {
-    test("two distinct paths", () {
+  group('considers unequal', () {
+    test('two distinct paths', () {
       var map = PathMap<int>();
-      map["foo"] = 1;
-      map["bar"] = 2;
+      map['foo'] = 1;
+      map['bar'] = 2;
       expect(map, hasLength(2));
-      expect(map, containsPair("foo", 1));
-      expect(map, containsPair("bar", 2));
+      expect(map, containsPair('foo', 1));
+      expect(map, containsPair('bar', 2));
     });
 
-    test("a path and null", () {
+    test('a path and null', () {
       var map = PathMap<int>();
-      map["foo"] = 1;
+      map['foo'] = 1;
       map[null] = 2;
       expect(map, hasLength(2));
-      expect(map, containsPair("foo", 1));
+      expect(map, containsPair('foo', 1));
       expect(map, containsPair(null, 2));
     });
   });
 
-  test("uses the custom context", () {
+  test('uses the custom context', () {
     var map = PathMap<int>(context: windows);
-    map["FOO"] = 1;
-    map["foo"] = 2;
+    map['FOO'] = 1;
+    map['foo'] = 2;
     expect(map, hasLength(1));
-    expect(map, containsPair("fOo", 2));
+    expect(map, containsPair('fOo', 2));
   });
 
-  group(".of()", () {
+  group('.of()', () {
     test("copies the existing map's keys", () {
-      var map = PathMap.of({"foo": 1, "bar": 2});
+      var map = PathMap.of({'foo': 1, 'bar': 2});
       expect(map, hasLength(2));
-      expect(map, containsPair("foo", 1));
-      expect(map, containsPair("bar", 2));
+      expect(map, containsPair('foo', 1));
+      expect(map, containsPair('bar', 2));
     });
 
-    test("uses the second value in the case of duplicates", () {
-      var map = PathMap.of({"foo": 1, absolute("foo"): 2});
+    test('uses the second value in the case of duplicates', () {
+      var map = PathMap.of({'foo': 1, absolute('foo'): 2});
       expect(map, hasLength(1));
-      expect(map, containsPair("foo", 2));
-      expect(map, containsPair(absolute("foo"), 2));
+      expect(map, containsPair('foo', 2));
+      expect(map, containsPair(absolute('foo'), 2));
     });
   });
 }
diff --git a/test/path_set_test.dart b/test/path_set_test.dart
index f7b6bd0..cfbab9e 100644
--- a/test/path_set_test.dart
+++ b/test/path_set_test.dart
@@ -7,25 +7,25 @@
 import 'package:path/path.dart';
 
 void main() {
-  group("considers equal", () {
-    test("two identical paths", () {
+  group('considers equal', () {
+    test('two identical paths', () {
       var set = PathSet();
-      expect(set.add(join("foo", "bar")), isTrue);
-      expect(set.add(join("foo", "bar")), isFalse);
+      expect(set.add(join('foo', 'bar')), isTrue);
+      expect(set.add(join('foo', 'bar')), isFalse);
       expect(set, hasLength(1));
-      expect(set, contains(join("foo", "bar")));
+      expect(set, contains(join('foo', 'bar')));
     });
 
-    test("two logically equivalent paths", () {
+    test('two logically equivalent paths', () {
       var set = PathSet();
-      expect(set.add("foo"), isTrue);
-      expect(set.add(absolute("foo")), isFalse);
+      expect(set.add('foo'), isTrue);
+      expect(set.add(absolute('foo')), isFalse);
       expect(set, hasLength(1));
-      expect(set, contains("foo"));
-      expect(set, contains(absolute("foo")));
+      expect(set, contains('foo'));
+      expect(set, contains(absolute('foo')));
     });
 
-    test("two nulls", () {
+    test('two nulls', () {
       var set = PathSet();
       expect(set.add(null), isTrue);
       expect(set.add(null), isFalse);
@@ -34,48 +34,48 @@
     });
   });
 
-  group("considers unequal", () {
-    test("two distinct paths", () {
+  group('considers unequal', () {
+    test('two distinct paths', () {
       var set = PathSet();
-      expect(set.add("foo"), isTrue);
-      expect(set.add("bar"), isTrue);
+      expect(set.add('foo'), isTrue);
+      expect(set.add('bar'), isTrue);
       expect(set, hasLength(2));
-      expect(set, contains("foo"));
-      expect(set, contains("bar"));
+      expect(set, contains('foo'));
+      expect(set, contains('bar'));
     });
 
-    test("a path and null", () {
+    test('a path and null', () {
       var set = PathSet();
-      expect(set.add("foo"), isTrue);
+      expect(set.add('foo'), isTrue);
       expect(set.add(null), isTrue);
       expect(set, hasLength(2));
-      expect(set, contains("foo"));
+      expect(set, contains('foo'));
       expect(set, contains(null));
     });
   });
 
-  test("uses the custom context", () {
+  test('uses the custom context', () {
     var set = PathSet(context: windows);
-    expect(set.add("FOO"), isTrue);
-    expect(set.add("foo"), isFalse);
+    expect(set.add('FOO'), isTrue);
+    expect(set.add('foo'), isFalse);
     expect(set, hasLength(1));
-    expect(set, contains("fOo"));
+    expect(set, contains('fOo'));
   });
 
-  group(".of()", () {
+  group('.of()', () {
     test("copies the existing set's keys", () {
-      var set = PathSet.of(["foo", "bar"]);
+      var set = PathSet.of(['foo', 'bar']);
       expect(set, hasLength(2));
-      expect(set, contains("foo"));
-      expect(set, contains("bar"));
+      expect(set, contains('foo'));
+      expect(set, contains('bar'));
     });
 
-    test("uses the first value in the case of duplicates", () {
-      var set = PathSet.of(["foo", absolute("foo")]);
+    test('uses the first value in the case of duplicates', () {
+      var set = PathSet.of(['foo', absolute('foo')]);
       expect(set, hasLength(1));
-      expect(set, contains("foo"));
-      expect(set, contains(absolute("foo")));
-      expect(set.first, "foo");
+      expect(set, contains('foo'));
+      expect(set, contains(absolute('foo')));
+      expect(set.first, 'foo');
     });
   });
 }
diff --git a/test/path_test.dart b/test/path_test.dart
index 1681159..ce7efdb 100644
--- a/test/path_test.dart
+++ b/test/path_test.dart
@@ -5,7 +5,7 @@
 import 'package:test/test.dart';
 import 'package:path/path.dart' as path;
 
-main() {
+void main() {
   group('path.Style', () {
     test('name', () {
       expect(path.Style.posix.name, 'posix');
@@ -39,16 +39,16 @@
 
   test('posix is a default Context for the POSIX style', () {
     expect(path.posix.style, path.Style.posix);
-    expect(path.posix.current, ".");
+    expect(path.posix.current, '.');
   });
 
   test('windows is a default Context for the Windows style', () {
     expect(path.windows.style, path.Style.windows);
-    expect(path.windows.current, ".");
+    expect(path.windows.current, '.');
   });
 
   test('url is a default Context for the URL style', () {
     expect(path.url.style, path.Style.url);
-    expect(path.url.current, ".");
+    expect(path.url.current, '.');
   });
 }
diff --git a/test/posix_test.dart b/test/posix_test.dart
index 6f7e08a..b08d584 100644
--- a/test/posix_test.dart
+++ b/test/posix_test.dart
@@ -7,7 +7,7 @@
 
 import 'utils.dart';
 
-main() {
+void main() {
   var context = path.Context(style: path.Style.posix, current: '/root/path');
 
   test('separator', () {
diff --git a/test/relative_test.dart b/test/relative_test.dart
index 8da7eac..140b9e2 100644
--- a/test/relative_test.dart
+++ b/test/relative_test.dart
@@ -4,13 +4,13 @@
 //
 // Test "relative" on all styles of path.Context, on all platforms.
 
-import "package:test/test.dart";
-import "package:path/path.dart" as path;
+import 'package:test/test.dart';
+import 'package:path/path.dart' as path;
 
-import "utils.dart";
+import 'utils.dart';
 
 void main() {
-  test("test relative", () {
+  test('test relative', () {
     relativeTest(path.Context(style: path.Style.posix, current: '.'), '/');
     relativeTest(path.Context(style: path.Style.posix, current: '/'), '/');
     relativeTest(
diff --git a/test/url_test.dart b/test/url_test.dart
index c6fcd33..6af34e6 100644
--- a/test/url_test.dart
+++ b/test/url_test.dart
@@ -7,7 +7,7 @@
 
 import 'utils.dart';
 
-main() {
+void main() {
   var context = path.Context(
       style: path.Style.url, current: 'http://dartlang.org/root/path');
 
diff --git a/test/utils.dart b/test/utils.dart
index 09b8165..68e3c85 100644
--- a/test/utils.dart
+++ b/test/utils.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:test/test.dart";
-import "package:path/path.dart" as p;
+import 'package:test/test.dart';
+import 'package:path/path.dart' as p;
 
 /// A matcher for a closure that throws a [path.PathException].
 final throwsPathException = throwsA(TypeMatcher<p.PathException>());
diff --git a/test/windows_test.dart b/test/windows_test.dart
index 47f7ab0..096fa6f 100644
--- a/test/windows_test.dart
+++ b/test/windows_test.dart
@@ -7,7 +7,7 @@
 
 import 'utils.dart';
 
-main() {
+void main() {
   var context =
       path.Context(style: path.Style.windows, current: r'C:\root\path');
 
