diff --git a/.travis.yml b/.travis.yml
index 9c21886..8d6eeea 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,13 +1,12 @@
 language: dart
 
 dart:
-  - stable
+  - 2.0.0
   - dev
-  - 1.24.3
 
 dart_task:
   - test:
-  - dartanalyzer
+  - dartanalyzer: --fatal-infos --fatal-warnings .
 
 matrix:
   include:
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..ee63c14
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,98 @@
+include: package:pedantic/analysis_options.yaml
+analyzer:
+  strong-mode:
+    implicit-casts: false
+  errors:
+    dead_code: error
+    override_on_non_overriding_method: error
+    unused_element: error
+    unused_import: error
+    unused_local_variable: error
+linter:
+  rules:
+    - always_declare_return_types
+    - annotate_overrides
+    - avoid_bool_literals_in_conditional_expressions
+    - avoid_classes_with_only_static_members
+    - avoid_empty_else
+    - avoid_function_literals_in_foreach_calls
+    - avoid_init_to_null
+    - avoid_null_checks_in_equality_operators
+    - avoid_relative_lib_imports
+    - avoid_renaming_method_parameters
+    - avoid_return_types_on_setters
+    - avoid_returning_null
+    - avoid_returning_null_for_future
+    - avoid_returning_null_for_void
+    - avoid_returning_this
+    - avoid_shadowing_type_parameters
+    - avoid_single_cascade_in_expression_statements
+    - avoid_types_as_parameter_names
+    - avoid_unused_constructor_parameters
+    - await_only_futures
+    - camel_case_types
+    - cancel_subscriptions
+    - cascade_invocations
+    - comment_references
+    - constant_identifier_names
+    - control_flow_in_finally
+    - directives_ordering
+    - empty_catches
+    - empty_constructor_bodies
+    - empty_statements
+    - file_names
+    - hash_and_equals
+    - implementation_imports
+    - invariant_booleans
+    - iterable_contains_unrelated_type
+    - join_return_with_assignment
+    - library_names
+    - library_prefixes
+    - list_remove_unrelated_type
+    - literal_only_boolean_expressions
+    - no_adjacent_strings_in_list
+    - no_duplicate_case_values
+    - non_constant_identifier_names
+    - null_closures
+    - omit_local_variable_types
+    - only_throw_errors
+    - overridden_fields
+    - package_api_docs
+    - package_names
+    - package_prefixed_library_names
+    - prefer_adjacent_string_concatenation
+    - prefer_collection_literals
+    - prefer_conditional_assignment
+    - prefer_contains
+    - prefer_equal_for_default_values
+    - prefer_final_fields
+    - prefer_final_locals
+    - prefer_generic_function_type_aliases
+    - prefer_initializing_formals
+    - prefer_interpolation_to_compose_strings
+    - prefer_is_empty
+    - prefer_is_not_empty
+    - prefer_null_aware_operators
+    - prefer_single_quotes
+    - prefer_typing_uninitialized_variables
+    - recursive_getters
+    - slash_for_doc_comments
+    - test_types_in_equals
+    - throw_in_finally
+    - type_init_formals
+    - unawaited_futures
+    - unnecessary_await_in_return
+    - unnecessary_brace_in_string_interps
+    - unnecessary_const
+    - unnecessary_getters_setters
+    - unnecessary_lambdas
+    - unnecessary_new
+    - unnecessary_null_aware_assignments
+    - unnecessary_parenthesis
+    - unnecessary_statements
+    - unnecessary_this
+    - unrelated_type_equality_checks
+    - use_function_type_syntax_for_parameters
+    - use_rethrow_when_possible
+    - valid_regexps
+    - void_checks
diff --git a/lib/tuple.dart b/lib/tuple.dart
index 21d2578..82edd2b 100644
--- a/lib/tuple.dart
+++ b/lib/tuple.dart
@@ -38,20 +38,20 @@
   /// Create a new tuple value with the specified list [items].
   factory Tuple2.fromList(List items) {
     if (items.length != 2) {
-      throw new ArgumentError('items must have length 2');
+      throw ArgumentError('items must have length 2');
     }
 
-    return new Tuple2<T1, T2>(items[0] as T1, items[1] as T2);
+    return Tuple2<T1, T2>(items[0] as T1, items[1] as T2);
   }
 
   /// Returns a tuple with the first item set to the specified value.
   Tuple2<T1, T2> withItem1(T1 v) {
-    return new Tuple2<T1, T2>(v, item2);
+    return Tuple2<T1, T2>(v, item2);
   }
 
   /// Returns a tuple with the second item set to the specified value.
   Tuple2<T1, T2> withItem2(T2 v) {
-    return new Tuple2<T1, T2>(item1, v);
+    return Tuple2<T1, T2>(item1, v);
   }
 
   /// Creates a [List] containing the items of this [Tuple2].
