slivers_padding_test.dart 11.7 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1 2 3 4 5 6 7 8 9 10 11 12
// 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/rendering.dart';
import 'package:flutter/widgets.dart';

Future<Null> test(WidgetTester tester, double offset, EdgeInsets padding, AxisDirection axisDirection) {
  return tester.pumpWidget(new Viewport2(
    offset: new ViewportOffset.fixed(offset),
    axisDirection: axisDirection,
13
    slivers: <Widget>[
Ian Hickson's avatar
Ian Hickson committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 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 80 81 82 83 84 85 86 87
      new SliverToBoxAdapter(child: new SizedBox(width: 400.0, height: 400.0, child: new Text('before'))),
      new SliverPadding(
        padding: padding,
        child: new SliverToBoxAdapter(child: new SizedBox(width: 400.0, height: 400.0, child: new Text('padded'))),
      ),
      new SliverToBoxAdapter(child: new SizedBox(width: 400.0, height: 400.0, child: new Text('after'))),
    ],
  ));
}

void verify(WidgetTester tester, List<Rect> answerKey) {
  List<Rect> testAnswers = tester.renderObjectList<RenderBox>(find.byType(SizedBox)).map<Rect>(
    (RenderBox target) {
      Point topLeft = target.localToGlobal(Point.origin);
      Point bottomRight = target.localToGlobal(target.size.bottomRight(Point.origin));
      return new Rect.fromPoints(topLeft, bottomRight);
    }
  ).toList();
  expect(testAnswers, equals(answerKey));
}

void main() {
  testWidgets('Viewport2+SliverPadding basic test', (WidgetTester tester) async {
    EdgeInsets padding = const EdgeInsets.fromLTRB(25.0, 20.0, 15.0, 35.0);
    await test(tester, 0.0, padding, AxisDirection.down);
    expect(tester.renderObject<RenderBox>(find.byType(Viewport2)).size, equals(const Size(800.0, 600.0)));
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, 0.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, 420.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 600.0, 800.0, 400.0),
    ]);

    await test(tester, 200.0, padding, AxisDirection.down);
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -200.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, 220.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 600.0, 800.0, 400.0),
    ]);

    await test(tester, 390.0, padding, AxisDirection.down);
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -390.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, 30.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 465.0, 800.0, 400.0),
    ]);

    await test(tester, 490.0, padding, AxisDirection.down);
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -490.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, -70.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 365.0, 800.0, 400.0),
    ]);

    await test(tester, 10000.0, padding, AxisDirection.down);
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -10000.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, -9580.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, -9145.0, 800.0, 400.0),
    ]);
  });

  testWidgets('Viewport2+SliverPadding hit testing', (WidgetTester tester) async {
    EdgeInsets padding = const EdgeInsets.all(30.0);
    await test(tester, 350.0, padding, AxisDirection.down);
    expect(tester.renderObject<RenderBox>(find.byType(Viewport2)).size, equals(const Size(800.0, 600.0)));
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -350.0, 800.0, 400.0),
      new Rect.fromLTWH(30.0, 80.0, 740.0, 400.0),
      new Rect.fromLTWH(0.0, 510.0, 800.0, 400.0),
    ]);
    HitTestResult result;
    result = tester.hitTestOnBinding(const Point(10.0, 10.0));
    expect(result.path.first.target, tester.firstRenderObject<RenderObject>(find.byType(Text)));
    result = tester.hitTestOnBinding(const Point(10.0, 60.0));
88
    expect(result.path.first.target, const isInstanceOf<RenderView>());
Ian Hickson's avatar
Ian Hickson committed
89 90 91
    result = tester.hitTestOnBinding(const Point(100.0, 100.0));
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).skip(1).first);
    result = tester.hitTestOnBinding(const Point(100.0, 490.0));
92
    expect(result.path.first.target, const isInstanceOf<RenderView>());
