scrollbar_paint_test.dart 3.69 KB
Newer Older
1 2 3 4 5 6 7 8 9
// Copyright 2016 The Chromium Authors. 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:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';

import '../rendering/mock_canvas.dart';

10 11 12
Widget _buildSingleChildScrollViewWithScrollbar({
  TextDirection textDirection = TextDirection.ltr,
  EdgeInsets padding = EdgeInsets.zero,
13 14
  Widget child,
}) {
15 16 17 18
  return Directionality(
    textDirection: textDirection,
    child: MediaQuery(
      data: MediaQueryData(padding: padding),
19
      child: Scrollbar(
20
        child: SingleChildScrollView(child: child),
21
      ),
22 23 24 25 26 27 28 29
    ),
  );
}

void main() {
  testWidgets('Viewport basic test (LTR)', (WidgetTester tester) async {
    await tester.pumpWidget(_buildSingleChildScrollViewWithScrollbar(
      child: const SizedBox(width: 4000.0, height: 4000.0),
30
    ));
31
    expect(find.byType(Scrollbar), isNot(paints..rect()));
32
    await tester.fling(find.byType(SingleChildScrollView), const Offset(0.0, -10.0), 10.0);
Dan Field's avatar
Dan Field committed
33
    expect(find.byType(Scrollbar), paints..rect(rect: const Rect.fromLTRB(800.0 - 6.0, 1.5, 800.0, 91.5)));
34 35 36
  });

  testWidgets('Viewport basic test (RTL)', (WidgetTester tester) async {
37
    await tester.pumpWidget(_buildSingleChildScrollViewWithScrollbar(
38
      textDirection: TextDirection.rtl,
39
      child: const SizedBox(width: 4000.0, height: 4000.0),
40 41 42
    ));
    expect(find.byType(Scrollbar), isNot(paints..rect()));
    await tester.fling(find.byType(SingleChildScrollView), const Offset(0.0, -10.0), 10.0);
Dan Field's avatar
Dan Field committed
43
    expect(find.byType(Scrollbar), paints..rect(rect: const Rect.fromLTRB(0.0, 1.5, 6.0, 91.5)));
44
  });
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

  testWidgets('workds with MaterialApp and Scaffold', (WidgetTester tester) async {
    await tester.pumpWidget(MaterialApp(
      home: MediaQuery(
        data: const MediaQueryData(
          padding: EdgeInsets.fromLTRB(0, 20, 0, 34)
        ),
        child: Scaffold(
          appBar: AppBar(title: const Text('Title')),
          body: Scrollbar(
            child: ListView(
              children: const <Widget>[SizedBox(width: 4000, height: 4000)]
            ),
          ),
        ),
      ),
    ));

    final TestGesture gesture = await tester.startGesture(tester.getCenter(find.byType(ListView)));
    // On Android it should not overscroll.
    await gesture.moveBy(const Offset(0, 100));
    // Trigger fade in animation.
    await tester.pump();
    await tester.pump(const Duration(milliseconds: 500));

    expect(find.byType(Scrollbar), paints..rect(
      rect: const Rect.fromLTWH(
        800.0 - 6, // screen width - thickness
        0,         // the paint area starts from the bottom of the app bar
        6,         // thickness
        // 56 being the height of the app bar
        (600.0 - 56 - 34 - 20) / 4000 * (600 - 56 - 34 - 20),
      ),
    ));
  });
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107

  testWidgets("should not paint when there isn't enough space", (WidgetTester tester) async {
    await tester.pumpWidget(MaterialApp(
      home: MediaQuery(
        data: const MediaQueryData(
          padding: EdgeInsets.fromLTRB(0, 20, 0, 34)
        ),
        child: Scaffold(
          appBar: AppBar(title: const Text('Title')),
          body: Scrollbar(
            child: ListView(
              children: const <Widget>[SizedBox(width: 40, height: 40)]
            ),
          ),
        ),
      ),
    ));

    final TestGesture gesture = await tester.startGesture(tester.getCenter(find.byType(ListView)));
    // On Android it should not overscroll.
    await gesture.moveBy(const Offset(0, 100));
    // Trigger fade in animation.
    await tester.pump();
    await tester.pump(const Duration(milliseconds: 500));

    expect(find.byType(Scrollbar), isNot(paints..rect()));
  });

108
}