@@ -59,13 +59,14 @@
   /// The elements are in item order. The list is variable-length
   /// if [growable] is true.
   List toList({bool growable = false}) =>
-      new List.from([item1, item2], growable: growable);
+      List.from([item1, item2], growable: growable);
 
   @override
   String toString() => '[$item1, $item2]';
 
   @override
-  bool operator ==(o) => o is Tuple2 && o.item1 == item1 && o.item2 == item2;
+  bool operator ==(other) =>
+      other is Tuple2 && other.item1 == item1 && other.item2 == item2;
 
   @override
   int get hashCode => hash2(item1.hashCode, item2.hashCode);
@@ -88,26 +89,25 @@
   /// Create a new tuple value with the specified list [items].
   factory Tuple3.fromList(List items) {
     if (items.length != 3) {
-      throw new ArgumentError('items must have length 3');
+      throw ArgumentError('items must have length 3');
     }
 
-    return new Tuple3<T1, T2, T3>(
-        items[0] as T1, items[1] as T2, items[2] as T3);
+    return Tuple3<T1, T2, T3>(items[0] as T1, items[1] as T2, items[2] as T3);
   }
 
   /// Returns a tuple with the first item set to the specified value.
   Tuple3<T1, T2, T3> withItem1(T1 v) {
-    return new Tuple3<T1, T2, T3>(v, item2, item3);
+    return Tuple3<T1, T2, T3>(v, item2, item3);
   }
 
   /// Returns a tuple with the second item set to the specified value.
   Tuple3<T1, T2, T3> withItem2(T2 v) {
-    return new Tuple3<T1, T2, T3>(item1, v, item3);
+    return Tuple3<T1, T2, T3>(item1, v, item3);
   }
 
   /// Returns a tuple with the third item set to the specified value.
   Tuple3<T1, T2, T3> withItem3(T3 v) {
-    return new Tuple3<T1, T2, T3>(item1, item2, v);
+    return Tuple3<T1, T2, T3>(item1, item2, v);
   }
 
   /// Creates a [List] containing the items of this [Tuple3].
@@ -115,14 +115,17 @@
   /// The elements are in item order. The list is variable-length
   /// if [growable] is true.
   List toList({bool growable = false}) =>
-      new List.from([item1, item2, item3], growable: growable);
+      List.from([item1, item2, item3], growable: growable);
 
   @override
   String toString() => '[$item1, $item2, $item3]';
 
   @override
-  bool operator ==(o) =>
-      o is Tuple3 && o.item1 == item1 && o.item2 == item2 && o.item3 == item3;
+  bool operator ==(other) =>
+      other is Tuple3 &&
+      other.item1 == item1 &&
+      other.item2 == item2 &&
+      other.item3 == item3;
 
   @override
   int get hashCode => hash3(item1.hashCode, item2.hashCode, item3.hashCode);