Ian Hickson's avatar
Ian Hickson committed
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
    result = tester.hitTestOnBinding(const Point(10.0, 520.0));
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).last);
  });

  testWidgets('Viewport2+SliverPadding hit testing up', (WidgetTester tester) async {
    EdgeInsets padding = const EdgeInsets.all(30.0);
    await test(tester, 350.0, padding, AxisDirection.up);
    expect(tester.renderObject<RenderBox>(find.byType(Viewport2)).size, equals(const Size(800.0, 600.0)));
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, 600.0+350.0-400.0, 800.0, 400.0),
      new Rect.fromLTWH(30.0, 600.0-80.0-400.0, 740.0, 400.0),
      new Rect.fromLTWH(0.0, 600.0-510.0-400.0, 800.0, 400.0),
    ]);
    HitTestResult result;
    result = tester.hitTestOnBinding(const Point(10.0, 600.0-10.0));
    expect(result.path.first.target, tester.firstRenderObject<RenderObject>(find.byType(Text)));
    result = tester.hitTestOnBinding(const Point(10.0, 600.0-60.0));
110
    expect(result.path.first.target, const isInstanceOf<RenderView>());
Ian Hickson's avatar
Ian Hickson committed
111 112 113
    result = tester.hitTestOnBinding(const Point(100.0, 600.0-100.0));
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).skip(1).first);
    result = tester.hitTestOnBinding(const Point(100.0, 600.0-490.0));
114
    expect(result.path.first.target, const isInstanceOf<RenderView>());
Ian Hickson's avatar
Ian Hickson committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
    result = tester.hitTestOnBinding(const Point(10.0, 600.0-520.0));
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).last);
  });

  testWidgets('Viewport2+SliverPadding hit testing left', (WidgetTester tester) async {
    EdgeInsets padding = const EdgeInsets.all(30.0);
    await test(tester, 350.0, padding, AxisDirection.left);
    expect(tester.renderObject<RenderBox>(find.byType(Viewport2)).size, equals(const Size(800.0, 600.0)));
    verify(tester, <Rect>[
      new Rect.fromLTWH(800.0+350.0-400.0, 0.0, 400.0, 600.0),
      new Rect.fromLTWH(800.0-80.0-400.0, 30.0, 400.0, 540.0),
      new Rect.fromLTWH(800.0-510.0-400.0, 0.0, 400.0, 600.0),
    ]);
    HitTestResult result;
    result = tester.hitTestOnBinding(const Point(800.0-10.0, 10.0));
    expect(result.path.first.target, tester.firstRenderObject<RenderObject>(find.byType(Text)));
    result = tester.hitTestOnBinding(const Point(800.0-60.0, 10.0));
132
    expect(result.path.first.target, const isInstanceOf<RenderView>());
Ian Hickson's avatar
Ian Hickson committed
133 134 135
    result = tester.hitTestOnBinding(const Point(800.0-100.0, 100.0));
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).skip(1).first);
    result = tester.hitTestOnBinding(const Point(800.0-490.0, 100.0));
136
    expect(result.path.first.target, const isInstanceOf<RenderView>());
Ian Hickson's avatar
Ian Hickson committed
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
    result = tester.hitTestOnBinding(const Point(800.0-520.0, 10.0));
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).last);
  });

  testWidgets('Viewport2+SliverPadding hit testing right', (WidgetTester tester) async {
    EdgeInsets padding = const EdgeInsets.all(30.0);
    await test(tester, 350.0, padding, AxisDirection.right);
    expect(tester.renderObject<RenderBox>(find.byType(Viewport2)).size, equals(const Size(800.0, 600.0)));
    verify(tester, <Rect>[
      new Rect.fromLTWH(-350.0, 0.0, 400.0, 600.0),
      new Rect.fromLTWH(80.0, 30.0, 400.0, 540.0),
      new Rect.fromLTWH(510.0, 0.0, 400.0, 600.0),
    ]);
    HitTestResult result;
    result = tester.hitTestOnBinding(const Point(10.0, 10.0));
    expect(result.path.first.target, tester.firstRenderObject<RenderObject>(find.byType(Text)));
    result = tester.hitTestOnBinding(const Point(60.0, 10.0));
154
    expect(result.path.first.target, const isInstanceOf<RenderView>());
Ian Hickson's avatar
Ian Hickson committed
155 156 157
    result = tester.hitTestOnBinding(const Point(100.0, 100.0));
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).skip(1).first);
    result = tester.hitTestOnBinding(const Point(490.0, 100.0));
158
    expect(result.path.first.target, const isInstanceOf<RenderView>());
