anchor.diff:    await tester.pump(const Duration(seconds: 5)); // to let the theme animate
   }
   
  +// Pump a nested scrollable. The outer scrollable contains a sliver of a
  +// 300-pixel-long scrollable followed by a 2000-pixel-long content.
  +Future<void> pumpDoubleScrollableTest(
  +  WidgetTester tester,
  +  TargetPlatform platform,
  +) async {
  +  await tester.pumpWidget(MaterialApp(
  +    theme: ThemeData(
  +      platform: platform,
  +    ),
  +    home: CustomScrollView(
  +      slivers: <Widget>[
  +        SliverToBoxAdapter(
  +          child: Container(
  +            height: 300,
  +            child: const CustomScrollView(
  +              slivers: <Widget>[
  +                SliverToBoxAdapter(child: SizedBox(height: 2000.0)),
  +              ],
  +            ),
  +          ),
  +        ),
  +        const SliverToBoxAdapter(child: SizedBox(height: 2000.0)),
  +      ],
  +    ),
  +  ));
  +  await tester.pump(const Duration(seconds: 5)); // to let the theme animate
  +}
  +
   const double dragOffset = 200.0;
   
   final LogicalKeyboardKey modifierKey = defaultTargetPlatform == TargetPlatform.macOS
       ? LogicalKeyboardKey.metaLeft
       : LogicalKeyboardKey.controlLeft;
   
  -double getScrollOffset(WidgetTester tester) {
  -  final RenderViewport viewport = tester.renderObject(find.byType(Viewport));
  +double getScrollOffset(WidgetTester tester, {bool last = true}) {
  +  Finder viewportFinder = find.byType(Viewport);
  +  if (last)
  +    viewportFinder = viewportFinder.last;
  +  final RenderViewport viewport = tester.renderObject(viewportFinder);
     return viewport.offset.pixels;
   }
   
  
positive.code:   bool scrollable = true,
    bool reverse = false,
    ScrollController controller,
  }) async {
    await tester.pumpWidget(MaterialApp(
      theme: ThemeData(
  
negative.code:     // Pointer signals should not cause overscroll.
      await tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, -30.0)), result);
      expect(getScrollOffset(tester), 0.0);
    });
  
    testWidgets('Scroll pointer signals are handled when there is competion', (WidgetTester tester) async {
      // This is a regression test. When there are multiple scrollables listening
      // to the same event, for example when scrollables are nested, there used
      // to be exceptions at scrolling events.
  
      await pumpDoubleScrollableTest(tester, TargetPlatform.fuchsia);
      final Offset scrollEventLocation = tester.getCenter(find.byType(Viewport).last);
      final TestPointer testPointer = TestPointer(1, ui.PointerDeviceKind.mouse);
      // Create a hover event so that |testPointer| has a location when generating the scroll.
      testPointer.hover(scrollEventLocation);
      final HitTestResult result = tester.hitTestOnBinding(scrollEventLocation);
      await tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, 20.0)), result);
      expect(getScrollOffset(tester, last: true), 20.0);
      // Pointer signals should not cause overscroll.
      await tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, -30.0)), result);
      expect(getScrollOffset(tester, last: true), 0.0);
    });
  
    testWidgets('Scroll pointer signals are ignored when scrolling is disabled', (WidgetTester tester) async {
  