@@ -148,31 +151,31 @@
   /// Create a new tuple value with the specified list [items].
   factory Tuple4.fromList(List items) {
     if (items.length != 4) {
-      throw new ArgumentError('items must have length 4');
+      throw ArgumentError('items must have length 4');
     }
 
-    return new Tuple4<T1, T2, T3, T4>(
+    return Tuple4<T1, T2, T3, T4>(
         items[0] as T1, items[1] as T2, items[2] as T3, items[3] as T4);
   }
 
   /// Returns a tuple with the first item set to the specified value.
   Tuple4<T1, T2, T3, T4> withItem1(T1 v) {
-    return new Tuple4<T1, T2, T3, T4>(v, item2, item3, item4);
+    return Tuple4<T1, T2, T3, T4>(v, item2, item3, item4);
   }
 
   /// Returns a tuple with the second item set to the specified value.
   Tuple4<T1, T2, T3, T4> withItem2(T2 v) {
-    return new Tuple4<T1, T2, T3, T4>(item1, v, item3, item4);
+    return Tuple4<T1, T2, T3, T4>(item1, v, item3, item4);
   }
 
   /// Returns a tuple with the third item set to the specified value.
   Tuple4<T1, T2, T3, T4> withItem3(T3 v) {
-    return new Tuple4<T1, T2, T3, T4>(item1, item2, v, item4);
+    return Tuple4<T1, T2, T3, T4>(item1, item2, v, item4);
   }
 
   /// Returns a tuple with the fourth item set to the specified value.
   Tuple4<T1, T2, T3, T4> withItem4(T4 v) {
-    return new Tuple4<T1, T2, T3, T4>(item1, item2, item3, v);
+    return Tuple4<T1, T2, T3, T4>(item1, item2, item3, v);
   }
 
   /// Creates a [List] containing the items of this [Tuple4].
@@ -180,18 +183,18 @@
   /// The elements are in item order. The list is variable-length
   /// if [growable] is true.
   List toList({bool growable = false}) =>
-      new List.from([item1, item2, item3, item4], growable: growable);
+      List.from([item1, item2, item3, item4], growable: growable);
 
   @override
   String toString() => '[$item1, $item2, $item3, $item4]';
 
   @override
-  bool operator ==(o) =>
-      o is Tuple4 &&
-      o.item1 == item1 &&
-      o.item2 == item2 &&
-      o.item3 == item3 &&
-      o.item4 == item4;
+  bool operator ==(other) =>
+      other is Tuple4 &&
+      other.item1 == item1 &&
+      other.item2 == item2 &&
+      other.item3 == item3 &&
+      other.item4 == item4;
 
   @override
   int get hashCode =>
@@ -221,36 +224,36 @@
   /// Create a new tuple value with the specified list [items].
   factory Tuple5.fromList(List items) {
     if (items.length != 5) {
-      throw new ArgumentError('items must have length 5');
+      throw ArgumentError('items must have length 5');
     }
 
-    return new Tuple5<T1, T2, T3, T4, T5>(items[0] as T1, items[1] as T2,
+    return Tuple5<T1, T2, T3, T4, T5>(items[0] as T1, items[1] as T2,
         items[2] as T3, items[3] as T4, items[4] as T5);
   }
 
   /// Returns a tuple with the first item set to the specified value.
   Tuple5<T1, T2, T3, T4, T5> withItem1(T1 v) {
-    return new Tuple5<T1, T2, T3, T4, T5>(v, item2, item3, item4, item5);
+    return Tuple5<T1, T2, T3, T4, T5>(v, item2, item3, item4, item5);
   }
 
   /// Returns a tuple with the second item set to the specified value.
   Tuple5<T1, T2, T3, T4, T5> withItem2(T2 v) {
-    return new Tuple5<T1, T2, T3, T4, T5>(item1, v, item3, item4, item5);
+    return Tuple5<T1, T2, T3, T4, T5>(item1, v, item3, item4, item5);
   }
 
   /// Returns a tuple with the third item set to the specified value.
   Tuple5<T1, T2, T3, T4, T5> withItem3(T3 v) {
-    return new Tuple5<T1, T2, T3, T4, T5>(item1, item2, v, item4, item5);
+    return Tuple5<T1, T2, T3, T4, T5>(item1, item2, v, item4, item5);
   }
 
   /// Returns a tuple with the fourth item set to the specified value.
   Tuple5<T1, T2, T3, T4, T5> withItem4(T4 v) {
-    return new Tuple5<T1, T2, T3, T4, T5>(item1, item2, item3, v, item5);
+    return Tuple5<T1, T2, T3, T4, T5>(item1, item2, item3, v, item5);
   }
 
   /// Returns a tuple with the fifth item set to the specified value.
   Tuple5<T1, T2, T3, T4, T5> withItem5(T5 v) {
-    return new Tuple5<T1, T2, T3, T4, T5>(item1, item2, item3, item4, v);
+    return Tuple5<T1, T2, T3, T4, T5>(item1, item2, item3, item4, v);
   }
 
   /// Creates a [List] containing the items of this [Tuple5].
@@ -258,19 +261,19 @@
   /// The elements are in item order. The list is variable-length
   /// if [growable] is true.
   List toList({bool growable = false}) =>
-      new List.from([item1, item2, item3, item4, item5], growable: growable);
+      List.from([item1, item2, item3, item4, item5], growable: growable);
 
   @override
   String toString() => '[$item1, $item2, $item3, $item4, $item5]';
 
   @override
-  bool operator ==(o) =>
-      o is Tuple5 &&
-      o.item1 == item1 &&
-      o.item2 == item2 &&
-      o.item3 == item3 &&
-      o.item4 == item4 &&
-      o.item5 == item5;
+  bool operator ==(other) =>
+      other is Tuple5 &&
+      other.item1 == item1 &&
+      other.item2 == item2 &&
+      other.item3 == item3 &&
+      other.item4 == item4 &&
+      other.item5 == item5;
 
   @override
   int get hashCode => hashObjects([
@@ -309,47 +312,41 @@
   /// Create a new tuple value with the specified list [items].
   factory Tuple6.fromList(List items) {
     if (items.length != 6) {
-      throw new ArgumentError('items must have length 6');
+      throw ArgumentError('items must have length 6');
     }
 
-    return new Tuple6<T1, T2, T3, T4, T5, T6>(items[0] as T1, items[1] as T2,
+    return Tuple6<T1, T2, T3, T4, T5, T6>(items[0] as T1, items[1] as T2,
         items[2] as T3, items[3] as T4, items[4] as T5, items[5] as T6);
   }
 
   /// Returns a tuple with the first item set to the specified value.
   Tuple6<T1, T2, T3, T4, T5, T6> withItem1(T1 v) {
-    return new Tuple6<T1, T2, T3, T4, T5, T6>(
-        v, item2, item3, item4, item5, item6);
+    return Tuple6<T1, T2, T3, T4, T5, T6>(v, item2, item3, item4, item5, item6);
   }
 
   /// Returns a tuple with the second item set to the specified value.
   Tuple6<T1, T2, T3, T4, T5, T6> withItem2(T2 v) {
-    return new Tuple6<T1, T2, T3, T4, T5, T6>(
-        item1, v, item3, item4, item5, item6);
+    return Tuple6<T1, T2, T3, T4, T5, T6>(item1, v, item3, item4, item5, item6);
   }
 
   /// Returns a tuple with the third item set to the specified value.
   Tuple6<T1, T2, T3, T4, T5, T6> withItem3(T3 v) {
-    return new Tuple6<T1, T2, T3, T4, T5, T6>(
-        item1, item2, v, item4, item5, item6);
+    return Tuple6<T1, T2, T3, T4, T5, T6>(item1, item2, v, item4, item5, item6);
   }
 
   /// Returns a tuple with the fourth item set to the specified value.
   Tuple6<T1, T2, T3, T4, T5, T6> withItem4(T4 v) {
-    return new Tuple6<T1, T2, T3, T4, T5, T6>(
-        item1, item2, item3, v, item5, item6);
+    return Tuple6<T1, T2, T3, T4, T5, T6>(item1, item2, item3, v, item5, item6);
   }
 
   /// Returns a tuple with the fifth item set to the specified value.
   Tuple6<T1, T2, T3, T4, T5, T6> withItem5(T5 v) {
-    return new Tuple6<T1, T2, T3, T4, T5, T6>(
-        item1, item2, item3, item4, v, item6);
+    return Tuple6<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, v, item6);
   }
 
   /// Returns a tuple with the sixth item set to the specified value.
   Tuple6<T1, T2, T3, T4, T5, T6> withItem6(T6 v) {
-    return new Tuple6<T1, T2, T3, T4, T5, T6>(
-        item1, item2, item3, item4, item5, v);
+    return Tuple6<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, v);
   }
 
   /// Creates a [List] containing the items of this [Tuple5].
@@ -357,21 +354,20 @@
   /// The elements are in item order. The list is variable-length
   /// if [growable] is true.
   List toList({bool growable = false}) =>
-      new List.from([item1, item2, item3, item4, item5, item6],
-          growable: growable);
+      List.from([item1, item2, item3, item4, item5, item6], growable: growable);
 
   @override
   String toString() => '[$item1, $item2, $item3, $item4, $item5, $item6]';
 
   @override
-  bool operator ==(o) =>
-      o is Tuple6 &&
-      o.item1 == item1 &&
-      o.item2 == item2 &&
-      o.item3 == item3 &&
-      o.item4 == item4 &&
-      o.item5 == item5 &&
-      o.item6 == item6;
+  bool operator ==(other) =>
+      other is Tuple6 &&
+      other.item1 == item1 &&
+      other.item2 == item2 &&
+      other.item3 == item3 &&
+      other.item4 == item4 &&
+      other.item5 == item5 &&
+      other.item6 == item6;
 
   @override
   int get hashCode => hashObjects([
@@ -414,10 +410,10 @@
   /// Create a new tuple value with the specified list [items].
   factory Tuple7.fromList(List items) {
     if (items.length != 7) {
-      throw new ArgumentError('items must have length 7');
+      throw ArgumentError('items must have length 7');
     }
 
-    return new Tuple7<T1, T2, T3, T4, T5, T6, T7>(
+    return Tuple7<T1, T2, T3, T4, T5, T6, T7>(
         items[0] as T1,
         items[1] as T2,
         items[2] as T3,
@@ -429,43 +425,43 @@
 
   /// Returns a tuple with the first item set to the specified value.
   Tuple7<T1, T2, T3, T4, T5, T6, T7> withItem1(T1 v) {
-    return new Tuple7<T1, T2, T3, T4, T5, T6, T7>(
+    return Tuple7<T1, T2, T3, T4, T5, T6, T7>(
         v, item2, item3, item4, item5, item6, item7);
   }
 
   /// Returns a tuple with the second item set to the specified value.
   Tuple7<T1, T2, T3, T4, T5, T6, T7> withItem2(T2 v) {
-    return new Tuple7<T1, T2, T3, T4, T5, T6, T7>(
+    return Tuple7<T1, T2, T3, T4, T5, T6, T7>(
         item1, v, item3, item4, item5, item6, item7);
   }
 
   /// Returns a tuple with the third item set to the specified value.
   Tuple7<T1, T2, T3, T4, T5, T6, T7> withItem3(T3 v) {
-    return new Tuple7<T1, T2, T3, T4, T5, T6, T7>(
+    return Tuple7<T1, T2, T3, T4, T5, T6, T7>(
         item1, item2, v, item4, item5, item6, item7);
   }
 
   /// Returns a tuple with the fourth item set to the specified value.
   Tuple7<T1, T2, T3, T4, T5, T6, T7> withItem4(T4 v) {
-    return new Tuple7<T1, T2, T3, T4, T5, T6, T7>(
+    return Tuple7<T1, T2, T3, T4, T5, T6, T7>(
         item1, item2, item3, v, item5, item6, item7);
   }
 
   /// Returns a tuple with the fifth item set to the specified value.
   Tuple7<T1, T2, T3, T4, T5, T6, T7> withItem5(T5 v) {
-    return new Tuple7<T1, T2, T3, T4, T5, T6, T7>(
+    return Tuple7<T1, T2, T3, T4, T5, T6, T7>(
         item1, item2, item3, item4, v, item6, item7);
   }
 
   /// Returns a tuple with the sixth item set to the specified value.
   Tuple7<T1, T2, T3, T4, T5, T6, T7> withItem6(T6 v) {
-    return new Tuple7<T1, T2, T3, T4, T5, T6, T7>(
+    return Tuple7<T1, T2, T3, T4, T5, T6, T7>(
         item1, item2, item3, item4, item5, v, item7);
   }
 
   /// Returns a tuple with the seventh item set to the specified value.
   Tuple7<T1, T2, T3, T4, T5, T6, T7> withItem7(T7 v) {
-    return new Tuple7<T1, T2, T3, T4, T5, T6, T7>(
+    return Tuple7<T1, T2, T3, T4, T5, T6, T7>(
         item1, item2, item3, item4, item5, item6, v);
   }
 
@@ -473,8 +469,8 @@
   ///
   /// The elements are in item order. The list is variable-length
   /// if [growable] is true.
-  List toList({bool growable: false}) =>
-      new List.from([item1, item2, item3, item4, item5, item6, item7],
+  List toList({bool growable = false}) =>
+      List.from([item1, item2, item3, item4, item5, item6, item7],
           growable: growable);
 
   @override
@@ -482,15 +478,15 @@
       '[$item1, $item2, $item3, $item4, $item5, $item6, $item7]';
 
   @override
-  bool operator ==(o) =>
-      o is Tuple7 &&
-      o.item1 == item1 &&
-      o.item2 == item2 &&
-      o.item3 == item3 &&
-      o.item4 == item4 &&
-      o.item5 == item5 &&
-      o.item5 == item6 &&
-      o.item6 == item7;
+  bool operator ==(other) =>
+      other is Tuple7 &&
+      other.item1 == item1 &&
+      other.item2 == item2 &&
+      other.item3 == item3 &&
+      other.item4 == item4 &&
+      other.item5 == item5 &&
+      other.item5 == item6 &&
+      other.item6 == item7;
 
   @override
   int get hashCode => hashObjects([
diff --git a/pubspec.yaml b/pubspec.yaml
index 5113a76..4a58383 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -15,4 +15,5 @@
   quiver: '>=0.22.0 <3.0.0'
 
 dev_dependencies:
+  pedantic: ^1.2.0
   test: '>=1.0.0 <2.0.0'
diff --git a/test/all_tests.dart b/test/all_tests.dart
deleted file mode 100644
index 6cf9e29..0000000
--- a/test/all_tests.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2015, the tuple project authors. Please see the AUTHORS
-// file for details. All rights reserved. Use of this source code is governed
-// by a BSD-style license that can be found in the LICENSE file.
-
-library tuple.test;
-
-import 'tuple_test.dart' as tuple_test;
-
-main() {
-  tuple_test.main();
-}
diff --git a/test/tuple_test.dart b/test/tuple_test.dart
index 6381e57..4f9a7ff 100644
--- a/test/tuple_test.dart
+++ b/test/tuple_test.dart
@@ -2,67 +2,61 @@
 // file for details. All rights reserved. Use of this source code is governed
 // by a BSD-style license that can be found in the LICENSE file.
 
-library tuple.test;
-
 import 'package:test/test.dart';
 import 'package:tuple/tuple.dart';
 
-main() {
-  group("Tuple tests", () {
-    final t = new Tuple2<int, bool>(1, true);
+void main() {
+  final t = Tuple2<int, bool>(1, true);
 
-    test('items', () {
-      expect(t.item1, equals(1));
-      expect(t.item2, equals(true));
-    });
+  test('items', () {
+    expect(t.item1, equals(1));
+    expect(t.item2, equals(true));
+  });
 
-    test('withItems', () {
-      expect(t.withItem1(2), equals(new Tuple2<int, bool>(2, true)));
-      expect(t.withItem2(false), equals(new Tuple2<int, bool>(1, false)));
-    });
+  test('withItems', () {
+    expect(t.withItem1(2), equals(Tuple2<int, bool>(2, true)));
+    expect(t.withItem2(false), equals(Tuple2<int, bool>(1, false)));
+  });
 
-    test('create a tuple from a list of items', () {
-      final t1 = new Tuple2.fromList([1, true]);
-      expect(t1.item1, equals(1));
-      expect(t1.item2, equals(true));
+  test('create a tuple from a list of items', () {
+    final t1 = Tuple2.fromList([1, true]);
+    expect(t1.item1, equals(1));
+    expect(t1.item2, equals(true));
 
-      expect(() => new Tuple2.fromList([1]),
-          throwsA(new TypeMatcher<ArgumentError>()));
-      expect(() => new Tuple2.fromList([1, true, 'a']),
-          throwsA(new TypeMatcher<ArgumentError>()));
-    });
+    expect(() => Tuple2.fromList([1]), throwsA(TypeMatcher<ArgumentError>()));
+    expect(() => Tuple2.fromList([1, true, 'a']),
+        throwsA(TypeMatcher<ArgumentError>()));
+  });
 
-    test('equality', () {
-      final otherT = new Tuple2<int, bool>(1, true);
-      expect(t, equals(otherT));
-    });
+  test('equality', () {
+    final otherT = Tuple2<int, bool>(1, true);
+    expect(t, equals(otherT));
+  });
 
-    test('nested equality', () {
-      final t1 = new Tuple2<Tuple2<int, String>, bool>(
-          new Tuple2<int, String>(3, 'a'), false);
-      final t2 = new Tuple2<Tuple2<int, String>, bool>(
-          new Tuple2<int, String>(3, 'a'), false);
-      expect(t1, equals(t2));
-    });
+  test('nested equality', () {
+    final t1 =
+        Tuple2<Tuple2<int, String>, bool>(Tuple2<int, String>(3, 'a'), false);
+    final t2 =
+        Tuple2<Tuple2<int, String>, bool>(Tuple2<int, String>(3, 'a'), false);
+    expect(t1, equals(t2));
+  });
 
-    test('can be used as keys in maps', () {
-      final map = {t: 'a'};
-      final key = new Tuple2<int, bool>(1, true);
-      expect(map[key], equals('a'));
-    });
+  test('can be used as keys in maps', () {
+    final map = {t: 'a'};
+    final key = Tuple2<int, bool>(1, true);
+    expect(map[key], equals('a'));
+  });
 
-    test('toList() should return a listing containing the items of the tuple',
-        () {
-      expect(t.toList(), orderedEquals([1, true]));
-    });
+  test('toList() should return a listing containing the items of the tuple',
+      () {
+    expect(t.toList(), orderedEquals([1, true]));
+  });
 
-    test('toList() should return a fixed list by default', () {
-      expect(() => t.toList().add(3),
-          throwsA(new TypeMatcher<UnsupportedError>()));
-    });
+  test('toList() should return a fixed list by default', () {
+    expect(() => t.toList().add(3), throwsA(TypeMatcher<UnsupportedError>()));
+  });
 
-    test('toList(growable: true) should return a growable list', () {
-      expect(t.toList(growable: true)..add('a'), orderedEquals([1, true, 'a']));
-    });
+  test('toList(growable: true) should return a growable list', () {
+    expect(t.toList(growable: true)..add('a'), orderedEquals([1, true, 'a']));
   });
 }