Ian Hickson's avatar
Ian Hickson committed
159 160 161 162 163 164 165
    result = tester.hitTestOnBinding(const Point(520.0, 10.0));
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).last);
  });

  testWidgets('Viewport2+SliverPadding no child', (WidgetTester tester) async {
    await tester.pumpWidget(new Viewport2(
      offset: new ViewportOffset.fixed(0.0),
166
      slivers: <Widget>[
167
        new SliverPadding(padding: const EdgeInsets.all(100.0)),
Ian Hickson's avatar
Ian Hickson committed
168 169 170 171 172 173 174 175 176 177 178
        new SliverToBoxAdapter(child: new SizedBox(width: 400.0, height: 400.0, child: new Text('x'))),
      ],
    ));
    expect(tester.renderObject<RenderBox>(find.text('x')).localToGlobal(Point.origin), const Point(0.0, 200.0));
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).endPadding, 100.0);
  });

  testWidgets('Viewport2+SliverPadding changing padding', (WidgetTester tester) async {
    await tester.pumpWidget(new Viewport2(
      axisDirection: AxisDirection.left,
      offset: new ViewportOffset.fixed(0.0),
179
      slivers: <Widget>[
180
        new SliverPadding(padding: const EdgeInsets.fromLTRB(90.0, 1.0, 110.0, 2.0)),
Ian Hickson's avatar
Ian Hickson committed
181 182 183 184 185 186 187 188
        new SliverToBoxAdapter(child: new SizedBox(width: 201.0, child: new Text('x'))),
      ],
    ));
    expect(tester.renderObject<RenderBox>(find.text('x')).localToGlobal(Point.origin), const Point(399.0, 0.0));
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).endPadding, 1.0);
    await tester.pumpWidget(new Viewport2(
      axisDirection: AxisDirection.left,
      offset: new ViewportOffset.fixed(0.0),
189
      slivers: <Widget>[
190
        new SliverPadding(padding: const EdgeInsets.fromLTRB(110.0, 1.0, 80.0, 2.0)),
Ian Hickson's avatar
Ian Hickson committed
191 192 193 194 195 196 197 198 199 200 201
        new SliverToBoxAdapter(child: new SizedBox(width: 201.0, child: new Text('x'))),
      ],
    ));
    expect(tester.renderObject<RenderBox>(find.text('x')).localToGlobal(Point.origin), const Point(409.0, 0.0));
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).endPadding, 1.0);
  });

  testWidgets('Viewport2+SliverPadding changing direction', (WidgetTester tester) async {
    await tester.pumpWidget(new Viewport2(
      axisDirection: AxisDirection.up,
      offset: new ViewportOffset.fixed(0.0),
202
      slivers: <Widget>[
203
        new SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
Ian Hickson's avatar
Ian Hickson committed
204 205 206 207 208 209
      ],
    ));
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).endPadding, 1.0);
    await tester.pumpWidget(new Viewport2(
      axisDirection: AxisDirection.down,
      offset: new ViewportOffset.fixed(0.0),
210
      slivers: <Widget>[
211
        new SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
Ian Hickson's avatar
Ian Hickson committed
212 213 214 215 216 217
      ],
    ));
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).endPadding, 4.0);
    await tester.pumpWidget(new Viewport2(
      axisDirection: AxisDirection.right,
      offset: new ViewportOffset.fixed(0.0),
218
      slivers: <Widget>[
219
        new SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
Ian Hickson's avatar
Ian Hickson committed
220 221 222 223 224 225
      ],
    ));
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).endPadding, 8.0);
    await tester.pumpWidget(new Viewport2(
      axisDirection: AxisDirection.left,
      offset: new ViewportOffset.fixed(0.0),
226
      slivers: <Widget>[
227
        new SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
Ian Hickson's avatar
Ian Hickson committed
228 229 230 231 232 233
      ],
    ));
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).endPadding, 2.0);
    await tester.pumpWidget(new Viewport2(
      axisDirection: AxisDirection.left,
      offset: new ViewportOffset.fixed(99999.9),
234
      slivers: <Widget>[
235
        new SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
Ian Hickson's avatar
Ian Hickson committed
236 237 238 239 240
      ],
    ));
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).endPadding, 2.0);
  });
}