Remove tear-off mocking in refresh_test (#15869)

* Remove tear-off mocking in refresh_test

* Comments

* Analyzer fix

* Final final final final mushroom mushroom!

* Fix for Dart 1 AND Dart 2 semantics; anonymous closure over tear-off

* Final final
diff --git a/packages/flutter/test/cupertino/refresh_test.dart b/packages/flutter/test/cupertino/refresh_test.dart
index de41431..af07d23 100644
--- a/packages/flutter/test/cupertino/refresh_test.dart
+++ b/packages/flutter/test/cupertino/refresh_test.dart
@@ -19,48 +19,46 @@
   /// returns.
   Widget refreshIndicator;
 
+  /// These two Functions are required to avoid tearing off of the MockHelper object,
+  /// which is not supported when using Dart 2 runtime semantics.
+  final Function builder = (BuildContext context, RefreshIndicatorMode refreshState,
+          double pulledExtent,
+          double refreshTriggerPullDistance,
+          double refreshIndicatorExtent) =>
+      mockHelper.builder(context, refreshState, pulledExtent, refreshTriggerPullDistance,
+          refreshIndicatorExtent);
+
+  final Function onRefresh = () => mockHelper.refreshTask();
+
   setUp(() {
     mockHelper = new MockHelper();
     refreshCompleter = new Completer<void>.sync();
     refreshIndicator = new Container();
 
-    when(mockHelper.builder).thenReturn(
-      (
-        BuildContext context,
-        RefreshIndicatorMode refreshState,
-        double pulledExtent,
-        double refreshTriggerPullDistance,
-        double refreshIndicatorExtent,
-      ) {
-        if (refreshState == RefreshIndicatorMode.inactive) {
-          throw new TestFailure(
-            'RefreshControlIndicatorBuilder should never be called with the '
-            "inactive state because there's nothing to build in that case"
-          );
-        }
-        if (pulledExtent < 0.0) {
-          throw new TestFailure('The pulledExtent should never be less than 0.0');
-        }
-        if (refreshTriggerPullDistance < 0.0) {
-          throw new TestFailure('The refreshTriggerPullDistance should never be less than 0.0');
-        }
-        if (refreshIndicatorExtent < 0.0) {
-          throw new TestFailure('The refreshIndicatorExtent should never be less than 0.0');
-        }
-        // This closure is now shadowing the mock implementation which logs.
-        // Pass the call to the mock to log.
-        mockHelper.builder(
-          context,
-          refreshState,
-          pulledExtent,
-          refreshTriggerPullDistance,
-          refreshIndicatorExtent,
+    when(mockHelper.builder(
+            typed(any), typed(any), typed(any), typed(any), typed(any)))
+        .thenAnswer((Invocation i) {
+      final RefreshIndicatorMode refreshState = i.positionalArguments[1];
+      final double pulledExtent = i.positionalArguments[2];
+      final double refreshTriggerPullDistance = i.positionalArguments[3];
+      final double refreshIndicatorExtent = i.positionalArguments[4];
+      if (refreshState == RefreshIndicatorMode.inactive) {
+        throw new TestFailure(
+          'RefreshControlIndicatorBuilder should never be called with the '
+          "inactive state because there's nothing to build in that case"
         );
-        return refreshIndicator;
-      },
-    );
-    // Make the function reference itself concrete.
-    when(mockHelper.refreshTask).thenReturn(() => mockHelper.refreshTask());
+      }
+      if (pulledExtent < 0.0) {
+        throw new TestFailure('The pulledExtent should never be less than 0.0');
+      }
+      if (refreshTriggerPullDistance < 0.0) {
+        throw new TestFailure('The refreshTriggerPullDistance should never be less than 0.0');
+      }
+      if (refreshIndicatorExtent < 0.0) {
+        throw new TestFailure('The refreshIndicatorExtent should never be less than 0.0');
+      }
+      return refreshIndicator;
+    });
     when(mockHelper.refreshTask()).thenReturn(refreshCompleter.future);
   });
 
@@ -88,7 +86,7 @@
           child: new CustomScrollView(
             slivers: <Widget>[
               new CupertinoRefreshControl(
-                builder: mockHelper.builder,
+                builder: builder,
               ),
               buildAListOfStuff(),
             ],
@@ -96,9 +94,6 @@
         ),
       );
 
-      // The function is referenced once while passing into CupertinoRefreshControl
-      // but never called.
-      verify(mockHelper.builder);
       verifyNoMoreInteractions(mockHelper);
 
       expect(
@@ -118,7 +113,7 @@
           child: new CustomScrollView(
             slivers: <Widget>[
               new CupertinoRefreshControl(
-                builder: mockHelper.builder,
+                builder: builder,
               ),
               buildAListOfStuff(),
             ],
@@ -131,8 +126,7 @@
       await tester.pump();
 
       // The function is referenced once while passing into CupertinoRefreshControl
-      // but never called.
-      verify(mockHelper.builder);
+      // and is called.
       verify(mockHelper.builder(
         typed(any),
         RefreshIndicatorMode.drag,
@@ -161,7 +155,7 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
+                  builder: builder,
                 ),
                 buildAListOfStuff(),
               ],
@@ -173,9 +167,6 @@
         await tester.drag(find.text('0'), const Offset(0.0, 50.0));
         await tester.pump();
 
-        // The function is referenced once while passing into CupertinoRefreshControl
-        // but never called.
-        verify(mockHelper.builder);
         verifyNoMoreInteractions(mockHelper);
 
         expect(
@@ -196,7 +187,7 @@
           child: new CustomScrollView(
             slivers: <Widget>[
               new CupertinoRefreshControl(
-                builder: mockHelper.builder,
+                builder: builder,
               ),
               buildAListOfStuff(),
             ],
@@ -212,7 +203,6 @@
       await tester.pump(const Duration(seconds: 3));
 
       verifyInOrder(<void>[
-        mockHelper.builder,
         mockHelper.builder(
           typed(any),
           RefreshIndicatorMode.drag,
@@ -261,8 +251,8 @@
           child: new CustomScrollView(
             slivers: <Widget>[
               new CupertinoRefreshControl(
-                builder: mockHelper.builder,
-                onRefresh: mockHelper.refreshTask,
+                builder: builder,
+                onRefresh: onRefresh,
               ),
               buildAListOfStuff(),
             ],
@@ -279,8 +269,6 @@
       await tester.pump();
 
       verifyInOrder(<void>[
-        mockHelper.builder,
-        mockHelper.refreshTask,
         mockHelper.builder(
           typed(any),
           RefreshIndicatorMode.drag,
@@ -325,8 +313,8 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
-                  onRefresh: mockHelper.refreshTask,
+                  builder: builder,
+                  onRefresh: onRefresh,
                 ),
                 buildAListOfStuff(),
               ],
@@ -340,8 +328,6 @@
         await tester.pump(const Duration(milliseconds: 50));
 
         verifyInOrder(<void>[
-          mockHelper.builder,
-          mockHelper.refreshTask,
           mockHelper.builder(
             typed(any),
             RefreshIndicatorMode.armed,
@@ -404,8 +390,8 @@
           child: new CustomScrollView(
             slivers: <Widget>[
               new CupertinoRefreshControl(
-                builder: mockHelper.builder,
-                onRefresh: mockHelper.refreshTask,
+                builder: builder,
+                onRefresh: onRefresh,
               ),
               buildAListOfStuff(),
             ],
@@ -484,8 +470,8 @@
           child: new CustomScrollView(
             slivers: <Widget>[
               new CupertinoRefreshControl(
-                builder: mockHelper.builder,
-                onRefresh: mockHelper.refreshTask,
+                builder: builder,
+                onRefresh: onRefresh,
               ),
               buildAListOfStuff(),
             ],
@@ -561,8 +547,8 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
-                  onRefresh: mockHelper.refreshTask,
+                  builder: builder,
+                  onRefresh: onRefresh,
                 ),
                 buildAListOfStuff(),
               ],
@@ -650,8 +636,8 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
-                  onRefresh: mockHelper.refreshTask,
+                  builder: builder,
+                  onRefresh: onRefresh,
                 ),
                 buildAListOfStuff(),
               ],
@@ -706,8 +692,8 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
-                  onRefresh: mockHelper.refreshTask,
+                  builder: builder,
+                  onRefresh: onRefresh,
                 ),
                 buildAListOfStuff(),
               ],
@@ -794,8 +780,8 @@
               slivers: <Widget>[
                 buildAListOfStuff(),
                 new CupertinoRefreshControl( // it's in the middle now.
-                  builder: mockHelper.builder,
-                  onRefresh: mockHelper.refreshTask,
+                  builder: builder,
+                  onRefresh: onRefresh,
                 ),
                 buildAListOfStuff(),
               ],
@@ -807,8 +793,6 @@
 
         await tester.fling(find.byType(Container).first, const Offset(0.0, -200.0), 3000.0);
 
-        verify(mockHelper.builder);
-        verify(mockHelper.refreshTask);
         verifyNoMoreInteractions(mockHelper);
 
         debugDefaultTargetPlatformOverride = null;
@@ -828,7 +812,7 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
+                  builder: builder,
                 ),
                 buildAListOfStuff(),
               ],
@@ -879,7 +863,7 @@
           child: new CustomScrollView(
             slivers: <Widget>[
               new CupertinoRefreshControl(
-                builder: mockHelper.builder,
+                builder: builder,
               ),
               buildAListOfStuff(),
             ],
@@ -904,7 +888,7 @@
           child: new CustomScrollView(
             slivers: <Widget>[
               new CupertinoRefreshControl(
-                builder: mockHelper.builder,
+                builder: builder,
               ),
               buildAListOfStuff(),
             ],
@@ -939,7 +923,7 @@
           child: new CustomScrollView(
             slivers: <Widget>[
               new CupertinoRefreshControl(
-                builder: mockHelper.builder,
+                builder: builder,
                 refreshTriggerPullDistance: 80.0,
               ),
               buildAListOfStuff(),
@@ -977,8 +961,8 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
-                  onRefresh: mockHelper.refreshTask,
+                  builder: builder,
+                  onRefresh: onRefresh,
                   refreshTriggerPullDistance: 90.0,
                   refreshIndicatorExtent: 50.0,
                 ),
@@ -1022,8 +1006,8 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
-                  onRefresh: mockHelper.refreshTask,
+                  builder: builder,
+                  onRefresh: onRefresh,
                 ),
                 buildAListOfStuff(),
               ],
@@ -1074,8 +1058,8 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
-                  onRefresh: mockHelper.refreshTask,
+                  builder: builder,
+                  onRefresh: onRefresh,
                 ),
                 buildAListOfStuff(),
               ],
@@ -1137,8 +1121,8 @@
             child: new CustomScrollView(
               slivers: <Widget>[
                 new CupertinoRefreshControl(
-                  builder: mockHelper.builder,
-                  onRefresh: mockHelper.refreshTask,
+                  builder: builder,
+                  onRefresh: onRefresh,
                 ),
                 buildAListOfStuff(),
               ],
@@ -1204,7 +1188,7 @@
               slivers: <Widget>[
                 new CupertinoRefreshControl(
                   builder: null,
-                  onRefresh: mockHelper.refreshTask,
+                  onRefresh: onRefresh,
                   refreshIndicatorExtent: 0.0,
                 ),
                 buildAListOfStuff(),
@@ -1257,4 +1241,4 @@
   );
 
   Future<void> refreshTask();
-}
\ No newline at end of file
+}